Skip to content

Commit

Permalink
Merge pull request #52 from MTES-MCT/dev
Browse files Browse the repository at this point in the history
Dev - nov 2024
  • Loading branch information
jengelaere authored Dec 1, 2024
2 parents bbb6a02 + 0541fd7 commit b45b7a1
Show file tree
Hide file tree
Showing 11 changed files with 98 additions and 27 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/bookdown-build-and-deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,4 @@ jobs:
name: Build and bookdown
uses: MTES-MCT/parcours-r/.github/workflows/bookdown-build-from-desc-and-deploy.yml@master
with:
r_version: '4.2.1'
r_version: '4.4.1'
2 changes: 1 addition & 1 deletion .github/workflows/bookdown-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,4 @@ jobs:
name: Build bookdown
uses: MTES-MCT/parcours-r/.github/workflows/bookdown-build-from-desc.yml@master
with:
r_version: '4.2.1'
r_version: '4.4.1'
11 changes: 7 additions & 4 deletions 04-lire-des-donnees-spatiales.Rmd
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ Notez que si vous cherchez à exporter une nouvelle fois ce fichier, vous aurez

Pour pouvoir écraser ce fichier, vous avez deux options :

- Utiliser le paramètre `layer_option` qui vous permet d'inclure des options propres au driver utilisé.
- Utiliser le paramètre `append` qui sert à d'ajouter des données à la couche existante quand il est à `TRUE`, et la remplace sinon.

```{r, eval=FALSE}
st_write(
Expand Down Expand Up @@ -107,11 +107,14 @@ st_write(
Il faut juste lui préciser comment on souhaite écrire la géométrie dans la table exportée, avec
`layer_options = "GEOMETRY=AS_WKT"` ou `layer_options = "GEOMETRY=AS_XY"`.

Le paramètre `layer_option` permet d'inclure des options propres à chaque driver utilisé.


## Lire des données spatiales du web

### Lire des données geojson

`sf` peut lire un geojson qu'il soit hébergé sur un serveur compréssé ou non ou encore disponible par api.
`sf` peut lire un geojson qu'il soit hébergé sur un serveur, compressé ou non, ou encore disponible par api.

#### Exemple 1 (geojson classique):

Expand Down Expand Up @@ -139,8 +142,8 @@ st_read(url) %>%
`sf` repose sur `GDAL` et permet également de lire des geojsons compressés. On pourrait faire de même avec un shapefile compressé en .zip. Cela évite de télécharger le fichier et de le décompresser. Voici un exemple pour récupérer les bâtiments de la commune de Nantes provenant du PCI redistribué par Etalab.

```{r eval = FALSE, message = TRUE, warning = FALSE}
vfs <- '/vsigzip//vsicurl/https://cadastre.data.gouv.fr/data/etalab-cadastre/latest/geojson/communes/44/44109/cadastre-44109-batiments.json.gz'
batiment_nantes <- st_read(dsn = vfs)
dsn <- '/vsigzip//vsicurl/https://cadastre.data.gouv.fr/data/etalab-cadastre/latest/geojson/communes/44/44109/cadastre-44109-batiments.json.gz'
batiment_nantes <- st_read(dsn = dsn, layer = "cadastre-44109-batiments.json")
```

Pour aller plus loin sur les `Virtual File Systems` : [https://gdal.org/user/virtual_file_systems.html](https://gdal.org/user/virtual_file_systems.html)
Expand Down
2 changes: 1 addition & 1 deletion 06-les-operations-sur-donnees-spatiales.Rmd
Original file line number Diff line number Diff line change
Expand Up @@ -463,7 +463,7 @@ Le 44 comprend `r nrow(boul_44)` boulangeries.
```{r}
intersection <- st_intersects(grille_ajustee, boul_44, sparse = TRUE)
dim(intersection)
intersection[1:10]
```

Expand Down
3 changes: 2 additions & 1 deletion 07-operations-geometriques.Rmd
Original file line number Diff line number Diff line change
Expand Up @@ -307,12 +307,13 @@ regions <- departements_geo %>%
mapview(regions, legend = FALSE)
```

