# Branchement BDNB x Fichiers fonciers

Objectif : utiliser les polygones BDNB comme géométrie principale des bâtiments, puis récupérer depuis les Fichiers fonciers les informations temporelles et d'usage disponibles à la parcelle.

## Principe métier

- **BDNB** : géométrie bâtimentaire, hauteur, identifiant de construction ou de groupe.
- **Fichiers fonciers `pnb10_parcelle`** : année de construction du local le plus ancien/récent, usage dominant, logements, locaux, nombre de bâtiments, parcelle.
- **Application** : carte animée depuis 1970 avec de vrais polygones bâtimentaires au lieu de simples parcelles.

La vue finale à utiliser dans l'application est :

```text
foncier_poc.v_batiments_historique_bdnb_ff
```

## Pré-requis

Le script part des hypothèses suivantes :

```text
foncier_poc.bdnb      -- table BDNB importée dans PostGIS
foncier_poc.bdnb.geom -- géométrie bâtimentaire
foncier_poc.fichier_foncier     -- table Fichiers fonciers pnb10_parcelle
foncier_poc.fichier_foncier.geompar
```

Si ta table BDNB a un autre nom ou si la géométrie ne s'appelle pas `geom`, il faut adapter le début du script SQL.

Pour vérifier le nom de la géométrie :

```sql
SELECT f_table_schema, f_table_name, f_geometry_column, srid, type
FROM geometry_columns
WHERE f_table_schema = 'foncier_poc'
ORDER BY f_table_name;
```

## Script à lancer

Dans pgAdmin, lancer :

```sql
sql/11_bdnb_x_fichiers_fonciers.sql
```

Le script crée :

```text
foncier_poc.mv_bdnb_batiments_normalises
foncier_poc.mv_bdnb_x_ff
foncier_poc.v_batiments_historique_bdnb_ff
foncier_poc.v_controle_bdnb_ff
foncier_poc.v_controle_bdnb_ff_par_commune
```

## .env recommandé

```env
FONCIER_SCHEMA=foncier_poc
FONCIER_BUILDINGS_VIEW=v_batiments_historique_bdnb_ff
FONCIER_TERRITORIES_VIEW=v_territoires
FONCIER_GEOM_COL=geom
FONCIER_COUNT_COL=
FONCIER_HEIGHT_COL=hauteur_m
FONCIER_ALTITUDE_COL=altitude_sol_m
FONCIER_GEOM_FICTIVE_COL=geom_fictive
FONCIER_DEFAULT_LEVEL=commune
FONCIER_START_YEAR=1970
FONCIER_END_YEAR=2025
```

`FONCIER_COUNT_COL` doit rester vide avec la BDNB, car on dispose normalement d'une ligne par bâtiment.

## Tests SQL

```sql
SELECT * FROM foncier_poc.v_controle_bdnb_ff;
```

```sql
SELECT *
FROM foncier_poc.v_controle_bdnb_ff_par_commune
ORDER BY nb_batiments_bdnb DESC
LIMIT 20;
```

```sql
SELECT annee_apparition, count(*) AS nb_batiments
FROM foncier_poc.v_batiments_historique_bdnb_ff
WHERE code_insee = '62001'
GROUP BY annee_apparition
ORDER BY annee_apparition;
```

## Tests API

```text
/api/territoires?niveau=commune
/api/timeline/stats?territoire=62001&niveau=commune
/api/batiments?territoire=62001&niveau=commune&year=2025&mode=cumul
```

Les GeoJSON retournés par `/api/batiments` peuvent maintenant contenir :

```json
{
  "hauteur_m": 8.5,
  "altitude_sol_m": 42.0,
  "geom_fictive": false
}
```

## Affichage 3D

La version actuelle du prototype utilise Leaflet : elle peut afficher les bâtiments en 2D, mais pas faire de vraie extrusion 3D propre.

Pour la 3D, il faudra ajouter un mode MapLibre GL JS. Exemple de couche :

```js
map.addLayer({
  id: "batiments-3d",
  type: "fill-extrusion",
  source: "batiments",
  paint: {
    "fill-extrusion-height": ["coalesce", ["get", "hauteur_m"], 3],
    "fill-extrusion-base": 0,
    "fill-extrusion-opacity": 0.72
  }
});
```

On conseille de ne pas utiliser `altitude_sol_m` comme base d'extrusion tant qu'un vrai terrain 3D n'est pas activé, sinon les bâtiments peuvent paraître flotter.

## Limites à afficher dans le POC

- L'année vient des Fichiers fonciers à la parcelle, pas toujours du bâtiment lui-même.
- Sur une parcelle avec plusieurs bâtiments, plusieurs polygones BDNB peuvent hériter de la même année.
- Les géométries fictives BDNB doivent être signalées ou affichées avec une symbologie plus discrète.
- La hauteur permet une lecture morphologique, mais elle ne remplace pas un relevé architectural.
- Pour une production fluide à l'échelle EPCI, il faudra passer de GeoJSON à des tuiles vectorielles ou PMTiles.
