我正在尝试查看New York City Subway Realtime GTFS Feeds。经过大量阅读后,我了解了Protocol Buffers并安装了protoc
编译器。
New York City Transit的文件nyct-subway.proto.txt
第一行显示 NYFS地铁分机的GTFS实时协议。这应该与 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
尽管我之前的安装努力,但Python对import google.protobuf
一无所知,所以它sudo pip install protobuf
。
此时我仍然没有读取任何数据 - 我可以获得带有http://datamine.mta.info/mta_esi.php?key=<key>&feed_id=1
的gtfs文件,这是不可读的。
如何将其组合以读取GTFS文件中的数据?
答案 0 :(得分:2)
为了进一步澄清杰米的评论,你应该能够做到这样的事情:
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.
就个人而言,我认为协议缓冲区和gtfs-realtime可能会很痛苦。为了省略这项工作,我编写了一个独立的工具,将GTFS-realtime转换为JSON:
https://github.com/harrytruong/gtfs_realtime_json
只需下载(无安装),然后运行:gtfs_realtime_json <feed_url>
这是一个示例JSON output。
答案 1 :(得分:0)
您可以使用protobuf
Python包将两者结合在一起。
下载.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