Pregunta

Estoy tratando de encontrar una buena manera de limitar la velocidad a la que envío solicitudes de codificación geográfica para el servicio geocodificador versión 3 del API de Google Maps. Yo sé que Javascript no tiene ningún wait agradable o sleep porque su ejecución es, por el momento, de un solo subproceso.

Cada solicitud geocodificador se envía dentro de una función each jQuery. Así, el esqueleto código general es:

$(xml).find('foo').each(function(){
    // do stuff
    ...

    geocoder.geocode(request, function(results, status) {/* do other stuff */});

    // do more stuff
    ...
}

¿Cómo puedo configurar un intervalo fijo que esperar entre cada llamada a geocode? Si envío cada solicitud tan rápido como Javascript se ejecutará, a continuación, rápidamente me comienzo a recibir respuestas OVER_QUERY_LIMIT - incluso si sólo voy a enviar 20 solicitudes. Se espera que esto, y estoy tratando de hacer mi cliente juega muy bien con el servicio de Google.


Una ruta alternativa que estoy dispuesto a seguir es abandonar por completo Javascript para geocodificación, y escribirlo todo en Java. Con Java sería realmente fácil dormir en medio de las solicitudes.

Sin embargo, no pude encontrar una manera de utilizar el servicio de geocodificación de Google (en concreto, el uso de la versión 3 de la API) en Java. GeoGoogle parece ser más de un año fuera de fecha, y utiliza v2.

¿Se puede hacer en Java, y si es así, ¿cómo?

¿Fue útil?

Solución

Su mejor opción para implementar algún tipo de presentaciones tasa limitada debería ser el uso de un objeto de temporizador y una cola. El temporizador está programado a una tasa fija para funcionar indefinidamente (jQuery tiene algunas muy buenas implementaciones de temporizador) y en el cuerpo de ese temporizador, pop algo de la cola y enviarlo y luego terminar. Usted otro código, a continuación añade cosas a esa cola, según sea necesario.

Otros consejos

Google está desarrollando activamente v2 y v3 de la API de Google Maps por separado. v3 es una versión mucho más delgado adecuado para los dispositivos con capacidad de procesamiento limitada o tareas básicas de mapeo (y no necesita una clave de API a trabajar).

En cualquier caso, si está geocodificación muchas cosas que probablemente debería buscar en el uso de servicios de geocodificación HTTP de Google ( http://code.google.com/apis/maps/documentation/geocoding/index.html ). Esto evitará el problema limitante de la velocidad.

Y fwiw: Javascript puede hacer el sueño básica / espere operaciones utilizando setInterval () y setTimeout (). Sólo el fuego la solicitud y restablecer el temporizador de hacerlo de nuevo al final de su proceso de devolución de llamada.

Aquí hay un fragmento de mi guión, básicamente se trata de nuevo si se golpea google.maps.GeocoderStatus.OVER_QUERY_LIMIT

function(results, status) {
    // If the limit is reached try again in a second
        if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {

            window.setTimeout(
                function() {self.resolveAddress(addr);},1000
            );
        } else if (status == google.maps.GeocoderStatus.OK) {
            // Do something clever
        } else if (status == google.maps.GeocoderStatus.ZERO_RESULTS) {
            self.reduce(addr); // Try removing something from addr
        } else {
            atira.log('Something terrible happened');
        }
    });
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top