更多的批量地理编码的问题,与谷歌地图API v3
-
12-09-2019 - |
题
我试图找出一个很好的方式限制的速度我送的地理编码要求的谷歌地图API v3地理编码的服务。我知道,Javascript没有任何好的 wait
或 sleep
因为它的执行是目前,单一的螺纹。
每个地理编码发送请求内部的一个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请求。这是预期的,并且我想让我的客户很好地发挥与谷歌的服务。
备用路由我愿意追求完全放弃Javascript地理编码和编写这一切。Java这将是 真的 容易睡眠之间的请求。
然而,我不能找到一种方法,使用谷歌地理编码服务(具体而言,使用第3版的API)。 GeoGoogle 似乎是一年多出的日期,并使用v2。
可以这样做,如果是,怎么样?
解决方案
你最好的选择来实现某种率限制提交的将是使用定时器的对象和排队。计时器是预定在一个固定的速度运行无限期地(jQuery有一些非常好的计时器的实现方式)和在身体的那个计时器,你弹的东西掉的队列中并将其提交和然后完成。你其他代码然后增加了的事,队列中的需要。
其他提示
谷歌的积极发展v2和v3的地图API分开。v3是一个更苗条的版本适用于有限的设备处理能力或基本映的任务(而且并不需要一个API关键工作)。
在任何一种情况下,如果你进行地理编码很多东西你应该看看使用谷歌HTTP地理编码服务(http://code.google.com/apis/maps/documentation/geocoding/index.html).这将避免费率限制问题。
和总的来说:Javascript可以做基本的睡眠/等待操作使用若第()以及目().只是防火的请求和重置计时器再做一次在你回调处理。
这里是一片从我的脚本,基本上再次尝试,如果它击。地图。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');
}
});