Principe

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

Préparation des données tabulées

Chargement des packages

library(aspe)
library(tidyverse)
library(COGiter)
library(tod)

Chargement des tables

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.

Assemblage et filtrage des données

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 :

  • les dates de prospection (variable ope_date) et une variable annee, avec la fonction mef_ajouter_ope_date() pour permettre des agrégations annuelles
  • les données de captures au niveau des lots (sans les mesures individuelles) avec mef_ajouter_lots()
  • etc.
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"))

Agrégation pour simplifier le tableau

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

Sélection des opérations

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)

Préparation des données spatiales

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 :

  • Téléchargement des découpages territoriaux fins
  • Agrégation aux échelles supérieures
  • Spatialisation des points de prélèvement
  • Attribution à chaque point de son département, sa région, son secteur hydrographique
  • Simplification des découpages géographiques pour un affichage plus rapide

Chargement des découpages géographiques

Bassins hydrographiques

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

Entités administratives

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

Spatialisation des points

Principe

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.

Géoréférencement

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 du périmètre

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)

Assignation des points

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
  )

Sauvegarde des données préparées

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