Limite de QUERY LIMIT por segundo do Google Maps API por segundo

Estou usando a API do Google Maps para exibir cerca de 50 locais no mapa. Estou usando a geocodificação do lado do cliente. Eu estou usando window.setTimeout para controlar o número de solicitações de geocódigo que o aplicativo envia por segundo. Se eu enviar mais de uma solicitação por segundo, receberei uma resposta OVER QUERY LIMIT.

Pergunta: Esse limite não deve ser 10 consultas por segundo? Se sim, então o que eu poderia estar fazendo errado? Se não, a API de negócios tem limite de consultas por segundo mais generoso?

Por favor, note que o nosso aplicativo não vai bater as 25.000 consultas por dia.

O geocodificador tem limites de cota e taxa. Por experiência, você pode geocodificar ~ 10 locais sem atingir o limite de consulta (o número real provavelmente depende do carregamento do servidor). A melhor solução é atrasar quando você obtiver erros de OVER_QUERY_LIMIT e tentar novamente. Veja estes posts semelhantes:

  • OVER_QUERY_LIMIT na API do Google Maps v3: Como faço para pausar / atrasar o Javascript para desacelerá-lo?

  • Como faço para geocodificar 20 endereços sem receber uma resposta de OVER_QUERY_LIMIT?

Muitas vezes, quando você precisa mostrar tantos pontos no mapa, seria melhor usar a abordagem do lado do servidor. Este artigo explica quando usar cada um deles:

Estratégias de geocodificação: https://developers.google.com/maps/articles/geocodestrat

O limite do lado do cliente não é exatamente “10 solicitações por segundo” e, como não é explicado nos documentos da API, eu não confiaria em seu comportamento.


Essa abordagem não está correta devido à sobrecarga do servidor do Google. Para mais informações, consulte https://gis.stackexchange.com/questions/15052/how-to-avoid-google-map-geocode-limit#answer-15365


A propósito, se você deseja continuar de qualquer maneira, aqui você pode encontrar um código que permite carregar vários marcadores de ajax originados no google maps, evitando o erro OVER_QUERY_LIMIT.

Eu testei no meu servidor onw e 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() 

Exemplo:

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