Shapely中的多边形与多个点相交

9

我有一个Shapely多边形列表,想要找出哪些多边形相邻很容易,只需要使用.touches()方法。然而,我需要的是仅当多边形共享多于一个点时返回True(换句话说,共享一条边界)。让我举个例子:

In [1]: from shapely.geometry import Polygon
In [2]: polygons = [Polygon([(0,0),(0,1),(1,1),(1,0)]), Polygon([(1,0),(1,1),(2,1),(2,0)]), Polygon([(2,1),(2,2),(3,2),(3,1)])]

In [3]: polygons[0].touches(polygons[1])
Out[3]: True

In [4]: polygons[0].touches(polygons[2])
Out[4]: False

In [5]: polygons[1].touches(polygons[2])
Out[5]: True

在这种情况下,多边形0和1共享两个点(整个边界)。多边形1和2只共享一个点。我需要的是一个函数,在上面的例子中给我TrueFalseFalse或者只返回接触点的数量,然后我可以自己完成剩下的逻辑。
当然,任何不需要手动迭代所有点的解决方案都是最优的 - 如果我需要那样做,那么使用Shapely的目的就被打败了 :-)

1
分享两个点并不等同于分享一个边界 - 只有当这些点在两个多边形上都相邻时才是真的。 - andrew cooke
@andrew cooke:好观点。我得考虑一下。 - XerXes
2个回答

13

如果您真的想检查两个多边形是否共享超过x个点,您可以简单地执行以下操作:

p0,p1,p2 = polygons
x = 2
len(set(p1.boundary.coords).intersection(p2.boundary.coords))>=x

但我认为你可能想要确定两个边缘是否共线(并且重叠)。

Andrew的建议的这个实现可能是你要找的:

>>> type(p0.intersection(p1)) is geometry.LineString
True
>>> type(p1.intersection(p2)) is geometry.LineString
False

谢谢 :-) 我从安德鲁的帖子中推断出了这一点,但是一直没有答案。不管怎样还是非常感谢你 :-) - XerXes
2
仅供记录(可能有助于其他人):它应该检查geometry.MultiLineString,而不是geometry.LineString。 - XerXes

7

我没有使用过Shapely,但是你可以尝试查看两个多边形的交集是否为一条直线。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接