web-dev-qa-db-ja.com

earthdistance <@>演算子がearth_distance関数とは異なる値を返すのはなぜですか?

<@>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メートルの違い-なぜですか?

3
user606521

彼らは異なることをします

  • 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

4
Evan Carroll