Domanda

Sto cercando di capire un bel modo per limitare il tasso al quale mando le richieste di geocode alle API v3 servizio di geocoding di Google Maps. So che Javascript non ha alcuna wait piacevole o sleep perché la sua esecuzione è, per il momento, single-threaded.

Ogni richiesta geocodificatore viene inviata all'interno di una funzione each jQuery. Quindi, il codice lo scheletro generale è:

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

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

    // do more stuff
    ...
}

Come posso impostare un intervallo fisso di attesa tra ogni chiamata a geocode? Se invio ogni richiesta il più velocemente Javascript verrà eseguito, poi comincio subito ricevere risposte OVER_QUERY_LIMIT - anche se sto inviando solo 20 richieste. Questo è previsto, e sto cercando di fare il mio cliente gioca bene con il servizio di Google.


Un percorso alternativo che sono disposto a perseguire è quello di abbandonare completamente Javascript per geocoding, e scrivere tutto in Java. Con Java sarebbe davvero facile dormire in tra le richieste.

Tuttavia, non riuscivo a trovare un modo per utilizzare il servizio di geocodifica di Google (in particolare, utilizzando la versione 3 della API) in Java. GeoGoogle sembra essere più di un anno fuori moda, e utilizza v2.

Può essere fatto in Java, e se sì, come?

È stato utile?

Soluzione

La cosa migliore per attuare una sorta di osservazioni tasso limitato potrebbe essere quella di utilizzare un oggetto timer e una coda. Il timer è previsto ad un tasso fisso a tempo indeterminato (jQuery ha alcune molto belle implementazioni di timer) e nel corpo di quel timer, è pop qualcosa fuori la coda e lo presenta e poi finire. È altro codice aggiunge poi le cose a quella coda a seconda delle necessità.

Altri suggerimenti

Google sta sviluppando attivamente v2 e v3 della API di Google Maps a parte. v3 è una versione molto più sottile adatto a dispositivi con potenza di elaborazione limitata o le attività di mappatura di base (e non ha bisogno di una chiave API per lavorare).

In entrambi i casi, se si sta geocoding molte cose che si dovrebbero probabilmente guardare con servizio di geocodifica HTTP di Google ( http://code.google.com/apis/maps/documentation/geocoding/index.html ). Ciò eviterà il problema rate limiting.

E FWIW: Javascript può fare il sonno di base / attendere operazioni utilizzando setInterval () e setTimeout (). Basta sparare la richiesta e resettare il timer di farlo di nuovo alla fine del processo di richiamata.

Ecco un frammento dal mio script, in fondo si prova ancora se colpisce 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');
        }
    });
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top