Mittels eines kleinen Dreizeilers und der Hilfe von OpenStreetMap kann man mit PHP Adressen in WGS84-Geokoordinaten verwandeln:

/**
 * Convert address into WGS84 geo coordinates.
 * @see http://wiki.openstreetmap.org/wiki/Nominatim
 * @param string $address
 * @return array with lat / lon
 */
function getCoordinates(string $address): array
{
    $url = 'https://nominatim.openstreetmap.org/search?q=' . urlencode($address) . '&format=json&limit=1';
    $json = json_decode(file_get_contents($url), true);

    return (!empty($json[0])) ? $json[0] : ['lat' => null, 'lon' => null];
}

Diese Lösung ignoriert natürlich ein paar Komplikationen, die beim Anfragen der Schnittstelle auftreten können. Für eine einfache Anfrage mit geringer Frequenz und ggf. auch längerer Antwortzeit liefert die o.a. Funktion ein ganz passables Ergebnis.

Komplizierter geht immer

Nach einem Refactoring mit cURL sieht das bereits deutlich komplexer aus, kann aber auch auf deutlich mehr Fehlerfälle reagieren und bricht bei Timeouts auch ab:

function getCoordinates(string $address): array
{
    $url = 'https://nominatim.openstreetmap.org/search?q=' . urlencode($address) . '&format=json&limit=1';
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 3);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Some PHP Function');
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Accept: application/json']);
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($httpCode < 300 && $response) {
        $json = json_decode($response, true);
        if ($json[0]) {
            return $json[0];
        }
    }

    return ['lat' => null, 'lon' => null];
}

Die API ist aber nicht für den Einsatz für Bulk-Adressumwandlung geeignet – wie auch die Nutzungsbedingung der API erläutern.


Andere Artikel zum Thema · · · ·

Zuletzt geändert am

fboës - Der Blog