Loading...

Géolocaliser une photo avec ses métadonnées

Comment géolocaliser une photographie avec ses métadonnées en PHP
Géolocaliser une photo avec ses métadonnées

Géolocaliser une photo avec ses métadonnées

Catégorie : DATASCIENCE

Géolocaliser une photo avec ses métadonnées

Les photographies numériques comportent certaines métadonnées. Elles contiennent une quantité d'information intéressante comme les dates, les paramétrages de l'appareil photo ainsi que les informations de géolocalisation. Bien évidemment ces informations sont renseignées si l'appareil photo est équipé des capteurs nécessaire (GPS, optique...).
Pour ce cas, je vais utiliser le langage PHP, ce qui me permettra d'utiliser cette fonction dans un micro-projet web.

Attention! Pour utiliser la fonction php "exif_read_data()", vous devez activer l'option dans le fichier php.ini de votre serveur web.

Pour commencer, je crée un fichier PHP, il va pour le moment se contenter de lire les métadonnées d'une image et de vérifier si elles sont exploitables.

//emplacement de l'image 
$picture_src = "VOTRE_EMPLACEMENTpicture.jpg";

//lecture des métadonnées exif
$exif = exif_read_data($picture_src, 'IFD0');

//Test de présence des métadonnées
if($exif===false){
    echo("[ERREUR] Aucune métadonnées EXIF
"); }

Maintenant exploitons les métadonnées. Les informations sont contenues dans différentes sections (GPS, EXIF...). Dans le code suivant, j'utilise la section EXIF pour la date de prise de la photo et la section GPS pour la géolocalisation. Je vais extraire les champs suivants :

  • EXIF.DateTimeOriginal
  • GPS.GPSLatitude
  • GPS.GPSLongitude
  • GPS.GPSAltitude

else{
    //Récupération dans une variable des métadonnées
    $exif = exif_read_data($picture_src, 0, true);

    //Conversion de la date au format Français
    $date_prise = date("d/m/Y H:i:s", strtotime($exif["EXIF"]["DateTimeOriginal"]));
    
    /**
    *   La latitude et longitude sont au format Degres Minutes Secondes. Il est nécessaire de le convertir au format décimal.
    *   Pour ce faire il faut diviser Minutes par 60, diviser Secondes par 3600 et additionner l'ensemble des éléments (Degres + Minutes/60 + Secondes/3600).
    *   On obtient ainsi la position au format décimal
    */

    //Récupération et conversion de la latitude au format décimal
    $gps_lat = $exif["GPS"]["GPSLatitude"];
    $gps_lat_deg = explode("/", $gps_lat[0]);
    $gps_lat_deg = $gps_lat_deg[0]/$gps_lat_deg[1];
    $gps_lat_sec = explode("/", $gps_lat[2]);
    $gps_lat_sec = ($gps_lat_sec[0]/$gps_lat_sec[1])/3600;
    $gps_lat_min = explode("/", $gps_lat[1]);
    $gps_lat_min = $gps_lat_min[0]/$gps_lat_min[1]/60;
    $gps_lat_dec = $gps_lat_deg + $gps_lat_min + $gps_lat_sec;
    
    //Récupération et conversion de la longitude au format décimal
    $gps_lon = $exif["GPS"]["GPSLongitude"];
    $gps_lon_deg = explode("/", $gps_lon[0]);
    $gps_lon_deg = $gps_lon_deg[0]/$gps_lon_deg[1];
    $gps_lon_sec = explode("/", $gps_lon[2]);
    $gps_lon_sec = ($gps_lon_sec[0]/$gps_lon_sec[1])/3600;
    $gps_lon_min = explode("/", $gps_lon[1]);
    $gps_lon_min = $gps_lon_min[0]/$gps_lon_min[1]/60;
    $gps_lon_dec = $gps_lon_deg + $gps_lon_min + $gps_lon_sec;
    
    //Récupération et conversion de l'altitude au format décimal
    $gps_alt = $exif["GPS"]["GPSAltitude"];
    $gps_alt = explode("/", $gps_alt);
    $gps_alt = $gps_alt[0]/$gps_alt[1];
    
    //Création d'une chaine contenant la position
    $gps_gps = "[" . round($gps_lat_dec, 8) . ", " . round($gps_lon_dec, 8) . "]";

    //Affichage de la chaine
    echo($gps_gps);
}
Le script est maintenant terminé !
Il est possible de l'implémenter dans un code permettant l'import d'une image. Il pourra ainsi restituer la position sur une carte par exemple.