我想将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)
任何人都可以帮我解释一下吗?
答案 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;
48.2073495323192,-106.627058438203
因此WKB有效并读取点几何。但由于某种原因unhexlify无法读取它以及psql函数可以。这可能是一个多维点,因为它已多次创建和编辑?