Guide API Observatoire — construire un front
Documentation destinée aux développeurs front qui consomment l'API de l'Observatoire EPTB Sèvre Nantaise pour construire de nouvelles interfaces (carte, graphique, légende, tableaux).
- Version recommandée :
/api/v2— l'API v1 est dépréciée (en-têteDeprecationsur chaque réponse, sunset 2027-06-30). - Documentation interactive (OpenAPI / Swagger UI) :
{hôte}/api - Documentation HTML par endpoint :
{hôte}/api-doc/index.html - Formats de sortie :
.json,.geojsonet.csv(selon l'endpoint), choisis par l'extension d'URL.
Environnements : les URLs d'exemple ci-dessous sont relatives — préfixez-les par l'hôte de l'environnement consulté :
https://obs21-bdt.sevre-nantaise.com(base de test pour la banque des territoires),https://obs21.sevre-nantaise.com(production). Dans la doc HTML (/api-doc/), le bouton « copier » reconstruit l'URL absolue du site consulté ; les exemples JSON sont régénérés automatiquement (contre la base locale de dev) aux balisesGENERATED:iddu template viaphp doc/api/generate.php.
1. Concepts
| Concept | Description | Exemple |
|---|---|---|
dataset |
jeu de données observatoire | qualite_eaux_surf_support_eau |
id_territoire |
territoire interrogé | 1 = EPTB Sèvre Nantaise |
processing |
type de traitement des données (« représentation ») | respect-objectif, datas, classes… (liste en annexe) |
ids_parametres |
identifiants de paramètres (nitrates, pesticides…) | 1340 = Nitrates |
ids_objectifs |
identifiants d'objectifs de qualité associés aux paramètres | 6190 |
ids_objets_geo |
stations / points de mesure | 04145000 |
id_filtre_territoire |
filtre de territoire : restreint les stations à un sous-ensemble (département, EPCI…) | t1|qualite_eaux_surf_support_eau|epci|200067635 |
id_carte |
carte configurée (centre, zoom, couches de fond) | 1 |
date_debut / date_fin |
bornes de dates des données | 2025-01-01 / 2025-12-31 |
output_options |
enrichissements de la réponse (labels, géométrie, légende…) | with_labels,with_geometry_geojson_for_map |
Remarques :
- les paramètres multiples s'écrivent en liste à virgules
(
output_options=with_labels,for_legend) ; - l'API normalise certaines requêtes :
id_territoireet les bornes de dates peuvent être complétées automatiquement (redirection HTTP 302 à suivre) ; - les collections paginées acceptent
page(défaut 1).
1.1 Vue d'ensemble des données
flowchart LR
T["v_conf_territories<br/>territoire (id_territoire)"]
TOD["v_conf_territory_obs_datasets<br/>datasets du territoire"]
DS["dataset<br/>ex. qualite_eaux_surf_support_eau"]
P["paramètres<br/>ids_parametres (1340 = Nitrates)"]
O["objectifs / indicateurs<br/>ids_objectifs (6190)"]
F["v_conf_territory_filters<br/>filtres (id_filtre_territoire)"]
S["obs_searches<br/>découverte : id_parametre + id_conf_objectif"]
D["obs_datasets<br/>processing × output_options"]
T --> TOD
TOD --> DS
DS --> P
P --> O
T --> F
S -.->|"renvoie"| P
S -.->|"renvoie"| O
S -.->|"renvoie"| D
F -.->|"restreint les stations"| D
T --> D
DS --> D
1.2 L'entrée obsSearch
GET /api/v2/obs_searches.json?id_territoire=1&search_entry_parameter_string_part=phosph&ids_datasets=qualite_eaux_surf_support_eau&search_limit=10
Recherche les paramètres dont le nom contient le fragment « phosph » pour le dataset : source des listes de choix paramètre/objectif du front.
[
{
"id_parametre": 1238,
"parametre": "Phosphamidon",
"unite": "µg/L",
"dataset": "qualite_eaux_surf_support_eau",
"obsDatasetMetadata": {
"title": "Qualité des eaux superficielles (support eau brute) - Hub'eau (Naïades)",
"history": {
"lastUpdate": "2026-09-10"
},
"sources": [
{
"producers": [
{
"producer_url": "",
"producer_logo": "",
"producer_name": "AE"
}
],
"source_url": "https://hubeau.eaufrance.fr/page/api-qualite-cours-deau",
"source_logo": "/images/icones/hubeau-api-quality.svg",
"source_name": "hubeau, Qualité des cours d'eau"
}
],
"descripteur": "AR",
"description": "osur pc paramètre seulement sur le support eau brute"
},
"ids_objectifs": [
{
"id_conf_objectif": "11498",
"value": "0.1",
"inf_sup": "<=",
"reference": "SAGE SN 2015",
"objectiveCompliancyFunction": "100PourcentDuTemps",
"default_args": [],
"processing": "respect-objectif"
}
]
},
{
"id_parametre": 7834,
"parametre": "Gomphosphaeria",
"unite": null,
"dataset": "qualite_eaux_surf_support_eau",
"obsDatasetMetadata": {
"title": "Qualité des eaux superficielles (support eau brute) - Hub'eau (Naïades)",
"history": {
"lastUpdate": "2026-09-10"
},
"sources": [
{
"producers": [
{
"producer_url": "",
"producer_logo": "",
"producer_name": "AE"
}
],
"source_url": "https://hubeau.eaufrance.fr/page/api-qualite-cours-deau",
"source_logo": "/images/icones/hubeau-api-quality.svg",
"source_name": "hubeau, Qualité des cours d'eau"
}
],
"descripteur": "AR",
"description": "osur pc paramètre seulement sur le support eau brute"
},
"ids_objectifs": []
},
{
"id_parametre": 1349,
"parametre": "Polyphos
… (réponse tronquée)
GET /api/v2/obs_searches.json?id_territoire=1&ids_datasets=qualite_eaux_surf_support_eau&search_limit=10
Sans fragment de recherche : premiers paramètres du dataset (search_limit) — source des listes de choix paramètre/objectif du front.
[
{
"id_parametre": 7597,
"parametre": "10,11-dihydro-10,11-dihydroxy-carbamazépine",
"unite": "µg/L",
"dataset": "qualite_eaux_surf_support_eau",
"obsDatasetMetadata": {
"title": "Qualité des eaux superficielles (support eau brute) - Hub'eau (Naïades)",
"history": {
"lastUpdate": "2026-09-10"
},
"sources": [
{
"producers": [
{
"producer_url": "",
"producer_logo": "",
"producer_name": "AE"
}
],
"source_url": "https://hubeau.eaufrance.fr/page/api-qualite-cours-deau",
"source_logo": "/images/icones/hubeau-api-quality.svg",
"source_name": "hubeau, Qualité des cours d'eau"
}
],
"descripteur": "AR",
"description": "osur pc paramètre seulement sur le support eau brute"
},
"ids_objectifs": []
},
{
"id_parametre": 7947,
"parametre": "10:2 FTCA",
"unite": "µg/L",
"dataset": "qualite_eaux_surf_support_eau",
"obsDatasetMetadata": {
"title": "Qualité des eaux superficielles (support eau brute) - Hub'eau (Naïades)",
"history": {
"lastUpdate": "2026-09-10"
},
"sources": [
{
"producers": [
{
"producer_url": "",
"producer_logo": "",
"producer_name": "AE"
}
],
"source_url": "https://hubeau.eaufrance.fr/page/api-qualite-cours-deau",
"source_logo": "/images/icones/hubeau-api-quality.svg",
"source_name": "hubeau, Qualité des cours d'eau"
}
],
"descripteur": "AR",
"description": "osur pc paramètre seulement sur le support eau brute"
},
"ids_objectifs": [
{
"id_conf_objectif": "9974",
"value": "0.007",
"inf_sup": "<=",
"reference": "PFAS TEST 0.007",
"objectiveCompliancyFunction": "100PourcentDuTemps",
"default_args": [],
"processing": "respect-objectif"
}
]
},
{
"id_parametre": 8003
… (réponse tronquée)
1.3 concept de dataset : tables geo, données, paramètres et objectifs
Un dataset est composé de trois tables de configuration imbriquées —
conf_table_data (données), conf_table_parameter (paramètres) et
conf_table_geo (objets géo) — et porte ses conf_objectifs. Les tables geo
ne sont pas toutes rattachées à un dataset et peuvent être partagées
entre plusieurs datasets :
flowchart LR
subgraph DS1["dataset — obs_datasets<br/>ex. qualite_eaux_surf_support_eau"]
direction TB
D["conf_table_data<br/>table de données (mesures, dates)"]
P["conf_table_parameter<br/>table de paramètres (ids_parametres)"]
O["conf_objectifs<br/>objectifs : seuil, référence,<br/>fonction de conformité, couleurs"]
end
subgraph DS2["autre dataset — obs_datasets<br/>ex. sdage_2028_edl_2025_esu"]
direction TB
D2["conf_table_data<br/>table de données"]
P2["conf_table_parameter<br/>table de paramètres"]
O2["conf_objectifs<br/>objectifs"]
end
GS["conf_table_geo<br/>table geo partagée entre datasets<br/>(ex. stations qualité des eaux)"]
GO["conf_table_geo<br/>table geo non rattachée à un dataset<br/>(ex. couche libre / fond de carte)"]
DS1 -->|"table geo"| GS
DS2 -->|"table geo (partagée)"| GS
Cardinalités (modèle de données) :
- 1 dataset → exactement 1
conf_table_data, 1conf_table_parameteret 1conf_table_geo; - 1 table geo → 0..n datasets : partageable entre datasets, et certaines
n'accompagnent aucun dataset (elles se chargent seules via
conf_table_geos/{id}/geoms, cf. §10) ; - 1 dataset → 0..n objectifs (
conf_objectifs) : chaque objectif est rattaché à un seul dataset (obs_dataset) et porte sonid_parametre.
2. L'enveloppe v2 (obs_datasets)
L'endpoint /api/v2/obs_datasets (données observatoires) renvoie une enveloppe
contrat v2 en camelCase, sans valeurs null :
{
"meta": { "dataset": "…", "processing": "…", "idTerritoire": "1", "count": 202 },
"data": [ …lignes de résultats… ],
"…": "clés complémentaires selon le processing (légende, classes…)"
}
⚠️ Les autres endpoints v2 (obs_searches, conf_objectifs, …) conservent
temporairement le contrat historique v1 (tableaux plats snake_case).
3. Étape 1 — les territoires
v_conf_territories renvoie les territoires disponibles : idObjetgeo est la
valeur à passer en id_territoire dans toutes les autres requêtes ;
idSysCarte identifie la carte par défaut du territoire et les champs
linkLogoStructure / linkWebSiteStructure alimentent l'habillage.
GET /api/v2/v_conf_territories.json
idObjetgeo est la valeur à passer en id_territoire ; idSysCarte identifie la carte par défaut, les champs link… alimentent l'habillage.
[
{
"idObjetgeo": 11,
"objetgeo": "Observatoire régional de l'Eau (TEO Pays de la Loire)",
"idSysCarte": 21,
"linkLogoStructure": "../images/icones/mutualisation/Logo_11_teo.png",
"linkWebSiteStructure": "https://teo-paysdelaloire.fr/",
"structureSigle": "TEO",
"linkWebSiteObsStructure": "https://teo-paysdelaloire.fr/",
"geom": "01060000206A08000003000000010300000001000000024E000026B5139656071E41AD6B28161CA959418AC015C657081E4149820B29FFA859410422DBCBEB081E41E3B282A3F5A85941AFB4AEBBBB091E41E5556A2EE1A85941E421AAC70A0A1E4147823C07D2A859417EB20A38DE091E416CB85F1CC3A859413B299F60050A1E419A62A3F7BDA859412EBAC771030A1E414E0051FBA4A8594125CB3316390A1E413289741D6EA85941E19F2FB2060A1E410EB458B02FA859412CF78F9EDB091E416653F08628A85941D4D0570150091E41D71444B310A859415E5AEA0337091E41CC5F83F5F9A759417B249C1886091E412CC44610EBA75941C49E4BA783091E41FFA53011DCA7594189B9015CE3081E4169E2DF9ACAA75941A4EA4D7CDD081E4169C67424A5A759410CB062AB3E091E41B002ED2B91A75941602ABC34A1091E412EF593E18AA7594112269E92DB091E41762FC21782A75941E23C1BFDA10A1E4112F5AFD171A759416D179D27C90A1E41CF2D9BBB6CA759417C7AEB2D640A1E41FA11320E64A75941505B85474D0A1E418F25932F56A7594176C7463A920A1E41BAABDE8C35A75941E220B280D20A1E41D0CE2FAA17A759417C4EC953A0091E41731A4E8AE8A65941B6BCC62711091E41D66A1B97CAA659410307B9BCBF081E4130D93D5DC4A65941C14C7A7007081E4151B4D7FDADA659418D8ACE28A2071E41A2B5FB2B95A65941928D139DDA061E41961BFB8692A659419080765B70051E4130A82F4D8BA659411CBAE6CA5C051E411829FDCA88A659411002B184430A1E41C6AABA4F13A6594117621F46C10A1E41442149A007A659417F52AC25D30A1E4151CEEA0DECA55941F2D6FD29E30A1E41D210D322DEA55941DEC43CA0CD0A1E41217277B7CCA559412E1FF0C1930A1E412C73136ECBA55941ACA9DFEED7071E4157BC435BD8A559418C858DA44D071E410F0FE85ED8A5594120BBF2FFDE051E4101FDBE13A9A55941D673E39B65051E4104F964D7A1A5594154E5E43F34031E41A8E0A66494A55941269278886C021E41D96A5FFF8CA5594154368A792E021E4106347D4584A5594135D64EEADD011E41F46906277AA55941766462A4D7001
… (réponse tronquée)
4. Étape 2 — filtres de territoire et carte
4.1 Filtres de territoire
Chaque territoire peut proposer des filtres restreignant les stations à un
sous-ensemble (département, EPCI, SAGE…). Ils sont listés par
v_conf_territory_filters (paramètres id_territoire et dataset) :
GET /api/v2/v_conf_territory_filters.json?id_territoire=1&dataset=qualite_eaux_surf_support_eau
confTerritoryFilterId est la valeur à passer en id_filtre_territoire (format code|dataset|type|id_objet).
[
{
"confTerritoryFilterId": "t1|qualite_eaux_surf_support_eau|departement|79",
"confTerritoryFilter": "DEUX-SEVRES",
"territoryId": 1,
"obsDataset": "qualite_eaux_surf_support_eau",
"filterCategoryId": "departement",
"filterCategoryObjectId": "79",
"filterCategory": "Département",
"useFor": null,
"filterType": "geom_intersects",
"filterGeom": "01060000206A0800000100000001030000000100000098080000CDCCCCCC202E19419A999939EF58594167666666E22C1941000000A0FA58594167666666562C194134333373F95859416766666606271941000000802059594167666666402419419A9999793B59594100000000A2231941CDCCCC8C45595941000000002C2319419A99999954595941CDCCCCCC902119410000004093595941343333334D1F1941CDCCCC2C2D5A59419A999999EB1E19419A9999393C5A594167666666C41E1941000000C0435A5941CDCCCCCC6E17194134333353E35A59419A9999991F17194100000020E75A5941000000002017194100000020EC5A5941676666667616194167666666385B59419A99999927161941CDCCCC2C415B594100000000BC0F1941CDCCCCECB45B594167666666A00B1941CDCCCCACED5B59419A999999A9061941676666062E5C594134333333B3021941343333B3C65C59413433333351FF1841676666864F5D5941343333332DF21841CDCCCC6CB65D594134333333A7EB1841000000A0EE5D5941CDCCCCCC56EB184167666686F45D59419A9999991FEC1841CDCCCCACFA5D59410000000050F11841CDCCCCAC435E594100000000F2F1184134333393525E59410000000060F318419A9999D9815E59416766666628FB184100000
… (réponse tronquée)
Variante liste légère : le paramètre fields (filtre CommaSeparatedFieldsFilter)
limite les champs retournés — pratique pour peupler un menu sans charger les
géométries et métadonnées :
GET /api/v2/v_conf_territory_filters.json?id_territoire=1&dataset=qualite_eaux_surf_support_eau&fields=filterCategory,filterCategoryId,confTerritoryFilter,confTerritoryFilterId
Utiliser fields=filterCategory,filterCategoryId,confTerritoryFilter,confTerritoryFilterId pour récupérer une liste légère. confTerritoryFilterId est la valeur à passer en id_filtre_territoire (format code|dataset|type|id_objet).
[
{
"confTerritoryFilterId": "t1|qualite_eaux_surf_support_eau|departement|79",
"confTerritoryFilter": "DEUX-SEVRES",
"filterCategoryId": "departement",
"filterCategory": "Département"
},
{
"confTerritoryFilterId": "t1|qualite_eaux_surf_support_eau|departement|44",
"confTerritoryFilter": "LOIRE-ATLANTIQUE",
"filterCategoryId": "departement",
"filterCategory": "Département"
},
{
"confTerritoryFilterId": "t1|qualite_eaux_surf_support_eau|departement|49",
"confTerritoryFilter": "MAINE-ET-LOIRE",
"filterCategoryId": "departement",
"filterCategory": "Département"
},
{
"confTerritoryFilterId": "t1|qualite_eaux_surf_support_eau|departement|85",
"confTerritoryFilter": "VENDEE",
"filterCategoryId": "departement",
"filterCategory": "Département"
},
{
"confTerritoryFilterId": "t1|qualite_eaux_surf_support_eau|epci|200071678",
"confTerritoryFilter": "CA Cholet Agglomération",
"filterCategoryId": "epci",
"filterCategory": "EPCI"
},
{
"confTerritoryFilterId": "t1|qualite_eaux_surf_support_eau|epci|200067635",
"confTerritoryFilter": "CA Clisson Sèvre et Maine Agglo",
"filterCategoryId": "epci",
"filterCategory": "EPCI"
},
{
"confTerritoryFilterI
… (réponse tronquée)
Lecture : confTerritoryFilterId est la valeur à passer en
id_filtre_territoire — au format code|dataset|type|id_objet
(ex. t1|qualite_eaux_surf_support_eau|epci|200067635 = filtre « t1 » du
territoire 1 sur ce dataset, restreint à l'EPCI n° 200067635). Le champ
filterType indique le mécanisme (geom_intersects = intersection avec la
géométrie du filtre, geo_objects_ids_list = liste d'objets géo) et
filterCategory/filterCategoryObjectId décrivent la catégorie (Département,
EPCI…).
Effet sur une requête obs_datasets — même requête sur un json avec et sans
filtre : count 202 → 15 (seules les stations de l'EPCI sont retournées) :
GET /api/v2/obs_datasets.json?processing=respect-objectif&dataset=qualite_eaux_surf_support_eau&id_territoire=1&ids_objectifs=6190&ids_parametres=1340&date_debut=2025-01-01&date_fin=2025-12-31&output_options=with_labels&id_filtre_territoire=t1|qualite_eaux_surf_support_eau|epci|200067635&id_carte=1
Requete avec le filtre EPCI 200067635 : le count passe de 202 à 15 — seules les stations de l'EPCI sont retournées.
{
"meta": {
"dataset": "qualite_eaux_surf_support_eau",
"processing": "respect-objectif",
"idTerritoire": "1",
"count": 15
},
"data": [
{
"year": 2025,
"nbTotal": 5,
"nbCompliant": 5,
"aggValuesList": [
{
"dateDonnee": "2025-02-13 10:19:00+01",
"valeur": 21
},
{
"dateDonnee": "2025-04-08 10:01:00+02",
"valeur": 15
},
{
"dateDonnee": "2025-06-18 11:43:00+02",
"valeur": 8.1
},
{
"dateDonnee": "2025-08-21 11:44:00+02",
"valeur": 1.6
},
{
"dateDonnee": "2025-10-16 10:56:00+02",
"valeur": 1.9
}
],
"idObjetgeo": "04143200",
"objetgeo": "SEVRE NANTAISE à MONNIERES",
"idParametre": "1340",
"parametre": "Nitrates",
"unite": "mg(NO3)/L",
"objectiveCompliancyFunction": "specialNitrates",
"idConfObjectif": "6190",
"seuilObjectif": 25,
"nbNotCompliant": 0,
"percentageCompliant": 100,
"percentageNotCompliant": 0,
"overallCompliancy": "yes",
"percentageAverageWrtObjective": 38.08,
"couleurPubli": "vert1",
"classe": {
"debug": {
"type": "getStdClassePourcentageRespectObjectif4c",
"colorCode": "green"
},
"radius": 8,
"weight": 1,
"opacity": 0.9,
"color": "#000000",
"fillColor": "#B3CC00",
"fillOpacity": 0.45,
"strokeWidth": 1.5,
"classe": "V",
"libel": "Respect (moins de 10% de dépassements)",
"comment": "",
"debugIndicateur": {
"indicateur": "specialNitrates",
"note": 100
}
}
},
{
"year": 2025,
"nbTotal": 5,
"nbCompliant": 5,
"aggValuesList": [
{
"dateDonnee": "2025-02-13 09:55:00+01",
"valeur": 20
… (réponse tronquée)
5. Étape 3 — les datasets du territoire
v_conf_territory_obs_datasets liste les datasets configurés pour un
territoire — c'est la source du sélecteur de dataset du front :
GET /api/v2/v_conf_territory_obs_datasets.json?id_territoire=1
23 datasets configurés pour le territoire 1 : nom (obsDataset), métadonnées et paramétrage — la liste à proposer dans le sélecteur de dataset.
[
{
"territoryId": 1,
"obsDataset": "ades_mesures_qualite",
"obsDatasetMetadata": "{\"title\": \"Qualité des nappes d'eau souterraine - Hub'eau (ADES)\", \"history\": {\"lastUpdate\": \"2026-06-26\"}, \"sources\": [{\"producers\": [{\"producer_url\": \"\", \"producer_logo\": \"\", \"producer_name\": \"AE\"}], \"source_url\": \"https://hubeau.eaufrance.fr/page/api-qualite-nappes\", \"source_logo\": \"/images/icones/hubeau-api-quality-nappes.svg\", \"source_name\": \"Qualité des nappes d'eau souterraine\"}], \"descripteur\": \"AR\", \"description\": \"L'API Qualité des nappes d'eau souterraine permet d'accéder aux données de qualité physico-chimique des nappes d'eau souterraine françaises, issues de la banque nationale d’Accès aux Données sur les Eaux Souterraines- ADES.\"}"
},
{
"territoryId": 1,
"obsDataset": "ecoulements_fusion_onde",
"obsDatasetMetadata": "{\"title\": \"Ecoulements ONDE et suivis locaux\", \"history\": {\"lastUpdate\": \"2025-06-10\", \"updateMethode\": \"continue\"}, \"sources\": [{\"producers\": [{\"producer_url\": \"\", \"producer_logo\": \"\", \"producer_name\": \"OFB,FVPPMA, EPTB Sèvre Nantaise\"}], \"source_url\": \"\", \"source_logo\": \"\", \"source_name\": \"Ecoulement suivi divers sources (Ondes et suivis locaux)\"}], \"descripteur\": \"AR\", \"description\": \"Ecoulement suivi divers sources (Ondes et suivis locaux)\"}"
},
{
"territoryId": 1,
"obsDataset": "ecoulements_sysma_eptbsn",
"obsDatasetMetadata": "{\"title\": \"Ecoulements EPTBSN Sysma (suivis
… (réponse tronquée)
6. Étape 4 — représentations disponibles (paramètres et objectifs)
obs_searches renvoie les paramètres disponibles pour un (ou plusieurs)
datasets, filtrés par un fragment de nom, avec leurs objectifs de qualité et
les représentations (processing) qui leur sont associées. C'est le point
d'entrée pour alimenter les listes de choix.
Paramètres utiles : id_territoire, ids_datasets,
search_entry_parameter_string_part (fragment du nom du paramètre),
search_limit (nombre max de résultats).
Sans fragment, la recherche renvoie les premiers paramètres du dataset :
GET /api/v2/obs_searches.json?id_territoire=1&ids_datasets=qualite_eaux_surf_support_eau&search_limit=10
Sans fragment de recherche : premiers paramètres du dataset (search_limit) — source des listes de choix paramètre/objectif du front.
[
{
"id_parametre": 7597,
"parametre": "10,11-dihydro-10,11-dihydroxy-carbamazépine",
"unite": "µg/L",
"dataset": "qualite_eaux_surf_support_eau",
"obsDatasetMetadata": {
"title": "Qualité des eaux superficielles (support eau brute) - Hub'eau (Naïades)",
"history": {
"lastUpdate": "2026-09-10"
},
"sources": [
{
"producers": [
{
"producer_url": "",
"producer_logo": "",
"producer_name": "AE"
}
],
"source_url": "https://hubeau.eaufrance.fr/page/api-qualite-cours-deau",
"source_logo": "/images/icones/hubeau-api-quality.svg",
"source_name": "hubeau, Qualité des cours d'eau"
}
],
"descripteur": "AR",
"description": "osur pc paramètre seulement sur le support eau brute"
},
"ids_objectifs": []
},
{
"id_parametre": 7947,
"parametre": "10:2 FTCA",
"unite": "µg/L",
"dataset": "qualite_eaux_surf_support_eau",
"obsDatasetMetadata": {
"title": "Qualité des eaux superficielles (support eau brute) - Hub'eau (Naïades)",
"history": {
"lastUpdate": "2026-09-10"
},
"sources": [
{
"producers": [
{
"producer_url": "",
"producer_logo": "",
"producer_name": "AE"
}
],
"source_url": "https://hubeau.eaufrance.fr/page/api-qualite-cours-deau",
"source_logo": "/images/icones/hubeau-api-quality.svg",
"source_name": "hubeau, Qualité des cours d'eau"
}
],
"descripteur": "AR",
"description": "osur pc paramètre seulement sur le support eau brute"
},
"ids_objectifs": [
{
"id_conf_objectif": "9974",
"value": "0.007",
"inf_sup": "<=",
"reference": "PFAS TEST 0.007",
"objectiveCompliancyFunction": "100PourcentDuTemps",
"default_args": [],
"processing": "respect-objectif"
}
]
},
{
"id_parametre": 8003
… (réponse tronquée)
Avec un fragment (« phosph ») :
GET /api/v2/obs_searches.json?id_territoire=1&search_entry_parameter_string_part=phosph&ids_datasets=qualite_eaux_surf_support_eau&search_limit=10
Recherche les paramètres dont le nom contient le fragment « phosph » pour le dataset : source des listes de choix paramètre/objectif du front.
[
{
"id_parametre": 1238,
"parametre": "Phosphamidon",
"unite": "µg/L",
"dataset": "qualite_eaux_surf_support_eau",
"obsDatasetMetadata": {
"title": "Qualité des eaux superficielles (support eau brute) - Hub'eau (Naïades)",
"history": {
"lastUpdate": "2026-09-10"
},
"sources": [
{
"producers": [
{
"producer_url": "",
"producer_logo": "",
"producer_name": "AE"
}
],
"source_url": "https://hubeau.eaufrance.fr/page/api-qualite-cours-deau",
"source_logo": "/images/icones/hubeau-api-quality.svg",
"source_name": "hubeau, Qualité des cours d'eau"
}
],
"descripteur": "AR",
"description": "osur pc paramètre seulement sur le support eau brute"
},
"ids_objectifs": [
{
"id_conf_objectif": "11498",
"value": "0.1",
"inf_sup": "<=",
"reference": "SAGE SN 2015",
"objectiveCompliancyFunction": "100PourcentDuTemps",
"default_args": [],
"processing": "respect-objectif"
}
]
},
{
"id_parametre": 7834,
"parametre": "Gomphosphaeria",
"unite": null,
"dataset": "qualite_eaux_surf_support_eau",
"obsDatasetMetadata": {
"title": "Qualité des eaux superficielles (support eau brute) - Hub'eau (Naïades)",
"history": {
"lastUpdate": "2026-09-10"
},
"sources": [
{
"producers": [
{
"producer_url": "",
"producer_logo": "",
"producer_name": "AE"
}
],
"source_url": "https://hubeau.eaufrance.fr/page/api-qualite-cours-deau",
"source_logo": "/images/icones/hubeau-api-quality.svg",
"source_name": "hubeau, Qualité des cours d'eau"
}
],
"descripteur": "AR",
"description": "osur pc paramètre seulement sur le support eau brute"
},
"ids_objectifs": []
},
{
"id_parametre": 1349,
"parametre": "Polyphos
… (réponse tronquée)
Lecture de la réponse : id_parametre (à passer à obs_datasets via
ids_parametres), unite, métadonnées du dataset (obsDatasetMetadata :
titre, sources, producteurs) et ids_objectifs — chaque objectif porte sa
objectiveCompliancyFunction, son seuil (value, inf_sup) et sa
reference ; id_conf_objectif s'utilise via ids_objectifs.
7. Étape 5 — appeler les représentations (obs_datasets)
Chaque combinaison dataset × paramètre × objectif × processing se requiert via
obs_datasets. Les sous-sections suivantes illustrent les processings
courants. Variantes de format : .json, .csv (exports), .geojson (carte).
7.1 parameters — configuration des paramètres
GET /api/v2/obs_datasets.json?processing=parameters&dataset=qualite_eaux_surf_support_eau&ids_parametres=1340
Information sur le parametre donné
{
"meta": {
"dataset": "qualite_eaux_surf_support_eau",
"processing": "parameters",
"idTerritoire": "1",
"count": 1
},
"data": [
{
"idParametre": 1340,
"parametre": "Nitrates",
"unite": "mg(NO3)/L",
"lbunite": "milligramme de nitrate par litre",
"natparametre": "2",
"typeparametre": "2",
"lbcourtparametre": "NO3-",
"cdunite": "173",
"forceConvToTargetUnitForEauxSurfSupportEau": true
}
]
}
7.2 datas — données brutes horodatées
GET /api/v2/obs_datasets.json?processing=datas&dataset=qualite_eaux_surf_support_eau&id_territoire=1&ids_parametres=1340&date_debut=2025-01-01&date_fin=2025-12-31
Valeurs brutes par station (idObjetgeo, valeur, dateDonnee) — la matière première de vos graphiques et tableaux.
{
"meta": {
"dataset": "qualite_eaux_surf_support_eau",
"processing": "datas",
"idTerritoire": "1",
"count": 423
},
"data": [
{
"idObjetgeo": "04137695",
"idParametre": "1340",
"valeur": 11.5,
"dateDonnee": "2025-03-05 08:30:00+01"
},
{
"idObjetgeo": "04137695",
"idParametre": "1340",
"valeur": 14.1,
"dateDonnee": "2025-05-21 08:52:00+02"
},
{
"idObjetgeo": "04137695",
"idParametre": "1340",
"valeur": 14.7,
"dateDonnee": "2025-07-09 08:30:00+02"
},
{
"idObjetgeo": "04137695",
"idParametre": "1340",
"valeur": 13.4,
"dateDonnee": "2025-08-01 08:00:00+02"
},
{
"idObjetgeo": "04137695",
"idParametre": "1340",
"valeur": 14.9,
"dateDonnee": "2025-09-17 08:25:00+02"
},
{
"idObjetgeo": "04137695",
"idParametre": "1340",
"valeur": 14.3,
"dateDonnee": "2025-12-17 08:30:00+01"
},
{
"idObjetgeo": "04137900",
"idParametre": "1340",
"valeur": 13.7,
"dateDonnee": "2025-03-12 13:45:00+01"
},
{
… (réponse tronquée)
7.3 datas-stats — statistiques descriptives
GET /api/v2/obs_datasets.json?processing=datas-stats&dataset=qualite_eaux_surf_support_eau&id_territoire=1&ids_parametres=1340&date_debut=2025-01-01&date_fin=2025-12-31
Statistiques par station ; le retour de cet appel peut évoluer. il de suit pas le formaliser data[].
{
"meta": {
"dataset": "qualite_eaux_surf_support_eau",
"processing": "datas-stats",
"idTerritoire": "1",
"count": 0
},
"data": [],
"globals": {
"all": {
"count": 423,
"sum": 6301.59,
"mean": 14.897375886524824,
"median": 13,
"min": 0.1,
"max": 80,
"quartile1": 4.5,
"quartile2": 13,
"quartile3": 21,
"quantile001": 0.31,
"quantile005": 0.5,
"quantile010": 1.2,
"quantile090": 30,
"quantile095": 36,
"quantile099": 59,
"variance": 159.42066143554135,
"standardDeviation": 12.626189505767025,
"firstDate": "2025-01-13T13:37:00+01:00",
"lastDate": "2025-12-23T10:38:00+01:00",
"yearCumulativeSum": 6301.59,
"yearCumulativeCount": 423,
"yearCumulativeMean": 14.897375886524824,
"yearCumulativeMin": 0.1,
"yearCumulativeMax": 80
},
"metadata": {
"searchStartDate": "2025-01-01T00:00:00+00:00",
"searchEndDate": "2025-12-
… (réponse tronquée)
7.4 presence-de-donnees-brutes — disponibilité des mesures
GET /api/v2/obs_datasets.json?processing=presence-de-donnees-brutes&dataset=qualite_eaux_surf_support_eau&id_territoire=1&ids_parametres=1340&date_debut=2025-01-01&date_fin=2025-12-31&output_options=with_labels
Liste les stations ayant des données brutes sur la période (53 stations en 2025 pour les nitrates) — utile pour les compteurs et cartes de disponibilité.
{
"meta": {
"dataset": "qualite_eaux_surf_support_eau",
"processing": "presence-de-donnees-brutes",
"idTerritoire": "1",
"count": 53
},
"data": [
{
"idObjetgeo": "04137695",
"idParametre": "1340",
"objetgeo": "SEVRE NANTAISE à VERNOUX-EN-GATINE",
"parametre": "Nitrates",
"unite": "mg(NO3)/L",
"isRawData": 1,
"classe": {
"debug": {
"type": "getStdClasseDefaultProcessingLegend",
"colorCode": "D"
},
"radius": 8,
"weight": 1,
"opacity": 0.9,
"color": "#000000",
"fillColor": "#9F9F9F",
"fillOpacity": 0.9,
"strokeWidth": 1.5,
"classe": "D",
"libel": "Station ayant des données",
"comment": "",
"debugIndicateur": {
"indicateur": "IsRawData",
"note": 1
}
}
},
{
"idObjetgeo": "04137900",
"idParametre": "1340",
"objetgeo": "SEVRE NANTAISE à SAINT-JOUIN-DE-MILLY",
"parametre": "Nitrates",
"unite": "mg(NO3)/L",
"isRawData": 1,
"classe": {
… (réponse tronquée)
7.5 classes — classification des valeurs d'une station
GET /api/v2/obs_datasets.json?processing=classes&dataset=qualite_eaux_surf_support_eau&id_territoire=1&ids_objets_geo=04146150&ids_parametres=1340&date_debut=2015-01-01&date_fin=2026-12-31&output_options=with_labels,with_ObsDataset_conf,with_data_source_obs_extract_json
Classes de qualité calculées pour une station, avec la configuration du dataset et la source des données (with_data_source_obs_extract_json).
{
"meta": {
"dataset": "qualite_eaux_surf_support_eau",
"processing": "classes",
"idTerritoire": "1",
"count": 57
},
"ObsDataset": {
"obsDataset": "qualite_eaux_surf_support_eau",
"confTableData": {
"confTableData": "qualite_eaux_surf_support_eau",
"dataTablePath": "r030_qualite_eaux_surf.v_qt_eaux_support_eau_with_obs_extract_and_cumul",
"geoObjectIdFieldNameIntoDataTable": "id_objetgeo",
"parameterIdFieldNameIntoDataTable": "id_parametre",
"valueFieldNameIntoDataTable": "valeur",
"dateFieldNameIntoDataTable": "date_donnee",
"metadata": "{\"title\": \"Qualité des eaux superficielles (support eau brute)\", \"history\": {\"lastUpdate\": \"2026-09-10\"}, \"sources\": [{\"producers\": [{\"producer_url\": \"\", \"producer_logo\": \"\", \"producer_name\": \"AE\"}], \"source_url\": \"https://hubeau.eaufrance.fr/page/api-qualite-cours-deau\", \"source_logo\": \"/images/icones/hubeau1.png\", \"source_name\": \"hubeau, Qualité des cours d'eau\"}], \"descripteur\": \"AR\", \"description\": \"osur pc paramètre seulement sur le support eau brute\"}",
"createdAt": "2025-06-26T22:20:22+00:00",
"updatedAt": "2023-09-07T16:29:30+00:00"
},
"confTableParameter": {
"confTableParameter": "qualite_eaux_sur
… (réponse tronquée)
7.6 respect-objectif — conformité à un objectif
Données agrégées (JSON) :
GET /api/v2/obs_datasets.json?processing=respect-objectif&dataset=qualite_eaux_surf_support_eau&id_territoire=1&ids_objectifs=6190&ids_parametres=1340&date_debut=2025-01-01&date_fin=2025-12-31&output_options=with_labels
Agrégats de conformité par station (nbTotal, percentageCompliant…) avec les valeurs mesurées (aggValuesList) et la classe de style calculée.
{
"meta": {
"dataset": "qualite_eaux_surf_support_eau",
"processing": "respect-objectif",
"idTerritoire": "1",
"count": 202
},
"data": [
{
"year": 2025,
"nbTotal": 6,
"nbCompliant": 6,
"aggValuesList": [
{
"dateDonnee": "2025-03-05 08:30:00+01",
"valeur": 11.5
},
{
"dateDonnee": "2025-05-21 08:52:00+02",
"valeur": 14.1
},
{
"dateDonnee": "2025-07-09 08:30:00+02",
"valeur": 14.7
},
{
"dateDonnee": "2025-08-01 08:00:00+02",
"valeur": 13.4
},
{
"dateDonnee": "2025-09-17 08:25:00+02",
"valeur": 14.9
},
{
"dateDonnee": "2025-12-17 08:30:00+01",
"valeur": 14.3
}
],
"idObjetgeo": "04137695",
"objetgeo": "SEVRE NANTAISE à VERNOUX-EN-GATINE",
"idParametre": "1340",
"parametre": "Nitrates",
"unite": "mg(NO3)/L",
"objectiveCompliancyFunction": "specialNitrates",
"idConfObjectif": "6190",
"seuilObjectif": 25,
"nbNotCompliant": 0,
"percentageCompliant": 100,
"percentageNotCompliant": 0,
"overallCompliancy": "yes",
"percentageAverageWrtObjective": 55.27,
"couleurPubli": "vert1",
"classe": {
"debug": {
"type": "getStdClassePourcentageRespectObjectif4c",
"colorCode": "green"
},
"radius": 8,
"weight": 1,
"opacity": 0.9,
"color": "#000000",
"fillColor": "#B3CC00",
"fillOpacity": 0.45,
"strokeWidth": 1.5,
"classe": "V",
"libel": "Respect (moins de 10% de dépa
… (réponse tronquée)
Variante carte — format .geojson + with_geometry_geojson_for_map :
chaque feature embarque sa géométrie (EPSG:4326), son style et la cible de
popup (popupButtonOnClickTarget) — directement consommable par Leaflet.
GET /api/v2/obs_datasets.geojson?processing=respect-objectif&dataset=qualite_eaux_surf_support_eau&id_territoire=1&ids_objectifs=6190&ids_parametres=1340&date_debut=2025-01-01&date_fin=2025-12-31&output_options=with_labels,with_geometry_geojson_for_map
Requête en format .geojson : chaque feature embarque sa géométrie (EPSG:4326), son style de rendu et la cible de popup.
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"style": {
"radius": 8,
"fillColor": "#9F9F9F",
"color": "#000000",
"strokeWidth": 1.5,
"weight": 1,
"opacity": 0.3,
"fillOpacity": 0.05
},
"properties": {
"year": 2025,
"idParametre": "1340",
"parametre": "Nitrates",
"nbTotal": 0,
"asHistoricalDatas": true,
"percentageAverageWrtObjective": -1,
"name": "SEVRE NANTAISE à VERNOUX-EN-GATINE",
"id": "04137700",
"debug": {
"niveau1": {
"type": "getStdClassePourcentageRespectObjectif4c",
"colorCode": "noData"
},
"niveau2": {
"indicateur": "specialNitrates"
}
},
"popupButtonOnClickTarget": "https://obs21.sevre-nantaise.com/stationSheet?processing=respect-objectif&dataset=qualite_eaux_surf_support_eau&id_territoire=1&ids_parametres=1340&ids_objectifs=6190&date_debut=2015-01-01&date_fin=2026-12-31&ids_objets_geo=04137700&parent_date_debut=2025-01-01&parent_date_fin=2025-12-31"
},
"geometry": {
"type": "Point",
"crs": {
"type": "name",
"properties": {
"name": "EPSG:4326"
}
},
"coordinates": [
-0.517176648,
46.634337184
]
}
},
{
"type": "Feature",
"style": {
"radius": 8,
"fillColor": "#9F9F9F",
"color": "#000000",
"strokeWidth": 1.5,
"weight": 1,
"opacity": 0.3,
"fillOpacity": 0.05
},
"properties": {
"year": 2025,
"idParametre": "1340",
"parametre": "Nitrates",
"nbTotal": 0,
"asHistoricalDatas": true,
"percentageAverageWrtObjective": -1,
"nam
… (réponse tronquée)
Variante légende — output_options=for_legend : classes de légende
calculées (couleurs, libellés, effectifs, icônes SVG) sans recalcul côté front.
GET /api/v2/obs_datasets.json?processing=respect-objectif&dataset=qualite_eaux_surf_support_eau&id_territoire=1&ids_objectifs=6190&ids_parametres=1340&date_debut=2025-01-01&date_fin=2025-12-31&output_options=for_legend
output_options=for_legend ajoute les classes de légende calculées : couleurs, libellés, effectifs et icônes — sans recalcul côté front.
{
"meta": {
"dataset": "qualite_eaux_surf_support_eau",
"processing": "respect-objectif",
"idTerritoire": "1",
"count": 0
},
"classeType": "classeDeRespectObjectif",
"data": [],
"dataProcessingClasseType": "specialNitrates",
"effectifs": {
"totalAvecValeur": 53,
"total": 202
},
"name": "specialNitrates",
"shape": "circle",
"values": [
{
"debug": {
"type": "getStdClassePourcentageRespectObjectif4c",
"colorCode": "green"
},
"radius": 8,
"weight": 1,
"opacity": 0.9,
"color": "#000000",
"fillColor": "#B3CC00",
"fillOpacity": 0.9,
"strokeWidth": 1.5,
"classe": "V",
"libel": "Respect (moins de 10% de dépassements)",
"comment": "",
"debugIndicateur": {
"indicateur": "specialNitrates",
"note": 100
},
"effectif": 29,
"percentEffectif": 54.72
},
{
"debug": {
"type": "getStdClassePourcentageRespectObjectif4c",
"colorCode": "yellow"
},
"radius": 8,
"weight": 1,
"opacity": 0.9,
"color": "#000000",
"fillColor": "#FFB000",
"fillOpacity": 0.9,
"strokeWidth": 1.5,
"classe": "J",
"libel": "Non respect (de 10% à 40% de dépassements)",
"comment": "",
"debugIndicateur": {
"indicateur": "specialNitrates",
"note": 61
},
"effectif": 16,
"percentEffectif": 30.19
},
{
"debug": {
"type": "getStdClassePourcentageRespectObjectif4c",
"colorCode": "orange"
},
"radius": 8,
"weight": 1,
… (réponse tronquée)
Variante graphique « fiche station » — restreinte à une station
(ids_objets_geo) sur plusieurs années : aggValuesList (série date/valeur)
- agrégats de conformité, directement représentable (Plotly, Chart.js…).
GET /api/v2/obs_datasets.json?processing=respect-objectif&dataset=qualite_eaux_surf_support_eau&id_territoire=1&ids_objectifs=6190&ids_parametres=1340&ids_objets_geo=04145000&date_debut=2024-01-01&date_fin=2025-12-31&output_options=with_labels
Restreinte à une station (ids_objets_geo) sur 2 ans : une ligne par année avec la série aggValuesList (date/valeur) et les agrégats de conformité.
{
"meta": {
"dataset": "qualite_eaux_surf_support_eau",
"processing": "respect-objectif",
"idTerritoire": "1",
"count": 2
},
"data": [
{
"year": 2024,
"nbTotal": 11,
"nbCompliant": 9,
"aggValuesList": [
{
"dateDonnee": "2024-06-20 13:23:00+02",
"valeur": 7.6
},
{
"dateDonnee": "2024-12-19 13:05:00+01",
"valeur": 28
},
{
"dateDonnee": "2024-01-22 14:00:00+01",
"valeur": 25
},
{
"dateDonnee": "2024-03-28 09:45:00+01",
"valeur": 20
},
{
"dateDonnee": "2024-04-19 12:19:00+02",
"valeur": 18
},
{
"dateDonnee": "2024-05-29 14:15:00+02",
"valeur": 18
},
{
"dateDonnee": "2024-07-25 14:13:00+02",
"valeur": 4.7
},
{
"dateDonnee": "2024-08-22 15:10:00+02",
"valeur": 1.2
},
{
"dateDonnee": "2024-09-16 12:26:00+02",
"valeur": 2.5
},
{
"dateDonnee": "2024-10-18 14:09:00+02",
"valeur": 27
},
{
"dateDonnee": "2024-11-18 09:36:00+01",
"valeur": 22
}
],
"idObjetgeo": "04145000",
"objetgeo": "MAINE à CHATEAU-THEBAUD",
"idParametre": "1340",
"parametre": "Nitrates",
"unite": "mg(NO3)/L",
"objectiveCompliancyFunction": "specialNitrates",
"idConfObjectif": "6190",
"seuilObjectif": 25,
"nbNotCompliant": 2,
"percentageCompliant": 81.82,
"percentageNotCompliant": 18.180000000000007,
"overallCompliancy": "no",
"percentageAverageWrtObjective": 63.27,
"couleurPubli": "jaune",
"classe": {
"debug": {
"type": "getStdClassePourcentageRespectObjectif4c",
"colorCode": "yellow"
},
"radius": 8,
"weight": 1,
"o
… (réponse tronquée)
7.7 respect-multi-objectifs — plusieurs objectifs en une requête
GET /api/v2/obs_datasets.json?processing=respect-multi-objectifs&dataset=qualite_eaux_surf_support_eau&id_territoire=1&ids_objectifs=9957&ids_parametres=9900020&ids_objets_geo=04145000&date_debut=2025-01-01&date_fin=2025-12-31&output_options=with_labels
Conformité évaluée contre plusieurs objectifs cumulés (ici paramètre 9900020, objectif 9957) sur une station — une ligne par résultat.
{
"meta": {
"dataset": "qualite_eaux_surf_support_eau",
"processing": "respect-multi-objectifs",
"idTerritoire": "1",
"count": 1
},
"data": {
"2025": {
"04145000": {
"5347": {
"nbTotal": 4,
"nbCompliant": 4,
"aggValuesList": [
{
"dateDonnee": "2025-12-23 11:22:00+01",
"valeur": 0.001
},
{
"dateDonnee": "2025-09-16 11:25:00+02",
"valeur": 0.005
},
{
"dateDonnee": "2025-05-14 13:37:00+02",
"valeur": 0.001
},
{
"dateDonnee": "2025-03-11 10:59:00+01",
"valeur": 0.0016
}
],
"idObjetgeo": "04145000",
"objetgeo": "MAINE à CHATEAU-THEBAUD",
"idParametre": "5347",
"parametre": "Acide perfluoro-octanoïque (PFOA / formes linéaires et ramifiées)",
"unite": "µg/L",
"objectiveCompliancyFunction": "100Pourcent
… (réponse tronquée)
7.8 indicateur — valeur et style pré-calculés
GET /api/v2/obs_datasets.json?processing=indicateur&dataset=sdage_2028_edl_2025_esu&id_territoire=50&ids_objectifs=10254&ids_parametres=e_pc_acid&date_debut=2025-01-01&date_fin=2025-12-31&output_options=with_labels
Indicateurs prêts à l'affichage : la classe et son style Leaflet sont fournis. S'applique aux datasets à indicateurs (état des masses d'eau Sdage).
{
"meta": {
"dataset": "sdage_2028_edl_2025_esu",
"processing": "indicateur",
"idTerritoire": "50",
"count": 13
},
"data": [
{
"idObjetgeo": "FRGR0539B",
"idParametre": "e_pc_acid",
"valeur": "2",
"dateDonnee": "2025-07-01",
"categorieMe": "Cours d'eau",
"objetgeo": "L'ERDRE DEPUIS LE PLAN D'EAU DE L'ERDRE JUSQU'A L'ESTUAIRE DE LA LOIRE",
"parametre": "Etat Acidification ",
"unite": "",
"classe": {
"debug": {
"type": "getStdClasseMauvais2TresBon",
"colorCode": "green"
},
"radius": 8,
"weight": 1,
"opacity": 0.9,
"color": "#000000",
"fillColor": "#66E680",
"fillOpacity": 0.7200000000000001,
"strokeWidth": 1.5,
"classe": "V",
"libel": "Bon",
"comment": "",
"numericAttribution": 2,
"shape": "square",
"debugIndicateur": {
"indicateur": "classeEDL6Classes",
"note": "2"
}
}
},
{
"idObjetgeo": "FRGR0542",
"idParametre": "e_pc_acid",
"v
… (réponse tronquée)
8. Étape 6 — information sur les objectifs (v_conf_objectifs)
v_conf_objectifs détaille les objectifs de qualité d'un paramètre pour un
territoire : seuil, référence, fonction de conformité, couleurs publiées —
la source des fiches « objectif » et des contrôles de cohérence front :
GET /api/v2/v_conf_objectifs.json?id_territoire=1&dataset=qualite_eaux_surf_support_eau&ids_parametres=1340
Pour le paramètre 1340 (nitrates) : 8 objectifs avec seuil (value/inf_sup), référence (SAGE, PNEC…), fonction de conformité et couleurs publiées.
[
{
"confObjectiveId": "10195",
"confObjective": null,
"parameterId": "1340",
"obsDataset": "/api/v1/obs_datasets/qualite_eaux_surf_support_eau",
"value": "18",
"inf_sup": "<=",
"colorObjectiveAchieved": "green",
"colorObjectiveNotAchieved": "red",
"reference": "Directive Nitrates seuil 18",
"objectiveCompliancyFunction": "inferieur90PourcentDuTemps",
"defaultArgs": [],
"comment": null,
"createdAt": "2025-01-16T10:12:16+00:00",
"updatedAt": null,
"categorie": "DIRECTIVE-NITRATES",
"infSup": "<="
},
{
"confObjectiveId": "6190",
"confObjective": null,
"parameterId": "1340",
"obsDataset": "/api/v1/obs_datasets/qualite_eaux_surf_support_eau",
"value": "25",
"inf_sup": "<=",
"colorObjectiveAchieved": "green",
"colorObjectiveNotAchieved": "yellow",
"reference": "SAGE Sèvre Nantaise",
"objectiveCompliancyFunction": "specialNitrates",
"defaultArgs": [],
"comment": "Concentration en Nitrates <= 25 mg/l 90% du temps en 2021",
"createdAt": null,
"updatedAt": null,
"categorie": "SAGE-SN2015-CE-ET-PE-NO3",
"infSup": "<="
},
{
"confObjectiveId": "10196",
"confObjective": null,
"parameterId": "1340",
"obsDataset": "/api/v1/obs_datasets/qualite_eaux_surf_support_eau",
"value": "40",
"inf_sup": "<=",
"colorObjectiveAchieved": "green",
"colorObjectiveNotAchi
… (réponse tronquée)
9. Annexe
9.1 Processing disponibles (processing)
Liste alignée sur ObsDataset::PROCESSING_TYPE_ENUM (source de vérité du
Swagger) :
datas (données brutes), geoms (géométries), parameters
(configuration des paramètres), presence-de-donnees-brutes,
somme-presence-de-donnees-brutes, datas-stats (statistiques
pré-calculées), tendance, derniere-valeur, dernieres-valeurs,
respect-objectif, respect-multi-objectifs, classes, indicateur,
respect-multi-objectifs_WIP_FOR_TABLE,
objetsgeo-les-plus-proches, taux-quantification-all-v02,
compte-points-suivi-respect-objectif, compte-mesures-respect-objectif,
compte-points-suivi, PesticidesCumul_triPire,
molecules-au-dessus-n-ug-par-l, NQE-au-dessus-de-leur-objectif,
conf_table_data_content, conf_table_geom_content,
conf_table_parameter_content
Chaque code porte un libellé et une description français dans le Swagger UI
(section processing du endpoint obs_datasets).
9.2 output_options
| Code | Effet |
|---|---|
with_labels |
libellés humains (paramètre, objet géo…) dans la réponse |
with_geometry_geojson |
géométries GeoJSON brutes |
with_geometry_geojson_for_map |
géométries + styles + cibles de popup (carte) |
with_geometry_WKB / with_geometry_WKT |
géométries binaires/texte PostGIS |
for_legend / for_legendCSV |
classes et effectifs de légende |
for_table |
format adapté aux tableaux |
with_ObsDataset_conf |
configuration du dataset (champs, tables) |
with_data_source_obs_extract_json |
source des données (producteur, support…) |
9.3 Noms canoniques v2 et alias acceptés
Pour un nouveau front, utilisez les noms canoniques ci-dessous (cohérents
entre endpoints). En v2, les noms historiques restent acceptés tels quels, et
une requête envoyant un nom canonique est éventuellement redirigée (302)
vers l'URL historique que lit l'API — suivez la redirection (curl -L,
fetch suit automatiquement). La v1 n'est pas concernée.
| Endpoint v2 | Nom canonique recommandé | Nom historique accepté |
|---|---|---|
obs_datasets, conf_objectifs, v_conf_objectifs, v_conf_territory_filters… |
dataset |
— (déjà canonique) |
v_conf_territory_obs_datasets |
dataset |
obs_dataset |
conf_parameter_extensions |
ids_parametres, id_conf_table_parameter |
parameter_id, conf_table_parameter |
v_conf_territory_filters, v_conf_territory_filter_generics |
filtre_territoire_categorie_objet_id |
filter_categorie_object_id |
obs_searches |
search_entry_string_part_limit, search_entry_ids_parametres |
string_part_search_limit, search_entry_ids_parameters |
v_conf_territories |
id_objetgeo |
ids_objetgeo |
Exemple de redirection :
GET /api/v2/v_conf_territory_obs_datasets.json?id_territoire=1&dataset=qualite_eaux_surf_support_eau
→ 302 Location: …/v_conf_territory_obs_datasets.json?id_territoire=1&obs_dataset=qualite_eaux_surf_support_eau
→ 200 […]
Incohérences de nommage connues, à ne pas reproduire dans de nouveaux usages
(documentées pour lecture du code) : parameter_id/conf_table_parameter
(conf_parameter_extensions), filter_categorie_object_id
(v_conf_territory_filters), string_part_search_limit et
search_entry_ids_parameters (obs_searches). Deux notions de filtre géo
coexistent : geom_filter (obs_geoprocessings) et id_filtre_territoire
(obs_datasets).
9.4 Erreurs
Les erreurs sont renvoyées en JSON structuré :
{ "title": "An error occurred", "detail": "…", "status": 404, "instance": null }
10. Cartes et couches géo de contextualisation
flowchart LR
T["v_conf_territories<br/>idSysCarte (carte par défaut)"]
CM["ConfMap — id_carte<br/>centre, zoom, libellé"]
L["conf_table_geo_link_conf_maps<br/>layerOrder, visible, layerOptions.style"]
TG["ConfTableGeo<br/>couche géo"]
T -.-> CM
CM -->|"1..n"| L
L -->|"confTableGeo"| TG
10.1 La carte (id_carte)
Une « carte » est un objet de configuration référencé par id_carte :
conf_maps/{id}: libellé, centre (defaultCenterX/Y), niveaux de zoom par défaut/min/max — de quoi initialiser la vue ;conf_table_geo_link_conf_maps?id_carte=…: couches de fond attachées à la carte, avec leur ordre (layerOrder), leur visibilité et leur style (layerOptions.style). Chaque couche se charge via/api/v2/conf_table_geos/{confTableGeo}/geoms.
Info sur le territorie
GET /api/v2/v_conf_territories/1.json
idObjetgeo est la valeur à passer en id_territoire ; idSysCarte identifie la carte par défaut, les champs link… alimentent l'habillage.
{
"idObjetgeo": 1,
"objetgeo": "EPTB SEVRE NANTAISE",
"idSysCarte": 1,
"linkLogoStructure": "../images/logo_eptbsn_240.png",
"linkWebSiteStructure": "https://www.sevre-nantaise.com/",
"structureSigle": "EPTBSN",
"linkWebSiteObsStructure": "https://obs21.sevre-nantaise.com/territoire/eptbsn",
"geom": "01060000206A08000001000000010300000001000000020800000D24FDCB3E691A418C4FFFBF163E5941F711D7FFCF681A41EF1EF71F173E5941B1DB149ADB681A41FC4710A0123E5941D46667CDC8661A41BBC6FA7FFA3D5941C3D2D50060651A41819B0920F33D594168A87DCDFC631A41FB06FD5FF53D594158839000C6621A41F8A7F37FFC3D59412739EE3313621A411658F75F063E5941A5EE989A63611A415F4CEFDF243E594135BB216752611A4143680AE05A3E5941D5123534E9601A4119AFF25F6E3E5941EAFE54CD2A601A417CE9F07F783E59413C1D9898275F1A413EA9EE9F7D3E5941267F1E67C25D1A41599B0E40903E5941EFE81F330D5C1A4178D6EE3FC23E5941E2FD3034AF591A41ECC41180EA3E5941BF5352993B571A4102C2F6FF273F594143AD9732BF561A41EC660E60433F59417196A466D8571A41CAED00A0883F5941FB9384328F571A41809011A09D3F5941F22F31FFF7551A41EE13FF9FC13F59417562DFCDBA541A41CDA40E00D53F594142F3C7656E521A414E0FF9BFEB3F59413E0C789A49501A41CA8FFD7FE13F594194D35D33514E1A413A880E60DD3F5941820BB7CC224B1A410271F67FE33F594112EC3734BD481A41276BF2BFF23F59418B2DF3FFC3401A417BB4058036405941FA1D65993B401A4175EAF5DF33405941334AAC984B391A411A5B0840654059415F1FCE3221331A410E73020087405941655AAD9935301A41066AEE5FA44059415A2701670E2D1A41513E1080A440594125CB0001322A1A415EC603609E4059410B5160FF8F271A41CAA903C0A6405941C7803BCD0C261A41CF340F60C9405941660A8732A7231A4156FE0200D9405941AD202C99811F1A4153E9F17FE5405941D58836343F1E1A412CE61020EE4059411547FDCC981D1A414A16FDBFFA4059411513E832D31B1A415E3E0DC00A4159417D8B5EFFAF1A1A4175DA08A00C415941270AA99957181A416987FC9F24415941B26D26997F161A41B5BAF81F23415941963AB23313151A41DC5EFF1F1C4159417364343307131A41313BFDDF18415941F51AC03293101A41BF3907E0344159410369DECB0C0E1A413AB0EE7F5C41594180F882FF2F0C1A417C10F63F70415941457B340056081A41314800807B4159416714969ADB061A
… (réponse tronquée)
configuration de la carte par défaut du territoire
GET /api/v2/conf_maps/1.json
Centre (defaultCenterX/Y) et niveaux de zoom par défaut/min/max : de quoi initialiser la vue de la carte.
{
"confMapId": 1,
"mapLabel": "Carte des cours d'eau Sèvre Nantaise",
"defaultCenterX": "-1",
"defaultCenterY": "46.92",
"defaultZoom": 10,
"minZoom": 0,
"maxZoom": 15,
"comment": null,
"createdAt": "2022-11-14T16:46:22+00:00",
"updatedAt": null
}
Liste des couches vectorielles de fond à ajouter (yc nom des confTableGeo, ordre des couche et styles)
GET /api/v2/conf_table_geo_link_conf_maps.json?id_carte=1
Couches géo attachées à la carte : ordre d'affichage (layerOrder), visibilité et style Leaflet (layerOptions.style).
[
{
"confMapId": 1,
"confTableGeo": "carthage_sousbv_selec",
"layerOrder": 2,
"visible": 1,
"layerOptions": {
"style": {
"fill": false,
"color": "#000000",
"weight": 1
}
},
"createdAt": "2022-11-14T17:08:26+00:00",
"updatedAt": null
},
{
"confMapId": 1,
"confTableGeo": "carthage_cours_eau",
"layerOrder": 1,
"visible": 1,
"layerOptions": {
"style": {
"color": "#5CAEFF",
"weight": 1
}
},
"createdAt": "2022-11-14T17:08:26+00:00",
"updatedAt": null
}
]
Obtention des couches
Une première couche
GET /api/v2/conf_table_geos/carthage_sousbv_selec/geoms
Geometries pour Leaflet avec style configuré
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {
"id_objetgeo": "5",
"objetgeo": "Bassin de la Sanguèze",
"geo_table_label": "Sous-bassins de la Sèvre Nantaise"
},
"geometry": {
"type": "MultiPolygon",
"crs": {
"type": "name",
"properties": {
"name": "EPSG:4326"
}
},
"coordinates": [
[
[
[
-1.073859876,
47.132076911
],
[
-1.074523489,
47.131891248
],
[
-1.075525794,
47.131589982
],
[
-1.076227871,
47.131371411
],
[
-1.076961293,
47.131043545
],
[
-1.077645487,
47.130
… (réponse tronquée)
Une seconde couche
GET /api/v2/conf_table_geos/carthage_cours_eau/geoms
Geometries pour Leaflet avec style configuré
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {
"id_objetgeo": "M7415300",
"objetgeo": "la Lignée",
"geo_table_label": "Cours d'eau, BD Carthage"
},
"geometry": {
"type": "MultiLineString",
"crs": {
"type": "name",
"properties": {
"name": "EPSG:4326"
}
},
"coordinates": [
[
[
-1.096893672,
46.936101593
],
[
-1.097868651,
46.93594069
],
[
-1.099092709,
46.93554101
],
[
-1.099806092,
46.935384894
],
[
-1.100264562,
46.935373079
],
[
-1.101537397,
46.935737979
],
[
-1.102393094,
… (réponse tronquée)
Document généré depuis doc/api/guide-front.template.md par
php doc/api/generate.php (exemples : doc/api/doc-scenarios.php) — éditez
le template, pas ce fichier.