19

OpenLayers、GeoServer などと一緒に、GIS 拡張機能を備えた PostgreSQL を使用してマップ データを保存しています。近隣などのポリゴンを指定すると、いくつかのテーブル (信号機、レストランなど) に保存されているすべての LAT/LONG ポイントを見つける必要があります。ポリゴン内にあります。あるいは、ポリゴンのセットが与えられた場合、各ポリゴン内のポイントのセットを見つけたいと思います(各ポリゴンを反復するのではなく、GROUP BY クエリのように)。

これらの関数はプログラムする必要がありますか、それとも機能は (拡張 SQL として) 利用できますか? 詳しく教えてください。

また、私が持っている単純な 2D データの場合、実際には GIS 拡張 (GPL ライセンスが制限です) が必要ですか、それとも PostgreSQL で十分でしょうか?

ありがとう!

4

3 に答える 3

13

PostGIS では、境界ボックス演算子を使用して候補を見つけることができます。これは、GiST インデックスを使用するため非常に効率的です。次に、厳密な一致が必要な場合は、contains 演算子を使用します。

何かのようなもの

SELECT 
     points,neighborhood_name from points_table,neighborhood 
WHERE 
     neighborhood_poly && points /* Uses GiST index with the polygon's bounding box */
AND 
    ST_Contains(neighborhood_poly,points); /* Uses exact matching */

これが必要かどうかについては、要件によって異なります。上記が機能するには、PostGIS と GEOS がインストールされている必要があります。しかし、バウンディング ボックスの一致で十分な場合は、PostGIS を必要としない SQL で簡単にコーディングできます。

完全一致が必要な場合は、含むアルゴリズムが公開されていますが、それらを効率的に実装するには、SQL から呼び出されるライブラリに実装するための努力が必要です (GEOS と同様)。

于 2009-12-09T11:12:49.063 に答える
4

ST_Containsは、次のように、GiSTインデックス付きバウンディングボックスを使用するようにクエリを自動的に書き換えると思います。

「この関数呼び出しには、ジオメトリで使用可能なすべてのインデックスを利用するバウンディングボックスの比較が自動的に含まれます。インデックスの使用を回避するには、関数_ST_Containsを使用してください。」

http://postgis.refractions.net/docs/ST_Contains.html

于 2010-06-02T23:24:45.680 に答える