safran-cassiopee/php-metar-decoder

METAR天气观测解码器

v0.8 2020-02-11 13:31 UTC

This package is not auto-updated.

Last update: 2024-09-14 19:20:18 UTC


README

License Build Status Coverage Status Latest Stable Version

一个用于解码METAR字符串的PHP库,完全单元测试(100%代码覆盖率)

您可以在演示网站上尝试它。

他们在生产中使用了php-metar-decoder

简介

此软件是一个库包,提供了解码原始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非常重要。您在这种情况下要做什么完全取决于您自己。

以下是一个示例

// 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对象本身中。

一个METAR的所有解析错误都可以通过getDecodingExceptions()方法访问。

默认情况下,遇到错误格式时解析将继续。但解析器还提供了一个“严格”模式,其中一旦发生错误,解析就会停止。该模式可以全局设置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 ...提供给表面风块解码器。这个解码器会在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上为php5-xdebug),然后你可以使用以下命令生成关于测试代码覆盖率的html报告:

make coverage