Note : Cet article s’inspire copieusement d’un autre, rédigé en 2014 par Christophe Triquet, qui n’est malheureusement plus en ligne. Son article expliquait comment exploiter les photographies dans JOSM ; le mien est moins ambitieux et ne traite que de la géolocalisation des photographies.


Peu d’appareils photographiques, hormis ceux intégrés aux smartphones, disposent d’un récepteur GPS permettant de géolocaliser les photographies. Même lorsqu’un appareil en est équipé, il n’est pas toujours activé car le récepteur GPS fonctionne alors en continu et épuise rapidement la batterie de l’appareil photographique.

Mais si on dispose d’un terminal GPS autonome, il est possible de géolocaliser a posteriori des photographies à partir de la trace GPS enregistrée par ce récepteur lors de la prise de vue, grâce aux outils exiftool et gpscorrelate.

Ces outils lisent l’heure de prise de vue dans les métadonnées EXIF de la photographie, calculent la position géographique de l’appareil photographique au moment de la prise de vue par interpolation des positions enregistrées dans la trace GPS, puis ajoutent cette position aux métadonnées EXIF de la photographie.

Synchronisation horaire des photographies

Pour que la corrélation soit correcte, l’heure enregistrée dans les métadonnées EXIF de la photographie doit être exacte. Or, l’horloge interne des appareils électroniques dérivant, il est rare que ce soit le cas. La première opération à réaliser est donc de corriger l’heure des photographies pour assurer la synchronisation horaire entre les photographies et la trace GPS.

Mais comment déterminer a posteriori et avec exactitude la dérive horaire de l’appareil photographique au moment de la prise de vue ? Tout simplement en photographiant à un moment quelconque de l’excursion l’écran du terminal GPS montrant l’heure du système GPS. En comparant l’heure affichée par le terminal GPS sur la photographie et l’heure enregistrée dans les métadonnées EXIF de cette photographie, nous sommes en mesure de déterminer la dérive de l’horloge et donc la correction horaire à appliquer (nous considérerons cette dérive constante sur toute la durée de la prise de vue). Bien évidemment, si votre GPS affiche l’heure UTC, il faudra en tenir compte dans le calcul, l’heure enregistrée dans les métadonnées EXIF de la photographie étant certainement l’heure locale.

Sur la photographie ci-dessous, l’écran du GPS annonce l’heure locale 18:22:52 :

Écran du terminal GPS

Mais l’information temporelle enregistrée dans les métadonnées de la photographie diffère :

$ exiftool -time:all -s -G ecran_gps.jpg | grep EXIF
[EXIF]        ModifyDate       : 2021:07:19 18:23:55
[EXIF]        DateTimeOriginal : 2021:07:19 18:23:55
[EXIF]        CreateDate       : 2021:07:19 18:23:55

Au moment de la prise de vue, l’horloge interne de l’appareil photographique avait donc 1 minute et 3 secondes d’avance sur l’heure locale officielle.

Nous devons corriger ces informations horaires en retranchant 1 minute et 3 secondes à l’heure enregistrée :

# Correction des métadonnées d'horodatage

$ exiftool -alldates-=0:1:3 ecran_gps.jpg
    1 image files updated

# L'horodatage de la photographie est bien modifié

$ exiftool -time:all -s -G ecran_gps.jpg | grep EXIF
[EXIF]        ModifyDate       : 2021:07:19 18:22:52
[EXIF]        DateTimeOriginal : 2021:07:19 18:22:52
[EXIF]        CreateDate       : 2021:07:19 18:22:52

Bien évidemment, cette correction horaire est à appliquer à toutes les photographies, la commande exécutée sera donc en réalité :

$ exiftool -alldates-=0:1:3 *.jpg
    24 image files updated

Calcul et injection des coordonnées géographiques

Les informations horaires étant synchronisées, nous pouvons désormais demander à exiftool ou gpscorrelate de calculer et d’injecter dans les métadonnées EXIF les coordonnées géographiques de la prise de vue en s’appuyant sur la trace GPS (fournie au format GPX) et sur les informations horaires. Bien évidemment, la fenêtre temporelle de cette trace GPS doit englober celle des prises de vue pour que toutes les photographies puissent être géolocalisées.

# Initialement, aucune métadonnée EXIF ne fait référence aux coordonnées GPS

