Anleitungen

Eine Liste von Koordinaten per Reverse-Geokodierung auflösen, ohne eine Schleife zu schreiben

Wenn Sie eine Tabelle mit Breiten- und Längengradpaaren und ein Skript haben, das die API einmal pro Zeile aufruft, bezahlen Sie für die Roundtrips, nicht für die Abfragen selbst. Der Endpunkt für die Reverse-Geokodierung akzeptiert einen Bulk-POST-Body genauso wie der Endpunkt für die Geokodierung und löst jedes Paar in einem einzigen Aufruf auf.

Koordinatenpaare senden

Statt einer GET-Anfrage pro Punkt senden Sie ein Array von Koordinatenobjekten an /v1/reverse. Jedes Element liefert seine eigene Adresse zurück, in der Reihenfolge, in der es übermittelt wurde.

POST /v1/reverse
Content-Type: application/json

[{"lat": 48.8584, "lon": 2.2945}, {"lat": 40.6892, "lon": -74.0445}]
{
  "status": "ok",
  "results": [
    {"formatted": "Champ de Mars, Paris, France", "lat": 48.8584, "lon": 2.2945, "type": "address", "precision": "street", "confidence": 0.9, "place_id": "gh789", "components": {}},
    {"formatted": "Liberty Island, New York, NY", "lat": 40.6892, "lon": -74.0445, "type": "address", "precision": "street", "confidence": 0.88, "place_id": "jk012", "components": {}}
  ]
}

Warum das besser ist als eine Schleife

Eine Schleife, die pro Koordinate eine HTTP-Anfrage abfeuert, erzeugt für jede Zeile Verbindungs-Overhead und erschwert den Überblick über Ihr Tageskontingent, da Sie Header über Hunderte separater Antworten vorbeiziehen sehen statt über eine einzige. Ein einzelner Bulk-Aufruf berechnet weiterhin eine Anfrage pro Element, die Gesamtkosten gegenüber Ihrem Kontingent sind also identisch, aber Sie haben nur einen Satz Kontingent-Header zu lesen und nur eine Stelle, an der Sie Fehler abfangen.

Die Antwort lesen

Jedes Ergebnis im Array entspricht der Koordinate, die Sie an derselben Position gesendet haben. Liegt ein Punkt an einer Stelle ohne Adresse in der Nähe, etwa auf offenem Wasser oder in einem großen nicht kartierten Gebiet, erwarten Sie einen niedrigeren Konfidenzwert oder einen gröberen Präzisionswert statt eines Fehlers. Prüfen Sie daher beide Felder, bevor Sie die formatierte Adresse in etwas verwenden, das Kunden zu sehen bekommen.

Ein zweites Beispiel: Kombination mit Zeitzonendaten

Ein häufiger nächster Schritt, sobald Sie Adressen für eine Liste von Koordinaten haben, ist herauszufinden, wie spät es an jedem dieser Orte ist. Statt die Ergebnisse ein zweites Mal in einer Schleife zu durchlaufen, übergeben Sie dieselbe Koordinatenliste als eigene Bulk-Anfrage an /v1/timezone. Sie erhalten zwei aufeinander abgestimmte Arrays, Adressen von /v1/reverse und Zeitzonenkennungen von /v1/timezone, beide in der ursprünglichen Zeilenreihenfolge, zum Preis von einer Anfrage pro Punkt und Endpunkt.

Ein Fehler, den Sie vermeiden sollten

Gehen Sie nicht davon aus, dass jede Koordinate in Ihrer Tabelle gültig ist, bevor Sie sie senden. Ein Breitengrad außerhalb von -90 bis 90 oder ein Längengrad außerhalb von -180 bis 180, was häufiger vorkommt, als es sollte, wenn in einer Tabelle Spalten vertauscht werden, zählt trotzdem als Anfrage, obwohl er kein sinnvolles Ergebnis liefern kann. Prüfen Sie die Wertebereiche in Ihrem eigenen Code, bevor der Batch rausgeht, statt für eine Abfrage zu bezahlen, die nie erfolgreich sein konnte.

Die Größe Ihrer Batches festlegen

Es ist nicht nötig, eine ganze Datenbanktabelle in einer Anfrage zu senden. Gruppieren Sie Koordinaten in Batches, deren Größe zu den Speicher- und Timeout-Grenzen Ihres eigenen Skripts passt, und behalten Sie im Blick, wie viele Anfragen jeder Batch vom kostenlosen Tageskontingent oder Ihrem Guthaben verbraucht. Die Header X-Quota-Used und X-Quota-Free-Remaining in jeder Antwort sagen Ihnen genau, wo Sie stehen, bevor Sie den nächsten Batch senden.

Eine vollständige Liste auf diese Weise per Reverse-Geokodierung aufzulösen, macht aus einer früher langsamen Schleife eine Anfrage pro Batch, wobei die API so oder so dieselbe Arbeit pro Element leistet. Alle Details zu Anfrage und Antwort finden Sie in der Dokumentation zur Reverse-Geokodierung.