Le démonstrateur est une application shiny permettant de visualiser un tableau de bord d’indicateurs en fonction de la sélection par l’utilisateur d’un point de pêche ou d’une aire géographique.
L’information contenue dans la base Aspe étant tabulée, il faut la spatialiser pour permettre la sélection géographique. Pour une rapidité d’affichage satisfaisante, les opérations les plus lourdes de traitement (ex : intersections géographiques) sont au maximum réalisées lors de prétraitements, donc en dehors de l’appli. Les données sont autant que possible agrégées pour diminuer la taille des tables.
Ces opérations de prétraitement ne sont pas spécifiques au développement du démonstrateur. Au contraire elles sont assez génériques pour qui souhaite exploiter la base Aspe pour calculer sur un périmètre donné, une période donnée, etc. des indicateurs comme les abondances, densités, IPR et autres. Elles ont donc fait l’objet du développement, à part, d’un package R nommé {aspe}. Certaines des données géographiques sont téléchargées et mises en forme au moyen du package {tod}.
library(aspe)
library(tidyverse)
library(COGiter)
library(tod)
Les données ont été parsées depuis un dump de la base Aspe (cf. ce tuto). La fonction misc_nom_dernier_fichier() permet d’identifier le plus récents des fichiers de données dans le répertoire choisi.
rdata_tables <- misc_nom_dernier_fichier(repertoire = "../../../raw_data",
pattern = "^tables")
Le nom de ce fichier est :
rdata_tables
## [1] "../../../raw_data/tables_sauf_mei_2022_05_30_12_49_01.RData"
On le charge.
load(rdata_tables)
Ici, la dernière date de saisie / modification / opération dans la base est le 29 mai 2022.
Le principe pour utiliser les tables de la base SQL d’origine est de constituer un dataframe “passerelle” qui relie les tables d’origine par les identifiants de leurs objets (stations, points, opérations, lots, etc.). On peut ensuite compléter cette ossature par des jointures sur les champs contenant les identifiants. La démarche se retrouve systématiquement dans les traitements donc elle n’a été détaillée qu’une fois dans ce tuto.
On rajoute :
ope_date) et une variable annee, avec la fonction mef_ajouter_ope_date() pour permettre des agrégations annuellesmef_ajouter_lots()data <- mef_creer_passerelle() %>% # création passerelle
mef_ajouter_ope_date() %>% # ajout date et année
mef_ajouter_lots() %>% # ajout des lots (effectif par espèce)
mef_ajouter_surf_calc() %>% # ajout surfaces prospectées pour calcul des densités
mef_ajouter_libelle() # ajout libellé du point de prélèvement
On exclut les protocoles ciblés “espèce” (ex : Vigitruite) pour ne conserver que les protocoles d’inventaire.
data <- data %>%
mef_ajouter_type_protocole() %>%
filter(pro_libelle %in% c("Pêche complète à un ou plusieurs passages",
"Pêche partielle par points (grand milieu)",
"Pêche par ambiances",
"Pêche partielle sur berge"))
captures <- data %>%
group_by(
sta_id,
pop_id,
ope_id,
ope_date,
annee,
esp_code_alternatif,
ope_surface_calculee,
pop_libelle
) %>%
summarise(effectif = sum(lop_effectif, na.rm = TRUE)) %>%
ungroup()
A ce stade on peut observer quelques lignes du tableau, tirées au hasard :
captures %>%
sample_n(10) %>%
knitr::kable(align = "c")
| sta_id | pop_id | ope_id | ope_date | annee | esp_code_alternatif | ope_surface_calculee | pop_libelle | effectif |
|---|---|---|---|---|---|---|---|---|
| 24483 | 82167 | 38374 | 2015-10-09 08:15:00 | 2015 | ABL | 937.50 | OGNON A BUSSIERES | 5 |
| 9351 | 35993 | 21404 | 2017-07-03 10:45:00 | 2017 | VAI | 605.00 | AUMANCE à COSNE-D’ALLIER | 74 |
| 1629 | 6902 | 9409 | 1999-10-20 14:00:00 | 1999 | LOF | 960.00 | L’ Orne à Gussainville | 7 |
| 10347 | 41135 | 7605 | 2007-06-14 13:30:00 | 2007 | CHE | 937.50 | Loing à Chantonnay | 15 |
| 2176 | 8888 | 11087 | 2003-09-25 09:00:00 | 2003 | VAI | 1162.00 | La Meuse à Sassey-sur-Meuse | 126 |
| 14740 | 54232 | 23547 | 2001-07-03 15:05:00 | 2001 | CHA | 677.04 | Ruisseau la Dejoune à Poussanges | 69 |
| 10244 | 40691 | 7769 | 2010-09-08 00:00:00 | 2010 | ANG | 1250.00 | Sevre nantaise à Vertou | 85 |
| 22421 | 98868 | 33103 | 2006-07-04 09:00:00 | 2006 | CHE | 370.00 | La Durance à Chateau-Arnoux | 64 |
| 12275 | 46918 | 86315 | 2021-10-07 08:15:00 | 2021 | CHA | 616.00 | Vilaine à La Croixille | 51 |
| 3749 | 15451 | 16364 | 1996-06-03 10:15:00 | 1996 | PER | 721.00 | La Clery à la Selle-sur-le-bied (la) | 4 |
Il existe des cas où un même point a été prospecté à plusieurs reprises la même année :
captures %>%
group_by(pop_id,
pop_libelle,
annee) %>%
summarise(n_ope = n_distinct(ope_id)) %>%
ungroup() %>%
filter(n_ope > 1) %>%
arrange(-n_ope) %>%
DT::datatable()
Pour éviter les biais d’échantillonnage dans les tendances, on filtre le tableau de données pour ne retenir qu’une des opérations dans ces cas. Retenons par exemple la dernière de l’année (pêche d’automne). Comme il y a même quelques cas où plusieurs opérations sont enregistrées le même jour, on n’en retient qu’une.
ope_sel <- captures %>%
group_by(pop_id,
annee) %>%
filter(ope_date == max(ope_date)) %>% # dernière des dates de l'année
slice(1) %>% # une seule des opérations si plusieurs à cette date
pull(ope_id)
captures <- captures %>%
filter(ope_id %in% ope_sel)
Il s’agit ici d’opérer les étapes qui permettront un affichage spatialisé des données élémentaires (les points de prélèvement) ou agrégées sur un territoire qui peut être administratif (par exemple un département) ou hydrographique (un bassin hydro). Les étapes seront :
On procède à un découpage avec trois niveaux de finesse. Comme notre étude est restreinte à la France continentale, l’ensemble des objets géographiques seront en Lambert 93 (EPSG:2154). Si l’on avait besoin de couvrir les outre-mers, on aurait choisi le WGS84 (EPSGG:4326). Le téléchargement est réalisé avec la fonction tgeo_wfs_sandre du package {tod}.
Les secteurs hydrographiques :
sh_geo <- tod::wfs_sandre(url_wfs = "https://services.sandre.eaufrance.fr/geo/sandre",
couche = "SecteurHydro") %>%
filter(!is.na(CdRegionHydro)) %>%
sf::st_transform(crs = 2154) # passage en Lambert 93
## Reading layer `SecteurHydro' from data source
## `https://services.sandre.eaufrance.fr/geo/sandre?service=wfs&version=2.0.0&request=GetCapabilities'
## using driver `WFS'
## Simple feature collection with 222 features and 6 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -63.15362 ymin: -21.38972 xmax: 55.83676 ymax: 51.08945
## Geodetic CRS: WGS 84
Les régions hydrographiques, en agrégeant les secteurs :
rh_geo <- sh_geo %>%
group_by(LbRegionHydro) %>%
summarise() %>%
ungroup()
Les districts hydrographiques, qui doivent être téléchargés car ils ne sont pas indiqués dans les objets précédents :
dh_geo <- tod::wfs_sandre(url_wfs = "https://services.sandre.eaufrance.fr/geo/topage?",
couche = "BassinHydrographique_FXX") %>%
sf::st_transform(crs = 2154)
## Reading layer `BassinHydrographique_FXX' from data source
## `https://services.sandre.eaufrance.fr/geo/topage?service=wfs&version=2.0.0&request=GetCapabilities'
## using driver `WFS'
## Simple feature collection with 7 features and 6 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -5.141592 ymin: 41.36462 xmax: 9.559987 ymax: 51.08945
## Geodetic CRS: WGS 84
Visualisation.
sh_geo %>%
ggplot() +
geom_sf()
On peut accéder au découpage administratif avec le package {COGiter}.
dep_geo <- COGiter::departements_metro_geo %>%
left_join(COGiter::departements) %>%
select(DEP,
NCCENR)
reg_geo <- COGiter::regions_metro_geo %>%
left_join(COGiter::regions) %>%
select(REG,
NCCENR)
Visualisation :
dep_geo %>%
ggplot() +
geom_sf()
Dans Aspe, l’entité spatiale de base, toujours identifiée, est le point de pêche. Tous sont géoréférencés, mais pas tous dans le même CRS. On va donc collecter les codes EPSG associés aux coordonnées de chacun des points, puis les reprojeter en Lambert 93.
pop <- point_prelevement %>%
rename(sta_id = pop_sta_id) %>% # nécessaire pour la jointure de mef_ajouter_libelle
mef_ajouter_libelle() %>%
left_join(y = station %>%
select(sta_id,
sta_code_sandre)) %>%
geo_ajouter_crs(var_id_crs = pop_typ_id) %>%
select(
pop_id,
pop_libelle,
pop_coordonnees_x,
pop_coordonnees_y,
typ_code_epsg,
sta_code_sandre
)
Conversion des coordonnées.
coords <- geo_convertir_coords_df(df = pop,
var_id = pop_id,
var_x = pop_coordonnees_x,
var_y = pop_coordonnees_y,
var_crs_initial = typ_code_epsg,
crs_sortie = 2154) %>%
rename(x_l93 = X,
y_l93 = Y)
Sélection d’une fenêtre de coordonnées couvrant la France continentale et transformation du dataframe des points en objet géographique de classe sf.
pop_geo <- pop %>%
left_join(coords) %>%
filter(x_l93 > 100000,
x_l93 < 1100000,
y_l93 > 6100000,
y_l93 < 7200000) %>%
sf::st_as_sf(coords = c("x_l93", "y_l93"),
crs = 2154)
Visualisation d’un échantillon des points.
mapview::mapview(sample_n(pop_geo, 100),
col.regions = "red") +
mapview::mapview(rh_geo,
legend = FALSE)
On complète le dataframe pop_geo en attribuant à chacun des points son appartenance à un secteur / région / district hydrographique, à un département et à une région.
pop_geo <- pop_geo %>%
geo_attribuer(poly_sf = dep_geo) %>%
geo_attribuer(poly_sf = reg_geo) %>%
geo_attribuer(poly_sf = sh_geo) %>%
geo_attribuer(poly_sf = rh_geo) %>%
geo_attribuer(poly_sf = dh_geo) %>%
select(
pop_id,
pop_libelle,
sta_code_sandre,
dept_id = DEP,
dept_libelle = NCCENR.x,
reg_id = REG,
reg_libelle = NCCENR.y,
sh_id = CdSecteurHydro,
sh_libelle = LbSecteurHydro,
rh_id = CdRegionHydro,
rh_libelle = LbRegionHydro.x,
dh_id = CdBH,
dh_libelle = LbBH
)
save(captures,
ope_sel,
file = "processed_data/captures.RData")
save(pop_geo,
file = "processed_data/pop_geo.RData")
save(dep_geo,
reg_geo,
sh_geo,
rh_geo,
dh_geo,
file = "processed_data/poly_geo_simp.RData")