使用Shapely多边形在多个点接触

9 投票
2 回答
6912 浏览
提问于 2025-04-15 17:21

我在Python中有一组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的初衷了 :-)

2 个回答

13

如果你真的想检查两个多边形是否共享超过x个点,你可以简单地这样做:

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

不过我觉得你可能想要的是判断两条边是否共线(并且重叠)。

根据安德鲁的建议,这个实现可能正是你需要的:

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

我没有用过shapely这个库,不过你有没有试过看看这两个多边形的交集是不是一条线呢?

撰写回答