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;
}
}
}
* 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.