Enlem / boylam noktaları arasındaki mesafe


10

İki enlem / boylam noktası arasındaki mesafeyi hesaplamaya çalışıyorum. Çoğunlukla ben den çekti çalıştığını kod parçası var bu yazı ama nasıl çalıştığını gerçekten anlamıyorum.

İşte kod:

<?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;
?>

Birkaç sorum var:

  1. xa, ya, za nedir? 3D kartezyen bir düzlemde noktalar olduklarını anlıyorum ama neye göre? Dünyanın merkezi mi?
  2. Bu cos($xa * $xb + $ya * $yb + $za * $zb)noktalar arasındaki mesafeyi nasıl hesaplar? 2D'de bunu yapacağımı biliyorum:

alternatif metin

Pythagorean Theorem 
distance^2 = b^2 + a^2
distance = sqr((y2-y1)^2 + (x2 - x1)^2)
  1. Bu ne kadar doğru olacak? Diğer sayfada bunun hakkında bir tartışma vardı. Ancak, özellikle kullanıcıların 10m, 20m veya 50m gibi bir şey içinde olup olmadığını söylemek için mesafeyi kullanmak istiyorum. Bunu iyi bir doğrulukla yapabilir miyim?
  2. Ne için kullanmalıyım $MeanRadius? Bu makul bir değer mi? Bence bu değer dünyanın bir elipse olduğunu varsayar.

Yanıtlar:


17

Bu, genel amaçlı kullanım için korkunç bir koddur, çünkü hatalı sonuçlar verebilir veya hatta kısa mesafeler için tamamen başarısız olabilir. Kullanım Haversine Formül yerine.

(Kodunuzun dayandığı formül, küredeki iki noktayı (elips değil) birimdeki 3D Kartezyen koordinatlarına (xa, ya, za) ve (xb, yb, zb) dönüştürürküre ve nokta ürünlerini oluşturur, bu da aralarındaki açının kosinüsüne eşit olur. ACos işlevi, dünya yarıçapı ile ölçeklendiğinde mesafeyi tahmin edecek olan açıyı döndürür. Sorun, radyan cinsinden 'e' boyutu gibi küçük bir açının kosinüsünün 1'den e ^ 2 / 2'ye yakın bir miktarda farklılık göstermesidir. Bu, e, kayan nokta hassasiyetinin iki katı kare kökünden daha küçük olduğunda kayan nokta hata bulutunda kaybolur. Eğer tek bir hassasiyetle hesaplıyorsanız, bu, 0.001'den küçük e değerlerinin (yaklaşık bir kilometre) sıfırla karıştırılacağı anlamına gelir! Çift hassasiyette kesim e = 10 ^ -8 civarındadır, ancak e = 10 ^ -4 ya da öylesine (yaklaşık 10 metre) kadar endişelenmeniz gereken çok hassaslığı kaybedebilirsiniz,, dahili bazı yüksek hassasiyetli hesaplamaları vardır)).


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.