Hai Saya punya kebutuhan untuk menghitung jarak antara dua titik memiliki lat dan panjang.
Saya ingin menghindari panggilan ke API eksternal.
Saya mencoba menerapkan Formula Haversine di PHP:
Ini kodenya:
class CoordDistance
{
public $lat_a = 0;
public $lon_a = 0;
public $lat_b = 0;
public $lon_b = 0;
public $measure_unit = 'kilometers';
public $measure_state = false;
public $measure = 0;
public $error = '';
public function DistAB()
{
$delta_lat = $this->lat_b - $this->lat_a ;
$delta_lon = $this->lon_b - $this->lon_a ;
$earth_radius = 6372.795477598;
$alpha = $delta_lat/2;
$beta = $delta_lon/2;
$a = sin(deg2rad($alpha)) * sin(deg2rad($alpha)) + cos(deg2rad($this->lat_a)) * cos(deg2rad($this->lat_b)) * sin(deg2rad($beta)) * sin(deg2rad($beta)) ;
$c = asin(min(1, sqrt($a)));
$distance = 2*$earth_radius * $c;
$distance = round($distance, 4);
$this->measure = $distance;
}
}
Mengujinya dengan beberapa titik tertentu yang memiliki jarak publik saya tidak mendapatkan hasil yang dapat diandalkan.
Saya tidak mengerti apakah ada kesalahan dalam rumus asli atau dalam implementasi saya
php
coordinates
geocoding
haversine
maxdangelo
sumber
sumber
Jawaban:
Belum lama ini saya menulis contoh formula haversine, dan menerbitkannya di situs web saya:
➽ Perhatikan bahwa Anda mendapatkan jarak kembali di unit yang sama saat Anda melewati parameter
$earthRadius
. Nilai standarnya adalah 6371000 meter sehingga hasilnya akan berada di [m] juga. Untuk mendapatkan hasil dalam mil, misalnya Anda bisa melewati 3959 mil sebagai$earthRadius
dan hasilnya akan di [mi]. Menurut pendapat saya itu adalah kebiasaan yang baik untuk tetap dengan unit SI, jika tidak ada alasan khusus untuk melakukan sebaliknya.Edit:
Sebagai TreyA benar menunjukkan, formula Haversine memiliki kelemahan dengan poin antipodal karena kesalahan pembulatan (meskipun adalah stabil untuk jarak kecil). Untuk menyiasatinya, Anda bisa menggunakan rumus Vincenty sebagai gantinya.
sumber
Saya menemukan kode ini yang memberi saya hasil yang dapat diandalkan.
hasil:
sumber
Itu hanya tambahan jawaban @martinstoeckli dan @Janith Chinthana . Bagi mereka yang ingin tahu tentang algoritma mana yang tercepat saya menulis tes kinerja . Hasil kinerja terbaik menunjukkan fungsi yang dioptimalkan dari codexworld.com :
Ini adalah hasil tes:
sumber
1.1515 * 1.609344 = 1.853
. Terima kasih, diperbaiki ke 1.853.Di sini kode sederhana dan sempurna untuk menghitung jarak antara dua garis lintang dan garis bujur. Kode berikut telah ditemukan dari sini - http://www.codexworld.com/distance-between-two-addresses-google-maps-api-php/
sumber
Untuk mereka yang suka lebih pendek dan lebih cepat (tidak memanggil deg2rad ()).
sumber
Coba ini memberikan hasil yang luar biasa
sumber
Pertanyaan yang cukup lama, tetapi bagi mereka yang tertarik dengan kode PHP yang mengembalikan hasil yang sama seperti Google Maps, berikut ini pekerjaannya:
Saya sudah menguji dengan berbagai koordinat dan berfungsi dengan baik.
Saya pikir itu harus lebih cepat daripada beberapa alternatif juga. Tetapi tidak diuji itu.
Petunjuk: Google Maps menggunakan 6378137 sebagai radius Bumi. Jadi menggunakannya dengan algoritma lain mungkin bekerja juga.
sumber
Untuk nilai yang tepat, lakukan seperti itu:
Hmm saya pikir itu harus dilakukan ...
Edit:
Untuk formulars dan setidaknya implementasi JS, cobalah: http://www.movable-type.co.uk/scripts/latlong.html
Berani saya ... Saya lupa deg2rad semua nilai dalam fungsi lingkaran ...
sumber
Halo di sini Kode Untuk Dapatkan Jarak dan Waktu Menggunakan Dua Lat dan Panjang Yang Berbeda
Anda dapat memeriksa Contoh Di Bawah Tautan dapatkan waktu antara dua lokasi berbeda menggunakan lintang dan bujur di php
sumber
Coba fungsi ini untuk menghitung jarak antara ke titik lintang dan bujur
Kemudian gunakan fucntion sebagai
Semoga ini bisa membantu
sumber
Pengganda diubah di setiap koordinat karena teori jarak lingkaran besar seperti yang ditulis di sini:
http://en.wikipedia.org/wiki/Great-circle_distance
dan Anda dapat menghitung nilai terdekat menggunakan rumus ini yang dijelaskan di sini:
http://en.wikipedia.org/wiki/Great-circle_distance#Worked_example
kuncinya adalah mengubah setiap derajat - menit - nilai kedua ke semua nilai derajat:
sumber
Salah satu cara termudah adalah:
Ini akan membulatkan hingga 2 poin desimal.
sumber