You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 05:22:35