Cómo obtener la latitud y longitud de una imagen en PHP

Mediante el el etiquetado geográfico es posible asignar una ubicación geográfica a una imagen. Es decir, en otras palabras, podemos relacionar una imagen a una latitud y longitud concreta. Es posible realizar etiquetar geográficamente una imágen de dos maneras: automáticamente o manualmente. Si la geolocalización está activada, el dispositivo con el que captures la imagen realizará el etiquetado geográfico automáticamente. Pero como he dicho antes, no solo existe esa vía, también podemos agregar información sobre dónde hemos tomado la imagen manualmente.

En este tutorial te mostraré cómo obtener esa información geográfica de una imagen en PHP. En concreto, en este ejemplo lo que conseguiremos es la latitud y la longitud de una imagen que esté etiquetada geográficamente. Esta información, como ya sabes, la podremos utilizar para localizar la imagen en un mapa de Google.

Obtener la latitud y longitud de una imagen

La función de PHP exif_read_data() es capaz de leer las cabeceras EXIF de un fichero de imagen. Utilizaremos dicha función para obtener los datos GPS de la imagen. Para un mejor uso, agruparemos todo el código junto en un función de PHP personalizada a la que llamaremos get_image_location(). La función get_image_location() devolverá un array con la latitud y longitud del fichero de imagen, el cual pasaremos como parámetro de la función.

/**
 * get_image_location
 * Returns an array of latitude and longitude from the Image file
 * @param $image file path
 * @return multitype:array|boolean
 */
function get_image_location($image = ''){
    $exif = exif_read_data($image, 0, true);
    if($exif && isset($exif['GPS'])){
        $GPSLatitudeRef = $exif['GPS']['GPSLatitudeRef'];
        $GPSLatitude    = $exif['GPS']['GPSLatitude'];
        $GPSLongitudeRef= $exif['GPS']['GPSLongitudeRef'];
        $GPSLongitude   = $exif['GPS']['GPSLongitude'];
        
        $lat_degrees = count($GPSLatitude) > 0 ? gps2Num($GPSLatitude[0]) : 0;
        $lat_minutes = count($GPSLatitude) > 1 ? gps2Num($GPSLatitude[1]) : 0;
        $lat_seconds = count($GPSLatitude) > 2 ? gps2Num($GPSLatitude[2]) : 0;
        
        $lon_degrees = count($GPSLongitude) > 0 ? gps2Num($GPSLongitude[0]) : 0;
        $lon_minutes = count($GPSLongitude) > 1 ? gps2Num($GPSLongitude[1]) : 0;
        $lon_seconds = count($GPSLongitude) > 2 ? gps2Num($GPSLongitude[2]) : 0;
        
        $lat_direction = ($GPSLatitudeRef == 'W' or $GPSLatitudeRef == 'S') ? -1 : 1;
        $lon_direction = ($GPSLongitudeRef == 'W' or $GPSLongitudeRef == 'S') ? -1 : 1;
        
        $latitude = $lat_direction * ($lat_degrees + ($lat_minutes / 60) + ($lat_seconds / (60*60)));
        $longitude = $lon_direction * ($lon_degrees + ($lon_minutes / 60) + ($lon_seconds / (60*60)));

        return array('latitude'=>$latitude, 'longitude'=>$longitude);
    }else{
        return false;
    }
}

Como puedes ver, también hacemos uso de la función gps2num() la cual convertirá las coordenadas GPS en un valor float.

function gps2Num($coordPart){
    $parts = explode('/', $coordPart);
    if(count($parts) <= 0)
    return 0;
    if(count($parts) == 1)
    return $parts[0];
    return floatval($parts[0]) / floatval($parts[1]);
}

¿Cómo utilizar la función?

Muy sencillo. Solo tienes que pasarle la ruta de la imagen a la función get_image_location() para obtener la latitud y longitud de dicha imagen.

//image file path
$imageURL = "images/geotagged-image.jpeg";

//get location of image
$imgLocation = get_image_location($imageURL);

//latitude & longitude
$imgLat = $imgLocation['latitude'];
$imgLng = $imgLocation['longitude'];

Mostrar la ubicación de dónde se tomó la imagen en un mapa de Google

Si quieres mostrar la geolocalización de la imagen en un mapa de Google, es muy sencillo, simplemente tienes que utilizar la API de Google Maps.

Antes que nada, debes incluir la API de Google Maps y especificar la key en la URL.

<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=TU_API_KEY"></script>

Ahora, especifica la latitud y longitud de los datos obtenidos del archivo de la imagen

<script>
var myCenter = new google.maps.LatLng(<?php echo $imgLat; ?>, <?php echo $imgLng; ?>);
function initialize(){
    var mapProp = {
        center:myCenter,
        zoom:10,
        mapTypeId:google.maps.MapTypeId.ROADMAP
    };

    var map = new google.maps.Map(document.getElementById("map"),mapProp);

    var marker = new google.maps.Marker({
        position:myCenter,
        animation:google.maps.Animation.BOUNCE
    });

    marker.setMap(map);
}
google.maps.event.addDomListener(window, 'load', initialize);
</script>

Codigo HTML

<div id="map"></div>

Codigo CSS

#map{
    width: 100%;
    height: 400px;
}

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP