我正在尝试解析包含 400 个地址的 json 并在每个位置设置地图图标。我的问题是,当我循环遍历项目时,出现错误:OVER_QUERY_LIMIT。但是使用 google geocode 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。
如文档中所述,地理编码器服务有每个会话配额:
无论有多少用户共享同一项目,速率限制都适用于每个用户会话。当您首次加载 API 时,系统会为您分配初始请求配额。使用此配额后,API 会对每秒的其他请求强制执行速率限制。如果在特定时间段内发出过多请求,API 将返回 OVER_QUERY_LIMIT 响应代码。
每个会话的速率限制会阻止使用客户端服务进行批量请求,例如批量地理编码。对于批量请求,请使用 Google 地图地理编码 API 网络服务。
https://developers.google.com/maps/documentation/javascript/geocoding#UsageLimits https://developers.google.com/maps/documentation/javascript/geocoding#UsageLimits
因此,您应该限制客户端调用,并在最初 10 个请求后每秒执行 1 个请求,或者使用 Geocoding API Web 服务实现服务器端批量地理编码,其中每秒最多可以处理 50 个请求。
顺便说一句,在您的代码中,您尝试在 1 秒后执行所有请求。您应该为每个下一个请求增加延迟。
setTimeout(function () {
//Your code
}, 1000 * i);
因此第一个请求将立即执行,第二个请求将在 1 秒后执行,第三个请求将在 2 秒后执行,依此类推。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)