python - 使用正确的 .proto 文件时无法在 python 中解析 Protocol Buffer 文件

标签 python openstreetmap protocol-buffers

(见底部更新)

Tilemaker是一个 OpenStreetMap程序生成Mapbox vector tiles (它们本身是 protocol buffers (pbf) 文件)来自 OSM pbf 数据文件。我编译了它并用它来创建一个矢量切片目录。我无法用 Python 解析这些文件。

我创建了矢量图 block :

tilemaker input.pbf --output=tiles/

然后我创建了一个简单的 python 程序,基于 Google's Protocol Buffers Python Tutorial这样:

编译.proto文件:

mkdir py
touch py/__init__.py
protoc --proto_path=include --python_out=./py ./include/osmformat.proto
protoc --proto_path=include --python_out=./py ./include/vector_tile.proto

这个 python 程序 pyread.py 不工作:

import sys
import py.vector_tile_pb2

with open(sys.argv[1]) as fp:
    pbf_file_contents = fp.read()

tile = py.vector_tile_pb2.Tile()
tile.ParseFromString(pbf_file_contents)

这是尝试运行时的错误:

$ python pyread.py ./tiles/13/3932/2588.pbf
Traceback (most recent call last):
  File "pyread.py", line 8, in <module>
    tile.ParseFromString(pbf_file_contents)
  File "/home/rory/.local/lib/python2.7/site-packages/google/protobuf/message.py", line 186, in ParseFromString
    self.MergeFromString(serialized)
  File "/home/rory/.local/lib/python2.7/site-packages/google/protobuf/internal/python_message.py", line 841, in MergeFromString
    if self._InternalParse(serialized, 0, length) != length:
  File "/home/rory/.local/lib/python2.7/site-packages/google/protobuf/internal/python_message.py", line 866, in InternalParse
    new_pos = local_SkipField(buffer, new_pos, end, tag_bytes)
  File "/home/rory/.local/lib/python2.7/site-packages/google/protobuf/internal/decoder.py", line 827, in SkipField
    return WIRETYPE_TO_SKIPPER[wire_type](buffer, pos, end)
  File "/home/rory/.local/lib/python2.7/site-packages/google/protobuf/internal/decoder.py", line 797, in _RaiseInvalidWireType
    raise _DecodeError('Tag had invalid wire type.')
google.protobuf.message.DecodeError: Tag had invalid wire type.

protoc 命令来自 Protocol Buffer 库。我从 Google 的页面(链接到 Github)下载了最新版本(2.6.1)并编译并安装了它。该协议(protocol)调用就像 Tilemaker Makefile does 一样.

这是怎么回事?我如何在 python 中读取此 Protocol Buffer 文件?


更新 进一步调查使我认为我的假设之一可能是错误的。也就是说,tilemaker 命令已生成有效的 protobuf 文件。我有一些 vector tiles from Mapzen ,它们应该具有相同的格式和非常相似的数据。 但是这种格式适用于 python pyread.py 命令,以及 protoc --decode_rawprotoc --decode=vector_tile。平铺 ./include/vector_tile.proto。因此,我认为问题出在我正在查看的文件上。

最佳答案

我认为问题在于 OpenStreetMap 的 .pbf 格式不是原始 protobuf。请参阅我对您的其他问题的回答:

https://stackoverflow.com/a/35384238/2686899

关于python - 使用正确的 .proto 文件时无法在 python 中解析 Protocol Buffer 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35367800/

相关文章:

python - 语音到ext转换

java - 在 Osmdroid map 中禁用滚动

javascript - Meteor:OSM的Oauth1.0a登录服务

protocol-buffers - 在 protobuf v2 中使用 map

protocol-buffers - 属性错误: module 'google._upb._message' has no attribute 'Message'

python - Matplotlib 误差条大写缺失

python - 更改生成的 .exe、py2exe 的图标

android - 在 android 中使用 openstreetMap

go - gRPC 流中的错误类型

python - 了解 Python 中的导入链