Google Directions API retourne waypoint_order et jambes différentes

Je développe un système pour tracer un itinéraire à l'aide de l'API Google Maps. J'ai les points d'origine et de destination et, entre ces points, il existe des points de cheminement. En parcourant l'itinéraire, Google me retourne la meilleure route et marque ces points sur la carte. Nous affichons les données d'itinéraire dans une division. Ma fonction qui calcule l'itinéraire, la partie qui retourne les données ressemble à ceci:

directionsService.route(request, $.proxy(function(response, status){ if (status == google.maps.DirectionsStatus.OK) { directionsDisplay.setDirections(response); var orders = response.routes[0].waypoint_order; var route = response.routes[0]; var total_distance = 0; var displayRoute = $('#detail-route'); for (i = 0; i < route.legs.length; i++){ var routeSegment = i + 1, from_address = route.legs[i].start_address.split(','), to_address = route.legs[i].end_address.split(','); total_distance += Math.floor(route.legs[i].distance.value / 1000); displayRoute.append('<b>Trecho ' + routeSegment + ': </b><br/>'); displayRoute.append('<b>Saindo de: </b>' + from_address[0] + '<br/>'); displayRoute.append('<b>Indo para: </b>' + to_address[0] + '<br/>'); displayRoute.append('<b>Distância: </b>' + route.legs[i].distance.text); } displayRoute.prepend('total:' + this.format(total_distance) + ' km' + '<br/><br/>'); 

format() fonction format() est ma fonction pour le format km ..

Le problème est que, sur certaines routes, le waypoint_order montre un ordre différent de celui des legs . Par exemple:

Pour un itinéraire donné, l' route.legs[i] renvoie l'ordre: 'waypoint 0, waypoint 1, waypoint 3, waypoint 2', mais l'attribut waypoint_order retourne [3, 0, 2, 1, 3]

Est-ce le comportement attendu, ou est-ce que je manque quelque chose ici?

Est-ce qu'un comportement attendu depuis:

Si optimiserWaypoints a été défini sur true, ce champ contiendra la permutation ré-commandée des waypoints d'entrée. Par exemple, si l'entrée était: Origine: Los Angeles
Waypoints: Dallas, Bangor, Phoenix Destination: New York et la sortie optimisée a été commandée comme suit: Origine: Los Angeles Waypoints: Phoenix, Dallas, Bangor Destination: New York, alors ce champ sera un tableau contenant les valeurs [2, 0, 1]. Notez que la numérotation des waypoints est basée sur zéro. Si l'un des points d'entrée entrés par une étape définie sur false, ce champ sera vide, car l'optimisation de route n'est pas disponible pour ces requêtes.

Comme indiqué ici: DirectionsResult

Le waypoint_order est l'ordre optimisé

Après avoir passé une journée de travail complète à ce sujet, j'ai finalement compris l'erreur que je faisais et ce n'était pas de la bibliothèque Google.

J'ai dû placer le 1er marqueur par moi-même et ensuite suivre le waypoint_order car le Array fourni par waypoint_order correspond aux waypoints qui excluent le premier marqueur de position initiale / origine.

Ce que j'ai fait était de prendre mon Array de l'objet de marqueur et de décaler le premier, puis trier le Array selon l'ordre donné dans waypoint_order puis désélectionner le premier marqueur vers le tableau des marqueurs. Malheureusement, je ne peux pas partager le code exact parce que nous avons un wrapper sur Google Maps et que ce code n'aurait aucun sens.

Une autre chose que je me suis assurée n'était pas de placer un marqueur sur la carte jusqu'à ce que j'ai déjà trié selon la waypoint_order Array .

Oui, comme le souligne @sabotero, c'est un comportement attendu, mais il n'y a rien de mal ou d'étrange à ce sujet.

Lorsque optimiserWaypoints est vrai, google map tente de trouver le meilleur ordre de waypoints afin que la distance soit minimale. Par exemple, vous pouvez ajouter quatre emplacements: Athens-NewYork-London-Los Angeles, la carte Google trouvera qu'il vaut mieux aller à Londres et après New York. Donc, retourneront dans le tableau route.legs Athens-London-NewYork-Los Angeles et dans waypoint_order retourneront [1, 0] (seulement deux parce que c'est sans origine et destination) pour vous informer que l'ordre original des emplacements a changé. Cela signifie que dans la première position (waypoint_order [0]) sera le deuxième (retour 1) emplacement qui est Londres et dans la deuxième position (waypoint_order [1]) sera le premier emplacement (retourne 0) qui est New York.

Notez ici que l'origine et la destination ne changent jamais de position, vous commencez toujours à partir de l'origine que vous avez créée et vous vous retrouvez dans une destination que vous mettez. C'est pourquoi, dans waypoint_order, n'apparaissent pas l'origine et la destination. Donc, si vous avez les mêmes marqueurs avant la demande et souhaitez modifier la commande, vous devez exclure l'origine et la destination lorsque vous réorganisez, ces deux seront dans la même position.

Maintenant, si vous souhaitez simplement dessiner les marqueurs de la demande, n'utilisez pas le waypoint mais faites passer les jambes.

J'avais fait un exemple, vous pouvez activer ou désactiver l'optimisation avec une case à cocher et vous pouvez voir que toujours les étiquettes des marqueurs sortent avec le bon ordre: http://jsfiddle.net/TomKarachristos/03wtc6jv/

  var marker = new google.maps.Marker({ //first, position: route.legs[0].start_location, map: map, label: (0).toString() }); for (var i = 1; i < route.legs.length; i++) { var marker = new google.maps.Marker({ position: route.legs[i].start_location, map: map, label: i.toString() }); } var marker = new google.maps.Marker({ //last one position: route.legs[route.legs.length - 1].end_location, map: map, label: route.legs.length.toString() }); 

J'ai utilisé ce code pour obtenir des points forts, ce code fonctionnant correctement

 var rleg = directionsDisplay.directions.routes[0].legs[0]; // get way points from route var w = [], wp; wp = rleg.via_waypoints for (var i = 0; i < wp.length; i++) { w[i] = { lat : wp[i].lat().toFixed(6), lng : wp[i].lng().toFixed(6) }; } if (w.length !== 0) { route.wayPoints = JSON.stringify(w); } else { console.log("no way points"); }