Google Directions API返回不同的waypoint_order和legs

Google Directions API return different waypoint_order and legs

本文关键字:waypoint order legs Directions API 返回 Google      更新时间:2024-04-22

我正在开发一个使用Google Maps API跟踪路线的系统。我有起点和终点,在这些点之间有一些路点。通过追踪路线,谷歌会给我返回最佳路线,并在地图上标记这些点。我们在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/>');

函数format()是我对格式km..的函数

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

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

这是预期的行为,还是我遗漏了什么?

是预期的行为,因为:

如果optimizeWaypoints设置为true,则此字段将包含输入waypoints的重新排序排列。例如,如果输入为:产地:洛杉矶
航路点:达拉斯、班戈、菲尼克斯目的地:纽约并且优化的输出被排序如下:产地:洛杉矶航路点:菲尼克斯、达拉斯、班戈目的地:纽约则该字段将是一个包含值[2,0,1]的数组。请注意,路点的编号是以零为基础的。如果任何输入航路点的中途停留设置为false,则此字段将为空,因为路线优化不适用于此类查询

如上所述:方向结果

waypoint_order是优化的订单

是的,正如@stobero所指出的,这是一种预期的行为,但这并没有什么错或奇怪的。

当optimizeWaypoints为真时,谷歌地图会试图找到最佳的路点顺序,使距离最小。例如,你可以添加四个地点:雅典-纽约-伦敦-洛杉矶。谷歌地图会发现,最好先去伦敦,然后再去纽约。因此,将在数组route.legs中返回雅典-伦敦-纽约-洛杉矶,在waypoint_order中返回[1,0](因为没有原点和目的地,所以只有两个),以通知您原始位置顺序发生了更改。这意味着在第一个位置(waypoint_order[0])将是伦敦的第二个(返回1)位置,而在第二个位置(waypoint_order[1])将是纽约的第一个(返回0)位置。

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

现在,如果你只想从请求中绘制标记,不要使用航路点,而是使用航段。

我举了一个例子,你可以用复选框启用或禁用优化,你可以看到标记的标签总是以正确的顺序出现: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()
  });

在花了整整一个工作日的时间之后,我终于发现了我犯的错误,它不是来自谷歌库。

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

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

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

我用这个代码来获取路线点,这个代码正常工作

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