Calcular la velocidad de una aplicación de navegación sin el método getSpeed ​​()

Estoy desarrollando una aplicación que es más de un tiempo de cambio de carreras entre sus amigos.

Necesito calcular la velocidad de un vehículo en movimiento, y no quiero usar el método Location.getSpeed() . (Explicado en detalle en la parte inferior por qué no quiero usarlo)

Estoy tratando de calcular la velocidad con la ayuda de la latitud y la longitud a mi disposición, y aquí es donde necesito ayuda.

La ayuda necesaria: Quisiera saber es:

  • Si el algoritmo es correcto
  • ¿Debo calcular en centímetros en lugar de metros
  • Y si hay algún código / biblioteca ya disponible que lo hace.

Estoy usando el siguiente código:

Esto me da la distancia entre dos puntos LatLng:

 long getDistanceBetweenPoints(double lat1, double lng1, double lat2, double lng2 ){ double dLat = Math.toRadians(lat2 - lat1); double dLon = Math.toRadians(lng2 - lng1); 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)); long distanceInMeters = Math.round(6371000 * c); return distanceInMeters; } 

Y el código siguiente es cómo se está utilizando:

 if(lastLat == -1 && lastLng == -1){ lastLat = location.getLatitude(); lastLng = location.getLongitude(); lastTimeStamp = location.getTime(); return; } long distanceInMeters = getDistanceBetweenPointsAndSetTotal(lastLat, lastLng, location.getLatitude(), location.getLongitude()); long timeDelta = (location.getTime() - lastTimeStamp)/1000; long speed = 0; if(timeDelta > 0){ speed = (distanceInMeters/timeDelta); } Log.d("Calculations","Distance: "+distanceInMeters+", TimeDelta: "+timeDelta+" seconds"+",speed: "+speed+" Accuracy: "+location.getAccuracy()); lastLat = location.getLatitude(); lastLng = location.getLongitude(); lastTimeStamp = location.getTime(); 

Cuando lo ejecuto, consigo la salida siguiente de ese LogCat:

 Distance: 0, TimeDelta: 0 seconds,speed: 0 Accuracy: 5.0 

Razones detalladas
Los consumidores objetivo no se supone que tienen dispositivos de alta calidad con chips de alta calidad de GPS, por lo tanto siempre obtener una corrección muy precisa cuando el dispositivo está en movimiento no es posible.

Por lo tanto, no quiero depender del método Location.getSpeed() , ya que he observado que da valores de velocidad sólo cuando la precisión está en el rango de 5 ~ 8 metros.

Los rangos normales de precisión que estoy obteniendo en circunstancias generales son 10-15 metros, y getSpeed() no da ninguna velocidad. Incluso hasSpeed() comienza a devolver false.

He estado jugando mi cabeza alrededor de esta cosa por más de 3 días, cualquier ayuda en esto sería profundamente apreciada.

Muchas gracias de antemano!

Desarrollo MyTrails , una aplicación de seguimiento y mapeo para Android, y como tú luché al principio con las API de ubicación muy crudas que Google ha considerado aptas para incluir en Android.

HasSpeed ​​() es falsa cuando el chip GPS no tiene una corrección lo suficientemente buena para calcular la velocidad basada en el efecto dopler. Incluso cuando lo hace, por lo general no confía en la velocidad si está a menos de 5 km / h o por ahí.

La forma en que manejo los cálculos de velocidad es utilizando un filtro de paso bajo crudo: grabo un trackpoint cada segundo (y un mínimo de 5m de distancia, basado en LocationManager.requestLocationUpdates() , y para calcular la velocidad reciente, vuelvo unos cuantos Muestras para obtener una distancia suficiente (pero no más de 30s antes), y realizar el promedio que está haciendo.

Estoy usando Location.distanceBetween () para calcular la distancia real. Tenga cuidado de que falla en un número muy pequeño (pero desafortunado) de dispositivos, por lo que el método haversine que tiene puede ser una mejor apuesta. Es posible que desee comprobarlo, sin embargo, lo que tengo es

 /** * Gets distance in meters, coordinates in RADIAN */ private static double getDistance(double lat1, double lon1, double lat2, double lon2) { double R = 6371000; // for haversine use R = 6372.8 km instead of 6371 km double dLat = lat2 - lat1; double dLon = lon2 - lon1; double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(lat1) * Math.cos(lat2) * Math.sin(dLon / 2) * Math.sin(dLon / 2); //double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); return 2 * R * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); // simplify haversine: //return 2 * R * 1000 * Math.asin(Math.sqrt(a)); } 

(Tenga en cuenta el factor 1000)

Estoy de acuerdo con Pierre, también estás redondeando los resultados. Si los puntos no están lo suficientemente separados, usted está redondeando puede proporcionar 0. No veo cómo se define la tolerancia de redondeo. Siempre calculo en metros – hace las cosas mucho más fáciles. Sugiero seguir las unidades estándar de SI en su código. Su salida también muestra que el tiempoDelta es cero, por lo que no se calculó realmente la distancia.

Si el algoritmo es correcto?

El cálculo de la distancia se parece a la fórmula de la haversine que es correcta. (Hay fórmulas mucho más rápidas para distancias pequeñas (y sólo se utilizan distancias pequeñas), pero haversine funcionará)

¿Debo calcular en centímetros en lugar de metros?

Nunca use centímetros, permanezca con unidades SI, la unidad de velocidad es metro / s. Sólo use el metro como punto flotante (doble).

Ios, donde estoy desarrollando una aplicación de seguimiento, parece ser más amigable en relación con la clase getSpeed ​​() de la clase Location.

Pero yo (de nuevo?) Te advierten de usar velocidades a baja velocidad. Si obtiene una velocidad no válida, simplemente detenga el cálculo o márquelo como no válido en su aplicación. Si el chip GPS no puede entregar una velocidad válida, tiene una buena razón para hacerlo, y es una pregunta interesante si lo hará mejor. A baja velocidad, el GPS tiende a saltar aleatoriamente alrededor de la posición verdadera, dando saltos de 5-30m. Es muy probable que su velocidad calculada automáticamente muestre más velocidad que el dispositivo (no) se mueve. Trate de arreglar su aplicación, que no necesita velocidades a bajas velocidades.

Dios mio…..

Ubicación

Compruebe este método – que le permite calcular la distancia entre 2 puntos geo, basta con dividirlo por su tiempo. Debe ser mucho más preciso que el tuyo, ya que calcula las distancias con una aproximación mucho mejor (WGS83 en lugar de usar el pecado, cos y resto de este material).

Buena, idea general es mantener todos sus datos en unidades simples como m, s, kg etc. y hacer cambios sólo para mostrar datos al usuario.

  • Acceso al texto de dirección de giro a giro desde la navegación de google
  • Android gps postion precisión círculo
  • ¿Por qué el registro de las actualizaciones de ubicación activa los contactos para actualizar?
  • Mocking gps lugares en la brecha telefónica
  • Número GPS de satélites y filtrado de ubicaciones
  • Android GPS Activa / desactiva el ahorro de tiempo en un archivo de texto Dentro de SDCARD con líneas de múltiples líneas
  • Android O API 26. Los métodos de ubicación recientemente agregados no funcionan según sea necesario
  • Cómo activar el GPS en Android
  • Cómo quitar un LocationListener de LocationManager que se agrega dos veces en android?
  • Alternar el GPS mediante programación Android 4.4
  • Enviar ubicación actual al servidor periódicamente en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.