Google Maps API v3,地理位置无法正确返回

时间:2013-04-13 21:21:48

标签: javascript google-maps google-maps-api-3

我有一个问题,如果我将Geoencoding的结果放入变量,变量返回空。这是我的代码:

地图初始化:

function init_map() {
  geocoder = new google.maps.Geocoder();

  var center_address = get_long_lat("Salisbury, UK");
  var latlng = new google.maps.LatLng(center_address);

  var mapOptions = {
    zoom: 8,
    center: latlng,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  }

  map = new google.maps.Map(document.getElementById("gmap"), mapOptions);
}

正如你所看到的那样,我试图通过使用自定义函数get_long_lat将地址转换为Long和Lat来获取地图中心到我的家乡:

获取长期&纬度

function get_long_lat(address) {

      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] .geometry.location的警告,它会显示正确的值,我期待吗?

为什么不想返回这个值?

2 个答案:

答案 0 :(得分:2)

地理编码器是异步的。您无法从异步函数返回结果。您应该在回调中使用result值。

更具体地说,正在发生的事情是return result;行在分配result变量之前实际执行。

答案 1 :(得分:0)

geocoder.geocode( { 'address': address, 'region': 'uk' }, function(results, status) {});

这段代码会调用Google服务器来检索地理编码信息。收到Google服务器的响应后,它会执行指定的回调函数。

return result;

在回调函数检索到信息之前,该行被命中,因此结果仍为空。检索信息时,将调用回调函数并填充结果。但是为时已晚,“get_long_lat”函数已经返回了结果,返回时仍然是空的。

问题是返回结果的回调函数是异步运行的。

如果你用这种方式写它会有用:

function init_map() {
  geocoder = new google.maps.Geocoder();

  geocoder.geocode( { 'address': 'Salisbury, UK', 'region': 'uk' }, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {

        var mapOptions = {
          zoom: 8,
          center: results[0].geometry.location,
          mapTypeId: google.maps.MapTypeId.ROADMAP
        }

        map = new google.maps.Map(document.getElementById("gmap"), mapOptions);

      } else {
        //Do whatever you want to do when the address isn't found.
        //result = "Unable to find address: " + status;
      }
  });

}

现在mapOptions仅在Google服务器返回响应后初始化。