Вывод ответа геокодирования Google из API карт Google - PullRequest
1 голос
/ 02 мая 2011

Я использую сервис геокодирования Google, как описано здесь (http://code.google.com/apis/maps/documentation/javascript/services.html#Geocoding)

Я пытаюсь получить результат во внешнюю переменную, но продолжаю получать "undefined".

Вот мойкод:

localPoint = new google.maps.Geocoder();

output = localPoint.geocode( { 'address': "1009 south 10th Ave, Kelso WA 98626"}, function(results, status) {
  if (status == google.maps.GeocoderStatus.OK) {
        return results[0].geometry.location;
    } else {
        alert("Geocode was not successful for the following reason: " + status);
    }
});
alert(output)

* (обновлено) - в идеале я бы мог обернуть его в функцию, чтобы я мог просто вернуть результаты, как это:

localPoint = new google.maps.Geocoder();

function codeAddress(this_address) {
    localPoint.geocode( 
        { 'address': this_address}, 
            function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                return results[0].geometry.location;
            } else {
                alert("Geocode was not successful for the following reason: " + status);
            }
        }
    );
}

1 Ответ

4 голосов
/ 03 мая 2011

Вы возвращаете переменную в обратном вызове - но куда идет этот возврат? output не определено, потому что вы предупреждаете об этом сразу после вызова localPoint.geocode (), который может НЕ завершиться. Следовательно, вам нужно разместить свое оповещение (и, как правило, ЛЮБОЙ код, который зависит от результата) ВНУТРИ вашего обратного вызова:

localPoint = new google.maps.Geocoder();

localPoint.geocode( { 'address': "1009 south 10th Ave, Kelso WA 98626"}, function(results, status) {
  if (status == google.maps.GeocoderStatus.OK) {
        var output=results[0].geometry.location;
        alert(output);
    } else {
        alert("Geocode was not successful for the following reason: " + status);
    }
});

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

function processResults(location){

   //do stuff with a successful geocode here

}

localPoint = new google.maps.Geocoder();

localPoint.geocode( { 'address': "1009 south 10th Ave, Kelso WA 98626"}, function(results, status) {
  if (status == google.maps.GeocoderStatus.OK) {
        processResults(results[0].geometry.location);
    } else {
        alert("Geocode was not successful for the following reason: " + status);
    }
});

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

ОБНОВЛЕНИЕ: хорошо, я взглянул на код, на который вы ссылались. Вы пытаетесь геокодировать в цикле. Может быть сделано с несколькими изменениями в вашем коде. В частности, вам нужно будет внести следующие изменения:

function codeAddress(this_address,index,callback) {
    geocoder.geocode( { 'address': this_address}, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            callback.call(window,index,results[0].geometry.location)
        } else {
            alert("Geocode was not successful for the following reason: " + status);
        }
    });
}

и цикл будет выглядеть так:

for (var i = 0; i < businesses.length; i++) {
        //var point = new google.maps.LatLng(businesses[i].lat,businesses[i].lng);
        codeAddress(businesses[i].address,i,function(i,point){
             var description = businesses[i].description;

            if(businesses[i].business_type == "Wine"){
                //http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=A|00CC99|000000
                var icon = 'http://google-maps-icons.googlecode.com/files/wineyard.png';
            }else if(businesses[i].business_type == "Golf"){
                var icon = 'http://google-maps-icons.googlecode.com/files/golf.png';
            }else{
                var icon = 'http://google-maps-icons.googlecode.com/files/festival.png';
            }
            var marker = createMarker(point,businesses[i].name,description,icon);


        });
     }

Вот рабочий пример

Все в цикле должно быть включено в обратный вызов, чтобы он работал после успешного геокодирования.

По сути, мы передаем текущий индекс и обратный вызов в функцию геокодирования. Внутри обратного вызова геокода мы вызываем нашу функцию обратного вызова (все внутри вашего исходного цикла) в глобальном контексте (первая переменная - это контекст, внутри которого будет выполняться функция - мы используем window, чтобы она имела доступ ко всем вашим глобально определенные переменные). Мы также передаем точку обратному вызову и текущему индексу, потому что мы не знаем, когда будет выполнен обратный вызов, и поэтому мы должны убедиться, что у него есть все, что ему нужно при запуске. Если мы не передадим индекс, цикл завершится, и тогда все, что заканчивается i, будет использовано в операторах, которые зависят от него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...