2009-12-25 40 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