python - 应该接触的匀称多边形却没有

标签 python geometry shapely

以下是一些 Shapely 代码,用于创建三个正方形多边形:p1p2p3p2 紧邻 p1 的右侧,p3 紧邻其下方。

问题是 Shapely 告诉我 p1p2 不要接触,而 p1p3做。我看不出这里出了什么问题。

from shapely.geometry import Polygon

DELTA = 0.2

def polygonFromPoint(p):
    return Polygon([(p[0]-DELTA*0.5, p[1]-DELTA*0.5),
                    (p[0]-DELTA*0.5, p[1]+DELTA*0.5),
                    (p[0]+DELTA*0.5, p[1]+DELTA*0.5),
                    (p[0]+DELTA*0.5, p[1]-DELTA*0.5)])

p1 = polygonFromPoint([-118.8,35.0])
p2 = polygonFromPoint([-118.6,35.0])
p3 = polygonFromPoint([-118.8,34.8])

print(p1)
print(p2)
print(p3)

print(p1.overlaps(p2), p1.intersects(p2), p1.crosses(p2), p1.contains(p2),
      p1.disjoint(p2), p1.touches(p2))
print(p1.overlaps(p3), p1.intersects(p3), p1.crosses(p3), p1.contains(p3),
      p1.disjoint(p3), p1.touches(p3))

运行此命令会产生以下输出:

POLYGON ((-118.9 34.9, -118.9 35.1, -118.7 35.1, -118.7 34.9, -118.9 34.9))
POLYGON ((-118.7 34.9, -118.7 35.1, -118.5 35.1, -118.5 34.9, -118.7 34.9))
POLYGON ((-118.9 34.7, -118.9 34.9, -118.7 34.9, -118.7 34.7, -118.9 34.7))
False False False False True False
False True False False False True

这表明 Shapely 认为 p1p2 不相交或接触,而 p1p3相交并接触。

编辑:正如 Gilles-Philippe Paillé 和其他人所说,这是多边形坐标的精度问题。使用以下调整可以解决这种情况下的问题:

def polygonFromPoint(p):
    return Polygon( [(round(p[0]-DELTA*0.5,1), round(p[1]-DELTA*0.5,1)),
                        (round(p[0]-DELTA*0.5,1), round(p[1]+DELTA*0.5,1)),
                        (round(p[0]+DELTA*0.5,1), round(p[1]+DELTA*0.5,1)),
                        (round(p[0]+DELTA*0.5,1), round(p[1]-DELTA*0.5,1))] ) 

最佳答案

即使多边形的字符串表示形式显示坐标相同,底层浮点表示形式也并不完全是打印的内容,并且可能包含一些不精确的内容。使用您的坐标和相同的计算,我得到:

DELTA = 0.5

a = -118.6 - 0.2 * DELTA
b = -118.8 + 0.2 * DELTA
print(a)
print(b)
print(a <= b)

a = 35.0 - 0.2 * DELTA
b = 34.8 + 0.2 * DELTA
print(a)
print(b)
print(a <= b)

给出以下输出:

-118.69999999999999
-118.7
False
34.9
34.9
True

关于python - 应该接触的匀称多边形却没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59936859/

相关文章:

python - 如何在 Selenium Webdriver 2 Python 中获取当前 URL?

ios - 在 iOS 开发中,使用 Core Graphics 和/或 Quartz 2D,如何以看起来像球体的方式绘制一个充满渐变的圆?

python - 同时合并点几何和其他列上的 GeoDataFrame

python -/usr/bin/env : python2. 6: No such file or directory 错误

未在 IDLE 中运行时,Python 脚本会导致 git publickey 错误

创建封闭区域多边形的算法

Java文档图像缩放和旋转

python - shapely 有信封类吗?

python - 如何使用 Shapely 在 Python 中添加两个多边形?

python - 如果构造函数参数无效,如何返回 None