Javascript 我如何对20个地址进行地理编码,而不收到超限查询响应?
使用Google Geocoder v3,如果我尝试对20个地址进行地理编码,我会得到一个超过查询限制的地址,除非我将它们的时间间隔定为~1秒,但在我的标记全部放置之前需要20秒Javascript 我如何对20个地址进行地理编码,而不收到超限查询响应?,javascript,geocoding,google-maps,Javascript,Geocoding,Google Maps,使用Google Geocoder v3,如果我尝试对20个地址进行地理编码,我会得到一个超过查询限制的地址,除非我将它们的时间间隔定为~1秒,但在我的标记全部放置之前需要20秒 除了提前存储坐标,还有其他方法吗?没有,实际上没有其他方法:如果您有许多位置,并且希望在地图上显示它们,最好的解决方案是: 创建位置时,使用地理编码器获取纬度+经度 将这些存储在数据库中,与地址一起存储 当您想要显示地图时,请使用存储的纬度+经度 当然,这是考虑到您的位置创建/修改要比您的位置咨询少得多 是的,这
除了提前存储坐标,还有其他方法吗?没有,实际上没有其他方法:如果您有许多位置,并且希望在地图上显示它们,最好的解决方案是:
- 创建位置时,使用地理编码器获取纬度+经度
- 将这些存储在数据库中,与地址一起存储
- 当您想要显示地图时,请使用存储的纬度+经度
是的,这意味着在保存位置时需要做更多的工作,但也意味着:
- 你可以通过地理坐标进行搜索
- i、 e.“我想要一份靠近我现在所在位置的点列表”
- 显示地图会快得多
- 即使上面有20多个位置
- 哦,还有(最后但并非最不重要的):这会起作用;-)
- 您不太可能在N秒内达到X geocoder调用的限制
- 而且你也不太可能达到Y地理编码器每天通话的上限
- 不幸的是,这是对谷歌地图服务的限制
我目前正在使用地理编码功能开发一个应用程序,我正在按每个用户保存每个唯一的地址。我根据谷歌地图返回的信息生成地址信息(城市、街道、州等),然后将lat/long信息也保存在数据库中。这样可以避免重新编码,并提供格式良好的地址
您希望这样做的另一个原因是,可以从特定IP地址进行地理编码的地址数量每天都有限制。你不希望你的应用程序因为这个原因而失败。我在尝试对140个地址进行地理编码时也面临同样的问题 我的解决方法是为下一个地理编码请求的每个循环添加usleep(100000)。如果请求的状态超过查询限制,则usleep将增加50000,并重复请求,依此类推
当然,所有接收到的数据(lat/long)都存储在XML文件中,不会在每次加载页面时运行请求。我刚刚测试了Google Geocoder,遇到了与您相同的问题。 我注意到每12个请求我只会得到一次OVER_QUERY_LIMIT状态 所以我等待了1秒(这是等待的最小延迟) 它会降低应用程序的速度,但每次请求的等待时间不到1秒
info = getInfos(getLatLng(code)); //In here I call Google API
record(code, info);
generated++;
if(generated%interval == 0) {
holdOn(delay); // Every x requests, I sleep for 1 second
}
使用基本保持方法:
private void holdOn(long delay) {
try {
Thread.sleep(delay);
} catch (InterruptedException ex) {
// ignore
}
}
希望它能有所帮助您实际上不必为每个请求等待整整一秒钟。我发现,如果我在每个请求之间等待200毫秒,我就能够避免超过查询限制的响应,用户体验也可以。使用此解决方案,您可以在4秒内加载20个项目
$(items).each(function(i, item){
setTimeout(function(){
geoLocate("my address", function(myLatlng){
...
});
}, 200 * i);
}
编辑:
忘了说这个解决方案是纯js的,你只需要一个支持承诺的浏览器
对于那些仍然需要完成这些任务的人,我已经编写了自己的解决方案,将承诺与超时结合起来 代码: 控制台输出:
Attempting the resolution of Georgia
Attempting the resolution of China
Attempting the resolution of Dragons are thugs...
Attempting the resolution of California
ZERO_RESULTS
could not locate Dragons are thugs...
Attempting the resolution of Italy
返回的对象:
整个魔法发生在这里:
(function loopWithDelay(such, queue, i){
console.log("Attempting the resolution of " +queue[i-1]);
setTimeout(function(){
such.find(queue[i-1], function(res){
such.resolved.push(res);
});
if (--i) {
loopWithDelay(such,queue,i);
}
}, 750);
})(that, that.queue, that.queue.length);
基本上,它循环每个项目,每个项目之间的延迟为750毫秒,因此每750毫秒控制一个地址
我做了一些进一步的测试,发现即使在700毫秒时,我有时也会遇到查询限制错误,而在750毫秒时,我根本没有任何问题
在任何情况下,如果您觉得处理较低延迟是安全的,请随意编辑上面的750
希望这在不久的将来对某人有所帮助;) 我很好奇,经过一段时间(比如说,一个月)后,你如何才能确保结果是正确的。您是否每隔一段时间重新查询一次?如果地址(您在数据库中已有的地址,否则您将无法进行地理编码)没有改变,那么纬度/经度发生变化的可能性非常小。当然,每次修改地址时,您都应该重新查询地理编码器,以获得与新地址相对应的纬度+经度。我已经将lat/long存储到数据库中,并通过AJAX将其作为数组从数据库中检索,但它应该再次传递到java脚本循环,而且我还从数据库中接收到173个位置。现在,它向我显示了相同的超限状态。请告诉我…情况还是这样吗?我在文档中看到的唯一限制是:“每天查询2500个地理位置请求的限制”。这不是每个用户每天的查询总量,而是短时间内的查询数量,就像在循环中查询一样。我们的商店有营业执照,但我们仍然遇到每秒无法处理10个以上请求的问题。营业执照和普通开发人员之间的唯一区别在于,我们每天的通话限制是100000次。@michielvoo你解决了这个问题吗?如果是,那么请帮助我。我快超过极限了。在这样的情况下。但是(200*i)意味着每个请求之间的暂停在增加。所以在第三次请求时,它是600,然后是800等等。只要删除“*i”setTimeout,它就会执行一次。因此,如果我是正确的,(…,200*I)将安排每个通话间隔200ms(正如oyatek所评论的),这正是gabeodess想要实现的。电流(…,200)将在200毫秒后同时执行所有这些操作。还是我遗漏了什么?@gabeodess-您应该对所需请求的数量执行
setInterval
,而不是setTimeout
,并将其设置为10
Attempting the resolution of Georgia
Attempting the resolution of China
Attempting the resolution of Dragons are thugs...
Attempting the resolution of California
ZERO_RESULTS
could not locate Dragons are thugs...
Attempting the resolution of Italy
(function loopWithDelay(such, queue, i){
console.log("Attempting the resolution of " +queue[i-1]);
setTimeout(function(){
such.find(queue[i-1], function(res){
such.resolved.push(res);
});
if (--i) {
loopWithDelay(such,queue,i);
}
}, 750);
})(that, that.queue, that.queue.length);