Cómo calcular distancias en Android

Buenas, ya hace tiempo tuvimos una serie de capítulos dedicados a Google Maps, añadimos marcadores, bocadillos con información, incluso localizamos al usuario. Una de las cosas interesantes de los mapas es saber calcular distancias entre dos puntos, concretamente entre el usuario y cualquier otro punto.


Para ello existen varias formas de hacerlo. La forma más sencilla de hacerlo es calcular la distancia en línea recta entre los dos puntos, como si fuéramos en avión de un punto a otro. Todos sabemos que esta no es la forma habitual en la que vamos de un punto a otro con lo cual la distancia siempre tiende a hacerse mucho mayor. Aún así siempre es una buena referencia para poder comparar varios puntos.

La fórmula de Haversine es la que utilizaremos en este caso, no voy a entrar en detalles para explicárosla por que la época en la que estudiaba los senos, cosenos, arcosenos y demás en matemáticas me quedan muy lejanos, así que ahí os dejo el enlace a la wikipedia.

Nosotros simplemente crearemos una función a la que le pasamos la latitud y longitud de nuestra posición, la latitud y longitud de nuestro destino y nos devolverá una distancia en metros.


public static int getDistance(int lat_a,int lng_a, int lat_b, int lon_b){
  Radius = 6371000; //Radio de la tierra
  double lat1 = lat_a / 1E6;
  double lat2 = lat_b / 1E6;
  double lon1 = lng_a / 1E6;
  double lon2 = lon_b / 1E6;
  double dLat = Math.toRadians(lat2-lat1);
  double dLon = Math.toRadians(lon2-lon1);
  double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * Math.sin(dLon /2) * Math.sin(dLon/2);
  double c = 2 * Math.asin(Math.sqrt(a));
  return (int) (Radius * c);  

 }


Si necesitáis otra medida como pies, millas o lo que sea, simplemente al resultado final aplicad la conversión necesaria.

Otra de las cosas que podéis hacer es formatear un poco la distancia en función de la magnitud, ya que, aunque sea lo mismo decir que estoy a 2 kilómetros que a 2.000 metros, al usuario final le hacemos pensar para hacer la conversión. Yo me he hecho una pequeña función, la cual le paso la distancia en metros, y si es mayor de un kilómetro me devuelve el resultado en kilómetros y si no en metros.


public static String Distance(int distance){  
  if(distance >= 1000){
   int k = distance / 1000;
   int m = distance - (k*1000);
   m = m / 100;
   return String.valueOf(k) + (m>0?("."+String.valueOf(m)):"") + " Km" +(k>1?"s":"");
  } else {
   return String.valueOf(distance) + " metro"+(distance==1?"":"s");
  }  
 }


Bueno, como dije al principio, hay formas más complicadas de calcular distancias entre dos puntos. Por ejemplo Google Maps tiene un servicio que nos devuelve la distancia como si fuéramos en coche o andando, lo cual sería una navegación mucho más real. Lo malo de utilizar este sistema es que sería necesario tener conexión a internet y podría llegar a ser mucho más lento.

Comments are closed.