8

我有一个 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 的目的:-)

4

2 回答 2

10

如果你真的想检查两个多边形是否共享超过 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
于 2009-12-25T22:59:14.463 回答
6

我没有用过匀称,但你有没有试过看看两个多边形的交点是否是一条线?

于 2009-12-25T11:21:54.917 回答