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,但可以让您大致了解该过程。
- 首先你需要安装Protobuf编译器。如果您使用 Mac OS X,请阅读 this.
- 使用
protoc
命令为您的 GTFS 实时数据生成协议缓冲区 API。命令行仅支持 C++、Java 和 Python。
- 您可以使用此 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
我有一个包含 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,但可以让您大致了解该过程。
- 首先你需要安装Protobuf编译器。如果您使用 Mac OS X,请阅读 this.
- 使用
protoc
命令为您的 GTFS 实时数据生成协议缓冲区 API。命令行仅支持 C++、Java 和 Python。 - 您可以使用此 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