GTFS实时数据源是二进制
Protocol Buffers,可以通过
RProtoBuf包进行处理。
以下是使用我本地的东南昆士兰Translink数据源的简单示例:
library(RProtoBuf)
加载实际的Proto文件,该文件指定了实际遵循的供稿文件格式:
download.file(url="https://gtfsrt.api.translink.com.au/api/realtime/protobuf", destfile="translink-gtfs-realtime.proto")
readProtoFiles("translink-gtfs-realtime.proto")
请勾选所有现在可以在“描述符池”中加载的“描述符”。
ls("RProtoBuf:DescriptorPool")
阅读实际的反馈 - 在这种情况下存储在“FeedMessage”/“实体”中。
download.file(url="https://gtfsrt.api.translink.com.au/api/realtime/SEQ/TripUpdates", destfile="SEQ-TripUpdates.pb")
download.file(url="https://gtfsrt.api.translink.com.au/api/realtime/SEQ/VehiclePositions", destfile="SEQ-VehiclePositions.pb")
vehicle_position_feed <- read(GTFSv2.Realtime.FeedMessage, "SEQ-VehiclePositions.pb")[["entity"]]
trip_update_feed <- read(GTFSv2.Realtime.FeedMessage, "SEQ-TripUpdates.pb")[["entity"]]
阅读时,每个对象只是指向二进制文件部分的指针集合:
str(vehicle_position_feed)
##List of 6
## $ :Formal class 'Message' [package "RProtoBuf"] with 2 slots
## .. ..@ pointer:<externalptr>
## .. ..@ type : chr "GTFSv2.Realtime.FeedEntity"
## $ :Formal class 'Message' [package "RProtoBuf"] with 2 slots
## .. ..@ pointer:<externalptr>
## .. ..@ type : chr "GTFSv2.Realtime.FeedEntity"
## ..
您可以通过循环文件来构建数据集以处理每个数据点中的信息,例如:
data.frame(
id = sapply(vehicle_position_feed, \(x) x[["id"]] ),
latitude = sapply(vehicle_position_feed, \(x) x[["vehicle"]][["position"]][["latitude"]] ),
longitude = sapply(vehicle_position_feed, \(x) x[["vehicle"]][["position"]][["longitude"]] )
)