Calcular la distancia real recorrida por el móvil

Quiero calcular la distancia real recorrida por móvil (iOS y Android). Sé que a través de google map API, podemos encontrar la distancia óptima ruta entre 2 coordenadas. Pero quiero calcular la distancia, camino real móvil (en vehículo) ha cubierto.

Un Algo que llegué a saber es el ahorro de coordenadas después de x segundos, digamos después de 5 o 10 segundos, y luego calcular la distancia entre las coordenadas consecutivas, y allí suma dará la distancia total.

Quiero discutir un mejor enfoque de su solución, ¿Hay alguna solución mejor?

Editar: ¿Cómo funcionan las aplicaciones como Nike ejecutar aplicación y Uber?

10 Solutions collect form web for “Calcular la distancia real recorrida por el móvil”

—————— UPDATE ———————-

Hay dos puntos importantes en su pregunta.

1) obtener las coordenadas del teléfono (que ha sido tratado en la primera parte de esta respuesta)

2) Calcular la distancia real entre estas dos coordenadas

IMHO, el cálculo se puede hacer por un servicio web: el cálculo basado sólo en la distancia entre dos coordenadas puede dar lugar a resultados realmente mal.

Aquí hay un ejemplo de tal servicio web https://graphhopper.com/#directions-api

La aplicación de demostración: https://graphhopper.com/api/1/examples/

Se basa en el flujo de tráfico (como muchas de estas herramientas) Así que tienes que tener cuidado con el orden de las coordenadas, ya que puede traer resultados equivocados.

Por ejemplo con dos puntos en el orden correcto: Introduzca aquí la descripción de la imagen

Esto da un buen resultado

Pero si da orden equivocada (con las mismas coordenadas) Introduzca aquí la descripción de la imagen

Para las mismas coordenadas, puede conducir a un resultado extremadamente diferente.

Así pues, para las coordenadas ABCD (en orden cronológico) es necesario:

A-> B B-> C C-> D

Graphhopper parece capaz de hacer cálculo de distancia fuera de línea

Aquí están las lib en iOS y Android

https://github.com/graphhopper/graphhopper-ios/

https://github.com/graphhopper/graphhopper/tree/master/android

————————————————– –

Tienes que definir cómo funciona tu aplicación. ¿Antecedentes o antecedentes?

Como se dijo en otras respuestas, usted tendrá que obtener la posición del usuario cada X segundos. A continuación, calcule la distancia.

Para iOS:

  1. Puede utilizar la información en este sitio web: http://mobileoop.com/

Habla sobre el seguimiento de la ubicación del usuario en iOS cuando la aplicación está en segundo plano.

  1. Aquí está el github: https://github.com/voyage11/Location

Entonces usted tiene que convertir el punto gracias a

CLLocationDistance distance = [aCLLocationA distanceFromLocation:aCLLocationB]; 

También puede comprobar esto (desde Apple doc) https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/LocationAwarenessPG/CoreLocation/CoreLocation.html :

Asegúrese de que la propiedad pausesLocationUpdatesAutomatically del gestor de ubicaciones esté establecida en YES. Cuando esta propiedad está establecida en SÍ, Ubicación central detiene las actualizaciones de ubicación (y apaga el hardware de ubicación) siempre que tenga sentido hacerlo, como cuando es poco probable que el usuario se mueva de todos modos. (Core Location también pone en pausa las actualizaciones cuando no puede obtener una corrección de ubicación).

Asigne un valor apropiado a la propiedad activityType del gestor de ubicaciones. El valor de esta propiedad ayuda al administrador de ubicaciones a determinar cuándo es seguro pausar las actualizaciones de ubicación. Para una aplicación que proporciona una navegación automovilística paso a paso, la configuración de la propiedad en CLActivityTypeAutomotiveNavigation hace que el gestor de ubicaciones deje los eventos sólo cuando el usuario no se mueve una distancia significativa durante un período de tiempo.

CLActivityTypeAutomotiveNavigation le asegura una posición que está en una carretera.

Para Android:

  1. Puede utilizar este proyecto: https://github.com/quentin7b/android-location-tracker

Eso puede fácilmente le ayuda a obtener la posición del usuario a través del tiempo Gracias al objeto TrackerSettings

 TrackerSettings settings = new TrackerSettings() .setUseGPS(true) .setUseNetwork(true) .setUsePassive(true) .setTimeBetweenUpdates(30 * 60 * 1000) .setMetersBetweenUpdates(100); 
  1. Para encontrar la distancia entre dos puntos en Android, puede comprobar esto: Obtenga la distancia entre dos puntos geográficos

