GTFS - 如何结合协议缓冲和GTFS文件?

3

我在尝试查看纽约市地铁实时GTFS数据源。经过大量阅读,我了解到Protocol Buffers并安装了protoc编译器。

纽约市交通局有一个文件nyct-subway.proto.txt,第一行写着“为GTFS-realtime协议提供的NYCT Subway扩展”。这个文件应该和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文件中读取数据?

你找到解决方案了吗? - venky
nyct-subway.proto文件在protoc编译时依赖于gtfs-realtime.proto文件。因此,一旦protoc从这些.proto文件生成Python代码,您应该能够只导入该生成的Python代码并在您的代码中使用一个名为FeedMessage或transit_realtime.FeedMessage的生成类。这段代码是将二进制反馈响应解码为实例的代码,当您调用FeedMessage.FromString(s)时,其中s是原始反馈响应。 - Jamie Flournoy
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输出.


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接