2015-04-07 14 views
1

我正试图解析Well Known Binary地理信息系统(GIS)中使用的几何对象的二进制编码。我正在使用this spec from ESRI(结果相同here from esri)。我从Osmosis输入数据来解析OpenStreetMap数据,特别是pgsimp-dump format,它给出了二进制的十六进制表示。为什么可以修改/ geos解析这个'无效的'众所周知的二进制文件?

ESRI文档说,对于Point,字节顺序应该只有21个字节,对于typeid应该只有4个字节,对于doubley应该只有8个字节,对于double y应该只有8个字节。

来自渗透的一个例子是这个(十六进制)的例子:0101000020E6100000DB81DF2B5F7822C0DFBB7262B4744A40,它是25个字节长。

Shapely一个python程序来解析WKB(ETC),这是基于流行的C库GEOS能够解析这个字符串:当我问匀称从此转换为解析

>>> import shapely.wkb 
>>> shapely.wkb.loads("0101000020E6100000DB81DF2B5F7822C0DFBB7262B4744A40", hex=True) 
<shapely.geometry.point.Point object at 0x7f221f2581d0> 

WKB我得到了21个字节。

>>> shapely.wkb.loads("0101000020E6100000DB81DF2B5F7822C0DFBB7262B4744A40", hex=True).wkb.encode("hex").upper() 
'0101000000DB81DF2B5F7822C0DFBB7262B4744A40' 

的差是4个字节在中间,其中出现3个字节到UINT32为typeif = d

01010000**20E61000**00DB81DF2B5F7822C0DFBB7262B4744A40 

为什么可以匀称/ GEOS解析这个WKB时,它的无效WKB?这些字节是什么意思?

回答

3

GEOS /形象地使用一个名为EWKT/EWKB的WKT/WKB的扩展变体,它是PostGIS的documented。如果你有机会到PostGIS中,你可以看到什么是怎么回事:

SELECT ST_AsEWKT('0101000020E6100000DB81DF2B5F7822C0DFBB7262B4744A40'::geometry); 

返回EWKT SRID=4326;POINT(-9.2351011 52.9117549)。所以额外的数据是空间参考标识符或SRID。具体EPSG:4326为WGS 84

身材匀称does not support SRIDs,但也有少数黑客,例如:

from shapely import geos 
geos.WKBWriter.defaults['include_srid'] = True 

现在应该wkbwkb_hex输出EWKB,其中包括SRID。默认值为False,它将输出ISO WKB用于2D几何图形(但不适用于3D)。

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

相关问题