---
title: "lczexplore_fr"
author: "Matthieu Gousseff"
date: "`r Sys.Date()`"
output: rmarkdown::html_vignette
resource_files:
  - vignettes/Redon.png
vignette: >
    %\VignetteIndexEntry{lczexplore_fr}
    %\VignetteEngine{knitr::rmarkdown}
    %\VignetteEncoding{UTF-8}
---



```{r, settings, include = FALSE}
knitr::opts_chunk$set(
        collapse = TRUE,
        comment = "#>"
)

library("png")


```


# Présentation du paquet lczexplore
## Origine et finalité
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.

## Installation

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).`
```{r, chargement, echo = FALSE}
library(lczexplore)
```


# Cas général : charger un fichier contenant des géométries et les LCZ associées

## Importer les fichiers contenant les LCZ avec la fonction importLCZvect

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 .fgb (format recommandé), .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). 



```{r, import-des-fichiers, eval = TRUE, echo = TRUE}
dirPath <- system.file("extdata/multipleWfs/Redon", package = "lczexplore")
redonOSM <- importLCZvect(dirPath = dirPath, file = "osm_lcz.fgb", column = "LCZ_PRIMARY", verbose = FALSE)
redonBDT <- importLCZvect(dirPath = dirPath, file = "bdt_lcz.fgb", column = "LCZ_PRIMARY", verbose = FALSE)
```
## Représenter les LCZ avec la fonction showLCZ

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

### Représentation standard

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.

```{r, show, echo=FALSE, fig.dim = c(8, 6)}
map1<-showLCZ(sf=redonOSM, wf="OSM", column="LCZ_PRIMARY", repr="standard")
```

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. 

```{r, show-drop, fig.dim = c(8, 6), echo = FALSE}
map2<-showLCZ(sf=redonOSM,wf="OSM",column="LCZ_PRIMARY",repr="standard",drop=TRUE)
```


### Représentation alternative

En utilisant la représentation non standard, soit `repr="alter"`, on peut traiter les cas où :
- on a procédé à un regroupement de modalités, 
- les LCZ ont un encodage particulier,
- on veut utiliser d'autres couleurs,
- on veut utiliser la fonction pour représenter d'autres variables (voir la fonction `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.

```{r, show-alter, fig.dim = c(8, 6), eval = TRUE, echo = TRUE}
# Choix d'un vecteur de couleurs alternatif aléatoire
testCol <- palette.colors(n = 17, palette = "Polychrome 36")
map3 <- showLCZ(sf = redonOSM, wf = "OSM", column = "LCZ_PRIMARY", repr = "alter", colors = testCol, useStandCol = FALSE)

```

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. 

```{r, niveau-vide, fig.dim = c(8, 6), eval = TRUE, echo = TRUE}

LCZlevels <- c(2, 3, 5, 6, 8, 9, 10, 101, 102, 104, 105, 107)
map4 <- showLCZ(sf = redonOSM, wf = "OSM", column = "LCZ_PRIMARY", repr = "alter", LCZlevels = LCZlevels, drop = FALSE)
```

On peut également renseigner le vecteur des couleurs qu'on souhaite utiliser en renseignant l'argument`colors`.
On peut renseigner les noms de couleurs connues de R ou un code RGB.  

```{r, couleurs-nommees, fig.dim = c(8, 6), eval = TRUE, echo = TRUE}
# Choix de couleurs prises au hasard

# Après une première représentation on constate qu'il n'y a que les typeLevels 2, 3, 5, 6, 8, 9, 101, 102, 104, 105, 107.
# Je spécifie un vecteur de couleur de taille 11 colors
LCZlevels <- c(2, 3, 5, 6, 8, 9, 101, 102, 104, 105, 107)
couleurs <- c("red", "brown1", "orange", "coral", "grey", "darkgreen", "chartreuse4", "springgreen3",
              "darkolivegreen", "black", "#6d67fd")
map5 <- showLCZ(sf = redonOSM, wf = "OSM", column = "LCZ_PRIMARY", repr = "alter", drop = TRUE, LCZlevels = LCZlevels, colors = couleurs)

```

## Regrouper des types de LCZ avec la fonction groupLCZ

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

```{r, groupage, fig.dim = c(8, 6), eval = TRUE, echo = TRUE}
redonOSMgrouped <- groupLCZ(redonOSM, column = "LCZ_PRIMARY",
                            urban = c("1", "2", "3", "4", "5", "6", "7", "8", "9"),
                            industry = "10",
                            vegetation = c("101", "102", "103", "104"),
                            impervious = "105", pervious = "106", water = "107", colors = c("red", "black", "green", "grey", "burlywood", "blue"))
map6 <- showLCZ(redonOSMgrouped, column = "grouped", repr = "alter", wf = "OSM",
                LCZlevels = c("urban", "industry", "vegetation", "impervious", "pervious", "water"),
                colors = c("red", "black", "green", "grey", "burlywood", "blue"))

```

# Comparer deux classifications LCZ avec la fonction compareLCZ

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

## Représentations graphiques

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é.*

