【发布时间】:2021-04-28 15:27:29
【问题描述】:
我的目标是将大量地址地理编码为LatLng 对象。
我只能使用 Google,不能使用其他可能支持批处理请求的 API。
因此我必须使用 1 个请求 = 1 个地址,但我不断收到OVER_QUERY_LIMIT。不知道这怎么可能,因为从official docs 开始,我应该能够在客户端每秒对 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 个请求,然后由于配额限制而在其他请求上失败(为什么?)。
所以我决定一次处理 1 个请求,每个结果后延迟 500 毫秒,这已经非常慢了。然后我会以 2000 毫秒的超时重复 OVER_QUERY_LIMIT 请求。结果很奇怪:
- 前 ~200 个请求都正常
- 接下来约 50 个请求:重复约 10 个请求
- 接下来的约 30 个请求:重复约 15 个请求
- 接下来约 10 个请求:重复约 10 个请求(每个请求在成功之前都失败了)
在完成约 350 个请求后,每个请求都失败了 5-6 次,而且速度真的很慢。看起来它可能会成倍地失败。
用 Google 对我的所有地址进行地理编码的最快方法是什么?谢谢!
【问题讨论】:
标签: javascript google-maps google-geocoding-api