使用R语言阅读GTFS-realtime文件?

5

另一个选择是使用GTFSrDB或类似的方式将结果存储到数据库中。https://github.com/mattwigway/gtfsrdb 。然后通过任意选择的数据库库连接。 - Tony Laidig
2个回答

4
我注意到你已经找到了开发包, gtfsway。特别是问题1中的示例演示了该软件包的工作方式以及它如何解析实时数据源。
devtools::install_github("SymbolixAU/gtfsway")
library(gtfsway)
url <- "https://gtfsrt.api.translink.com.au/Feed/SEQ"

response <- httr::GET(url)

FeedMessage <- gtfs_realtime(response)

## the function gtfs_tripUpdates() extracts the 'trip_update' feed
lst <- gtfs_tripUpdates(FeedMessage)  

## The results will obviously change depending on when you read the data
lst[[32]]
# $dt_trip_info
# trip_id start_time start_date route_id
# 1: 8959814-SBL 16_17-SBL_FUL-Friday-04   12:21:00   20170303  709-739
# 
# $dt_stop_time_update
#     stop_sequence stop_id arrival_time arrival_delay departure_time departure_delay
#  1:             1  318944   1488504104         -3556     1488507660               0
#  2:             2  318946   1488507741            21     1488507741              21
#  3:             3  300444   1488507903             3     1488507903               3
#  4:             4  300058   1488507977            17     1488507977              17
#  5:             5  300059   1488508022             2     1488508022               2
#  6:             6  300060   1488508094           -46     1488508094             -46
#  7:             7  300061   1488508115           -25     1488508115             -25
#  8:             8  300062   1488508148           -52     1488508148             -52
#  9:             9  300063   1488508175           -85     1488508175             -85
# 10:            10  300005   1488508299          -141     1488508299            -141
# 11:            11  300053   1488508398          -102     1488508398            -102
# 12:            12  300054   1488508458          -102     1488508458            -102
# 13:            13  300056   1488508638          -102     1488508638            -102
# 14:            14  300055   1488508758          -102     1488508758            -102
# 15:            15  300272   1488508998          -102     1488508998            -102
# 16:            16  319160   1488509058          -102     1488509058            -102

如果您有任何贡献或建议,我很乐意接受关于这个软件包的。


如果我有位于一个目录中的vehiclePositions.pb和tripUpdates.pb文件,我该如何打开它们?谢谢。 - Xavier Prudent
@XavierPrudent,我不太确定你在问什么。我认为你应该在这里开一个新的问题,或者如果它与gtfsway有关,你可以在github页面上问我? - SymbolixAU
gtfsway 是否只考虑 tripUpdates 还是也会考虑 vehiclePositions 呢? - Xavier Prudent
@XavierPrudent - 目前只有TripUpdates。我计划添加VehiclePositions,但是还没有时间去做。 - SymbolixAU
@XavierPrudent - 如果你想将其添加到包中,请随时在Github上发出Pull Request。 - SymbolixAU
1
@XavierPrudent - 我已经更新了 gtfsway ,现在包括一个 gtfs_vehiclePosition() 函数,该函数返回与车辆位置相关的基本信息。 - SymbolixAU

1
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")
## [1] "GTFSv2.Realtime.Alert"             "GTFSv2.Realtime.EntitySelector"   
## [3] "GTFSv2.Realtime.FeedEntity"        "GTFSv2.Realtime.FeedHeader"       
## [5] "GTFSv2.Realtime.FeedMessage"       "GTFSv2.Realtime.Position"
## ...

阅读实际的反馈 - 在这种情况下存储在“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"]] )
)
##                   id  latitude longitude
##1     VU-2123549587_1 -27.06561  153.1595
##2    VU-1176076363_10 -27.30158  152.9881
##3   VU--1272517086_10 -27.49080  153.2397
## ...

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