```{r, comparaison, fig.dim = c(16,12 ), eval = TRUE, echo = FALSE}
path <- paste0(system.file("extdata/", package = "lczexplore"), "/redonCompare")
comparaison <- compareLCZ(sf1 = redonBDT, column1 = "LCZ_PRIMARY", wf1 = "BD TOPO v2.2",
                          sf2 = redonOSM, column2 = "LCZ_PRIMARY", wf2 = "Open Street Map", ref = 1,
                          repr = "standard", exwrite = FALSE, location = "Redon",
                          saveG = path)

```

Lecture du fichier correctement zoomé et enregistré en png.

```{r, comparaison-image-jolie, out.width = "680px"}
path <- system.file('extdata/redonCompare.png',package="lczexplore")
knitr::include_graphics(path, error=FALSE)

```

```{R cleaningpng}
file.remove(path)
```

## Données produites et analyses ultérieures

La fonction renvoie dans R un objet appelé matConfOut qui contient plusieurs éléments :

- $data renvoie les géométries intersectées, leurs identifiants si on les avait chargés, leur valeur de LCZ et leur surface.
- $matConfLarge renvoie la matrice de confusion qui a servi à produire le graphique correspondant. 
- $percAgg renvoie le pourcentage d'accord global entre les deux classifications sur la zone d'étude
- $areas renvoie les aires par niveaux de classification pour chacun des jeux de données. 
- $pseudoK renvoie l'équivalent du coefficient d'agrément Kappa de Cohen, pondéré par les surfaces des géométries.
Ce coefficient permet de prendre en compte la part d'accord entre les classifications liée au hasard. 

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.
```{r, valeurs-numeriques, eval = TRUE, echo = TRUE}
comparaison$percAgg
comparaison$pseudoK
```


# Etude de la sensibilité de l'accord à la confiance accordée aux valeurs de LCZ

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.

## Prise en compte des géométries et des valeurs de confiance lors de l'import des fichiers.

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é. 
```{r, analyse-sensibilite, eval = TRUE, echo = TRUE }
dirPath <- paste0(system.file("extdata", package = "lczexplore"), "/multipleWfs/Redon")

redonOSM <- importLCZvect(dirPath = dirPath, file = "osm_lcz.fgb", column = "LCZ_PRIMARY", geomID = "ID_RSU", confid = "LCZ_UNIQUENESS_VALUE")

redonBDT <- importLCZvect(dirPath = dirPath, file = "bdt_lcz.fgb", column = "LCZ_PRIMARY", geomID = "ID_RSU", confid = "LCZ_UNIQUENESS_VALUE")

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, plot = FALSE)

```

À chaque unité de référence spatiale (RSU, une géométrie) est maintenant associé un type de LCZ et un niveau de confiance. 

```{r, comparaison-avec-confiance, echo = TRUE, fig.show="hide"}
path <- system.file('extdata/redonCompare',package="lczexplore")
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 = path)
# redonInputSensib<-read.csv()
```
```{r, sortie-jolie, out.width = "680px"}
path <- system.file('extdata/GeneralUniquenessSensib.png',package="lczexplore")
knitr::include_graphics(path, error=FALSE)

```
Il est important de noter que les colonnes contenant les LCZ en entrée sont renommées à partir des
noms de workflow en sortie, pour éviter des renommages du type lcz_primary et lcz_primary.1.

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.


```{r, analyse-sensibilite-2, fig.dim = c(12,9), fig.show="hide"}
names(redonCompare$data)
confidRedon <- confidSensib(inputDf = redonCompare$data, filePath = "", nPoints = 10,
                            wf1 = "bdtopo_2_2", wf2 = "osm",
                            geomID1 = "ID_RSU", column1 = "bdt", confid1 = "LCZ_UNIQUENESS_VALUE",
                            geomID2 = "ID_RSU.1", column2 = "osm", confid2 = "LCZ_UNIQUENESS_VALUE.1",
                            sep = ";", repr = "standard",
                            plot = TRUE, saveG = system.file("extdata/", package = "lczexplore"))

```
```{r, sortie-sensibilite-jolie, out.width = "680px"}
path <- paste0(system.file("extdata/GeneralUniquenessSensib",package="lczexplore"), ".png")
knitr::include_graphics(path, error=FALSE)

```
La fonction `confidSensib` propose également cette analyse par type de LCZ. 

```{r, sensibilite-par-type-de LCZ, out.width = "680px"}
path <- paste0(system.file("extdata/byLCZUniquenessSensib", package = "lczexplore"), ".png")
knitr::include_graphics(path, error = FALSE)

```
Les principales fonctions ont été évoquées ici, pour plus d'information consulter les fichiers d'aide de chacune des fonctions.

```{R cleanup}
path <- system.file("extdata/byLCZUniquenessSensib.png", package = "lczexplore")
if (file.exists(path)){file.remove(path)}

path <- system.file("extdata/GeneralUniquenessSensib.png", package = "lczexplore")
if (file.exists(path)){file.remove(path)}
path <- system.file("extdata/redonCompare.png", package = "lczexplore")
if (file.exists(path)){file.remove(path)}
```