Méthodologie scientifique
Cette page documente la transformation des données brutes en indicateurs et pages publiées. Pour la provenance (quelle source, quelle licence, quel checksum, quand téléchargé), voir la page Sources & citations.
Dernière mise à jour : 2026-04-24. Les volumes indiqués correspondent à cet instantané. Les formules et seuils restent stables tant que l'ICO v2.1 et le filtrage GBIF ne sont pas révisés scientifiquement.
1. Volumes de données
Trois couches successives : sources externes ingérées telles quelles, tables intermédiaires dérivées par jointure ou agrégation, et précomputés de présentation (matviews, caches) dont les URLs publiées dépendent.
1.1 Couche source (brute)
| Table | Rows | Source primaire | Rôle |
|---|---|---|---|
| observations | 174 110 640 | GBIF (occurrence download) | Occurrences géolocalisées + date, France métropole + DOM |
| species | 108 568 | TAXREF v18 (INPN/MNHN) | Référentiel taxonomique, noms, rangs, statuts |
| relationships | 1 018 382 | GloBI (validated=true) | Relations écologiques interspécifiques |
| communes | 34 879 | IGN Admin Express + INSEE | Géométries communes + population |
| habitat_ref | 22 707 | HABREF v7 (INPN) | 91 typologies habitats (EUNIS, CORINE, …) |
| species_habitats | 63 162 | HABREF liens espèce × habitat | Habitats préférentiels par espèce |
| znieff_zones | 20 095 | PatriNat 2025-11-28 | ZNIEFF I (17 718) + II (2 377) continentales + marines |
| natura2000_sites | 1 762 | PatriNat 2024-12 | ZSC (1 355) + ZPS (407) — Directives Habitats & Oiseaux |
| natura2000_species | 24 892 | FSD (Formulaires Standard Données) | Espèces d'intérêt communautaire par site |
| protected_areas | 11 425 | PatriNat 2026-01 Espaces Protégés | 57 désignations INPN (RNN, RNR, APB, PN, PNR, Ramsar, CEN, CDL, …) |
| protected_area_species | 6 936 | Liens espèces EP | Espèces motivation / présentes dans chaque EP |
| species.is_eee_ue_regulated | ~80 | DwC-A INBO / GBIF CC0 | Flag booléen + date d'entrée en vigueur, Règlement UE 1143/2014 « EEE préoccupantes pour l'Union » |
| species_traits + species_traits_best (matview) | > 500 k valeurs | Agrégation multi-sources | 40+ traits : morpho (masse/longueur/hauteur/envergure), cycle de vie (longévité), reproduction (gestation/couvée/maturité), écologie (régime/activité/habitat/locomotion/migratoire), divers (chromosomes/vitesse/métabolisme). Sources priorisées AnAge > FishBase (poissons, via EOL) > TRY (plantes, via EOL) > BirdLife (oiseaux, via EOL) > EOL Trait Bank (agrégateur 50+ bases) > Wikidata. Traçabilité par valeur : source_url direct,confidence, registry_id. |
1.2 Couche intermédiaire (dérivée)
| Table / Matview | Rows | Dérivée de | Logique d'agrégation |
|---|---|---|---|
| commune_species | 19 123 920 | observations × communes | Agrégat matriciel nb obs par paire (commune, espèce). Jointure spatiale ST_Intersects puis COUNT(*) GROUP BY commune_insee, species_id. |
| species_phenology | 330 947 | observations.date | Agrégat (espèce, mois). Filtrage des dates par défaut GBIF (01/01 + 31/12). Ajout de detection_rate = n_obs_espèce_mois / total_obs_mois pour neutraliser l'effort saisonnier. Cf. §4. |
| commune_indicators | 34 879 | 6 axes dérivés de commune_species | ICO v1 + v2.1 composites. Richesse Shannon, patrimoniale, raréfaction, typicité, connectivité, stabilité — chacun en percentile rank. Cf. §3. |
| commune_protected_areas | 34 879 | Overlap communes.geom × 8 catégories zones protégées | ST_Intersection(ST_Union(zones_categorie), commune.geom) / ST_Area(commune). ST_Subdivide(256) pour accélérer ×20 les polygones massifs. Cf. §5. |
| ico_category_mapping | 57 | Table lookup éditable | 57 désignations INPN → 4 catégories ICO EP (foncier, parcs_adhesion, ramsar_biosphere, reserves_strictes). Modifiable sans migration ; --recompose-only rejoue la composition en 30 s. |
| species_dist_heatmap | 12 317 626 | Précalcul densité observations | Cache heatmap par (species, lat_bin, lng_bin). Évite 100 ms × 100k species au rendu. |
| commune_heatmap_cache | 3 577 291 | Cache choropleth multi-échelles | Pré-bins par niveau de zoom. Clustering au-dessus de 34 879 communes affichées simultanément. |
1.3 Volume de pages publiées
L'agrégation finale produit ~200 000 URLs indexables dans le sitemap : 108 k fiches espèces, 34 k fiches communes, 20 k pages ZNIEFF, 1.8 k pages Natura 2000, 11.4 k pages Espaces Protégés, plus les pages taxonomiques (famille / ordre / classe ≥ 5 espèces), les pages habitat, les régions et départements. Chaque page est factuelle et dérivée des données — aucune génération de contenu par LLM sur du texte naturel, uniquement des templates déterministes quand la description verbatim de la source est absente.
2. Pipeline d'agrégation
Schéma des dépendances. Flèche = « alimente ». Toute modification d'une table amont requiert de rejouer les compute scripts avals (cf. annexe OPERATIONS.md du dépôt).
┌─────────────────┐ ┌──────────────────┐ ┌────────────────────┐
│ TAXREF v18 │ │ GBIF France │ │ PatriNat INPN │
│ 108 k species │ │ 174 M occurr. │ │ 33 k zones prot. │
└────────┬────────┘ └─────────┬────────┘ └────────┬───────────┘
│ │ │
▼ ▼ ▼
┌────────┐ ┌─────────────┐ ┌─────────────┐
│species │◀────────▶│observations │ │znieff_zones │
│ │ cd_nom │ 174 110 640│ │natura2000_..│
└────┬───┘ └──────┬──────┘ │protected_.. │
│ │ └──────┬──────┘
│ ST_Intersects(geom) │
│ ▼ │
│ ┌──────────────────────┐ │
│ │ commune_species │ │
│ │ 19 123 920 │ │
│ └──────────┬───────────┘ │
│ │ │
▼ ▼ ▼
┌──────────────┐ ┌────────────────┐ ┌──────────────────────┐
│species_phen. │ │ commune_indic. │ │commune_protected_a. │
│ 330 947 │ │ 34 879 (v1) │ │ 34 879 × 8 cat. │
│ filtré GBIF │ └────────┬───────┘ └──────────┬───────────┘
│ + detec_rate │ │ │
└──────────────┘ │ 0.5 + 0.5 │
└───────────┬───────────┘
▼
ICO v2.1 (patrim_score_v2)
PERCENT_RANK pré-compositionChaque script de calcul est idempotent et loggé : volume traité, throughput, ETA, phases numérotées. Les imports passent tous par fetch-with-mirrorsavec checksum SHA-256 enregistré dans data_sources_registry(traçabilité complète, cf. page Sources).
3. ICO v2.1 — Indice Commune Ontologia
3.1 Contexte
L'ICO v1 agrégeait 6 dimensions de biodiversité par percentile rankcommunal (Jenks & Caspall 1971[7], approche EBV / GEO BON). L'axe patrimonial v1 (fraction d'espèces déterminantes ZNIEFF × UICN sévérité) saturait car il reflétait l'effort d'inventaire plus que la valeur biologique intrinsèque : les communes sur-prospectées cumulaient des cochages d'espèces rares, les communes sous-prospectées restaient invisibles (Isaac & Pocock 2015[8]). Résultat : stddev < 8, discrimination effondrée.
L'ICO v2 ajoute un bonus spatial structurel indépendant de l'effort : l'overlap géométrique entre la commune et 8 catégories de zones protégées, pondéré par l'intensité biologique/réglementaire de chaque catégorie (Dudley 2008[1], Watson 2014[2]).
3.2 Les 6 dimensions de l'ICO v1
| Dimension | Métrique | Référence |
|---|---|---|
| Richesse | Indice de Shannon H' sur commune_species.observation_count | Shannon 1948 |
| Patrimoniale | Fraction espèces déterminantes ZNIEFF × sévérité UICN (Margules & Pressey 2000[14]) | Horellou 2013[3], Touroult 2022[4] |
| Raréfaction | Courbe aire-espèces (SAR) déviance vs attendu local | Fisher-Corbet-Williams 1943 |
| Typicité | Cohérence du cortège vs communes voisines (Jaccard) | Jaccard 1912 |
| Connectivité | Densité du graphe GloBI restreint aux espèces locales | Dunne 2002 |
| Stabilité | Tendance temporelle observations/an (pente sur 10 ans) | Boakes 2010[9] (caveat biais) |
3.3 Bonus spatial v2 — formule verbatim
Pondérations validées par revue scientifique indépendante (2026-04-24), inspirées de Watson 2014[2] (IUCN I-IV primés) et Horellou 2013[3] (ZNIEFF I comme seul référentiel avec critères biologiques explicites) :
patrim_bonus =
0.25 × overlap_znieff_t1_continental -- signal biologique fort (Horellou 2013)
+ 0.05 × overlap_znieff_marine -- sémantique marine distincte
+ 0.25 × overlap_natura2000 -- ZSC ∪ ZPS par UNION géométrique (Directives UE)
+ 0.20 × overlap_reserves_strictes -- RNN + APB + PN cœur (IUCN I-IV, Watson 2014)
+ 0.10 × overlap_ramsar_biosphere -- Ramsar + MAB UNESCO + OSPAR + Barcelone
+ 0.05 × overlap_znieff_t2 -- grands ensembles, signal diffus
+ 0.07 × overlap_parcs_adhesion -- PNR + PN aires adhésion + GSF (IUCN V)
+ 0.03 × overlap_foncier -- CEN + Conservatoire du LittoralChaque overlap_* ∈ [0, 1] = fraction de la surface communale recouverte par l'ST_Union des zones de cette catégorie. Les 8 catégories sont géométriquement disjointes dans l'esprit mais peuvent se chevaucher en pratique (une ZNIEFF peut aussi être Natura 2000). On n'anti-double-compte pas : chaque catégorie est un axe indépendant du signal réglementaire-biologique.
3.4 Composition finale — Option C (percentile rank pré-composition)
Le bonus brut patrim_bonus a une distribution à queue longue (communes Polynésie / Guyane à 99 % de couverture, vs majorité métropole entre 10-30 %). Une combinaison linéaire directe (0.5 × v1 + 0.5 × bonus × 100) donne trop de poids aux extrêmes et corrélation anormalement forte (corr = 0.95 vs v1, donc v2 apporte peu). Recommandation scientifique validée : percentile rank pré-composition (Jenks & Caspall 1971[7], méthode EBV / GEO BON) :
-- Option C validée
patrim_bonus_pct = PERCENT_RANK(patrim_bonus) OVER () × 100
patrimonial_score_v2 = 0.5 × patrimonial_percentile_v1
+ 0.5 × patrim_bonus_pct3.5 Tests de validation (tous passés)
| Test | Cible | Mesuré | Référence |
|---|---|---|---|
| stddev(v2) | > 18 (vs v1 < 8) | 24.51 | Discrimination effective |
| corr(v1, v2) | ∈ [0.65, 0.85] | 0.808 | v2 ajoute du signal sans trahir v1 |
| Hotspots réf. | ≥ 8 / 14 dans top 100 | 8 / 14 | Camargue, Fontainebleau, Saorge, … |
| Coverage médiane | ~27 % (UE Maiorano) | 24.8 % | Maiorano 2015[5] |
Top 10 post-ICO v2.1 (échantillon) : Mantet, Saintes-Maries-de-la-Mer, Gruissan, Gavarnie-Gèdre, Saorge, Fontainebleau, Le Grau-du-Roi, Aigues-Mortes, Arles — cohérent avec les hotspots de biodiversité établis de la littérature.
3.6 Corrections techniques documentées
- Mapping PN (Parc National) : INPN utilise le même
designation_abbr='pn'pour la zone cœur (IUCN II, protection stricte →reserves_strictes) et l'aire d'adhésion (IUCN V, gestion concertée →parcs_adhesion). Le script distingue viadesignation_label ILIKE '%adhésion%'pour router correctement les 11 aires AOA. - Antiméridien (Polynésie) : les géométries polynésiennes traversent la ligne de changement de date.
ST_Area::geographyéchoue aveclwgeom_area_spher returned area < 0.0. Filtre appliqué avantST_Union:(ST_XMax(geom) - ST_XMin(geom)) < 350. - Optimisation spatiale :
ST_Subdivide(256)sur les polygones > 256 vertices accélère ×20 lesST_Intersectionsur les ZNIEFF II continentales (> 10 000 km²), cf. PostGIS docs. - Invariance des invalides :
ST_MakeValidappliqué en amont sur toutes les géométries source (zones protégées issues de shapefiles parfois auto-intersectants).
4. Phénologie — filtrage des biais GBIF
4.1 Source et granularité
La matview species_phenology agrège les 174 M observations GBIF par (species_id, month). 330 947 lignes résultent de la combinaison 108 k espèces × 1-12 mois présents (les espèces avec 0 observation datée sont omises). Alimente le calendrier 12 mois sur chaque fiche espèce.
4.2 Biais détectés — analyse data-driven
Requête ratio vs fenêtre glissante ±5 jours (Robertson 2010[10], Zizka 2019[11] / CoordinateCleaner) pour distinguer les pics pathologiques (conventions d'encodage) des pics légitimes (effort saisonnier naturel). Seuil de filtrage adopté : ratio ≥ 5×.
| Date | Obs | Voisins ±5j moy. | Ratio | Verdict |
|---|---|---|---|---|
| 1er janvier | 20 504 708 | 158 000 | 130× | Pathologique — filtré |
| 31 décembre | 695 302 | 126 805 | 5.48× | Pathologique — filtré |
| 1er avril | 944 972 | 399 053 | 2.37× | Borderline — conservé |
| 1er juin, 1er juillet | 1.1-1.2 M | ~750 000 | 1.49-1.52× | Légitime — effort printanier |
| 15 juin | 792 338 | ~900 000 | < 1× | Légitime |
Les deux dates filtrées correspondent à deux conventions GBIF d'encodage de dates imprécises (année seule connue, collections historiques, atlas rétrospectifs) : YYYY-01-01 dominante et YYYY-12-31 minoritaire (Maldonado 2015[12]). Volume retiré : 21.2 M / 173.2 M = 12.2 %. Impact sur le signal biologique : nul (retire du bruit structurel, pas du signal).
4.3 Normalisation par effort saisonnier
L'observation citoyenne GBIF/iNaturalist/Vigie-Nature est sur-représentée au printemps/été (×10-20 vs hiver). Un calendrier en nombre d'observations brut confond activité de l'espèce et disponibilité des observateurs. La matview ajoute donc une colonne detection_rate (Isaac & Pocock 2015[8]) :
detection_rate = n_obs_espèce_ce_mois / total_obs_ce_mois -- Exemple Hirundo rustica (hirondelle rustique, migrateur trans-saharien) : -- Avril 2023 : 113 593 obs / 16 199 048 total = 0.701 % -- Mai 2023 : 118 374 obs / 22 031 247 total = 0.537 % -- En raw: mai = pic (effort max). En detection_rate: avril = pic (vraie -- phénologie, arrivée massive post-migration).
Les barres UI et le pic narratif (« pic en avril ») sont calés sur detection_rate. Le compte brut reste accessible en tooltip pour transparence.
4.4 Requête SQL complète de la matview
CREATE MATERIALIZED VIEW species_phenology AS
WITH filtered AS (
SELECT species_id, commune_insee,
EXTRACT(MONTH FROM date)::INT AS month
FROM observations
WHERE date IS NOT NULL
AND NOT (
(EXTRACT(MONTH FROM date) = 1 AND EXTRACT(DAY FROM date) = 1)
OR (EXTRACT(MONTH FROM date) = 12 AND EXTRACT(DAY FROM date) = 31)
)
),
monthly_effort AS (
SELECT month, COUNT(*)::BIGINT AS total_obs_month
FROM filtered GROUP BY month
)
SELECT f.species_id, f.month,
COUNT(*)::INT AS n_observations,
COUNT(DISTINCT f.commune_insee)::INT AS n_communes,
me.total_obs_month,
(COUNT(*)::DOUBLE PRECISION / NULLIF(me.total_obs_month, 0))
AS detection_rate
FROM filtered f
JOIN monthly_effort me ON me.month = f.month
GROUP BY f.species_id, f.month, me.total_obs_month;5. Overlaps spatiaux — les 8 catégories
Pour chaque commune, on calcule 8 fractions de surface couverte par une UNION géométrique des zones de chaque catégorie. L'union évite le sur-comptage quand 2 zones de même catégorie se chevauchent.
| Catégorie ICO | Poids | IUCN | Designations INPN incluses |
|---|---|---|---|
| znieff_t1_continental | 0.25 | — | ZNIEFF type I (17 718) hors marines. Inventaire biologique, critères espèces déterminantes (Horellou 2013). |
| znieff_marine | 0.05 | — | ZNIEFF I-Mer (306). Catégorie séparée — sémantique marine distincte. |
| natura2000 | 0.25 | — | ZSC (1 355, Habitats) ∪ ZPS (407, Oiseaux). UNION géométrique (un site peut être les deux). |
| reserves_strictes | 0.20 | I-IV | 28 designations EP. RNN, RNR, RBI, APB, APHN, MN, PN zone cœur, RNCFS, … |
| ramsar_biosphere | 0.10 | — | 6 designations EP. Ramsar, réserves de biosphère MAB UNESCO, OSPAR, Barcelone. |
| znieff_t2 | 0.05 | — | ZNIEFF type II (2 377). Grands ensembles fonctionnels, signal diffus. |
| parcs_adhesion | 0.07 | V | 20 designations EP. PNR (58), PN aire d'adhésion (11), GSF, sites classés 1930, zones adhésion géoparcs. |
| foncier | 0.03 | — | 3 designations EP. CEN (Conservatoires d'Espaces Naturels), CDL (Conservatoire du Littoral). |
Le mapping des 57 désignations INPN Espaces Protégés → 4 catégories ICO (reserves_strictes, parcs_adhesion, ramsar_biosphere, foncier) est stocké dans la table lookup ico_category_mapping. Modifiable sans migration : un UPDATE suivi de npm run compute:commune-protected-areas -- --recompose-onlyrejoue la composition en 30 s (vs 18 min pour le spatial complet).
6. Traits biologiques — agrégation multi-sources
6.1 Architecture
Table species_traits stocke une ligne par(species × trait × source). Matview species_traits_best agrège avec priorisation scientifique pour donner une valeur canonique par trait. La fiche espèce consomme la matview ; chaque valeur UI porte un badge source cliquable (URL directe de la valeur pour audit).
-- Matview species_traits_best : 1 valeur par (species, trait), priorisée
CREATE MATERIALIZED VIEW species_traits_best AS
SELECT DISTINCT ON (species_id, trait_key)
species_id, trait_key, value_numeric, value_text, unit,
source, source_url, confidence
FROM species_traits
ORDER BY species_id, trait_key,
CASE source
-- Tier 1 : sources académiques peer-reviewed spécialisées par groupe
WHEN 'anage' THEN 1 -- longévité vertébrés (gold)
WHEN 'pantheria' THEN 1 -- mammifères
WHEN 'avonet' THEN 1 -- oiseaux morphologie
WHEN 'amphibio' THEN 1 -- amphibiens
WHEN 'squambase' THEN 1 -- lézards + serpents
WHEN 'fishbase' THEN 1 -- poissons
WHEN 'elton' THEN 1 -- régimes birds + mammals
WHEN 'animal_traits' THEN 1 -- masse/BMR/cerveau multi-taxon
WHEN 'brot' THEN 1 -- plantes méditerranéennes
WHEN 'leda_seed_mass' THEN 1 -- LEDA plantes Europe
WHEN 'leda_canopy_height' THEN 1
WHEN 'leda_sla' THEN 1
WHEN 'leda_age_first_flowering' THEN 1
WHEN 'try_categorical' THEN 1 -- TRY catégorique 66k plantes
WHEN 'logghe_arthropod' THEN 1 -- arthropodes NW Europe
WHEN 'wst' THEN 1 -- araignées mondiales
-- Tier 2-3 : agrégateurs (futur)
WHEN 'eol' THEN 3
-- Tier 4 : fallback large couverture
WHEN 'wikidata' THEN 4
ELSE 5
END, confidence DESC, fetched_at DESC;6.2 Sources
| Source | Scope | Species | Licence | Citation |
|---|---|---|---|---|
| AnAge (HAGR) | Vertébrés, longévité + reproduction + masse + métabolisme. Gold standard académique. | 4 645 | Academic (CC-BY-NC) | Tacutu et al. 2018, Nucleic Acids Res. 46(D1):D1083-D1090 |
| PanTHERIA | Mammifères du monde, 45+ traits (life history, écologie, distribution, climat, métabolisme). | 5 400+ | Liberal academic | Jones et al. 2009, Ecology 90:2648 |
| AVONET | Tous oiseaux, morpho (bec/ailes/tarse/queue) + écologie (habitat, régime, migration) + range. | 11 009 | CC-BY 4.0 | Tobias et al. 2022, Ecology Letters 25:581-597 |
| AmphiBIO | Amphibiens globaux, 17 traits (habitat, régime, reproduction, activité, élévation). | 6 500+ | CC-BY 4.0 | Oliveira et al. 2017, Scientific Data 4:170123 |
| SquamBase | Squamates (lézards + serpents), morpho + life history + distribution. 18 ans de travail manuel. | 11 744 | CC-BY 4.0 | Meiri et al. 2024, Global Ecology and Biogeography |
| FishBase | Tous poissons, taxonomie + morphologie + longévité + habitat + régime + vulnérabilité. | 35 000+ | CC-BY-NC 4.0 | Froese & Pauly (eds). FishBase.org, snapshot HuggingFace v24.07 |
| EltonTraits 1.0 | Oiseaux + mammifères mondiaux, régimes alimentaires (10 catégories en %) + stratégies de nourrissage + activité temporelle. | 15 393 | Liberal academic (ESA) | Wilman et al. 2014, Ecology 95(7):2027 |
| AnimalTraits | Multi-taxon (vertébrés + invertébrés), masse corporelle + BMR + taille cerveau, curé depuis 400+ sources. | ~2 900 | CC-BY 4.0 | Herberstein et al. 2022, Scientific Data 9:265 |
| Logghe arthropodes NW Europe | 4 000+ arthropodes d'Europe du Nord-Ouest (insectes + araignées), 10 traits : taille, fécondité, développement, voltinisme, dispersion, longévité, enveloppe thermique. Darwin Core Archive GBIF. | 4 000+ | CC-BY-NC 4.0 | Logghe et al. 2025, GBIF Checklist, doi:10.15468/75g5z9 |
| BROT 2.0 | Plantes du bassin méditerranéen, 44 traits fonctionnels (croissance, dispersion, feu, germination, phénologie). Pertinent flore française Sud. | 2 457 | CC-BY 4.0 | Tavşanoğlu & Pausas 2018, Scientific Data 5:180135 |
| LEDA Traitbase | Flore Europe NW (~8 000 plantes), 4 traits : masse semence, hauteur couvert, SLA, âge première floraison. Compilation herbiers + terrain 15+ pays. | ~8 000 | Academic (citation) | Kleyer et al. 2008, J. Ecology 96:1266-1274 |
| TRY Plant Trait Database | Sous-ensemble Categorical (66 043 plantes mondiales) : 13 traits catégoriques (PlantGrowthForm, LeafType, LeafPhenology, PhotosyntheticPathway C3/C4/CAM, Woodiness, Succulent, Climber, Aquatic, Epiphyte…). Flow 3-POST + Basic Auth. | 66 043 | TRY ToS (CC-BY-SA) | Kattge et al. 2020, Global Change Biology 26:119-188 |
| World Spider Trait (WST) | Base mondiale Araneae (~13 000 espèces, 513 571 records) : morphométrie, colorations, écologie (moisture, stratum, ballooning), prédation (hunting guild, web building, paralysis latency), physio (thermal, venom), repro (eggsacs, egg size), silk biomechanics. API REST publique. | ~13 000 | CC-BY 4.0 | Pekár et al. 2021, Database (Oxford) 2021:baab064 |
| Wikidata SPARQL | Traits variés + cross-refs (EOL/GBIF/NCBI/ITIS/IUCN) + noms vernaculaires multi-langues + interactions prey/feeds-on. | 99 938 (QID) | CC0 1.0 | Vrandečić & Krötzsch 2014, Commun. ACM 57(10):78-85 |
6.3 Couverture par groupe TAXREF
| Kingdom / Classe | Species TAXREF FR | Species couvertes | Sources actives |
|---|---|---|---|
| Mammifères | ~100 | ~95 (~95%) | AnAge, PanTHERIA, EltonTraits, AnimalTraits, Wikidata |
| Oiseaux | ~500 | 407 (~81%) | AVONET, AnAge, EltonTraits, Wikidata |
| Amphibiens | ~30 | 38 (100%) | AmphiBIO, AnAge, Wikidata |
| Reptiles (squamates) | ~50 | 35 (~70%) | SquamBase, AnAge, Wikidata |
| Poissons | ~600 | 831 (inclut marins mondiaux) | FishBase, Wikidata |
| Plantes vasculaires | ~6 000 | ~5 000 (~83%) | TRY (catégorique), BROT (méd), LEDA (Europe NW), Wikidata |
| Insectes | ~35 000 | ~4 580 (14%, cible Europe NW) | Logghe (NW Europe), AnimalTraits, Wikidata |
| Araignées (Araneae) | ~1 700 | ~1 223 (~72%) | WST (mondial), Logghe, Wikidata |
| Fungi | ~12 000 | quasi nul | Wikidata (comestibles connus) |
| Autres invertébrés (marins, sol…) | ~15 000 | partiel (AnimalTraits) | AnimalTraits, Wikidata |
Total matview species_traits_best : ~90 000 valeurs canoniques sur 11 000+ espèces (environ 10 % de la DB globale, mais 70–95 % sur les groupes visibles grand public). L'écart sur le total s'explique par les fungi, micro-invertébrés marins et plancton pour lesquels aucun référentiel global de traits ouvert n'existe actuellement.
6.4 Roadmap — sources restantes
Les groupes suivants sont aujourd'hui peu couverts par les sources ouvertes disponibles. À intégrer si un référentiel CC-BY / CC0 devient accessible :
- Fungi : pas de gold standard trait global ouvert. MyCoPortal et MycoBank pour la taxonomie, mais les traits morphologiques (sporophore, comestibilité, hôte mycorhizien) restent épars dans des monographies. Suivi IndexFungorum pour les taxa.
- Invertébrés marins : WoRMS + OBIS pour taxonomie et distributions. Beukhof 2019 (poissons démersaux européens) et coral-traits.org prévus pour un prochain sprint.
- TRY quantitatif : le sous-ensemble catégorique est déjà intégré. Pour les traits quantitatifs (SLA, azote foliaire, hauteur précise, masse feuille), TRY exige une data request formelle non automatisable. BROT et LEDA compensent partiellement pour la flore FR.
- Insectes hors Europe NW : Logghe 2025 couvre ~4 000 arthropodes d'Europe du Nord-Ouest. Bases spécialisées (GlobalAnts pour fourmis, BETSI sol EU, InsectBase Lepidoptera) à intégrer individuellement pour couvrir le Sud de la France et les DOM-TOM.
6.3 Traits collectés (40+ clés)
Morphologie : mass_kg, mass_birth_g, mass_weaning_g, length_cm, height_cm, wingspan_cm, width_cm, thickness_cm. Cycle de vie : lifespan_years_max, lifespan_years_avg, generation_time_days. Reproduction : gestation_days, incubation_days, weaning_days, age_first_reproduction_days, clutch_size_avg/max, interbirth_interval_days. Écologie : diet, activity_cycle (diurnal/nocturnal/crepuscular), trophic_level, habitat_type, locomotion, migratory, reproductive_mode, endemic_to, extinction_status, conservation_status_iucn_worldwide. Divers : chromosome_count, speed_kmh_max, metabolic_rate_w, body_temperature_c, color_main.
6.4 Contrôle qualité
- Conversion d'unités stricte : chaque source fournit valeur + unité explicite (via
wikibase:quantityUnitpour Wikidata,normal_unitspour EOL). Si l'unité n'est pas reconnue, la valeur est écartée — jamais devinée. - Sanity checks par trait : plafonds biologiques (ex. longévité < 500 ans, masse < 200 t). Valeurs hors range = skip + log.
- Multi-valeurs préservées : si 2 sources divergent (ex. Wikidata = 4,5 kg, AnAge = 5,2 kg), les 2 lignes coexistent dans
species_traits. La matview remonte AnAge (priorité 1). Le conflit reste auditable. - Resilience : checkpoint persistant par batch dans
trait_import_checkpoints. En cas de crash, resume automatique depuislast_key_processed. Idempotent viaON CONFLICT UPDATE. - Traçabilité à la valeur :
source_url+source_ref+confidence+ FKregistry_id. Chaque badge source UI est cliquable et pointe directement sur la page source de la valeur.
7. Recherche fuzzy — colonnes générées + GIN trigramme
L'autocomplete espèce et commune doit accepter les fautes de diacritique (« coccinelle a 7 points » → « Coccinelle à 7 points »), les variantes de tirets/espaces, et l'article initial (« grau » → « Le Grau-du-Roi »). Le moteur s'appuie sur :
- pg_trgm (extension Postgres) : matching par trigrammes (séquences de 3 caractères), routable sur un index GIN. Supporte
ILIKE '%foo%'et l'opérateur%%(similarité). - immutable_unaccent : wrapper IMMUTABLE autour de
unaccent(STABLE par défaut, non indexable). Pattern communauté Erwin Brandstetter — sûr tant que le dictionnairepublic.unaccentn'est pas modifié. - Colonnes générées (
GENERATED ALWAYS AS … STORED) : Postgres matérialise la forme normalisée à chaque INSERT/UPDATE, zéro maintenance, index direct simple. Approche retenue après constat que l'index sur expression complexe n'était pas capté par le planner (qui préférait un seq scan même avecenable_seqscan=off).
-- species.search_normalized (GENERATED ALWAYS AS … STORED) regexp_replace( immutable_unaccent(lower(COALESCE(common_name_fr, '') || ' ' || scientific_name)), '[-\s]+', ' ', 'g' ) -- communes.name_normalized (idem + strip article initial) regexp_replace( regexp_replace(immutable_unaccent(lower(name)), '[-\s]+', ' ', 'g'), '^(le |la |les |l''|aux |au )', '' ) -- Index CREATE INDEX species_search_normalized_trgm_idx ON species USING gin (search_normalized gin_trgm_ops); CREATE INDEX communes_name_normalized_trgm_idx ON communes USING gin (name_normalized gin_trgm_ops);
Gains mesurés (EXPLAIN ANALYZE) sur requêtes réelles post-refactor : species autocomplete 182 ms → 0.79 ms (×230), commune autocomplete 118 ms → 1.44 ms (×82). Bitmap Index Scan exact sur le trigramme, sans seq scan résiduel.
8. Limites & biais assumés
Aucun dispositif de correction totale n'existe. Les biais résiduels ci-dessous sont documentés pour que l'utilisateur scientifique puisse interpréter les indicateurs avec prudence.
- Effort d'observation inégal spatialement (Boakes 2010[9], Isaac & Pocock 2015[8]) : sur-représentation péri-urbaine, côtière, Sud-Est. Les communes rurales peu visitées apparaissent artificiellement pauvres. Le bonus spatial ICO v2.1 atténue mais n'élimine pas.
- Biais horaire : espèces diurnes sur-observées vs nocturnes (rapaces nocturnes, micromammifères, amphibiens crépusculaires). Le
detection_ratene corrige que l'axe temporel mensuel, pas l'axe horaire. - Biais taxonomique : vertébrés charismatiques (oiseaux, mammifères, rhopalocères) sur-observés vs hyménoptères, diptères, mousses, champignons, algues. Un indicateur de diversité fondé sur GBIF en France reflète en premier lieu la diversité des groupes documentés.
- Observations opportunistes ≠ protocole standardisé : GBIF agrège des Atlas, des Vigie-Nature, des iNaturalist, des SINP, sans effort standardisé. Les tendances temporelles (dimension « Stabilité » de l'ICO) sont indicatives — pas des vraies courbes d'abondance.
- ZNIEFF > valeur biologique locale : un ZNIEFF de type I n'est pas un statut réglementaire. Son inclusion dans l'ICO v2.1 bonus (poids 0.25) reflète son intensité biologique présumée (critères d'espèces déterminantes, Touroult 2022[4]), pas une protection effective. Les gestionnaires régionaux actualisent les périmètres tous les 10-20 ans avec un lag d'observation.
- Antériorité des observations : les références à « 174 M observations » incluent les cochages historiques des collections muséales. La date affichée sur la fiche espèce (calendrier phénologique) reflète l'ensemble du corpus, pas uniquement la période récente.
- Colonne
commune_inseeNULL sur observations : bug d'import historique. La liaison observation ↔ commune passe par le précomputécommune_species(spatial join déjà fait) ; conséquence :species_phenology.n_communes = 0(feature dégradée, à corriger dans un futur import re-propagantcommune_inseeviaST_Intersects).
9. Bibliographie
- [1]Dudley N. (ed.) 2008. Guidelines for Applying Protected Area Management Categories. IUCN, Gland, Switzerland. — Référence des catégories IUCN I-VI des aires protégées, fondement de la pondération
reserves_strictesvsparcs_adhesion. - [2]Watson J.E.M., Dudley N., Segan D.B., Hockings M. 2014. The performance and potential of protected areas. Nature, 515:67-73. — Méta-analyse du gain biologique des aires protégées par catégorie IUCN.
- [3]Horellou A., Dore A., Herard K., Siblet J-P. 2013. Guide méthodologique pour l'inventaire continu des Zones Naturelles d'Intérêt Écologique, Faunistique et Floristique — ZNIEFF. MNHN/MEDDE. — Critères d'espèces déterminantes ZNIEFF.
- [4]Touroult J., Witté I., Pouvreau M., Siblet J-P. 2022. Évaluation de la pertinence du dispositif d'inventaire ZNIEFF pour la biodiversité française. Bulletin de la Société française d'Écologie et Évolution.
- [5]Maiorano L. et al. 2015. On how much biodiversity is covered in Europe by public protected areas and by the Natura 2000 network: an insight into the Italian case. Biodiversity and Conservation, 24:1-15. — Coverage médiane UE-27 %, cible de validation de l'ICO v2.1.
- [6]Trochet A., Schmeller D.S. 2013. Effectiveness of the Natura 2000 network to cover threatened species. Nature Conservation, 4:35-53.
- [7]Jenks G.F., Caspall F.C. 1971. Error on choropleth maps: definition, measurement, reduction. Annals of the Association of American Geographers, 61:217-244. — Fondement théorique du percentile rank pour indicateurs de biodiversité (méthode EBV / GEO BON).
- [8]Isaac N.J.B., Pocock M.J.O. 2015. Bias and information in biological records. Biological Journal of the Linnean Society, 115:522-531. — Normalisation par effort d'observation, fondement de
detection_rate. - [9]Boakes E.H. et al. 2010. Distorted views of biodiversity: spatial and temporal bias in species occurrence data. PLoS Biology, 8(6):e1000385. — Détection du « 1st January effect » GBIF.
- [10]Robertson M.P., Cumming G.S., Erasmus B.F.N. 2010. Getting the most out of atlas data. Diversity and Distributions, 16:363-375. — Méthode de détection des pics anormaux par fenêtre glissante.
- [11]Zizka A. et al. 2019. CoordinateCleaner: Standardized cleaning of occurrence records from biological collection databases. Methods in Ecology and Evolution, 10:744-751. — Package R, méthodes standards de nettoyage GBIF, seuils de filtrage ≥ 5×.
- [12]Maldonado C. et al. 2015. Estimating species diversity and distribution through the use of taxonomic and geo-referenced data. Global Ecology and Biogeography, 24:973-984. — Documente les conventions d'encodage
YYYY-01-01etYYYY-12-31. - [13]Jantke K., Schleupner C., Schneider U.A. 2011. Gap analysis of European wetland species: priority regions for expanding the Natura 2000 network. Biodiversity and Conservation, 20:581-605.
- [14]Margules C.R., Pressey R.L. 2000. Systematic conservation planning. Nature, 405:243-253. — Fondement théorique de la priorisation par rareté + sévérité UICN.
- [15]Leroux S.J. et al. 2010. Global protected areas and IUCN designations: do the categories match the conditions? Biological Conservation, 143:609-616.
10. Reproductibilité & code ouvert
L'ensemble des imports, calculs et migrations est décrit par des scripts versionnés et des migrations SQL auditables. Les fichiers clés :
| Fichier | Contenu |
|---|---|
| apps/api/prisma/migrations/20260424070000_commune_protected_areas_ico_v2/ | Tables ICO v2 + ico_category_mapping (57 entrées). |
| apps/api/prisma/migrations/20260424080000_patrim_bonus_pct/ | Colonne patrim_bonus_pct (Option C percentile rank). |
| apps/api/prisma/migrations/20260424110000_phenology_double_filter_detection_rate/ | Matview phénologie v2 (double filtre + detection_rate). |
| apps/api/prisma/migrations/20260424120000_pg_trgm_search_indexes/ | Extension pg_trgm + fonction immutable_unaccent + colonnes générées. |
| apps/api/scripts/compute-commune-protected-areas.ts | Script de compute ICO v2.1. Flag --recompose-only pour rejouer la composition en 30 s. |
| apps/api/scripts/refresh-phenology.ts | Refresh phénologie (auto-CONCURRENTLY si matview populée, non-bloquant pour les lectures). |
| apps/api/scripts/_lib/data_sources.ts | Registre miroirs data + licences + checksums SHA-256. |
| OPERATIONS.md | Guide d'opérations (config Postgres, scripts, workflows, monitoring, gotchas). |
| PLAN_ENRICHISSEMENT_DATA.md | Plan maître d'enrichissement v1.3 validé scientifiquement. |
Les migrations Prisma sont strictement linéaires et horodatées. Toute modification structurelle future passera par une nouvelle migration datée, garantissant l'historique complet du schéma.
Pour une question spécifique ou un usage scientifique particulier, les données sont ouvertes via les licences indiquées en page Sources — les re-calculs à partir des sources primaires sont reproductibles par n'importe quel équipe disposant des scripts.
Contenu exclusivement factuel et dérivé. Aucun texte généré par LLM sur des descriptions de méthodologie — chaque phrase est vérifiable par la formule ou la référence bibliographique correspondante.