safer-cassiopee / php-metar-decoder
METAR天气观测解码器
Requires
- php: >=5.3.0
Requires (Dev)
- phpunit/phpunit: 4.3.*
This package is not auto-updated.
Last update: 2024-09-14 17:37:33 UTC
README
一个用于解码METAR字符串的PHP库,完全单元测试(100%代码覆盖率)
您可以在演示网站上尝试它。
它们在生产中使用php-metar-decoder
- VMC Today(公开)
- Safran Cassiopée(私有)
- 您的服务在这里?提交一个pull request或打开一个问题!
简介
此软件是一套库包,提供了解码原始METAR观测的解析器。
METAR是为天气信息报告而设计的格式。METAR天气报告主要用于飞行员和气象学家,他们使用它来协助天气预报。原始METAR格式通过国际民用航空组织(ICAO)高度标准化。
要求
此库包仅需要PHP >= 5.3
它目前自动测试了PHP 5.3、5.4和5.5。
如果您想轻松将其集成到项目中,您应该在系统上安装composer。虽然这不是强制性的。
设置
- 使用composer (推荐)
将以下行添加到您的项目的composer.json
{ "require": { "safran-cassiopee/php-metar-decoder": "dev-master" } }
在项目根目录中运行安装命令
composer install --no-dev
利用composer自动加载来加载库
<?php require_once 'vendor/autoload.php';
- 手动
从github下载最新版本
将其提取到项目中的任何位置。库本身位于src/目录中,其他目录对于库的工作不是必需的。
使用静态导入文件加载库
<?php require_once 'path/to/MetarDecoder/MetarDecoder.inc.php';
用法
实例化解码器,并在METAR字符串上运行它。返回的对象是一个DecodedMetar对象,您可以从该对象检索所有解码的天气属性。
所有有单位的值都基于Value
对象,该对象提供了getValue()
和getUnit()
方法。
待办事项:DecodedMetar对象的完整文档
<?php require_once 'vendor/autoload.php'; $decoder = new MetarDecoder\MetarDecoder(); $d = $decoder->parse('METAR LFPO 231027Z AUTO 24004G09MPS 2500 1000NW R32/0400 R08C/0004D +FZRA VCSN //FEW015 17/10 Q1009 REFZRA WS R03') //context information $d->isValid(); //true $d->getRawMetar(); //'METAR LFPO 231027Z AUTO 24004G09MPS 2500 1000NW R32/0400 R08C/0004D +FZRA VCSN //FEW015 17/10 Q1009 REFZRA WS R03' $d->getType(); //'METAR' $d->getIcao(); //'LFPO' $d->getDay(); //23 $d->getTime(); //'10:27 UTC' $d->getStatus(); //'AUTO' //surface wind $sw = $d->getSurfaceWind(); //SurfaceWind object $sw->getMeanDirection()->getValue(); //240 $sw->getMeanSpeed()->getValue(); //4 $sw->getSpeedVariations()->getValue(); //9 $sw->getMeanSpeed()->getUnit(); //'m/s' //visibility $v = $d->getVisibility(); //Visibility object $v->getVisibility()->getValue(); //2500 $v->getVisibility()->getUnit(); //'m' $v->getMinimumVisibility()->getValue(); //1000 $v->getMinimumVisibilityDirection(); //'NW' $v->hasNDV(); //false //runway visual range $rvr = $d->getRunwaysVisualRange(); //RunwayVisualRange array $rvr[0]->getRunway(); //'32' $rvr[0]->getVisualRange()->getValue(); //400 $rvr[0]->getPastTendency(); //'' $rvr[1]->getRunway(); //'08C' $rvr[1]->getVisualRange()->getValue(); //4 $rvr[1]->getPastTendency(); //'D' //present weather $pw = $d->getPresentWeather(); //WeatherPhenomenon array $pw[0]->getIntensityProximity(); //'+' $pw[0]->getCharacteristics(); //'FZ' $pw[0]->getTypes(); //array('RA') $pw[1]->getIntensityProximity(); //'VC' $pw[1]->getCharacteristics(); //null $pw[1]->getTypes(); //array('SN') // clouds $cld = $d->getClouds(); //CloudLayer array $cld[0]->getAmount(); //'FEW' $cld[0]->getBaseHeight()->getValue(); //1500 $cld[0]->getBaseHeight()->getUnit(); //'ft' // temperature $d->getAirTemperature()->getValue(); //17 $d->getAirTemperature()->getUnit(); //'deg C' $d->getDewPointTemperature()->getValue(); //10 // pressure $d->getPressure()->getValue(); //1009 $d->getPressure()->getUnit(); //'hPa' // recent weather $rw = $d->getRecentWeather(); $rw->getCharacteristics(); //'FZ' $rw->getTypes(); //array('RA') // windshears $d->getWindshearRunways(); //array('03')
关于Value对象
在上面的示例中,假设所有请求的参数都是可用的。在现实世界中,某些字段不是必需的,因此在使用之前检查Value对象(包含值和单位)是否为null非常重要。您如何处理null完全取决于您。
以下是一个示例
// check that the $dew_point is not null and give it a default value if it is $dew_point = $d->getDewPointTemperature(); if($dew_point == null){ $dew_point = new Value(999, Value::DEGREE_CELSIUS); } // $dew_point object can now be accessed safely $dew_point->getValue(); $dew_point->getUnit();
Value对象也包含其单位,您可以使用getUnit()
方法访问它。当您调用getValue()
时,您将以该单位获得值。
如果您想直接以其他单位获取值,可以调用getConvertedValue($unit)
。支持的速度、距离和压力。
以下是所有可用的转换单位
// speed units: Value::METER_PER_SECOND Value::KILOMETER_PER_HOUR Value::KNOT // distance units: Value::METER Value::FEET Value::STATUTE_MILE // pressure units: Value::HECTO_PASCAL Value::MERCURY_INCH // use on-the-fly conversion $distance_in_sm = $visibility->getConvertedValue(Value::STATUTE_MILE); $speed_kph = $speed->getConvertedValue(Value::KILOMETER_PER_HOUR);
关于解析错误
当遇到METAR某部分的意外格式时,解析错误会记录到DecodedMetar对象本身。
可以通过getDecodingExceptions()
方法访问一个METAR的所有解析错误。
默认情况下,遇到格式错误时解析将继续。但是解析器还提供了一个“严格”模式,在出现错误时立即停止解析。该模式可以全局设置MetarDecoder对象,或者像这个例子中那样仅设置一次。
<?php $decoder = new MetarDecoder\MetarDecoder(); // change global parsing mode to "strict" $decoder->setStrictParsing(true); // this parsing will be made with strict mode $decoder->parse("..."); // but this one will ignore global mode and will be made with not-strict mode anyway $decoder->parseNotStrict("..."); // change global parsing mode to "not-strict" $decoder->setStrictParsing(false); // this parsing will be made with no-strict mode $decoder->parse("..."); // but this one will ignore global mode and will be made with strict mode anyway $decoder->parseStrict("...");
关于解析错误,再次说明
在非严格模式下,即使在最终得到该块解码信息的情况下,也可能对给定的块解码器得到解析错误。这是怎么可能的呢?
这是因为非严格模式不仅会在有错误的地方继续解码,还会在“下一个块”(基于空白分隔符)上再次尝试解析。但是,即使在第二次尝试成功后,第一次尝试的所有错误也会保留在日志中。
假设你有一个这样的块 AAA 12003KPH ...
提供给SurfaceWind块解码器。这个解码器会在 AAA
上崩溃,会尝试解码 12003KPH
并成功。对于表面风速解码器的第一次异常将被保留,但SurfaceWind对象将填充一些信息。
所有这些在严格模式下都不适用,因为在这种情况下,解析会在第一次解析错误时中断。
贡献
如果你发现这个库解析了一个有效的METAR,但解析得不好,请打开一个github issue,并提供所有可能的详细信息
- 导致问题的完整METAR
- 库返回的解析异常
- 你期望解码器如何表现
- 支持你建议的任何内容(链接到官方网站将受到欢迎)
如果你想改进或丰富测试套件,请fork仓库,然后通过pull request提交你的更改。
如果你有任何其他想法来改进这个库,请使用github issues或直接pull requests,具体取决于你更舒服的方式。
为了贡献代码库,你必须forkgithub上的仓库,然后使用以下命令本地克隆它
git clone https://github.com/<username>/php-metar-decoder
使用make安装所有依赖项(需要composer)
make install
你可以使用以下命令启动测试套件
make test
这个库是完全单元测试的,并使用PHPUnit来启动测试。
Travis CI用于持续集成,每次向仓库推送时都会触发PHP 5.3、5.4、5.5的测试。
如果你对代码覆盖率感兴趣,还需要安装和启用xdebug(在debian上的package为php5-xdebug
),然后你可以使用以下命令生成关于测试代码覆盖率的html报告
make coverage