Optimieren der Kontingentnutzung beim Geocoding

Beim Geocoding werden Adressen („1600 Amphitheatre Parkway, Mountain View, CA“) in geografische Koordinaten (37.423021, -122.083739) umgewandelt. Anhand dieser Koordinaten können Sie dann Markierungen setzen oder die Karte positionieren. Die Google Maps Platform APIs bieten zwei Ansätze für das Geocoding:

  • Clientseitiges Geocoding, das im Browser ausgeführt wird, in der Regel als Reaktion auf Nutzeraktionen. Die Maps JavaScript API bietet Klassen, die die Anfragen für Sie ausführen. Dieser Ansatz wird in der Dokumentation zur Maps JavaScript API beschrieben.
  • Serverseitige HTTP-Geocodierung, mit der Ihr Server Geocodes direkt bei den Google-Servern abfragen kann. Die Geocoding API ist der Webdienst, der diese Funktion bereitstellt. In der Regel binden Sie diesen Dienst in anderen Code ein, der serverseitig ausgeführt wird. Das serverseitige Geocoding wird in der Dokumentation zur Geocoding API beschrieben.

Beispiele für clientseitiges und serverseitiges Geocoding

Hier sehen Sie ein Beispiel für die clientseitige Geocodierung. Dabei wird eine Adresse geocodiert, die Kartenmitte an diese Position verschoben und dort eine Kartenmarkierung hinzugefügt:

geocoder = new google.maps.Geocoder();
geocoder.geocode({ 'address': address }, function(results, status) {
  if (status == google.maps.GeocoderStatus.OK) {
    map.setCenter(results[0].geometry.location);
    var marker = new google.maps.Marker({
      map: map,
      position: results[0].geometry.location
    });
  }
});

Weitere Beispiele finden Sie in der Dokumentation zur Maps JavaScript API.

Hier ist ein Beispiel für eine serverseitige Geocoding-Anfrage in Python:

import urllib2

address="1600+Amphitheatre+Parkway,+Mountain+View,+CA"
key="my-key-here"
url="https://maps.googleapis.com/maps/api/geocode/json?address=%s&key=%s" % (address, key)

response = urllib2.urlopen(url)

jsongeocode = response.read()

Hierdurch wird ein JSON-Objekt mit folgendem Inhalt erstellt:

{
  "status": "OK",
  "results": [ {
    "types": street_address,
    "formatted_address": "1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA",
    "address_components": [ {
      "long_name": "1600",
      "short_name": "1600",
      "types": street_number
    }, {
      "long_name": "Amphitheatre Pkwy",
      "short_name": "Amphitheatre Pkwy",
      "types": route
    }, {
      "long_name": "Mountain View",
      "short_name": "Mountain View",
      "types": [ "locality", "political" ]
    }, {
      "long_name": "San Jose",
      "short_name": "San Jose",
      "types": [ "administrative_area_level_3", "political" ]
    }, {
      "long_name": "Santa Clara",
      "short_name": "Santa Clara",
      "types": [ "administrative_area_level_2", "political" ]
    }, {
      "long_name": "California",
      "short_name": "CA",
      "types": [ "administrative_area_level_1", "political" ]
    }, {
      "long_name": "United States",
      "short_name": "US",
      "types": [ "country", "political" ]
    }, {
      "long_name": "94043",
      "short_name": "94043",
      "types": postal_code
    } ],
    "geometry": {
      "location": {
        "lat": 37.4220323,
        "lng": -122.0845109
      },
      "location_type": "ROOFTOP",
      "viewport": {
        "southwest": {
          "lat": 37.4188847,
          "lng": -122.0876585
        },
        "northeast": {
          "lat": 37.4251799,
          "lng": -122.0813633
        }
      }
    }
  } ]
}

Der serverseitige Geocoder bietet auch ein XML-Format als Alternative zu JSON. Weitere Beispiele findest du in der Dokumentation zur Geocoding API und in den Clientbibliotheken für Python und andere Sprachen.

Überlegungen zu Kontingenten und Kosten

