Obtenir les données GPS d'une image en Java (EXIF)
Les appareils photo et smartphones enregistrent de nombreuses métadonnées EXIF dans les fichiers JPEG et TIFF, dont les coordonnées GPS où la photo a été prise. Ce guide montre comment les extraire en Java avec la bibliothèque metadata-extractor, la plus complète du JVM.
Installation de la dépendance
Avec Maven :
<dependency>
<groupId>com.drewnoakes</groupId>
<artifactId>metadata-extractor</artifactId>
<version>2.19.0</version>
</dependency>
Avec Gradle :
implementation 'com.drewnoakes:metadata-extractor:2.19.0'
Lecture des coordonnées GPS
import com.drew.imaging.ImageMetadataReader;
import com.drew.metadata.Metadata;
import com.drew.metadata.exif.GpsDirectory;
import com.drew.lang.GeoLocation;
import java.io.File;
public class GpsReader {
public static void main(String[] args) throws Exception {
File image = new File("photo.jpg");
Metadata metadata = ImageMetadataReader.readMetadata(image);
GpsDirectory gps = metadata.getFirstDirectoryOfType(GpsDirectory.class);
if (gps == null) {
System.out.println("Aucune donnée GPS dans cette image.");
return;
}
GeoLocation loc = gps.getGeoLocation();
if (loc == null || loc.isZero()) {
System.out.println("Coordonnées GPS vides.");
return;
}
System.out.printf("Latitude : %.6f%n", loc.getLatitude());
System.out.printf("Longitude : %.6f%n", loc.getLongitude());
}
}
Exemple de sortie :
Latitude : 48.856614
Longitude : 2.352222
Obtenir l'altitude
L'altitude n'est pas portée par GeoLocation mais récupérable via le tag EXIF :
import com.drew.metadata.exif.GpsDirectory;
Double altitude = gps.getRational(GpsDirectory.TAG_ALTITUDE) != null
? gps.getRational(GpsDirectory.TAG_ALTITUDE).doubleValue()
: null;
Integer ref = gps.getInteger(GpsDirectory.TAG_ALTITUDE_REF);
if (altitude != null && ref != null && ref == 1) {
altitude = -altitude; // sous le niveau de la mer
}
System.out.println("Altitude : " + altitude + " m");
Obtenir l'horodatage GPS
Différent de l'heure de prise de vue (qui dépend du fuseau de l'appareil), le GPS enregistre la date en UTC :
import java.util.Date;
import java.util.TimeZone;
Date gpsDate = gps.getGpsDate(TimeZone.getTimeZone("UTC"));
System.out.println("Prise le : " + gpsDate);
Parcourir toutes les métadonnées
Utile pour le debug ou pour afficher toute l'info disponible :
import com.drew.metadata.Directory;
import com.drew.metadata.Tag;
for (Directory dir : metadata.getDirectories()) {
for (Tag tag : dir.getTags()) {
System.out.println(dir.getName() + " - " + tag.getTagName() + " = " + tag.getDescription());
}
}
Gérer les images sans GPS
Toutes les photos n'ont pas de coordonnées GPS. Cas fréquents :
- Photo prise avec un appareil sans GPS (réflex, webcam).
- GPS désactivé au moment de la prise de vue.
- Métadonnées supprimées (réseaux sociaux, scripts de nettoyage).
- Format sans support EXIF (PNG standard n'en contient pas).
Testez toujours getGeoLocation() pour null ou loc.isZero() (les coordonnées 0,0 signifient généralement absent).
Écrire un lien Google Maps
String mapsUrl = String.format(
"https://www.google.com/maps?q=%f,%f",
loc.getLatitude(), loc.getLongitude()
);
System.out.println("Voir sur la carte : " + mapsUrl);
Alternative : Apache Commons Imaging
Si vous ne pouvez pas ajouter metadata-extractor, commons-imaging offre une alternative moins complète mais aussi fiable :
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-imaging</artifactId>
<version>1.0.0-alpha5</version>
</dependency>
import org.apache.commons.imaging.Imaging;
import org.apache.commons.imaging.common.ImageMetadata;
import org.apache.commons.imaging.formats.jpeg.JpegImageMetadata;
import org.apache.commons.imaging.formats.tiff.TiffImageMetadata;
ImageMetadata meta = Imaging.getMetadata(new File("photo.jpg"));
if (meta instanceof JpegImageMetadata jpeg) {
TiffImageMetadata exif = jpeg.getExif();
if (exif != null && exif.getGPS() != null) {
System.out.println(exif.getGPS().getLatitudeAsDegreesNorth());
System.out.println(exif.getGPS().getLongitudeAsDegreesEast());
}
}
Respect de la vie privée
Les coordonnées GPS dans une photo partagée publiquement révèlent potentiellement domicile, lieu de travail ou habitudes. Si vous développez une application qui expose ces données, pensez à :
- demander un consentement clair avant de les lire ou afficher ;
- offrir une option de suppression des métadonnées avant publication ;
- respecter les règles RGPD sur les données de localisation.
metadata-extractor est un excellent outil : robuste, bien maintenu, et capable de lire plus de métadonnées que presque n'importe quelle autre bibliothèque Java.