2010-11-09 145 views
5

我想使用谷歌地理編碼器API V3根據用戶指定的地址在地圖上繪製位置,代碼如下。谷歌地圖地理編碼API V3不返回結果在JavaScript函數

當我直接發出請求(例如到http://maps.googleapis.com/maps/api/geocode/json?address=peterborough&sensor=false)時,我收到了預期的響應。但是,使用下面的代碼發出相同的請求時,getLatLong函數退出後,變量中點始終未定義。

我在做什麼不正確?

function loadFromSearch(address) 
{ 
    midpoint = getLatLong(address); 
    mapCentre = midpoint; 
    map.setMapTypeId(google.maps.MapTypeId.ROADMAP); 
    ... 
} 


function getLatLong(address) 
{ 
    var result; 
    var url = 'http://maps.googleapis.com/maps/api/geocode/json?address=' + encodeURIComponent(address) + '&sensor=false' 
    $.getJSON(url, 
    function (data){ 
    if (data.status == "OK") 
    { 
     result = data.results[0].geometry.location; 
    } 
    }); 
    return result; 
} 

=========================================== =======================================

根據反應,我有現在將代碼更新爲以下內容。我仍然沒有得到任何結果,但在Firebug中設置了斷點result = data.results [0] .geometry.location;永遠不會被擊中。

function loadFromSearch(address) 
{ 
    midpoint = getLatLong(address, loadWithMidpoint);  
} 

function getLatLong(address, callback) 
{ 
    var result; 
    var url = 'http://maps.googleapis.com/maps/api/geocode/json?address=' + encodeURIComponent(address) + '&sensor=false' 
    $.getJSON(url,{}, 
    function (data) { 
    if (data.status == "OK") 
    { 
     result = data.results[0].geometry.location; 
     callback(result); 
    } 
    }); 
} 

function loadWithMidpoint(centre) 
{ 
    mapCentre = centre; 
    map.setMapTypeId(google.maps.MapTypeId.ROADMAP); 
    ... 
} 

=========================================== ==================================

我擁有它!最終的代碼如下所示:

function loadFromSearch(coordinates, address) 
{ 
    midpoint = getLatLong(address, latLongCallback); 
} 

function getLatLong(address, callback) 
{ 
    var geocoder = new google.maps.Geocoder(); 
    var result = ""; 
    geocoder.geocode({ 'address': address, 'region': 'uk' }, function (results, status) { 
    if (status == google.maps.GeocoderStatus.OK) 
    { 
     result = results[0].geometry.location; 
     latLongCallback(result); 
    } 
    else 
    { 
     result = "Unable to find address: " + status; 
    } 
    }); 
    return result; 
} 

function latLongCallback(result) 
{ 
    mapCentre = result; 
    map.setMapTypeId(google.maps.MapTypeId.ROADMAP); 
    ... 
} 

回答

9

如果您使用的是API的V3,您不能使用這個?

function findAddressViaGoogle() { 
    var address = $("input[name='property_address']").val(); 
    var geocoder = new google.maps.Geocoder(); 
    geocoder.geocode({ 'address': address, 'region': 'uk' }, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      newPointClicked(results[0].geometry.location) 
     } else { 
      alert("Unable to find address: " + status); 
     } 
    }); 
}

以上是我用來找到輸入地址的一些緯度長的座標,可能會更好嗎?

編輯:

function loadFromSearch(address) 
{ 
midpoint = getLatLong(address); 
mapCentre = midpoint; 
map.setMapTypeId(google.maps.MapTypeId.ROADMAP); 
... 
} 


function getLatLong(address) 
{ 
    var geocoder = new google.maps.Geocoder(); 
    var result = ""; 
    geocoder.geocode({ 'address': address, 'region': 'uk' }, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      result = results[0].geometry.location; 
     } else { 
      result = "Unable to find address: " + status; 
     } 
    }); 
    return result; 
}
+0

感謝Brady,已經嘗試了這種方法,但結果仍然不會返回與初始化值不同的值。 – Jason 2010-11-09 13:45:58

+0

@jibberish - 你必須有其他地方出了問題,因爲如果我運行getLatLong(「約克」)它返回53.9577018,-1.0822855 – Brady 2010-11-09 13:55:46

+0

我必須的。我可以直接在調試器中找到geocoder.geocode行,然後直接跳過函數調用返回。我猜會繼續堵塞! – Jason 2010-11-09 14:03:09

4

的問題是你$.getJSON功能是異步的,但要退回 'result' 同步。

你需要做這樣的事情

function loadFromSearch(address) 
{ 
    midpoint = getLatLong(address, function(midpoint){ 
    // this is a callback 
    mapCentre = midpoint; 
    map.setMapTypeId(google.maps.MapTypeId.ROADMAP); 
    ...   
    }); 
} 

function getLatLong(address, callback) 
{ 
var result; 
var url = 'http://maps.googleapis.com/maps/api/geocode/json?address=' + encodeURIComponent(address) + '&sensor=false' 
$.getJSON(url, 
    function (data) { 
    if (data.status == "OK") { 
     result = data.results[0].geometry.location; 
     callback(result) // need a callback to get the asynchronous request to do something useful 
    } 
    }); 
} 

在回答您的編輯(未測試!):哦,親愛的,它看起來像V3地理編碼器不支持JSONP。這意味着您無法通過瀏覽器進行跨域請求以從中獲取數據。見http://blog.futtta.be/2010/04/09/no-more-jsonp-for-google-geocoding-webservice/

不過布雷迪的解決方案確實有效。我想這就是Google希望我們現在進行地理編碼的方式。

+0

謝謝,根據你的建議更新了我的問題,但仍然無法正常工作。 – Jason 2010-11-09 12:04:09

+0

欣賞你的幫助,丹。布雷迪的解決方案不適合我,不得不尋找更多。 +1作爲一個比我更好的研究員! – Jason 2010-11-09 14:16:48

相關問題