我的目标是将大量地址地理编码为LatLng
对象。我只能使用Google,而不能使用其他可能支持批量请求的API。因此,我必须使用1个请求= 1个地址,但是我一直在获取OVER_QUERY_LIMIT
。不知道怎么可能,因为根据官方文档,我应该能够对客户端每秒每秒50个地址进行地址解析。
我的第一个想法是立即发出50个请求,等待所有请求返回,暂停一秒钟,然后继续下50个地址...因此简化的代码如下所示:
const geocoder = new google.maps.Geocoder();
const allAddresses = [ /* 500 addresses */ ];
geocodeAddresses(allAddresses);
function geocodeAddresses(addresses) {
const last50 = addresses.splice(-50);
Promise.allSettled(
last50.map((address) =>
new Promise((resolve, reject) =>
geocoder.geocode({
address
}, (results, status) => {
console.log("Geocoded! Response: " + status);
resolve();
})))
).then(() =>
setTimeout(() => geocodeAddresses(addresses), 1000)
);
}
此代码一次成功返回前10个请求,然后由于配额限制而对其他请求失败(为什么?)。
因此,我决定每次处理一次请求时都延迟500毫秒,这已经非常慢了。然后,我将以2000ms的超时重复OVER_QUERY_LIMIT个请求。结果很奇怪:
在完成约350个请求后,每个请求均失败了5-6次,而且速度确实很慢。看来它可能成倍地失败。
用Google对我的所有地址进行地理编码的最快方法是什么?谢谢!
相关问题:
看到:
这个部分:
如果您收到OVER_QUERY_LIMIT状态代码作为响应,则表明您已经超出了API的使用限制。我们建议您尝试这些用法优化策略。
速率限制
地理编码服务的速率限制为50 QPS(每秒查询),计算方式为客户端和服务器端查询的总和。
该Web服务的文档中有一个建议:使用Google Maps API Web服务使用指数退避的最佳做法:
指数回退
在极少数情况下,为您的请求服务可能会出错。您可能会收到4XX或5XX HTTP响应代码,或者客户端和Google服务器之间的TCP连接可能会失败。通常值得重新尝试该请求,因为后续请求在原始请求失败时可能会成功。但是,重要的是不要简单地循环反复向Google服务器发出请求。这种循环行为可能会使您的客户和Google之间的网络过载,从而给许多方面带来麻烦。更好的方法是尝试之间的延迟增加,然后重试。通常,每次尝试都会使延迟增加一个倍增因子,这种方法称为指数退避。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句