gis - 为什么 shapely/geos 可以解析这个 'invalid' Well Known Binary?

标签 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 个字节,double x 有 8 个字节,double y 有 8 个字节。

渗透的一个例子是这个(十六进制)例子: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

为什么 shapely/geos 可以解析这个无效的 WKB?这些字节是什么意思?

最佳答案

GEOS/Shapely 使用 WKT/WKB 的扩展变体,称为 EWKT/EWKB,即 documented通过 PostGIS。如果您有权访问 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,这将为 2D 几何输出 ISO WKB(但不为 3D)。

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

关于gis - 为什么 shapely/geos 可以解析这个 'invalid' Well Known Binary?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29500460/

相关文章:

javascript - 如何设置 map 的缩放比例,以便可以完全看到我的路线? (这里.com api)

postgresql - PostGIS - 无法创建支持空间的数据库

r - 传单中的簇标记提供 R 中的密度信息

gis - 什么是初始轴承和最终轴承

mysql - 对于地理空间索引,Solr 和 MongoDB 在功能上有什么区别?

debugging - Microsoft 的 CodeView 格式规范

gis - 有人知道一个好的mapinfo论坛吗?

c - 我可以使用哪些格式说明符?

xml - XSD 规范中词汇表示与规范表示之间的区别

r - 在 spatstat 中使用 sf 多边形对象作为窗口