2012-03-21 12 views
18

Estoy usando la API de geocodificación en el lado del servidor para traducir las direcciones en latlng. Me enfrenté a un estado OVER_QUERY_LIMIT aunque: - el servidor no excedió la limitación de 2500 (solo unas pocas solicitudes en este día) - no hizo muchas solicitudes simultáneamente (solo una solicitud por vez)api de geocodificación sobre el límite de consulta

¿cómo es eso posible? Al día siguiente, la geocodificación funcionaba bien, pero me preocupa que mi aplicación funcione correctamente a largo plazo.

Gracias de antemano.

+2

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

Respuesta

4

Tuvimos este problema también y la solución fue eliminar la API de Google. Si todo lo que necesita es geocodificación, existen numerosas alternativas que son igualmente efectivas sin las limitaciones. Elegimos la API mapquest. Ha sido más rápido y más confiable sin límite en las llamadas de codificación geográfica, y realmente me gusta su API para agrupar las solicitudes de geocodificación en una sola llamada.

Si hay otras características que necesita, obviamente debe tenerlas en cuenta, pero en el caso de una característica única, usar la API más grande en el bloque no es necesariamente la mejor opción.

developer.mapquest.com

+0

Mi primera inclinación es abandonar Google Maps para Mapquest después de leer esto. ¿Pero cuánto tiempo hasta que Mapquest implemente un limitador de velocidad también? Los costos de cambio son significativos. – steampowered

+0

En realidad, es triste decirlo, mapquest ya ha implementado un límite de velocidad. Duplica el de Google, pero está ahí. Una actualización de mi respuesta es bifurcar mi código (aunque de una manera encapsulada agradable) de modo que en iOS 5 utilizo la API de geocodificación de Apple y para todas las versiones anteriores de iOS utilizo mapquest. Esto ha sido muy efectivo ya que el porcentaje de dispositivos que usan versiones anteriores de iOS está cayendo todos los días. Rara vez alcanzamos el límite diario de Mapquests (aunque esto ocurre, por lo que tenemos un elegante repliegue). Por supuesto, esto solo ayuda para iOS. Otras plataformas todavía necesitan una solución :( – NSProgrammer

33

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

Gracias por el código js. Establecer la demora con un reintento funciona muy bien – steampowered

+0

Algo sobre la solución C# se ve a mí. Devuelve un XElement a la persona que llama. Sin embargo, si 'GetGeocodingSearchResults() 'se llama por segunda vez, se ignora el resultado. Y si se cambia la línea para leer' return GetGeocodingSearchResults (address); 'se podría desbordar la pila. Una solución alternativa sería ejecutar este código en un bucle hasta el éxito o un predeterminado número de fallas. También debe tenerse en cuenta que si bien esto reducirá la tasa de solicitud, aún debe preocuparse por el límite diario. – dana

+0

funciona de maravilla! – UmbySlipKnot

2

También puede hacer la geocodificación en el lado del cliente. Aquí está an article comparando el enfoque de hacer algo del lado del cliente y algo del sitio del servidor.

0

Google, Bing, MapQuest y Yahoo! Los mapas (¿esta API todavía está cerca?) Son herramientas extremadamente potentes. Tienen una gran cantidad de caballos de fuerza que ponen detrás de la interpretación de la dirección que proporcionas y hacen todo lo posible para convertirla en una dirección con el formato correcto para la geocodificación. Hasta cierto punto son libres. Tienen límites de volumen y términos de servicio (TOS) bastante estrictos que podrían ser un factor si comienzas a usar su servicio comercialmente y especialmente si lo integras en otro producto.

Tenga en cuenta que todos ellos hacen "aproximación de direcciones" NO verificación de direcciones. Podrán decirle aproximadamente dónde se encontraría una dirección en una determinada calle SI la dirección existe. No pueden decirle que la dirección que está buscando existe. Una forma de verificar esto es mirar su propia dirección en Google Maps. Acércate a la vista de la calle y verás que dicen que "la dirección es aproximada", aunque es posible que tengan la ubicación exacta. Simplemente no tienen la lista maestra de direcciones para comparar y saber qué direcciones son reales. Para eso, necesitarás algún tipo de verificación de dirección.

La verificación de direcciones estandariza y limpia una dirección determinada de forma muy similar a los servicios de mapas gratuitos, pero también compara las direcciones con la base de datos de entrega de las bases de datos de USPS para confirmar si realmente existe la dirección. La dirección confirmada se puede geocodificar con una precisión mejorada.

Hay muchos buenos servicios de verificación de direcciones. En el interés de la revelación completa, soy el fundador de one-- SmartyStreets.

1

Google también devuelve esta misma respuesta si no se encontraron direcciones que coincidan con. No necesariamente significa que has excedido la cuota. En cualquier caso, será mejor que atrape la excepción y ponga en práctica un rescate a su alrededor.

+0

Esto no es cierto para V3. Obtienes una respuesta válida con cero resultados. No hay voto negativo, ya que puedes haber estado comentando sobre V2 y no sé cuál fue el resultado en ese momento. –

1

Mismo problema que user276648 aquí. Lo resolvió agregando la clave API y cambiando http a https.

Cuestiones relacionadas