Google карты с геокодированием - PullRequest
1 голос
/ 11 августа 2011

Привет! Я использую Google Map Javascript API V3

Вот мой код для рисования полилиний.

for(var i=0; i < addressArr.length; i++){
     geocoder.geocode( { 'address': addressArr[i]}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {

        point = results[0].geometry.location;
        place.push(results[0].address_components[1].long_name);

        flightPlanCoordinates.push(point);
        if(flightPlanCoordinates.length == addressArr.length){
        flightPath = new google.maps.Polyline({path: flightPlanCoordinates,strokeColor: "#FF0000",strokeOpacity: 0.50,strokeWeight: 2 });
        flightPath.setMap(map);
        }

addressArr это массив адресов

Проблема заключается вв моих flightPlanCoordinates они расположены не в том порядке, в котором я передаю addressArr из цикла for.
предположим, что я передаю addressArr = [1,2,3,4], мой flightPlanCoordinates становится [2,3,1, 4].Можно ли подсказать, что происходит.

Ответы [ 2 ]

1 голос
/ 11 августа 2011

Это просто потому, что внутри цикла вы делаете асинхронный вызов (geocoder.geocode), для выполнения которого требуется разное количество времени. Поэтому предположим, что геокодирование второго элемента массива занимает 1 секунду, а геокодирование первого элемента - 3 секунды. Тогда очевидно, что функция обратного вызова второго элемента будет вызываться перед первым и, таким образом, будет помещать ее в flightPlanCoordinates в первой позиции.

Просто вызовите метод sort () для массива внутри второго оператора if в вашем коде, чтобы решить проблему.

UPDATE:

var i = 0;
function geocode(){
    geocoder.geocode({
        'address': addressArr[i]
    },
    function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            point = results[0].geometry.location;
            place.push(results[0].address_components[1].long_name);
            flightPlanCoordinates.push(point);
            i++;
            if(addressArr[i] != null)
                geocode();

            if (flightPlanCoordinates.length == addressArr.length) {
                flightPath = new google.maps.Polyline({
                    path: flightPlanCoordinates,
                    strokeColor: "#FF0000",
                    strokeOpacity: 0.50,
                    strokeWeight: 2
                });
                flightPath.setMap(map);
            }
        }
    }
}
geocode();
0 голосов
/ 11 августа 2011

Не слишком уверен, почему он возвращает такие значения, но вы можете просто отсортировать массив, и это решит вашу проблему.flightPlanCoordinates.sort ();

...