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

如何将GTFS实时格式的vehiclepositions.pb文件转换为Protobuf源码?

处理GTFS Real-time的vehiclepositions.pb文件步骤

首先得明确:你拿到的vehiclepositions.pb是Protobuf序列化后的二进制数据文件,不是用来生成源码的——生成对应语言源码(.pb.h/.java/.py等)需要的是描述数据结构的.proto定义文件,而GTFS Real-time有官方标准的.proto文件,按下面步骤操作就行:

1. 获取GTFS Realtime的标准.proto定义文件

Google Transit官方提供了GTFS Realtime的标准.proto文件,文件名是gtfs-realtime.proto,你可以从官方的GTFS实时文档对应的资源中获取这个文件,它定义了VehiclePosition等所有GTFS实时数据的结构。

2. 用protoc编译.proto生成对应语言的源码

先确保你已经安装了Protobuf的编译器protoc(可从Protobuf官方发布包中获取),然后根据你要用的语言执行对应的编译命令:

  • Python:
    protoc --python_out=. gtfs-realtime.proto
    
    执行后会生成gtfs_realtime_pb2.py文件,可直接导入使用。
  • Java:
    protoc --java_out=. gtfs-realtime.proto
    
    生成对应的Java类文件,放在指定目录下。
  • C++:
    protoc --cpp_out=. gtfs-realtime.proto
    
    生成gtfs-realtime.pb.h和gtfs-realtime.pb.cc两个文件。

3. 用生成的源码解析vehiclepositions.pb文件

以Python为例,编写代码读取并解析二进制文件:

import gtfs_realtime_pb2

# 读取pb二进制文件
with open('vehiclepositions.pb', 'rb') as f:
    feed = gtfs_realtime_pb2.FeedMessage()
    feed.ParseFromString(f.read())

# 遍历所有车辆位置数据
for entity in feed.entity:
    if entity.HasField('vehicle'):
        vehicle = entity.vehicle
        print(f"车辆ID: {vehicle.vehicle.id}")
        print(f"线路ID: {vehicle.trip.route_id}")
        print(f"纬度: {vehicle.position.latitude}, 经度: {vehicle.position.longitude}")

其他语言的逻辑类似:先导入生成的类,然后读取二进制文件内容,调用对应语言的反序列化方法(比如Java的parseFrom())解析成可操作的对象,之后就能获取里面的字段数据了。

内容的提问来源于stack exchange,提问作者braue

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 05:05:18