使用Shapely多边形在多个点接触
我在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只共享了一个点。我想要的是一个函数,能在上面的例子中返回True
、False
、False
,或者是返回接触点的数量,这样我就可以自己处理后面的逻辑。
当然,任何不需要手动遍历所有点的解决方案都是最优的——如果我需要这样做,那就有点违背使用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这个库,不过你有没有试过看看这两个多边形的交集是不是一条线呢?