cstuder/parse-hydrodaten

解析 Hydrodaten 开放数据字符串

v2.1.1 2023-02-09 14:05 UTC

This package is auto-updated.

Last update: 2024-09-09 18:01:39 UTC


README

PHPUnit tests

这是一个简单的 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 标记为来源。

其他链接

数据文件概览

有多种方法可以访问不同精度和格式的当前测量值。其中一些受密码保护。

数据文件: 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>

使用数据解析器

  1. https://www.hydrodaten.admin.ch/lhg/az/xml/hydroweb.xml 下载数据。
  2. 解析它
<?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>

使用数据解析器精确

  1. 联系Abfragezentrale BAFU,并请求访问文件hydroweb.xml
  2. 您应该会收到访问https://www.hydrodata.ch/data/xml/hydroweb.xml端点的用户名和密码。
  3. 解析它
<?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(精确版本)相同的解析器。

  1. 联系Abfragezentrale BAFU,并请求访问文件hydroweb.naqua.xml
  2. 您应该会收到访问https://www.hydrodata.ch/data/xml/hydroweb.naqua.xml端点的用户名和密码。
  3. 解析它
<?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数据字符串,依次尝试所有可用的解析器。如果任何解析器找到内容,则返回该数据。

如果没有解析器找到内容,则返回空行。自行承担风险。

返回包含键timestamplocparval的值对象的行。

DataParser::parse(string $raw)

解析符合hydroweb.xsd格式的Hydroweb XML字符串。

返回包含键timestamplocparval的值对象的行。

DataParserPrecise::parse(string $raw)

解析符合hydroweb2.xsd格式的Hydroweb XML字符串。

返回包含键timestamplocparval的值对象的行。

LegacyDataParser::parse(string $raw)

解析符合已弃用的SMS.xml格式的旧版Hydroweb XML字符串。

返回包含键timestamplocparval的值对象的行。

MetadataParser::parse(string $raw)

解析Hydroweb XML字符串。

返回两个字段:locationsparameters,都包含包含位置坐标或参数单位的StdClass对象的数组。

测试

运行composer test以执行PHPUnit测试套件。

发布

  1. 将更改添加到更改日志
  2. 创建新的标签vX.X.X
  3. 推送。

许可

MIT。

作者

克里斯蒂安·施图德 cstuder@existenz.ch,数字存在局。