# Branchement BDNB + Fichiers fonciers

## Objectif

Utiliser la BDNB comme couche de géométrie bâtimentaire fine, puis récupérer dans les Fichiers fonciers les informations utiles à la narration : année de construction approximative, usage, locaux, logements et surfaces.

La vue finale reste compatible avec l'application :

```text
foncier_poc.v_batiments_historique
```

## Tables sources attendues

### BDNB

Table attendue par défaut :

```text
foncier_poc.bdnb
```

Champs attendus :

```text
fid
batiment_construction_id
batiment_groupe_id
code_departement_insee
code_iris
code_commune_insee
s_geom_cstr
hauteur
altitude_sol
fictive_geom_cstr
geom
```

Si votre table ou votre colonne géométrique porte un autre nom, adaptez le script :

```text
sql/20_bdnb_croisement_fichiers_fonciers.sql
```

### Fichiers fonciers

Table attendue :

```text
foncier_poc.fichier_foncier
```

Avant le script BDNB, lancer au moins un script Fichiers fonciers :

```sql
sql/10_fichiers_fonciers_pnb10_parcelle.sql
```

ou :

```sql
sql/10_setup_fichiers_fonciers_pnb10.sql
```

## Ordre d'exécution recommandé

Dans pgAdmin :

```sql
-- 1. Préparer les vues FF
\i sql/10_fichiers_fonciers_pnb10_parcelle.sql

-- 2. Croiser BDNB avec FF et remplacer la vue bâtimentaire
\i sql/20_bdnb_croisement_fichiers_fonciers.sql
```

Si vous copiez-collez dans pgAdmin, exécutez simplement le contenu des deux fichiers dans cet ordre.

## Principe de croisement

Le script crée une vue propre BDNB :

```text
foncier_poc.v_bdnb_batiments
```

Puis une vue matérialisée :

```text
foncier_poc.mv_bdnb_ff_croisement
```

Pour chaque bâtiment BDNB, la parcelle FF retenue est celle qui possède la plus grande surface d'intersection avec le polygone BDNB.

La vue finale devient :

```text
foncier_poc.v_batiments_historique
```

Elle contient notamment :

```text
id_batiment
geom
code_territoire
nom_territoire
code_insee
commune
annee_apparition
surface_emprise_m2
usage
hauteur_m
altitude_sol_m
source_geom
fictive_geom_cstr
match_ff_quality
source_annee
qualite_annee
```

## Configuration `.env`

Avec la BDNB, une ligne correspond déjà à un bâtiment. Il faut donc retirer le comptage pondéré des parcelles FF.

```env
FONCIER_SCHEMA=foncier_poc
FONCIER_BUILDINGS_VIEW=v_batiments_historique
FONCIER_TERRITORIES_VIEW=v_territoires
FONCIER_GEOM_COL=geom
FONCIER_COUNT_COL=
FONCIER_DEFAULT_LEVEL=commune
FONCIER_START_YEAR=1970
FONCIER_END_YEAR=2025
```

## Contrôles SQL

### Qualité générale du croisement

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

### Contrôle par commune

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

### Années d'apparition

```sql
SELECT
  annee_apparition,
  count(*) AS nb_batiments,
  sum(surface_emprise_m2) AS surface_emprise_m2
FROM foncier_poc.v_batiments_historique
WHERE annee_apparition IS NOT NULL
GROUP BY annee_apparition
ORDER BY annee_apparition;
```

### Hauteurs

```sql
SELECT
  count(*) AS nb_batiments,
  count(*) FILTER (WHERE hauteur_m IS NOT NULL) AS nb_avec_hauteur,
  min(hauteur_m) AS hauteur_min,
  percentile_cont(0.5) WITHIN GROUP (ORDER BY hauteur_m) AS hauteur_mediane,
  avg(hauteur_m) AS hauteur_moyenne,
  max(hauteur_m) AS hauteur_max
FROM foncier_poc.v_batiments_historique;
```

## Affichage 3D

L'application actuelle utilise Leaflet pour la carte 2D. Pour une vraie 3D bâtimentaire, il faudra passer cette carte sur MapLibre GL JS ou deck.gl.

Principe MapLibre :

```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
  }
});
```

Il vaut mieux utiliser `hauteur_m` comme hauteur d'extrusion. Le champ `altitude_sol_m` peut être conservé comme information, mais il ne faut pas l'utiliser trop vite comme base d'extrusion sans modèle de terrain cohérent dans le visualiseur.

## Limites méthodologiques à afficher

Formulation recommandée :

> La géométrie des bâtiments provient de la BDNB. L'année d'apparition est estimée par croisement spatial avec les Fichiers fonciers à la parcelle. Cette lecture est pertinente pour comprendre les dynamiques, mais l'année affectée à un bâtiment peut être approximative lorsque plusieurs bâtiments ou plusieurs périodes de construction existent sur une même parcelle.

## Rafraîchissement après mise à jour des sources

Après un nouvel import BDNB ou Fichiers fonciers :

```sql
REFRESH MATERIALIZED VIEW foncier_poc.mv_bdnb_ff_croisement;
```

Si les colonnes ou les vues changent, relancer plutôt l'ensemble du script :

```sql
sql/20_bdnb_croisement_fichiers_fonciers.sql
```
