Наближене рішення (засноване на рівнокутній проекції), набагато швидше (для нього потрібен лише 1 трійник і 1 квадратний корінь).
Це наближення доречне, якщо ваші точки не надто далеко одна від одної. Це завжди буде завищено в порівнянні з реальною відстанью Гаверсина. Наприклад, це додасть не більше 0,05382% до реальної відстані, якщо дельта широта або довгота між вашими двома точками не перевищуватиме 4 десяткові градуси .
Стандартна формула (Haversine) є точною (тобто працює для будь-якої пари довготи / широти на землі), але набагато повільніше, оскільки їй потрібно 7 тригонометричних та 2 квадратних кореня. Якщо ваша пара очок не надто далеко одна від одної, і абсолютна точність не є першорядною, ви можете використовувати цю приблизну версію (Equirectangular), яка набагато швидша, оскільки використовується лише один тригонометричний і один квадратний корінь.
// 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;
Ви можете оптимізувати це далі :
- Видалення квадратного кореня, якщо ви просто порівняєте відстань з іншою (у такому випадку порівняйте обидві відстані у квадраті);
- Розділення косинуса, якщо обчислити відстань від однієї головної точки до багатьох інших (у такому випадку ви робите прямокутну проекцію, зосереджену на головній точці, щоб ви могли обчислити косинус один раз для всіх порівнянь).
Для отримання додаткової інформації див: http://www.movable-type.co.uk/scripts/latlong.html
Приємна контрольна реалізація формули Хаверсіна кількома мовами: http://www.codecodex.com/wiki/Calculate_Distance_Between_Two_Points_on_a_Globe