Versement de données d’inventaires piscicoles OFB à la plateforme Biodiv’Bretagne

Introduction

Contexte

Le Système d’information de l’inventaire du patrimoine naturel, ou SINP, permet de rassembler, structurer et bancariser les données sur la biodiversité en France. La plupart des jeux de données collectés au niveau national y sont versés directement. En revanche, les observations collectées à des échelles infra-nationales sont collectées par des plateformes régionales totalement interopérables avec le SINP national. En Bretagne il s’agit de la plateforme régionale “Biodiv’Bretagne” administrée par l’Observatoire de l’Environnement en Bretagne (OEB).

La Direction Régionale Bretagne de l’Office Français de la Biodiversité a entrepris, depuis 2015, un projet visant à améliorer les connaissances sur la faune piscicole des cours d’eau de la région. Les équipes des 4 services départementaux ont effectué des pêches d’inventaire en ciblant les petits bassins côtiers, particulièrement méconnus. Les données collectées à cette occasion doivent être versées au SINP via la plateforme “Biodiv’Bretagne”.

Objet du tuto

Ce guide décrit comment mettre à jour du jeu de données “pêches atlas” de la plateforme “Biodiv’Bretagne”. Celui-ci est identifié dans son ensemble par un identifiant unique (UUID) dont la valeur est 1e727cde-8ce3-48c2-874f-b76a5eca9e5f, stable au fil des millésimes et commun à la plateforme régionale et au SINP. Il est accompagné de deux fiches de métadonnées (liens à rajouter).

Principe

Les données sont saisies et administrées dans un fichier shapefile. Elles doivent être mises en forme avant d’être intégrées à la plateforme régionale du SINP :

  • Passage depuis le format de table “large” (une colonne par espèce) au format “long”.
  • Reprojection pour obtenir les coordonnées en WGS84.
  • Sélection et renommage des colonnes.
  • Création d’une variable contenant un identifiant unique (UUID) par observation \(\Rightarrow\) donnée d’occurrence.
  • Ajout des identifiants du référentiel taxonomique de l’INPN Taxref.

Les étapes de la procédures de mise à jour sont les suivantes :

  • Lecture du nouveau fichier de données au format shapefile et mise en forme selon les étapes ci-dessus.
  • Lecture du précédent fichier de données qui a déjà été versé à la plateforme. Il est déjà en forme.
  • Fusion des deux en conservant les identifiants uniques des observations existantes et en les créant pour les nouvelles observations.
  • Exportation du tableau de données au format .csv compatible avec Biodiv’Bretagne.
  • Envoi au correspondant de la plateforme à l’OEB.

NB Le fichier .csv exporté doit impérativement être archivé car il sera indispensable pour la mise à jour suivante.

Mise en oeuvre

Chargement des packages

Le package of3b (pour OFB \(\Rightarrow\) Biodiv’Bretagne) a été développé pour faciliter le versement des données régionales de l’OFB vers la plateforme “Biodiv’Bretagne”.

Le package aspe permet d’opérer la conversion depuis les codes espèces de l’OFB (ex : TRF pour la truite commune) vers les identifiants du référentiel taxonomique de l’INPN Taxref.

tidyverse comprend plusieurs packages utiles pour la mise en forme des données (sélection, agrégation, nommage, etc.).

library(of3b)
library(aspe)
library(tidyverse)

Préparation du nouveau tableau de données

La fonction mef_donnees_sd_atlas() du package of3b prend en entrée le fichier shapefile de la base, le lit et le met en forme. Son argument passerelle_taxonomique correspond à un dataframe permettant la conversion entre les codes espèces à trois lettres et les identifiants Taxref des taxons. Par défaut elle considère que le système de coordonnées du fichier shapefile est Lambert 93 et le reprojette pour donner des colonnes de longitude et latitude en WGS84 qui est le standard de Biodiv’Bretagne. Ces colonnes sont respectivement nommées x_wgs84 et y_wgs84.

Désignation du fichier de données et activation de la passerelle taxonomique :

sd_file <- "../raw_data/peche_georect_sd_2015_2019_20210818.shp"
data("passerelle_taxo")

Mise en forme :

df_actuel <- mef_donnees_sd_atlas(fichier_shp_a_jour = sd_file,
                                  passerelle_taxonomique = passerelle_taxo)
