我正在开发一个使用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] ]
这是预期的行为,还是我错过了什么?
答案 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");
}