safer-cassiopee/php-metar-decoder

METAR天气观测解码器

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

This package is not auto-updated.

Last update: 2024-09-14 17:37:33 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非常重要。您如何处理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