Géolocaliser une photo : lire les EXIF GPS
Sortir les coordonnées GPS d'une photo prise au téléphone — en ligne de commande puis en Python. Court, pratique, sans dépendance exotique.
Pourquoi ça nous intéresse
Une photo prise avec un téléphone moderne contient, dans ses métadonnées
EXIF, la position GPS du lieu de prise de vue. C’est invisible quand on
ouvre la photo dans une visionneuse, mais c’est bien là — et c’est exactement
ce que locatme lit quand on lui glisse un dossier de photos.
Cet article montre comment récupérer ces coordonnées soi-même, en deux lignes de bash ou cinq lignes de Python.
En une ligne de commande
L’outil de référence pour lire (et écrire) des EXIF s’appelle ExifTool.
Il est dispo partout : Mac (brew install exiftool), Linux (apt install libimage-exiftool-perl), Windows (binaire portable depuis le site officiel).
exiftool -gpslatitude -gpslongitude -c "%.6f" ma_photo.heicLe -c "%.6f" force la sortie en degrés décimaux (sinon ExifTool affiche
en degrés/minutes/secondes, ce qui est lisible mais pas exploitable
directement).
Pour traiter un dossier entier en une commande, on ajoute -r (recursive)
et un format CSV :
exiftool -r -csv -gpslatitude -gpslongitude -c "%.6f" ./photos/ > positions.csvRésultat : un CSV à 3 colonnes (SourceFile, GPSLatitude, GPSLongitude)
prêt à être ouvert dans LocAtMe, QGIS, ou n’importe quel SIG.
En Python (si on doit l’intégrer)
Si tu écris un script qui traite des photos, la lib piexif lit
directement les EXIF sans appeler ExifTool :
from pathlib import Path
import piexif
def gps_from_jpeg(path: Path) -> tuple[float, float] | None:
exif = piexif.load(str(path))
gps = exif.get("GPS", {})
if not gps:
return None
# piexif renvoie les coordonnées en (deg, min, sec) rationnels
def to_deg(values, ref):
d, m, s = (v[0] / v[1] for v in values)
sign = -1 if ref in (b"S", b"W") else 1
return sign * (d + m / 60 + s / 3600)
lat = to_deg(gps[2], gps[1])
lon = to_deg(gps[4], gps[3])
return (lat, lon)Limitation : piexif ne lit pas les .heic (le format iPhone par défaut
depuis iOS 11). Pour le HEIC il faut soit convertir en JPEG (sips -s format jpeg), soit utiliser pyexiv2 qui gère les deux.
Le piège qui revient toujours
Les coordonnées dans l’EXIF sont en WGS84 (le système GPS standard) — c’est ce que Google Maps, OpenStreetMap et la quasi-totalité des SIG attendent. Pas de conversion à faire.
En revanche, attention au champ GPSAltitudeRef : il vaut 0 pour
au-dessus du niveau de la mer, 1 pour en dessous. Si tu utilises
l’altitude (rare, mais ça arrive), n’oublie pas d’appliquer le signe.
Les EXIF sont écrits par l’appareil au moment de la photo. Si la photo a été retransmise (WhatsApp, iMessage, Instagram…), les EXIF ont probablement été strippés au passage. Ce qui reste sur ton disque n’est pas toujours ce qui était à l’origine.
Aide-mémoire
# Une photo, sortie texte
exiftool -gpslatitude -gpslongitude -c "%.6f" photo.heic
# Un dossier, sortie CSV
exiftool -r -csv -gpslatitude -gpslongitude -c "%.6f" ./photos/ > positions.csv
# Convertir HEIC → JPEG (macOS)
sips -s format jpeg ma_photo.heic --out ma_photo.jpg
# Retirer toutes les EXIF avant publication
exiftool -all= ma_photo.jpgEt si tu veux juste voir tes photos sur une carte sans coder, glisse le dossier dans LocAtMe — il fait exactement ça, en mode photo.