在R中读取GTFS实时位置.pb文件的方法求助
读取GTFS实时.pb文件的问题
我尝试从GTFS数据中获取公交的实时位置,参考了一个示例,但目标数据源是.pb格式,和示例里的.proto不一样。
可复现代码
library(readr) library(dplyr) library(RProtoBuf) readr::read_csv("https://storage.googleapis.com/storage/v1/b/mdb-csv/o/sources.csv?alt=media") |> dplyr::filter(mdb_source_id == 1607) |> dplyr::pull(urls.direct_download) |> download.file(destfile = "data/hfx_transit_realtime_locations.pd") RProtoBuf::read("GTFSv2.Realtime.Position", "data/hfx_transit_realtime_locations.pd")
执行错误
Error in (function (classes, fdef, mtable) : unable to find an inherited method for function ‘read’ for signature ‘"character", "character"’
目标数据源URL:
URL = 'http://gtfs.halifax.ca/realtime/Vehicle/VehiclePositions.pb'
我不确定当前流程是否正确,因为目标数据源是.pb文件而非.proto。我曾假设"GTFSv2.Realtime.Position"适用于所有GTFS数据源,想问读取GTFS的.pb文件是否有不同的流程或函数调用?最终目标是获取并绘制上述URL中的实时位置。
解决方案
首先纠正一个代码小错误:你下载文件时把后缀写成了.pd,正确后缀应为.pb,这会影响后续读取。
读取GTFS实时的.pb(Protocol Buffers二进制文件)需先加载官方标准的.proto定义,再解析二进制文件,具体步骤如下:
下载官方GTFS实时.proto文件
获取GTFS实时的标准proto定义并保存到本地:download.file( url = "https://developers.google.com/transit/gtfs-realtime/gtfs-realtime.proto", destfile = "gtfs-realtime.proto" )编译proto定义
使用RProtoBuf::compileProto()编译proto文件,生成对应的R类:RProtoBuf::compileProto("gtfs-realtime.proto")读取并解析.pb二进制文件
下载目标.pb文件后,用编译后的FeedMessage类解析:# 下载目标实时位置.pb文件 download.file( url = "http://gtfs.halifax.ca/realtime/Vehicle/VehiclePositions.pb", destfile = "VehiclePositions.pb" ) # 解析二进制文件 feed <- RProtoBuf::read(FeedMessage, "VehiclePositions.pb")提取实时位置数据
从解析后的feed对象中提取车辆信息,转换成可用于绘图的数据框:vehicle_positions <- lapply(feed$entity, function(entity) { vp <- entity$vehicle data.frame( vehicle_id = vp$vehicle$id, route_id = vp$trip$route_id, latitude = vp$position$latitude, longitude = vp$position$longitude, timestamp = as.POSIXct(vp$timestamp, origin = "1970-01-01") ) }) |> dplyr::bind_rows()绘制实时位置
用ggplot2绘制车辆实时位置:library(ggplot2) ggplot(vehicle_positions, aes(x = longitude, y = latitude)) + geom_point(aes(color = route_id), size = 2) + labs(title = "Halifax Transit 实时车辆位置", x = "经度", y = "纬度") + theme_minimal()
内容的提问来源于stack exchange,提问作者Ryan Garnett
相关产品推荐
相关产品推荐

