iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 23
0
AI & Data

後端前進PostgreSQL系列 第 23

PostGIS 分析空間資料 (5) - 資料空間的查詢 尋找你的鄰居

ST_DWithin()

如果某個空間物件位於另外一個物件的指定距離的半徑範圍內,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() 算出距離

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


上一篇
PostGIS 分析空間資料 (4) - 建立欄位、GiST索引
下一篇
PostgreSQL View
系列文
後端前進PostgreSQL30

尚未有邦友留言

立即登入留言