install.packages(c( 'sf', 'terra'))
Manipuler les rasters avec R
et le package Terra
GEO UNIV’R Tunisie 2024
Ce support est inspiré les informations de ces différentes sources : Géomatique avec R (Giraud et Pecout 2024), Analyse d’image raster (et télédétection) (Madelin 2021) et Image processing and all things raster (Nowosad 2021). Les exemples proposés sont adaptés au contexte tunisien.
Packages utilisés
sf
: importer, manipuler et exporter des données géographiques vectorielles.terra
: importer, manipuler et exporter des fichiers rasters.
Si vous n’avez pas ces packages, vous pouvez les installer en exécutant la ligne suivante dans la console.
Importer des données rasters avec terra
Activer le package terra
library("terra")
Importer des objets vecteur
La ligne qui servira au transect est un objet vectoriel. On peut la charger en tant que tel avec la fonction vect()
de terra
. L’objet chargé est de classe SpatVector
.
Il est aussi possible de la charger avec le package sf
conçu pour manipuler les objets vectoriels en priorité. Pour cela, voir le module de l’école thématique portant sur les vecteurs : manipuler des objets vectoriels avec sf
Ici nous chargeons un objet vectoriel au format .shp
# Import du fichier de ligne
<- vect("Data/Formes/Kairouan_Mahdia.shp")
Kairouan_Mahdia
class(Kairouan_Mahdia)
[1] "SpatVector"
attr(,"package")
[1] "terra"
Il est aussi possible de charger des objets au format .gpkg
. Nous chargeons le masque qui servira aux prochaines opérations.
# Charger un gpkg
<- vect("Data/Formes/Sebkha.gpkg") zone_etude
Importer des objets raster
La fonction pour importer des objets raster est rast()
quelque soit le type d’image.
Importer des MNT
# MNT
<- rast("Data/DEM/n35_e010_1arc_v3.tif")
MNT_ouest <- rast("Data/DEM/n35_e011_1arc_v3.tif") MNT_est
Importer des images satellites en bandes séparées
# Importer les différentes bandes des images sentinels
#La bande bleue
<- rast("Data/Sentinel2/oliviers_2024-02-04_S2_B02.tif")
bleu
#La bande verte
<- rast("Data/Sentinel2/oliviers_2024-02-04_S2_B03.tif")
vert
#La bande rouge
<- rast("Data/Sentinel2/oliviers_2024-02-04_S2_B04.tif")
rouge
#La bande proche infrarouge
<- rast("Data/Sentinel2/oliviers_2024-02-04_S2_B08.tif") proche_infrarouge
Les données sont chargées. À partir de ces bandes, nous pouvons créer une dalle ou une tuile dans le visible.
#On peut créer un objet qui contient déjà les trois bandes dans le visible
= c(bleu, vert, rouge)
image_RGB
#Affichage des métadonnées
image_RGB
class : SpatRaster
dimensions : 6988, 8771, 3 (nrow, ncol, nlyr)
resolution : 10, 10 (x, y)
extent : 601840, 689550, 3914010, 3983890 (xmin, xmax, ymin, ymax)
coord. ref. : WGS 84 / UTM zone 32N (EPSG:32632)
sources : oliviers_2024-02-04_S2_B02.tif
oliviers_2024-02-04_S2_B03.tif
oliviers_2024-02-04_S2_B04.tif
names : B02, B03, B04
min values : 1, 1, 1
max values : 17368, 16408, 15912
Importation d’un raster avec plusieurs bandes incluses
<- rast("Data/Sentinel2/RGB_PIR.tif")
RGB_PIR
#Affichage des métadonnées
RGB_PIR
class : SpatRaster
dimensions : 6988, 8771, 4 (nrow, ncol, nlyr)
resolution : 10, 10 (x, y)
extent : 601840, 689550, 3914010, 3983890 (xmin, xmax, ymin, ymax)
coord. ref. : WGS 84 / UTM zone 32N (EPSG:32632)
source : RGB_PIR.tif
names : B02, B03, B04, B08
min values : 1, 1, 1, 1
max values : 17368, 16408, 15912, 15448
Visualiser des images avec terra
Visualiser un raster
On peut faire varier l’affichage en paramétrant l’argument type =
de la fonction plot()
. Chaque type fait appel à d’autres arguments qui lui sont propres.
Contininous
est le mode par défaut, range permet de définir une plage d’affichage, ici, entre les valeurs minimales et maximales Comme dans les logiciels de SIG, ‘minmax()’ doit calculer les statistiques pour certaines taches, il suffit de rajouter le paramètre ‘minmax(image, compute = TRUE)’,
# Avec le type continuous
plot(MNT_ouest, type = "continuous", range = c(-10, max(minmax(MNT_ouest, compute = TRUE))))
Interval
est pratique pour faire des classes rapides, breaks est le nombre de classes voulues
# avec le type interval
plot(MNT_ouest, type = "interval", breaks = 10)
classes
permet d’afficher une classification. Si le raster a déjà été classifier alors il suffit d’indiquer type = 'classes'
. Sinon il faut construire cette classification.
Dans notre exemple nous construisons la classification à la volée avec la fonction classify()
. Ici, la classification se fait de dix en dix en commençant de zéro à la valeur maximale.
# Avec le type classes et la fonction classify
plot(x = classify(MNT_ouest, seq(0, max(minmax(MNT_ouest)), by = 10)), type = "classes")
Visualiser des images satellites
Visualiser une bande seule
On peut visualiser les bandes une par une avec la fonction plot()
en r-base.
Depuis l’objet bleu
contenant la bande bleue
# La bande unique contenant le bleu
plot(bleu)
Depuis l’objet RGB_PIR
contenant toutes les bandes. Ici on affiche la bande verte en la sélectionnant avec son nom B03
# La bande nommée B03 dans l'image à quatre canaux
plot(RGB_PIR$B03)
Depuis l’objet RGB_PIR
on affiche la bande proche infrarouge avec son index
# Le canal numéro 4 de l'image à 4 bande, soit le proche infrarouge ('col = grey(0:100/100)' permet de mettre la bande en noir et blanc)
plot(RGB_PIR[[4]], col = grey(0:100/100))
Visualiser plusieurs bandes
Pour visualiser plusieurs bandes en même temps, on utilise la fonction plotRGB()
du package terra
.
#On essaye d'afficher l'image
plotRGB(image_RGB)
Error in grDevices::rgb(RGB[, 1], RGB[, 2], RGB[, 3], alpha = out$alpha, : color intensity 1.29679, not in [0,1]
La visualisation d’un raster multibande nécessite de connaître nos images.
Ce message d’erreur est dû au fait que les valeurs des pixels ne sont pas dans une plage de 0 à 255.
Connaître les valeurs min et max avec la fonction minmac()
permet de renseigner la plage d’affichage des pixels.
<- minmax(image_RGB)
valeurs_min_et_max max(valeurs_min_et_max[2,])
[1] 17368
On peut renseigner cette valeur dans l’argument scale =
de la fonction plotRGB()
plotRGB(image_RGB, scale = max(valeurs_min_et_max[2,]), stretch="lin")
Il peut être nécessaire de préciser à quelles couleurs correspondent les bandes. Ici il s’agit de l’index des couches dans l’objet ìmage_RGB
, mais on peut utiliser leur nom.
plotRGB(image_RGB, r = 3, g = 2, b = 1, scale = max(valeurs_min_et_max[2,]), stretch="lin")
Visualiser une image multibande depuis des objets distincts
# Pour afficher une image en créant un raster multibande pour la commande même
plotRGB(x = c(rouge, vert, bleu), scale = max(minmax(c(bleu, vert, rouge))[2,]), stretch = "lin")
Visualiser une image multibande depuis un objet contenant toutes les bandes.
Ici on précise la couleur de chaque bande pour obtenir une image en vraies couleurs.
# Pour afficher le spectre du visible à partir de l'image multicanal
plotRGB(RGB_PIR, r = "B04", g="B03", b="B02", scale= max(minmax(RGB_PIR)[2,]), stretch="lin")