Ambos sistemas operativos

Sobre la base de una posición recogida cada segundo X usted tiene que reducir el tiempo entre la recolección de datos de ubicación para mejorar la precisión.

Como desea calcular la distancia en un contexto de carretera, configure el Administrador de ubicación en modo de navegación , este modo le proporcionará las coordenadas que están en camino.

Finalmente

Si desea mejorar la precisión de su cálculo de distancia, puede utilizar una API de Google: https://developers.google.com/maps/documentation/distance-matrix/intro

Al establecer el parámetro de modo correcto:

Parámetros opcionales

Modo (por defecto a la conducción) – Especifica el modo de transporte que se utilizará al calcular la distancia. Los valores válidos y otros detalles de la solicitud se especifican en la sección Modos de viaje de este documento.

Estoy trabajando en algo similar en Andoriod, pero los principales son los mismos para iOS:

  1. Para cada muestra GPS, compruebe su exactitud. Si es más de un umbral (digamos 20 metros) – ignorarlo.
  2. Recuerde que incluso si el dispositivo móvil es estático, diferentes muestras de GPS le dará diferentes ubicaciones, dependiendo de la precisión. Un coche parado todavía durante mucho tiempo en un semáforo, mostrará que ha avanzado algunas docenas de metros, por lo que agregue un método que detecte si el móvil es estático o no. He implementado esto leyendo el acelerómetro – si el delta entre dos lecturas si es más grande que algún umbral – el dispositivo se está moviendo. Si es demasiado pequeño – ignore el GPS.
  3. Si va a usarlo en un automóvil, puede leer el GPS siempre que tenga una nueva lectura (en Android use el método onLocationChanged ). Si lo usa para correr / caminar, tenga en cuenta que su velocidad es lenta – dos lecturas consecutivas estarán relativamente cerca, pero debido a la precisión del GPS, puede obtener una gran distancia entre ellos. Se puede fijar aumentando el tiempo entre dos lecturas consecutivas, o ignorando algunas de ellas (es decir, tener en cuenta sólo cada 10ª lectura).
  4. Utilice la fórmula de Haversine para calcular la distancia entre dos lecturas consecutivas. En Android se puede hacer con el método Location.distanceTo() .

Tendrá que probarlo contra el cuentakilómetros en su coche y ajustar los umbrales para el acelerómetro.

