Python 应接触don';T

Python 应接触don';T,python,geometry,shapely,Python,Geometry,Shapely,下面是一些创建三个方形多边形的形状良好的代码,p1、p2和p3p2紧靠p1的右侧,而p3紧靠下方 问题是,Shapely告诉我不要触摸p1和p2,而p1和p3可以。我看不出这里出了什么问题 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]

下面是一些创建三个方形多边形的形状良好的代码,
p1
p2
p3
<代码>p2紧靠
p1
的右侧,而
p3
紧靠下方

问题是,Shapely告诉我不要触摸
p1
p2
,而
p1
p3
可以。我看不出这里出了什么问题

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))
运行此命令将生成以下输出:

-118.69999999999999
-118.7
False
34.9
34.9
True
多边形(-118.934.9,-118.935.1,-118.735.1,-118.734.9,-118.934.9))
多边形(-118.734.9,-118.735.1,-118.535.1,-118.534.9,-118.734.9))
多边形(-118.934.7,-118.934.9,-118.734.9,-118.734.7,-118.934.7,-118.934.7))
假假假假真假
假真假假假真
这表明Shapely认为
p1
p2
不相交或接触,而
p1
p3
相交和接触

编辑:正如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)

计算机只能表示大多数浮点数的近似值,因此不能期望从它们计算的值的比较是精确的。您可以通过使用整数坐标来解决此限制。请参阅相关内容,谢谢-您的观点被采纳了!但是,我并没有在我的代码中进行任何比较,我要求Shapely库根据给定的精确坐标,进行所需的任何数学运算,以确定多边形是否接触等。它是否应该注意处理自己计算的精度?编辑:也许我没有像我想的那样给出精确的坐标,如Paille在下面所示。是的,我理解……我觉得这好像是因为Shapely的
touchs()
-这是一个Comp Sci 101类错误(还有你提到的“精确坐标”)让我怀疑你可能仍然不明白计算机上也没有这样的东西。)这回答了你的问题吗?