ST_Distance — 傳回兩個幾何或地理值之間的距離。
float ST_Distance(
geometry g1, geometry g2)
;
float ST_Distance(
geography geog1, geography geog2, boolean use_spheroid = true)
;
對於geometry類型,傳回兩個幾何物件之間最小的 2D 卡氏(平面)距離,單位為投影單位(空間參考單位)。
對於geography類型,預設傳回兩個地理物件之間以公尺為單位的最小測地線距離,計算基於 SRID 所決定的橢球體。如果 use_spheroid
為 false,則使用較快的球面計算。
這個方法實作了 OGC 簡單功能 SQL 1.1 實作規範。
這個方法實作了 SQL/MM 規範。SQL-MM 3: 5.1.23
這個方法支援圓弧字串和曲線。
可用性:1.5.0 版本引入了地理支援。平面速度的改進,可更好地處理大型或多頂點幾何圖形
增強功能:2.1.0 版本提高了地理的處理速度。詳情請參閱讓地理處理速度更快。
增強功能:2.1.0 - 引入了對彎曲幾何圖形的支持。
增強功能:2.2.0 - 在橢球體上的量測使用 GeographicLib 執行,以提高準確性和穩健性。需要 PROJ >= 4.9.0 才能利用新功能。
變更:3.0.0 - 不再依賴 SFCGAL。
幾何範例 - 單位為平面度數,4326 是 WGS 84 經緯度,單位為度。
SELECT ST_Distance( 'SRID=4326;POINT(-72.1235 42.3521)'::geometry, 'SRID=4326;LINESTRING(-72.1260 42.45, -72.123 42.1546)'::geometry ); ----------------- 0.00150567726382282
幾何範例 - 單位為公尺(SRID:3857,與熱門網路地圖上的像素成比例)。儘管值不準確,但可以正確比較附近的單位,這使其成為 KNN 或 KMeans 等演算法的理想選擇。
SELECT ST_Distance( ST_Transform('SRID=4326;POINT(-72.1235 42.3521)'::geometry, 3857), ST_Transform('SRID=4326;LINESTRING(-72.1260 42.45, -72.123 42.1546)'::geometry, 3857) ); ----------------- 167.441410065196
幾何範例 - 單位為公尺(SRID:3857 如上,但透過 cos(lat) 校正以解決失真問題)
SELECT ST_Distance( ST_Transform('SRID=4326;POINT(-72.1235 42.3521)'::geometry, 3857), ST_Transform('SRID=4326;LINESTRING(-72.1260 42.45, -72.123 42.1546)'::geometry, 3857) ) * cosd(42.3521); ----------------- 123.742351254151
幾何範例 - 單位為公尺(SRID:26986 馬薩諸塞州州平面公尺)(對馬薩諸塞州最準確)
SELECT ST_Distance( ST_Transform('SRID=4326;POINT(-72.1235 42.3521)'::geometry, 26986), ST_Transform('SRID=4326;LINESTRING(-72.1260 42.45, -72.123 42.1546)'::geometry, 26986) ); ----------------- 123.797937878454
幾何範例 - 單位為公尺(SRID:2163 美國國家圖集等面積)(最不準確)
SELECT ST_Distance( ST_Transform('SRID=4326;POINT(-72.1235 42.3521)'::geometry, 2163), ST_Transform('SRID=4326;LINESTRING(-72.1260 42.45, -72.123 42.1546)'::geometry, 2163) ); ------------------ 126.664256056812
與幾何範例相同,但請注意單位為公尺 - 使用球面進行較快且較不準確的計算。
SELECT ST_Distance(gg1, gg2) As spheroid_dist, ST_Distance(gg1, gg2, false) As sphere_dist FROM (SELECT 'SRID=4326;POINT(-72.1235 42.3521)'::geography as gg1, 'SRID=4326;LINESTRING(-72.1260 42.45, -72.123 42.1546)'::geography as gg2 ) As foo ; spheroid_dist | sphere_dist ------------------+------------------ 123.802076746848 | 123.475736916397