Créer une carte Leaflet à partir de photos géolocalisées prises avec un téléphone
Un tutoriel simple pour transformer des photos géolocalisées prises avec un téléphone en carte interactive avec R
1 Introduction
Si la géolocalisation est activée lorsque vous prenez des photos sur le terrain, votre téléphone peut enregistrer les coordonnées géographiques de chaque image dans ses métadonnées EXIF. Chaque photo peut ainsi être traitée comme une donnée ponctuelle.
Dans ce tutoriel, vous apprendrez à :
- activer la géolocalisation sur votre téléphone avant de prendre des photos ;
- importer dans R un dossier de photos géolocalisées ;
- extraire la latitude et la longitude des métadonnées des photos ;
- créer un tableau structuré de points photo ;
- modifier les légendes associées à chaque point photo ;
- créer une carte
leafletsur laquelle chaque point ouvre une fenêtre contextuelle contenant une légende et une photo.
Cette méthode peut être utile pour les activités de validation sur le terrain, la documentation des visites de sites et la création de cartes simples permettant de présenter les activités d’un projet lors d’ateliers et de présentations.
2 Avant de commencer : activer la géolocalisation sur votre téléphone
Votre téléphone doit enregistrer les informations de localisation avec chaque photo. Si ce paramètre est désactivé, vous ne pourrez pas extraire les informations de localisation des métadonnées de vos photos.
2.1 iPhone
Sur iPhone, procédez comme suit :
- Ouvrez Réglages.
- Accédez à Confidentialité et sécurité.
- Ouvrez Service de localisation.
- Vérifiez que le Service de localisation est activé.
- Faites défiler vers le bas jusqu’à Appareil photo.
- Autorisez l’accès à la localisation Lorsque l’app est active.
2.2 Android
Les étapes exactes varient selon l’appareil, mais elles sont généralement les suivantes :
- Ouvrez l’application Appareil photo.
- Ouvrez les Paramètres.
- Recherchez une option portant un nom tel que :
- Balises de localisation
- Enregistrer la localisation
- Géolocalisation
- Activez cette option.
Prenez ensuite quelques photos de test, puis transférez-les ou déplacez-les dans un même dossier sur votre ordinateur.
3 Configuration : charger les packages
Installez d’abord les packages si nécessaire.
À propos des packages nécessaires :
exifr: permet d’extraire les données de localisation EXIF des photos
dplyr: facilite les opérations de manipulation des données
magick: permet de traiter les images et de convertir leur format
leaflet: permet de créer des cartes web interactives
install.packages(c("exifr", "dplyr", "magick", "leaflet"))Chargez-les maintenant.
library(exifr)
library(dplyr)
library(magick)
library(leaflet)4 Indiquer le chemin d’accès au dossier de photos
Créez un dossier contenant les photos de terrain que vous souhaitez cartographier.
Vérifiez votre répertoire de travail avec getwd(), puis définissez-le si nécessaire.
getwd()
setwd("")Indiquez à R le chemin d’accès à votre dossier de photos.
# Ici, nous chargeons le dossier de photos et l’affectons à l’objet 'photo_dir'.
photo_dir <- "example_folder"Listez maintenant les fichiers photo contenus dans ce dossier.
# Ici, nous demandons à R de répertorier tous les fichiers du dossier 'photo_dir' aux formats HEIC, JPG ou JPEG,
# puis de les affecter à un nouvel objet appelé 'photo_files'.
photo_files <- list.files(
photo_dir,
pattern = "\\.(heic|jpg|jpeg)$",
full.names = TRUE,
ignore.case = TRUE
)
length(photo_files)
head(photo_files)Remarque
Certains téléphones enregistrent les photos au format.jpgou.jpeg, tandis que d’autres peuvent utiliser le format.heic. Le flux de travail ci-dessous prend en charge les deux formats. Les fichiers JPG peuvent être utilisés directement. Les fichiers HEIC sont convertis au format JPG avant d’être utilisés dans les fenêtres contextuelles de la carte.
5 Lire les métadonnées des photos
Nous allons maintenant extraire les métadonnées EXIF des fichiers photo.
Remarque
EXIF signifie Exchangeable Image File Format (format de fichier image échangeable). Il s’agit des métadonnées intégrées aux photos, qui comprennent généralement la date, l’heure, les paramètres de l’appareil photo et, si cette option est activée, la localisation.
# Nous utilisons le package exifr pour lire les métadonnées des photos.
meta1 <- read_exif(photo_files)
dim(meta1)
names(meta1)Pour examiner uniquement les champs liés au GPS :
# Comme seules les données de localisation nous intéressent, nous demandons à R de rechercher les noms de colonnes
# contenant les termes 'GPS', 'Lat' ou 'Lon'.
meta1[, grepl("GPS|Lat|Lon", names(meta1), ignore.case = TRUE), drop = FALSE]À ce stade, vous devriez généralement voir des champs tels que :
GPSLatitudeGPSLongitudeGPSLatitudeRefGPSLongitudeRef
Vérifions les données dont nous disposons. Si ces champs sont vides, les photos n’ont probablement pas été géolocalisées.
head(meta1)6 Extraire la latitude et la longitude
Dans de nombreux cas, read_exif() renvoie déjà les coordonnées GPS en degrés décimaux.
Si vos colonnes GPSLatitude et GPSLongitude contiennent déjà des nombres décimaux, vous pouvez les utiliser directement.
meta1$lat <- meta1$GPSLatitude
meta1$lon <- meta1$GPSLongitudeConservez maintenant uniquement les photos dont les coordonnées sont exploitables.
meta1 <- meta1 |>
filter(!is.na(lat), !is.na(lon))Vérifiez le résultat :
head(meta1[, c("GPSLatitude", "GPSLongitude", "lat", "lon")])
summary(meta1[, c("lat", "lon")])7 Créer une première carte rapide
Avant d’ajouter les images et les légendes, il est recommandé de vérifier que les points s’affichent au bon endroit.
leaflet(meta1) |>
addProviderTiles(providers$Esri.WorldImagery) |>
addMarkers(
lng = ~lon,
lat = ~lat
)Si les points apparaissent au bon endroit, vos coordonnées fonctionnent correctement.
8 Préparer les chemins d’accès aux images des fenêtres contextuelles
Pour la carte avec fenêtres contextuelles, chaque point doit renvoyer vers un fichier image que la page web peut afficher.
- Si une photo est déjà au format
.jpgou.jpeg, nous l’utilisons directement. - Si une photo est au format
.heic, nous la convertissons en.jpg.
Le principal résultat de cette étape est une nouvelle colonne appelée image_path. Elle contient le chemin relatif que la fenêtre contextuelle utilisera pour afficher la photo.
Même si vos photos sont déjà au format JPG/JPEG, vous pouvez exécuter cette étape. Dans ce cas, image_path pointera vers le nom de votre dossier de photos d’origine, et non vers les fichiers du dossier jpg que nous créons.
# Nous créons ici un dossier jpg destiné à accueillir les fichiers HEIC convertis.
jpg_dir <- file.path(photo_dir, "jpg")
dir.create(jpg_dir, showWarnings = FALSE)
meta1$image_path <- NA_character_
for (i in seq_len(nrow(meta1))) {
f <- meta1$SourceFile[i]
ext <- tolower(tools::file_ext(f))
if (ext %in% c("jpg", "jpeg")) {
meta1$image_path[i] <- file.path("example_folder", basename(f))
# Remplacez 'example_folder' par le nom de votre dossier de photos.
} else if (ext == "heic") {
img <- image_read(f)
out_name <- paste0(tools::file_path_sans_ext(basename(f)), ".jpg")
out_file <- file.path(jpg_dir, out_name)
image_write(img, path = out_file, format = "jpeg")
meta1$image_path[i] <- file.path("example_folder/jpg", out_name)
# Remplacez 'example_folder' par le nom de votre dossier de photos..
# Conservez 'jpg' tel quel, car il s’agit du nom du dossier créé ci-dessus.
}
}Vérifiez le résultat :
head(meta1[, c("SourceFile", "image_path")])Vous devriez maintenant voir une nouvelle colonne image_path qui indique le chemin vers le fichier image utilisé par la fenêtre contextuelle.
9 Créer un tableau structuré de points photo
Le tableau brut des métadonnées contient de nombreuses colonnes qui ne sont pas nécessaires à la cartographie. Il est souvent préférable de créer un tableau plus compact, contenant uniquement les champs que nous souhaitons cartographier.
photo_points <- data.frame(
photo_name = tools::file_path_sans_ext(basename(meta1$SourceFile)),
lat = meta1$lat,
lon = meta1$lon,
image_path = meta1$image_path,
stringsAsFactors = FALSE
)
# Par défaut, le nom de la photo est utilisé comme première légende.
photo_points$caption <- photo_points$photo_name
head(photo_points)Vous disposez maintenant d’un tableau structuré contenant :
- le nom de la photo
- la latitude
- la longitude
- le chemin d’accès à l’image utilisé dans la fenêtre contextuelle
- une légende par défaut
10 Modifier les légendes de chaque point photo
Par défaut, la légende correspond simplement au nom du fichier photo. En pratique, vous souhaiterez généralement la remplacer par vos propres notes ou descriptions de terrain.
Vous pouvez modifier les légendes directement dans R de la manière suivante :
# Nous demandons ici à R d’utiliser l’annotation (les exemples de légendes ci-dessous, à remplacer par les vôtres) comme légende de la photo.
# Le nombre entre crochets [] correspond au point photo auquel nous attribuons la légende.
photo_points$caption[1] <- "Jeunes arbres en régénération près de la limite de la parcelle"
photo_points$caption[2] <- "Érosion en ravine derrière l’habitation"
photo_points$caption[3] <- "Parcelle de régénération naturelle assistée (RNA) gérée par un agriculteur"
# Vérifiez les photos et leurs légendes.
photo_points[, c("photo_name", "caption")]Vous pouvez répéter cette opération pour les autres points.
11 Créer le contenu des fenêtres contextuelles
Nous allons maintenant créer le contenu HTML de la fenêtre contextuelle de chaque point.
# Nous demandons ici à R de créer une fenêtre contextuelle pour nos points photo. Vous pouvez modifier son apparence en adaptant le code HTML ci-dessous.
photo_points$popup_html <- paste0(
"<div style='width:260px;'>",
"<b>", photo_points$caption, "</b><br>",
"<img src='", photo_points$image_path, "' style='width:100%; border-radius:8px; margin-top:6px;'>",
"</div>"
)Cette fenêtre contextuelle comprend :
- une légende
- le fichier image associé
Vous pouvez également ajouter d’autres informations, telles que la date, le nom du site ou des notes de terrain.
12 Créer la carte Leaflet finale
Nous pouvons maintenant cartographier les points et leur associer les fenêtres contextuelles.
leaflet(photo_points) |>
addProviderTiles(providers$Esri.WorldImagery) |>
setView(
lng = mean(photo_points$lon, na.rm = TRUE),
lat = mean(photo_points$lat, na.rm = TRUE),
zoom = 18
) |>
addCircleMarkers(
lng = ~lon,
lat = ~lat,
radius = 6,
fillColor = "orange",
color = "white",
weight = 1,
fillOpacity = 0.9,
popup = ~popup_html
)Vous obtenez ainsi une carte interactive de points photo affichée sur une imagerie satellitaire.
13 Facultatif : enregistrer le tableau structuré pour une utilisation ultérieure
Si vous souhaitez réutiliser ultérieurement les données ponctuelles préparées, vous pouvez enregistrer le tableau structuré au format CSV.
# Remplacez le dossier de sortie indiqué par le chemin d’accès à votre propre dossier.
write.csv(photo_points, "data/photo_points.csv", row.names = FALSE)Cette option peut être utile si vous souhaitez créer ultérieurement une carte à partir d’un fichier CSV déjà préparé, plutôt que de répéter toute la procédure d’extraction des données EXIF, ou si vous souhaitez partager les données avec vos collègues en même temps que le dossier de photos.
14 Résumé
Dans ce tutoriel, vous avez appris à :
| Tâche | Fonction clé |
|---|---|
| Lire les métadonnées des photos | read_exif() |
| Vérifier rapidement la localisation des points | leaflet() + addMarkers() |
| Préparer les chemins d’accès aux images des fenêtres contextuelles | file.path() + image_write() |
| Créer un tableau structuré de points photo | data.frame() |
| Créer le contenu HTML des fenêtres contextuelles | paste0() |
| Cartographier les points photo de manière interactive | leaflet() + addCircleMarkers() |
14.1 Pour aller plus loin
- Ajouter la date de la photo à la fenêtre contextuelle.
- Utiliser un autre fond de carte, par exemple
CartoDB.Positron. - Filtrer les points pour ne conserver qu’une seule visite de site ou journée de terrain.
- Enregistrer le tableau structuré et l’utiliser pour créer une carte dans une page distincte.