緯度/経度のポイント間の距離


10

2つの緯度/経度のポイント間の距離を計算しようとしています。私はこの投稿から引っ張ったコードのほとんどが機能しますが、それがどのように機能するのか本当にわかりません。

これがコードです:

<?php
// POINT 1
$thisLat = deg2rad(44.638);
$thisLong = deg2rad(-63.587);

// POINT 2
$otherLat = deg2rad(44.644);
$otherLong = deg2rad(-63.911);

$MeanRadius = 6378 - 21 * sin($lat1);

$xa = (Cos($thisLat)) * (Cos($thisLong));
$ya = (Cos($thisLat)) * (Sin($thisLong));
$za = (Sin($thisLat));

$xb = (Cos($otherLat)) * (Cos($otherLong));
$yb = (Cos($otherLat)) * (Sin($otherLong));
$zb = (Sin($otherLat));

$distance = $MeanRadius * Acos($xa * $xb + $ya * $yb + $za * $zb);

echo $distance;
?>

いくつか質問があります。

  1. xa、ya、zaとは何ですか?それらは3Dデカルト平面上の点であることを理解していますが、それらはどこに相対的ですか?地球の中心?
  2. cos($xa * $xb + $ya * $yb + $za * $zb)ポイント間の距離はどのように計算されますか?私は2Dでこれを行うことを知っています:

代替テキスト

Pythagorean Theorem 
distance^2 = b^2 + a^2
distance = sqr((y2-y1)^2 + (x2 - x1)^2)
  1. これはどの程度正確ですか?それについては別のページで議論がありました。ただし、距離を使用して、ユーザーが10m、20m、50mなどの範囲内にいるかどうかを確認したいと思います。これを正確に行うことはできますか?
  2. 何に使うべき$MeanRadiusですか?それは妥当な値ですか?その値は地球が楕円であることを前提としていると思います。

回答:


17

これは、誤った結果をもたらす可能性があるため、または短距離で完全に失敗する可能性があるため、汎用目的のひどいコードです。代わりにHaversine Formulaを使用してください。

(コードの基となる数式は、球体上の 2つの点(楕円ではない)を、ユニット上の3Dデカルト座標(xa、ya、za)と(xb、yb、zb)に変換します球とそれらの内積を形成し、それらの間の角度の余弦に等しくなります。ACos関数はその角度を返します。地球の半径でスケーリングすると、距離が推定されます。問題は、ラジアン単位のサイズ「e」の小さな角度のコサインが、e ^ 2/2に近い量で1と異なることです。これは、eが浮動小数点精度の2倍の平方根よりも小さい場合、浮動小数点エラークラウドに表示されなくなります。単精度で計算している場合、eの値が0.001未満(約1キロメートル)であると、ゼロと混同されます。倍精度では、カットオフは約e = 10 ^ -8ですが、e = 10 ^ -4程度(約10メートル)になると、心配する必要があるほど多くの精度を失う可能性があります。、いくつかの高精度の内部計算が組み込まれています))。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.