Un observatoire pour n'importe quelle base de données naturalistes
Nos outils ne dépendent pas de la source. Aujourd'hui, nous vous présentons les outils et leur connecteur GeoNature.
D'où il vient, où il va
Partons de la carte d'accueil
L'observatoire Hauts-de-France : les données du GON et de Picardie Nature. Chaque type de zone de ref_geo devient une porte d'entrée.
Type dans ref_geo | À l'écran | Vue matérialisée | ||
|---|---|---|---|---|
COM | → | Communes | → | observatoire_commune |
EPCI | → | Intercommunalités | → | observatoire_epci |
ZNIEFF1 | → | ZNIEFF de type I | → | observatoire_znieff |
ENS | → | Espaces naturels sensibles | → | observatoire_ens |
PNR et RNN | → | Parcs naturels régionaux et réserves naturelles nationales | → | observatoire_protection, une vue pour les deux |
M10 | → | Mailles 10 × 10 km | → | observatoire_mailles |
Un type absent de la base est simplement désactivé pour l'instance.
Découvrons le monde territoire à travers le PNR Baie de Somme
Une page par territoire, les mêmes statistiques partout. Environ 500 000 données sur ce Parc.
Ce qui se passe à l'ouverture de la page
/territoire/pnr/<code>
synthèse, phénologie, taxonomie, statuts, chiffres
observatoire_protection range ensemble les PNR et les RNN. Sa colonne type_zone dit si une ligne concerne un parc ou une réserve : la requête ne garde que PNR.
Le grain commun à toutes les vues territoire
Une ligne par zone, année, mois et taxon, avec le nombre d'observations, les noms, les groupes INPN et la classification du règne à la famille. Rien à joindre au moment de la lecture.
Un clic filtre tout
Des mois, un groupe taxonomique, une catégorie de Liste rouge : chaque clic dans un graphique filtre tout le tableau de bord.
Dans la phénologie
Dans le navigateur
Chaque statistique relit les mêmes données filtrées
Dans les groupes taxonomiques : les filtres se cumulent
Pas de nouvelle requête pour filtrer : les données du territoire sont déjà chargées.
Le lien garde tout
Filtres, graphiques ouverts et leur ordre : un lien partagé restitue exactement la même vue.
Mon site face à son voisin
Deux parcs du littoral, les mêmes statistiques, côte à côte. Le survol d'un graphique se reflète de l'autre côté.
Pourquoi c'est simple
- Toutes les vues territoire ont le même grain : deux zones se lisent avec les mêmes requêtes
- Radar de comparaison, graphiques en miroir, survol synchronisé
À l'écran
PNR Baie de Somme Picardie Maritime
PNR Caps et Marais d'Opale
Basculons dans le monde espèce
Tout le vivant observé, en arbre. Six façons de le regarder, les mêmes filtres et le même lien de partage.
Aves
l'ordre
la famille des pouillots : la liste des espèces se filtre
D'où vient l'arbre
observatoire_especes_catalogue: une ligne par taxon valide, 9 555 espèces- Filtres : rangs taxonomiques, Liste rouge, statuts réglementaires
- Une sous-espèce est ramenée à son espèce : elle n'est pas comptée deux fois
Descendons jusqu'au Pouillot véloce
Phylloscopus collybita (Vieillot, 1817). Une espèce qui a des sous-espèces : elles comptent pour leur espèce, sans doublon.
Les synonymes
peut être un synonyme
son cd_ref dans TaxRef, base de tous les regroupements
Les sous-espèces
un taxon sous le rang espèce
cd_ref_sp : comptée une fois, pour le Pouillot véloce
La fiche espèce
Tout ce que la base dit d'une espèce, à explorer comme une page territoire. La même fiche existe pour une famille, un ordre, une classe.
Vos photos et vos textes d'abord
Une structure qui rédige ses textes et a ses photos les voit en premier sur la fiche. Wikipédia et iNaturalist deviennent un repli, au choix.
D'où viennent vos contenus
Textes : cor_taxon_attribut
Photos : t_medias
une pour les textes, une pour les photos
- Remplies depuis TaxHub, par un fichier d'import, ou directement dans l'administration
- Un gestionnaire sans GeoNature remplit les mêmes champs
- Plus tard : synchronisation automatique avec l'API TaxHub
Ce qu'affiche la fiche
Présentation : un paragraphe en tête, sans titre.
Habitat
Le texte de la structure.
Identification
Le texte de la structure.
État des populations et menaces
Non renseigné : rien ne s'affiche.
Six rubriques par défaut : Présentation, État des connaissances, Habitat, Phénologie, État des populations et menaces, Identification. Auteur et licence réglés une fois pour l'instance.
Textes : l'administrateur choisit
Photos : l'administrateur choisit
Une instance se règle sans code
Un géomaticien sort son observatoire sans développeur : identité, couleurs, contenus, périmètre.
Apparence
Logo, nom, couleurs, fonds de carte, couches, rampe de la carte.
Contenu
Graphiques et sections, statuts affichés, représentations de l'arbre, filtres, partage.
Périmètre et accès
Mot de passe, règnes affichés, monde d'accueil, mention des sources.
- Des dizaines d'options, rangées en 15 familles de réglages (logo, couleurs, graphiques, statuts, accès…) dans
web.admin_config - Sans réglage, chaque option a un défaut : une instance neuve fonctionne d'emblée
- Journal d'audit : qui a changé quoi, et quand
- Un bac à sable permet d'essayer chaque réglage sans rien enregistrer
Les données sensibles, diffusées selon leur niveau
Chaque observation garde le niveau de sensibilité de la synthèse. L'observatoire la montre à l'échelle que ce niveau autorise, jamais plus précisément.
La règle, par niveau SINP
Une observation floutée compte dans les totaux là où elle est listée.
La mécanique
le niveau de chaque observation
une seule, en base
ne lisent qu'elle
- L'application n'a plus le droit de lire la synthèse : la base le refuse
- Une source arrivée sans niveau : on le calcule avec le moteur de sensibilité de GeoNature, ou le gestionnaire déclare comment la diffuser (ex : source GBIF publique). Sinon, elle n'est pas diffusée
Ce que voit le visiteur
Certaines observations sont diffusées à une échelle plus large que ce territoire. Leur localisation précise n'est pas publiée.
Exemple fictif. La même mention s'affiche sur toutes les fiches. Le mot « sensible » n'apparaît jamais à côté d'une espèce.
L'administrateur choisit l'affichage
- Filtre « observées ici seulement »
- Phénologie : un mois connu seulement par des observations floutées apparaît hachuré
- Cartes : la maille dessinée entière, les points seulement s'ils sont précis
- Le niveau de floutage vient de la donnée : l'administrateur choisit l'affichage, jamais le niveau
Ce que l'observatoire demande à une base GeoNature
Il lit la synthèse. La nuit, il précalcule des vues ; le jour, l'application ne lit qu'elles, jamais la base GeoNature en direct.
Ce qui touche aux tables GeoNature
| Index ajouté | Pour |
|---|---|
ref_geo.l_areas (area_code) | Retrouver une zone par son code |
ref_geo.l_areas spatial, 4326 | Zoom fluide sur les contours |
taxonomie.bdc_statut_taxons | Statuts : de 778 ms à quelques ms |
Créés sans bloquer la base. Aucun index sur la synthèse.
Technos
Des tests de non-régression à chaque changement. 650 commits sur la version de 2024, 1 816 depuis sa reprise en 2026.
Les 17 vues, dans l'ordre de leur calcul
Un script SQL lisible par vue. Recalcul complet de nuit : 20 à 27 minutes sur cinq millions d'observations.
Intégrer l'écosystème GeoNature : de quoi parle-t-on ?
Une application à part, branchée d'abord sur GeoNature et ouverte aux autres sources.
Cité dans la documentation de l'écosystème, présenté aux Rencontres.
Publier la liste des tables et colonnes de GeoNature que l'observatoire utilise, pour qu'une évolution de GeoNature ne le casse pas sans prévenir.
Les vues précalculées sur la synthèse et le calcul de la sensibilité, faits une fois pour tous les outils qui lisent la synthèse, au lieu que chacun refasse les siens.
Une réécriture complète, et la fin des sources hors GeoNature et du public non connecté :
Gouvernance proposée
Code sous AGPL, un mainteneur. Une feuille de route ouverte : un comité d'utilisateurs et de financeurs consulté sur les priorités, des contributions bienvenues.
À vous
Vos questions, et les nôtres.
Rester informé
Les nouvelles de l'observatoire, quelques courriels par an. Cette page peut être partagée librement.
Ce que vous recevrez
- L'ouverture du code sur GitHub en décembre
- La sortie publique en mars 2027
- Les nouvelles fonctionnalités, au fil de l'eau
Une confirmation vous est envoyée par courriel. Désinscription en un clic depuis chaque message.
Pourquoi l'AGPLv3
Pour que le code reste un bien commun : chacun peut l'utiliser, l'installer et le modifier librement, et toute version modifiée proposée en ligne doit publier ses modifications.
Ce que l'AGPL ajoute à la GPL
La GPL oblige à publier les modifications quand on distribue un logiciel. Un site web ne se distribue pas, il se consulte : avec la GPL seule, une version améliorée pourrait être proposée en ligne sans jamais être rendue. L'AGPL ferme cette porte.
Le modèle
Tout ce qui est dans le dépôt est gratuit. Ce qui se paie, c'est l'hébergement et le temps de mise en service, de maintenance et d'évolution. Aucune version « premium » fermée.
Compatible avec l'écosystème
GeoNature et GeoNature-atlas sont sous GPLv3. L'AGPLv3 et la GPLv3 sont compatibles entre elles.
Next.js et ses 74 routes API
Next.js est un cadre de développement web en TypeScript. Dans le même projet, il produit les pages affichées dans le navigateur et un petit serveur qui répond aux demandes de données.
Le chemin d'une donnée
Par exemple, le PNR Baie de Somme
/api/territoires/synthese?type=pnr&code=…
Une requête SQL, une réponse en JSON, des graphiques dessinés dans le navigateur
Les 74 routes, par famille
| territoires · 18 | Une page territoire : synthèse, phénologie, taxonomie, statuts, chiffres, contours, points, calendrier, mailles, export |
| especes · 17 | Une fiche espèce et l'accueil espèces : identité, observations, points, mailles, photos, répartition, sous-espèces, catalogue |
| taxons · 17 | Une fiche de groupe, du règne à la famille : chiffres, espèces, structure, statuts, photos, texte, mailles, points |
| admin · 8 | L'administration : réglages, aperçu, couleurs, textes des graphiques, fréquentation |
| data · 5 | Les chiffres de l'accueil |
| autres · 9 | Carte d'accueil, partage, mesure d'usage sans cookie, santé de l'instance, connexion |
Les garde-fous de chaque route
- Requêtes paramétrées : aucune valeur venue de l'adresse n'est collée dans le SQL
- Le type de territoire passe par une liste blanche, traduite côté serveur en nom de vue
- Le schéma de la base dépend de l'instance, jamais écrit en dur, et un test le vérifie
- Les réponses sont mises en cache, de quelques minutes à quelques heures
Pourquoi pas Python et Flask, comme GeoNature ? Un seul langage pour l'interface et le serveur, et un rendu côté serveur pour les aperçus de liens partagés. Le compromis assumé : un serveur Node à exploiter, livré dans un conteneur Docker.
Les technologies, une par une
Des briques libres et répandues, choisies pour durer.
| Brique | Version | Rôle dans l'observatoire |
|---|---|---|
| Next.js | 15.5 | Le cadre : les pages et les routes API |
| React | 19.2 | L'interface : chaque graphique, carte ou panneau est un composant |
| TypeScript | 5.8, strict | Le langage : du JavaScript dont les types sont vérifiés avant l'exécution |
| Zustand | 5 | La mémoire partagée des filtres : un clic y écrit le filtre, et tous les graphiques qui la lisent se redessinent |
| Nivo | 0.99 | Les graphiques : 26 paquets (barres, lignes, rayonnement, mosaïque, calendrier, radar, flux…), construits sur d3 |
| d3-hierarchy | 3 | Le calcul de la forme de l'arbre du vivant |
| MapLibre GL | 5.7 | Les cartes : la version libre de Mapbox GL, dessinée en WebGL. Fonds IGN Géoplateforme et MapTiler |
| PostgreSQL / PostGIS | celle de GeoNature | La base, la même que GeoNature. Accès direct en SQL, sans couche intermédiaire, 5 connexions au plus |
| NextAuth | 5 | La connexion à l'administration |
| Tailwind | 4 | Les styles, dont les couleurs propres à chaque instance |
| Docker | Le conteneur livré : la même image pour toutes les instances |
Les 11 tables de l'observatoire
À côté des vues, des tables que l'application écrit ou que l'on remplit par lot. Contrairement aux vues, elles ne se recalculent pas.
admin_config | Les réglages de l'administration, une ligne par famille de réglages |
admin_audit_log | Le journal des actions sensibles : connexions, changements de réglages |
taxon_media | Les photos des fiches, venues d'iNaturalist, avec auteur et licence |
taxon_descriptions | Les textes « En quelques mots », venus de Wikidata et Wikipédia |
taxon_repartition | La répartition mondiale d'une espèce : les pays où elle est observée et leur nombre d'observations, d'après le GBIF |
taxon_facts | Les capsules « Le saviez-vous ? » : de courts faits rédigés à la main et vérifiés un par un |
stat_info_overrides | Les textes d'explication des graphiques, quand l'administrateur les réécrit |
analytics_events | La mesure d'usage, sans cookie : pages vues, fiches vues, partages, filtres, graphiques ouverts |
analytics_daily | Le cumul quotidien de cette mesure, pour l'écran de fréquentation de l'admin |
share_images | Les images d'aperçu des liens partagés, gardées 30 jours |
choropleth_config | L'ancienne table des couleurs de la carte d'accueil, gardée pour compatibilité |
Ce que l'application lit encore en direct
Les vues résument les données : un nombre d'observations par zone, par mois et par espèce. Un point sur une carte, lui, demande l'observation elle-même, avec sa localisation et sa date.
Les lectures directes de la synthèse, aujourd'hui
- Les cartes de points des fiches espèce, des fiches de groupe et des pages territoire
- La liste des observations d'une fiche espèce
- Le calendrier jour par jour et la carte par mailles d'une page territoire
- Les comptes de l'accueil espèces, quand on filtre par période ou par lieu
- Quelques comptes de secours, si une vue manque sur une instance
Ce que change la couche de diffusion
- Toutes ces lectures passeront par une couche de diffusion unique, qui applique le niveau de sensibilité de chaque observation
- Le compte de l'application perdra le droit de lire la synthèse : la base elle-même refusera la lecture
- Les agrégats ne lisent déjà que les vues
- Échéance : avant la sortie publique de mars 2027
Les 17 vues (1/2) : références et territoires
Une vue matérialisée est le résultat d'une requête enregistré en base : recalculé la nuit, lu le jour sans refaire le calcul. Les vues se recalculent dans un ordre précis, parce que certaines se construisent à partir des autres.
Niveau 1 · les références
Niveau 2 · les territoires, au même grain : zone × année × mois × taxon
observatoire_commune | Communes (COM). La vue pivot : les niveaux 3 et 4 en dépendent |
observatoire_epci | Intercommunalités (EPCI) |
observatoire_znieff | ZNIEFF de type I (ZNIEFF1) |
observatoire_ens | Espaces naturels sensibles (ENS) |
observatoire_protection | PNR et RNN ensemble, distingués par la colonne type_zone |
observatoire_mailles | Mailles 10 × 10 km (M10) |
Chaque ligne porte le nombre d'observations et toute la classification, recopiée pour n'avoir rien à joindre à la lecture. Le rattachement d'une observation à ses zones vient de gn_synthese.cor_area_synthese.
Les 17 vues (2/2) : espèces, accueil et groupes
Des vues plus ciblées, chacune née d'un temps de réponse mesuré trop long. Recalcul complet de nuit : 20 à 27 minutes sur cinq millions d'observations.