1

我想将 XY 坐标的 WKB 表示形式转换为 YX 格式。我正在使用的代码适用于 42 个字符的 WKB 字符串,但是当我在 50 个字符的字符串上使用它时,它会给我一个奇怪的 YX 输出。我正在运行 Python 2.7.5。

这是我的代码:

from osgeo import ogr
from binascii import unhexlify

## converts a WKB string into a YX coordinate

input = raw_input("Enter WKB string: ")
wkb = unhexlify(input)
point = ogr.CreateGeometryFromWkb(wkb)
print "%.3f,%.3f" % (point.GetY(), point.GetX())


# no work 0101000020E6100000BD30B7B921A85AC07513F26D8A1A4840
# work    0101000000C458A65F22A85AC0E412471E881A4840

当我输入 42 个字符串时,我的结果很好: POINT (-106.627098 48.207279)

但是当我输入我的 50 个字符串时,我得到: 35551347284760172989733196762993524505383784689069116267735275384883630368447731158999360461880613447190932995080.60.61

当我只打印点时,我得到这个: POINT (-0.0 too_big)

谁能帮我解释一下?

4

3 回答 3

2

这 50 个字符的字符串来自哪里?它是标头,0101000020似乎不是有效的WKB 标头,因为首先01暗示小端序,因此几何类型被翻译为0x20000001,这是未定义的。

其次,对于 WKB 表示的点长度是 42,而不是 50,因为坐标是双倍的(8 字节长),因此十六进制时长 16 个字符。请参阅您的工作示例:

>>> s = 'C458A65F22A85AC0E412471E881A4840'
>>> struct.unpack('<d', unhexlify(s[:16]))
(-106.62709799999999,)
>>> struct.unpack('<d', unhexlify(s[16:]))
(48.207279,)

然后很清楚为什么您的第二个示例不起作用,因为发生了以下情况(不确定 osgeo 如何准确提取 16 个字符的子字符串):

>>> s = 'E6100000BD30B7B921A85AC07513F26D8A1A4840'
>>> struct.unpack('>d', unhexlify(s[-32:-16]))
(-5.939309002701494e-14,)
>>> struct.unpack('>d', unhexlify(s[-16:]))
(9.359519850637786e+255,)    
于 2013-12-30T09:02:31.040 回答
1

I figured it out. It's a bit hackey, though

So the 50 character string that didn't work was this: 0101000020E6100000BD30B7B921A85AC07513F26D8A1A4840

I made some changes and turned it into this and it worked: 0101000020BD30B7B921A85AC07513F26D8A1A4840

I deleted the 11-18th character and it turned into a valid point.

from osgeo import ogr
from binascii import unhexlify

## converts a WKB string into a YX coordinate

input = raw_input("Enter WKB string: ")
wkb = unhexlify(input)
point = ogr.CreateGeometryFromWkb(wkb)
print "%.6f,%.6f" % (point.GetY(), point.GetX())

For some reason it had an SRID error/extra digits. Once I removed those 8 digits, then it gave me the proper YX

于 2013-12-30T21:07:03.590 回答
0

我的 50 个字符串来自手动编辑的点。当我将 50 个字符串输入 QGIS 时,我得到一个有效点。另外,当我在 psql 中运行它时:

select concat(Y,',',X) as YX from
(select ST_Y('0101000020E6100000BD30B7B921A85AC07513F26D8A1A4840') as Y, st_x('0101000020E6100000BD30B7B921A85AC07513F26D8A1A4840') as X) as meister;

我得到一个有效的 YX:

48.2073495323192,-106.627058438203

所以 WKB 是有效的并且读取一个点几何。但由于某种原因 unhexlify 不能像 psql 函数那样读取它。这可能是一个多维点,因为它已被创建和编辑多次?

于 2013-12-30T18:53:40.323 回答