$ exiftool -s -G photo_001.jpg | grep -i gps

# Traitement des photographies par exiftool

$ exiftool -geotag trace.gpx *.jpg
    24 image files updated

# Les coordonnées GPS sont désormais enregistrées dans les métadonnées EXIF

$ exiftool -s -G photo_001.jpg | grep -i gps
[EXIF]        GPSVersionID     : 2.2.0.0
[EXIF]        GPSLatitudeRef   : North
[EXIF]        GPSLongitudeRef  : East
[EXIF]        GPSAltitudeRef   : Above Sea Level
[EXIF]        GPSTimeStamp     : 12:32:23
[EXIF]        GPSDateStamp     : 2021:07:18
[Composite]   GPSAltitude      : 460.6 m Above Sea Level
[Composite]   GPSDateTime      : 2021:07:18 12:32:23Z
[Composite]   GPSLatitude      : 43 deg 40' 7.47" N
[Composite]   GPSLongitude     : 12 deg 40' 43.84" E
[Composite]   GPSPosition      : 43 deg 40' 7.47" N, 12 deg 40' 43.84" E

L’outil gpscorrelate fonctionne de manière similaire, mais il faut lui indiquer l’écart horaire entre l’heure UTC (à laquelle correspond l’horodatage GPS) et l’heure locale. Dans l’exemple ci-dessous, il faut ajouter 2 heures à l’heure UTC pour obtenir l’heure locale :

$ gpscorrelate -g trace.gpx -z +02:00 p/*.jpg
Reading GPS Data...
Legend: . = Ok, / = Interpolated, < = Rounded, - = No match, ^ = Too far
        w = Write Fail, ? = No EXIF date, ! = GPS already present

Correlate: ////////////////////////

Completed correlation process.
Matched:    24 (0 Exact, 24 Interpolated, 0 Rounded).
Failed:      0 (0 Not matched, 0 Write failure, 0 Too Far,
                0 No Date, 0 GPS Already Present.)

Note : Il est possible de traiter les photographies sans procéder à leur synchronisation horaire préalable, en indiquant à exiftool (via l’option -geosync) ou à gpscorrelate (via l’option --photooffset) la correction temporelle à appliquer aux heures enregistrées dans les métadonnées des photographies. En agissant ainsi, les photographies sont correctement géolocalisées, mais aucune correction horaire des métadonnées existantes n’est effectuée :

$ exiftool -geotag trace.gpx -geosync=-1:3 *.jpg
    24 image files updated

$ exiftool -time:all -s -G photo_001.jpg | grep EXIF
[EXIF]        ModifyDate       : 2021:07:18 14:32:24
[EXIF]        DateTimeOriginal : 2021:07:18 14:32:24
[EXIF]        CreateDate       : 2021:07:18 14:32:24
[EXIF]        GPSTimeStamp     : 12:32:23
[EXIF]        GPSDateStamp     : 2021:07:18

$ exiftool -s -G photo_001.jpg | grep -i gps
[EXIF]        GPSVersionID     : 2.2.0.0
[EXIF]        GPSLatitudeRef   : North
[EXIF]        GPSLongitudeRef  : East
[EXIF]        GPSAltitudeRef   : Above Sea Level
[EXIF]        GPSTimeStamp     : 12:32:23
[EXIF]        GPSMapDatum      : WGS-84
[EXIF]        GPSDateStamp     : 2021:07:18
[Composite]   GPSAltitude      : 460.6 m Above Sea Level
[Composite]   GPSDateTime      : 2021:07:18 12:32:23Z
[Composite]   GPSLatitude      : 43 deg 40' 7.47" N
[Composite]   GPSLongitude     : 12 deg 40' 43.84" E
[Composite]   GPSPosition      : 43 deg 40' 7.47" N, 12 deg 40' 43.84" E

Mais je trouve personnellement plus pertinent de profiter de cette manipulation pour corriger de manière pérenne l’horodatage des photographies.

Vérification visuelle de la géolocalisation

Lorsque je géolocalise des photographies, c’est en général dans le but de contribuer à OpenStreetMap (une photographie remplace avantageusement une prise de notes dans bien des cas). Du coup, je vérifie leur géolocalisation dans JOSM :

Capture d’écran de JOSM montrant la géolocalisation des photographies