Geocoding-Kosten, Kontingente und Ratenbegrenzungen basieren auf den in diesem Dokument beschriebenen Strategien.

Kosten

Für Geocoding-Anfragen werden Kontingent-pro-Tag-Limits (QPD) nicht mehr verwendet. Stattdessen wird jede Geocoding-Anfrage – ob clientseitig über den Browser oder serverseitig über den Geocoding API-Webdienst – pro-jedem Preis abgerechnet. Zur Verwaltung der Nutzungskosten sollten Sie Ihr Tageskontingent begrenzen.

Ratenbegrenzungen

Der Geocoding-Dienst ist auf 3.000 Abfragen pro Minute beschränkt, die als Summe aus clientseitigen und serverseitigen Abfragen berechnet werden.

Wenn clientseitige Geocoding-Anfragen in regelmäßigen Intervallen ausgeführt werden, z. B. in einer mobilen App, geben Ihre Anfragen möglicherweise Fehler zurück, wenn alle Nutzer gleichzeitig Anfragen stellen (z. B. alle in derselben Sekunde jeder Minute). Ziehen Sie eine der folgenden Lösungen in Betracht, um dies zu vermeiden:

  • Führen Sie die Anforderungen in zufälligen Intervallen durch (Jitter). Achten Sie darauf, dass die Anfragen in Ihrer gesamten Nutzerbasis zufällig durchgeführt werden.
  • Verwende bei der Entwicklung für Android einen ungenagten sich wiederholenden Wecker.
  • Wenn du für Android entwickelst, wähle eine geeignete Standortstrategie aus.

Caching

Weitere Informationen zum Caching finden Sie in den Geocoding API-Richtlinien.

Wann sollte clientseitiges Geocoding verwendet werden?

Die kurze Antwort lautet „fast immer“. Hierfür gibt es folgende Gründe:

  • Clientseitige Anfragen und Antworten bieten Nutzern eine schnellere, interaktivere Erfahrung.
  • Eine clientseitige Anfrage kann Informationen enthalten, mit denen die Geocoding-Qualität verbessert wird: Nutzersprache, Region und Darstellungsbereich.

Clientseitiges Geocoding eignet sich insbesondere dann am besten, wenn Adressen auf Nutzereingaben basieren.

Es gibt zwei Basisarchitekturen für clientseitiges Geocoding:

  • Sie führen den Geocoding-Vorgang und die Darstellung vollständig im Browser durch. Beispielsweise gibt der Nutzer eine Adresse auf Ihrer Seite ein. Diese wird von Ihrer Anwendung geocodiert. Anschließend verwendet Ihre Seite den Geocode, um eine Markierung auf der Karte zu erstellen. Ihre App führt auch einige einfache Analysen mithilfe der Geocodierung durch. Es werden keine Daten an den Server gesendet, wodurch die Datenlast auf dem Server reduziert wird.
  • Sie führen den Geocoding-Vorgang im Browser durch und senden ihn dann an den Server. Angenommen, der Nutzer gibt eine Adresse auf Ihrer Seite ein. Ihre Anwendung geocodiert ihn im Browser. Die App sendet die Daten dann an den Server. Der Server antwortet mit einigen Daten, z. B. POIs in der Nähe. So können Sie eine Antwort anhand Ihrer eigenen Daten anpassen.

Wann sollte serverseitiges Geocoding verwendet werden?

Die serverseitige Geocodierung eignet sich am besten für Anwendungen, bei denen Sie Adressen ohne Eingabe eines Clients geocodieren müssen. Ein gängiges Beispiel: Sie erhalten ein Dataset, das unabhängig von einer Nutzereingabe stammt, z. B. wenn Sie einen festen, endlichen und bekannten Satz von Adressen haben, die geocodiert werden müssen. Das serverseitige Geocoding kann auch als Sicherung für den Fall nützlich sein, dass das clientseitige Geocoding fehlschlägt.

Mögliche Bedenken sind eine unnötige Erhöhung der Latenz für den Nutzer sowie Geocoding-Ergebnisse von geringerer Qualität als clientseitig, da weniger Informationen in der Anfrage verfügbar sind.