2012-08-09 56 views
0

我想对地址解析超过1,000个地址并将值存储在XML文件中。问题是我在第十个地址后收到OVER_QUERY_LIMIT错误。 我已经看到其他帖子提示每个地理编码之间等待X秒,但这似乎不适用于我。下面是一段我的代码:地址解析结束查询限制解决方法

<div id="locations"></div> 
$(xml).find('marker').each(function (i) 
{ 
    var storeName = $(this).attr('name'); 
    var address = $(this).attr('address'); 

    setTimeout(function(){ 
     g.geocode(address, function(data) 
     { 
      if(data != null) 
      { 
       olat = data.latitude; 
       olng = data.longitude; 

       var marker = "<marker name='" + storeName + "' lat='" + olat + "' lng='" + olng + "' />"; 

       $('#locations').append(marker); 
      } 
      else 
      {    
        //Unable to geocode 
        alert('ERROR! Unable to geocode address');     
      } 
     }); 
    }, 1000); 
}); 
+0

可能重复的[我如何Geocode 20地址没有收到OVER_QUERY_LIMIT响应?](http://stackoverflow.com/questions/2419219/how-do-i-geocode-20-addresses-without-receiving-an -over-query-limit-response) – 2012-08-10 16:42:14

回答

3

一记约Google's Terms of Service

很容易没有想到这样的东西,但它事有时做。除非您想加入this group from earlier today由于某些原因禁用了其服务,否则请确保在您对这些地址进行地理编码时向用户显示地图。 TOS还禁止批量地理编码并将结果存储在性能缓存以外的任何地方。

不要指责!只是引起注意。


程序员答案:

setTimeout的回调和geocode都是异步函数。现在使用你的代码,虽然响应仍然从API返回,但你正在启动你的1秒定时器,它也异步运行,而你的循环会立即继续迭代,不会有任何延迟。一秒后,无操作被调用一次然后丢弃。每次循环运行时都会发生这种情况。

因此,您一次拍摄了1000个API请求。然后大约1秒钟后(需要或几毫秒),将有1000个无操作运行。

您对g.geocode的调用需要在setTimeout的回调函数中,然后回调函数的结尾需要在其内部设置另一个超时,直到完成为止。没有更多的没有操作。

如果你想更准确的“工作围绕” OVER_QUERY_LIMIT错误和其他TOS限制(如地理编码集体),你要考虑商业服务,没有这样的限制,像LiveAddress (披露:我在SmartyStreets工作)。

+0

嗨马特。感谢您的提醒。我试图建立一个商店定位器,所以Google的服务条款不应该有任何问题。我试着按照你的建议,但它仍然不起作用。我使用这些更改更新了上面的代码。 – Gonzalo 2012-08-09 01:22:29

+0

同时对一千个以上的地址进行地理编码?听起来有点像我,但我想这不是由我来决定的。希望你会发现比其他人更多的财富!无论如何,你的代码不工作,因为'each'仍然没有延迟地迭代。仔细检查setTimeout的回调函数开始下一次迭代的部分;不要让每个人都远离你。 – Matt 2012-08-09 01:27:02

+0

马特,感谢您的快速响应。是的,我打算将坐标保存在xml中,以便我可以在用户位置附近显示商店。这不仅仅是为了能够在地图上的特定位置放置标记,而是要显示最近的商店。关于代码,你在那里失去了我。将每一个放在setTimeout里面都会一次拍摄1,000个API请求,一旦完成,no-op将会运行...对吗? – Gonzalo 2012-08-09 01:43:43