cstuder / parse-hydrodaten
解析 Hydrodaten 开放数据字符串
Requires
Requires (Dev)
- phpunit/phpunit: ^9
README
这是一个简单的 PHP 包,用于解析 Hydrodaten (FOEN/BAFU) 开放数据字符串。
免责声明:这个库不是官方的,也不与 FOEN/BAFU 相关。
为使用在 api.existenz.ch 和间接在 Aare.guru 上创建。截至 2023 年已投入生产使用。
安装
composer require cstuder/parse-hydrodaten
示例用法
<?php require('vendor/autoload.php'); $raw = file_get_contents('https://www.hydrodaten.admin.ch/lhg/az/xml/hydroweb.xml'); $data = \cstuder\ParseHydrodaten\DataParser::parse($raw); var_dump($data);
数据是一行值对象(见 cstuder/parse-valueholder)
$data->values = [ (cstuder\ParseValueholder\Value Object) [ 'timestamp' => 1619841168, 'location' => '2135', 'parameter' => 'temperature', 'value' => 11.1 ], ... ];
元数据示例用法
要获取位置和参数的列表,请使用元数据解析器
<?php require('vendor/autoload.php'); $raw = file_get_contents('https://www.hydrodaten.admin.ch/lhg/az/xml/hydroweb.xml'); $metadata = \cstuder\ParseHydrodaten\MetadataParser::parse($raw); var_dump($metadata);
关于 Hydrodaten 测量网络
FOEN/BAFU(瑞士联邦环境办公室/瑞士联邦环境局)在其 水文数据 数据上提供了 opendata.swiss 站点 上的选择。
并非每个站都测量每个参数。并非每个站都在同一时间报告其数据。
周期性:10 分钟。
许可限制由 FOEN/BAFU 应用。有关信息,请参阅开放数据下载。FOEN/BAFU 要求在使用数据时始终将 FOEN/BAFU 标记为来源。
其他链接
- 官方网站: https://www.hydrodaten.admin.ch
- geo.admin.ch 上的站点地图
- GeoJSON 功能
- 非官方的 Existenz 数据 API
- Existenz 数据 API 元数据: 位置 和 参数
数据文件概览
有多种方法可以访问不同精度和格式的当前测量值。其中一些受密码保护。
数据文件: hydroweb.xml(舍入,已弃用)
已弃用:自 2021 年 6 月起不再可用。
数据无密码,但值为舍入值(例如,温度值为十分之一度。)
包含河流测量站及其不同参数列表的 XML 文件,带有相关的 XSD 架构 hydroweb.xsd。
请注意,此解析器只对绝对测量值(当前值和 24 小时旧值)感兴趣。它忽略了最大/最小/平均值。
解析器还忽略了参数的 variant 属性。
数据和元数据都在同一个 XML 中。编码为 UTF-8。时区为 Europe/Zurich (GMT+2)。
<?xml version='1.0' encoding='utf-8'?> <locations xmlns:schemaLocation="http://www.hydrodaten.admin.ch/lhg/az/xml/hydroweb.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" export-time="2020-07-11T14:55:36" timezone="GMT+2"> <station number="2004" name="Murten" water-body-name="Murtensee" water-body-type="lake" easting="575500" northing="197790"> <parameter type="2" variant="0" name="Pegel m ü. M." unit="m ü. M."> <datetime>2020-07-11T14:50:00</datetime> <value warn-level-class="1">429.44</value> <previous-24h>429.41</previous-24h> <delta-24h>0.03</delta-24h> <max-24h warn-level-class="1">429.45</max-24h> <mean-24h>429.43</mean-24h> <min-24h>429.41</min-24h> <max-1h>429.44</max-1h> <mean-1h>429.44</mean-1h> <min-1h>429.44</min-1h> </parameter> </station> ... </locations>
使用数据解析器
<?php $raw = file_get_contents('https://www.hydrodaten.admin.ch/lhg/az/xml/hydroweb.xml'); $data = \cstuder\ParseHydrodaten\DataParser::parse($raw);
数据文件: hydroweb.xml(精确版本)
数据受密码保护,但值为精确值(例如,温度值为百分之一度。)
包含河流测量站及其不同参数列表的XML文件,具有关联的XSD模式相关XSD模式。
注意,此解析器仅关注绝对当前测量值。它忽略最大/最小/平均值。
解析器还忽略了参数的 variant 属性。
数据和元数据都在同一个 XML 中。编码为 UTF-8。时区为 Europe/Zurich (GMT+2)。
<?xml version="1.0" encoding="UTF-8"?> <locations xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" export-time="2021-05-01T03:55:00+01:00" xsi:schemaLocation="http://www.hydrodaten.admin.ch/lhg/az/xml/hydroweb2.xsd"> <station name="Adelboden" easting="608710" northing="148300" number="2232" water-body-name="Allenbach" water-body-type="river"> <parameter name="Pegel m ü. M." unit="m" field-name="BAFU_2232_PegelRadarunten"> <datetime>2021-05-01T04:50:00+01:00</datetime> <value>1297.951</value> <max-24h>1298.026</max-24h> <mean-24h>1297.968</mean-24h> <min-24h>1297.915</min-24h> </parameter> ... </station> ... </locations>
使用数据解析器精确
- 联系Abfragezentrale BAFU,并请求访问文件
hydroweb.xml。 - 您应该会收到访问https://www.hydrodata.ch/data/xml/hydroweb.xml端点的用户名和密码。
- 解析它
<?php $context = stream_context_create(array ( 'http' => array ( 'header' => 'Authorization: Basic ' . base64_encode("$username:$password") ) )); $raw = file_get_contents('https://www.hydrodata.ch/data/xml/hydroweb.xml', $context); $data = \cstuder\ParseHydrodaten\DataParserPrecise::parse($raw);
数据文件:hydroweb.naqua.xml(精确版本)
地下水测量网络,与hydroweb.xml(精确版本)相同的数据格式。数据受密码保护,但具有精确值(例如,温度值精确到百分之一度)。
NAQUA使用数据解析器
使用与hydroweb.xml(精确版本)相同的解析器。
- 联系Abfragezentrale BAFU,并请求访问文件
hydroweb.naqua.xml。 - 您应该会收到访问https://www.hydrodata.ch/data/xml/hydroweb.naqua.xml端点的用户名和密码。
- 解析它
<?php $context = stream_context_create(array ( 'http' => array ( 'header' => 'Authorization: Basic ' . base64_encode("$username:$password") ) )); $raw = file_get_contents('https://www.hydrodata.ch/data/xml/hydroweb.naqua.xml', $context); $data = \cstuder\ParseHydrodaten\DataParserPrecise::parse($raw);
旧格式:SMS.xml
已弃用:自2021年4月起不再提供。
没有模式方案的XML文件,包含河流测量站及其不同参数的列表。
注意,旧版数据解析器仅关注绝对测量值(当前和24小时前)。它忽略最大/最小/平均值。
解析器还忽略参数的Var属性。
两种数据都存储在此XML中,没有元数据。编码为UTF-8。时区为欧洲/苏黎世(GMT+2)。
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE AKT_Data SYSTEM "AKT_Data.dtd"> <AKT_Data ID="SMS-Liste" ZeitSt="21.03.2021 18:25"> <MesPar DH="HBCHa" StrNr="2304" Typ="10" Var="10"> <Name>Ova dal Fuorn - Zernez, Punt la Drossa</Name> <Datum>21.03.2021</Datum> <Zeit>18:20</Zeit> <Wert>0.51</Wert> <Wert dt="-24h">0.51</Wert> <Wert Typ="delta24">-0.003</Wert> <Wert Typ="m24">0.51</Wert> <Wert Typ="max24">0.52</Wert> <Wert Typ="min24">0.50</Wert> </MesPar> ... </AKT_Data>
使用旧版解析器
<?php $raw = file_get_contents('SMS.xml'); $data = \cstuder\ParseHydrodaten\LegacyDataParser::parse($raw);
解析方法
解析器有意限制:它解析给定的字符串并返回所有看起来有效的绝对值。它默默地跳过任何不理解的价值。
值转换为float。缺失的值不会返回,值永远不会是null。
SuperParser::parse(string $raw)
解析Hydrodaten数据字符串,依次尝试所有可用的解析器。如果任何解析器找到内容,则返回该数据。
如果没有解析器找到内容,则返回空行。自行承担风险。
返回包含键timestamp、loc、par和val的值对象的行。
DataParser::parse(string $raw)
解析符合hydroweb.xsd格式的Hydroweb XML字符串。
返回包含键timestamp、loc、par和val的值对象的行。
DataParserPrecise::parse(string $raw)
解析符合hydroweb2.xsd格式的Hydroweb XML字符串。
返回包含键timestamp、loc、par和val的值对象的行。
LegacyDataParser::parse(string $raw)
解析符合已弃用的SMS.xml格式的旧版Hydroweb XML字符串。
返回包含键timestamp、loc、par和val的值对象的行。
MetadataParser::parse(string $raw)
解析Hydroweb XML字符串。
返回两个字段:locations和parameters,都包含包含位置坐标或参数单位的StdClass对象的数组。
测试
运行composer test以执行PHPUnit测试套件。
发布
- 将更改添加到更改日志。
- 创建新的标签
vX.X.X。 - 推送。
许可
MIT。
作者
克里斯蒂安·施图德 cstuder@existenz.ch,数字存在局。