GTFS 实时 php

GTFS Realtime php

我有一个包含 GTFS 数据的 MySQL 数据库设置,我有 php 脚本 return 停止时间,我正在寻找添加实时数据。

我知道 Google 有关于如何使用 php 实时 gtfs 的说明(https://github.com/google/gtfs-realtime-bindings-php),但我似乎无法弄清楚如何让它工作。

我想做的是(使用所需的任何信息:trip_id、stop_id 等)return trip_update 延迟值,以便我可以相应地更新停止时间。

有人知道好的教程吗?或者有人可以帮我弄清楚该怎么做吗?

对我来说,您似乎不需要直接处理 Protobuf 文件,因为您的数据库中已经有了数据。所以已经有人负责阅读信息了。

GTFS-realtime 的数据结构是Protobuf Protocol,你需要知道它是如何工作的。下面简单介绍一下读取 Protobuf 数据的典型过程。这些说明不适用于 PHP,但可以让您大致了解该过程。

  1. 首先你需要安装Protobuf编译器。如果您使用 Mac OS X,请阅读 this.
  2. 使用 protoc 命令为您的 GTFS 实时数据生成协议缓冲区 API。命令行仅支持 C++、Java 和 Python。
  3. 您可以使用此 API 来读取您的数据。

据我了解,您 linked 的 repo 仅用于 GTFS 实时数据,因此协议缓冲区 API 已经创建。您唯一需要做的就是使用页面中提供的代码片段:

require_once 'vendor/autoload.php';

use transit_realtime\FeedMessage;

$data = file_get_contents("URL OF YOUR GTFS-REALTIME SOURCE GOES HERE");
$feed = new FeedMessage();
$feed->parse($data);
foreach ($feed->getEntityList() as $entity) {
  if ($entity->hasTripUpdate()) {
    error_log("trip: " . $entity->getId());
  }
}

结论:

GTFS-realtime 是 Protobuf 协议中处理传输信息的一种特殊数据。您可以创建一个 Protobuf API 来从 Protobuf 文件中读取数据。但是,如果您的数据库中已经有了它们,那么就没什么可做的了。

一个更完整的 GTFS 实时 PHP 示例可能如下所示:

foreach ($feed->getEntityList() as $entity) {
  if ($entity->hasTripUpdate()) {
    $trip = $entity->getTripUpdate();
    error_log("trip id: " . $trip->getTrip()->getTripId());
    foreach ($trip->getStopTimeUpdateList() as $stu) {
      if ($stu->hasArrival()) {
        $ste = $stu->getArrival();
        error_log("    arrival delay: " . $ste->getDelay());
        error_log("    arrival time: " . $ste->getTime());
      }
      if ($stu->hasDeparture()) {
        $ste = $stu->getDeparture();
        error_log("    departure delay: " . $ste->getDelay());
        error_log("    departure time: " . $ste->getTime());
      }
    }
  }
}

注意方法名称如何对应于底层 GTFS 实时模式中的字段:

https://developers.google.com/transit/gtfs-realtime/gtfs-realtime-proto

您可以在以下位置查看从架构生成的 PHP 源:

https://github.com/google/gtfs-realtime-bindings-php/blob/master/src/gtfs-realtime.php