Module FSD — Formulaires Standards de Données
Présentation
Le module FSD automatise le moissonnage des données issues des Formulaires Standards de Données (FSD) des zonages naturels intersectant l’aire d’étude. Il traite deux référentiels complémentaires :
Natura 2000 : sites SIC (Sites d’Importance Communautaire) et ZPS (Zones de Protection Spéciale), dont les FSD sont publiés au format XML par l’INPN à l’adresse
https://inpn.mnhn.fr/docs/natura2000/fsdxml/{zone_id}.xml.ZNIEFF : inventaires de type I et II (Zones Naturelles d’Intérêt Écologique, Faunistique et Floristique), dont les fiches XML sont publiées à l’adresse
https://inpn.mnhn.fr/docs/ZNIEFF/znieffxml/{zone_id}.xml.
Pour chaque référentiel, le module produit trois couches attributaires (sans géométrie) enregistrées
dans un GeoPackage biblizou.gpkg, puis deux tableaux croisés dynamiques (pivots) facilitant
la lecture bibliographique.
Note
Les étapes de téléchargement XML (NaturaDwlXml, ZnieffDwlXml) sont actuellement
désactivées dans le workflow automatique. L’utilisateur doit déposer manuellement les fichiers
XML dans le dossier de travail avant de lancer le traitement.
Flux de traitement
Le module FSD est orchestré par FsdProcessingThread (biblizou_worker.py),
un QThread PyQt5 qui enchaîne les étapes suivantes dans cet ordre :
Étape |
Description |
Classe / Fonction appelée |
|---|---|---|
1 |
Configuration des connexions WFS INPN |
|
2 |
Chargement des couches WFS dans le projet |
|
3 |
Extraction des descriptions ZNIEFF |
|
4 |
Extraction des espèces ZNIEFF |
|
5 |
Extraction des habitats déterminants ZNIEFF |
|
6 |
Extraction des descriptions Natura 2000 |
|
7 |
Extraction des espèces Natura 2000 |
|
8 |
Extraction des habitats Natura 2000 |
|
9 |
Tableau croisé espèces déterminantes ZNIEFF |
|
10 |
Tableau croisé habitats déterminants ZNIEFF |
|
11 |
Tableau croisé espèces Natura 2000 |
|
12 |
Tableau croisé habitats Natura 2000 |
|
Note
Les étapes de pivot (9 à 12) ne sont exécutées que si les étapes d’extraction correspondantes
ont produit des données (flags _has_znieff_esp, _has_znieff_hab, _has_natura_esp,
_has_natura_hab positionnés par le thread).
Le thread émet trois signaux PyQt5 :
progress(int, int, str)— numéro d’étape, total, libellélog(str)— messages textuelsfinished(str)/error(str)— résultat final
Architecture des classes de base
Le module FSD repose sur deux classes abstraites mutualisées définies dans modules/base/.
DwlXml (base/DwlXml.py)
Classe abstraite gérant le téléchargement des fichiers XML depuis l’INPN. Elle s’appuie sur les couches WFS Patrinat déjà chargées dans le projet pour déterminer, par intersection spatiale avec l’aire d’étude, les identifiants de zones à télécharger.
Méthodes abstraites (à implémenter dans les classes enfants) :
Méthode |
Rôle |
|---|---|
|
Noms des deux couches WFS Patrinat à rechercher dans le projet QGIS |
|
Construction de l’URL de téléchargement pour un identifiant de zone |
Méthodes concrètes mutualisées :
Méthode |
Rôle |
|---|---|
|
Point d’entrée : orchestre la recherche des couches, la sélection spatiale et le téléchargement |
|
Recherche les deux couches Patrinat par nom dans le projet QGIS |
|
Sélection spatiale par intersection avec l’aire d’étude ; stockage des |
|
Téléchargement HTTP avec retry exponentiel (1, 2, 4 secondes) |
|
Lance la sélection spatiale sur les deux couches puis télécharge tous les XML |
Sélection spatiale : la géométrie de la couche de référence (aire d’étude) est reprojetée
dans le SCR de la couche WFS, puis une requête par boîte englobante filtre les candidats avant
une vérification exacte d’intersection (intersects). Seuls les id_mnhn des entités
intersectantes sont conservés.
XmlToLayer (base/XmlToLayer.py)
Classe abstraite gérant le parsing des fichiers XML et la création des couches QGIS. Elle suit le patron Template Method : le squelette du traitement est fixé dans les méthodes concrètes, les classes enfants n’implémentent que les quatre méthodes abstraites.
Méthodes abstraites :
Méthode |
Rôle |
|---|---|
|
Nom de la couche QGIS et du layer dans le GeoPackage |
|
Fonction lambda filtrant les fichiers XML du dossier par nom |
|
Parsing d’un fichier XML ; retourne une liste de dictionnaires |
|
Création de la couche mémoire QGIS (sans géométrie) avec les champs appropriés |
Méthodes concrètes mutualisées :
Méthode |
Rôle |
|---|---|
|
Point d’entrée : parcourt le dossier, crée la couche, sauvegarde et charge depuis le GPKG |
|
Liste les fichiers XML éligibles et appelle |
|
Délègue à |
|
Charge la couche depuis le GPKG et la substitue dans le projet via |
Valeurs de retour de run_with_path() :
True— données trouvées, couche créée et chargéeNone— aucune donnée dans le dossier (situation normale, sans erreur)False— erreur technique
PivotLayer (base/PivotLayer.py)
Classe abstraite gérant la création des tableaux croisés dynamiques (format large)
à partir des couches attributaires produites par XmlToLayer.
Chaque colonne représente un site ; chaque ligne une espèce ou un habitat.
La requête SQL est exécutée via une couche virtuelle QGIS (provider virtual).
Méthodes abstraites :
Méthode |
Rôle |
|---|---|
|
Nom de la couche source à lire dans le projet QGIS |
|
Nom de la couche pivot à créer |
|
Paire |
|
Requête SQL |
Méthodes concrètes mutualisées :
Méthode |
Rôle |
|---|---|
|
Orchestre le chargement de la source, la génération SQL, la création du pivot et l’export GPKG |
|
Extrait les paires |
|
Crée et substitue la couche virtuelle dans le projet |
|
Sauvegarde persistante via |
|
Génère l’alias de colonne au format |
Nommage des colonnes : les accents sont supprimés (normalisation NFD) et le nom est mis
en majuscules. Exemple : FR2500093 - BAIE DU MONT-SAINT-MICHEL.
LayerUtils (base/LayerUtils.py)
Classe utilitaire statique centralisant toutes les opérations sur les couches QGIS.
Méthode statique |
Rôle |
|---|---|
|
Retourne la première couche du projet correspondant au nom exact |
|
Vérifie qu’une couche existe, est valide et contient des entités |
|
Supprime atomiquement l’ancienne version d’une couche et ajoute la nouvelle |
|
Charge un layer spécifique depuis un GeoPackage |
|
Crée physiquement un GeoPackage vide s’il n’existe pas |
|
Exporte n’importe quelle couche (y compris virtuelle) dans un GeoPackage via |
Volet Natura 2000
Téléchargement — NaturaDwlXml
NaturaDwlXml hérite de DwlXml et spécialise le téléchargement pour les sites Natura 2000.
Méthode implémentée |
Valeur retournée |
|---|---|
|
|
|
|
Filtre des fichiers XML lors du parsing aval : fichiers dont le nom commence par FR,
se termine par .xml et comporte exactement 13 caractères (ex : FR2500093.xml).
Extraction des descriptions — NaturaXmlToLayerDesc
Parse les balises SITECODE, SITE_NAME et COMMENTAIRE/COMMENTAIRE_ROW
de chaque fichier XML Natura 2000.
Couche produite : Natura_2000_Descriptions
Champ |
Type |
Description |
|---|---|---|
|
String |
Code officiel du site Natura 2000 (ex : |
|
String |
Nom du site |
|
String |
Valeur écologique et intérêt du site (balise |
|
String |
Vulnérabilités et menaces identifiées (balise |
|
String |
Popup HTML stylisée pour l’affichage QGIS (couleur |
setDisplayExpression("SITE_NAME") est appliqué après chargement depuis le GeoPackage.
Extraction des habitats — NaturaXmlToLayerHab
Parse les balises HABIT1_ROW de chaque fichier XML Natura 2000.
Couche produite : Natura_2000_Habitats
Champ |
Type |
Description |
|---|---|---|
|
String |
Code du site Natura 2000 |
|
String |
Nom du site |
|
String |
Code habitat directive Habitats (ex : |
|
String |
Libellé français de l’habitat directive |
Seules les lignes comportant au moins un code CD_UE ou un libellé LB_HABDH_FR sont retenues.
Extraction des espèces — NaturaXmlToLayerEsp
Parse les balises BIOTOP/SPECIES/SPECIES_ROW de chaque fichier XML.
Cette classe fonctionne en mode hors-ligne (sans appel à l’API TaxRef).
Couche produite : Natura_2000_Especes
La couche comporte 43 champs correspondant à l’intégralité des balises SPECIES_ROW,
dont les principaux :
Champ |
Type |
Description |
|---|---|---|
|
String |
Identifiants du site |
|
String |
Code TaxRef de l’espèce |
|
String |
Nom scientifique |
|
String |
Groupe taxonomique (Oiseaux, Mammifères, etc.) |
|
String |
Inscription à l’annexe II de la directive Habitats |
|
String |
Évaluation de la population sur le site |
|
String |
État de conservation |
|
String |
Tendance d’évolution de la population |
|
String |
Identifiant UUID de l’espèce dans la base INPN |
Tableau croisé des habitats — NaturaPivotHabitats
Transforme Natura_2000_Habitats (format long) en tableau large avec un site par colonne.
Couche produite : Natura_2000_Habitats_Pivot
Colonnes fixes :
CD_UE,LB_HABDH_FRColonnes dynamiques : une par site, nommée
[SITECODE] - NOM_SITEValeur :
1si l’habitat est présent sur le site,NULLsinonTri : par
CD_UEcroissant
Requête SQL générée (exemple simplifié) :
SELECT CD_UE, LB_HABDH_FR,
MAX(CASE WHEN SITECODE = 'FR2500093' THEN 1 END) AS "FR2500093 - BAIE DU MONT-SAINT-MICHEL",
MAX(CASE WHEN SITECODE = 'FR2500094' THEN 1 END) AS "FR2500094 - DUNES DE ..."
FROM "Natura_2000_Habitats"
GROUP BY CD_UE, LB_HABDH_FR
ORDER BY CD_UE
Tableau croisé des espèces — NaturaPivotEspeces
Transforme Natura_2000_Especes en tableau large.
Couche produite : Natura_2000_Especes_Pivot
Colonnes fixes :
GROUPE(alias deTAXGROUP),CD_NOM,NOMColonnes dynamiques : une par site, nommée
[SITECODE] - NOM_SITEValeur :
1si l’espèce est présente,NULLsinonTri : par groupe puis par nom croissant
Note
La requête SQL référence la couche par son ID interne QGIS (layer.id()) plutôt
que par son nom, afin d’éviter les conflits lorsque le nom contient des espaces ou des
caractères spéciaux.
Volet ZNIEFF
Téléchargement — ZnieffDwlXml
ZnieffDwlXml hérite de DwlXml et spécialise le téléchargement pour les inventaires ZNIEFF.
Méthode implémentée |
Valeur retournée |
|---|---|
|
|
|
|
Filtre des fichiers XML lors du parsing aval : fichiers se terminant par .xml,
de 13 caractères, ne commençant pas par FR (convention ZNIEFF).
Extraction des descriptions — ZnieffXmlToLayerDesc
Parse les balises de description de chaque fichier XML ZNIEFF. Les fichiers peuvent
contenir des balises <p> imbriquées dans les champs texte longs (TX_GENE, TX_GEO,
TX_ACTH…) ; la méthode _rich_text() gère cette ambivalence.
Couche produite : Znieff_Descriptions
La couche comporte 39 champs, dont les principaux :
Champ |
Type |
Description |
|---|---|---|
|
String |
Numéro national ZNIEFF |
|
String |
Nom de la ZNIEFF |
|
String |
Type de zone (1 ou 2) |
|
Double |
Superficie en hectares |
|
Double |
Altitudes minimale et maximale |
|
String |
Texte général de description (balise |
|
String |
Activités humaines |
|
String |
Mesures de protection |
|
String |
Intérêt du site |
|
String |
Dates de création et de dernière modification |
|
String |
Identifiants de la ZNIEFF parente (balise |
|
String |
Popup HTML stylisée pour l’affichage QGIS |
setDisplayExpression appliqué : coalesce(LB_ZN, '') || ' (' || coalesce(NM_SFFZN, '') || ')'
Note
Les champs numériques (SU_ZN, ALT_MINI, ALT_MAXI, PROF_MINI, PROF_MAXI,
X_L2E, Y_L2E) font l’objet d’une conversion explicite _to_double() lors de la
création de la couche, avec nettoyage des virgules décimales et des caractères parasites.
Extraction des espèces — ZnieffXmlToLayerEsp
Parse les balises ESPECE_PROJET_ROW et ESPECE_ROW des fichiers XML ZNIEFF.
Couche produite : Znieff_Especes
Champ |
Type |
Description |
|---|---|---|
|
String |
Numéro ZNIEFF (issu de la ligne espèce ou de la racine XML) |
|
String |
Nom de la ZNIEFF |
|
String |
Groupe taxonomique |
|
String |
Code TaxRef |
|
String |
Nom scientifique complet |
|
String |
Nom vernaculaire |
|
String |
Flag espèce déterminante ( |
|
String |
Flag de confidentialité |
|
String |
Origine de la donnée |
Extraction des habitats — ZnieffXmlToLayerHab
Parse les balises TYPO_INFO_ROW des fichiers XML ZNIEFF.
Seuls les habitats déterminants (FG_TYPO = 'D') sont retenus.
Couche produite : Znieff_Habitats
Champ |
Type |
Description |
|---|---|---|
|
String |
Numéro ZNIEFF |
|
String |
Nom de la ZNIEFF |
|
String |
Code de l’habitat (référentiel CORINE Biotopes ou autre) |
|
String |
Libellé de l’habitat |
Tableau croisé des habitats — ZnieffPivotHabitats
Transforme Znieff_Habitats en tableau large.
Couche produite : Znieff_Hab_Pivot
Colonnes fixes :
LB_CODE,LB_HABColonnes dynamiques : une par ZNIEFF, nommée
[NM_SFFZN] - NOM_ZNIEFFValeur :
1si l’habitat est présent,NULLsinonTri : par
LB_CODEcroissant
Tableau croisé des espèces déterminantes — ZnieffPivotEspeces
Transforme Znieff_Especes en tableau large, filtré sur les espèces déterminantes
(fg_esp = 'D').
Couche produite : Znieff_EspDet_Pivot
Colonnes fixes :
GROUPE,cd_nom,nom_complet,nom_vernColonnes dynamiques : une par ZNIEFF avec des espèces déterminantes, nommée
[NM_SFFZN] - NOM_ZNIEFFValeur :
1si l’espèce est déterminante sur cette ZNIEFF,NULLsinonTri : par groupe puis par
nom_completcroissant
Note
La méthode get_sites() est surchargée dans cette classe afin de ne collecter
que les sites ayant au moins une espèce déterminante (fg_esp = 'D'), réduisant ainsi
le nombre de colonnes dans le pivot.
Comme NaturaPivotEspeces, la requête SQL référence la couche source par son ID interne
QGIS pour éviter les conflits de nommage.
Connexions WFS — WfsManager
WfsManager configure dans le registre QGIS (QSettings) la connexion au service WFS
de l’IGN/INPN (data.geopf.fr) et charge dans le projet les quatre couches de zonage
utilisées comme référence spatiale par DwlXml.
Nom de couche dans le projet |
Typename WFS |
|---|---|
|
|
|
|
|
|
|
|
Toutes les couches sont chargées en EPSG:3857. Une couche déjà présente dans le projet
n’est pas rechargée (vérification par mapLayersByName).
Couches et GeoPackage produits
Toutes les couches du module FSD sont des couches attributaires sans géométrie
(provider "None" en mémoire, puis exportées en GPKG via QgsVectorFileWriter).
Nom de la couche / layer GPKG |
Référentiel |
Contenu |
|---|---|---|
|
Natura 2000 |
Descriptions qualité/vulnérabilité par site |
|
Natura 2000 |
Habitats directive (format long) |
|
Natura 2000 |
Espèces directive (format long, 43 champs) |
|
Natura 2000 |
Tableau croisé habitats × sites |
|
Natura 2000 |
Tableau croisé espèces × sites |
|
ZNIEFF |
Descriptions des ZNIEFF (39 champs) |
|
ZNIEFF |
Espèces (toutes, format long) |
|
ZNIEFF |
Habitats déterminants (format long) |
|
ZNIEFF |
Tableau croisé espèces déterminantes × ZNIEFF |
|
ZNIEFF |
Tableau croisé habitats déterminants × ZNIEFF |
Toutes ces couches sont enregistrées dans le fichier biblizou.gpkg situé dans le dossier
de travail défini par l’utilisateur.
Référence des fichiers source
Fichier |
Groupe |
Rôle |
|---|---|---|
|
base |
Classe abstraite téléchargement XML |
|
base |
Classe abstraite parsing XML → couche QGIS |
|
base |
Classe abstraite tableau croisé dynamique |
|
base |
Utilitaires couches QGIS et GeoPackage |
|
FSD |
Connexions et chargement WFS INPN |
|
FSD |
Téléchargement XML Natura 2000 |
|
FSD |
Extraction descriptions Natura 2000 |
|
FSD |
Extraction habitats Natura 2000 |
|
FSD |
Extraction espèces Natura 2000 |
|
FSD |
Pivot habitats Natura 2000 |
|
FSD |
Pivot espèces Natura 2000 |
|
FSD |
Téléchargement XML ZNIEFF |
|
FSD |
Extraction descriptions ZNIEFF |
|
FSD |
Extraction habitats déterminants ZNIEFF |
|
FSD |
Extraction espèces ZNIEFF |
|
FSD |
Pivot habitats déterminants ZNIEFF |
|
FSD |
Pivot espèces déterminantes ZNIEFF |
|
— |
Orchestration des threads de traitement |