Как понять MTA в режиме реального времени GTFS фидов данных
Пока что я заполнил онлайн регистрационную форму MTA для ключа API разработчика. Затем в своем проекте Android я реализовал зависимость привязок gtfs в реальном времени от одного из репозиториев Google github,
compile group: 'com.google.transit', name: 'gtfs-realtime-bindings', version: '0.0.4'
Используя их класс Java, я попробовал следующий код, чтобы распечатать все данные gtfs по ссылке, предоставленной MTA,
try {
String urlString = "http://datamine.mta.info/mta_esi.php?key=insertmykeyhere";
URL url = new URL(urlString.toString());
GtfsRealtime.FeedMessage feed = GtfsRealtime.FeedMessage.parseFrom(url.openStream());
for (GtfsRealtime.FeedEntity entity : feed.getEntityList()) {
if (entity.hasTripUpdate()) {
Log.d("stuff", entity.getTripUpdate().toString());
}
}
} catch (IOException e) {
e.printStackTrace();
}
Однако теперь у меня возникают проблемы с интерпретацией распечатанных данных. Я понимаю, что есть статические потоки данных из http://web.mta.info/developers/developer-data-terms.html, которые я использовал для интерпретации некоторых данных. Вот одно из распечатанных обновлений поездки,
stuff: trip {
trip_id: "036000_GS.N01R"
start_date: "20170218"
route_id: "GS"
1001: "\n\0200S 0600 GCS/TSS\020\001\030\001"
}
stop_time_update {
departure {
time: 1487415600
}
stop_id: "901N"
1001: "\n\0011\022\0011"
}
stop_time_update {
arrival {
time: 1487415690
}
stop_id: "902N"
1001: "\n\0011"
}
Я понимаю некоторые части, такие как trip_id, start_date и stop_id. Но такие части, как trip_id, time и 1001, я до сих пор не уверен в этом, и текстовые файлы из статического канала не лучше всего объясняют их.
1 ответ
Каналы MTA Subway GTFS-RT немного отличаются от большинства других.
Обычно GTFS-RT ссылается непосредственно на статический GTFS через trip_id/stop_id/etc. Поскольку в Нью-Йорке обычно наблюдается отклонение от нормального обслуживания ("2 поезда через 5 линий"), RT-канал сохраняет возможность создания новых рейсов, которых нет в статическом канале.
Чтобы ответить на ваши непосредственные вопросы, вам нужно добавить расширения в реальном времени. Это должно решить пустое поле 1001:.
Для этого либо скомпилируйте файл proto, либо просто импортируйте библиотеку onebusaway-gtfs-realtime-api, в которой расширения предварительно скомпилированы в:
ExtensionRegistry registry = ExtensionRegistry.newInstance();
registry.add(GtfsRealtimeNYCT.nyctFeedHeader);
registry.add(GtfsRealtimeNYCT.nyctStopTimeUpdate);
registry.add(GtfsRealtimeNYCT.nyctTripDescriptor);
GtfsRealtime.FeedMessage feed = GtfsRealtime.FeedMessage.parseFrom(url.openStream(), registry);
Это дает результат как:
trip {
trip_id: "B20170217WKD_132800B..S"
start_date: "2017-02-17 22:08:00"
route_id: "B"
[transit_realtime.nyct_trip_descriptor] {
train_id: "1B 2208 145/BBC"
is_assigned: true
direction: SOUTH
}
}
stop_time_update {
arrival {
time: 1487390920
}
departure {
time: 1487390920
}
stop_id: "D39"
schedule_relationship: SCHEDULED
[transit_realtime.nyct_stop_time_update] {
scheduled_track: "A3"
actual_track: "A3"
}
}
stop_time_update {
arrival {
time: 1487391130
}
departure {
time: 1487391130
}
stop_id: "D40"
schedule_relationship: SCHEDULED
[transit_realtime.nyct_stop_time_update] {
scheduled_track: "A3"
actual_track: "A3"
}
}