Um aus einer beliebigen Adresse die wichtigen longitude und latitude Koordinaten herauszubekommen gibt es neben Javascript auch die Möglichkeit eine direkte http geocoding Anfrage an Google zu senden. Die Basis Adresse ohne Parameter lautet dazu: http://maps.google.com/maps/geo?

Damit Google weiß was zurückgesendet werden soll, müssen nun folgende 3 Parameter mitgeschickt werden

  1. q = die Adresse
  2. key = der Googlemap API Key
  3. output = das Format das zurückgeliefert werden soll (xml, kml, csv oder json)

Ein Beispiel für eine Anfrage wäre also zb.
http://maps.google.com/maps/geo?q=Austria+Vienna&output=xml&key=deingooglekey
Zurückkommen würde nun ein umfangreiches XML File mit sämtlichen Daten zu der angefragten Adresse, welches folgendermaßen aussieht.

Genug von der Theorie – ab zur Praxis

Nachdem wir nun wissen, wie eine Anfrage an Google aussehen muss, können wir das ganze mit php erledigen und uns die gewünschten Daten holen. Als erstes speichern wir unseren googlekey und unsere gewünschte Adresse in eine Variable.

$key ="deingooglekey";
$adresse="http://maps.google.com/maps/geo?q=Austria+Wien&output=xml&key=$key";

Als nächstes holen wir uns die Daten (das xml) aus unserer gewünschten Adresse

$urlinhalt=file_get_contents($adresse);

Nun stellen wir sicher, dass alle Sonderzeichen die im XML vorkommen umgewandelt werden, da wir ansonsten in weiterer folge probleme damit bekommen würden.

$urlinhalt = utf8_decode ($urlinhalt);

Nun wandeln wir unser XML File in ein SimpleXML Objekt um, was uns die Arbeit iin weiterer Folge unheimlich erleichtert. Diese SimpleXML Extension setzt PHP5 voraus. Ich kann das nur jedem empfehlen, da die XML Eigenschaften und Werte dadurch ganz einfach ansprechbar und abrufbar sind.

$xml = new SimpleXMLElement($urlinhalt);

Jetz können wir also ganz bequem unsere XML Eigenschaft und den dazugehörigen Wert abrufen. Unsere Koordinaten liegen von der XML Struktur her in: Response-Placemark-Point-coordinates. Um den gewünschten Wert nun ausgeben zu lassen müssen wir nur folgendes machen:

echo $xml->Response->Placemark->Point->coordinates;

Das Problem ist nun, dass die longitude und latitude Werte im XML in einem Wert stecken – wir müssen sie also trennen und in 2 verschiedene Variablen speichern. Dies machen wir folgendermaßen:

list($longitude, $latitude, $altitude) = explode(",",$xml->Response->Placemark->Point->coordinates);

Nun haben wir unsere Koordinaten sauber in den variablen $longitude und $latitude getrennt und können sie in eine Datenbank schreiben oder auch einfach nur ausgeben lassen:

echo "Longitude: $longitude, Latitude: $latitude";

Der Gesamte PHP Code sieht folgendermaßen aus

// Angabe deines Google Api Keys
$key ="deingooglekey";

//Angabe der Adresse, von der die Koordinaten geholt werden sollen
$adresse="http://maps.google.com/maps/geo?q=Austria+Wien&output=xml&key=$key";

//XML File von google holen
$urlinhalt=file_get_contents($adresse);

//XML File utf8 konvertieren
$urlinhalt = utf8_decode ($urlinhalt);

//SimpleXMLElement Objekt erstellen
$xml = new SimpleXMLElement($urlinhalt);

//Koordinaten auslesen - trennen - und in 2 variablen speichern
list($longitude, $latitude, $altitude) = explode (",",$xml->Response->Placemark->Point->coordinates);

//Koordinaten ausgeben
echo "Longitude: $longitude, Latitude: $latitude";

Der Code lässt sich natürlich noch um einiges verfeiern und optimieren – so könnte man z.B.: bei erfolgloser Rückgabe einen weiteren Versuch bei Yahoo oder einem anderen Geocoding Service starten.

  1. Cornelius Keller schreibt:

    Wenn man aus dem XML noch weitere informationen auslesen möchte wie z.B den Stadteil oder ählniches, so solte man utf8_decode utf8_encode ersetzen. Sonst sind die umlaute im xml kaputt.

    Deutsche Ortsnamen scheinen eben gerade nicht utf8 codiert zu sein in der Antwort, und da stolpert dann der XML parser drüber.

  2. Daniel Seelig schreibt:

    Hallo,

    kann ich den Adressparameter auch noch um Straßennamen und Hausnummer erweitern?

    Also so z.B.

    q=Germany+Pirna+Remscheider Straße+11

    Oder wie muss das richtig aussehen?

    Danke für eine Antwort Gruß Daniel

Sag was zu Daniel Seelig Kommentar abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>