0

我在 OGR 中创建一个多边形并在 Python 中为其添加坐标。添加时不允许更改我的坐标是必须的,但是它们会更改,我不明白为什么。这是我的例子:

import ogr
ring = ogr.Geometry(ogr.wkbLinearRing)
ring.AddPoint(12.5433, 54.10064)
ring.AddPoint(12.5433026066, 54.1006582464)
ring.AddPoint(12.543312311, 54.1006489082)
ring.AddPoint(12.5433093954, 54.1006320625)
ring.AddPoint(12.5433, 54.10064)

poly = ogr.Geometry(ogr.wkbPolygon)
poly.AddGeometry(ring)

polygon = poly.ExportToWkt()

现在,如果我打印多边形,我会收到:

'POLYGON ((12.5433 54.10064 0,
           12.543302606599999 54.100658246400002 0,
           12.543312311 54.1006489082 0,
           12.5433093954 54.100632062499997 0,
           12.5433 54.10064 0))'

例如:

Example: (12.5433026066, 54.1006582464) to (12.543302606599999 54.100658246400002)

显然已经添加了浮点数,我不明白为什么。帮助表示赞赏。

我是怎么做到的?因为我只需要 WKT 格式,所以我连接了一个字符串:

a = [(12.5433, 54.10064),(12.5433026066, 54.1006582464),(12.543312311, 54.1006489082),(12.5433093954, 54.1006320625),(12.5433, 54.10064)]

polygon = str('POLYGON((')

for i in range(len(a)):
    polygon+= str(a[i][0])
    polygon+= str(' ')
    polygon+= str(a[i][1])
    polygon+= str(',')
    if i==len(a)-1:
        polygon+=str(a[0][0])
        polygon+=str(a[0][1])
        polygon+=str('))')

print polygon
4

1 回答 1

1

问题是当使用float类型时你不能准确地表示一些数字。例如

In [47]: x = 0.4

In [48]: '{:.30f}'.format(x)
Out[48]: '0.400000000000000022204460492503'

因此,当您存储数字时12.5433026066,它实际上12.543302606599999293734981620219.

您的poly.ExportToWkt()方法是使用给定的小数位数导出这些数字,这就是为什么9999...它们出现在最后,它们是数字内部表示的一部分。

不幸的是,您可能无法避免这种情况。如果您的软件包适用于该decimal软件包,那么您可以尝试使用它们。使用Decimal对象可以让您准确地存储数字。

这个异地资源有一些关于如何在内部处理浮点数的细节。Python 文档也有关于浮点数限制的指南。

于 2014-11-20T10:20:48.337 回答