(见底部更新)
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_raw
和 protoc --decode=vector_tile。平铺 ./include/vector_tile.proto
。因此,我认为问题出在我正在查看的文件上。
最佳答案
我认为问题在于 OpenStreetMap 的 .pbf
格式不是原始 protobuf。请参阅我对您的其他问题的回答:
关于python - 使用正确的 .proto 文件时无法在 python 中解析 Protocol Buffer 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35367800/