Wenn ich mit Google Geocoder v3 versuche, 20 Adressen zu geocodieren, erhalte ich ein OVER_QUERY_LIMIT, es sei denn, ich habe einen Zeitabstand von ~ 1 Sekunde, aber dann dauert es 20 Sekunden, bis alle meine Markierungen platziert sind.
Gibt es eine andere Möglichkeit, als die Koordinaten im Voraus zu speichern?
javascript
geocoding
google-maps
Michiel van Oosterhout
quelle
quelle
Antworten:
Nein, es gibt keinen anderen Weg: Wenn Sie viele Standorte haben und diese auf einer Karte anzeigen möchten, ist die beste Lösung:
Dies ist natürlich in Anbetracht dessen, dass Sie viel weniger Standorte erstellen / ändern als Konsultationen von Standorten.
Ja, es bedeutet, dass Sie beim Speichern der Speicherorte etwas mehr Arbeit leisten müssen - aber es bedeutet auch:
quelle
Sie müssen tatsächlich nicht eine volle Sekunde auf jede Anfrage warten. Ich habe festgestellt, dass ich, wenn ich zwischen jeder Anforderung 200 Millisekunden warte, die Antwort OVER_QUERY_LIMIT vermeiden kann und die Benutzererfahrung passabel ist. Mit dieser Lösung können Sie 20 Elemente in 4 Sekunden laden.
quelle
setInterval
die Anzahl der benötigten Anfragen bearbeitensetTimeout
und diese festlegen100
- nur für den Fall, dass der Adressbetrag den Betrag irgendwann in der Zukunft verlängern wird20
.Leider ist dies eine Einschränkung des Google Maps-Dienstes.
Ich arbeite derzeit an einer Anwendung mit der Geokodierungsfunktion und speichere jede eindeutige Adresse auf Benutzerbasis. Ich generiere die Adressinformationen (Stadt, Straße, Bundesland usw.) basierend auf den von Google Maps zurückgegebenen Informationen und speichere dann auch die Lat / Long-Informationen in der Datenbank. Dies verhindert, dass Sie Dinge neu codieren müssen, und gibt Ihnen gut formatierte Adressen.
Ein weiterer Grund, warum Sie dies tun möchten, besteht darin, dass die Anzahl der Adressen, die von einer bestimmten IP-Adresse aus geokodiert werden können, täglich begrenzt ist. Sie möchten aus diesem Grund nicht, dass Ihre Bewerbung für eine Person fehlschlägt.
quelle
Ich habe das gleiche Problem beim Versuch, 140 Adressen zu geocodieren.
Meine Problemumgehung bestand darin, für jede Schleife der nächsten Geokodierungsanforderung usleep (100000) hinzuzufügen . Wenn der Status der Anforderung OVER_QUERY_LIMIT lautet, wird der Schlaf um 50000 erhöht und die Anforderung wiederholt und so weiter.
Und natürlich werden alle empfangenen Daten (lat / long) in einer XML-Datei gespeichert, damit die Anforderung nicht jedes Mal ausgeführt wird, wenn die Seite geladen wird.
quelle
BEARBEITEN:
Ich habe vergessen zu sagen, dass diese Lösung in reinem js vorliegt. Sie benötigen lediglich einen Browser, der Versprechen unterstützt. Https://developer.mozilla.org/it/docs/Web/JavaScript/Reference/Global_Objects/Promise
Für diejenigen, die dies noch tun müssen, habe ich meine eigene Lösung geschrieben, die Versprechen mit Timeouts kombiniert.
Code:
Bitte beachten Sie, dass dies nur ein Teil einer größeren Bibliothek ist, die ich für Google Maps geschrieben habe. Daher können Kommentare verwirrend sein.
Die Verwendung ist recht einfach, der Ansatz ist jedoch etwas anders: Anstatt jeweils eine Adresse zu schleifen und aufzulösen, müssen Sie ein Array von Adressen an die Klasse übergeben, die die Suche selbst abwickelt und ein Versprechen zurückgibt, das Wenn aufgelöst, wird ein Array zurückgegeben, das alle aufgelösten (und nicht aufgelösten) Adressen enthält.
Beispiel:
Konsolenausgabe:
Zurückgegebenes Objekt:
Die ganze Magie passiert hier:
Grundsätzlich durchläuft es jedes Element mit einer Verzögerung von 750 Millisekunden zwischen jedem Element, daher wird alle 750 Millisekunden eine Adresse gesteuert.
Ich habe einige weitere Tests durchgeführt und festgestellt, dass ich selbst bei 700 Millisekunden manchmal den Fehler QUERY_LIMIT bekam, während ich bei 750 überhaupt kein Problem hatte.
In jedem Fall können Sie die oben genannten 750 bearbeiten, wenn Sie sich durch eine geringere Verzögerung sicher fühlen.
Hoffe das hilft jemandem in naher Zukunft;)
quelle
Ich habe gerade Google Geocoder getestet und habe das gleiche Problem wie Sie. Ich habe festgestellt, dass ich den Status OVER_QUERY_LIMIT nur einmal alle 12 Anforderungen erhalte. Ich warte also 1 Sekunde (das ist die minimale Wartezeit). Dies verlangsamt die Anwendung, aber weniger als 1 Sekunde bei jeder Anforderung
Mit der grundlegenden HoldOn-Methode:
Ich hoffe es hilft
quelle