Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

OVER_QUERY_LIMIT in Google Maps API v3: How do I pause/delay in Javascript to slow it down?

I'm hitting an issue that is WELL discussed in these forums, but none of the recommendations seem to be working for me so I'm looking for some full javascript that works when saved as an html file.

The issue is I keep hitting the OVER_QUERY_LIMIT error when trying to geocode > 11 locations on a Google Map using the V3 APIs called by Javascript. I understand that there is a limit to the rate at which you can call the geocoder (as well as the daily limit on total volume), so I need to introduce a pause in between each result in the array.

Any help very much appreciated.

Here is my code:

<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> <script type="text/javascript"> var geocoder; var map; var wait = false;     function initialize() { geocoder = new google.maps.Geocoder(); var latlng = new google.maps.LatLng(51.32, 0.5);    var myOptions = {   zoom: 8,   center: latlng,   mapTypeId: google.maps.MapTypeId.ROADMAP } map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); codeAddress('KT16 8LA' + ', UK'); codeAddress('LS8 2LQ' + ', UK'); codeAddress('NE13 8AF' + ', UK'); codeAddress('KT12 2BE' + ', UK'); codeAddress('W1W 8AN' + ', UK'); codeAddress('EC3N 2LS' + ', UK'); codeAddress('BS9 3BH' + ', UK'); codeAddress('KA10 6LZ' + ', UK'); codeAddress('EC1V 9BW' + ', UK'); codeAddress('WD18 8YN' + ', UK'); codeAddress('HA3 6DQ' + ', UK'); codeAddress('W1U 3PL' + ', UK'); codeAddress('W1T 7QL' + ', UK'); codeAddress('W1S 1TD' + ', UK'); codeAddress('SW1X 8NX' + ', UK'); codeAddress('LE2 8ET' + ', UK'); codeAddress('BA3 4BH' + ', UK'); codeAddress('AL3 8JP' + ', UK'); codeAddress('DE55 4QJ' + ', UK'); codeAddress('W6 0QT' + ', UK'); codeAddress('LA1 1PP' + ', UK'); codeAddress('SW16 4DH' + ', UK'); codeAddress('WC2N 6DF' + ', UK'); codeAddress('RM6 6LS' + ', UK'); codeAddress('S25 3QZ' + ', UK'); codeAddress('WC2H 7LR' + ', UK'); codeAddress('BH24 1DW' + ', UK'); codeAddress('EC2N 6AR' + ', UK'); codeAddress('W1U 2FA' + ', UK'); codeAddress('B60 3DX' + ', UK');     }    function codeAddress(vPostCode) { if (geocoder) {   geocoder.geocode( { 'address': "'" + vPostCode + "'"}, function(results, status) {     if (status == google.maps.GeocoderStatus.OK) {       map.setCenter(results[0].geometry.location);       var marker = new google.maps.Marker({           map: map,            position: results[0].geometry.location       });     } else {       alert("Geocode was not successful for the following reason: " + status);     }   }); } }  </script> <body style="margin:0px; padding:0px;" onload="initialize()"> <div id="map_canvas" style="width:100%; height:90%"></div> </body> 

EDIT: This is what I've tried to do to get it to pause/wait in the relevant section, but it doesn't do anything:

function codeAddress(vPostCode) {     if (geocoder) {     while (wait) { /* Just wait. */ };       geocoder.geocode( { 'address': "'" + vPostCode + "'"}, function(results, status) {         if (status == google.maps.GeocoderStatus.OK) {           map.setCenter(results[0].geometry.location);           var marker = new google.maps.Marker({               map: map,                position: results[0].geometry.location           });         /* When geocoding "fails", see if it was because of over quota error: */         } else if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {          wait = true;         setTimeout("wait = true", 2000);         //alert("OQL: " + status);         } else {           alert("Geocode was not successful for the following reason: " + status);         }       });     }   } 
like image 988
user1573571 Avatar asked Aug 03 '12 09:08

user1573571


People also ask

What does geocoder failed due to Over_query_limit?

If you are getting the error OVER_QUERY_LIMIT when trying to geocode an address with Google set as geocoding provider, this means that you exceeded the Google Maps Platform web services usage limits by: sending too many requests per day or e.g. by. sending requests too fast, i.e. too many requests per second.

What does over query limit mean?

If status code is still OVER_QUERY_LIMIT, your application is sending too many requests per day. Otherwise, your application is sending too many requests per second."

Is Google Maps API restful?

Since Google Map APIs support both json and xml , it can be safely said they they are implemented in REST.

What are the usage limits for the Google Maps Geocoding API web service?

While there is no maximum number of requests per day, the following usage limit is still in place for the Geocoding API: 50 requests per second, calculated as the sum of client-side and server-side queries.


1 Answers

Nothing like these two lines appears in Mike Williams' tutorial:

    wait = true;     setTimeout("wait = true", 2000); 

Here's a Version 3 port:

http://acleach.me.uk/gmaps/v3/plotaddresses.htm

The relevant bit of code is

  // ====== Geocoding ======   function getAddress(search, next) {     geo.geocode({address:search}, function (results,status)       {          // If that was successful         if (status == google.maps.GeocoderStatus.OK) {           // Lets assume that the first marker is the one we want           var p = results[0].geometry.location;           var lat=p.lat();           var lng=p.lng();           // Output the data             var msg = 'address="' + search + '" lat=' +lat+ ' lng=' +lng+ '(delay='+delay+'ms)<br>';             document.getElementById("messages").innerHTML += msg;           // Create a marker           createMarker(search,lat,lng);         }         // ====== Decode the error status ======         else {           // === if we were sending the requests to fast, try this one again and increase the delay           if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {             nextAddress--;             delay++;           } else {             var reason="Code "+status;             var msg = 'address="' + search + '" error=' +reason+ '(delay='+delay+'ms)<br>';             document.getElementById("messages").innerHTML += msg;           }            }         next();       }     );   } 
like image 149
Andrew Leach Avatar answered Sep 16 '22 16:09

Andrew Leach