28 votes

calculer la distance réelle parcourue par mobile

Je veux calculer la distance parcourue par le mobile (iOS et Android). Je sais par le biais de google map API, nous pouvons trouver la meilleure route distance entre 2 coordonnées. Mais je veux calculer la distance, de chemin d'accès mobile(dans le véhicule) a pris en charge.

Un Algo je suis venu à connaître est l'enregistrement des coordonnées après x secondes, permet de dire au bout de 5 ou 10 secondes, puis de calculer la distance entre deux coordonnées, et il n'y somme donnera la distance totale.

Je veux discuter de la meilleure approche de sa solution , Est-il une meilleure solution?

Edit : Comment Apps comme Nike running app et Uber fonctionne?

15voto

Alban Points 468

------------------Mise à JOUR----------------------

Il y a deux point important dans votre question.

1) obtenir le téléphone de coordonnées (qui a été traité dans la première partie de cette réponse)

2) Calculer le réel de la distance entre deux coordonnées

À mon humble avis, le calcul peut être réalisé par un service web: calcul basé uniquement sur la distance entre deux coordonnées peuvent conduire à vraiment mauvais résultat.

Voici un exemple d'un tel service web https://graphhopper.com/#directions-api

La démo app: https://graphhopper.com/api/1/examples/

Il est basé sur les flux de trafic (comme beaucoup de ces outils) Donc, vous devez être prudent avec l'ordre des coordonnées car elle peut amener un résultat incorrect.

Par exemple avec deux points dans le bon ordre: enter image description here

Cela donne un bon résultat

Mais si vous donnez des mauvais ordre (avec les mêmes coordonnées) enter image description here

Pour les mêmes coordonnées, il peut conduire à un niveau extrêmement résultat différent.

Donc pour coordonnées ABCD (en chrnological commande) ce que vous devez faire:

A->B B->C->D

Graphhopper semble en mesure de le faire hors de la distance de calcul

Voici la lib sur iOS et Android

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

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

---------------------------------------------------

Vous devez définir la façon dont votre application de fonctionner. De premier plan ou d'arrière-plan?

Comme dit dans d'autres réponses, vous aurez à obtenir la position de l'utilisateur, toutes les X secondes. Puis calculer la distance.

Pour iOS:

  1. Vous pouvez utiliser les informations sur ce site: http://mobileoop.com/

Il parle de suivi de localisation de l'utilisateur sur iOS lorsque l'application est en arrière-plan.

  1. Voici le github: https://github.com/voyage11/Location

Ensuite, vous devez convertir le point, grâce à

CLLocationDistance distance = [aCLLocationA distanceFromLocation:aCLLocationB];

