API de Google Maps OVER QUERY LIMIT por segundo límite

Estoy usando Google Maps API para mostrar aproximadamente 50 ubicaciones en el mapa. Estoy usando la geoencoding del lado del cliente. Estoy usando window.setTimeout para controlar el número de solicitudes de geoencoding 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.

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:

  • OVER_QUERY_LIMIT en Google Maps API v3: ¿cómo pause / delay en JavaScript para ralentizarlo?

  • ¿Cómo geocodifica 20 direcciones sin recibir una respuesta OVER_QUERY_LIMIT?

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 geoencoding: 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.


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; }