3

我正在尝试查看New York City Subway Realtime GTFS Feeds。经过大量阅读,我了解了Protocol Buffers并安装了protoc编译器。

New York City Transit 的文件nyct-subway.proto.txt第一行显示 NYCT Subway extensions for the GTFS-realtime protocol。这应该与 结合gtfs-realtime-proto吗?我分别编译了两个协议缓冲区并得到了警告:

[libprotobuf WARNING google/protobuf/compiler/parser.cc:471] 
No syntax specified for the proto file. 
Please use 'syntax = "proto2";' or 'syntax = "proto3";' to specify a syntax version. (Defaulted to proto2 syntax.)

在 Python 中写了一行来调用任何protoc创建的库:

import gtfs_realtime_pb2, nyct_subway_pb2

import google.protobuf尽管我之前进行了安装工作,但 Python 对So it do一无所知sudo pip install protobuf

此时我仍然没有读取任何数据——我可以获得一个http://datamine.mta.info/mta_esi.php?key=<key>&feed_id=1不可读的 gtfs 文件。

如何结合它从 GTFS 文件中读取数据?

4

2 回答 2

2

为了进一步澄清 Jamie 的评论,您应该能够执行以下操作:

import urllib2
import gtfs_realtime_pb2, nyct_subway_pb2

... 

    // initialize the feed parser
    feed = gtfs_realtime_pb2.FeedMessage()

    // fetch the raw gtfs-realtime feed
    gtfs_raw = urllib2.urlopen("http://datamine.mta.info/mta_esi.php?key=<key>&feed_id=1").read()

    // parse the raw feed
    feed.ParseFromString(gtfs_raw)

    // access the data structure as needed
    print feed.header.timestamp
    print feed.header.gtfs_realtime_version

    for entity in feed.entity:
        // etc.

替代方法(命令行 + JSON)

就个人而言,我认为协议缓冲区和 gtfs-realtime 可能会很痛苦。为了跳过这项工作,我编写了一个将 GTFS-realtime 转换为 JSON 的独立工具:
https ://github.com/harrytruong/gtfs_realtime_json

只需下载(无需安装),然后运行:gtfs_realtime_json <feed_url>

这是一个示例JSON 输出

于 2015-02-25T07:20:25.870 回答
0

您可以使用protobufPython 包将两者结合在一起。下载这两个.proto文件并将其放入docs/gtfs_proto,为输出创建一个gtfs_proto文件夹,然后运行:

export SRC_DIR=docs/gtfs_proto
export DST_DIR=gtfs_proto
protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/nyct-subway.proto
于 2016-10-26T02:14:15.677 回答