我正在尝试解析Well Known Binary地理信息系统(GIS)中使用的几何对象的二进制编码。我正在使用this spec from ESRI(结果here from esri)。我从Osmosis输入数据来解析OpenStreetMap数据,特别是pgsimp-dump format,它给出了二进制的十六进制表示。
ESRI文档说,Point
只有21个字节,字节顺序只有1个字节,typeid为uint32为4,双x为8,双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,它在uint32中出现3个字节
01010000**20E61000**00DB81DF2B5F7822C0DFBB7262B4744A40
为什么在WKB无效的情况下,可以使用匀称/地理解析此WKB?这些字节意味着什么?
答案 0 :(得分:4)
GEOS / Shapely使用名为EWKT / EWKB的WKT / WKB扩展变体,PostGIS为documented。如果您有权访问PostGIS,您可以在此处查看:
SELECT ST_AsEWKT('0101000020E6100000DB81DF2B5F7822C0DFBB7262B4744A40'::geometry);
返回EWKT SRID=4326;POINT(-9.2351011 52.9117549)
。因此,额外数据是空间参考标识符或SRID。特别是WGS 84的EPSG:4326。
Shapely does not support SRIDs,但有一些黑客,例如:
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才能执行此转换。