Geocoding
Geocoding ist der Vorgang, aus Freitext-Adressinformationen (z.B. einer normalen postalischen Adresse) Geokoordinaten zu ermitteln. Seit dem Start von Google Maps und ähnlichen Kartendiensten gibt es eine Reihe frei zugänglicher APIs, mit denen Geocoding einfach übers Web möglich ist.- Google Maps Geocoding API
Diese Google API ermöglicht es, pro Tag bis zu 2.500 Adressen geokodieren zu lassen. Zudem fordert Google, dass nur Adressen geokodiert werden dürfen, wenn diese anschließend auf einer Google-Karte angezeigt werden. - Yahoo PlaceFinder
Die Yahoo PlaceFinder API ersetzt die alte Yahoo Geocoding API. PlaceFinder lässt bis zu 50.000 Abfragen pro Tag zu, benötigt aber eine kostenlose Application ID. - Bing Maps APIs
Auch Bing bietet über seine Maps APIs einen Geocoding-Service an. Allerdings sind die dortigen Informationen extrem unübersichtlich, so dass ich keine weiteren Infos dazu liefern kann. - Fetegeo
Einen etwas anderen Ansatz verfolgt der Free text geocoder (Fetegeo). Fetegeo ist kein Webservice, sondern ein "geocoding framework", das auf verschiedene Datensätze zurückgreifen kann.
Geocoding Schritt-für-Schritt
Da die Yahoo-Geocoding-API REST-basiert ist, lässt sich der Umgang damit sehr einfach von Hand ausprobieren. Die URL zum Aufruf der API hat diese Form:
http://where.yahooapis.com/geocode?q=ADRESSE&appid=[yourappidhere]Um die API zu testen, müssen wir lediglich ADRESSE durch den zu kodierenden Adressstring ersetzen und dabei beachten, dass dieser Adressstring URL-kodiert angegeben wird. (Wobei dazu meist ausreicht, Leerzeichen durch ein Pluszeichen zu ersetzen.)
Nehmen wir als Beispiel die Adresse Marienplatz 1 München.
http://where.yahooapis.com/geocode?q=Marienplatz+1+Muenchen&appid=[yourappidhere]
Als Ergebnis erhalten wir folgendes XML, in dem die zentralen Infos (rot hervorgehoben) als latitude und longitude angegeben sind:
<?xml version="1.0" encoding="UTF-8"?>
<ResultSet version="1.0">
<Error>0</Error>
<ErrorMessage>No error</ErrorMessage>
<Locale>us_US</Locale>
<Quality>87</Quality>
<Found>1</Found>
<Result>
<quality>87</quality>
<latitude>48.137265</latitude>
<longitude>11.574798</longitude>
<offsetlat>48.137276</offsetlat>
<offsetlon>11.574738</offsetlon>
<radius>500</radius>
<name></name>
<line1>Marienplatz 1</line1>
<line2>80331 Munich</line2>
<line3></line3>
<line4>Germany</line4>
<house>1</house>
<street>Marienplatz</street>
<xstreet></xstreet>
<unittype></unittype>
<unit></unit>
<postal>80331</postal>
<neighborhood></neighborhood>
<city>Munich</city>
<county>Munich</county>
<state>Bavaria</state>
<country>Germany</country>
<countrycode>DE</countrycode>
<statecode>BY</statecode>
<countycode></countycode>
<uzip>80331</uzip>
<hash>BA8AEE043BEE1968</hash>
<woeid>12836562</woeid>
<woetype>11</woetype>
</Result>
</ResultSet>
<!-- gws14.maps.ch1.yahoo.com uncompressed/chunked Fri Jan 21 03:19:37 PST 2011 -->
Überprüfen wir nun, ob diese Daten auch korrekt sind. In Google Maps lassen sich Geokoordinaten einfach als Suchanfrage in der Reihenfolge latitude longitude eingeben:
Google Maps Marienplatz 1 München
Offensichtlich hat unser Geocoding-von-Hand funktioniert und wir sehen, wie einfach sich heute Geodaten im Web nutzen lassen.
Sprache auswählen
In der Standardeinstellung geben die APIs die Adressen in Englisch zurück. Das ist dann ein Problem, wenn es für den ermittelten Ort einen eigenen englischsprachigen Begriff gibt, so wie in unserem Beispiel oben. Dort sagt uns die Yahoo-API, der Ort hieße "Munich". Möchten wir aber "München" erhalten, so müssen wir jeweils die Ergebnissprache umstellen. Für die Yahoo PlaceFinder-API geht das mit dem Parameter
locale=de_DE:Unser obiges Beispiel würde dann so aussehen:
http://where.yahooapis.com/geocode?q=Marienplatz+1+Muenchen&locale=de_DE&appid=[yourappidhere]
Für die Google-Geocoding-API muss im GeocodeRequest-Objekt das Feld
language entsprechend der gewünschten Sprache gesetzt werden.Geocoding mit der Google Maps API
Auch für Google gibt es eine sehr einfache REST-basierte Abfragemöglichkeit:
http://maps.google.com/maps/api/geocode/xml?sensor=false&address=Marienplatz+1+Muenchen&language=de
Ein API-Key wird dafür nicht (mehr) benötigt, dafür ist die Schnittstelle auf 2.500 Abfragen pro Tag beschränkt. Wird in der URL xml durch json ersetzt, liefert die API eine Antwort im JSON-Format. Dieses Format lässt sich meist einfacher weiterverarbeiten und ist deshalb recht empfehlenswert.