Gis 为什么shapely/geos可以解析这个';无效';著名的二进制?
我试图解析地理信息系统(GIS)中使用的几何体对象的二进制编码。我正在使用(相同的结果)。我从一个工具输入数据来解析OpenStreetMap数据,特别是给出二进制十六进制表示的 ESRI文件指出,对于Gis 为什么shapely/geos可以解析这个';无效';著名的二进制?,gis,geospatial,specifications,geos,shapely,Gis,Geospatial,Specifications,Geos,Shapely,我试图解析地理信息系统(GIS)中使用的几何体对象的二进制编码。我正在使用(相同的结果)。我从一个工具输入数据来解析OpenStreetMap数据,特别是给出二进制十六进制表示的 ESRI文件指出,对于点,应该只有21个字节;对于字节顺序,应该有1个字节;对于uint32,应该有4个字节;对于双x,应该有8个字节;对于双y,应该有8个字节 渗透作用的一个示例是(十六进制)示例:0101000020e610000db81df2b5f7822c0dfbb7262b4744a40,长度为25字节 解析
点
,应该只有21个字节;对于字节顺序,应该有1个字节;对于uint32,应该有4个字节;对于双x,应该有8个字节;对于双y,应该有8个字节
渗透作用的一个示例是(十六进制)示例:0101000020e610000db81df2b5f7822c0dfbb7262b4744a40
,长度为25字节
解析WKB(etc)的python程序基于流行的C库能够解析此字符串:
>>> import shapely.wkb
>>> shapely.wkb.loads("0101000020E6100000DB81DF2B5F7822C0DFBB7262B4744A40", hex=True)
<shapely.geometry.point.Point object at 0x7f221f2581d0>
差异是中间的4个字节,在UIT32中出现3个字节,用于Type I= D
01010000**20E61000**00DB81DF2B5F7822C0DFBB7262B4744A40
为什么shapely/geos可以在WKB无效时解析此WKB?这些字节意味着什么?GEOS/Shapely使用了一个扩展的WKT/WKB变体,称为EWKT/EWKB,这是PostGIS提供的。如果您有权访问PostGIS,您可以看到这里发生了什么:
SELECT ST_AsEWKT('0101000020E6100000DB81DF2B5F7822C0DFBB7262B4744A40'::geometry);
返回EWKTSRID=4326;点(-9.2351011 52.9117549)
。因此,额外的数据是空间参考标识符,或SRID。特别是WGS 84
然而,Shapely也有一些缺陷,例如:
from shapely import geos
geos.WKBWriter.defaults['include_srid'] = True
现在应使wkb
或wkb_hex
输出包含SRID的EWKB。默认值为False
,这将输出二维几何图形的ISO WKB(但不用于三维几何图形)
因此,您的目标似乎是将EWKB转换为ISO WKB,这仅适用于二维几何图形的GEOS/Shapely。如果您有3D(Z或M)或4D(ZM)几何图形,则只有PostGIS能够进行此转换
from shapely import geos
geos.WKBWriter.defaults['include_srid'] = True