Frage

Ich versuche, eine schöne Möglichkeit, um herauszufinden, die Rate zu begrenzen, mit der ich geocode Anfragen an den Google Maps API v3 Geocoder Service senden. Ich weiß, dass Javascript hat keinen schönen wait oder sleep weil seine Ausführung ist für die Zeit ist, Single-Thread.

Jede Geocoder Anfrage innerhalb einer jQuery each Funktion gesendet. Also, das allgemeine Code Skelett ist:

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

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

    // do more stuff
    ...
}

Wie kann ich ein festes Intervall zwischen jedem Anruf zu warten, um geocode? Wenn ich jede Anforderung senden, so schnell wie Javascript ausgeführt wird, dann schnell beginne ich OVER_QUERY_LIMIT Antworten empfangen - auch wenn ich nur 20 Anfragen bin das Senden. Dies ist zu erwarten, und ich versuche, meinen Klienten gut mit dem Google-Service spielen zu machen.


Eine alternative Route, die ich bereit bin, ist, zu verfolgen vollständig Javascript für Geocoding verlassen und alles in Java schreiben. Mit Java wäre es wirklich einfach zwischen den Anfragen zu schlafen.

Allerdings kann ich nicht einen Weg finden, die Google-Geocoding Service zu nutzen (insbesondere unter Verwendung von Version 3 der API) in Java. GeoGoogle scheint mehr als ein Jahr nicht mehr aktuell zu sein und verwendet v2.

Kann es in Java getan werden, und wenn ja, wie?

War es hilfreich?

Lösung

Ihre beste Wette eine Art Rate begrenzte Einreichungen zu implementieren wäre ein Timer-Objekt und eine Warteschlange zu verwenden. Der Timer wird mit einer festen Rate geplant auf unbestimmte Zeit (jQuery hat einige sehr schöne Timer-Implementierungen) und im Körper dieser Timer zu laufen, knallen Sie etwas aus der Warteschlange und abschicken und dann beenden. Sie anderen Code fügt dann Dinge dieser Warteschlange nach Bedarf.

Andere Tipps

Google ist aktiv an der Entwicklung v2 und v3 der Maps API getrennt. v3 ist eine viel schlankere Version geeignet für Geräte mit begrenzten Prozessorleistung oder Grunde Mapping Aufgaben (und muss nicht einen API-Schlüssel arbeiten).

In jedem Fall, wenn Sie viele Dinge sind Geokodierung Sie wahrscheinlich mit Googles HTTP Geocodierungsdienst ( http://code.google.com/apis/maps/documentation/geocoding/index.html ). Dadurch wird die Rate Limiting Problem vermeiden.

Und FWIW: Javascript Grund Schlaf tun können / warten Operationen mit setInterval () und setTimeout (). Feuer nur die Anforderung und setzen Sie den Timer am Ende Ihrer Callback-Verarbeitung wieder zu tun.

Hier ist ein Ausschnitt aus meinem Skript, im Grunde versucht es erneut, wenn es trifft 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');
        }
    });
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top