Geocode OVER QUERY LIMIT解决方法

时间:2012-08-09 00:29:36

标签: jquery google-maps geocoding

我尝试对超过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);
});

1 个答案:

答案 0 :(得分:3)

首先关于Google's Terms of Service

的说明

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

没有指责!只是引起注意。


程序员回答:

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

所以你一次就要拍了一千个API请求。然后大约1秒后(给出或花费几毫秒),将运行1,000个无操作。

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

如果您想更准确地“解决”OVER_QUERY_LIMIT错误和其他TOS限制(例如地理编码 en masse ),您将需要考虑一项商业服务。有这样的限制,例如LiveAddress(披露:我在SmartyStreets工作)。