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.
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.