возвращение объекта местоположения GMap из функции - PullRequest
0 голосов
/ 21 июня 2011

Я пытаюсь сделать простую функцию геокодирования для инструмента карты. Я получаю геокод в порядке, но надеюсь передать объект местоположения обратно в качестве возвращаемого значения для функции геокода.

Примерно так:

function codeAddress(address) {
    geocoder.geocode( { 'address': address}, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            var location = results[0].geometry.location;
            console.dir(location);
            return location;
        } else {
            return false;
        }
    });
}

console.dir элемента location показывает ожидаемый объект location, поэтому функция вызывается и успешно возвращает данные.

эта функция вызывается другим процессом, который затем строит маркеры.

if (coordinates = codeAddress(myaddress){
    // do stuff
}

Однако переменная coordinates всегда оценивается как неопределенная, поэтому условие "делать вещи" никогда не выполняется.

Я знаю, что, возможно, мне не хватает чего-то действительно очевидного в определении координат var, но я не уверен, что это такое.

Спасибо за помощь.

Базовый код по адресу: http://jsfiddle.net/2TXZ4/3/ хотя карта по какой-либо причине не рисуется.

Ответы [ 2 ]

0 голосов
/ 22 июня 2011

Метод geocode является асинхронным, поэтому вам нужно выполнить любую обработку в обратном вызове, который вы предоставляете этому методу, или вы можете предоставить обратный вызов к вашему codeAddress методу, как этот похожий вопрос / ответ описывает ( Каквернуть переменную из функции обратного вызова геокодера JavaScript Google Maps? ).В приведенном ниже коде я переместил то, что вы делали в функции doStuff, в функцию обратного вызова функции geocode - она ​​должна работать, но я не могу проверить ее с помощью предоставленной вами ссылки jfiddle (возможно, из-за Google Maps)API ключи).Надеюсь, это поможет!

function codeAddress(address) {
    geocoder.geocode({
        'address': address
    }, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            var location = results[0].geometry.location;
            console.log(location);
            map.setCenter(location);
            var marker = new google.maps.Marker({
                map: map,
                position: location
            });
        } else {
            alert("Geocode was not successful for " + address);
        }
    });
}


window.doStuff = function() {
    var address = document.getElementById("address").value;
    codeAddress(address);
}
0 голосов
/ 21 июня 2011

if (coordinates = codeAddress(myaddress) - это задание, а не сравнение.

Хорошо, вот дикий взлом (это работает):

 <script type="text/javascript"> var geocoder; var loc; var l = false;  
 function  initialize() {

 geocoder = new google.maps.Geocoder();

 var mapDiv = document.getElementById('map_canvas');
     map = new google.maps.Map(mapDiv, {
      center: new google.maps.LatLng(-34.397, 150.644),
      zoom: 8,
       mapTypeId: google.maps.MapTypeId.ROADMAP
    });      }


function codeAddress(address) {
geocoder.geocode({
    'address': address
}, function(results, status) {
    if (status == google.maps.GeocoderStatus.OK) {
        loc = results[0].geometry.location;             l = true;
        console.log(loc);           //alert (loc);
        //return loc;       doStuff(loc)
    } else {
        return false;
    }
}); }


 function doStuff(geo_marker){ if(l==false){
var thisaddress = document.getElementById("address").value;
var myResult = codeAddress(thisaddress); }else{

if (loc) {
    map.setCenter(loc);
    var marker = new google.maps.Marker({
        map: map,
        position: loc
    });
 l = false;  //important to use function more than once :))
} else {
    alert("Geocode was not successful");
}   }

};

google.maps.event.addDomListener(window, 'load', initialize); 
</script>



 <body>
 <div>
 <input id="address" type="textbox" value="Sydney, NSW">
 <input type="button" value="Geocode" onclick="window.doStuff()">
 </div>
 <div id="map_canvas" style="height:600px; width: 500px; position: absolute; 
  top: 80px">    </div> 

 </body>

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

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