如何将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.protogtfs_realtime_pb2.py文件,可直接导入使用。 - Java:
生成对应的Java类文件,放在指定目录下。protoc --java_out=. gtfs-realtime.proto - C++:
生成protoc --cpp_out=. gtfs-realtime.protogtfs-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
相关产品推荐
相关产品推荐

