entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

3votos

Android: diferencia entre distanceTo() y distanceBetween

Hola.

Consultando la documentación oficial de Android (http://developer.android.com/reference/android/location/Location.html#distanceBetween(double, double, double, double, float[])) esta es la conclusión que saco:

distaceTo devuelve en metros la distancia aproximada entre la localización seleccionada y el punto seleccionado.

distanceBetween devuelve la distancia en metros entre dos puntos. Después no entiendo el significado de la frase

"and optionally the initial and final bearings of the shortest path
between them"

Al fin y al cabo no tengo claro la diferencia entre estos dos métodos.

En este otro foro http://stackoverflow.com/questions/14618016/distancebetween-returns-inaccurate-result un usuario comenta que el método distanceBetween devuelve la distancia en linea recta entre dos puntos y distanceTo en cambio, realiza una estimación de la distancia que se debería de recorrer. Pero esto no lo aclara la documentación oficial.

cual es vuestra opinión?

Saludos.

1 Respuesta

3votos

Leonardo-Tadei Puntos227320

Hola Egoitz,

los métodos distanceTo() y distanceBetween() de la clase Location tienen usos diferentes.

distanceTo() recibe como mensaje otro objeto de tipo Location, y calcula la distancia desde el punto actual de Location al punto dado, midiendo en línea recta. Devuelve un flotante.

distanceBetween() en cambio recibe como mensaje 4 coordenadas para determinar latitud y longitud de origen y latitud y longitud de destino y un 5to parámetro para contener los resultados que es un vector de floats. Esto significa que la distancia devuelta no depende de la posición actual del Location que la invoque. En la respuesta, se obtienen varias distancias, que son los diferentes tramos a seguir en el recorrido para unir los puntos y la distancia total queda en el último elemento del vector. No lo he probado, pero esta distancia debería variar según el tipo de recorrido seteado en el Location que lo invoca, ya que no es lo mismo un recorrido a pie que uno en auto.

Y sí, el manual es muy confuso, y el uso de la palabra bearings es una acepción poco frecuente en inglés.

Para muchos usos, es indistinto cual usar: sería mucho más interesante si el vector resultado de distanceBetween() devolviese también la latitud y longitud de cada punto para poder trazar un recorrido programáticamente, sin depender para esto de la API.

Saludos cordiales!

0voto

egoitz_gonzalez comentado

Hola Leonardo.

Entonces, entiendo que si deseo saber cuanta distancia debe de recorrer una persona a pie desde un punto a otro, debería de utilizar distanceBetewee() verdad?

Al fin y al cabo lo que yo deseo es que la persona sepa la distancia que existe (a pie), entre un punto y otro.

Buscando soluciones a este problema encontré el siguiente post el cual calcula la distancia entre dos puntos usando la fórmula de Haversine . Pero por lo que tu has respondido esto no sería necesario.

http://www.nosinmiubuntu.com/2012/07/como-calcular-distancias-en-android.html

Saludos y gracias.

0voto

Leonardo-Tadei comentado

Sí, usar distanceBetewee() y setear previamente en la instancia de Location que será "a pie" (creo que el default es "drive"). Recordá que distanceBetewee() devuelve un vector y la distancia total está en el último elemento.

No te debería hacer falta esa conversión que mencionás en el enlace, porque tanto distanceTo() como distanceBetween() usan el algoritmo WGS84 de las elipsoides, así que ya tenés la corrección de la geometría plana a la euclidiana... si bien para distancias cortas es dispreciable.

Saludos!

0voto

egoitz_gonzalez comentado

Gracias Leonardo.

Antes de marcar el tema como cerrado quería realizar una prueba para tener todo confirmado pero el caso es que no lo logro.

double currentLocLat = this.loc.getLatitude();
double currentLocLong = this.loc.getLongitude();
double pLat = instLoc.getLatitude();
double pLong = instLoc.getLongitude();
float[]results = null;
this.loc.distanceBetween(currentLocLat, currentLocLong, pLat , pLong, results);

Con ese código me salta el try indicando:

results is null or has length < 1

Entiendo que dice que result o es nullo o es menor que 1 pero lo que no entiendo es porque lanza ese resultado. realizo mal la llamada al método?

Saludos.

0voto

egoitz_gonzalez comentado

El error es debido a la inicialización de results. Se debe de inicializar dependiendo de los parametros que se desea recoger.

Por ejemplo:

float[] results = new float[3];

Por otra parte, por la documentación oficial no encuentro como indicar que el tramo se realiza a pie y no en coche.

Saludos.

0voto

Leonardo-Tadei comentado

Bueno, parece que al fin encontré la pieza que faltaba: el cálculo de distancias que no es en línea recta, no lo calcula el objeto Location, sino que es un servicio de la API de Google Maps para Android:

http://stackoverflow.com/questions/18310126/get-the-distance-between-two-locations-in-android

y el manual oficial acá: https://developers.google.com/maps/documentation/directions/

Me puse a buscar cómo setearle el tipo de recorrido a Location, pero ahí recordé que ese seteo siempre lo hicimos sobre el mapa en los Travel Modes... y ahí pude afinar la búsqueda.

Espero que esto encamine a la solución Egoitz!

0voto

egoitz_gonzalez comentado

Hola.

He colocado el tema como solucionado pero me acabo de dar cuenta de un error.

En tu respuesta inicial indicas que "la distancia total queda en el último elemento del vector". Esto no es así. La distancia total queda en el primer elemento del vector. result[0].

Por otra parte, el resultado que devuelve distanceTo y el primer elemento del vector (result[0]) es el mismo. Lo que me hace pensar, que tanto distanceTo como distanceBetween trazan un linea recta.

La verdad, es que la documentación oficial debería de estar mucho mejor desarrollada.

Saludos.

0voto

Leonardo-Tadei comentado

Es correcto lo que decís sobre la forma en que distanceTo() y distanceBetween() hacen el cálculo: en línea recta siempre sobre una elipsoide.
En el comentario anterior te comentaba justamente cómo es el mecanismo para obtener distancias en recorridos a pie o en auto vía las llamadas a la API.

Saluods!

PD: también comparto lo de la documentación oficial... es bastante floja y desarticulada.

0voto

egoitz_gonzalez comentado

Perfecto. Todo aclarado al %100.

Gracias por la ayuda.

Saludos.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta