Geocoding über HTTP mit dem Google-Maps Geocoding-Service
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.
- March 7th
Leave a Reply