【问题标题】:GTFS Realtime phpGTFS 实时 php
【发布时间】:2015-07-12 13:40:31
【问题描述】:

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

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

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

有人知道好的教程吗?或者有人可以帮我弄清楚如何做到这一点?

【问题讨论】:

    标签: php mysql real-time gtfs


    【解决方案1】:

    更完整的 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

    【讨论】:

      【解决方案2】:

      在我看来,您似乎不需要直接处理 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 已经创建。您唯一需要做的就是使用页面中提供的代码sn-p:

      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 文件中读取数据。但是,如果您的数据库中已经有了它们,那么就没有什么可做的了。

      【讨论】:

      • 我能够做到这一点并且脚本有效。我遇到的麻烦是弄清楚如何提取旅行更新数据。我已经尝试过 getTripUpdate() 和其他人,但我似乎无法让它工作
      猜你喜欢
      • 1970-01-01
      • 2019-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多