2016-05-17 2 views
0

多角形内の点を求めるクエリを作成する方法を理解しようとしています。 私の設定はPostGIS 2.2.2拡張がインストールされたpostgreSQL 9.5インスタンスです。 理論的には、PostGIS documentationに示されているように、これは実際には難しくないかもしれませんが、結果は得られません。postgreSQLとPostGISを使用した空間的な交差点(列内のポイントポリゴン)のクエリ

私は、次の表を作成しました:

CREATE TABLE app_db.testTable 
(
    message_text text, 
    message_picture text, 
    message_date timestamp with time zone DEFAULT now(), 
    message_id uuid NOT NULL DEFAULT uuid_generate_v4(), 
    message_position app_db.geometry, 
    message_radius integer, 
    message_circle app_db.geometry, 
    message_userid uuid, 
    CONSTRAINT messages_pkey PRIMARY KEY (message_id) 
) 

私は自分のスキーマのために、次のコマンドでのPostGISを有効にしている:

CREATE EXTENSION postgis SCHEMA app_db; 

をそして、私は上記の中でいくつかの例のデータセットを入れています上記の表。 これまでのところとても良いです。私の知る限り「として :> message.circle -

は私が定義された点は、私のテーブルの列に格納されたジオメトリの1 app_dbと交差する全てのデータ、を求める必要があるクエリを作成しようとしていませんST_Intersectsには2つのジオメトリがパラメータとして必要ですが、完全な列に関して問合せを実行するにはどうすればよいですか?通常、人々はあなたがapp_db.ST_Intersectsのような完全なパスを提供する必要はありませんpublicpostgisをインストールおよび/またはsearch_pathにインストールされたスキーマを持って

答えて

2

注意。以下の例では、簡略化するためにSET search_path TO app_db;と仮定しています。​​における単一のポリゴンからmessage_position内のすべてのポイントを選択するには

SELECT p.* 
FROM testTable p 
JOIN testTable c ON c.message_id='the id of the circle' 
    AND p.message_id <> c.message_id 
    AND ST_Intersects(p.message_position, c.message_circle); 

私は​​が行われたかどうかはわかりませんが、それはmessage_positionmessage_radiusから作成された場合、その後、より良い方法がありますより高価で不完全なジオメトリ解析ではなく、距離閾値を使用するST_DWithinを使用します。

SELECT p.* 
FROM testTable p 
JOIN testTable c ON c.message_id='the id of the circle' 
    AND p.message_id <> c.message_id 
    AND ST_DWithin(p.message_position, c.message_position, c.message_radius); 

message_positionにGiST空間インデックスを作成すると、スピードアップできます。

+0

ありがとうございます!これはまさに私が探していたものです!特にパフォーマンスに関するヒントは非常に役に立ちます:) – schlomm

関連する問題