PHP в режиме реального времени GTFS

У меня есть настройка базы данных MySQL с данными GTFS, и у меня есть php-скрипты, которые возвращают время остановки, и я хочу добавить данные в реальном времени.

Я знаю, что у Google есть инструкции по использованию gtfs в реальном времени с php (https://github.com/google/gtfs-realtime-bindings-php), но я не могу понять, как заставить его работать.

Что я хочу сделать, так это (используя любую необходимую информацию: trip_id, stop_id и т. д.) вернуть отложенное значение trip_update, чтобы я мог соответствующим образом обновить время остановки.

Кто-нибудь знает хороший учебник? Или может кто-нибудь помочь мне понять, как это сделать?


person Chris Schlitt    schedule 02.05.2015    source источник


Ответы (2)


Более полный пример GTFS-realtime 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-realtime:

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

person Brian Ferris    schedule 04.05.2015

Мне кажется, что вам не нужно иметь дело напрямую с файлами Protobuf, потому что у вас уже есть данные в вашей базе данных. Так что кто-то другой уже позаботится о прочтении информации.

Структура данных GTFS-realtime представляет собой протокол Protobuf, и вам нужно точно знать, как он работает. . Вот схема типичного процесса чтения данных Protobuf. Эти инструкции не работают для PHP, но дают общее представление о процессе.

  1. Сначала вам нужно установить компилятор Protobuf. Если вы используете Mac OS X, прочтите это.
  2. Используйте команду protoc для создания API-интерфейса буфера протокола для ваших данных GTFS в реальном времени. Командная строка поддерживает только C++, Java и Python.
  3. Вы можете использовать этот API для чтения ваших данных.

Насколько я понимаю, репозиторий, на который вы связались, предназначен только для 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, которые обрабатывают транзитную информацию. Вы можете создать API Protobuf для чтения данных из файлов Protobuf. Но если они уже есть в вашей базе данных, то делать нечего.

person bman    schedule 03.05.2015
comment
Я смог зайти так далеко, и сценарий работает. У меня возникли проблемы с выяснением того, как извлечь данные обновления поездки. Я пробовал getTripUpdate() и, возможно, другие, но я не могу заставить его работать - person Chris Schlitt; 04.05.2015