2013-03-20 65 views
1

我正在使用geodjango和postgis(1.x), 聯合(聯合)多元多邊形列表的最佳方法是什麼?問題合併(聯盟)geodjango中的多個多邊形

在我承擔

是相當低效的即時循環槽這樣

combined = multipolygon 
for item in items: 
    combined = combined.union(item.geom) #geom is a multipolygon 

通常這個工作得很好,但我常常收到錯誤錯誤遇到檢查幾何從GEOS C函數「GEOSUnion_r」返回。

這裏是被扔在了錯誤的項目的地理JSON版本,如果它有助於

{ "type": "MultiPolygon", "coordinates": 
[ [ [ [ -80.077576, 26.572225 ], 
     [ -80.037729, 26.571180 ], 
     [ -80.080279, 26.273744 ], 
     [ -80.147464, 26.310066 ], 
     [ -80.152851, 26.455851 ], 
     [ -80.138560, 26.538013 ], 
     [ -80.077576, 26.572225 ] 
] ] ] 
} 

沒有任何人有anyideas?最終目標是找出所有位於n個多邊形列表中的位置(使用coordinate__within = combined_area)

此外,geodjango admin中的多邊形在地圖上顯示正常。

回答

0

您總是可以使用Union集合方法。這應該會更有效一些,因爲所有內容都是在數據庫級別上計算的,這意味着您不必循環使用Python中的內容。

combined_area = FooModel.objects.filter(...).aggregate(area=Union('geom'))['area'] 
final = BarModel.objects.filter(coordinates__within=combined_area) 
+0

我會稍微嘗試一下,謝謝你的提示。任何想法,爲什麼我會得到那個「錯誤遇到檢查幾何從GEOS C函數返回幾何」GEOSUnion_r「。當這樣做時,它的另一種方式? – kennethj 2013-03-20 23:53:44

+0

我唯一能想到的是,幾何列是空或空 – miki725 2013-03-21 01:10:15

+0

雖然更乾淨,該方法在遇到問題幾何時返回null 幾何不是空的,但試圖直接在postgres中運行查詢我得到 注意:TopologyException:找到LINESTRING之間的非節點交集...也似乎以影響幾何圖形的某些組合,並且在其相關的情況下POSTGIS =「1.5.3」GEOS =「3.3.8-CAPI-1.7.8」PROJ =「Rel。 4.7.1,2009年9月23日「LIBXML =」2.7.6「USE_STATS – kennethj 2013-03-21 01:34:22