2010-06-03 28 views
2

我正在開發一個GeoDjango應用程序,用戶可以上傳地圖文件並執行一些基本的繪圖操作,例如查詢多邊形內的要素。如何使用Python將GEOS MultiLineString轉換爲Polygon?

我認識到用戶偶爾會上傳「MultiLineString」而不是「Polygon」。這會導致查詢期望封閉的幾何圖形失敗。

在Python中將MultiLineString對象轉換爲Polygon的最佳方法是什麼?

謝謝。

- OMAT

回答

2

呵呵,一開始我寫了這個:

def close_geometry(self, geometry): 
    if geometry.empty or geometry[0].empty: 
     return geometry # empty 

    if(geometry[-1][-1] == geometry[0][0]): 
     return geometry # already closed 

    result = None 
    for linestring in geom: 
     if result is None: 
      resultstring = linestring.clone() 
     else: 
      resultstring.extend(linestring.coords) 

    geom = Polygon(resultstring) 

    return geom 

,但後來我發現,有一個叫一個漂亮的小方法convex_hull是自動完成的多邊形轉換爲你。

>>> s1 = LineString((0, 0), (1, 1), (1, 2), (0, 1)) 
>>> s1.convex_hull 
<Polygon object at ...> 
>>> s1.convex_hull.coords 
(((0.0, 0.0), (0.0, 1.0), (1.0, 2.0), (1.0, 1.0), (0.0, 0.0)),) 

>>> m1=MultiLineString(s1) 
>>> m1.convex_hull 
<Polygon object at...> 
>>> m1.convex_hull.coords 
(((0.0, 0.0), (0.0, 1.0), (1.0, 2.0), (1.0, 1.0), (0.0, 0.0)),) 
+0

這樣一個不知名的方法,節省了一天。謝謝。 如果MultiLineString具有多於1個LineString,則convex_hull將返回1包含它們的所有多邊形。如果你想讓每個LineString作爲一個單獨的Polygon,你仍然必須在MultiLineString中循環並將convex_hull應用到每個LineString。 – omat 2010-06-04 16:00:10

+0

誠然,你從未提到過你想爲每一行分開一個多邊形。 :-) – drozzy 2010-06-04 19:27:27

+8

多行的凸包可能不是您所需要的。凸包定義了包含形狀的最小多邊形,並且可能不如您所需要的那麼精確,因爲它不包括形狀邊界上「內部」的任何點。也就是說,如果你有一個從中取出塊的形狀,你可能看不到它的邊界有塊。 – ianmjones 2010-06-17 09:04:58