## OGR data source with driver: ESRI Shapefile 
## Source: "C:\Users\pascal.irz\Documents\projets\observatoires\OEB\package_of3b\of3b_test\raw_data\peche_georect_sd_2015_2019_20210818.shp", layer: "peche_georect_sd_2015_2019_20210818"
## with 242 features
## It has 57 fields
## Integer64 fields read as strings:  ABH ABL ALA ANG ASP BAF BBG BOU BRB BRE BRO CAX CCX CHA CHE CTI EPI EPT FLE GAM GAR GOU GRE HOT IDE LOF LPM LPP LPR OBR PCH PER PES PSR ROT SAN SAT SDF SIL SPI TAC TAN TRF TRM VAI VAX qualif

On peut examiner le tableau df_actuel. Il contient les variables suivantes :

## tibble[,15] [11,062 x 15] (S3: tbl_df/tbl/data.frame)
##  $ unique_obs_id    : chr [1:11062] "8f294ac2-abbc-4b0f-b166-b00bedc2632f" "920af62a-3245-4a22-abff-68053f063bfe" "d5124236-d415-4967-a7e5-f84dd2666ffb" "49214f84-923c-4fd6-8c4f-30078b496cbe" ...
##  $ unique_dataset_id: chr [1:11062] "1e727cde-8ce3-48c2-874f-b76a5eca9e5f" "1e727cde-8ce3-48c2-874f-b76a5eca9e5f" "1e727cde-8ce3-48c2-874f-b76a5eca9e5f" "1e727cde-8ce3-48c2-874f-b76a5eca9e5f" ...
##  $ unique_ope_id    : chr [1:11062] "007ef271-ab06-422f-a0b1-4f7a1c7b5acb" "007ef271-ab06-422f-a0b1-4f7a1c7b5acb" "007ef271-ab06-422f-a0b1-4f7a1c7b5acb" "007ef271-ab06-422f-a0b1-4f7a1c7b5acb" ...
##  $ date_peche       : chr [1:11062] "2017/06/27" "2017/06/27" "2017/06/27" "2017/06/27" ...
##  $ date_saisie      : chr [1:11062] "2017/06/27" "2017/06/27" "2017/06/27" "2017/06/27" ...
##  $ date_modif       : chr [1:11062] NA NA NA NA ...
##  $ code_exutoire    : chr [1:11062] "exut_643" "exut_643" "exut_643" "exut_643" ...
##  $ code_station     : chr [1:11062] NA NA NA NA ...
##  $ localisation     : chr [1:11062] "BV DE LA DONAC" "BV DE LA DONAC" "BV DE LA DONAC" "BV DE LA DONAC" ...
##  $ x_wgs84          : num [1:11062] -1.82 -1.82 -1.82 -1.82 -1.82 ...
##  $ y_wgs84          : num [1:11062] 48.4 48.4 48.4 48.4 48.4 ...
##  $ ctxte_peche      : chr [1:11062] "Atlas" "Atlas" "Atlas" "Atlas" ...
##  $ code_espece      : chr [1:11062] "ABH" "ABL" "ALA" "ANG" ...
##  $ effectif         : int [1:11062] 0 0 0 1 0 0 0 0 0 0 ...
##  $ esp_code_taxref  : num [1:11062] 67286 67111 66967 66832 67131 ...

|| || || ||

Quelques-unes de ces colonnes, pour une dizaine de lignes tirées aléatoirement :

unique_obs_id date_peche localisation x_wgs84 y_wgs84 code_espece esp_code_taxref effectif
25db6863-e359-4bf0-b25d-10457fe73ab0 2017/09/22 R. de KERSIMON -4.223716 48.28501 OBR 67759 0
70aa7ab4-40b2-4577-8e00-f0a2f6457d03 2019/10/18 Pont Henvez -4.049789 47.88337 SAT 67765 0
111367f1-ba9b-4493-8a61-53d5fa837ba9 2015/01/01 GOVELLO -2.581195 47.61597 OBR 67759 0
0d0b55be-bad5-43b2-a74d-8c0eec8db858 2016/09/22 Rossulien -4.134119 47.93270 ABL 67111 0
ba223ff3-3259-472d-a05d-d40feaa273c0 2016/09/22 Corroac’h -4.181178 47.92473 SIL 67585 0
841deb82-6ce5-460f-82ae-3ffd46a3675e 2016/06/13 Le ruisseau de Saint Laurent à Pleubian saint Laurent (aval buse) -3.161035 48.84925 PSR 67415 0
e032b5a4-228c-459b-9666-3792c10e68c7 2019/10/18 Pont Henvez -4.049789 47.88337 ANG 66832 1
c11ad711-ffbb-49b1-8227-b03319b98d49 2016/06/24 Affluent RD ruisseau moulin Quintin -3.239028 48.39160 LPR 66330 0
8a822d82-734b-4f4f-9d84-f801764c802a 2016/07/01 Le Saint Guillaume -2.721546 48.18100 CAX 190332 0
9f93085d-e14b-45a3-8018-9b4a48496276 2016/07/01 Le Saint Guillaume -2.718073 48.18402 BAF 67143 0

