2009-12-09 19 views
15

OpenLayers、GeoServerなどとともに地図データを保存するために、GIS拡張機能を備えたPostgreSQLを使用しています。あるポリゴン内にあるテーブル(信号灯、レストランなど)に格納されているすべてのLAT/LONGポイントを見つける必要があります。あるいは、ポリゴンのセットを指定すると、各ポリゴン内のポイントのセットを見つけることができます(GROUP BYクエリのように、各ポリゴンを反復するのではなく)。PostGISでは、ポリゴン内のすべての点を見つけるにはどうすればよいですか?

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

また、私は実際にGISエクステンション(GPLライセンスは制限事項)が必要ですか、PostgreSQLで十分ですか?

ありがとうございます!

答えて

11

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で単純にコーディングすることができます。

完全に一致する必要がある場合、containsアルゴリズムは一般に公開されていますが、効率的に実装するには、ライブラリからSQLに呼び出される(GEOSのように)ライブラリで実装する必要があります。

+1

[ST_DWithin](http://www.postgis.org/docs/ST_DWithin.html)も参照してください。 –

4

私はST_Containsは自動的にノートとして、GiSTの-インデックス付きのバウンディングボックスを使用するようにクエリを書き換え信じる:

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

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

+0

これは答えよりもコメントです。 – RickyA

+0

それはSO FAQに従って答えです。 – IamIC

2

ST_Containsはあなたの問題を解決するだろう。

SELECT 
polygon.gid, points.x, points.y 
FROM 
    polygons LEFT JOIN points 
ON st_contains(polygon.geom, points.geom) 
WHERE 
    polygon.gid=your_id 
関連する問題