2011-08-24 47 views
2

好吧,我與Google Maps API v3鬼混,我遇到了一個問題。我不知道它的API或只是我犯的一些JS錯誤。谷歌地圖API地理編碼功能問題

問題: addMarkerFromAdress()函數調用geocodeFromAdress()返回的座標返回到addMarkerFromAdress()。但返回的值是「undefined」。

作爲一個調試我添加了兩個警報輸出,一個在addMarkerFromAdress()和一個在geocodeFromAdress()。讓我感到困擾的是,addMarkerFromAdress()中的alert()似乎在返回任何值之前觸發。爲什麼?

來源:

<script type="text/javascript"> 
    var geocoder; 
    var map; 

    function initializeGoogleMaps() { 

    geocoder = new google.maps.Geocoder(); 
    var latlng = new google.maps.LatLng(0, 0); 
    var myOptions = { 
     zoom: 1, 
     center: latlng, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    } 

    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 

    } 

    function geocodeFromAdress(address) { 
    geocoder.geocode({ 'address': address}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
     var latLng = results[0].geometry.location; 
     alert(latLng); //Outputs coordinates, but is for some reason outputted 2nd 
     return latLng; 
     } else { 
     alert("Geocode was not successful for the following reason: " + status); 
     } 
    }); 
    } 

    function addMarkerFromAdress(address, title){ 

    var latLng = geocodeFromAdress(address); 
    alert(latLng); //Outputs "undefined", but is for some reason outputted 1st 
    map.setCenter(latLng); 
     var marker = new google.maps.Marker({ 
      map: map, 
      position: latLng 
    }); 

    } 

    window.onload = function() { 
    initializeGoogleMaps(); 
    addMarkerFromAdress('Berlin, Germany', 'Berlin'); 
    } 
</script> 

回答

4

請參閱函數作爲第二個參數傳遞geocoder.geocode()?那就是你應該打電話給addMarkerFromAddress的地方。由於地理編碼請求的異步性質,var latLng = geocodeFromAdress(address);之後的alert在響應以緯度長的值返回之前觸發。

像這樣的事情應該去做

<script type="text/javascript"> 
    var geocoder; 
    var map; 

    function initializeGoogleMaps() { 

    geocoder = new google.maps.Geocoder(); 
    var latlng = new google.maps.LatLng(0, 0); 
    var myOptions = { 
     zoom: 1, 
     center: latlng, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    } 

    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 

    } 

    function geocodeFromAdress(address, title) { 
    geocoder.geocode({ 'address': address}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
     var latLng = results[0].geometry.location; 
     addMarkerFromAdress(latLng, title); 
     } else { 
     alert("Geocode was not successful for the following reason: " + status); 
     } 
    }); 
    } 

    function addMarkerFromAdress(latLng, title){ 
    map.setCenter(latLng); 
    var marker = new google.maps.Marker({ 
     map: map, 
     position: latLng 
    }); 
    } 

    window.onload = function() { 
    initializeGoogleMaps(); 
    geocodeFromAdress('Berlin, Germany', 'Berlin'); 
    } 
</script> 
+0

所以我不能只是得到地理編碼器的座標?我必須在相同的功能中實際使用它們。 – jamietelin

+0

不符合你編碼的方式。您可以從地理編碼器獲取座標,但不知道它們何時將被返回,因此您需要編寫代碼,以便在返回時將它們傳遞給'addMarkerFromAdress'函數以放置點地圖。 –

+0

那麼我可能有'geocodeFromAdress()'裏面的所有代碼?我仍然不能喘口氣,爲什麼在geocodeFromAdress()返回一個值之前,addMarkerFromAdress()繼續。當然,我明白你說的話,看起來沒錯,但我仍然不明白:P – jamietelin