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

时间:2014-12-17 17:17:34

标签: python protocol-buffers gtfs

我正在尝试查看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文件中的数据?

2 个答案:

答案 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.

备用方法(命令行+ JSON)

就个人而言,我认为协议缓冲区和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