Le paquet lczexplore a été développé dans le cadre du projet Pændora 2 (Pour la gestion du confort estival : Données, Outils et Recherche-Action, 2022 -2025), de l’ADEME.
Il a pour objectif de faciliter la comparaison de classifications en zones climatiques locales produites par différents algorithmes sur une même zone. En amont de ce paquet, l’utilisateur aura affecté à chacune des unités de référence spatiales (RSU) de la zone d’étude une valeur de Zone Climatique Locale (LCZ). Plusieurs méthodes peuvent aboutir à plusieurs classifications. Ce paquet permet de représenter et de comparer ces classifications.
L’approche recommandée est l’installation depuis le dépôt github :devtools::install_github("orbisgis/lczexplore", build_vignettes = TRUE)
).
Le charger avec library(lczexplore).
library(lczexplore)
La fonction importLCZvect
est la fonction générique d’import d’un fichier “vecteur”
contenant les LCZ (pour les fichiers raster, voir la vignette “lcz_explore_raster_vector”).
L’import des fichiers .geojson et .shp a été testé, mais tous les formats acceptés par la fonction
st_read
de sf
sont normalement importés sans problème.
L’argument dirPath
permet d’indiquer le chemin du répertoire où se trouvent
le fichier et l’argument file
le nom du fichier.
L’argument column
, renseigne le nom de la colonne contenant les types de zones climatiques locales ou LCZ.
Les arguments optionnels geomID
et confid
permettent de spécifier les colonnes
contenant les identifiants des géométries et une mesure de la confiance
qu’on a en la valeur de LCZ attribuée à une géométrie.
Par défaut, importLCZvect
ressort un fichier de classe simple feature
,
telle que définie par l’OpenGIS et gérée par le paquet sf
,
paquet de référence pour la gestion des données vecteurs dans R [https://doi.org/10.32614/RJ-2018-009].
On peut également choisir output="bBox"
pour que la fonction ressorte
la bounding box des géométries contenues dans le fichier concerné (utile pour définir une zone et importer
un raster, par exemple).
dirPath<-paste0(system.file("extdata",package="lczexplore"),"/")
dirPathOSM<-paste0(dirPath,"osm/2022/Redon")
dirPathBDT<-paste0(dirPath,"bdtopo_2_2/Redon")
redonOSM<-importLCZvect(dirPath=dirPathOSM,file="rsu_lcz.geojson",column = "LCZ_PRIMARY", verbose=FALSE)
redonBDT<-importLCZvect(dirPath=dirPathBDT,file="rsu_lcz.geojson",column = "LCZ_PRIMARY", verbose = FALSE)
#
Une fois que le fichier a été chargé dans un objet R de classe sf
, la fonction showLCZ
permet de le représenter.
On lui spécifie le jeu de données qu’on a chargé par l’argument sf
,
et on lui précise la colonne contenant les valeurs de LCZ par l’argument column
.
L’argument wf
permet de spécifier le workflow qui a servi à générer les données
(il sera repris dans le titre du graphique produit).
L’argument repr=standard
(valeur par défaut), permet de gérer les niveaux de LCZ les plus usuels pour
des cartes mises en forme avec des couleurs standardisées.
On remarque que par défaut, tous les niveaux attendus d’une classification LCZ sont présents, ce qui peut faciliter l’exploration
de cartes où les niveaux présents ne sont pas les mêmes.
Si on souhaite ne représenter que les niveaux présents dans les données, il suffit de préciser drop=TRUE
et les
niveaux absents ne seront pas représentés.
#> [1] "Compact mid" "Compact low" "Open mid"
#> [4] "Open low" "Large low" "Sparsely built"
#> [7] "Dense trees" "Scattered trees" "Low plants"
#> [10] "Bare rock or paved" "Water"
#> Compact mid Compact low Open mid Open low
#> 2 3 5 6
#> Large low Sparsely built Dense trees Scattered trees
#> 8 9 11 12
#> Low plants Bare rock or paved Water
#> 14 15 17
En utilisant la représentation non standard, soit repr="alter"
, on peut traiter les cas où :
importQualVar
).On passera le vecteur contenant les valeurs possibles dans un vecteur, par exemple LCZlevels
et les couleurs leur correspondant dans un vecteur qu’il faut nommer colors
.
Si repr=alter
et que LCZlvels
et colors
ne sont pas renseignés les couleurs
sont choisies au sein de la palette “Polychrome 36” du package grDevice,
et les niveaux déduits des valeurs présentes.
#> [1] "redonOSM"
#> 2: No level vector, but a color vector which size covers the number of levels in the data.
L’argument LCZlevels
permet de spécifier les niveaux qui se trouvent dans les données
(il ne peut être utilisé dans le mode standard).
Dans l’exemple ci-dessous, on force la prise en compte d’un niveau “10”
qui n’est pas présent dans les données, et on laisse la fonction choisir des couleurs aléatoires.
#> [1] "redonOSM"
#> 8: No color vector but a level vector whose names don't cover the levels in the data.
#> Missing levels will be deduced from the data and colors will be chosen from a standard palette.
On peut également renseigner le vecteur des couleurs qu’on souhaite utiliser en renseignant l’argumentcolors
.
On peut renseigner les noms de couleurs connues de R ou un code RGB.
#> [1] "redonOSM"
#> One vector of levels, one vector of colors, either the same length (case 9: and 10:), or colors longer (case 12:, unused colors were dropped),
#> reduced to 4: & 5: A single vector was provided, whose names cover the levels in the data (values are expected to be colors).
Il peut être intéressant de regrouper des niveaux en catégories plus vastes pour une analyse plus générale.
On peut, par exemple, choisir de regrouper les LCZ urbaines et les LCZ de végétation et ainsi dessiner une enveloppe
urbaine.
La fonction groupLCZ
prend en argument le jeu de données à regrouper,
sf
, et la colonne où se trouvent les LCZ à regrouper, column
.
On renseigne ensuite des vecteurs dont le nom correspond à la catégorie regroupée et qui contient les niveaux à regrouper dans cette catégorie.
Les catégories créées sont ajoutées au jeu de données dans une colonne,
dont on précise le nom dans l’argument outCol
(par défaut outCol="grouped"
).
On peut alors passer le nouveau jeu de données dans la fonction LCZshow
.
#> [1] "redonOSMgrouped"
#> One vector of levels, one vector of colors, either the same length (case 9: and 10:), or colors longer (case 12:, unused colors were dropped),
#> reduced to 4: & 5: A single vector was provided, whose names cover the levels in the data (values are expected to be colors).
L’objectif de ce paquet R est de proposer une comparaison facile de deux classifications en LCZ. Dans notre exemple, on compare naturellement les LCZ créés par la chaîne GeoClimate à partir des données de la BD TOPO® v2.2 produite par l’IGN et celles produites à partir d’OpenStreetMap sur la même zone.
La fonction compareLCZ
produit une carte pour chaque classification en LCZ.
Elle intersecte les géométries des deux fichiers afin d’obtenir des géométries sur lesquelles les deux classifications sont soit tout à fait d’accord, soit tout à fait en désaccord.
Cet accord entre géométries intersectées est ensuite représenté dans un troisième graphique.
Une matrice de confusion (appelée parfois matrice d’agrément) est aussi calculée : pour chaque géométrie, on retient sa surface et les valeurs des deux classifications en LCZ. On calcule alors comment chaque modalité de la première classification LCZ est ventilée parmi les modalités de la seconde classification LCZ. Le dernier graphique représente cette information.
Le graphique produit contient quatre graphiques, il est plus lisible zoomé.
#> The column LCZ_PRIMARY of the dataset redonBDT is the reference against which the LCZ_PRIMARY column of the dataset redonOSM will be compared.
#> Both sf datasets need to live in the same crs projection (srid / epsg),
#> they will be coerced to the specified reference (redonBDT)
#> Warning: attribute variables are assumed to be spatially constant throughout
#> all geometries
#> Warning: attribute variables are assumed to be spatially constant throughout
#> all geometries
Lecture du fichier correctement zoomé et enregistré en png.
path <- system.file('extdata/RedonCompare.png',package="lczexplore")
knitr::include_graphics(path, error=FALSE)
plot of chunk unnamed-chunk-11
La fonction renvoie dans R un objet appelé matConfOut qui contient plusieurs éléments :
Enfin, si l’argument exwrite=TRUE
la fonction compareLCZ exporte les données
qui ont servi à produire la matrice de confusion dans un fichier csv.
Ce fichier peut ensuite être chargé dans R pour d’autres analyses.
comparaison$percAgg
#> [1] 61.75
comparaison$pseudoK
#> [1] 0.4247418
Certains algorithmes de classement en LCZ peuvent fournir une valeur de “confiance” au type de LCZ qu’ils affectent à une unité spatiale de référence.
Par exemple, GeoClimate, pour une géométrie donnée, peut lui avoir attribué une modalité de LCZ principale, mais également indiquer qu’une autre modalité secondaire était possible, même si moins justifiée. GeoClimate propose alors une valeur d’unicité, ou uniqueness. Cette unicité évolue entre 1 et 0, plus elle s’éloigne de 1, plus la seconde modalité était une candidate crédible. Cette uniqueness peut donc être vue comme une mesure de confiance.
La fonction importLCZvect
permet d’indiquer quelles colonnes du geojson contiennent l’identifiant de la géométrie (geomID
) et l’indicateur de confiance associé (confid
) nécessaires à l’analyse de sensibilité.
dirPath<-paste0(system.file("extdata",package="lczexplore"),"/")
dirPathOSM<-paste0(dirPath,"osm/2022/Redon")
dirPathBDT<-paste0(dirPath,"bdtopo_2_2/Redon")
## La fonction d'import fonctionne en réalité aussi avec les fichiers shape
## Notez que les noms des colonnes sont différents pour le fichier shape, dans tous les cas
## c'est le nom des colonnes de votre fichier que vous rentrerez.
redonBDT<-importLCZvect(dirPath=dirPathBDT,file="rsu_lcz_bdt_redon.shp",
column ="LCZ_PRIMAR",geomID = "ID_RSU",confid="LCZ_UNIQUE" )
redonOSM<-importLCZvect(dirPath=dirPathOSM,file="rsu_lcz.geojson",column = "LCZ_PRIMARY",geomID = "ID_RSU",confid="LCZ_UNIQUENESS_VALUE")
# Afin de conserver les mêmes noms, on réimporte avec le geojson
redonBDT<-importLCZvect(dirPath=dirPathBDT,file="rsu_lcz.geojson",column = "LCZ_PRIMARY",geomID = "ID_RSU",confid="LCZ_UNIQUENESS_VALUE")
À chaque unité de référence spatiale (RSU, une géométrie) est maintenant associé un type de LCZ et un niveau de confiance.
redonCompare<-compareLCZ(sf1=redonBDT,wf1="bdt", geomID1 = "ID_RSU",column1 ="LCZ_PRIMARY",
confid1 = "LCZ_UNIQUENESS_VALUE",
sf2=redonOSM,wf2="osm",geomID2 = "ID_RSU",column2="LCZ_PRIMARY",confid2 ="LCZ_UNIQUENESS_VALUE",exwrite=FALSE, saveG="comparaison")
#> The column LCZ_PRIMARY of the dataset redonBDT is the reference against which the LCZ_PRIMARY column of the dataset redonOSM will be compared.
#> Both sf datasets need to live in the same crs projection (srid / epsg),
#> they will be coerced to the specified reference (redonBDT)
#> Warning: attribute variables are assumed to be spatially constant throughout
#> all geometries
#> Warning: attribute variables are assumed to be spatially constant throughout
#> all geometries
# redonInputSensib<-read.csv()
knitr::include_graphics("comparaison.png", error=FALSE)
plot of chunk unnamed-chunk-15
La question à laquelle cette fonction permet de répondre est : est-ce que l’accord entre les deux classifications LCZ augmente si on ne conserve que les géométries pour lesquelles l’indicateur de confiance associé aux LCZ est supérieur à un certain seuil ?
L’étendue des valeurs de confiance est découpée en autant de points que spécifié par le paramètre nPoints
.
Pour chacun de ces seuils de confiance, la fonction conserve uniquement les géométries
pour lesquelles la valeur de confiance est supérieure à ce seuil dans les deux fichiers.
Elle calcule ensuite l’accord entre les deux classifications en se basant uniquement sur ces RSU “de confiance”, et le représente en bleu sur le graphique final.
On représente aussi, en magenta, l’accord entre les géométries dont la valeur de confiance était inférieure au seuil.
names(redonCompare$data)
#> [1] "ID_RSU" "LCZ_PRIMARY" "LCZ_UNIQUENESS_VALUE"
#> [4] "ID_RSU.1" "LCZ_PRIMARY.1" "LCZ_UNIQUENESS_VALUE.1"
#> [7] "area" "agree" "location"
confidRedon<-confidSensib(inputDf=redonCompare$data,filePath="", nPoints=10,
wf1="bdtopo_2_2", wf2="osm",
geomID1="ID_RSU", column1="LCZ_PRIMARY", confid1="LCZ_UNIQUENESS_VALUE",
geomID2="ID_RSU.1",column2="LCZ_PRIMARY.1", confid2="LCZ_UNIQUENESS_VALUE.1",
sep=";", repr="standard",
plot=TRUE, saveG = ".")
#> [1] "confSeq in internFunction "
#> 0% 11.11111% 22.22222% 33.33333% 44.44444% 55.55556%
#> 0.006101597 0.091693921 0.202059986 0.268302499 0.456597082 0.575888942
#> 66.66667% 77.77778% 88.88889% 100%
#> 0.683662384 0.815106352 0.993250260 1.000000000
#> Warning: Removed 1 rows containing missing values (`geom_point()`).
#> Warning: Removed 1 rows containing missing values (`geom_text()`).
#> Warning: Removed 1 rows containing missing values (`geom_point()`).
#> Warning: Removed 1 rows containing missing values (`geom_text()`).
#> [1] "confSeq in internFunction "
#> 0% 11.11111% 22.22222% 33.33333% 44.44444% 55.55556% 66.66667%
#> 0.03755517 0.10117962 0.15640481 0.23005578 0.24716110 0.29995499 0.43094746
#> 77.77778% 88.88889% 100%
#> 0.52734432 0.65608618 0.79049066
#> [1] "confSeq in internFunction "
#> 0% 11.11111% 22.22222% 33.33333% 44.44444% 55.55556%
#> 0.006101597 0.080437929 0.103621330 0.112250552 0.215540816 0.272522342
#> 66.66667% 77.77778% 88.88889% 100%
#> 0.425410263 0.484218592 0.487496806 0.693319494
#> [1] "confSeq in internFunction "
#> 0% 11.11111% 22.22222% 33.33333% 44.44444% 55.55556% 66.66667%
#> 0.03755517 0.06939875 0.08532054 0.08532054 0.08532054 0.08532054 0.08532054
#> 77.77778% 88.88889% 100%
#> 0.18387091 0.30116352 0.43719838
#> [1] "confSeq in internFunction "
#> 0% 11.11111% 22.22222% 33.33333% 44.44444% 55.55556%
#> 0.008741054 0.008861656 0.009826473 0.009826473 0.010955103 0.012365891
#> 66.66667% 77.77778% 88.88889% 100%
#> 0.012365891 0.013056145 0.013253361 0.013253361
#> [1] "confSeq in internFunction "
#> 0% 11.11111% 22.22222% 33.33333% 44.44444% 55.55556%
#> 0.006692699 0.067271124 0.154323145 0.213118523 0.257162253 0.418052676
#> 66.66667% 77.77778% 88.88889% 100%
#> 0.524607611 0.601875346 0.679941194 1.000000000
#> [1] "confSeq in internFunction "
#> 0% 11.11111% 22.22222% 33.33333% 44.44444% 55.55556% 66.66667%
#> 0.06324468 0.12275556 0.18226644 0.24177732 0.24177732 0.24177732 0.24177732
#> 77.77778% 88.88889% 100%
#> 0.24177732 0.24177732 0.24177732
#> [1] "confSeq in internFunction "
#> 0% 11.11111% 22.22222% 33.33333% 44.44444% 55.55556% 66.66667%
#> 0.01899439 0.24990516 0.46084437 0.62301538 0.71562722 0.81304148 0.87950091
#> 77.77778% 88.88889% 100%
#> 0.99051465 1.00000000 1.00000000
#> Warning: Removed 7 rows containing missing values (`geom_point()`).
#> Warning: Removed 7 rows containing missing values (`geom_text()`).
#> Warning: Removed 7 rows containing missing values (`geom_point()`).
#> Warning: Removed 7 rows containing missing values (`geom_text()`).
knitr::include_graphics("GeneralUniquenessSensib.png", error=FALSE)
plot of chunk unnamed-chunk-17
knitr::include_graphics("byLCZUniquenessSensib.png", error=FALSE)
plot of chunk unnamed-chunk-18