google-maps - gratis - google maps free api
API de Google Maps OVER QUERY LIMIT por segundo lĂmite (3)
Estoy usando Google Maps API para mostrar aproximadamente 50 ubicaciones en el mapa. Estoy usando la geocodificación del lado del cliente. Estoy usando window.setTimeout para controlar el número de solicitudes de geocodificación que envía la aplicación por segundo. Si envío más de 1 solicitud por segundo, recibiré una respuesta de LIMITE DE CONSULTA.
Pregunta: ¿No se supone que este límite es de 10 consultas por segundo? Si es así, ¿qué podría estar haciendo mal? Si no, ¿Business API tiene un límite más amplio de consultas por segundo?
Tenga en cuenta que nuestra aplicación no alcanzará las 25,000 consultas por día.
A menudo, cuando necesite mostrar tantos puntos en el mapa, sería mejor utilizar el enfoque del lado del servidor, este artículo explica cuándo usar cada uno:
Estrategias de geocodificación: https://developers.google.com/maps/articles/geocodestrat
El límite del lado del cliente no es exactamente "10 solicitudes por segundo", y como no se explica en los documentos de la API, no confiaría en su comportamiento.
El geocodificador tiene límites de cuota y velocidad. Por experiencia, puede geocodificar ~ 10 ubicaciones sin tocar el límite de consultas (el número real probablemente dependa de la carga del servidor). La mejor solución es retrasar cuando obtenga OVER_QUERY_LIMIT errors, luego vuelva a intentarlo. Ver estas publicaciones similares:
Este enfoque no es correcto debido a la sobrecarga del servidor de Google. Para obtener más información, consulte https://gis.stackexchange.com/questions/15052/how-to-avoid-google-map-geocode-limit#answer-15365
Por cierto, si deseas continuar de todos modos, aquí puedes encontrar un código que te permite cargar varios marcadores ajax de Google Maps evitando el error OVER_QUERY_LIMIT.
¡Lo probé en mi servidor onw y funciona! :
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()
Ejemplo:
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 -->