API Google Directions возвращает разные waypoint_order и ножки
Я разрабатываю систему для отслеживания маршрута с помощью API Карт Google.
У меня есть точки происхождения и назначения, и между этими точками есть некоторые путевые точки.
Проследив маршрут, 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/>');
Функция format()
- это моя функция для формата km..
Проблема заключается в том, что на некоторых маршрутах waypoint_order
показывает другой порядок, чем тот, что находится в legs
. Например:
Для данного маршрута route.legs[i]
возвращает порядок: 'waypoint 0, waypoint 1, waypoint 3, waypoint 2', но атрибут waypoint_order
возвращает [3, 0, 2, 1, 3]
Является ли это ожидаемым поведением, или я что-то здесь не вижу?
Ответы
Ответ 1
Является ожидаемым поведением, поскольку:
Если для optimizeWaypoints установлено значение true, это поле будет содержать переназначенную перестановку входных путевых точек. Например, если вход был: Происхождение: Лос-Анджелес Путевые точки: Даллас, Бангор, Феникс Пункт назначения: Нью-Йорк
и оптимизированный выход был заказан следующим образом: Происхождение: Лос-Анджелес Путевые точки: Феникс, Даллас, Бангор Пункт назначения: Нью-Йорк
то это поле будет массивом, содержащим значения [2, 0, 1]. Обратите внимание, что нумерация путевых точек основана на нуле.
Если какая-либо из входных путевых точек имеет остановку, установленную на false, это поле будет пустым, поскольку для таких запросов недоступна оптимизация маршрута.
Как указано здесь: DirectionsResult
Путь-точка - оптимизированный порядок
Ответ 2
Да, как указывает @sabotero, это ожидаемое поведение, но в этом нет ничего плохого или странного.
Когда optimizeWaypoints истинно, карта google пытается найти лучший порядок путевых точек, чтобы расстояние было минимальным. Например, вы можете добавить четыре местоположения: Афины-Нью-Йорк-Лондон-Лос-Анджелес, карта google найдет, что лучше сначала отправиться в Лондон, а затем в Нью-Йорк. Итак, вернемся в массив 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()
});
Ответ 3
Проведя полный рабочий день на этом, я, наконец, понял ошибку, которую я делал, и это было не из библиотеки Google.
Мне пришлось поместить 1-й маркер самостоятельно, а затем следовать за waypoint_order
, потому что Array
, который поставляется waypoint_order
, предназначен для путевых точек, которые исключают маркер позиции первого/начального/начального местоположения.
То, что я сделал, это взять мой существующий Array
объекта-маркера и перенести первый, а затем отсортировать Array
в соответствии с порядком, указанным в waypoint_order
, а затем перенести() первый маркер обратно в маркеры Array, К сожалению, я не могу поделиться точным кодом, потому что у нас есть обертка над Картами Google, и этот код здесь не имеет смысла.
Еще одна вещь, которую я обеспечил, заключалась в том, чтобы не помещать маркер на карту, пока я не отсортировал ее по waypoint_order Array
.
Ответ 4
Я использовал этот код для получения путевых точек, этот код работает нормально
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");
}