2

私は geodjango と postgis (1.x) を使用しています。マルチポリゴンのリストを結合 (結合) する最良の方法は何ですか?

私が想定しているのはかなり非効率的で、私はこのようにトラフをループしています

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

通常はこれで問題なく動作しますが、「GEOS C 関数 "GEOSUnion_r" から返されたジオメトリをチェック中にエラーが発生しました」というエラーが頻繁に発生します。

これは、エラーがスローされたアイテムの geo 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 ] 
] ] ] 
}

誰かアイデアはありますか?最終的な目標は、この n ポリゴンのリスト内にあるすべての場所 (別のテーブル) を見つけることです (coordinates__within=combined_area を使用)

また、geodjango admin のマップでは、ポリゴンが正常に表示されます。

4

1 に答える 1

4

ユニオン集計方式はいつでも使用できます。すべてがデータベースレベルで計算されるため、Pythonでループする必要がないため、これはもう少し効率的です。

combined_area = FooModel.objects.filter(...).aggregate(area=Union('geom'))['area']
final = BarModel.objects.filter(coordinates__within=combined_area)
于 2013-03-20T16:13:25.397 に答える