【问题标题】:Reverse geocoder not working properly when used in a loop在循环中使用时反向地理编码器无法正常工作
【发布时间】:2013-10-17 12:14:47
【问题描述】:

我的问题是使用谷歌地图进行反向地理编码。我想对 n 个(小于 15)的纬度和经度坐标进行地理编码,以便我可以使用获得的地址绘制路线。我的问题是当我在循环中使用它时,它没有按照传递的 lat-lng 坐标的顺序给出地址。循环未正确执行。我遇到问题的代码部分是:

 for(var i=0;i<tlength;i++){
 alert(i);    
 var geocoder = new google.maps.Geocoder();   
 geocoder.geocode({'latLng': latlng[i]},function(results, status) {
 alert(i); 
 if (status == google.maps.GeocoderStatus.OK) {
      if (results[0]) {
        var add=results[0].formatted_address;
        address.push(add);
      }
    }
  });    
 }

得到的地址数组与latlng数组顺序不一致。第二个 latlng 首先进行地理编码,并且第二个警报框中的 i 值始终为 6(在本例中为 tlength=6)。它应该从 0 变为 5。但它没有发生。有人可以帮我弄这个吗。或者他们是否有任何其他方式直接使用 latlong 坐标绘制路线?

【问题讨论】:

  • 地理编码是异步的。不能及时保证回调的顺序。一种解决方法是使用函数闭包将输入索引与回调相关联。

标签: javascript google-maps geocoding


【解决方案1】:

地理编码是异步的。不能及时保证回调的顺序。一种解决方法是使用函数闭包将输入索引与回调相关联。请注意,地理编码器受到配额和速率限制。如果您不检查返回的状态,您将不知道何时遇到限制。 (如果数组中有很多点,下面代码中的警报会非常烦人......)

 var geocoder = new google.maps.Geocoder();   
 function reverseGeocode(index) {
   geocoder.geocode({'latLng': latlng[index]},function(results, status) {
     if (status == google.maps.GeocoderStatus.OK) {
       if (results[0]) {
         var add=results[0].formatted_address;
         address[index] = add;
       } else alert("no results for "+laglng[index]);
     } else alert("Geocode failed: "+status);
   });    
 }

 for(var i=0;i<tlength;i++){
   reversGeocode(i);
 }

【讨论】:

  • 即使我在开头也包含了警告框。由于我正在测试一些随机值,因此删除了该部分。你能帮我解决你刚才提到的函数闭包吗?任何有关函数关闭信息的链接都会对我有很大帮助。谢谢您的回复。
  • 我的答案中的“reverseGeocode”函数在“index”变量上获得函数闭包。一个参考是Mike Williams' explanation from his v2 tutorial
  • 谢谢。这对我帮助很大。现在我的地址正在正确更新。但是如果我增加点数,我会收到警报“地理编码失败:OVER_QUERY_LIMIT”。即使我增加点数,还有其他方法可以使反向地理定位工作吗?
  • 那(遇到查询限制)是反向地理编码(或地理编码)很多点的问题。最好的解决方案是将地址与坐标一起存储在数据库中(因此您无需使用 Google 的资源来获取它),或者如果您只有坐标,则“离线”和“缓存”进行反向地理编码" 数据库中的结果(定期刷新以符合服务条款),或构建您自己的反向地理编码器。
【解决方案2】:

你需要在你的代码中使用这样的错误:

var latlng = new google.maps.LatLng(51.9000,8.4731);
    var geocoder = new google.maps.Geocoder();   
     geocoder.geocode({'latLng': latlng},function(results, status) {
     if (status == google.maps.GeocoderStatus.OK) {
          if (results[0]) {
            var add=results[0].formatted_address;
            //address.push(add);
             alert(results[0].formatted_address); 
          }
        }
      });  

对于您的代码,您需要像这样传递:

for(var i=0;i<tlength;i++){ 
 var latlng = new google.maps.LatLng(latlng[i]);
 var geocoder = new google.maps.Geocoder();   
 geocoder.geocode({'latLng': latlng},function(results, status) {
 alert(i); 
 if (status == google.maps.GeocoderStatus.OK) {
      if (results[0]) {
       // var add=results[0].formatted_address;
        address.push(results[0].formatted_address);
      }
    }
  });    
 }

【讨论】:

  • 对不起,我没有在这里上传我的整个代码。我用过'var latlng = new google.maps.LatLng(51.9000,8.4731);'在我没有在这里上传的上一行中。还有其他方法吗?感谢您的回复。
  • 不,这是最简单的方法,我不知道是否有。我总是在我的许多应用程序中使用这个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-08
  • 2013-08-10
  • 2019-01-01
相关资源
最近更新 更多