Geocodificar una dirección obteniendo sus coordenadas

Cómo obtener la latitud y longitud de una dirección postal en PHP

Mediante la API de Google Maps podemos gecodificar una dirección postal, obteniendo así su latitud y logitud.

Por ejemplo, si geocodificamos la direccion "Madrid. Madrid. Comunidad de Madrid. España" (municipio. provincia. comunidad. país) obtendremos las coordenadas 40.4166909, -3.7003454 que corresponden al centro de Madrid.

Cómo geocodificar en PHP usando Google maps

Aquí dejo una función en PHP que permite fácilmente geocodificar una dirección:

/**

 * busca en google maps las coordenadas de una dirección

 * @param string $address

 * @param int $intento número de intento de geocodificación. Se utiliza internamente para reintentar la llamada a Google Maps si está saturado.

 * @return mixed coordenadas en un array o false en caso de no completar la consulta

 */


function gecodificar_en_google_maps($address,$intento=0) {



    // Google maps API v2 docs: http://code.google.com/intl/es-ES/apis/maps/documentation/javascript/v2/services.html

    $url = "http://maps.google.com/maps/geo?q=".urlencode($address)."&output=json";



    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);

    curl_setopt($ch, CURLOPT_HEADER,0);

    curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER["HTTP_USER_AGENT"]);

    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);     

    $data = curl_exec($ch);

    curl_close($ch);



    $data=json_decode($data);



    //Revisamos los códigos de estado de la respuesta.

    if ($data->Status->code=='200') {

        //TODO ¿revisar precisión? (Accuracy<=4)

        $coordenadas=$data->Placemark[0]->Point->coordinates;

        return (array('latitud'=>$coordenadas[1],'longitud'=>$coordenadas[0]));

    } else {

        if ($data->Status->code== '620'  && $intento<3) {

            //servidor saturado, se reintenta 3 veces como máximo

            sleep(0.5);

            $coordenadas=gecodificar_en_google_maps($address,$intento++);

            return $coordenadas;

        } else {                    

            return false;

        }

    }

}

Ejemplo de uso

Podéis probar un script que geocodifica todos los municipios de España: geocodificar.php. La base de datos para este ejemplo la tenéis disponible en la entrada de municipios de España con sus coordenadas.