Google Directions API返回不同的waypoint_order和legs
Google Directions API return different waypoint_order and legs
我正在开发一个使用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");
}
- Css order属性不't在Jquery设置时更新
- Angular ng repeat order将多个字段作为一个字段
- Offset with Waypoint.Inview()
- MongoDB Querying: Order & Export Results
- SQL应该查询's ORDER BY列写入JS代码中
- Waypoint的循环,退出循环后属性未定义
- 使用js:order<创建表时出现问题;tr>并且<td>
- AngularJs ng-repeat order通过不适用于嵌套对象属性
- RequireJS plugin( order.js )
- Javascript/JQuery Execution order
- order通过不使用带有破折号的对象名称的angularjs工作
- Javascript Q Promise Sequence Order with Arguments
- Order ofQuery with AJAX PHP and MySQL
- 从表格中选择PayPal或Purchase Order
- Titanium sqlite ORDER BY statement
- Angularjs: Order and Filter by array intersect
- Angularjs order通过对问题进行排序,即在8之前对10进行排序
- Order MouseUp Event
- Waypoint.js:当距离顶部N距离时添加类
- Javascript - order of OnClick