Yaklaşık bir çözüm (eşit köşeli bir projeksiyona dayalı), çok daha hızlı (yalnızca 1 trigonometrik ve 1 kare kök gerektirir).
Puanlarınız birbirinden çok uzak değilse, bu yaklaşım önemlidir. Gerçek haversine mesafesine kıyasla her zaman fazla tahmin edecektir . Örneğin , iki noktanız arasındaki delta enlemi veya boylamı 4 ondalık dereceyi geçmiyorsa , gerçek mesafeye % 0,05382'den fazlasını eklemeyecektir .
Standart formül (Haversine) kesin olanıdır (yani, dünyadaki herhangi bir boylam / enlem çiftinde işe yarar) ancak 7 trigonometrik ve 2 kare köke ihtiyaç duyduğundan çok daha yavaştır . Birkaç noktanız birbirinden çok uzak değilse ve mutlak hassasiyet çok önemli değilse, bu yaklaşık versiyonu (Equirectangular) kullanabilirsiniz; bu, yalnızca bir trigonometrik ve bir karekök kullandığı için çok daha hızlıdır.
// 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;
Bunu şunlardan birini yaparak daha da optimize edebilirsiniz :
- Mesafeyi bir başkasıyla karşılaştırırsanız karekökü kaldırmak (bu durumda her iki mesafenin karesini karşılaştırın);
- Bir ana noktadan diğer birçok noktaya olan mesafeyi hesaplarsanız kosinüsü çarpanlarına ayırın (bu durumda, ana noktaya ortalanmış eşdüzgen projeksiyonu yaparsınız, böylece tüm karşılaştırmalar için kosinüsü bir kez hesaplayabilirsiniz).
Daha fazla bilgi için bkz: http://www.movable-type.co.uk/scripts/latlong.html
Haversine formülünün birkaç dilde güzel bir referans uygulaması var: http://www.codecodex.com/wiki/Calculate_Distance_Between_Two_Points_on_a_Globe