Vous pouvez également vérifier cette (d'apple doc) https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/LocationAwarenessPG/CoreLocation/CoreLocation.html:

Assurez-vous que l'emplacement du gestionnaire de pausesLocationUpdatesAutomatically propriété est définie sur OUI. Lorsque cette propriété est définie sur OUI, l'Emplacement de Noyau pauses emplacement des mises à jour (et les pouvoirs en bas de l'emplacement du matériel) chaque fois que cela a du sens de le faire, par exemple lorsque l'utilisateur est rare d'être en mouvement, de toute façon. (L'Emplacement de noyau aussi une pause à jour quand il ne parvient pas à obtenir une position gps.)

Attribuer une valeur appropriée à l'emplacement d'un gestionnaire de activityType de la propriété. La valeur de cette propriété permet à l'emplacement du gestionnaire de déterminer quand il est sécuritaire de le mettre en pause l'emplacement des mises à jour. Pour une application qui offre tour-par-tour de navigation automobile, la définition de la propriété de CLActivityTypeAutomotiveNavigation provoque l'emplacement gestionnaire de pause événements uniquement lorsque l'utilisateur ne se déplace pas à une distance importante sur une période de temps.

CLActivityTypeAutomotiveNavigation de vous assurer d'obtenir une position qui est sur la route.

Pour Android:

  1. Vous pouvez utiliser ce projet: https://github.com/quentin7b/android-location-tracker

Qui peut facilement vous aide à obtenir la position de l'utilisateur thru temps Grâce à la TrackerSettings objet

TrackerSettings settings =
        new TrackerSettings()
            .setUseGPS(true)
            .setUseNetwork(true)
            .setUsePassive(true)
            .setTimeBetweenUpdates(30 * 60 * 1000)
            .setMetersBetweenUpdates(100);
  1. Pour trouver la distance entre deux points sur Android, vous pouvez vérifier ceci: Obtenir la distance entre deux points geo

Les deux OS

Basé sur une position ramassé toutes les X seconde vous avez de réduire le temps entre la cueillette des données de localisation pour améliorer la précision.

Que vous voulez calculer la distance sur une route contexte, le programme d'installation l'Emplacement manager en mode de navigation, ce mode vous donne les coordonnées qui sont sur la route.

Enfin

Si vous voulez améliorer la précision du calcul de la distance, vous pouvez utiliser une API de google: https://developers.google.com/maps/documentation/distance-matrix/intro

En définissant le droit mode paramètre:

Les paramètres facultatifs

mode (par défaut à la conduite) - Spécifie le mode de transport à utiliser lors du calcul de la distance. Les valeurs valides et d'autres détails de la demande sont précisées dans les Modes de Déplacement de la section de ce document.

8voto

TDG Points 914

Je suis en train de travailler sur quelque chose de semblable sur Andoriod, mais le principe est le même pour iOS, soit:

  1. Pour chaque GPS de l'échantillon, vérifier son exactitude. Si il est au-dessus d'un certain seuil (disons 20 mètres) - l'ignorer.
  2. N'oubliez pas que même si l'appareil mobile est statique, GPS échantillons vous donnera des endroits différents, en fonction de la précision. Une voiture encore debout pour une longue période dans un feu de circulation, sera montrer que vous avez avancé de quelques dizaines de mètres, il faut donc ajouter une méthode qui détecte si le mobile est statique ou non. J'ai mis en place ce par la lecture de l'accéléromètre - si le delta entre les deux lectures, si plus grand que d'un certain seuil - l'appareil est en mouvement. Si elle est trop petite ignorer le GPS.
  3. Si vous avez l'intention de l'utiliser dans une voiture, vous pouvez lire le GPS à chaque fois qu'il a une nouvelle lecture (en Android utiliser l' onLocationChanged méthode). Si vous l'utilisez pour la course/marche, prenez en compte que votre vitesse est lente, deux lectures consécutives sera en proche, mais en raison du GPS de précision, vous pouvez obtenir une assez grande distance entre eux. Il peut être résolu en augmentant le temps entre deux lectures consécutives, ou en ignorant certains d'entre eux (c'est à dire prendre en compte que chaque 10e de la lecture).
  4. Utiliser le Haversine formule pour calculer la distance entre deux mesures consécutives. Dans Android, il peut être fait avec l' Location.distanceTo() méthode.

Vous aurez à tester contre le compteur kilométrique de votre voiture et d'ajuster les seuils de l'accéléromètre.

7voto

Gagan Singh Points 723

Il y a 4 ans, je viens de faire une application appelée Landsurvayor qui calcule la distance de deux points géographiques tracées sur une Carte Google map. Je ne sais pas qui pourrait vous aider ou pas, mais il y a une formule appelée Haversine formule qui calcule la distance réelle entre deux points géographiques. Vous pouvez lui donner un essai et voir si il est utile pour vous ou pas. Ci-dessous l'exemple de code de Haversine formule:

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)
}

Plus sur Haversine formule: https://en.wikipedia.org/wiki/Haversine_formula

Il y a un autre simple pour Android SDK intégré dans l'approche pour calculer la distance entre les deux 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) ;

J'espère que ça peut vous aider.

6voto

Snazzy Sanoj Points 596

Vous pouvez obtenir plus de précision avec une combinaison de stratégies suivantes.

  1. Comme mentionné dans d'autres Réponses, vous pouvez stocker la position du mobile toutes les X secondes(10 secondes) à l'aide de GPS et de mesurer l' consécutives de temps entre les points.

  2. Aussi lorsque l'utilisateur effectue des virages rapides, assurez-vous de lire que par l'aide d'un Capteur Magnétique, des valeurs, dans de tels cas, diminuer la "le timing entre la position de stockage" à dire 1 à 2 secondes(Seront nécessaires pour la précision)

  3. Comme dernière étape, l'utilisation de la Carte de données(tels que Google Maps, etc.) assurez-vous vous êtes suivi correctement(si sur la route).

Et puis la somme de toutes les valeurs pour obtenir la distance exacte.

P. S. j'ai donné des informations sur les stratégies seul, car je ne suis pas sûr au sujet de sa mise en œuvre dans Android(ou iOS).

Espérons que cela aide :)

4voto

Robert C Points 53

Si vous recherchez des informations de distance exactes (ou presque exactes), vous devez suivre le chemin suivi, ce qui signifie vérifier les coordonnées toutes les quelques secondes (en fonction de la vitesse attendue parcourue). Vous pouvez économiser de l'espace en supprimant les anciennes coordonnées après avoir calculé chaque segment et en stockant simplement la distance actuelle parcourue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X