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_order
attribute 返回 [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.legs
Athens-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.DirectionsRequest
的optimizeWaypoints
属性设置为false
好的,我想插入我要去的地方、起点、目的地和停靠点。我希望谷歌为我优化路线。这已经完成,我插入数据,谷歌返回最佳顺序,因为 optimizeWaypoints 是真的。我有一个名为order的隐藏字段,他的值是按照点'waypoint_order'的顺序插入的,只是这个顺序不等于地图上标注的点,或者与我的'response.routes [0 ]。腿....'返回。
你能举一个有这种行为的例子
我的始发地和目的地邮编是一样的,我的断点有什么变化。我有一个循环来显示我的路线,在上面的代码中。 “i = 0, i 以上是关于Google Directions API 返回不同的 waypoint_order 和 leg的主要内容,如果未能解决你的问题,请参考以下文章
当我在 url 中使用波斯语单词时,Google Directions API 中转总是返回“ZERO_RESULTS”
Google Maps API [Directions API] 航点限制?
Google Maps API DirectionsService.route 与 Google Maps Directions 不同