4

我试图找出一种很好的方法来限制我向 Google Maps API v3 地理编码器服务发送地理编码请求的速率。我知道 Javascript 没有任何好处wait,或者sleep因为它的执行暂时是单线程的。

每个地理编码器请求都在 jQueryeach函数内发送。所以,一般的代码骨架是:

$(xml).find('foo').each(function(){
    // do stuff
    ...

    geocoder.geocode(request, function(results, status) {/* do other stuff */});

    // do more stuff
    ...
}

如何设置固定间隔以在每次调用之间等待geocode?如果我发送每个请求的速度与 Javascript 的运行速度一样快,那么我很快就会开始接收OVER_QUERY_LIMIT响应——即使我只发送 20 个请求。这是意料之中的,我正在努力让我的客户很好地使用 Google 的服务。


我愿意追求的另一条路线是完全放弃 Javascript 进行地理编码,并用 Java 编写它。使用 Java,在请求之间睡觉真的很容易。

但是,我找不到在 Java 中使用 Google 的地理编码服务(特别是使用 API 的第 3 版)的方法。GeoGoogle似乎已经过时一年多了,并且使用的是 v2。

可以用Java完成吗?如果可以,怎么做?

4

4 回答 4

4

Google 正在积极分别开发 Maps API 的 v2 和 v3。v3 是一个更精简的版本,适用于处理能力有限或基本映射任务(并且不需要 API 密钥即可工作)的设备。

无论哪种情况,如果您要对许多内容进行地理编码,您可能应该考虑使用 Google 的 HTTP 地理编码服务 ( http://code.google.com/apis/maps/documentation/geocoding/index.html )。这将避免速率限制问题。

fwiw:Javascript 可以使用 setInterval() 和 setTimeout() 进行基本的睡眠/等待操作。只需触发请求并重置计时器以在回调处理结束时再次执行此操作。

于 2009-09-21T19:16:12.403 回答
2

实现某种速率限制提交的最佳选择是使用计时器对象和队列。计时器以固定的速率被安排无限期地运行(jQuery 有一些非常好的计时器实现)并且在该计时器的主体中,您从队列中弹出一些东西并提交它然后完成。然后,您的其他代码会根据需要将内容添加到该队列中。

于 2009-09-21T19:19:36.203 回答
2

http://rizsharif.blogspot.com/2010/10/recursion-settimeout-to-simulate-pause.html

于 2010-10-09T15:37:07.867 回答
1

这是我的脚本中的一个片段,基本上它会在遇到 google.maps.GeocoderStatus.OVER_QUERY_LIMIT 时再次尝试

function(results, status) {
    // If the limit is reached try again in a second
        if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {

            window.setTimeout(
                function() {self.resolveAddress(addr);},1000
            );
        } else if (status == google.maps.GeocoderStatus.OK) {
            // Do something clever
        } else if (status == google.maps.GeocoderStatus.ZERO_RESULTS) {
            self.reduce(addr); // Try removing something from addr
        } else {
            atira.log('Something terrible happened');
        }
    });
于 2011-03-24T16:02:56.850 回答