← retour au journal
publié le 23 mai 2026 · L. Benoist
#photo#exif#gps#python#locatme

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.

OS
macOS / iOS
application
ExifTool 12.x
Format
.jpg / .heic
Sortie
(lat, lon) décimal

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

code
exiftool -gpslatitude -gpslongitude -c "%.6f" ma_photo.heic

Le -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 :

code
exiftool -r -csv -gpslatitude -gpslongitude -c "%.6f" ./photos/ > positions.csv

Ré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 :

code
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

code
# 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.jpg

Et si tu veux juste voir tes photos sur une carte sans coder, glisse le dossier dans LocAtMe — il fait exactement ça, en mode photo.

FR EN