2017-02-21 49 views
1

我想查找所有不比距離給定點的特定點距離更遠的點。與正常半徑搜索一樣,每個點只有半徑可變(每個條目使用點+半徑定義一個圓周)。PostGIS查找包含特定點的所有圓 - 如何定義索引

我的問題是如何爲這個問題定義一個索引(我現在使用的查詢如下),如果可以使用非GIS和GIS字段創建索引(如下面的Enable字段)。

目前,我有這個工作查詢它

SELECT "Locations"."Name", 
FROM public."Locations" 
WHERE 
    "Locations"."Enabled" = TRUE 
    AND ST_DWithin(
     "Locations"."MyCoord"::geography, 
     ST_SetSRID(ST_MakePoint(<Given Long>, <Given Lat>),4326)::geography, 
     "Locations"."Radius"); 

與表像下面

Id: uuid 
Name: text 
Enabled: boolean 
MyCoord: GEOGRAPHY(Point) 
Radius: double precision 

回答

1
Create index some_name_idx on public."Locations" using gist("MyCoord") 

但你有一個BUG - 有沒有這樣的功能ST_DWithin(幾何,地理位置,數字) - 如果以米爲單位的半徑使用兩種情況下的地理位置,則不需要轉換(同樣在索引中)


編輯:

別擔心 - 它會工作,我檢查...作爲一個證明,我有通過osm2pgsql索引創建的表planet_osm_point:

CREATE INDEX planet_osm_point_index 
    ON planet_osm_point 
    USING gist 
    (way); 

而且我運行查詢像您一樣的:

explain select * 
from planet_osm_point 
where st_dwithin(way,ST_geomfromtext('POINT(2219360.7 6457010.96)'),300) 

輸出爲here。 正如你看到的空間索引正在使用...

+0

這是一個複製和粘貼錯誤,都是地理。但是,如果在索引中根本沒有使用半徑,只要MyCoord(它是圍繞它的圓的中心)的索引如何加快搜索速度(AFAIK至少需要一個邊界框來加快搜索速度)。 – Fionn

+0

我在你的查詢中看到的細微差別是你有一個靜態距離來檢查,但在我的查詢中,距離以及一個座標位於查詢表中。所以你的查詢只有一個可變元素,而我有兩個。 – Fionn

+0

你檢查了嗎?這個元素也是我在索引創建後想到的一個變量......沒有區別。正如你所看到的,索引定義中沒有300 ... – Jendrusk

相關問題