Esta es la forma en que he manejado este problema en el pasado. Compruebo el estado del resultado y, si lo consigo, supero el límite de error. Lo intento de nuevo después de un ligero retraso.
function Geocode(address) {
geocoder.geocode({
'address': address
}, function(results, status) {
if (status === google.maps.GeocoderStatus.OK) {
var result = results[0].geometry.location;
var marker = new google.maps.Marker({
position: result,
map: map
});
} else if (status === google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {
setTimeout(function() {
Geocode(address);
}, 200);
} else {
alert("Geocode was not successful for the following reason:"
+ status);
}
});
}
Actualización: whoops, accidentalmente glosado sobre la parte del servidor. Aquí hay una versión de C#:
public XElement GetGeocodingSearchResults(string address)
{
var url = String.Format(
"https://maps.google.com/maps/api/geocode/xml?address={0}&sensor=false",
Uri.EscapeDataString(address));
var results = XElement.Load(url);
// Check the status
var status = results.Element("status").Value;
if(status == "OVER_QUERY_LIMIT")
{
Thread.Sleep(200);
GetGeocodingSearchResults(address);
}else if(status != "OK" && status != "ZERO_RESULTS")
{
// Whoops, something else was wrong with the request...
}
return results;
}
Obtuvimos el mismo error OVER_QUERY_LIMIT para personas en 3G, mientras que cuando usaban WiFi, funcionaba correctamente. El problema con 3G es que, por lo que leo, la mayoría de las veces se usa NAT, por lo que todos los usuarios de un mismo proveedor pueden terminar teniendo la misma dirección pública y, por lo tanto, esta dirección IP excedería fácilmente la limitación. – user276648