繁体   English   中英

Google Maps API v3提供了更多批量地理编码问题

[英]More batch geocoding questions with the Google Maps API v3

我正试图找出一种很好的方法来限制我向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完成,如果是这样,怎么做?

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

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

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

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

这是我的脚本中的一个片段,基本上如果它点击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');
        }
    });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM