我正在尝试用400个地址解析一个json,并在每个位置设置地图图标。我的问题是,当我循环这些项目时,我收到一个错误:OVER_QUERY_LIMIT。但是使用谷歌地理编码API设置位置的最佳方法是什么? 我的功能如下:
function getAddresses(data) {
var items, markers_data = [];
if (data.addresses.length > 0) {
items = data.addresses;
for (var i = 0; i < items.length; i++) {
var
item = items[i]
, street = item.address.street
, zip = item.address.zip
, city = item.address.city
, country = item.address.country;
var
geocoder = new google.maps.Geocoder()
, fulladdress = street + ',' + zip + ' '+ city + ',' + country;
setTimeout(function () {
geocoder.geocode({'address': fulladdress},
function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
console.log(results[0].geometry.location.lat());
console.log(results[0].geometry.location.lng());
markers_data.push({
lat : results[0].geometry.location.lat(),
lng : results[0].geometry.location.lng(),
title: item.name,
infoWindow: {
content: '<h2>'+item.name+'</h2><p>'+ street + zip + city +'</p>'
}
});
} else {
console.log('not geocoded');
console.log('status');
console.log(status);
}
});
}, 1000);
}
}
map.addMarkers(markers_data);
}
我试图将我的geocoder.geocode函数放在超时函数中,但遗憾的是这不会有帮助。我在我的js中使用插件gmaps.js。
答案 0 :(得分:0)
如文档中所述,地理编码器服务有每会话配额:
无论有多少用户共享同一项目,每个用户会话都会应用速率限制。首次加载API时,将为您分配初始请求配额。使用此配额后,API会按每秒对其他请求强制执行速率限制。如果在特定时间段内发出的请求太多,则API会返回OVER_QUERY_LIMIT响应代码。
每会话速率限制可防止对批处理请求(例如批量地理编码)使用客户端服务。对于批量请求,请使用Google Maps Geocoding API网络服务。
https://developers.google.com/maps/documentation/javascript/geocoding#UsageLimits
因此,您应该限制客户端呼叫并在最初的10个请求后每秒执行1个请求,或者使用Geocoding API Web服务实施服务器端批量地理编码,每秒最多可以有50个请求。
顺便提一句,您可以尝试在1秒后执行所有请求。您应该为每个下一个请求增加延迟。
setTimeout(function () {
//Your code
}, 1000 * i);
因此第一个请求将立即执行,第二个请求将在1秒后执行,第三个请求将在2秒后执行,依此类推。