名稱

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