Google Directions API 返回不同的 waypoint_order 和 leg

Posted

技术标签:

【中文标题】Google Directions API 返回不同的 waypoint_order 和 leg【英文标题】:Google Directions API return different waypoint_order and legs 【发布时间】:2013-12-24 08:17:40 【问题描述】:

我正在开发一个使用 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/>');

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

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

对于给定的路线,route.legs[i] 返回顺序:'waypoint 0, waypoint 1, waypoint 3, waypoint 2',但 waypoint_orderattribute 返回 [3, 0, 2, 1, 3]

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

【问题讨论】:

那个 waypoint_order 真的是[3, 0, 1, 3] 还是你的错字?即它缺少航路点#2?还是您的意思是输入类似[3, 0, 1, 2] 的内容? 这是一个错字,现已更正。谢谢。 我们可以见google.maps.DirectionsRequest对象吗? 面对同样的问题,附上谷歌如何绘制它与我用航点顺序绘制它时得到的链接imgur.com/a/p8DdL 你不能使用 waypoint_order 来渲染你的标记。看看我的回答,我有一个可行的例子。 【参考方案1】:

我使用此代码获取航路点,此代码工作正常

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

【讨论】:

【参考方案2】:

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

当 optimizeWaypoints 为真时,谷歌地图会尝试找到最佳的航点顺序,以使距离最小。例如,您可以添加四个地点:雅典-纽约-伦敦-洛杉矶,谷歌地图会发现最好先到伦敦再到纽约。所以会在数组route.legsAthens-London-NewYork-Los Angeles 和waypoint_order 中返回[1, 0](只有两个,因为没有起点和终点)通知你原来的位置顺序有改变。这意味着在第一个位置(waypoint_order[0])将是伦敦的第二个(返回 1)位置,在第二个位置(waypoint_order[1])将是纽约的第一个位置(返回 0)。

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

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

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

【讨论】:

【参考方案3】:

在花了整整一天的时间之后,我终于弄清楚了我犯的错误,它不是来自 Google 图书馆。

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

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

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

【讨论】:

【参考方案4】:

是预期的行为,因为:

如果将 optimizeWaypoints 设置为 true,则此字段将包含输入航点的重新排序排列。例如,如果输入是: 始发地:洛杉矶航点:达拉斯、班戈、凤凰城 目的地:纽约 优化后的输出排序如下: 产地:洛杉矶 航点: 凤凰城、达拉斯、班戈 目的地:纽约 那么这个字段将是一个包含值 [2, 0, 1] 的数组。请注意,航点的编号是从零开始的。 如果任何输入航点的 stopover 设置为 false,则此字段将为空,因为此类查询无法使用路线优化。

如此处所述:DirectionsResult

waypoint_order 是优化后的顺序

【讨论】:

好的,我做到了,我的问题是数据不相等。问题是 waypoint_order 返回地图上标记的不同顺序,已经优化。 是的,如果您想要通过的确切顺序,请将google.maps.DirectionsRequestoptimizeWaypoints 属性设置为false 好的,我想插入我要去的地方、起点、目的地和停靠点。我希望谷歌为我优化路线。这已经完成,我插入数据,谷歌返回最佳顺序,因为 optimizeWaypoints 是真的。我有一个名为order的隐藏字段,他的值是按照点'waypoint_order'的顺序插入的,只是这个顺序不等于地图上标注的点,或者与我的'response.routes [0 ]。腿....'返回。 你能举一个有这种行为的例子 我的始发地和目的地邮编是一样的,我的断点有什么变化。我有一个循环来显示我的路线,在上面的代码中。 “i = 0, i

以上是关于Google Directions API 返回不同的 waypoint_order 和 leg的主要内容,如果未能解决你的问题,请参考以下文章

当我在 url 中使用波斯语单词时,Google Directions API 中转总是返回“ZERO_RESULTS”

Google Directions API未授权访问iOS

Google Maps API [Directions API] 航点限制?

Google Maps API DirectionsService.route 与 Google Maps Directions 不同

如何从 Google Maps Directions Api 获取折线

如何让 Google Maps Directions API 选择正确的机场?