Geocoding über HTTP mit dem Google-Maps Geocoding-Service

Posted by Eric Bartels

Der Google-Maps-Service ermöglicht Geocoding mittels HTTP-Anfragen. Eine feine Sache und dank JSON als Rückgabeformat und json_decode sehr einfach zu nutzen.

Problem mit dem Encoding und json_decode

Der folgende Code liefert nicht das erwartete Ergebnis. Die Funktion json_decode liefert für die Antwort ein “leeres Ergebnis”.

Eine Analyse von $reponse zeigt einen fehlerhaft codierten String. Das ß ist falsch codiert, obwohl der Reponse in UTF-8 vorliegt (vorliegen sollte).

// Hinweis: Fehlerauswertung fehlt hier gänzlich,
// was in produktivem Code nicht sein darf!
$handle = curl_init ();
$url    = "http://maps.google.de/maps/geo?key=myKey&output=json";
$url   .= "&q=Vollmerhauser Straße 115, 51645 Gummersbach, Deutschland";
 
// Set curl options
curl_setopt ($handle, CURLOPT_URL, $url);
curl_setopt ($handle, CURLOPT_RETURNTRANSFER, 1);
 
// Get code and parse json
$response = curl_exec ($handle);
$json     = json_decode ($response);
 
curl_close ($handle);

Fügt man jedoch einen User-Agent als curl-option (CURLOPT_USERAGENT) hinzu, ist das Ergebnis korrekt und json_decode verrichtet seinen Dienst, wie erwartet. Ein sehr seltsames Verhalten…

// ... Code siehe oben
curl_setopt ($handle, CURLOPT_USERAGENT, 
    'Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.7.6) Gecko/20050309 Firefox/1.0.1');
// ... Code siehe oben

StatusCode 620 (G_GEO_TOO_MANY_QUERIES)

Der Geocoder liefert eigene Response-Codes (GGeoStatusCode) um den Status der Geocodierung anzuzeigen. Bei vielen Anfragen tritt häufig der Response-Code 620 (G_GEO_TOO_MANY_QUERIES) auf.

Google beschränkt also die Anzahl der Geocoding-Operation pro Sekunde. Deshalb müssen die Anfragen limitiert werden.

// Warte 100ms
usleep (100000);

Nun sinkt natürlich der Datendurchsatz, aber damit kann man leben, denn die Anfragen werden richtig beantwortet.

Leave a Reply