Derrière cette opération, `summarise()` utilise `st_union()` du package `sf` pour dissourdre les polygones des départements en un seul polygone régional.
Derrière cette opération, `summarise()` utilise `st_union()` du package `sf` pour dissoudre les polygones des départements en un seul polygone régional.

```{r}
regions_52 <- departements_geo %>%
filter(INSEE_REG == "52")
regions_52 <- st_union(regions_52)
mapview(regions_52, legend = FALSE)
```

3 changes: 2 additions & 1 deletion 08-les-reprojections.Rmd
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ st_distance(rennes %>% st_transform(2154), nantes_proj)

A cette question, il y a rarement une seule bonne réponse.

En ce qui concerne les CRS géométriques, le plus simple est d'utiliser le WGS 84 (EPSG 4326), qui est de loin le plus populaire, avec lequel beaucoup de données sont fournies.
En ce qui concerne les CRS géographiques, le plus simple est d'utiliser le WGS 84 (EPSG 4326), qui est de loin le plus populaire, avec lequel beaucoup de données sont fournies.

En ce qui concerne les CRS projetés, il existe des CRS officiels à utiliser préférentiellement pour les données françaises.
En métropole, on utilise le Lambert 93 (EPSG 2154).
Expand Down Expand Up @@ -163,6 +163,7 @@ Qu'est ce qui a changé entre nos deux cartes ?

```{r}
st_crs(World)
st_crs(World_pekin)
```

