【问题标题】:More batch geocoding questions with the Google Maps API v3更多关于 Google Maps API v3 的批量地理编码问题
【发布时间】:2010-11-30 04:28:44
【问题描述】:

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

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

$(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实现吗?如果可以,如何实现?

【问题讨论】:

    标签: java javascript jquery geocoding google-maps-api-3


    【解决方案1】:

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

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

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

    【讨论】:

    • 对不起,但这对我来说真的没用。您链接的 HTTP 地理编码服务特定于 v2 并且 受到相同的速率限制和每日限制:code.google.com/apis/maps/documentation/geocoding/…。事实上,Javascript 的 setTimeout 并不足以解决这个问题,因为它只是安排一个函数在未来运行 X 毫秒 - 我仍然无法真正控制该函数执行之间的时间量。
    • setTimeout 和 setInterval 是用于制作任何 javascript 计时器的基本 javascript 调用......所以实际上它正是您标记为已接受的答案。无论如何,必须对地理编码请求进行速率限制表明应用设计不佳,这通常是由于未保存以前的地理编码响应或使用非 Google 服务更适合 HTTP 批量地理编码的结果。
    • 我将保存以前的地理编码响应。但是,(a) 我有大约 10,000 个地址需要获取初始位置,并且 (b) 其中一些地址每天都在变化。如果我必须查找其中的 20 个新地址,我必须限制我为它们发送请求的速率。至于 HTTP 批量地理编码服务 - 在价格(免费)、高每日请求限制和数据准确性方面,我找不到任何与 Google 一样好的服务 - 特别是具有 Javascript 或 Java API 的服务。你能指出我的方向吗?
    • google map api 组维护一个非 google 地理编码器页面:groups.google.com/group/google-maps-api/web/…。在不了解您的应用程序的情况下,我不能说它是否有帮助,但请记住,javascript 地理编码器请求会根据客户端的 IP 而不是您的服务器的 IP 进行限制,因此您可以以某种方式利用它。
    【解决方案2】:

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

    【讨论】:

    • 这听起来比尝试重构我的代码以便所有请求都在服务器端完成要好得多。计时器是内置在 jquery 中的,还是作为插件添加的?你能推荐一个具体的吗?
    • 我有过非常好的体验的是一个插件,可以在plugins.jquery.com/project/timers 找到。祝你好运!
    【解决方案3】:
    【解决方案4】:

    这是我脚本中的一个 sn-p,基本上它会在遇到 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');
            }
        });
    

    【讨论】:

      猜你喜欢
      • 2013-04-05
      • 1970-01-01
      • 2013-12-18
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      • 2012-12-11
      相关资源
      最近更新 更多