Solusi yang diperkirakan (berdasarkan proyeksi persegi panjang), jauh lebih cepat (hanya membutuhkan 1 trigonometri dan 1 akar kuadrat).
Perkiraan ini relevan jika poin Anda tidak terlalu berjauhan. Ini akan selalu melebihi perkiraan dibandingkan dengan jarak haversine yang sebenarnya. Misalnya, jarak tidak lebih dari 0,05382% akan dijumlahkan jika garis lintang atau bujur delta antara dua titik Anda tidak melebihi 4 derajat desimal .
Rumus standar (Haversine) adalah yang tepat (yaitu, rumus ini berfungsi untuk beberapa bujur / lintang di bumi) tetapi jauh lebih lambat karena dibutuhkan 7 trigonometri dan 2 akar kuadrat. Jika pasangan titik Anda tidak terlalu jauh, dan ketepatan absolut tidak terpenting, Anda dapat menggunakan versi perkiraan ini (Equirectangular), yang jauh lebih cepat karena hanya menggunakan satu trigonometri dan satu akar kuadrat.
// Approximate Equirectangular -- works if (lat1,lon1) ~ (lat2,lon2)
int R = 6371; // km
double x = (lon2 - lon1) * Math.cos((lat1 + lat2) / 2);
double y = (lat2 - lat1);
double distance = Math.sqrt(x * x + y * y) * R;
Anda dapat mengoptimalkan ini lebih lanjut dengan:
- Menghapus akar kuadrat jika Anda hanya membandingkan jarak dengan yang lain (dalam hal ini bandingkan kedua jarak kuadrat);
- Memfaktorkan kosinus jika Anda menghitung jarak dari satu titik master ke banyak titik lainnya (dalam hal ini Anda melakukan proyeksi persegi panjang yang berpusat pada titik master, sehingga Anda dapat menghitung cosinus sekali untuk semua perbandingan).
Untuk info lebih lanjut lihat: http://www.movable-type.co.uk/scripts/latlong.html
Ada implementasi referensi yang bagus dari formula Haversine dalam beberapa bahasa di: http://www.codecodex.com/wiki/Calculate_Distance_Between_Two_Points_on_a_Globe