{
  "_comment": "Config unique pilotant urbanisme.html : endpoints (base URLs), theme (palette nommée), groups (catégories du menu carte : exclusif/repliable), sources[] (chaque source déclare jusqu'à 2 facettes indépendantes — mapLayer = affichage en plan, ficheBlock = résumé dans la fiche parcelle — plus l'API commune aux deux). Ajouter/modifier une source ne touche jamais au code, sauf les quelques flux trop spécifiques listés en mode 'custom' (voir CUSTOM_RENDERERS dans le HTML).",
  "corsProxy": "https://notion.ifja.workers.dev/proxy?url=",
  "wmtsBase": "https://data.geopf.fr/wmts",
  "attribution": "IGN-F / Géoplateforme",
  "endpoints": {
    "apicarto": "https://apicarto.ign.fr/api",
    "georisques": "https://www.georisques.gouv.fr/api/v1",
    "georisquesWms": "https://www.georisques.gouv.fr/services",
    "overpass": "https://overpass-api.de/api/interpreter",
    "geo": "https://geo.api.gouv.fr",
    "ban": "https://api-adresse.data.gouv.fr",
    "datagouv": "https://www.data.gouv.fr/api/1",
    "tabular": "https://tabular-api.data.gouv.fr/api",
    "annuaire": "https://api-lannuaire.service-public.fr/api/records/1.0/search/?dataset=api-lannuaire-administration",
    "gpuMap": "https://www.geoportail-urbanisme.gouv.fr/map",
    "gpuDownload": "https://www.geoportail-urbanisme.gouv.fr/document/download-by-partition",
    "popCulture": "https://www.pop.culture.gouv.fr/search/list",
    "bdcavite": "https://fiches-risques.brgm.fr/georisques/cavite/",
    "altimetrie": "https://data.geopf.fr/altimetrie/1.0/calcul/alti/rest/elevation.json",
    "openMeteo": "https://archive-api.open-meteo.com/v1/era5",
    "ademeDpe": "https://data.ademe.fr/data-fair/api/v1/datasets/dpe03existant/lines",
    "ademeObservatoire": "https://observatoire-dpe-audit.ademe.fr/",
    "dvf": "https://app.dvf.etalab.gouv.fr/",
    "adau": "https://www.service-public.fr/particuliers/vosdroits/R52221",
    "georisquesRapport": "https://www.georisques.gouv.fr/mes-risques/connaitre-les-risques-pres-de-chez-moi/rapport2",
    "georisquesV2": "https://notion.ifja.workers.dev/georisques-v2",
    "rnb": "https://rnb-api.beta.gouv.fr/api/alpha",
    "geopfWfs": "https://data.geopf.fr/wfs/ows",
    "enedisDataFair": "https://opendata.enedis.fr/data-fair/api/v1/datasets",
    "rics76Wfs": "https://carto2.geo-ide.din.developpement-durable.gouv.fr/rest-api/qgis/fde9e71e-83be-4e63-a8ec-9d6e587ed006"
  },
  "theme": {
    "colors": {
      "reglementaire": "#6A1B9A",
      "risqueNaturel": "#4E342E",
      "risqueMvt": "#D84315",
      "reseauxEnergie": "#1565C0",
      "reseauxEnergieHta": "#EF6C00",
      "reseauxEau": "#6D4C41",
      "reseauxGaz": "#F9A825",
      "hydrantOsm": "#B71C1C",
      "hydrantRegional": "#4A148C",
      "transports": "#2E7D32"
    }
  },
  "groups": {
    "Fond": {
      "exclusive": true,
      "collapsible": true,
      "defaultOpen": true,
      "menuLabel": "Fonds"
    },
    "Relief": {
      "exclusive": true,
      "overlay": true,
      "collapsible": true,
      "emptyLabel": "Aucun relief",
      "defaultOpen": false,
      "menuLabel": "Relief"
    },
    "Cadastre & terrain": {
      "collapsible": true,
      "defaultOpen": false
    },
    "Nature": {
      "collapsible": true,
      "defaultOpen": false
    },
    "Réglementaire": {
      "collapsible": true,
      "defaultOpen": false
    },
    "Réseaux / DECI": {
      "collapsible": true,
      "defaultOpen": false
    },
    "Transports": {
      "collapsible": true,
      "defaultOpen": false
    }
  },
  "ficheGroups": {
    "risques": {
      "tab": "parc",
      "title": "Risques (Géorisques)"
    },
    "abf": {
      "tab": "parc",
      "title": "Monuments historiques / ABF"
    }
  },
  "sources": [
    {
      "key": "parcelle",
      "label": "Parcelle cadastrale",
      "group": null,
      "ficheBlock": {
        "tab": "parc",
        "trigger": "parcelClick",
        "mode": "custom",
        "renderer": "parcelle",
        "title": "Parcelle cadastrale"
      }
    },
    {
      "key": "plu",
      "label": "Zonage PLU",
      "group": "Réglementaire",
      "api": [
        {
          "endpoint": "${apicarto}/gpu/zone-urba",
          "query": {
            "geom": "{geom}"
          },
          "kind": "geojson",
          "resultPath": "features"
        }
      ],
      "mapLayer": {
        "kind": "polygon",
        "trigger": "viewport",
        "minZoom": 14,
        "styleFn": "zoneColor",
        "weight": 1,
        "fillOpacity": 0.25,
        "popup": {
          "titleFields": [
            "libelle",
            "typezone"
          ],
          "descFields": [
            "libelong"
          ]
        }
      },
      "ficheBlock": {
        "tab": "parc",
        "trigger": "parcelClick",
        "mode": "chips",
        "title": "Zonage PLU",
        "labelFields": [
          "libelle",
          "typezone"
        ],
        "subLabelFields": [
          "libelong"
        ],
        "emptyMessage": "Pas de zonage à ce point (commune au RNU ou hors GPU)."
      },
      "menuTitle": "PLU",
      "menuSubtitle": "Zonage"
    },
    {
      "key": "presc",
      "label": "Prescriptions (EBC, arbres, bâti protégé…)",
      "group": null,
      "ficheBlock": {
        "tab": "parc",
        "trigger": "parcelClick",
        "mode": "custom",
        "renderer": "presc",
        "title": "Prescriptions (EBC, arbres, bâti protégé…)"
      }
    },
    {
      "key": "abf",
      "label": "Périmètre ABF (SUP AC1)",
      "group": "Réglementaire",
      "api": [
        {
          "endpoint": "${apicarto}/gpu/assiette-sup-s",
          "query": {
            "geom": "{geom}"
          },
          "kind": "geojson",
          "resultPath": "features",
          "filter": {
            "anyOfFields": [
              "categorie",
              "suptype",
              "typesup"
            ],
            "includes": [
              "AC1"
            ]
          }
        }
      ],
      "mapLayer": {
        "kind": "polygon",
        "trigger": "viewport",
        "minZoom": 13,
        "color": "#6A1B9A",
        "fillColor": "#8E24AA",
        "weight": 1.5,
        "fillOpacity": 0.15,
        "popup": {
          "mode": "abf"
        }
      },
      "ficheBlock": {
        "tab": "parc",
        "mergeInto": "abf",
        "trigger": "parcelClick",
        "mode": "abf",
        "labelFields": [
          "nomsuplitt",
          "libelle",
          "nom"
        ],
        "foundMessage": "En périmètre ABF",
        "emptyMessage": "Hors périmètre MH connu (SUP AC1 du GPU, selon données déposées)"
      },
      "menuTitle": "ABF",
      "menuSubtitle": "Périmètre AC1"
    },
    {
      "key": "sup",
      "label": "Servitudes d'utilité publique (toutes)",
      "group": "Réglementaire",
      "api": [
        {
          "endpoint": "${apicarto}/gpu/assiette-sup-s",
          "query": {
            "geom": "{geom}"
          },
          "kind": "geojson",
          "resultPath": "features"
        }
      ],
      "mapLayer": {
        "kind": "polygon",
        "trigger": "viewport",
        "minZoom": 13,
        "styleFn": "supColor",
        "weight": 1.5,
        "fillOpacity": 0.12,
        "popup": {
          "mode": "sup"
        }
      },
      "ficheBlock": {
        "tab": "parc",
        "trigger": "parcelClick",
        "mode": "sup",
        "title": "Servitudes d'utilité publique",
        "emptyMessage": "Aucune SUP connue à ce point"
      },
      "menuTitle": "SUP",
      "menuSubtitle": "Servitudes"
    },
    {
      "key": "sismicite",
      "label": "Zonage sismique",
      "group": null,
      "api": [
        {
          "endpoint": "${georisques}/zonage_sismique",
          "query": {
            "code_insee": "{insee}"
          },
          "kind": "raw",
          "resultPath": "data[0]"
        }
      ],
      "ficheBlock": {
        "tab": "parc",
        "mergeInto": "risques",
        "trigger": "parcelClick",
        "mode": "single",
        "valueFields": [
          "zone_sismicite",
          "libelle",
          "code_zone"
        ],
        "summary": "Sismicité : {value}"
      }
    },
    {
      "key": "argile",
      "label": "Retrait-gonflement des argiles (aléa)",
      "group": "Nature",
      "mapLayer": {
        "kind": "wms-tile",
        "wms": {
          "base": "${georisquesWms}",
          "layers": "ALEARG_REALISE,ALEARG_REALISE_PE"
        },
        "maxNativeZoom": 16,
        "maxZoom": 19,
        "zIndex": 370,
        "opacity": 0.55
      },
      "api": [
        {
          "endpoint": "${georisques}/rga",
          "query": {
            "latlon": "{lon},{lat}"
          },
          "kind": "raw",
          "resultPath": "data[0]"
        }
      ],
      "ficheBlock": {
        "tab": "parc",
        "mergeInto": "risques",
        "trigger": "parcelClick",
        "mode": "single",
        "valueFields": [
          "exposition",
          "niveau",
          "codeExposition"
        ],
        "summary": "Argiles (retrait-gonflement) : {value}"
      },
      "menuTitle": "ARGILES",
      "menuSubtitle": "Retrait-gonflement"
    },
    {
      "key": "nappes",
      "label": "Remontées de nappes phréatiques",
      "group": "Nature",
      "_comment": "REMNAPPE seule a un MinScaleDenominator qui la rend invisible en vue parcelle ; REMNAPPE_FIAB (avec niveau de fiabilité) n'a pas cette limite basse.",
      "mapLayer": {
        "kind": "wms-tile",
        "wms": {
          "base": "${georisquesWms}",
          "layers": "REMNAPPE_FIAB"
        },
        "maxZoom": 19,
        "zIndex": 375,
        "opacity": 0.6
      },
      "ficheBlock": {
        "tab": "parc",
        "mergeInto": "risques",
        "trigger": "parcelClick",
        "mode": "wmsInfo",
        "wms": {
          "base": "${georisquesWms}",
          "layers": "REMNAPPE_FIAB"
        },
        "valueFieldPattern": "class|legende|libelle|sensib|niveau",
        "summary": "Remontées de nappes : {value}",
        "fallbackValue": "zone sensible détectée"
      },
      "menuTitle": "NAPPES",
      "menuSubtitle": "Remontées"
    },
    {
      "key": "radon",
      "label": "Potentiel radon",
      "group": null,
      "api": [
        {
          "endpoint": "${georisques}/radon",
          "query": {
            "code_insee": "{insee}"
          },
          "kind": "raw",
          "resultPath": "data[0]"
        }
      ],
      "ficheBlock": {
        "tab": "parc",
        "mergeInto": "risques",
        "trigger": "parcelClick",
        "mode": "single",
        "valueFields": [
          "classe_potentiel",
          "potentiel"
        ],
        "summary": "Radon : potentiel {value}"
      }
    },
    {
      "key": "mvt",
      "label": "Mouvements de terrain (BRGM)",
      "group": "Nature",
      "api": [
        {
          "endpoint": "${georisques}/mvt",
          "query": {
            "latlon": "{lon},{lat}",
            "rayon": "{rayon}"
          },
          "kind": "raw",
          "resultPath": "data"
        }
      ],
      "mapLayer": {
        "kind": "point",
        "trigger": "viewport",
        "viewportShape": "bboxCenterRadius",
        "minZoom": 13,
        "color": "risqueMvt",
        "shape": "triangle",
        "radius": 5,
        "coordFields": [
          [
            "latitude",
            "longitude"
          ],
          [
            "lat",
            "lon"
          ],
          [
            "lat",
            "lng"
          ],
          [
            "y_wgs84",
            "x_wgs84"
          ],
          [
            "y",
            "x"
          ]
        ],
        "popup": {
          "titleFields": [
            "type_mouvement",
            "nature",
            "libelle"
          ],
          "popupTitle": "Mouvement de terrain"
        }
      },
      "ficheBlock": {
        "tab": "parc",
        "mergeInto": "risques",
        "trigger": "parcelClick",
        "radius": 1000,
        "mode": "list",
        "expandable": true,
        "titleFields": [
          "type_mouvement",
          "nature",
          "libelle"
        ],
        "summary": "Mouvements de terrain : {count} à ~1 km"
      },
      "menuHidden": true,
      "bundle": "cavities-risks"
    },
    {
      "key": "cavites",
      "label": "Cavités souterraines + périmètre de précaution (BRGM)",
      "group": "Nature",
      "api": [
        {
          "endpoint": "${georisques}/cavites",
          "query": {
            "latlon": "{lon},{lat}",
            "rayon": "{rayon}"
          },
          "kind": "raw",
          "resultPath": "data"
        }
      ],
      "mapLayer": {
        "kind": "point",
        "trigger": "viewport",
        "viewportShape": "bboxCenterRadius",
        "minZoom": 13,
        "color": "risqueNaturel",
        "shape": "triangle",
        "radius": 5,
        "linkBase": "${bdcavite}",
        "coordFields": [
          [
            "latitude",
            "longitude"
          ],
          [
            "lat",
            "lon"
          ],
          [
            "lat",
            "lng"
          ],
          [
            "y_wgs84",
            "x_wgs84"
          ],
          [
            "y",
            "x"
          ]
        ],
        "popup": {
          "titleFields": [
            "type_cavite",
            "nature",
            "libelle"
          ],
          "popupTitle": "Cavité souterraine"
        }
      },
      "ficheBlock": {
        "tab": "parc",
        "mergeInto": "risques",
        "trigger": "parcelClick",
        "radius": 1000,
        "mode": "list",
        "expandable": true,
        "titleFields": [
          "type_cavite",
          "nature",
          "libelle"
        ],
        "summary": "Cavités souterraines : {count} à ~1 km"
      },
      "menuHidden": true,
      "bundle": "cavities-risks",
      "_comment": "Aucun buffer circulaire artificiel : les périmètres de sécurité officiels sont rendus depuis RICS76 quand ils existent."
    },
    {
      "key": "rics76",
      "label": "Analyse RICS 76 (distance, périmètres, intersections)",
      "group": null,
      "_comment": "Ancien service Géo-IDE RICS76 désactivé : les TypeNames publiés précédemment ne sont plus servis par l'endpoint. Les données cavités restent couvertes par BRGM/Géorisques et MRN OpenDataSoft.",
      "ficheBlock": null
    },
    {
      "key": "cavities-risks",
      "label": "Cavités & effondrements",
      "group": "Nature",
      "_comment": "Bouton unique Cavités & effondrements : BRGM/Géorisques + RICS76 + MRN OpenDataSoft. Les indices ponctuels, linéaires, surfaciques et zones de risques restent distincts techniquement et conservent leur géométrie/provenance.",
      "mapLayer": {
        "kind": "bundle",
        "members": [
          "cavites",
          "mvt",
          "mrn-cavites-ponctuels",
          "mrn-cavites-lineaires",
          "mrn-cavites-surfaciques",
          "mrn-cavites-zones-risques"
        ]
      },
      "menuTitle": "CAVITÉS",
      "menuSubtitle": "Effondrements"
    },
    {
      "key": "ppr",
      "label": "PPR - zonage réglementaire (tous types)",
      "group": "Réglementaire",
      "mapLayer": {
        "kind": "wms-tile",
        "wms": {
          "base": "${georisquesWms}",
          "layers": "PPRN_ZONE_INOND,PPRN_ZONE_SUBMAR,PPRN_ZONE_MVT,PPRN_ZONE_SEISME,PPRN_ZONE_AVALANCHE,PPRN_ZONE_FEU,PPRT_ZONE_RISQIND,PPRM_ZONE_MINIER"
        },
        "maxZoom": 19,
        "zIndex": 380,
        "opacity": 0.6
      },
      "api": [
        {
          "endpoint": "${georisques}/ppr",
          "query": {
            "code_insee": "{insee}"
          },
          "kind": "raw",
          "resultPath": "data"
        }
      ],
      "_comment": "PPR : endpoint dédié /api/v1/ppr. Les routes /api/v1/gaspar/* restent utilisées pour TRI/AZI/PAPI, mais /gaspar/ppr n’existe pas.",
      "ficheBlock": {
        "tab": "parc",
        "mergeInto": "risques",
        "trigger": "parcelClick",
        "mode": "links",
        "idFields": [
          "code_national_ppr",
          "num_risque",
          "code_ppr",
          "id"
        ],
        "labelFields": [
          "libelle_risque_long",
          "libelle_risque",
          "risque_type"
        ],
        "defaultLabel": "PPR",
        "technoFields": [
          "nature_ppr",
          "type_ppr"
        ],
        "hrefTemplate": "https://www.georisques.gouv.fr/donnee-risques/PPR/Fiche-ppr/{pprKind}/{id}"
      },
      "menuTitle": "PPR",
      "menuSubtitle": "Zonage"
    },
    {
      "key": "gaspar-risques",
      "label": "Autres risques commune",
      "group": null,
      "api": [
        {
          "endpoint": "${georisques}/gaspar/risques",
          "query": {
            "code_insee": "{insee}"
          },
          "kind": "raw",
          "resultPath": "data"
        }
      ],
      "ficheBlock": {
        "tab": "parc",
        "mergeInto": "risques",
        "trigger": "parcelClick",
        "mode": "joinList",
        "labelFields": [
          "libelle_risque_long",
          "libelle_risque"
        ],
        "max": 8,
        "summary": "Autres risques commune : {value}"
      }
    },
    {
      "key": "tri",
      "label": "Territoires à risque inondation (TRI)",
      "group": null,
      "_comment": "API v2 (jeton requis) — passe par le worker CORS (${georisquesV2}) qui injecte le secret GEORISQUES_TOKEN côté serveur, jamais exposé au navigateur.",
      "api": [
        {
          "endpoint": "${georisquesV2}/gaspar/tri",
          "query": {
            "code_insee": "{insee}"
          },
          "kind": "raw",
          "resultPath": "data"
        }
      ],
      "ficheBlock": {
        "tab": "parc",
        "mergeInto": "risques",
        "trigger": "parcelClick",
        "mode": "joinList",
        "labelFields": [
          "libelle_risque_long",
          "libelle_risque",
          "libelle",
          "intitule",
          "nom"
        ],
        "max": 8,
        "summary": "Territoire à risque inondation (TRI) : {value}"
      }
    },
    {
      "key": "azi",
      "label": "Atlas des zones inondables (AZI)",
      "group": null,
      "api": [
        {
          "endpoint": "${georisquesV2}/gaspar/azi",
          "query": {
            "code_insee": "{insee}"
          },
          "kind": "raw",
          "resultPath": "data"
        }
      ],
      "ficheBlock": {
        "tab": "parc",
        "mergeInto": "risques",
        "trigger": "parcelClick",
        "mode": "joinList",
        "labelFields": [
          "libelle_risque_long",
          "libelle_risque",
          "libelle",
          "intitule",
          "nom"
        ],
        "max": 8,
        "summary": "Atlas des zones inondables (AZI) : {value}"
      }
    },
    {
      "key": "papi",
      "label": "Programme d'actions de prévention des inondations (PAPI)",
      "group": null,
      "api": [
        {
          "endpoint": "${georisquesV2}/gaspar/papi",
          "query": {
            "code_insee": "{insee}"
          },
          "kind": "raw",
          "resultPath": "data"
        }
      ],
      "ficheBlock": {
        "tab": "parc",
        "mergeInto": "risques",
        "trigger": "parcelClick",
        "mode": "joinList",
        "labelFields": [
          "libelle_risque_long",
          "libelle_risque",
          "libelle",
          "intitule",
          "nom"
        ],
        "max": 8,
        "summary": "Programme de prévention inondation (PAPI) : {value}"
      }
    },
    {
      "key": "dicrim",
      "label": "Document d'information communal sur les risques majeurs (DICRIM)",
      "group": null,
      "api": [
        {
          "endpoint": "${georisquesV2}/gaspar/dicrim",
          "query": {
            "code_insee": "{insee}"
          },
          "kind": "raw",
          "resultPath": "data"
        }
      ],
      "ficheBlock": {
        "tab": "parc",
        "mergeInto": "risques",
        "trigger": "parcelClick",
        "mode": "joinList",
        "labelFields": [
          "libelle_risque_long",
          "libelle_risque",
          "libelle",
          "intitule",
          "nom"
        ],
        "max": 8,
        "summary": "DICRIM : {value}"
      }
    },
    {
      "key": "tim",
      "label": "Transmission d'information au maire (TIM)",
      "group": null,
      "api": [
        {
          "endpoint": "${georisquesV2}/gaspar/tim",
          "query": {
            "code_insee": "{insee}"
          },
          "kind": "raw",
          "resultPath": "data"
        }
      ],
      "ficheBlock": {
        "tab": "parc",
        "mergeInto": "risques",
        "trigger": "parcelClick",
        "mode": "joinList",
        "labelFields": [
          "libelle_risque_long",
          "libelle_risque",
          "libelle",
          "intitule",
          "nom"
        ],
        "max": 8,
        "summary": "Transmission d'information au maire (TIM) : {value}"
      }
    },
    {
      "key": "icpe",
      "label": "Installations classées (ICPE)",
      "group": null,
      "api": [
        {
          "endpoint": "${georisques}/installations_classees",
          "query": {
            "code_insee": "{insee}"
          },
          "kind": "raw",
          "resultPath": null
        }
      ],
      "ficheBlock": {
        "tab": "parc",
        "mergeInto": "risques",
        "trigger": "parcelClick",
        "mode": "count",
        "summary": "ICPE recensées : {count} dans la commune"
      }
    },
    {
      "key": "ssp",
      "label": "Sites et sols pollués (SSP)",
      "group": null,
      "_comment": "API v1 confirmée (catalogue officiel Géorisques, colonnes v1+v2 toutes deux 'Lien swagger' pour ce jeu) — pas besoin du jeton Bearer requis pour les autres routes v2-only.",
      "api": [
        {
          "endpoint": "${georisques}/ssp",
          "query": {
            "code_insee": "{insee}"
          },
          "kind": "raw",
          "resultPath": "data"
        }
      ],
      "ficheBlock": {
        "tab": "parc",
        "mergeInto": "risques",
        "trigger": "parcelClick",
        "mode": "list",
        "titleFields": [
          "nom_usage",
          "raison_sociale",
          "nom"
        ],
        "summary": "Sites et sols pollués (SSP) : {count} dans la commune",
        "expandable": true
      }
    },
    {
      "key": "georisques-rapport",
      "label": "Rapport Géorisques complet",
      "group": null,
      "ficheBlock": {
        "tab": "parc",
        "mergeInto": "risques",
        "trigger": "parcelClick",
        "mode": "custom",
        "renderer": "georisquesRapportLink"
      }
    },
    {
      "key": "eolien",
      "label": "Éoliennes",
      "group": null,
      "_comment": "Désactivé du runtime le 23/09/2026 : le WFS Géorisques ms:eolienne_wfs répond HTTP 200 avec corps vide sur les requêtes viewport observées en production. Géorisques publie toujours la base Eolien terrestre et indique une mise à jour quotidienne, mais le flux cartographique n'est pas assez fiable pour une couche interactive. Conserver la source comme candidate jusqu'à remplacement par un endpoint/API ou téléchargement exploitable.",
      "api": [],
      "mapLayer": null
    },
    {
      "key": "canalisations",
      "label": "Canalisations de transport (hydrocarbures/gaz)",
      "group": null,
      "_comment": "Désactivé du runtime le 23/09/2026 : les WFS Géorisques ms:C_GAZ et ms:C_HYDROCARBURES répondent HTTP 200 avec corps vide sur les requêtes viewport observées en production. Conserver comme source candidate ; ne pas relancer ces flux tant qu'un endpoint officiel exploitable n'est pas confirmé.",
      "api": [],
      "mapLayer": null
    },
    {
      "key": "irep",
      "label": "Établissements polluants déclarants (IREP)",
      "group": "Réglementaire",
      "_comment": "Pas d'API, service WMS/WFS national. Typename confirmé via GetCapabilities (fourni par l'utilisateur) : le nom (correct) manquait juste le préfixe d'espace de noms 'ms:', comme pour eolien/canalisations.",
      "api": [
        {
          "endpoint": "${georisquesWms}",
          "query": {
            "SERVICE": "WFS",
            "VERSION": "2.0.0",
            "REQUEST": "GetFeature",
            "TYPENAMES": "ms:ETABLISSEMENTS_POLLUEURS",
            "OUTPUTFORMAT": "application/json; subtype=geojson; charset=utf-8",
            "SRSNAME": "EPSG:4326",
            "BBOX": "{bboxW},{bboxS},{bboxE},{bboxN}"
          },
          "viaProxy": true,
          "kind": "geojson",
          "resultPath": "features"
        }
      ],
      "mapLayer": {
        "kind": "point",
        "trigger": "viewport",
        "minZoom": 11,
        "color": "#6D4C41",
        "radius": 5,
        "popup": {
          "defaultTitle": "Établissement polluant déclarant (IREP)"
        }
      },
      "menuTitle": "IREP",
      "menuSubtitle": "Établissements"
    },
    {
      "key": "hydrants",
      "label": "Bornes incendie",
      "group": "Réseaux / DECI",
      "mapLayer": {
        "kind": "custom",
        "trigger": "viewport",
        "minZoom": 14,
        "shape": "square",
        "renderer": "hydrants"
      },
      "ficheBlock": {
        "tab": "parc",
        "trigger": "parcelClick",
        "mode": "custom",
        "renderer": "hydrants",
        "title": "Borne incendie la plus proche"
      },
      "menuTitle": "DECI",
      "menuSubtitle": "Bornes incendie"
    },
    {
      "key": "altitude",
      "label": "Altitude / pente (RGE ALTI)",
      "group": null,
      "ficheBlock": {
        "tab": "parc",
        "trigger": "parcelClick",
        "mode": "custom",
        "renderer": "altitude",
        "title": "Altitude / pente (RGE ALTI)"
      }
    },
    {
      "key": "rpg",
      "label": "Usage agricole (RPG)",
      "group": null,
      "ficheBlock": {
        "tab": "parc",
        "trigger": "parcelClick",
        "mode": "custom",
        "renderer": "rpg",
        "title": "Usage agricole (RPG)"
      }
    },
    {
      "key": "docs",
      "label": "Documents d'urbanisme (GPU)",
      "group": null,
      "ficheBlock": {
        "tab": "docs",
        "trigger": "parcelClick",
        "mode": "custom",
        "renderer": "docs",
        "title": "Documents d'urbanisme (GPU)"
      }
    },
    {
      "key": "contacts",
      "label": "Contacts",
      "group": null,
      "ficheBlock": {
        "tab": "contact",
        "trigger": "parcelClick",
        "mode": "custom",
        "renderer": "contacts",
        "title": "Contacts"
      }
    },
    {
      "key": "permis",
      "label": "Autres permis de la commune (Sitadel)",
      "group": null,
      "ficheBlock": {
        "tab": "plus",
        "trigger": "onDemand",
        "mode": "custom",
        "renderer": "permis",
        "title": "Autres permis de la commune (Sitadel)"
      }
    },
    {
      "key": "dvf",
      "label": "Ventes proches (DVF)",
      "group": null,
      "ficheBlock": {
        "tab": "plus",
        "trigger": "onDemand",
        "mode": "custom",
        "renderer": "dvf",
        "title": "Ventes proches (DVF)"
      }
    },
    {
      "key": "dpe",
      "label": "DPE proches (ADEME)",
      "group": null,
      "ficheBlock": {
        "tab": "plus",
        "trigger": "onDemand",
        "mode": "custom",
        "renderer": "dpe",
        "title": "DPE proches (ADEME)"
      }
    },
    {
      "key": "nature-zones",
      "label": "Zones naturelles (Natura 2000 / ZNIEFF)",
      "group": null,
      "ficheBlock": {
        "tab": "plus",
        "trigger": "onDemand",
        "mode": "custom",
        "renderer": "nature",
        "title": "Zones naturelles (Natura 2000 / ZNIEFF)"
      }
    },
    {
      "key": "vent",
      "label": "Rose des vents (3 ans, ERA5)",
      "group": null,
      "ficheBlock": {
        "tab": "plus",
        "trigger": "onDemand",
        "mode": "custom",
        "renderer": "vent",
        "title": "Rose des vents (3 ans, ERA5)"
      }
    },
    {
      "key": "plan-ign",
      "label": "Plan IGN",
      "group": "Fond",
      "mapLayer": {
        "kind": "wmts-tile",
        "layer": "GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2",
        "format": "image/png",
        "maxZoom": 20,
        "zIndex": 190,
        "style": "normal",
        "tileMatrixSet": "PM_0_19",
        "maxNativeZoom": 19
      },
      "menuTitle": "IGN",
      "menuSubtitle": "Plan"
    },
    {
      "key": "osm",
      "label": "OpenStreetMap (détaillé)",
      "group": "Fond",
      "mapLayer": {
        "kind": "url-tile",
        "url": "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
        "subdomains": "abc",
        "maxZoom": 19,
        "zIndex": 195,
        "attribution": "&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a>"
      },
      "menuTitle": "OSM",
      "menuSubtitle": "Détaillé"
    },
    {
      "key": "scan25",
      "label": "SCAN 25 (topo)",
      "group": "Fond",
      "mapLayer": {
        "kind": "wmts-tile",
        "layer": "GEOGRAPHICALGRIDSYSTEMS.MAPS.SCAN25TOUR",
        "format": "image/jpeg",
        "maxZoom": 20,
        "zIndex": 195,
        "style": "normal",
        "tileMatrixSet": "PM",
        "maxNativeZoom": 16
      },
      "menuTitle": "TOPO",
      "menuSubtitle": "SCAN 25"
    },
    {
      "key": "ortho",
      "label": "Photo aérienne",
      "group": "Fond",
      "mapLayer": {
        "kind": "wmts-tile",
        "layer": "ORTHOIMAGERY.ORTHOPHOTOS",
        "format": "image/jpeg",
        "maxZoom": 20,
        "zIndex": 200,
        "style": "normal",
        "tileMatrixSet": "PM_0_19",
        "maxNativeZoom": 19
      },
      "menuTitle": "PHOTO",
      "menuSubtitle": "Orthophoto"
    },
    {
      "key": "ortho1950",
      "label": "Photo aérienne 1950-65",
      "group": "Fond",
      "mapLayer": {
        "kind": "wmts-tile",
        "layer": "ORTHOIMAGERY.ORTHOPHOTOS.1950-1965",
        "format": "image/png",
        "maxZoom": 20,
        "zIndex": 210,
        "style": "normal",
        "tileMatrixSet": "PM_0_18",
        "maxNativeZoom": 18
      },
      "menuTitle": "PHOTO 1950",
      "menuSubtitle": "1950–1965"
    },
    {
      "key": "etatmajor40",
      "label": "Carte d'État-Major (1820-1866)",
      "group": "Fond",
      "mapLayer": {
        "kind": "wmts-tile",
        "layer": "GEOGRAPHICALGRIDSYSTEMS.ETATMAJOR40",
        "format": "image/jpeg",
        "maxNativeZoom": 15,
        "maxZoom": 20,
        "zIndex": 215,
        "style": "normal",
        "tileMatrixSet": "PM"
      },
      "menuTitle": "ÉTAT-MAJOR",
      "menuSubtitle": "1820–1866"
    },
    {
      "key": "cadastre",
      "label": "Cadastre",
      "group": "Cadastre & terrain",
      "mapLayer": {
        "kind": "wmts-tile",
        "layer": "CADASTRALPARCELS.PARCELLAIRE_EXPRESS",
        "format": "image/png",
        "maxZoom": 20,
        "zIndex": 400,
        "opacity": 0.9,
        "style": "normal",
        "tileMatrixSet": "PM_0_19",
        "maxNativeZoom": 19
      },
      "menuTitle": "CADASTRE",
      "menuSubtitle": "Parcelles"
    },
    {
      "key": "rnb",
      "label": "Bâtiments (RNB)",
      "group": "Cadastre & terrain",
      "_comment": "Référentiel National des Bâtiments (beta.gouv.fr) : API publique, gratuite, sans clé, confirmée par plusieurs sources concordantes (doc officielle GitBook + fiche data.gouv.fr) — endpoint standard OGC API Features, GeoJSON direct, bbox=min_lon,min_lat,max_lon,max_lat (même ordre que nos vars bboxW/bboxS/bboxE/bboxN).",
      "api": [
        {
          "endpoint": "${rnb}/ogc/collections/buildings/items",
          "query": {
            "bbox": "{bboxW},{bboxS},{bboxE},{bboxN}"
          },
          "kind": "geojson",
          "resultPath": "features"
        }
      ],
      "mapLayer": {
        "kind": "polygon",
        "trigger": "viewport",
        "minZoom": 16,
        "color": "#455A64",
        "weight": 1,
        "fillOpacity": 0.2,
        "popup": {
          "defaultTitle": "Bâtiment (RNB)"
        }
      },
      "menuTitle": "BÂTIMENTS",
      "menuSubtitle": "RNB"
    },
    {
      "key": "lidarhd-metadata",
      "label": "LIDAR HD (dalles disponibles)",
      "group": "Cadastre & terrain",
      "_comment": "Grille de couverture LIDAR HD (IGN), service national data.geopf.fr/wfs — CORS ouvert (Access-Control-Allow-Origin: *), pas besoin de proxy. Affiche l'emprise des dalles avec métadonnées (date de levée, etc.) au clic, pas le nuage de points lui-même.",
      "api": [
        {
          "endpoint": "${geopfWfs}",
          "query": {
            "SERVICE": "WFS",
            "VERSION": "2.0.0",
            "REQUEST": "GetFeature",
            "TYPENAMES": "IGNF_LIDAR-HD_METADONNEE:metadata",
            "OUTPUTFORMAT": "application/json",
            "SRSNAME": "EPSG:4326",
            "BBOX": "{bboxW},{bboxS},{bboxE},{bboxN}"
          },
          "kind": "geojson",
          "resultPath": "features"
        }
      ],
      "mapLayer": {
        "kind": "polygon",
        "trigger": "viewport",
        "minZoom": 11,
        "color": "#00838F",
        "weight": 1,
        "fillOpacity": 0.08,
        "popup": {
          "defaultTitle": "Dalle LIDAR HD"
        }
      },
      "menuTitle": "LIDAR HD",
      "menuSubtitle": "Dalles disponibles"
    },
    {
      "key": "courbes",
      "label": "Courbes de niveau IGN",
      "group": "Relief",
      "_comment": "maxNativeZoom=17 : au-delà (vue rapprochée), Leaflet réutilise la dernière tuile valide agrandie plutôt que de la faire disparaître (le flux IGN ne fournit pas de tuiles natives au-delà). Épaisseur des traits fixée par le rendu serveur IGN (raster, pas modifiable côté client sans basculer sur la donnée vectorielle) ; la couleur, elle, est recolorée en noir plein via className:tile-recolor-black (filtre CSS brightness(0), préserve la transparence d'origine).",
      "mapLayer": {
        "kind": "wmts-tile",
        "layer": "ELEVATION.CONTOUR.LINE",
        "format": "image/png",
        "maxZoom": 20,
        "maxNativeZoom": 18,
        "zIndex": 350,
        "opacity": 0.85,
        "className": "tile-recolor-black",
        "style": "normal",
        "tileMatrixSet": "PM_6_18"
      },
      "menuTitle": "COURBES",
      "menuSubtitle": "Niveau IGN"
    },
    {
      "key": "pente",
      "label": "Pentes PAC (>10%)",
      "group": "Relief",
      "mapLayer": {
        "kind": "wmts-tile",
        "layer": "GEOGRAPHICALGRIDSYSTEMS.SLOPES.PAC",
        "format": "image/png",
        "maxZoom": 20,
        "zIndex": 340,
        "opacity": 0.55,
        "maxNativeZoom": 15,
        "style": "GEOGRAPHICALGRIDSYSTEMS.SLOPES.PAC",
        "tileMatrixSet": "PM_0_15"
      },
      "menuTitle": "PENTES",
      "menuSubtitle": "PAC >10 %"
    },
    {
      "key": "pente-montagne",
      "label": "Pentes montagne",
      "group": "Relief",
      "_comment": "Nom de couche trouvé par recherche (une seule source, non recoupée comme le reste du catalogue Géorisques) — à confirmer une fois affichée. Couverture géographique probablement limitée aux massifs.",
      "mapLayer": {
        "kind": "wmts-tile",
        "layer": "GEOGRAPHICALGRIDSYSTEMS.SLOPES.MOUNTAIN",
        "format": "image/png",
        "maxZoom": 20,
        "zIndex": 341,
        "opacity": 0.55,
        "maxNativeZoom": 17,
        "style": "normal",
        "tileMatrixSet": "PM_0_17"
      },
      "menuTitle": "MONTAGNE",
      "menuSubtitle": "Pentes"
    },
    {
      "key": "hydro",
      "label": "Hydrographie",
      "group": "Nature",
      "mapLayer": {
        "kind": "wmts-tile",
        "layer": "HYDROGRAPHY.HYDROGRAPHY",
        "format": "image/png",
        "maxZoom": 20,
        "zIndex": 360,
        "opacity": 0.9,
        "style": "normal",
        "tileMatrixSet": "PM_6_18",
        "maxNativeZoom": 18
      },
      "menuTitle": "HYDRO",
      "menuSubtitle": "Hydrographie"
    },
    {
      "key": "foret",
      "label": "BD Forêt (BD Végétation)",
      "group": "Nature",
      "mapLayer": {
        "kind": "wmts-tile",
        "layer": "LANDCOVER.FORESTINVENTORY.V2",
        "format": "image/png",
        "maxZoom": 20,
        "zIndex": 330,
        "opacity": 0.6,
        "style": "normal",
        "tileMatrixSet": "PM_6_16",
        "maxNativeZoom": 16
      },
      "menuTitle": "FORÊT",
      "menuSubtitle": "BD Végétation"
    },
    {
      "key": "mh",
      "label": "Monuments historiques (points)",
      "group": "Réglementaire",
      "api": [
        {
          "kind": "ods",
          "viaProxy": true,
          "odsBase": "https://data.culture.gouv.fr",
          "dataset": "liste-des-immeubles-proteges-au-titre-des-monuments-historiques",
          "resultPath": "results"
        }
      ],
      "mapLayer": {
        "kind": "point",
        "trigger": "viewport",
        "minZoom": 13,
        "color": "#6A1B9A",
        "radius": 5,
        "popup": {
          "titleFields": [
            "appellation_courante",
            "nom",
            "libelle"
          ]
        }
      },
      "ficheBlock": {
        "tab": "parc",
        "mergeInto": "abf",
        "trigger": "parcelClick",
        "mode": "custom",
        "renderer": "mhDistance"
      },
      "menuTitle": "MH",
      "menuSubtitle": "Monuments"
    },
    {
      "key": "reseau",
      "label": "Réseau structurant (PLU)",
      "group": "Réglementaire",
      "api": [
        {
          "endpoint": "${apicarto}/gpu/prescription-lin",
          "query": {
            "geom": "{geom}"
          },
          "kind": "geojson",
          "resultPath": "features",
          "style": {
            "weight": 3,
            "fillOpacity": 0
          }
        },
        {
          "endpoint": "${apicarto}/gpu/prescription-surf",
          "query": {
            "geom": "{geom}"
          },
          "kind": "geojson",
          "resultPath": "features",
          "style": {
            "weight": 1.5,
            "fillOpacity": 0.15
          }
        }
      ],
      "mapLayer": {
        "kind": "polygon",
        "trigger": "viewport",
        "minZoom": 14,
        "color": "#00838F",
        "fillColor": "#00ACC1",
        "popup": {
          "titleFields": [
            "libelle",
            "typepsc"
          ],
          "defaultTitle": "Prescription PLU",
          "descFields": [
            "libelong",
            "txt"
          ]
        }
      },
      "menuTitle": "RÉSEAU",
      "menuSubtitle": "Structurant PLU"
    },
    {
      "key": "enedis",
      "label": "Enedis (BT bleu · HTA orange · souterrain pointillé)",
      "group": "Réseaux / DECI",
      "_comment": "Nouveau portail Enedis Data Fair. Le dataset poteaux est confirmé par le Swagger fourni : /data-fair/api/v1/datasets/position-geographique-des-poteaux-hta-et-bt. Les appels cartographiques restent via /lines en GeoJSON avec bbox ; les autres datasets réseau conservent le même adaptateur.",
      "api": [
        {
          "endpoint": "${enedisDataFair}/reseau-souterrain-bt/lines",
          "viaProxy": true,
          "query": {
            "format": "geojson",
            "size": 1000,
            "bbox": "{bboxW},{bboxS},{bboxE},{bboxN}"
          },
          "kind": "geojson",
          "resultPath": "features",
          "style": {
            "color": "reseauxEnergie",
            "weight": 2,
            "dash": "4 4"
          }
        },
        {
          "endpoint": "${enedisDataFair}/reseau-bt/lines",
          "viaProxy": true,
          "query": {
            "format": "geojson",
            "size": 1000,
            "bbox": "{bboxW},{bboxS},{bboxE},{bboxN}"
          },
          "kind": "geojson",
          "resultPath": "features",
          "style": {
            "color": "reseauxEnergie",
            "weight": 2
          }
        },
        {
          "endpoint": "${enedisDataFair}/reseau-souterrain-hta/lines",
          "viaProxy": true,
          "query": {
            "format": "geojson",
            "size": 1000,
            "bbox": "{bboxW},{bboxS},{bboxE},{bboxN}"
          },
          "kind": "geojson",
          "resultPath": "features",
          "style": {
            "color": "reseauxEnergieHta",
            "weight": 2.5,
            "dash": "4 4"
          }
        },
        {
          "endpoint": "${enedisDataFair}/reseau-hta/lines",
          "viaProxy": true,
          "query": {
            "format": "geojson",
            "size": 1000,
            "bbox": "{bboxW},{bboxS},{bboxE},{bboxN}"
          },
          "kind": "geojson",
          "resultPath": "features",
          "style": {
            "color": "reseauxEnergieHta",
            "weight": 2.5
          }
        },
        {
          "endpoint": "${enedisDataFair}/position-geographique-des-poteaux-hta-et-bt/lines",
          "viaProxy": true,
          "query": {
            "format": "geojson",
            "size": 1000,
            "bbox": "{bboxW},{bboxS},{bboxE},{bboxN}"
          },
          "kind": "geojson",
          "resultPath": "features",
          "style": {
            "color": "reseauxEau",
            "radius": 4
          }
        },
        {
          "endpoint": "${enedisDataFair}/poste-electrique/lines",
          "viaProxy": true,
          "query": {
            "format": "geojson",
            "size": 1000,
            "bbox": "{bboxW},{bboxS},{bboxE},{bboxN}"
          },
          "kind": "geojson",
          "resultPath": "features",
          "style": {
            "color": "reseauxEnergieHta",
            "radius": 5
          }
        }
      ],
      "mapLayer": {
        "kind": "polygon",
        "trigger": "viewport",
        "minZoom": 15
      },
      "menuTitle": "ENEDIS",
      "menuSubtitle": "BT · HTA"
    },
    {
      "key": "grdf",
      "label": "Réseau gaz (GRDF)",
      "group": null,
      "_comment": "Source désactivée le 23/09/2026 : portail.agenceore.fr refuse les requêtes serveur/proxy (HTTP 403 administrative rules). Ne pas lancer de requête viewport tant qu'un endpoint officiel exploitable n'est pas confirmé.",
      "api": [],
      "mapLayer": null
    },
    {
      "key": "transit-nml",
      "label": "Zones 200 m arrêts (Normandie)",
      "group": "Transports",
      "api": [
        {
          "kind": "ods",
          "viaProxy": true,
          "odsBase": "https://www.datanormandie.fr",
          "dataset": "zones_de_200m_autour_des_arrets_de_bus_et_gare_en_normandie",
          "resultPath": "results",
          "paginate": {
            "rows": 100
          }
        }
      ],
      "mapLayer": {
        "kind": "polygon",
        "trigger": "viewport",
        "minZoom": 13,
        "color": "transports",
        "fillColor": "#66BB6A",
        "weight": 1,
        "fillOpacity": 0.2
      },
      "menuTitle": "ARRÊTS",
      "menuSubtitle": "Zones 200 m"
    },
    {
      "key": "mrn-cavites-ponctuels",
      "label": "MRN — indices ponctuels de cavités",
      "group": "Nature",
      "menuHidden": true,
      "bundle": "cavities-risks",
      "api": [
        {
          "kind": "ods",
          "viaProxy": true,
          "odsBase": "https://rouenmetropole.opendatasoft.com",
          "dataset": "donmeturb_cav_indice_pct",
          "resultPath": "results",
          "paginate": {
            "rows": 100
          },
          "style": {
            "color": "risqueNaturel",
            "radius": 5
          }
        }
      ],
      "mapLayer": {
        "kind": "point",
        "trigger": "viewport",
        "minZoom": 13,
        "shape": "triangle",
        "radius": 5,
        "popup": {
          "defaultTitle": "Indice ponctuel de cavité — MRN"
        }
      }
    },
    {
      "key": "mrn-cavites-lineaires",
      "label": "MRN — indices linéaires de cavités",
      "group": "Nature",
      "menuHidden": true,
      "bundle": "cavities-risks",
      "api": [
        {
          "kind": "ods",
          "viaProxy": true,
          "odsBase": "https://rouenmetropole.opendatasoft.com",
          "dataset": "cavites-souterraines-indices-lineaires-metropole-rouen-normandie",
          "resultPath": "results",
          "paginate": {
            "rows": 100
          },
          "style": {
            "color": "risqueNaturel",
            "weight": 2.5
          }
        }
      ],
      "mapLayer": {
        "kind": "polygon",
        "trigger": "viewport",
        "minZoom": 13,
        "popup": {
          "defaultTitle": "Indice linéaire de cavité — MRN"
        }
      }
    },
    {
      "key": "mrn-cavites-surfaciques",
      "label": "MRN — indices surfaciques de cavités",
      "group": "Nature",
      "menuHidden": true,
      "bundle": "cavities-risks",
      "api": [
        {
          "kind": "ods",
          "viaProxy": true,
          "odsBase": "https://rouenmetropole.opendatasoft.com",
          "dataset": "cavites-souterraines-indices-surfaciques-metropole-rouen-normandie",
          "resultPath": "results",
          "paginate": {
            "rows": 100
          },
          "style": {
            "color": "risqueNaturel",
            "weight": 1.5,
            "fillOpacity": 0.25
          }
        }
      ],
      "mapLayer": {
        "kind": "polygon",
        "trigger": "viewport",
        "minZoom": 13,
        "popup": {
          "defaultTitle": "Indice surfacique de cavité — MRN"
        }
      }
    },
    {
      "key": "mrn-cavites-zones-risques",
      "label": "MRN — zones de risques cavités",
      "group": "Nature",
      "menuHidden": true,
      "bundle": "cavities-risks",
      "api": [
        {
          "kind": "ods",
          "viaProxy": true,
          "odsBase": "https://rouenmetropole.opendatasoft.com",
          "dataset": "cavites-souterraines-zones-de-risques-metropole-rouen-normandie",
          "resultPath": "results",
          "paginate": {
            "rows": 100
          },
          "style": {
            "color": "#B71C1C",
            "weight": 2,
            "fillOpacity": 0.12
          }
        }
      ],
      "mapLayer": {
        "kind": "polygon",
        "trigger": "viewport",
        "minZoom": 13,
        "popup": {
          "defaultTitle": "Zone de risque cavité — MRN"
        }
      }
    },
    {
      "key": "rouen-perils",
      "label": "Bâtiments en péril",
      "group": "Nature",
      "api": [
        {
          "kind": "ods",
          "viaProxy": true,
          "odsBase": "https://rouenmetropole.opendatasoft.com",
          "dataset": "perils-ville-de-rouen",
          "resultPath": "results",
          "paginate": {
            "rows": 100
          },
          "style": {
            "color": "#C62828",
            "weight": 2,
            "fillOpacity": 0.2
          }
        }
      ],
      "mapLayer": {
        "kind": "polygon",
        "trigger": "viewport",
        "minZoom": 14,
        "popup": {
          "defaultTitle": "Bâtiment en péril — Ville de Rouen"
        }
      },
      "menuTitle": "PÉRIL",
      "menuSubtitle": "Bâtiments"
    },
    {
      "key": "mrn-cadastre-objets-lineaires",
      "label": "Objets linéaires cadastraux — MRN",
      "group": "Cadastre & terrain",
      "_comment": "Jeu OpenDataSoft MRN fourni par l'utilisateur. Géométrie linéaire conservée telle quelle ; popup générique affichant toutes les propriétés scalaires. Source associée au périmètre SAGE Cailly-Aubette-Robec selon le nom du dataset.",
      "api": [
        {
          "kind": "ods",
          "viaProxy": true,
          "odsBase": "https://rouenmetropole.opendatasoft.com",
          "dataset": "cadastre-objets-lineaires-divers-metropole-rouen-normandie-sage-cailly-aubette-r",
          "resultPath": "results",
          "paginate": {
            "rows": 100
          },
          "style": {
            "color": "#455A64",
            "weight": 2
          }
        }
      ],
      "mapLayer": {
        "kind": "polygon",
        "trigger": "viewport",
        "minZoom": 15,
        "popup": {
          "defaultTitle": "Objet linéaire cadastral — MRN"
        }
      },
      "menuTitle": "OBJETS",
      "menuSubtitle": "Cadastre MRN"
    },
    {
      "key": "mrn-reseau-chaleur",
      "label": "Réseaux de chaleur — MRN",
      "group": "Réseaux / DECI",
      "_comment": "Canalisations des réseaux de chaleur de la Métropole Rouen Normandie (jeu 2022). Géométrie source conservée telle quelle ; popup générique exhaustive.",
      "api": [
        {
          "kind": "ods",
          "viaProxy": true,
          "odsBase": "https://rouenmetropole.opendatasoft.com",
          "dataset": "canalisation-des-reseaux-de-chaleur-metropole-rouen-normandie-2022",
          "resultPath": "results",
          "paginate": {
            "rows": 100
          },
          "style": {
            "color": "#AD1457",
            "weight": 3
          }
        }
      ],
      "mapLayer": {
        "kind": "polygon",
        "trigger": "viewport",
        "minZoom": 14,
        "popup": {
          "defaultTitle": "Réseau de chaleur — MRN"
        }
      },
      "menuTitle": "CHALEUR",
      "menuSubtitle": "Réseaux MRN"
    },
    {
      "key": "mrn-travaux",
      "label": "Travaux — MRN",
      "group": "Cadastre & terrain",
      "_comment": "Jeu OpenDataSoft MRN `travaux-json`. La géométrie fournie par le dataset est affichée telle quelle ; toutes les propriétés scalaires sont visibles dans la popup.",
      "api": [
        {
          "kind": "ods",
          "viaProxy": true,
          "odsBase": "https://rouenmetropole.opendatasoft.com",
          "dataset": "travaux-json",
          "resultPath": "results",
          "paginate": {
            "rows": 100
          },
          "style": {
            "color": "#EF6C00",
            "weight": 2,
            "fillOpacity": 0.18
          }
        }
      ],
      "mapLayer": {
        "kind": "polygon",
        "trigger": "viewport",
        "minZoom": 13,
        "popup": {
          "defaultTitle": "Travaux — MRN"
        }
      },
      "menuTitle": "TRAVAUX",
      "menuSubtitle": "MRN"
    },
    {
      "key": "mrn-ads-recues",
      "label": "ADS reçues par année — MRN",
      "group": "Réglementaire",
      "_comment": "Jeu OpenDataSoft MRN `ads-recues-par-annee`. Affichage cartographique uniquement si le dataset expose une géométrie ; toutes les propriétés scalaires sont conservées dans la popup.",
      "api": [
        {
          "kind": "ods",
          "viaProxy": true,
          "odsBase": "https://rouenmetropole.opendatasoft.com",
          "dataset": "ads-recues-par-annee",
          "resultPath": "results",
          "paginate": {
            "rows": 100
          },
          "style": {
            "color": "#6A1B9A",
            "weight": 1.5,
            "fillOpacity": 0.12
          }
        }
      ],
      "mapLayer": {
        "kind": "polygon",
        "trigger": "viewport",
        "minZoom": 12,
        "popup": {
          "defaultTitle": "ADS reçue — MRN"
        }
      },
      "menuTitle": "ADS",
      "menuSubtitle": "Reçues MRN"
    },
    {
      "key": "mrn-arbres-remarquables",
      "label": "Arbres remarquables — MRN",
      "group": "Nature",
      "_comment": "Jeu OpenDataSoft MRN 2019. Géométrie ponctuelle conservée telle quelle ; toutes les propriétés scalaires sont affichées dans la popup.",
      "api": [
        {
          "kind": "ods",
          "viaProxy": true,
          "odsBase": "https://rouenmetropole.opendatasoft.com",
          "dataset": "arbres-remarquables-metropole-rouen-normandie-2019",
          "resultPath": "results",
          "paginate": {
            "rows": 100
          },
          "style": {
            "color": "#2E7D32",
            "radius": 5
          }
        }
      ],
      "mapLayer": {
        "kind": "point",
        "trigger": "viewport",
        "minZoom": 13,
        "radius": 5,
        "popup": {
          "defaultTitle": "Arbre remarquable — MRN"
        }
      },
      "menuTitle": "ARBRES",
      "menuSubtitle": "Remarquables MRN"
    },
    {
      "key": "mrn-decheteries",
      "label": "Déchèteries — MRN",
      "group": "Cadastre & terrain",
      "_comment": "Réseau de déchèteries de la Métropole Rouen Normandie. Point source conservé ; toutes les propriétés scalaires sont affichées dans la popup.",
      "api": [
        {
          "kind": "ods",
          "viaProxy": true,
          "odsBase": "https://rouenmetropole.opendatasoft.com",
          "dataset": "reseau-de-decheteries-metropole-rouen-normandie",
          "resultPath": "results",
          "paginate": {
            "rows": 100
          },
          "style": {
            "color": "#546E7A",
            "radius": 5
          }
        }
      ],
      "mapLayer": {
        "kind": "point",
        "trigger": "viewport",
        "minZoom": 12,
        "radius": 5,
        "popup": {
          "defaultTitle": "Déchèterie — MRN"
        }
      },
      "menuTitle": "DÉCHÈTERIES",
      "menuSubtitle": "MRN"
    },
    {
      "key": "routes",
      "label": "Réseau routier — BD TOPO",
      "group": "Transports",
      "_comment": "Couche GeoPF vérifiée dans les catalogues/capacités publiés ; WMS raster utilisé pour l'affichage Leaflet.",
      "mapLayer": {
        "kind": "wms-tile",
        "wms": {
          "base": "https://data.geopf.fr/wms-r/wms",
          "layers": "TRANSPORTNETWORKS.ROADS"
        },
        "maxZoom": 20,
        "zIndex": 365,
        "opacity": 0.85
      },
      "menuTitle": "ROUTES",
      "menuSubtitle": "BD TOPO"
    },
    {
      "key": "ferroviaire",
      "label": "Réseau ferré — BD TOPO",
      "group": "Transports",
      "_comment": "Couche GeoPF vérifiée dans les catalogues/capacités publiés ; WMS raster utilisé pour l'affichage Leaflet.",
      "mapLayer": {
        "kind": "wms-tile",
        "wms": {
          "base": "https://data.geopf.fr/wms-r/wms",
          "layers": "TRANSPORTNETWORKS.RAILWAYS"
        },
        "maxZoom": 20,
        "zIndex": 366,
        "opacity": 0.85
      },
      "menuTitle": "RAIL",
      "menuSubtitle": "BD TOPO"
    },
    {
      "key": "altimetrie-relief",
      "label": "Relief / altimétrie",
      "group": "Relief",
      "_comment": "Couche GeoPF vérifiée dans les catalogues/capacités publiés ; WMS raster utilisé pour l'affichage Leaflet.",
      "mapLayer": {
        "kind": "wms-tile",
        "wms": {
          "base": "https://data.geopf.fr/wms-r/wms",
          "layers": "ELEVATION.ELEVATIONGRIDCOVERAGE"
        },
        "maxZoom": 20,
        "zIndex": 300,
        "opacity": 0.5
      },
      "menuTitle": "ALTIMÉTRIE",
      "menuSubtitle": "Relief"
    },
    {
      "key": "limites-admin",
      "label": "Limites administratives — IGN",
      "group": "Réglementaire",
      "_comment": "Identifiant vérifié dans le catalogue cartes.gouv.fr / Géoplateforme en septembre 2026.",
      "mapLayer": {
        "kind": "wmts-tile",
        "layer": "LIMITES_ADMINISTRATIVES_EXPRESS.LATEST",
        "format": "image/png",
        "maxZoom": 20,
        "zIndex": 315,
        "opacity": 0.8,
        "style": "normal",
        "tileMatrixSet": "PM_6_16",
        "maxNativeZoom": 16
      },
      "menuTitle": "LIMITES",
      "menuSubtitle": "Administratives IGN"
    },
    {
      "key": "rpg-latest",
      "label": "RPG — cultures déclarées (dernière édition)",
      "group": "Nature",
      "_comment": "Identifiant vérifié dans le catalogue cartes.gouv.fr / Géoplateforme en septembre 2026.",
      "mapLayer": {
        "kind": "wmts-tile",
        "layer": "LANDUSE.AGRICULTURE.LATEST",
        "format": "image/png",
        "maxZoom": 20,
        "maxNativeZoom": 16,
        "zIndex": 335,
        "opacity": 0.65,
        "style": "normal",
        "tileMatrixSet": "PM_6_16"
      },
      "menuTitle": "RPG",
      "menuSubtitle": "Cultures déclarées"
    },
    {
      "key": "corine-2018",
      "label": "Occupation du sol — CORINE Land Cover 2018",
      "group": "Nature",
      "_comment": "Identifiant vérifié dans le catalogue cartes.gouv.fr / Géoplateforme en septembre 2026.",
      "mapLayer": {
        "kind": "wmts-tile",
        "layer": "LANDCOVER.CLC18_FR",
        "format": "image/png",
        "maxZoom": 20,
        "maxNativeZoom": 16,
        "zIndex": 325,
        "opacity": 0.55,
        "style": "CORINE Land Cover - France métropolitaine",
        "tileMatrixSet": "PM"
      },
      "menuTitle": "OCCUPATION",
      "menuSubtitle": "CORINE 2018"
    },
    {
      "key": "mnt-lidar-hd",
      "label": "Terrain HD — MNT LiDAR HD",
      "group": "Relief",
      "_comment": "Identifiant vérifié dans le catalogue cartes.gouv.fr / Géoplateforme en septembre 2026.",
      "mapLayer": {
        "kind": "wmts-tile",
        "layer": "IGNF_LIDAR-HD_MNT_ELEVATION.ELEVATIONGRIDCOVERAGE.SHADOW",
        "format": "image/png",
        "maxZoom": 20,
        "zIndex": 345,
        "opacity": 0.55,
        "style": "normal",
        "tileMatrixSet": "PM",
        "maxNativeZoom": 18
      },
      "menuTitle": "TERRAIN HD",
      "menuSubtitle": "MNT LiDAR"
    },
    {
      "key": "mns-lidar-hd",
      "label": "Sursol HD — MNS LiDAR HD",
      "group": "Relief",
      "_comment": "Identifiant vérifié dans le catalogue cartes.gouv.fr / Géoplateforme en septembre 2026.",
      "mapLayer": {
        "kind": "wmts-tile",
        "layer": "IGNF_LIDAR-HD_MNS_ELEVATION.ELEVATIONGRIDCOVERAGE.SHADOW",
        "format": "image/png",
        "maxZoom": 20,
        "zIndex": 346,
        "opacity": 0.5,
        "style": "normal",
        "tileMatrixSet": "PM",
        "maxNativeZoom": 18
      },
      "menuTitle": "SURSOL HD",
      "menuSubtitle": "MNS LiDAR"
    },
    {
      "key": "mnh-lidar-hd",
      "label": "Hauteur HD — MNH LiDAR HD",
      "group": "Relief",
      "_comment": "MNH LiDAR HD officiel IGN : hauteur des objets au-dessus du terrain, diffusion WMTS/WMS-Raster.",
      "mapLayer": {
        "kind": "wmts-tile",
        "layer": "IGNF_LIDAR-HD_MNH_ELEVATION.ELEVATIONGRIDCOVERAGE.SHADOW",
        "format": "image/png",
        "maxZoom": 20,
        "zIndex": 347,
        "opacity": 0.55,
        "style": "normal",
        "tileMatrixSet": "PM",
        "maxNativeZoom": 18
      },
      "menuTitle": "HAUTEUR HD",
      "menuSubtitle": "MNH LiDAR"
    },
    {
      "key": "mnt-bdalti",
      "label": "Pseudo-couleurs — MNT BD ALTI",
      "group": "Relief",
      "_comment": "Identifiant vérifié dans le catalogue cartes.gouv.fr / Géoplateforme en septembre 2026.",
      "mapLayer": {
        "kind": "wmts-tile",
        "layer": "ELEVATION.SLOPES",
        "format": "image/jpeg",
        "maxZoom": 20,
        "zIndex": 344,
        "opacity": 0.55,
        "style": "normal",
        "tileMatrixSet": "PM_6_14",
        "maxNativeZoom": 14
      },
      "menuTitle": "PSEUDO-COULEURS",
      "menuSubtitle": "MNT BD ALTI"
    },
    {
      "key": "carte-littorale",
      "label": "Carte littorale SHOM / IGN",
      "group": "Fond",
      "_comment": "Identifiant vérifié dans le catalogue cartes.gouv.fr / Géoplateforme en septembre 2026.",
      "mapLayer": {
        "kind": "wmts-tile",
        "layer": "GEOGRAPHICALGRIDSYSTEMS.COASTALMAPS",
        "format": "image/png",
        "maxZoom": 20,
        "zIndex": 355,
        "opacity": 0.75,
        "style": "normal",
        "tileMatrixSet": "PM"
      },
      "menuTitle": "LITTORAL",
      "menuSubtitle": "SHOM / IGN"
    },
    {
      "key": "forets-publiques",
      "label": "Forêts publiques — ONF",
      "group": "Nature",
      "_comment": "Identifiant vérifié dans le catalogue cartes.gouv.fr / Géoplateforme en septembre 2026.",
      "mapLayer": {
        "kind": "wmts-tile",
        "layer": "FORETS.PUBLIQUES",
        "format": "image/png",
        "maxZoom": 20,
        "zIndex": 332,
        "opacity": 0.6,
        "style": "FORETS PUBLIQUES ONF",
        "tileMatrixSet": "PM_3_16",
        "maxNativeZoom": 16
      },
      "menuTitle": "FORÊTS",
      "menuSubtitle": "Publiques ONF"
    },
    {
      "key": "sols",
      "label": "Carte des sols",
      "group": "Nature",
      "_comment": "Identifiant vérifié dans le catalogue cartes.gouv.fr / Géoplateforme en septembre 2026.",
      "mapLayer": {
        "kind": "wmts-tile",
        "layer": "INRA.CARTE.SOLS",
        "format": "image/png",
        "maxZoom": 20,
        "zIndex": 328,
        "opacity": 0.6,
        "style": "CARTE DES SOLS",
        "tileMatrixSet": "PM_6_16",
        "maxNativeZoom": 16
      },
      "menuTitle": "SOLS",
      "menuSubtitle": "Carte"
    },
    {
      "key": "cours-eau-bcae",
      "label": "Cours d'eau BCAE 2026",
      "group": "Nature",
      "_comment": "Identifiant vérifié dans le catalogue cartes.gouv.fr / Géoplateforme en septembre 2026.",
      "mapLayer": {
        "kind": "wmts-tile",
        "layer": "HYDROGRAPHY.BCAE.2026",
        "format": "image/png",
        "maxZoom": 20,
        "zIndex": 362,
        "opacity": 0.8,
        "style": "normal",
        "tileMatrixSet": "PM_6_17",
        "maxNativeZoom": 17
      },
      "menuTitle": "BCAE",
      "menuSubtitle": "Cours d’eau 2026"
    }
  ],
  "regionalHydrants": [
    {
      "label": "Métropole Rouen Normandie (DECI)",
      "epciCode": "200023414",
      "arcgisPortal": "https://sigapp.metropole-rouen-normandie.fr/portal",
      "arcgisItemId": "d85807b17b564a9cbbbeaf2ea49c4238"
    }
  ],
  "odsHydrants": [],
  "deciProviders": [
    {
      "department": "14",
      "label": "SDIS14 — Calvados",
      "status": "ready",
      "official": true,
      "source": "data.gouv.fr / data.calvados.fr",
      "formats": [
        "GeoJSON",
        "GeoPackage"
      ],
      "pei": "https://data.calvados.fr/sdis/deci_pei.geojson",
      "gpkg": "https://data.calvados.fr/sdis/sdis.gpkg",
      "perimeters": {
        "available200": "https://data.calvados.fr/sdis/deci_200m_disp.geojson",
        "available400": "https://data.calvados.fr/sdis/deci_400m_disp.geojson",
        "unavailable200": "https://data.calvados.fr/sdis/deci_200m_indisp.geojson",
        "unavailable400": "https://data.calvados.fr/sdis/deci_400m_indisp.geojson"
      },
      "fields": {
        "family": "id_famille",
        "subtype": "type_cod",
        "availability": "etat_cod"
      }
    },
    {
      "department": "76",
      "label": "SDIS76 — Seine-Maritime",
      "status": "ready",
      "official": true,
      "source": "data.gouv.fr / SDIS76",
      "formats": [
        "GeoPackage",
        "CSV"
      ],
      "gpkg": "https://www.data.gouv.fr/api/1/datasets/r/a942637e-94c3-445a-96e3-6ead1116efbe",
      "csv": "https://www.data.gouv.fr/api/1/datasets/r/b685a7ca-8e96-40df-9a69-c1d6c8e37916",
      "crs": "EPSG:2154",
      "fields": [
        "id_interne_pei",
        "label",
        "ref_terr",
        "domanialite",
        "commune",
        "code_insee",
        "quartier",
        "adresse",
        "prec_adresse",
        "precis_don",
        "type_rn",
        "type_rd",
        "disponible",
        "date_disp_chgt",
        "date_extraction_donnees",
        "x_l93",
        "y_l93"
      ],
      "notes": "Dataset officiel SDIS76. Préférer les URL stables data.gouv.fr pour les téléchargements ; la carte Lizmap publique est conservée comme référence interactive. Les archives Géo-IDE fournies sont conservées comme ressources complémentaires, sans supposer leur schéma.",
      "liveMap": "https://deci.sdis76.fr/lizmap/index.php/view/map/?repository=public&project=sectorisation",
      "directGpkg": "https://geo.sdis76.fr/documents/opendata/deci_sdis76__018f2e3b-3652-747d-af2d-49c931e00efa.gpkg",
      "additionalStableResources": [
        "https://www.data.gouv.fr/api/1/datasets/r/627266b2-7e71-478b-9985-71cd193a2f93",
        "https://www.data.gouv.fr/api/1/datasets/r/d81c2d99-ae3e-477c-9786-2e2ba5783765"
      ],
      "geoIdeArchives": [
        "https://atom.geo-ide.developpement-durable.gouv.fr/atomArchive/GetResource?id=988a54b2-8869-4d85-95bb-9e6acc585467&dataType=dataset",
        "https://atom.geo-ide.developpement-durable.gouv.fr/atomArchive/GetResource?id=6461740a-9843-4fbd-a280-c8efe1adecf3&dataType=dataset"
      ]
    },
    {
      "department": "27",
      "label": "SDIS27 — Eure",
      "status": "restricted_or_no_public_source",
      "official": true,
      "fallback": "osm"
    },
    {
      "department": "50",
      "label": "SDIS50 — Manche",
      "status": "restricted_or_no_public_source",
      "official": true,
      "platform": "ESCORT",
      "fallback": "osm"
    },
    {
      "department": "61",
      "label": "SDIS61 — Orne",
      "status": "restricted_or_no_public_source",
      "official": true,
      "platform": "REMOcRA",
      "fallback": "osm"
    }
  ],
  "cavityProviders": [
    {
      "key": "brgm",
      "label": "Géorisques / BRGM",
      "status": "ready",
      "scope": "national",
      "sourceKey": "cavites"
    },
    {
      "key": "ddtm76-rics",
      "label": "DDTM76 — RICS",
      "status": "stale_endpoint",
      "scope": "76",
      "sourceKeys": [],
      "layers": [
        {
          "role": "index_point",
          "sourceKey": "rics76-indices",
          "typeName": "Indices_ponctuels",
          "geometry": "Point"
        },
        {
          "role": "index_line",
          "sourceKey": "rics76-indices",
          "typeName": "Indices_line_aires",
          "geometry": "LineString/MultiLineString"
        },
        {
          "role": "index_surface",
          "sourceKey": "rics76-indices",
          "typeName": "Indices_surfaciques",
          "geometry": "Polygon/MultiPolygon"
        },
        {
          "role": "safety_perimeter",
          "sourceKey": "rics76-perimetres",
          "typeName": "Pe_rimetres_de_se_curite_s",
          "geometry": "Polygon/MultiPolygon"
        }
      ],
      "notes": "Endpoint Géo-IDE historique conservé comme référence uniquement. Runtime désactivé après erreurs TypeName not found observées le 23/09/2026 ; utiliser BRGM et MRN tant qu'un nouveau service officiel DDTM76 n'est pas confirmé."
    },
    {
      "key": "mrn",
      "label": "Métropole Rouen Normandie — Cavités",
      "status": "ready_opendata",
      "scope": "epci:200023414",
      "appUrl": "https://sigapp.metropole-rouen-normandie.fr/www/w/env/cavites/",
      "portal": "https://sigapp.metropole-rouen-normandie.fr/portal",
      "notes": "Utiliser les jeux OpenDataSoft MRN pour l'affichage des indices et zones de risques ; conserver l'application ArcGIS uniquement comme visionneuse/référence complémentaire.",
      "opendata": {
        "base": "https://rouenmetropole.opendatasoft.com",
        "datasets": [
          "donmeturb_cav_indice_pct",
          "cavites-souterraines-indices-lineaires-metropole-rouen-normandie",
          "cavites-souterraines-indices-surfaciques-metropole-rouen-normandie",
          "cavites-souterraines-zones-de-risques-metropole-rouen-normandie"
        ]
      }
    }
  ],
  "_deciComment": "Providers déclaratifs : données officielles 14/76 prêtes, 27/50/61 sans source publique vérifiée. OSM reste un fallback indicatif séparé, jamais fusionné silencieusement avec une source SDIS.",
  "_cavityComment": "Conserver séparément BRGM, RICS76 et MRN avec provenance. Pour RICS76 distinguer explicitement indices ponctuels, indices linéaires, indices surfaciques et périmètres de sécurité. Ne jamais remplacer un périmètre source par un cercle générique ni fusionner automatiquement des objets proches sans identifiant/attributs concordants.",
  "normandyCoverage": {
    "updatedAt": "2026-09-23",
    "departments": {
      "14": {
        "cavities": {
          "status": "national_brgm_only",
          "note": "Aucune source locale cavités vérifiée ajoutée à ce stade."
        },
        "deci": {
          "status": "official_ready",
          "provider": "SDIS14"
        },
        "wasteCenters": {
          "status": "mutualized_official",
          "provider": "ADEME_SINOE"
        },
        "urbanAuthorizations": {
          "status": "mutualized_official",
          "provider": "SDES_SITADEL",
          "freshness": "monthly"
        }
      },
      "27": {
        "cavities": {
          "status": "national_brgm_only",
          "note": "Aucune source locale cavités vérifiée ajoutée à ce stade."
        },
        "deci": {
          "status": "restricted_or_no_public_source",
          "fallback": "osm"
        },
        "wasteCenters": {
          "status": "mutualized_official",
          "provider": "ADEME_SINOE"
        },
        "urbanAuthorizations": {
          "status": "mutualized_official",
          "provider": "SDES_SITADEL",
          "freshness": "monthly"
        }
      },
      "50": {
        "cavities": {
          "status": "national_brgm_only",
          "note": "Aucune source locale cavités vérifiée ajoutée à ce stade."
        },
        "deci": {
          "status": "restricted_or_no_public_source",
          "fallback": "osm"
        },
        "wasteCenters": {
          "status": "mutualized_official",
          "provider": "ADEME_SINOE"
        },
        "urbanAuthorizations": {
          "status": "mutualized_official",
          "provider": "SDES_SITADEL",
          "freshness": "monthly"
        }
      },
      "61": {
        "cavities": {
          "status": "unstable_official_dataset",
          "producer": "DDT61 / DREAL Normandie",
          "datasetTitle": "Cavités inventoriées en 2026 dans le département de l'Orne",
          "sourceValidity": "2026-04-07",
          "integrationPolicy": "integrate_even_without_stable_endpoint"
        },
        "deci": {
          "status": "restricted_or_no_public_source",
          "fallback": "osm",
          "platform": "REMOcRA"
        },
        "wasteCenters": {
          "status": "mutualized_official",
          "provider": "ADEME_SINOE"
        },
        "urbanAuthorizations": {
          "status": "mutualized_official",
          "provider": "SDES_SITADEL",
          "freshness": "monthly"
        }
      }
    },
    "nationalFallbacks": {
      "wasteCenters": {
        "source": "ADEME SINOE",
        "datasetTitle": "SINOE ® - Annuaire des déchèteries DMA",
        "status": "official_national"
      },
      "urbanAuthorizations": {
        "source": "SDES Sitadel",
        "datasetTitle": "Liste des permis de construire et autres autorisations d’urbanisme",
        "status": "official_national"
      }
    },
    "latestVerified": {
      "urbanAuthorizations": {
        "source": "SDES Sitadel",
        "status": "official_national_monthly",
        "datasetTitle": "Liste des permis de construire et autres autorisations d’urbanisme",
        "freshness": "mensuel",
        "verifiedAt": "2026-09-23"
      },
      "wasteCenters": {
        "source": "ADEME SINOE",
        "status": "official_national",
        "datasetTitle": "SINOE ® - Annuaire des déchèteries DMA",
        "freshness": "2026",
        "verifiedAt": "2026-09-23"
      },
      "wasteStatistics": {
        "source": "ADEME SINOE",
        "status": "official_national",
        "datasets": [
          "SINOE ® - Chiffres-clés Déchèteries (hors-gravats)",
          "SINOE ® - Tonnage déchèteries par type de déchet et département"
        ],
        "latestMetadataUpdate": "2026-08-20"
      },
      "cavities61": {
        "source": "DDT61 / DREAL Normandie",
        "status": "unstable_official_dataset",
        "datasetTitle": "Cavités inventoriées en 2026 dans le département de l'Orne",
        "sourceValidity": "2026-04-07",
        "note": "Intégrer même sans endpoint permanent ; prévoir un adaptateur de téléchargement/source externe."
      }
    }
  },
  "providerPolicy": {
    "preferMutualized": true,
    "allowUnstableSources": true,
    "rules": [
      "Préférer une source nationale/régionale officielle lorsqu'elle couvre plusieurs départements avec un schéma homogène.",
      "Conserver une source locale lorsqu'elle apporte une meilleure précision géométrique ou des attributs métier supplémentaires.",
      "Les sources non stables ou sans endpoint permanent peuvent être intégrées avec status=unstable, sourceUrl et date de vérification.",
      "Ne jamais masquer la provenance ni fusionner silencieusement deux sources de niveaux différents."
    ]
  },
  "geopfCatalog": {
    "wmsCapabilities": "https://data.geopf.fr/wms-v/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities",
    "policy": "Le catalogue WMS Géoplateforme est une source mutualisée. Ajouter les couches utiles au fur et à mesure après validation de leur Name exact ; conserver le GetCapabilities comme référence pour détecter les nouveautés.",
    "alreadyUsed": [
      "GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2",
      "GEOGRAPHICALGRIDSYSTEMS.MAPS.SCAN25TOUR",
      "ORTHOIMAGERY.ORTHOPHOTOS",
      "ORTHOIMAGERY.ORTHOPHOTOS.1950-1965",
      "GEOGRAPHICALGRIDSYSTEMS.ETATMAJOR40",
      "CADASTRALPARCELS.PARCELLAIRE_EXPRESS",
      "ELEVATION.CONTOUR.LINE",
      "GEOGRAPHICALGRIDSYSTEMS.SLOPES.PAC",
      "GEOGRAPHICALGRIDSYSTEMS.SLOPES.MOUNTAIN",
      "HYDROGRAPHY.HYDROGRAPHY",
      "LANDCOVER.FORESTINVENTORY.V2",
      "LIMITES_ADMINISTRATIVES_EXPRESS.LATEST",
      "LANDUSE.AGRICULTURE.LATEST",
      "LANDCOVER.CLC18_FR",
      "IGNF_LIDAR-HD_MNT_ELEVATION.ELEVATIONGRIDCOVERAGE.SHADOW",
      "IGNF_LIDAR-HD_MNS_ELEVATION.ELEVATIONGRIDCOVERAGE.SHADOW",
      "ELEVATION.SLOPES",
      "GEOGRAPHICALGRIDSYSTEMS.COASTALMAPS",
      "FORETS.PUBLIQUES",
      "INRA.CARTE.SOLS",
      "HYDROGRAPHY.BCAE.2026"
    ],
    "candidatesIntegrated": [
      "TRANSPORTNETWORKS.ROADS",
      "TRANSPORTNETWORKS.RAILWAYS",
      "ELEVATION.ELEVATIONGRIDCOVERAGE"
    ],
    "unstablePolicy": "Les couches GeoPF utiles sont conservées même si leur disponibilité varie ; une panne de couche ne doit pas casser les autres sources.",
    "unverifiedRemoved": [
      "BUILDINGS.BUILDINGS",
      "ADMINISTRATIVEUNITS.BOUNDARIES",
      "LANDCOVER.LANDCOVER",
      "PROTECTEDAREAS.PROTECTEDAREAS"
    ],
    "lastVerified": "2026-09-23",
    "catalogReference": "https://cartes.gouv.fr/",
    "experimentalRelief": []
  },
  "_hydrantsComment": "Le miroir Babel/OpenDataSoft OSM-FR est désactivé après erreurs HTTP 500 répétées. Le moteur utilise Overpass OSM et, lorsqu'ils sont disponibles, les providers DECI régionaux.",
  "sourceResearch": {
    "geoIdeMapFde9e71e": {
      "url": "https://carto2.geo-ide.din.developpement-durable.gouv.fr/rest-api/v1/public/Maps/fde9e71e-83be-4e63-a8ec-9d6e587ed006",
      "status": "inspect_before_runtime",
      "note": "Le précédent endpoint QGIS/WFS dérivé de cette carte a changé de schéma/TypeNames. Utiliser l'API publique Maps pour redécouvrir les couches avant de réactiver RICS76."
    }
  }
}
