2009-12-25 93 views
5

我有一个Python形状多边形的列表。使用.touches()方法来找出哪个多边形触摸很容易。然而,只有当多边形共享多于一个点(换句话说共享边界)时,我才需要返回true的东西。让我说明一下:多边形触及多个点,形状很好

IPython 0.10 -- An enhanced Interactive Python. 

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或者返回触点的数量,然后我可以自己完成其余的逻辑。

和当然,这并不涉及手动通过所有点迭代任何解决方案是最优的 - 如果我需要做的是,它有点儿违背了事先用匀称:-)

感谢的宗旨!

+1

共享两个点不等同于共享边界 - 如果点在两个相邻的多边形它只是真实的。 – 2009-12-25 11:18:10

+0

@andrew cooke:好点。我必须考虑这一点。 – XerXes 2009-12-26 18:52:21

回答

4

我没有使用匀称,但你有没有尝试看看,如果这两个多边形的交集是一条线?

+0

一条线或一个多边形。 – 2009-12-25 14:56:14

+0

这正是我所需要的。愚蠢我没有想到:-) – XerXes 2009-12-26 18:53:24

3

如果你真的想检查两个多边形共享比你更可以简单地做这点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 
+0

谢谢:-)我已经从安德鲁的帖子中扣除,但无法回答。但是,无论如何感谢一堆:-) – XerXes 2009-12-26 18:55:02

+2

只是为了记录(它可能会帮助别人):它应该检查geometry.MultiLineString,而不是geometry.LineString – XerXes 2009-12-31 12:30:51