ST_Distance — 二つのジオメトリ値またはジオグラフィ値間の距離を返します。
float ST_Distance(
geometry g1, geometry g2)
;
float ST_Distance(
geography geog1, geography geog2, boolean use_spheroid = true)
;
geometry型では、二つのジオメトリ間の2次元のデカルト (平面)距離の最小値を返します。単位は投影の単位 (空間参照系の単位)です。
geography型では、二つのジオグラフィ間の最小の測地距離を、メートル単位で返します。SRIDで決定される回転楕円体で計算します。use_spheroid
がFALSEの場合には、球面が計算に使われます。
このメソッドはOGC Simple Features Implementation Specification for SQL 1.1の実装です。
このメソッドはSQL/MM仕様の実装です。 SQL-MM 3: 5.1.23
このメソッドは曲線ストリングと曲線に対応しています。
Availability: 1.5.0 1.5でジオグラフィ対応が導入されました。大きいジオメトリや頂点の多いジオメトリについての速度が改善しました
Enhanced: 2.1.0 ジオグラフィでの速度が改善されました。詳細はMaking Geography fasterをご覧ください。
Enhanced: 2.1.0 - 曲線ジオメトリ対応が導入されました。
Enhanced: 2.2.0 - 精度とロバスト性の向上のためにGeographicLibを使って回転楕円体面上での計測を行うようにしています。この新機能を使うには、Proj 4.9.0以上が必要です。
Changed: 3.0.0 - SFCGALに依存しなくなりました。
ジオメトリの例 - 平面の単位で4326はWGS84経度緯度なので、単位は度。
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
ジオメトリの例 - メートル単位 (SIRD: 3857, 一般的なWebマップのピクセルに比例)。値は正しくありませんが、近傍の比較は正しくでき、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