如果某個空間物件位於另外一個物件的指定距離的半徑範圍內,PostGIS 方法 ST_DWithin()
會回傳 true
。 例如我們昨天設定 geog_point
欄位是 geography
空間資料類型,它必須以 公尺為單位。如果你使用 geometry
類型,就要改用SRID 座標系統指定的單位。
SELECT subid, kind, bodytype, colour, age,
FROM adoption_gov_animals
WHERE ST_DWithin(geog_point,
ST_GeogFromText('POINT(120.9 22.5)')),
1000)
ORDER BY subid;
這個計算出來是否在半徑範圍中,是以直線距離去運算,不是道路上的距離。要特別注意這一點。
如果想要計算道路駕駛距離,可以參考 pgRouting
這個擴充元件。
以上SQL 語法會列出流水編號、總類(貓、狗...)、體型、顏色、年紀,並篩選在這個座標(120.9 22.5)距離一公里內的所有認養動物資料。
ST_Distance()
方法會算出兩點之間的距離,我們先來隨意計算兩個點。
要找哪兩個點未來測試呢?!
在好幾年前,有單車環島過,對於東半部的 多良車站,以及太麻里車站,印象很深刻。來計算一下這兩點的距離吧!
SELECT ST_Distance(
ST_GeogFromText('POINT(120.959186 22.507383)'),
ST_GeogFromText('POINT(121.004909 22.619066)')
)/1000;
-- "13.23142074176"
使用 ST_Distance()
方法裡面帶入2個點位,計算這兩個點位,最後除以 1000 把算出來的公尺轉換為公里,結果為 13.23142074176 公里,表示兩點直線距離 13.23142074176 公里。
以下是Google Map 手動拉出來的距離位置,驗證一下!
應該沒有錯! YES~~~~~
第二個方法 ST_Distance()
可以計算距離,就可以利用計算出來的距離做篩選,附近10公里內的其他點位,並由近距離到遠距離排序!這樣查詢就可以做到找尋附近景點的功能~
SELECT subid,
kind,
bodytype,
colour,
age,
round(
(ST_Distance(geog_point,
ST_GeogFromText('POINT(120.959186 22.507383)')
) / 15000)::numeric(8,5), 2
) AS km_from_station
FROM adoption_gov_animals
WHERE ST_DWithin(geog_point,
ST_GeogFromText('POINT(120.959186 22.507383)'),
15000)
ORDER BY km_from_station ASC;
如上就可以列出來,距離太麻里車站附近15公里內的所有送養動物,並且由近到遠排列。
其他postgis 方法 可以參考官方文件:https://postgis.net/docs/PostGIS_Special_Functions_Index.html