web-dev-qa-db-fra.com

Google Maps: à partir d'un point, comment trouver tous les points à une distance de route donnée?

Dans mon application, le GPS choisit l'emplacement du véhicule. Il est alors censé placer des balises à tous les endroits où le véhicule pourrait se trouver s'il parcourt 1 km dans n'importe quelle direction (notez que les routes peuvent bifurquer plusieurs fois dans les 1 km).

Quelqu'un peut-il me suggérer comment faire cela? Merci d'avance.

21
user315067

Il s'agit d'un problème très délicat à résoudre avec l'API Google Maps. Voici une méthode que vous pouvez envisager:

  1. Vous pouvez facilement calculer un cercle de délimitation de 1 km autour de votre point GPS. Il est également facile de calculer les points qui tombent sur la circonférence de ce cercle, quel que soit l'angle. Cette distance correspondra "à la corneille" et non à la distance réelle sur la route, mais vous voudrez peut-être consulter le message Stack Overflow suivant pour une implémentation concrète:

    Comment calculer la longitude d'un point situé à une certaine distance de l'autre?

    Capture d'écran avec des marqueurs à 20 degrés d'intervalle sur un cercle de délimitation d'un rayon de 1 km:

_ {lien ImageShack mort supprimé - Comment calculer la position d'un point à une certaine distance d'un autre?}

  1. Il existe également une astuce pour accrocher ces points à la rue la plus proche. Vous pouvez consulter le point d'accrochage de Mike Williams pour des exemples de rues pour une bonne mise en œuvre de ceci.

    Le service de guidage de l'API Google Maps permet de calculer la distance entre votre point GPS et chaque point routier pris. Notez que cela ne fonctionnera que dans les pays prenant en charge les itinéraires dans Google Maps, mais plus important encore, la distance sur la route sera presque toujours supérieure à 1 km, car notre cercle de délimitation a un rayon de 1 km "à vol d'oiseau". Toutefois, si vous pouvez utiliser des informations approximatives, cela peut déjà être une solution possible.

  2. Vous pouvez également envisager de commencer avec la solution ci-dessus (cercle de délimitation de 1 km, calculer x points sur la circonférence et de les aligner sur la route la plus proche), puis de calculer la distance de chaque chemin (de votre point GPS à chaque point d'accrochage), et Vous pouvez ensuite répéter cette opération de manière récurrente pour chaque trajet, en utilisant à chaque fois un cercle de délimitation plus petit, jusqu'à atteindre une distance de route proche de 1 km. Vous pouvez diminuer le cercle englobant dans chaque récursivité, proportionnellement à la marge d'erreur, pour rendre votre algorithme plus efficace.


UPDATE:

J'ai trouvé une implémentation très soignée qui semble utiliser une méthode similaire à celle que j'ai décrite ci-dessus:

Notez comment vous pouvez modifier l’intervalle de degrés à partir du haut. Avec un intervalle large, vous obtiendrez des résultats rapides, mais vous pourriez facilement rater quelques itinéraires.

Capture d'écran:

_ {lien ImageShack mort supprimé - Rayon de conduite} _

21
Daniel Vassallo

L’algorithme naturel de la force brute consiste à établir une liste de tous les nœuds possibles en tenant compte de chaque décision possible sur chaque carrefour.

Je doute qu’en moins d’un kilomètre vous ayez plus de 10 carrefours en moyenne et que si vous aviez en moyenne 3 choix sur un carrefour, vous vous retrouveriez avec 3 ^ 10 - environ 59 049 nœuds finaux (notez que vous devez avoir 10 carrefours sur chaque branche de la route pour atteindre le nombre complet).

En réalité, le nombre diminuerait et je supposerais qu'il ne serait pas inhabituel de se rendre au même nœud par un itinéraire différent, en particulier dans les villes.

Cette approche vous donnerait une réponse exacte (à condition d’avoir un bon plan de rue en entrée). C'est le temps potentiel, mais le n ne semble pas être si élevé, donc cela pourrait être pratique.

D'autres améliorations et optimisations peuvent être possibles en fonction de la raison pour laquelle vous avez besoin de ces nœuds (ou du type de scénarios que vous considéreriez suffisamment similaires pour les élaguer).

2
Unreason

En développant un peu l'approche de Daniel ci-dessus, vous voulez d'abord trouver tout le point dans un rayon de droite de votre origine. C'est votre ensemble de départ de nœuds. Incluez maintenant TOUTES les arêtes incidentes à ces nœuds et aux autres nœuds de votre ensemble de départ. Maintenant, vérifiez que les nœuds sont connectés et qu’il n’y a aucun nœud flottant que vous ne puissiez atteindre. Créez maintenant un " arbre du plus court chemin " à partir de votre nœud de véhicule.

L'arborescence vous donnera les chemins les plus courts entre votre nœud de départ et tous les autres nœuds. Notez que si vous commencez par créer des chemins aux nœuds les plus éloignés, tous les sous-chemins sont également les chemins les plus courts vers ces nœuds. Assurez-vous d'étiqueter ces nœuds sur les sous-chemins au fur et à mesure que vous continuez afin de ne pas avoir à les calculer. Dans le pire des cas, vous devez développer le chemin le plus court pour tous les nœuds, mais en pratique, cela devrait prendre beaucoup moins de temps. 

2
Grembo
  1. Répertoriez tous les nœuds possibles en tenant compte de chaque décision possible sur chaque carrefour (Mais comment le faire automatiquement?
  2. Utilisez l’algorithme de Dijkstra pour trouver la route la plus proche de tous les points.
  3. Visualiser les données. (C'est un peu délicat, car il peut y avoir une zone inaccessible dans la zone accessible.
0
Dolik