0

假设我有以下使用 Postgis 创建的几何图形:

SELECT 'POINT(1 2 3 2)'::geometry

我想读取 EWKB 表格,然后将其重新写回 EWKB(在现实世界的应用程序中,我会对几何图形进行一些更改,对于本示例,我们只是转换几何图形)

使用 osgeo 我可以执行以下操作:

import binascii
from osgeo import ogr

# The geometry as EWKB as it is returned by postgis:
s = '01010000C0000000000000F03F000000000000004000000000000008400000000000000040'

binary_string = binascii.unhexlify(s)

g = ogr.CreateGeometryFromWkb(binary_string)
print(g.ExportToIsoWkt())
print(binascii.hexlify(g.ExportToWkb()))

这产生:

POINT ZM (1 2 3 2)
b'0000000bb93ff0000000000000400000000000000040080000000000004000000000000000'

如您所见,几何形状与原始几何形状不同。我如何返回结果

export(g) == s

我也愿意接受使用 shapely 的解决方案,但是我的测试给出了 M 坐标的一些问题。

4

1 回答 1

1

我认为罪魁祸首是函数ST_AsEWKB本身,因为它返回包含 SRID 元数据的 WKB 表示。正如文档所述:

WKB 规范不包括 SRID。要获取 OGC WKB 格式,请使用 ST_AsBinary

现在,ST_AsBinary产生:

test=> SELECT ST_AsBinary(ST_GeomFromText('POINT(1 2 3 2)'));
                                 st_asbinary
------------------------------------------------------------------------------
 \x01b90b0000000000000000f03f000000000000004000000000000008400000000000000040
(1 row)

01表示的第一个字节表示字节序。所以在这里我们看到,默认情况下,PostGIS 以小端格式返回数据,而默认的 forExportToWkb似乎是大端格式。但是,ExportToWkb接受一个参数,byte_order使用该参数可以覆盖它(或者,可以覆盖ST_AsBinarywith的默认值ST_AsBinary(ST_GeomFromText('POINT(1 2 3 2)'), 'XDR')):

import binascii
from osgeo import ogr

# The geometry as it is returned by ST_AsBinary:
s = '01b90b0000000000000000f03f000000000000004000000000000008400000000000000040'

binary_string = binascii.unhexlify(s)

g = ogr.CreateGeometryFromWkb(binary_string)

print(g.ExportToIsoWkt())
print(binascii.hexlify(g.ExportToWkb(byte_order = 1)))

这产生:

POINT ZM (1 2 3 2)
b'01b90b0000000000000000f03f000000000000004000000000000008400000000000000040'

ST_AsBinary这与...的输出一致

于 2018-03-25T20:57:05.803 回答