Question

Je suis en train de trouver un bon moyen de limiter la vitesse à laquelle j'envoie des demandes de géocodage à l'API Google Maps v3 Service de géocodage. Je sais que Javascript n'a pas bien wait ou sleep parce que son exécution est, pour le moment, un seul thread.

Chaque demande de géocodage est envoyé à l'intérieur d'une fonction de each jQuery. Ainsi, le squelette de code général est:

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

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

    // do more stuff
    ...
}

Comment puis-je définir un intervalle fixe d'attendre entre chaque appel à geocode? Si je vous envoie chaque demande aussi vite que Javascript fonctionnera, je commence rapidement recevoir des réponses de OVER_QUERY_LIMIT - même si je n'envoyer 20 demandes. Cela devrait, et je suis en train de faire mon client jouer bien avec le service de Google.


Un autre itinéraire Je suis prêt à poursuivre est d'abandonner complètement Javascript pour le géocodage, et d'écrire tout en Java. Avec Java, il serait vraiment facile de dormir entre les deux demandes.

Cependant, je ne pouvais pas trouver un moyen d'utiliser le service de géocodage de Google (en particulier, en utilisant la version 3 de l'API) en Java. GeoGoogle semble être plus d'un an sur la date et utilise v2.

Peut-il être fait en Java, et si oui, comment?

Était-ce utile?

La solution

Votre meilleur pari pour mettre en œuvre une sorte de soumissions limité à taux serait d'utiliser un objet de la minuterie et une file d'attente. La minuterie est prévue à un taux fixe pour exécuter indéfiniment (jQuery a quelques implémentations de minuterie très agréable) et dans le corps de cette minuterie, vous pop quelque chose hors de la file d'attente et de le soumettre, puis terminer. Vous autre code ajoute alors les choses à cette file d'attente au besoin.

Autres conseils

Google développe activement v2 et v3 de Maps API séparément. v3 est une version beaucoup plus mince adapté pour les appareils avec une puissance de traitement limitée ou des tâches de cartographie de base (et n'a pas besoin d'une clé API pour travailler).

Dans les deux cas, si vous géocodage beaucoup de choses que vous devriez probablement à utiliser le service de géocodage HTTP de Google ( http://code.google.com/apis/maps/documentation/geocoding/index.html ). Cela évitera le taux limite question.

Et FWIW: Javascript peut faire le sommeil de base / attendre les opérations utilisant setInterval () et setTimeout (). Il suffit de tirer la demande et remettre la minuterie à le faire à nouveau à la fin de votre traitement de rappel.

Voici un extrait de mon script, au fond, il essaie à nouveau si elle touche 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');
        }
    });
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top