Jarak antara titik lat / panjang

10

Saya mencoba menghitung jarak antara dua titik lintang / bujur. Saya memiliki sepotong kode yang sebagian besar berfungsi yang saya tarik dari pos ini tetapi saya tidak begitu mengerti cara kerjanya.

Ini kodenya:

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

Saya punya beberapa pertanyaan:

  1. apa itu xa, ya, za? Saya mengerti bahwa itu adalah poin pada pesawat cartesian 3D tetapi di mana mereka relatif? Pusat bumi?
  2. Bagaimana cara cos($xa * $xb + $ya * $yb + $za * $zb)menghitung jarak antara titik-titik? Saya tahu bahwa dalam 2D ​​saya akan melakukan ini:

teks alternatif

Pythagorean Theorem 
distance^2 = b^2 + a^2
distance = sqr((y2-y1)^2 + (x2 - x1)^2)
  1. Seberapa akurat hal ini? Ada beberapa diskusi tentang itu di halaman lain. Tapi saya secara khusus ingin menggunakan jarak untuk mengetahui apakah pengguna berada dalam jarak 10m, 20m, atau 50m. Apakah saya dapat melakukan ini dengan akurasi yang baik?
  2. Apa yang harus saya gunakan $MeanRadius? Apakah itu nilai yang masuk akal? Saya pikir nilai itu mengasumsikan bahwa bumi adalah elipse.
sixtyfootersdude
sumber

Jawaban:

17

Ini adalah kode yang mengerikan untuk penggunaan umum karena dapat memberikan hasil yang salah atau bahkan gagal sama sekali untuk jarak pendek. Gunakan Formula Haversine sebagai gantinya.

(Rumus yang menjadi dasar kode Anda mengubah dua titik di bola (bukan elips) ke dalam koordinat 3D Kartesius mereka (xa, ya, za) dan (xb, yb, zb) pada unitsphere dan bentuk produk titik mereka, yang akan sama dengan kosinus sudut di antara mereka. Fungsi ACos mengembalikan sudut itu, yang ketika diskalakan oleh jari-jari bumi akan memperkirakan jarak. Masalahnya adalah bahwa kosinus dari sudut kecil, katakanlah ukuran 'e' dalam radian, berbeda dari 1 dengan jumlah yang mendekati e ^ 2/2. Ini menghilang ke awan kesalahan titik mengambang ketika e lebih kecil dari akar kuadrat dari dua kali lipat nilai titik mengambang. Jika Anda menghitung dalam presisi tunggal, ini berarti nilai e kurang dari 0,001 - sekitar satu kilometer - akan dikacaukan dengan nol! Dalam presisi ganda cutoffnya sekitar e = 10 ^ -8, tetapi pada saat e = 10 ^ -4 atau lebih (sekitar 10 meter) Anda berpotensi kehilangan begitu banyak presisi sehingga Anda perlu khawatir,, memiliki beberapa perhitungan internal berpresisi tinggi bawaan)).

whuber
sumber
7

Lihatlah situs ini, http://www.movable-type.co.uk/scripts/latlong.html

Jika Anda menerapkannya dan Anda mendapatkan jawaban yang salah, Anda mungkin memiliki unit yang salah. Saya pikir untuk situs itu sebagian besar operasi dilakukan dalam radian, bukan derajat desimal.

patrick
sumber