2012-05-20 4 views
2

У меня странная проблема с Google Maps DirectionsService. Он возвращает мне разные маршруты, если входные данные одинаковы. Вот пример моего кодаПочему Google Maps DirectionsService возвращает разные маршруты?

var path = []; 
path.push(new google.maps.LatLng(51.10600101811778, 17.025117874145508)); 
path.push(new google.maps.LatLng(51.1047951799623,17.02278971672058)); 
path.push(new google.maps.LatLng(51.10456276619924, 17.02208161354065)); 
path.push(new google.maps.LatLng(51.10131895649719, 17.029248476028442)); 
path.push(new google.maps.LatLng(51.100331957810134, 17.033969163894653)); 
path.push(new google.maps.LatLng(51.10001867395775, 17.032413482666016)); 

for (var i = 0; i <path.length-1; i++) { 
    var request = { 
     origin: path[i], 
     destination: path[i+1], 
     travelMode: google.maps.DirectionsTravelMode.WALKING 
    } 

    directionsService.route(request, function(results, status) { 
     if (status == google.maps.DirectionsStatus.OK) { 
      selected_path = selected_path.concat(results.routes[0].overview_path); 
      poly.setPath(selected_path); 
      poly.setMap(map); 
     } 
    }) 
} 

Первый раз после вызова, функция рисует странную ломаную линию, которая всегда соединяет начальную точку с конечной точкой:

Второй раз он называется функция работает хорошо и маршрут рисуется правильно:

Это только пример ввода статических данных. Обычно я работаю с динамическими данными по матричным и динамическим маркерам, но всегда то же самое происходит. Во-первых, начальная точка связана с конечной точкой + странным соединением между другими точками. Вторая функция вызова работает хорошо. Кто-нибудь из вас знает, как решить эту проблему?

ответ

6

Это только предположение: я верю, что происходит путь, который конкатенационируется не по порядку, потому что запросы направлений асинхронны. (Данные не обязательно возвращаются в порядке). То, что я сделал ниже, - разместить каждую ветвь направлений по порядку в массиве, затем сгладить массив в непрерывный список и отобразить только после успешного возвращения правильного количества запросов.

Я не мог воспроизвести ваш зигзаг, поэтому я точно не знаю, действительно ли этот ответ решит проблему.

// count number of directions requests that returned successfully 
var count = 0; 

for (var i = 0; i <path.length-1; i++) { 
    var request = { 
    origin: path[i], 
    destination: path[i+1], 
    travelMode: google.maps.DirectionsTravelMode.WALKING 
    }; 

    // introduce variable scope to preserve value of i 
    (function(i) { 
    directionsService.route(request, function(results, status) { 
     if (status == google.maps.DirectionsStatus.OK) { 
     selected_path[i] = results.routes[0].overview_path; 
     count++; 

     // draw path only if all segments are completed 
     if(count == path.length-1) { 
      //flatten selected_path into 1-d array 
      selected_path = Array.prototype.concat.apply([], selected_path); 
      poly.setPath(selected_path); 
      poly.setMap(map); 
     } 
     } 
    }); 
    })(i); 
} 
+0

Это действительно работает, отличный ответ! :) :) – Martus0

+0

Я заметил, что иногда, когда я устанавливаю свои маркеры, google.maps.DirectionsStatus не в порядке, а полилиния не нарисована, возможно, она связана с ходячим режимом. Я проверю его с режимом движения. – Martus0

+0

Режим вождения всегда в порядке. – Martus0

0

У меня была та же проблема. Вы можете вызвать функцию таймером и установить ее на 250 миллисекунд, чтобы дать вам лучший результат. Когда вы вызываете услугу по циклу «для», эта проблема будет иметь место.

Вот метод:

//Counter for timer. 
var counter2 = 0; 

//Set a timer to pass latitude and longitude values to "draw_line()" function. 
var timer = setInterval(function(){draw_way(new google.maps.LatLng(arrayLatitude[counter2], arrayLongitude[counter2])); 

counter2 = counter2 + 1; 

//Check if calue of timer is > "arrayLatitude.length" because if it becomes bigger it can't draw the way. 


if(counter2 >= arrayLatitude.length) 
{ 
    clearInterval(timer); 


} 
}, 250); 
+0

Это сервис Google (маршрут): draw_way (новый google .maps.LatLng (arrayLatitude [counter2], arrayLongitude [counter2]) – UserMat