Una solución aproximada (basada en una proyección equirrectangular), mucho más rápida (solo requiere 1 trig y 1 raíz cuadrada).
Esta aproximación es relevante si sus puntos no están muy separados. Siempre se sobrestimará en comparación con la distancia real de Haversine. Por ejemplo, no agregará más de 0.05382% a la distancia real si la latitud o longitud delta entre sus dos puntos no excede los 4 grados decimales .
La fórmula estándar (Haversine) es la exacta (es decir, funciona para cualquier par de longitud / latitud en la tierra) pero es mucho más lenta ya que necesita 7 raíces trigonométricas y 2 cuadradas. Si sus dos puntos no están muy separados y la precisión absoluta no es primordial, puede usar esta versión aproximada (equirrectangular), que es mucho más rápida ya que usa solo una raíz trigonométrica y una raíz cuadrada.
// 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;
Puede optimizar esto aún más mediante:
- Quitar la raíz cuadrada si simplemente compara la distancia con otra (en ese caso, compare ambas distancias al cuadrado);
- Factorizar el coseno si calcula la distancia desde un punto maestro a muchos otros (en ese caso, hace la proyección equirrectangular centrada en el punto maestro, por lo que puede calcular el coseno una vez para todas las comparaciones).
Para obtener más información, consulte: http://www.movable-type.co.uk/scripts/latlong.html
Hay una buena implementación de referencia de la fórmula de Haversine en varios idiomas en: http://www.codecodex.com/wiki/Calculate_Distance_Between_Two_Points_on_a_Globe