Expand Down
34 changes: 20 additions & 14 deletions 10-creer-des-cartes-avec-ggplot2.Rmd
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,8 @@ Un [support de cours](https://rcarto.github.io/cartographie_avec_r/mapsf.html#re
Comme l'utilisation de `{ggplot2}` est à privilégier au sein du pôle ministériel, ce package ne sera pas présenté lors de la formation.


## Quelques rappels sur `{ggplot2}`
## Quelques rappels sur `{ggplot2}` issus du [module 5 sur la datavisualisation](https://mtes-mct.github.io/parcours_r_module_datavisualisation/){target="_blank"}


`{ggplot2}` est un package de visualisation de données qui dispose de templates (thèmes, palettes) à la Marque Etat grâce au package `{gouvdown}`, créé par la communauté d'agents de l'Etat [Spyrales](https://www.spyrales.fr/){target="_blank"}.

Expand All @@ -88,9 +89,6 @@ Comme l'utilisation de `{ggplot2}` est à privilégier au sein du pôle ministé
![le tidyverse](pic/tidyverse.png "le tidyverse"){#id .class width=800}


Se référer à [la feuille de triche {ggplot2}](https://raw.githubusercontent.com/rstudio/cheatsheets/main/data-visualization.pdf) permet de se lancer rapidement.


### `{ggplot2}` : les concepts clefs

Pour construire un graphique avec `{ggplot2}` il faut lui déclarer plusieurs éléments :
Expand Down Expand Up @@ -167,7 +165,7 @@ Par exemple : distribution des communes selon leur population à partir du jeu d
glimpse(pop2015)
ggplot(pop2015, aes(x = pop2015_totale)) +
geom_histogram(fill = "lightblue") +
scale_x_log10(labels = ~format(.x, big.mark = " ", scientific = FALSE), name = "nombre d'hab.")
scale_x_log10(labels = ~format(.x, big.mark = " ", scientific = FALSE), name = "nombre d'hab.", n.breaks = 15)
```

Pour en savoir plus sur ggplot2 :
Expand Down Expand Up @@ -224,6 +222,9 @@ Pour le système de coordonnées, la fonction `coord_sf()` va silencieusement ch
`coord_sf()` permet également de *zoomer* sur la carte en spécifiant les bornes x et y de la carte, ou également de définir le titre des axes.


Se référer à [la feuille de triche {ggplot2}](https://raw.githubusercontent.com/rstudio/cheatsheets/main/data-visualization.pdf) permet de se lancer rapidement.


## Faire des cartes avec {ggplot2}


Expand Down Expand Up @@ -369,7 +370,7 @@ carte_ronds_prop2 +
```


La fonction `theme_set()` vous permet de définir un thème par défaut pour l'ensemble de vos graphiques.
La fonction `theme_set()` vous permet de définir un thème par défaut pour l'ensemble des graphiques générés pendant votre session R.

```{r, echo=TRUE, eval=TRUE, warning=FALSE, fig.height=5, fig.width=10}
Expand Down Expand Up @@ -490,12 +491,16 @@ Il faut au préalable préparer notre jeu de données en [le passant au format l
indic_epci_normands_geo_long <- pop2015_epci_normands_geo %>%
pivot_longer(cols = c(starts_with("pop2015"), densite_pop, poids_pop_a_part), names_to = "indicateurs", values_to = "valeurs") %>%
filter(!str_detect(indicateurs, "pop2015"))
filter(str_detect(indicateurs, "pop2015_"))
ggplot(data = indic_epci_normands_geo_long) +
geom_sf(aes(fill = valeurs), color = "white") +
facet_wrap(~indicateurs) +
scale_fill_gouv_continuous("pal_gouv_b")
scale_fill_gouv_continuous(trans = "log", breaks = c(100, 1000, 20000, 400000),
label = ~format(.x, big.mark = " ", scientific = FALSE), reverse = TRUE) +
labs(fill = "Nb habitants")
```

Un deuxième exemple de facette sur la maille géo.
Expand All @@ -505,7 +510,7 @@ fonds_carto_empiles <- bind_rows(
COGiter::epci_geo %>% mutate(TypeZone = "Epci") %>% rename(CodeZone = EPCI),
COGiter::departements_geo %>% mutate(TypeZone = "Départements") %>% rename(CodeZone = DEP)
) %>%
inner_join(pop2015_preparee) %>%
inner_join(pop2015_preparee, by = c("CodeZone", "TypeZone")) %>%
mutate(densite = round(pop2015 / as.numeric(AREA) * 1000000, 0),
TypeZone = fct_inorder(TypeZone))
Expand Down Expand Up @@ -539,7 +544,8 @@ carte_ronds_prop2 +

### Mettre plusieurs cartes côte à côte

On peut a partir d'une même carte vouloir réaliser un zoom sur une sous partie de celle-ci.
On peut à partir d'une même carte vouloir réaliser un zoom sur une sous partie de celle-ci.

`coord_sf()` va nous permettre de *zoomer* sur une carte, et `cow_plot()` va nous permettre d'afficher nos deux cartes côte à côte.

Pour zoomer sur une carte, `coord_sf()` va avoir besoin des coordonnées *x* et *y* du cadre sur lequel on veut zoomer.
Expand All @@ -549,7 +555,7 @@ Filtrons par exemple sur le Département de l'Orne.

```{r}
bbox_dep <- fonds_carto_normands$departements %>%
filter(DEP == "14") %>%
filter(DEP == "61") %>%
st_bbox()
```

Expand All @@ -560,7 +566,7 @@ normandie <- carte_ronds_prop +
geom_sf(data = fonds_carto_normands$departements, size = 1, color = "gray10", fill = NA) +
guides(color = "none", size = 'none')
calvados <- normandie +
orne <- normandie +
coord_sf(xlim = c(bbox_dep[1], bbox_dep[3]), ylim = c(bbox_dep[2], bbox_dep[4])) +
theme(panel.background = element_rect(fill = "light blue")) +
scale_color_gouv_continuous(palette = "pal_gouv_i", reverse = FALSE) +
Expand All @@ -570,8 +576,8 @@ calvados <- normandie +
size = "Nombre d'habitants",
color = "Poids population\ncomptée à part (%)",
caption = "Source : INSEE - RP")
orne
calvados
```

On peut utiliser ensuite le package `{cowplot}` et sa fonction `plot_grid()` pour afficher nos cartes côte à côte.
Expand All @@ -581,7 +587,7 @@ La fonction `plot_grid()` qui permet de disposer ***n*** graphes sur ***i*** col
Il faut jouer sur les largeurs relatives pour que les deux cartes s'agencent bien.

```{r, fig.height=6,fig.width=12}
plot_grid(calvados, normandie, rel_widths = c(1, 2))
plot_grid(orne, normandie, rel_widths = c(1, 2))
```


Expand Down
4 changes: 2 additions & 2 deletions 13-osm.Rmd
Original file line number Diff line number Diff line change
Expand Up @@ -70,10 +70,10 @@ Le package `{ggspatial}` permet de télécharger et d'afficher des fonds de cart
boul_44 <- filter(sirene44, APET700 == "1071C") %>%
select(SIREN, NOMEN_LONG)
ggplot(boul_44) +
ggplot(data = boul_44) +
annotation_map_tile(type = "osm") +
geom_sf() +
theme_gouv_map()
theme_void()
```

Expand Down
3 changes: 2 additions & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
ARG R_VERSION=4.2.1
ARG R_VERSION=4.4.1
ARG GITHUB_PAT=${{ secrets.GITHUB_TOKEN }}

FROM inseefrlab/onyxia-rstudio:r${R_VERSION}
RUN apt-get update && apt-get install -y cargo
Expand Down
61 changes: 60 additions & 1 deletion data-raw/support_pdf.R
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ library(dplyr)
chap <- c("index.Rmd", list.files(".", ".Rmd")) %>%
setdiff("support_m7.Rmd") %>%
unique() %>%
gsub(".Rmd", "", .) %>%
gsub(".Rmd", ".html", .) %>%
gsub("^[[:digit:]]*-", "", .)


Expand All @@ -18,3 +18,62 @@ propre.rpls::creer_pdf_book(nom_pdf = "Parcours_R_support_m7_Analyses_spatiales.
# "1-30;33-48;60-69;81-91;99-153"
# supprimer :
# 31-32;49-59;70-80;92-98

# Impression du support de cours au format pdf

library(dplyr)

# liste des chap dans l'ordre
chap <- c("index.Rmd", list.files(".", ".Rmd")) %>%
setdiff("support_m7.Rmd") %>%
unique() %>%
gsub(".Rmd", "", .) %>%
gsub("^[[:digit:]]*-", "", .) %>%
gsub("exercices-corriges", "exercices-corrigés", .)


propre.rpls::creer_pdf_book(nom_pdf = "Parcours_R_support_m7_Analyses_spatiales.pdf",
pages_html = chap)

# Des pages blanches ajoutées inutilement
# Pour imprimer, garder les pages
# "1-30;33-48;60-69;81-91;99-153"
# supprimer :
# 31-32;49-59;70-80;92-98

# wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
# sudo apt-get update --fix-missing
# sudo apt install ./google-chrome-stable_current_amd64.deb


creer_pdf_book_ssp <- function (chemin_book = "_book/", nom_pdf = "Parcours_R_support_m7_Analyses_spatiales.pdf",
pages_html = chap,
scale = 0.9) {
if (!dir.exists(chemin_book)) {
message(glue::glue("Le repertoire {chemin_book} n'existe pas, creation au prealable de la publication au format html."))
rmarkdown::render_site(encoding = "UTF-8")
chemin_book = "_book/"
}
else {
chemin_book <- paste0(chemin_book, ("/"))
}
pages_html <- gsub(".html$", "", pages_html)
pages_html <- paste0(chemin_book, pages_html, ".html")
pages_pdf <- gsub(".html", ".pdf", pages_html)
attempt::stop_if_any(!file.exists(pages_html), msg = glue::glue("Il manque au moins un fichier html dans {chemin_book} ou il y a probleme de nommage, revoyez l'argument 'pages_html'."))
file.copy(from = paste0(chemin_book, "gouv_book.css"), to = paste0(chemin_book, "style.css"))
message("Export des pages html au format PDF en cours :")
impress <- function(page, echelle = scale) {
message(glue::glue("- {page}"))
pagedown::chrome_print(input = page, extra_args = c("--disable-gpu", "--no-sandbox", "--disable-dev-shm-usage"),
verbose = 0, timeout = 600, options = list(transferMode = "ReturnAsStream", scale = echelle))
}
purrr::map(.x = pages_html, .f = impress)
qpdf::pdf_combine(pages_pdf, output = glue::glue("{chemin_book}{nom_pdf}"))
file.remove(pages_pdf, glue::glue("{chemin_book}style.css"))
suppressWarnings(file.remove(glue::glue("{chemin_book}404.pdf")))
message(glue::glue("Le fichier {nom_pdf} est disponible dans {chemin_book}."))
}

creer_pdf_book_ssp()

Binary file added pic/forme_reelle_terre_vimeo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit b45b7a1

Please sign in to comment.