我正在尝试解析Well Known Binary地理信息系统 (GIS) 中使用的几何对象的二进制编码。我正在使用ESRI 的这个规范(这里的结果与 esri相同)。我从Osmosis输入数据,这是一个解析 OpenStreetMap 数据的工具,特别是pgsimp-dump 格式,它给出了二进制的十六进制表示。
ESRI 文档说 a 应该只有 21 个Point
字节,字节顺序应该只有 1 个字节,typeid 应该只有 4 个字节,typeid 应该只有 8 个字节,double x 应该有 8 个字节,double y 应该只有 8 个字节。
osmosis 的一个例子是这个(十六进制)例子:0101000020E6100000DB81DF2B5F7822C0DFBB7262B4744A40
,它有 25 个字节长。
Shapely一个解析 WKB(等)的 Python 程序,它基于流行的 C 库GEOS 能够解析这个字符串:
>>> import shapely.wkb
>>> shapely.wkb.loads("0101000020E6100000DB81DF2B5F7822C0DFBB7262B4744A40", hex=True)
<shapely.geometry.point.Point object at 0x7f221f2581d0>
当我要求 Shapely 解析然后转换为 WKB 时,我得到 21 个字节。
>>> shapely.wkb.loads("0101000020E6100000DB81DF2B5F7822C0DFBB7262B4744A40", hex=True).wkb.encode("hex").upper()
'0101000000DB81DF2B5F7822C0DFBB7262B4744A40'
不同的是中间的 4 个字节,对于 typeif=d 出现 3 个字节进入 uint32
01010000**20E61000**00DB81DF2B5F7822C0DFBB7262B4744A40
当 WKB 无效时,为什么 shapely/geos 可以解析这个 WKB?这些字节是什么意思?