procedures:recuperation_et_integration_de_donnees_depuis_le_gbif

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
procedures:recuperation_et_integration_de_donnees_depuis_le_gbif [2026/01/31 22:28] – [Configurer l'export GBIF] dmaillardprocedures:recuperation_et_integration_de_donnees_depuis_le_gbif [2026/01/31 22:49] (Version actuelle) dmaillard
Ligne 76: Ligne 76:
  
 ==== Serveur : Récupérer, préparer et stocker les données en base ==== ==== Serveur : Récupérer, préparer et stocker les données en base ====
 +
 +Une fois le fichier query.json configuré, la requête est transmise à l'API à l'aide de la commande suivante (installation du package jq pour une meilleure lisibilité des réponses) : 
 +
 +  sudo apt install jq
 +  curl —silent --user USER_GBIF:PASS_GBIF --header "Content-Type: application/json" --data @query.json https://api.gbif.org/v1/occurrence/download/request | tail -n 1 | tr -d '\r'
 +  
 +**Cette commande retournera la clé de l'export** en question, sous une forme telle que : 0015000-260108000000665
 +
 +On peut ensuite suivre l'état de la requête (elle peut prendre quelques dizaines de minutes) avec la commande suivante : 
 +
 +  curl -Ss https://api.gbif.org/v1/occurrence/download/<CLE> | jq -r '.status'
 +
 +Une fois le statut "SUCCEDED", se placer dans le répertoire /tmp et procéder au téléchargement des données : 
 +
 +  cd /tmp
 +  curl --location --remote-name https://api.gbif.org/v1/occurrence/download/request/<CLE>.zip & unzip <CLE>.zip
 +
 +
 +Une fois les données récupérées, les fichiers seront nettoyés des champs non utilisés pour optimiser les temps de traitement et l'espèce occupé sur le serveur. Deux fichiers en particulier seront exploités : occurrence.txt et multimedia.txt
 +
 +  cut -f 1,6,8,18,25,27,30,31,32,33,34,35,40,48,63,90,98,99,100,135,149,180,188,194,206 /tmp/occurrence.txt > data_gbif_import.txt
 +  cut -f 1,4 /tmp/multimedia.txt > multimedia_import.txt
 +  
 +Enfin, deux tables de destination sont créées dans la base de données (au premier usage) : 
 +
 +  CREATE SCHEMA pinv_gbif;
 +  
 +  CREATE TABLE pinv_gbif.tmp_gbif_data (
 +  gbif_id bigint primary key,
 +  modified timestamp,
 +  "references" varchar(255),
 +  basis_of_record varchar(255),
 +  recorde_by varchar(255),
 +  individual_count varchar(255),
 +  sex varchar(255),
 +  life_stage varchar(255),
 +  reproductive_condition varchar(255),
 +  caste varchar(255),
 +  behavior varchar(255),
 +  vitality varchar(255),
 +  occurrence_status varchar(255),
 +  occurrence_remarks text,
 +  event_date timestamp,
 +  verbatim_locality varchar(255),
 +  decimal_latitude numeric,
 +  decimal_longitude numeric,
 +  coordinate_uncertainty_meters varchar(255),
 +  identified_by varchar(255),
 +  scientific_name varchar(255),
 +  dataset_key uuid,
 +  issue text,
 +  taxonKey int,
 +  verbatim_scientific_name varchar(255)
 +  );
 +  
 +  CREATE TABLE pinv_gbif.cor_multimedia (
 +  gbif_id bigint,
 +  media_url text
 +  );
 +  
 +Puis alimentées par les données récupérées : 
 +
 +  sudo su postgres
 +  psql -d <DB_name>
 +  \copy pinv_gbif.tmp_gbif_data
 +  FROM PROGRAM 'tail -n +2 /tmp/data_gbif_import.txt'
 +  WITH (
 +  FORMAT text,
 +  DELIMITER E'\t'
 +  );
 +  
 +  \copy pinv_gbif.cor_multimedia
 +  FROM PROGRAM 'tail -n +2 /tmp/multimedia_import.txt'
 +  WITH (
 +  FORMAT text,
 +  DELIMITER E'\t'
 +  );
 +
  
 ==== Postgresql : Insérer ou actualiser les données en synthèse ==== ==== Postgresql : Insérer ou actualiser les données en synthèse ====
 +
 +À partir des données stockées dans les tables temporaires, l'objectif est de convertir ces données vers le format SINP, et d'alimenter la synthèse. Une fonction d'UPSERT est créée pour insérer les nouvelles données, et actualiser celles déjà disponibles. Dans les 2 cas, il est nécessaire que les jeux de données récupérées auprès du GBIF aient déjà un équivalent dans les métadonnées de l'instance GeoNature, avec le même uuid que celui du dataset dans la base de données du GBIF. 
 +
 +Il faut ensuite disposer d'une source "GBIF" dans gn_synthese.t_sources : 
 +
 +  INSERT INTO gn_synthese.t_sources()
 +  VALUES ();
 +
 +Pour permettre l'UPSERT, il est nécessaire d'avoir une contrainte d'unicité entre l'id_source correspondant au GBIF, et la colonne entity_source_pk_value, qui correspondra au gbif_id. 
 +
 +  ALTER TABLE gn_synthese.synthese ADD CONSTRAINT WHERE id_source=X;
 +
 +Une fois le ou les jeux de données préparés et bien identifiés (uuid), créer la fonction suivante : 
 +
 +  TODO
 +  
 +Puis déclencher l'UPSERT : 
 +
 +  SELECT pinv_gbif.upsert_gbif_data();
  
  • procedures/recuperation_et_integration_de_donnees_depuis_le_gbif.1769898495.txt.gz
  • Dernière modification : 2026/01/31 22:28
  • de dmaillard