2016-05-17 38 views
0

我想弄清楚如何創建一個查詢,要求多邊形內的點。 我的設置是PostgreSQL 9.5實例,安裝了PostGIS 2.2.2擴展。 理論上這可能不是很難,因爲它在PostGIS documentation中顯示,但我無法得到任何結果。使用PostgreSQL和PostGIS查詢空間相交(點 - 多邊形在列中)使用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; 

而且我已經把一些示例數據集的在上面上述表格。 目前爲止這麼好。

不是我試圖創建一個查詢,這應該要求所有的數據,其中所定義的交叉點存儲在我的表列中的幾何形狀的一個app_db - > message.circle: 至於我已經瞭解ST_Intersects需要兩個幾何參數,但是如何針對完整列執行查詢?

回答

2

需要注意的是,通常人們對search_path安裝postgispublic和/或具有安裝的模式,這樣你就不需要提供像app_db.ST_Intersects完整路徑。對於下面的例子,我假設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