Lecture du tableau du millésime précédent

Ce fichier de données est au format csv et est déjà mis en forme car c’est lui qui a servi à la précédente mise à jour du jeu de données sur Biodiv’Bretagne. Il est lu au moyen de la fonction read_csv2() du package readr. Les colonnes dont le nom commente par ‘date’ sont contraintes en caractères, alors que par défaut importées en format ‘Date’, pour assurer la cohérence avec les formats issus shapefile. La variable unique_obs_id est renommée unique_obs_id_old pour éviter la confusion avec le champ unique_obs_id du nouveau jeu de données.

df_ancien <- read_csv2(file = '../processed_data/sd_ancien.csv') %>%
  mutate_at(vars(starts_with("date")), as.character) 

Les noms des colonnes du tableau sont les suivants :

names(df_ancien)
##  [1] "unique_obs_id"     "unique_dataset_id" "unique_ope_id"    
##  [4] "date_peche"        "date_saisie"       "date_modif"       
##  [7] "code_exutoire"     "code_station"      "localisation"     
## [10] "x_wgs84"           "y_wgs84"           "ctxte_peche"      
## [13] "code_espece"       "effectif"          "esp_code_taxref"

Fusion des deux tables

Avant d’opérer la fusion, on s’assure que les noms des deux dataframes sont bien les mêmes.

identical(names(df_ancien), names(df_actuel))
## [1] TRUE

Puisque c’est bon, on peut les fusionner.

df_maj <- maj_donnees_sd_atlas(df_a_jour = df_actuel,
                               df_precedent = df_ancien)

Vérifications

Combien d’UUID du dataframe df_maj sont issus des UUID de df_ancien ?

old_obs_id <- df_ancien %>% 
  pull(unique_obs_id)

n_old_uuids <- df_maj %>%
  filter(unique_obs_id %in% old_obs_id) %>% 
  nrow()

n_old_uuids
## [1] 9600

Combien d’UUID du dataframe df_maj sont issus des UUID de df_actuel ?

new_obs_id <- df_actuel %>% 
  pull(unique_obs_id)

n_new_uuids <- df_maj %>%
  filter(unique_obs_id %in% new_obs_id) %>% 
  nrow()

n_new_uuids
## [1] 1462

Le total fait :

n_old_uuids + n_new_uuids
## [1] 11062

Le nombre de lignes de df_actuel est :

nrow(df_actuel)
## [1] 11062

\(\Rightarrow\) On retrouve bien chacune de nos observations.

Représentation cartographique :

df_maj %>% 
  select(localisation, x_wgs84, y_wgs84) %>% 
  distinct() %>% 
  sf::st_as_sf(coords = c("x_wgs84", "y_wgs84"), crs = 4326) %>% 
  mapview::mapview(legend = FALSE, color = "blue")

Exportation en CSV du fichier à jour

export_donnees_sd_atlas(df = df_maj)

RAPPEL : Le fichier .csv exporté doit impérativement être archivé car il sera indispensable pour la mise à jour suivante.

Pour vérifier, on liste les fichiers .csv dont le nom commence par les caractères “sd_” dans le répertoire de sortie.

list.files(path = "../processed_data",
           pattern = "^sd_.*csv$")
## [1] "sd_2021_09_08_10_34_02.csv" "sd_ancien.csv"

A ce stade, le fichier sd_aaaa_mm_jj_hh_mm_ss.csv, stocké dans le sous-répertoire “processed_data”, peut être transmis à l’OEB pour la mise à jour sur Biodiv’Bretagne.