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