转换50个字符串时取消确认错误

时间:2013-12-30 08:30:56

标签: python string ogr

我想将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个字符串时,我的结果是好的: 要点(-106.627098 48.207279)

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

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

任何人都可以帮我解释一下吗?

3 个答案:

答案 0 :(得分:2)

这50个字符串来自哪里?它的标题0101000020似乎不是有效的WKB header,因为第一个01暗示了小端,因此几何类型被翻译为0x20000001,这是未定义的。< / p>

其次,对于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,)    

答案 1 :(得分:1)

我明白了。虽然

,但它有点hackey

所以50个不起作用的字符串是这样的: 0101000020E6100000BD30B7B921A85AC07513F26D8A1A4840

我做了一些修改并把它变成了这个并且它有效: 0101000020BD30B7B921A85AC07513F26D8A1A4840

我删除了第11-18个字符,它变成了有效点。

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())

由于某种原因,它有SRID错误/额外数字。一旦我删除了那8个数字,它就给了我正确的YX

答案 2 :(得分: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函数可以。这可能是一个多维点,因为它已多次创建和编辑?