解析 NYC Transit/MTA 历史 GTFS 数据(非实时)
Parsing NYC Transit/MTA historical GTFS data (not realtime)
几个月来我一直在断断续续地困惑这个问题,找不到解决办法。
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 行:
n
^C1.0^X �枪�^Eʞ>`
^C1.0^R^K
^A1^R^F^P����^E^R^K
^A2^R^F^P����^E^R^K
^A3^R^F^P����^E^R^K
^A4^R^F^P����^E^R^K
^A5^R^F^P����^E^R^K
^A6^R^F^P����^E^R^K
^AS^R^F^P����^E^R[
^F000001^ZQ
6个
^N050400_1..S02R^Z^H20140917*^A1�>^V
^P01 0824 242/SFY^P^A^X^C^R^W^R^F^Pɚ��^E"^D140Sʚ>^F
^AA^R^AA^RR
^F000002"H
6
根据 MTA 网站(似乎不真实)
All data is formatted in GTFS-realtime
知道将这个神秘文件转换为可用 GTFS 数据的必要步骤吗?我缺少一些编码吗?我已经找了 10 多个,但无法提出解决方案。
此外,我不是固执己见,但我指的不是 MTA 的实时数据源,它的格式正确且可用。我特别指的是我在上面引用的历史数据转储(已经收到很多 "solutions" 仅指实时数据馈送)
您 link 访问的文件是 GTFS 实时格式,而不是 GTFS,并且您 link 访问的页面在解释其数据实际采用的格式方面做得非常糟糕(虽然在你的引述中提到了它)。
GTFS 用于存储时间表数据,例如路线和预定到达时间。
GTFS-realtime 通常用于实时传输实际的运输性能数据,例如车辆位置和预计或实际到达时间。它是一个 protobuf,一种由 Google 公开的编译二进制数据规范,这意味着您无法在文本编辑器中有效地阅读它,而是必须使用 Google protobuf 工具以编程方式加载它.通过公开提供 GTFS-rt 提要的每日转储,它可以像 MTA 一样用作历史数据格式。之所以称为 GTFS-realtime,是因为 route_id
、trip_id
和 stop_id
等实时数据字段旨在 link 发布的 GTFS 计划。
我通过使用 gtfs-realtime.proto 规范和用于 Python 的 Google protobuf 工具反编译它,确认了您 link 编辑的数据的有效性。开始:
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
这需要使用 protoc
(按照 "Compiling Your Protocol Buffers" 下的 Python protobuf documentation 中的说明)将 gtfs-realtime.proto
编译成 gtfs_realtime_pb2.py
并放置在与 Python 脚本相同的目录。此外,从 MTA 下载的二进制 protobuf 需要命名为 gtfs-rt.pb
并且位于与 Python 脚本相同的目录中。
几个月来我一直在断断续续地困惑这个问题,找不到解决办法。
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 行:
n ^C1.0^X �枪�^Eʞ>` ^C1.0^R^K ^A1^R^F^P����^E^R^K ^A2^R^F^P����^E^R^K ^A3^R^F^P����^E^R^K ^A4^R^F^P����^E^R^K ^A5^R^F^P����^E^R^K ^A6^R^F^P����^E^R^K ^AS^R^F^P����^E^R[ ^F000001^ZQ 6个 ^N050400_1..S02R^Z^H20140917*^A1�>^V ^P01 0824 242/SFY^P^A^X^C^R^W^R^F^Pɚ��^E"^D140Sʚ>^F ^AA^R^AA^RR ^F000002"H 6
根据 MTA 网站(似乎不真实)
All data is formatted in GTFS-realtime
知道将这个神秘文件转换为可用 GTFS 数据的必要步骤吗?我缺少一些编码吗?我已经找了 10 多个,但无法提出解决方案。
此外,我不是固执己见,但我指的不是 MTA 的实时数据源,它的格式正确且可用。我特别指的是我在上面引用的历史数据转储(已经收到很多 "solutions" 仅指实时数据馈送)
您 link 访问的文件是 GTFS 实时格式,而不是 GTFS,并且您 link 访问的页面在解释其数据实际采用的格式方面做得非常糟糕(虽然在你的引述中提到了它)。
GTFS 用于存储时间表数据,例如路线和预定到达时间。
GTFS-realtime 通常用于实时传输实际的运输性能数据,例如车辆位置和预计或实际到达时间。它是一个 protobuf,一种由 Google 公开的编译二进制数据规范,这意味着您无法在文本编辑器中有效地阅读它,而是必须使用 Google protobuf 工具以编程方式加载它.通过公开提供 GTFS-rt 提要的每日转储,它可以像 MTA 一样用作历史数据格式。之所以称为 GTFS-realtime,是因为 route_id
、trip_id
和 stop_id
等实时数据字段旨在 link 发布的 GTFS 计划。
我通过使用 gtfs-realtime.proto 规范和用于 Python 的 Google protobuf 工具反编译它,确认了您 link 编辑的数据的有效性。开始:
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
这需要使用 protoc
(按照 "Compiling Your Protocol Buffers" 下的 Python protobuf documentation 中的说明)将 gtfs-realtime.proto
编译成 gtfs_realtime_pb2.py
并放置在与 Python 脚本相同的目录。此外,从 MTA 下载的二进制 protobuf 需要命名为 gtfs-rt.pb
并且位于与 Python 脚本相同的目录中。