Google карты с геокодированием

1

Привет, я использую 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 - это массив адресов

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

  • 0
    Gmaps4rails также отображает полилинии
Теги:
google-maps
maps
google-geocoder

2 ответа

1
Лучший ответ

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

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

ОБНОВИТЬ:

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
    Вы правы, это проблема, но сортировка не решает проблему. Маршруты не отображаются должным образом, потому что мой массив содержит широты и долготы.
  • 0
    Могу ли я сделать ожидание вызова геокодирования, пока он не вернет первый ответ.
Показать ещё 3 комментария
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню