Una solución aproximada (basada en una proyección equirrectangular), mucho más rápido (requiere solo 1 trig y 1 raíz cuadrada).
Esta aproximación es relevante si sus puntos no están demasiado separados. Se siempre sobreestimar en comparación con la distancia real de haversine. Por ejemplo, agregará no más de 0.05382% a la distancia real si la latitud o longitud delta entre sus dos puntos no excede 4 grados decimales.
La fórmula estándar (Haversine) es la exacta uno (es decir, funciona para cualquier par de longitud/latitud en la tierra), pero es mucho más lento , ya que necesita 7 trigonométricas y 2 raíces cuadradas. Si su par de puntos no están demasiado separados, y la precisión absoluta no es primordial, puede usar esta versión aproximada (Equirectangular), 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 este aún más mediante:
- Extracción de la raíz cuadrada si simplemente comparar la distancia a otro (en este caso comparamos ambas distancia al cuadrado);
- Factorizar el coseno si calcula la distancia de un punto maestro a muchos otros (en ese caso, usted hace la proyección equirrectangular centrada en el punto maestro, por lo que puede calcular el coseno una vez para todas las comparaciones).
Para más información ver: http://www.movable-type.co.uk/scripts/latlong.html
hay un bonito implementación de referencia de la fórmula Haversine en varios idiomas en: http://www.codecodex.com/wiki/Calculate_Distance_Between_Two_Points_on_a_Globe
Probablemente más lento que usar Location.DistanceBetween() ya que está usando objetos Location pero funciona muy bien para mis propósitos. – ZoltanF
@praveen gracias al hombre sus trabajos ... –
¿Qué clase tengo que importar para la ubicación 'import android.location.Location;' o qué –