我正在尝试解析“众所周知的二进制”,一种地理信息系统(GIS)中使用的几何对象的二进制编码。我正在使用ESRI的此规范(与esri的结果相同)。我有Osmosis的输入数据,它是一种分析OpenStreetMap数据的工具,特别是pgsimp-dump格式,该格式提供了二进制的十六进制表示。
ESRI文档说,a只能有21个Point
字节,字节顺序应只有1个字节,typeid的uint32应该有4个字节,double x的数目应该是8个,double y的数目应该是8个。
这个(十六进制)示例就是渗透的一个示例:0101000020E6100000DB81DF2B5F7822C0DFBB7262B4744A40
,它的长度为25个字节。
身材匀称一个python程序来解析WKB(ETC),这是基于流行的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可以通过形状/地理解析此WKB?这些字节是什么意思?
GEOS /匀称使用WKT / WKB的扩展变体称为EWKT / EWKB,其记录由PostGIS的。如果可以访问PostGIS,则可以在这里查看发生了什么:
SELECT ST_AsEWKT('0101000020E6100000DB81DF2B5F7822C0DFBB7262B4744A40'::geometry);
返回EWKT SRID=4326;POINT(-9.2351011 52.9117549)
。因此,额外的数据是空间参考标识符或SRID。特别是WGS 84的EPSG:4326。
Shapely不支持SRID,但是有一些技巧,例如:
from shapely import geos
geos.WKBWriter.defaults['include_srid'] = True
现在应该制作wkb
或wkb_hex
输出包含SRID的EWKB。默认值为False
,它将为2D几何图形输出ISO WKB(但对于3D几何图形则不输出)。
因此,看来您的目标是将EWKB转换为ISO WKB,您只能将GEOS / Shapely用于2D几何。如果您具有3D(Z或M)或4D(ZM)几何形状,则只有PostGIS能够执行此转换。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句