Module BDC — Base de Données sur les statuts de Conservation
Présentation
Le module BDC Statuts interroge l’API TaxRef Statuts de l’INPN pour récupérer, pour un département donné, l’ensemble des statuts de protection et de conservation associés aux taxons présents dans les couches du projet.
Il produit trois tables dans biblizou.gpkg :
status_data— table brute, une ligne par statut par taxon ;status_data_joined— enrichissement destatus_dataavec le nom vernaculaire et le groupe taxonomique récupérés via l’API TaxRef ;une série de couches pivots
Statuts_Pivot_{groupe}— une par groupe de statuts (protection nationale, directive Habitats, liste rouge…), en format large.
Flux de traitement
Le module BDC est orchestré par BdStatutsProcessingThread (biblizou_worker.py),
un QThread PyQt5 qui enchaîne quatre étapes :
Étape |
Description |
Fonction appelée |
|---|---|---|
1 |
Requête API Statuts → |
|
2 |
Enrichissement via API TaxRef → |
|
3 |
Création des pivots par groupe de statuts |
|
4 |
Fin |
— |
Note
L’étape 2 est non bloquante : en cas d’échec (par exemple si l’API TaxRef est
inaccessible), le workflow continue avec status_data seule, et les pivots
sont construits à partir de cette table de repli.
Le thread émet les signaux progress(int, int, str), log(str),
finished(str) et error(str).
Paramètres transmis par l’interface :
Clé |
Valeur |
|---|---|
|
|
|
Code INSEE du département sélectionné (ex. |
|
Liste de dicts |
Étape 1 — Requête API Statuts (StatusApiToTable)
Fichier : modules/StatusApiToTable.py
Fonction principale : run(gpkg_path, code_insee_dept, layer_config, progress_callback, log_callback)
Déroulement :
Collecte des cd_nom via
collect_cdnom_from_config()(ApiUtils).Construction du ``locationId`` :
f"INSEED{code_insee_dept}"(ex."INSEED14"pour le Calvados).Requêtage par lots (
BATCH_SIZE = 50) :Pour chaque lot, appel
GETà l’endpoint/api/status/search/linesavec les paramètreslocationId,taxrefId(répété par taxon),page=1etsize=10000.Retry exponentiel : jusqu’à
MAX_RETRIES = 3tentatives avec pause de 2 s.Pause de 0,3 s entre chaque lot pour ménager l’API.
Aplatissement des réponses : pour chaque statut retourné dans
_embedded.status, extraction des champs suivants :
Champ extrait |
Source dans la réponse API |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Export GPKG vers la table
status_dataviaLayerUtils.save_to_gpkg().
Endpoint API :
Paramètre |
Valeur |
|---|---|
URL de base |
|
|
|
|
Répété pour chaque cd_nom du lot (max 50) |
|
|
Timeout |
30 secondes |
En-tête |
|
Étape 2 — Enrichissement TaxRef (StatusJoinTaxref)
Fichier : modules/StatusJoinTaxref.py
Fonction principale : run(gpkg_path, progress_callback, log_callback)
Déroulement :
Chargement de
status_datadepuis le GeoPackage.Extraction des ``cdnom`` distincts (nettoyage des éventuels suffixes décimaux hérités du stockage
QVariant.String).Requêtage API TaxRef — pour chaque
cdnomunique :GET https://taxref.mnhn.fr/api/taxa/{cdnom}(timeout 10 s,MAX_RETRIES = 2).Extraction de
vernacularName1(ounomVernen repli) → champnom_vern.Extraction de
classe(ouordre, ougroupeen repli) → champgroupe.Pause de 0,15 s entre chaque appel.
Construction de
status_data_joined: copie de toutes les lignes destatus_dataauxquelles sont ajoutées les deux colonnesnom_vernetgroupe.Export GPKG vers la table
status_data_joined(viaQgsVectorFileWriter.writeAsVectorFormatV3en modeCreateOrOverwriteLayer).
Note
Cette étape ne s’appuie pas sur la table data_taxref produite par le module
Module TaxRef — Consolidation taxonomique. Elle appelle directement l’API TaxRef pour éviter toute dépendance
à l’exécution préalable du module TaxRef.
Étape 3 — Pivots par groupe (StatusPivotByGroup)
Fichier : modules/StatusPivotByGroup.py
Fonction principale : run(gpkg_path, progress_callback, log_callback)
Déroulement :
Chargement de la source : tente d’abord
status_data_joined, se replie surstatus_datasi la première est absente ou invalide. La couche est ajoutée temporairement au projet QGIS (requis pour les couches virtuelles).Détection du champ vernaculaire (
_get_vernacular_field()) : recherche dans l’ordrenom_vern,vernacularName1,nomVern,taxref_vernacularName1,taxref_nomVern; se replie surscientificName.Collecte des groupes et types : itération sur toutes les entités pour construire le dictionnaire
{statusTypeGroup → {statusTypeName, ...}}.Génération d’une couche virtuelle par groupe :
Pour chaque
statusTypeGroup, une requête SQL de type pivot est construite :SELECT cdnom, scientificName AS nom_latin, "{nom_vern}" AS nom_vernaculaire, MAX(CASE WHEN statusTypeName = 'Protection nationale' THEN statusCode END) AS "Protection nationale", MAX(CASE WHEN statusTypeName = 'Liste rouge nationale' THEN statusCode END) AS "Liste rouge nationale", ... FROM "{layer_id}" WHERE statusTypeGroup = '{groupe}' GROUP BY cdnom, scientificName, "{nom_vern}" ORDER BY scientificName
La requête référence la table par ID interne QGIS (
layer.id()) pour éviter les conflits de nommage.Nommage et ajout au projet : la couche est nommée
Statuts_Pivot_{groupe_nettoyé}, où le nom du groupe est assaini par_sanitize_layer_name()(remplacement des caractères non alphanumériques par_). Une couche éponyme déjà présente dans le projet est supprimée avant l’ajout.
Note
Les couches pivot Statuts_Pivot_* sont des couches virtuelles QGIS (non persistées
dans le GeoPackage). Elles dépendent de la présence de status_data_joined ou
status_data dans le projet QGIS. Pour les rendre persistantes, l’utilisateur doit
les exporter manuellement via .
Tables et couches produites
Nom |
Support |
Contenu |
|---|---|---|
|
GPKG |
Table brute : une ligne par statut par taxon, 10 champs |
|
GPKG |
|
|
Couche virtuelle QGIS |
Une couche par |
Structure de status_data
Champ |
Type |
Description |
|---|---|---|
|
String |
Code TaxRef du taxon |
|
String |
Nom scientifique |
|
String |
Type de statut (ex. Protection nationale, Directive Oiseaux) |
|
String |
Groupe de statuts (ex. Protection, Liste rouge, Réglementation) |
|
String |
Code du statut (ex. PN, LC, EN, II) |
|
String |
Libellé du statut |
|
String |
Identifiant de localisation INPN (ex. |
|
String |
Nom du territoire (ex. Calvados) |
|
String |
Remarques (tronqué à 500 caractères) |
|
String |
Source bibliographique du statut (tronqué à 1 000 caractères) |
status_data_joined reprend tous ces champs et y ajoute :
Champ ajouté |
Type |
Description |
|---|---|---|
|
String |
Nom vernaculaire français (API TaxRef) |
|
String |
Groupe taxonomique — classe, ordre ou groupe selon disponibilité (API TaxRef) |
Référence des fichiers source
Fichier |
Rôle |
|---|---|
|
Collecte des |
|
Export des tables vers le GeoPackage |
|
Requêtage API Statuts, création de |
|
Enrichissement API TaxRef, création de |
|
Génération des couches virtuelles pivot par groupe de statuts |
|
|
|
Collecte des paramètres (département, couches sources) et lancement du thread |