Google将地理编码API V3映射为不返回javascript函数的结果

我正在尝试使用Google地理编码器API V3根据用户指定的地址在地图上绘制位置,代码如下。

当我直接提出请求时(例如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中设置断点结果= 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); ... } 

如果你使用的是API的API你不能用这个吗?

 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; } 

问题是你的$.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/

但Brady的解决方案确实有效。 我猜这就是谷歌希望我们现在进行地理编码的方式。