<@>
とearth_distance
を使用して別の値を表示する
with points as (
select
'(1,1)'::point as p1
,'(2,2)'::point as p2
)
select
((p1 <@> p2) * 1609.34::double precision) as d1
,(earth_distance(ll_to_earth(p1[1], p1[0]), ll_to_earth(p2[1], p2[0]))) as d2
from points
結果は次のとおりです。
157224.717583288 157402.326073052
ほぼ200メートルの違い-なぜですか?
彼らは異なることをします
earth_distance
地球表面の2点間の大圏距離を返します。<@>
地球表面の2点間の距離を法定マイル単位で示します。したがって、これは2つの平均値の差です(どちらも正しくないと仮定した場合)。
SELECT ((d2-d1) / ((d2+d1)/2)) * 100 AS distance_diff FROM results;
distance_diff
-------------------
0.112652419817465
(1 row)
これは0.11%です。 ウィキペディアの大圏距離
地球はほぼ球形(地球の半径を参照)であるため、大円距離の式は地球の表面上の点間の距離を(カラスが飛ぶように)与える.5%以内に修正程度。
どちらがより正確ですか? <@>
、明らかに。しかし、ドキュメントが言うように、私たちはより良いことができます、
このモジュールでは、地球は完全に球形であると想定されています。 (それが不正確である場合は、PostGISプロジェクトを確認することをお勧めします。)
SELECT ST_Distance(
ST_MakePoint(1,1)::geography,
ST_MakePoint(2,2)::geography
);
st_distance
-----------------
156876.14940189
(1 row)
ただし、コーディネーターがSRID 4326の場合、最も正確な距離は156876.14940189
。