Hace 4 años, acabo de hacer una aplicación llamada Landsurvayor que calcula la distancia real de dos puntos geográficos dibujados en Google Map. No sé que podría ayudar o no, pero hay una fórmula llamada fórmula Haversine que calcula la distancia real entre dos puntos geográficos. Usted puede darle una oportunidad y ver si es útil para usted o no. A continuación se muestra el código de ejemplo de la fórmula de Haversine:

 public double CalculationByDistance(double initialLat, double initialLong, double finalLat, double finalLong){ int R = 6371; // km double dLat = toRadians(finalLat-initialLat); double dLon = toRadians(finalLong-initialLong); lat1 = toRadians(lat1); lat2 = toRadians(lat2); double a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2); double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); return R * c; } public double toRadians(deg) { return deg * (Math.PI/180) } 

Más sobre la fórmula de Haversine: https://en.wikipedia.org/wiki/Haversine_formula

Hay otro sencillo SDK de Android integrado para calcular la distancia entre dos lat, lng:

 Location locationA = new Location("point A"); locationA.setLatitude(latA); locationA.setLongitude(lngA); Location locationB = new Location("point B"); locationB.setLatitude(latB); LocationB.setLongitude(lngB); distance = locationA.distanceTo(locationB) ; 

Espero que pueda ayudarte.

Puede lograr más precisión con una combinación de las siguientes estrategias.

  1. Como se menciona en otras Respuestas, puede almacenar la posición del móvil cada X segundos (digamos 10 segundos) usando GPS y medir el tiempo consecutivo entre los puntos.

  2. También cuando el usuario hace giros rápidos, asegúrese de leer que mediante el uso de valores de sensor magnético también, por lo que en tal caso, disminuir el "tiempo entre la posición de almacenamiento" para decir 1-2 segundos (Será necesario para la precisión)

  3. Como paso final, utilice los datos del Mapa (como Google Maps, etc.) para asegurarse de que está siendo rastreado correctamente (si está en carretera).

Y luego resumir todos los valores para obtener la distancia exacta.

PS He dado información sobre las estrategias solo, ya que no estoy seguro acerca de su implementación en Android (o iOS).

Espero que esto ayude 🙂

Si está buscando información de distancia exacta (o casi exacta), debe seguir la trayectoria seguida, lo que significa comprobar las coordenadas cada pocos segundos (dependiendo de la velocidad esperada). Puede ahorrar espacio descartando las coordenadas antiguas después de calcular cada segmento y simplemente almacenar la distancia actual recorrida.

Android :: cómo calcular la distancia mientras camina en android?

Hay diferentes maneras de hacer esto:

1.GPS: Sigue añadiendo la distancia GPS entre 2 puntos cada X segundos (digamos 10 seg). Comprueba la ubicación de Android.distanceTo o distanceBetween. Comprueba mi aplicación de pistas, es de código abierto. GPS no está disponible en el interior y tendría error si el usuario está cambiando de dirección con mucha frecuencia (leer cada 1-2 segundos) 2.Accelerometer: Busque el código / biblioteca para la detección de pasos con acelerómetro. La distancia viene de la doble integración de la aceleración, los errores pueden acumularse muy rápidamente aquí. Detector 3.Step: Construido en Nexus 5. Google debe haber tomado cuidado de los errores del acelerómetro a la medida posible. Se trata de computación basada en hardware, consume menos batería pero no está disponible en la mayoría de los teléfonos a la fecha.

La segunda opción parece muy similar a lo que sugirió y creo que es la mejor manera de lograrlo ya que iOS y Android defer en código y en funcionalidad por lo que el mejor método para lograrlo es el ahorro currentLocation y previousLocation en un bucle while que lo hará . Sleep () y sólo suma el bucle completo como la distancia recorrida. La pregunta más grande es esta supuestamente aplicación es una aplicación summerizing de distancia? ¿Hace apenas una pequeña función dentro de ella? ¿Cómo decides cuándo dejar de calcular la distancia?

Un problema con el uso de coordenadas GPS es que (obviamente) no son precisos. Si viaja en línea recta, las coordenadas GPS podrían mostrarle que viaja en una trayectoria en zigzag, por lo que la distancia recorrida es mayor que la distancia real. Incluso con una buena precisión GPS este error puede ser significativo. El uso de menos coordenadas podría resultar en un cálculo más exacto o no.

Lo que usted necesita es una manera de suavizar la trayectoria del GPS trazado, con la debida consideración a su exactitud requerida (de nuevo un trade-off).

Mi primer pensamiento es romper los puntos en grupos y ajustar segmentos de línea a cada grupo (buscar "regresión lineal"). A continuación, determine dónde se superponen cada par de líneas consecutivas para definir cada segmento de línea. A continuación, simplemente suma las longitudes del segmento de línea.

Podría curva-ajuste segmentos, pero que es mucho más intenso matemáticamente, y no podría dar un mejor resultado (y qué fórmula de curva para usar?). Puede haber mejores maneras matemáticas que no conozco.

Espero que esto ayude.

Utilice el GPS para conseguir lat lon de ambos lugares y después de conseguir ambos pase él debajo de method.Its volverá la distancia en el kilómetro

 public static double getDistanceFromLatLonInKm(double lat1, double lon1, double lat2, double lon2) { double R = 6371; // Radius of the earth in km double dLat = deg2rad(lat2 - lat1); // deg2rad below double dLon = deg2rad(lon2 - lon1); double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.sin(dLon / 2) * Math.sin(dLon / 2); double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); double d = R * c; // Distance in km return d; } public static double deg2rad(double deg) { return deg * (Math.PI / 180); } 

}

Si la precisión es crítica, puede utilizar datos de acelerómetro y giroscopio. Usted puede encontrar la fórmula muy simple para resolver tarea cinematográfica simple para obtener acc en el eje global. Que sólo tienes que usar integral dos veces (primero para obtener la velocidad, que para obtener la posición). Sólo para mostrar otra perspectiva.

Puntos de registro cada x segundos (tal vez 2-3?) Y utilizar la fórmula de distancia a continuación para cada punto registrado.

 Distance = sqrt((x2−x1)^2+(y2−y1)^2) 

Sumarlos todos y obtener distancia

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.