为什么塑造/地理可以解析这个'无效'众所周知的二进制?

时间:2015-04-07 20:13:54

标签: gis geospatial specifications geos shapely

我正在尝试解析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?这些字节意味着什么?

1 个答案:

答案 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

现在应该让wkbwkb_hex输出包含SRID的EWKB。默认值为False,它将为2D几何输出ISO WKB(但不会输出3D)。

因此,您的目标似乎是将EWKB转换为ISO WKB,您只能使用GEOS / Shapely进行2D几何。如果您有3D(Z或M)或4D(ZM)几何图形,则只有PostGIS才能执行此转换。