解析NYC Transit / MTA历史GTFS数据(非实时)

时间:2016-08-15 16:10:35

标签: parsing encoding gtfs

我几个月来一直在困惑这个问题并且无法找到解决方案。

MTA声称以GTFS格式提供每日转储形式的历史数据: [http://web.mta.info/developers/MTA-Subway-Time-historical-data.html][1]

通过下载他们提供的示例自己查看,在本例中为2014年9月17日: [https://datamine-history.s3.amazonaws.com/gtfs-2014-09-17-09-31][1]

我的问题?该文件是gobbledygook。它没有遵循GTFS规范,没有扩展名,当我使用文本编辑器打开它时,它看起来像7800行:

<磷>氮 ^ C1.0 ^ X 枪 ^Eʞ&gt;` ^ C1.0 ^ R-1K- ^ A1 ^ R ^ F ^ P ^ E ^ R-1K- ^ A2 ^ R ^ F ^ P ^ E ^ R-1K- ^ A3 ^ R ^ F ^ P ^ E ^ R-1K- ^ A4 ^ R ^ F ^ P ^ E ^ R-1K- ^ A5 ^ R ^ F ^ P ^ E ^ R-1K- ^ A6 ^ R ^ F ^ P ^ E ^ R-1K- ^ AS ^ R ^ F ^ P ^ E ^ R [ ^ ^ F000001 ZQ 6 ^ N050400_1..S02R ^ Z ^ H20140917 * ^ A1&GT; ^ V ^ P01 0824 242 / SFY ^ P ^ A ^ X ^ C ^ R ^ W ^ R ^ F ^ P ^ ^ E“^D140Sʚ&gt; ^ F ^ AA ^ R ^ AA ^ RR ^ F000002" H 6

根据MTA网站(显示不真实)

  

所有数据都以GTFS-realtime格式化

有关将此神秘文件转换为可用GTFS数据所需步骤的任何想法吗?我缺少一些编码吗?我已经找了10+并且无法提出解决方案。

此外,不是一个坚持者,但我不是指MTA的实时数据源,它是正确格式化和可用的。我特别指的是上面引用的历史数据转储(已经收到许多“解决方案”仅指实时数据馈送)

1 个答案:

答案 0 :(得分:6)

您链接的文件是GTFS实时格式,而不是GTFS,您链接的页面在解释其数据实际所处的格式方面做得非常糟糕(尽管在您的引用中提到过)。

GTFS用于存储计划数据,如路线和预定到达时间。

GTFS-realtime通常用于实时传输实际的公交性能数据,如车辆位置和预期或实际到达时间。它是一个protobuf,是Google公布的已编译二进制数据的规范,这意味着您无法在文本编辑器中有效地阅读它,但您必须使用Google protobuf工具以编程方式加载它。通过公开提供GTFS-rt feed的每日转储,它可以像MTA一样用作历史数据格式。它被称为GTFS-realtime,因为实时的各种数据字段(如route_idtrip_idstop_id)旨在链接到已发布的GTFS计划。

我通过使用gtfs-realtime.proto规范和用于Python的Google protobuf工具对其进行反编译来确认您链接的数据的有效性。它开始于:

header {
  gtfs_realtime_version: "1.0"
  timestamp: 1410960621
}
entity {
  id: "000001"
  trip_update {
    trip {
      trip_id: "050400_1..S02R"
      start_date: "20140917"
      route_id: "1"
    }
    stop_time_update {
      arrival {
        time: 1410960713
      }
      stop_id: "140S"
    }
  }
}
...

并继续这种情况共计55833行(采用默认的字符串输出格式)。

编辑:用于将protobuf转换为字符串表示形式的Python脚本非常简单:

import gtfs_realtime_pb2 as gtfs_rt

f = open('gtfs-rt.pb', 'rb')
raw_str = f.read()

msg = gtfs_rt.FeedMessage()
msg.ParseFromString(raw_str)

print msg

这需要使用gtfs-realtime.protogtfs_realtime_pb2.py编译为protoc(按照“编译协议缓冲区”下的Python protobuf documentation中的说明进行操作)并放置在gtfs-rt.pb中目录作为Python脚本。此外,从MTA下载的二进制protobuf需要命名为Set Property: _InvalidConfigurationMessageText=The OutputPath property is not set for project 'NutritionAdminWeb.csproj'. Please check to make sure that you have specified a valid combination of Configuration and Platform for this project. Configuration='Debug' Platform='AnyCPU'. ,并且与Python脚本位于同一目录中。