我使用Google Maps API在地图上显示约50个地点。我正在使用客户端地理编码。我使用window.setTimeout来控制应用程序每秒发送的地理编码请求的数量。如果我每秒发送超过1个请求,我会收到一个超过QUERY LIMIT的响应。
问题:这个限制不应该是每秒10次查询吗?如果是,那么我可能做错了什么?如果不是,那么Business API每秒的限制是否有更多慷慨的查询?
请注意,我们的申请每天不会达到25,000个查询。
答案 0 :(得分:30)
地理编码器具有配额和速率限制。根据经验,您可以在不超出查询限制的情况下对~10个位置进行地理编码(实际数量可能取决于服务器负载)。最好的解决方案是在出现OVER_QUERY_LIMIT错误时延迟,然后重试。看到这些类似的帖子:
答案 1 :(得分:5)
通常当你需要在地图上显示这么多点时,你最好使用服务器端方法,本文解释了何时使用它们:
地理编码策略:https://developers.google.com/maps/articles/geocodestrat
客户端限制并不完全是“每秒10个请求”,并且由于API文档中没有解释,因此我不会依赖其行为。
答案 2 :(得分:1)
由于Google Server Overload,这种方法不正确。 有关更多信息,请参阅 https://gis.stackexchange.com/questions/15052/how-to-avoid-google-map-geocode-limit#answer-15365
顺便说一句,如果你想继续,你可以在这里找到一个代码,让你加载谷歌地图上的多个标记ajax,避免OVER_QUERY_LIMIT错误。
我已经在我的onw服务器上测试了它的确有效!:
var lost_addresses = [];
geocode_count = 0;
resNumber = 0;
map = new GMaps({
div: '#gmap_marker',
lat: 43.921493,
lng: 12.337646,
});
function loadMarkerTimeout(timeout) {
setTimeout(loadMarker, timeout)
}
function loadMarker() {
map.setZoom(6);
$.ajax({
url: [Insert here your URL] ,
type:'POST',
data: {
"action": "loadMarker"
},
success:function(result){
/***************************
* Assuming your ajax call
* return something like:
* array(
* 'status' => 'success',
* 'results'=> $resultsArray
* );
**************************/
var res=JSON.parse(result);
if(res.status == 'success') {
resNumber = res.results.length;
//Call the geoCoder function
getGeoCodeFor(map, res.results);
}
}//success
});//ajax
};//loadMarker()
$().ready(function(e) {
loadMarker();
});
//Geocoder function
function getGeoCodeFor(maps, addresses) {
$.each(addresses, function(i,e){
GMaps.geocode({
address: e.address,
callback: function(results, status) {
geocode_count++;
if (status == 'OK') {
//if the element is alreay in the array, remove it
lost_addresses = jQuery.grep(lost_addresses, function(value) {
return value != e;
});
latlng = results[0].geometry.location;
map.addMarker({
lat: latlng.lat(),
lng: latlng.lng(),
title: 'MyNewMarker',
});//addMarker
} else if (status == 'ZERO_RESULTS') {
//alert('Sorry, no results found');
} else if(status == 'OVER_QUERY_LIMIT') {
//if the element is not in the losts_addresses array, add it!
if( jQuery.inArray(e,lost_addresses) == -1) {
lost_addresses.push(e);
}
}
if(geocode_count == addresses.length) {
//set counter == 0 so it wont's stop next round
geocode_count = 0;
setTimeout(function() {
getGeoCodeFor(maps, lost_addresses);
}, 2500);
}
}//callback
});//GeoCode
});//each
};//getGeoCodeFor()
示例:
map = new GMaps({
div: '#gmap_marker',
lat: 43.921493,
lng: 12.337646,
});
var jsonData = {
"status":"success",
"results":[
{
"customerId":1,
"address":"Via Italia 43, Milano (MI)",
"customerName":"MyAwesomeCustomer1"
},
{
"customerId":2,
"address":"Via Roma 10, Roma (RM)",
"customerName":"MyAwesomeCustomer2"
}
]
};
function loadMarkerTimeout(timeout) {
setTimeout(loadMarker, timeout)
}
function loadMarker() {
map.setZoom(6);
$.ajax({
url: '/echo/html/',
type: "POST",
data: jsonData,
cache: false,
success:function(result){
var res=JSON.parse(result);
if(res.status == 'success') {
resNumber = res.results.length;
//Call the geoCoder function
getGeoCodeFor(map, res.results);
}
}//success
});//ajax
};//loadMarker()
$().ready(function(e) {
loadMarker();
});
//Geocoder function
function getGeoCodeFor(maps, addresses) {
$.each(addresses, function(i,e){
GMaps.geocode({
address: e.address,
callback: function(results, status) {
geocode_count++;
console.log('Id: '+e.customerId+' | Status: '+status);
if (status == 'OK') {
//if the element is alreay in the array, remove it
lost_addresses = jQuery.grep(lost_addresses, function(value) {
return value != e;
});
latlng = results[0].geometry.location;
map.addMarker({
lat: latlng.lat(),
lng: latlng.lng(),
title: e.customerName,
});//addMarker
} else if (status == 'ZERO_RESULTS') {
//alert('Sorry, no results found');
} else if(status == 'OVER_QUERY_LIMIT') {
//if the element is not in the losts_addresses array, add it!
if( jQuery.inArray(e,lost_addresses) == -1) {
lost_addresses.push(e);
}
}
if(geocode_count == addresses.length) {
//set counter == 0 so it wont's stop next round
geocode_count = 0;
setTimeout(function() {
getGeoCodeFor(maps, lost_addresses);
}, 2500);
}
}//callback
});//GeoCode
});//each
};//getGeoCodeFor()
#gmap_marker {
min-height:250px;
height:100%;
width:100%;
position: relative;
overflow: hidden;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="http://maps.google.com/maps/api/js" type="text/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gmaps.js/0.4.24/gmaps.min.js" type="text/javascript"></script>
<div id="gmap_marker"></div> <!-- /#gmap_marker -->
答案 3 :(得分:0)
代替客户端地理编码
geocoder.geocode({
'address': your_address
}, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
var geo_data = results[0];
// your code ...
}
})
我将使用服务器端地理编码API
var apikey = YOUR_API_KEY;
var query = 'https://maps.googleapis.com/maps/api/geocode/json?address=' + address + '&key=' + apikey;
$.getJSON(query, function (data) {
if (data.status === 'OK') {
var geo_data = data.results[0];
}
})