Google Directions API返回不同的waypoint_order和leg

时间:2013-12-06 20:33:43

标签: javascript jquery google-maps google-maps-api-3

我正在开发一个使用Google Maps API追踪路线的系统。 我有原点和目的地,在这些点之间有一些路标。 通过跟踪路线,Google会返回最佳路线并在地图上标记这些点。 我们在div中显示路径数据。 我的计算路径的函数,返回数据的部分如下所示:

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/>');

function format()是格式km的函数。

问题是,在某些路线上,waypoint_order显示的顺序与legs中的顺序不同。例如:

对于给定的路线,route.legs[i]返回顺序:'航路点0,航点1,航路点3,航点2',但waypoint_order属性返回[3,0,2,1,3] ]

这是预期的行为,还是我错过了什么?

4 个答案:

答案 0 :(得分:9)

是预期的行为,因为:

如果optimizeWaypoints设置为true,则此字段将包含输入路点的重新排序的排列。例如,如果输入是:   原产地:洛杉矶
   Waypoints:达拉斯,班戈,菲尼克斯   目的地:纽约 并且优化的输出按如下顺序排列:   原产地:洛杉矶    Waypoints:凤凰城,达拉斯,班戈   目的地:纽约 那么这个字段将是一个包含值[2,0,1]的数组。请注意,航点的编号从零开始。 如果任何输入航路点的中途停留设置为false,则此字段将为空,因为路由优化不适用于此类查询。

如上所述:DirectionsResult

waypoint_order是优化顺序

答案 1 :(得分:4)

是的,正如@sabotero指出的那样,这是一种预期的行为,但没有任何错误或奇怪。

当optimizeWaypoints为true时,谷歌地图会尝试找到最佳的航点顺序,以使距离最小。例如,您可以添加四个位置:雅典 - 纽约 - 伦敦 - 洛杉矶谷歌地图将发现最好先去伦敦,然后去纽约。所以将返回数组let paragraphs = _.get(response, 'blog.paragraphs', null); if (!paragraphs) { // Couldn't get from response. } else { // Do something with response.blog.paragraphs. } 雅典 - 伦敦 - 纽约 - 洛杉矶和route.legs将返回[1,0](只有两个,因为没有出发地和目的地)通知你原来的地点的顺序有变化。这意味着在第一个位置(waypoint_order [0])将是伦敦的第二个(返回1)位置,而在第二个位置(waypoint_order [1])将是纽约的第一个位置(返回0)。

请注意,原点和目的地永远不会改变位置,您总是从您放置的原点开始,最终到达您放置的目的地。这就是为什么在waypoint_order中不出现原点和目的地。因此,如果您在请求之前有相同的标记并想要更改订单,则在重新排序时必须排除原点和目的地,这两个将处于相同的位置。

现在,如果您只想从请求中绘制标记,请不要使用路标,而是使用路径支路。

我做了一个例子,您可以使用复选框启用或禁用优化,您可以看到标记的标签始终以正确的顺序出现: http://jsfiddle.net/TomKarachristos/03wtc6jv/

waypoint_order

答案 2 :(得分:1)

在对此工作了整整一天之后,我终于弄清楚我正在犯的错误,而不是来自谷歌图书馆。

我必须自己放置第一个标记,然后按照waypoint_order进行操作,因为Array提供的waypoint_order用于排除第一个/初始/原点位置的航点标记

我所做的是获取我现有的Array标记对象并移动第一个,然后根据Array中给出的顺序对waypoint_order进行排序,然后取消第一个标记返回标记数组。不幸的是,我无法分享确切的代码,因为我们在Google地图上有一个包装器,而这里的代码没有任何意义。

我确保的另一件事是在我已根据waypoint_order Array排序之前不在地图上放置任何标记。

答案 3 :(得分:0)

我使用此代码获取方式点,此代码正常工作

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