No description
  • PHP 70.9%
  • Hack 29.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
allfab 47e56e338f Deplacer l'application de visualisation sous viewer/
- src/ et public/ deplaces sous viewer/
- Chemin vers config/database.php mis a jour dans filiation.php
- README mis a jour (structure, commande serveur)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 20:55:51 +01:00
config Consolidation de la documentation dans README.md 2026-02-24 20:51:20 +01:00
data/2026 INIT COMMIT 2026-02-24 17:26:59 +01:00
docs Consolidation de la documentation dans README.md 2026-02-24 20:51:20 +01:00
scripts Filtre import sur les 30 communes de Vienne Condrieu Agglomeration 2026-02-24 20:34:30 +01:00
sql Reecriture import DFI : pipeline staging + COPY (x10 perf) 2026-02-24 19:16:58 +01:00
viewer Deplacer l'application de visualisation sous viewer/ 2026-02-24 20:55:51 +01:00
.env.example MVP PHASE 1 2026-02-24 19:01:09 +01:00
.gitignore MVP PHASE 1 2026-02-24 19:01:09 +01:00
CLAUDE.md INIT COMMIT 2026-02-24 17:31:33 +01:00
LICENSE Initial commit 2026-02-24 16:44:12 +01:00
README.md Deplacer l'application de visualisation sous viewer/ 2026-02-24 20:55:51 +01:00

DGFiP - Documents de Filiation Informatises (DFI)

Application de consultation et de visualisation de la filiation des parcelles cadastrales, basee sur les Documents de Filiation Informatises (DFI) publies par la DGFiP.

Contexte

Les DFI recensent l'ensemble des modifications parcellaires (divisions, reunions, lotissements, etc.) realisees depuis l'informatisation de la procedure de mise a jour cadastrale (entre 1980 et 1990 selon les departements). Ils permettent de reconstituer l'historique complet d'une parcelle : ses ascendants (parcelles meres) et ses descendants (parcelles filles).

Source des donnees : data.economie.gouv.fr

Note

: Le dataset ne propose pas d'API queryable (0 enregistrements exposes). Les donnees sont uniquement disponibles sous forme de fichiers TXT a telecharger par departement.

Perimetre

Vienne Condrieu Agglomeration : 30 communes (18 en Isere, 12 dans le Rhone).

Fichiers source :

  • Isere (38) : data/2026/dfiano-dep380-03012026.txt -- 746 062 lignes
  • Rhone (69) : data/2026/dfiano-dep690-03012026.txt -- 595 678 lignes

L'import filtre les donnees pour ne conserver que les communes VCA (option --communes-vca). La liste des codes INSEE est dans config/communes-vca.php.


Prerequis

  • PostgreSQL >= 12
  • PHP >= 8.1 avec l'extension pdo_pgsql
  • Une base de donnees vca existante
php -v
php -m | grep pdo_pgsql
createdb vca

Installation

1. Configuration de la base de donnees

cp .env.example .env

Editer .env :

DB_HOST=localhost
DB_PORT=5432
DB_NAME=vca
DB_SCHEMA=dgfip_dfi
DB_USER=postgres
DB_PASSWORD=mon_mot_de_passe

Le fichier config/database.php charge automatiquement le .env a la racine du projet. Les variables d'environnement systeme sont prioritaires.

Parametre Valeur par defaut Variable d'environnement
Host localhost DB_HOST
Port 5432 DB_PORT
Base vca DB_NAME
Schema dgfip_dfi DB_SCHEMA
Utilisateur postgres DB_USER
Mot de passe (vide) DB_PASSWORD

2. Creation du schema

psql -f sql/schema.sql vca

3. Import des donnees

# Import filtre sur les 30 communes VCA
php scripts/import.php --truncate --communes-vca \
  data/2026/dfiano-dep380-03012026.txt \
  data/2026/dfiano-dep690-03012026.txt
Option Description
--truncate Vide les tables avant import (TRUNCATE ... CASCADE)
--communes-vca Importe uniquement les 30 communes de VCA

4. Demarrage du serveur

php -S localhost:8000 -t viewer/public/

Ouvrir http://localhost:8000/ dans le navigateur.


Architecture

Stack technique

Composant Technologie
Base de donnees PostgreSQL
Backend PHP natif (PSR-12)
Visualisation d3-graphviz v5
CSS Tailwind CSS (Play CDN)
JS d3 v7, @hpcc-js/wasm v2 (CDN, zero build)

Schema de base de donnees

3 tables normalisees dans le schema dgfip_dfi :

dfi_documents 1──N dfi_lots 1──N dfi_parcelles
     (dept,commune,         (num_lot)       (type, section,
      prefixe,id_dfi,                        numero, parcelle_id)
      nature,date_valid)

dfi_documents

Colonne Type Description
id SERIAL PK Identifiant auto-incremente
dept CHAR(3) Code departement + direction DGFiP (ex: 380, 690)
commune CHAR(3) Code commune (ex: 558, 235)
prefixe CHAR(3) Prefixe de section (defaut 000)
id_dfi CHAR(7) Numero du document DFI
nature SMALLINT Type de document (voir ci-dessous)
date_valid DATE Date de validation

Contrainte UNIQUE sur (dept, commune, prefixe, id_dfi).

dfi_lots

Colonne Type Description
id SERIAL PK Identifiant auto-incremente
document_id INTEGER FK Reference vers dfi_documents(id)
num_lot CHAR(5) Numero du lot (ex: 00001)

Contrainte UNIQUE sur (document_id, num_lot).

dfi_parcelles

Colonne Type Description
id SERIAL PK Identifiant auto-incremente
lot_id INTEGER FK Reference vers dfi_lots(id)
type SMALLINT 1 = mere (disparait), 2 = fille (apparait)
section CHAR(2) Section cadastrale (ex: AC, 0C)
numero CHAR(4) Numero de parcelle (ex: 0335)
parcelle_id CHAR(14) Cle de recherche composite

Index sur parcelle_id, lot_id et document_id.

Construction du parcelle_id (14 caracteres)

dept(2) + commune(3) + prefixe(3) + section(2) + numero(4)

Le champ dept du fichier fait 3 caracteres (departement + direction DGFiP). Seuls les 2 premiers caracteres entrent dans le parcelle_id. Les sections a une seule lettre sont completees avec 0 a gauche.

Fichier (dept;commune;prefixe + parcelle) parcelle_id
380;558;000 + 0C0335 385580000C0335
690;235;000 + AE0218 69235000AE0218

Codes nature DFI

Code Nature
1 Document d'arpentage
2 Croquis de conservation
4 Remaniement
5 Arpentage numerique
6 Lotissement numerique
7 Lotissement
8 Renovation

Requete de filiation (CTE recursive)

La construction de l'arbre de filiation repose sur une CTE recursive PostgreSQL dans viewer/src/Filiation.php :

  1. Rechercher la parcelle cible dans dfi_parcelles
  2. Ascendants : pour chaque lot ou la parcelle est fille (type 2), recuperer les meres (type 1) du meme lot, puis iterer recursivement
  3. Descendants : pour chaque lot ou la parcelle est mere (type 1), recuperer les filles (type 2) du meme lot, puis iterer recursivement
  4. UNION des deux branches avec DISTINCT, garde-fou depth < 50
Meres (type 1)          Filles (type 2)
    AI0336        -->       AI0337, AI0338
                  lot

API

GET /api/filiation.php?parcelle=38544000BI0498

{
    "parcelle": "38544000BI0498",
    "nodes": [
        {"id": "38544000BI0498", "type": "cible"},
        {"id": "38544000BI0393", "type": "mere"},
        {"id": "38544000BI0399", "type": "fille"}
    ],
    "edges": [
        {"from": "38544000BI0393", "to": "38544000BI0498", "dfi": "0001234", "date": "2005-03-12"}
    ],
    "dot": "digraph filiation { ... }"
}
Code Erreur
400 Parametre parcelle manquant ou invalide
404 Parcelle introuvable en base
500 Erreur serveur

Visualisation

Le graphe de filiation est un DAG (Directed Acyclic Graph) rendu avec d3-graphviz :

Type de noeud Forme Couleur
Cible Losange (diamond) Bleu fonce
Mere Trapeze inverse Jaune/ambre
Fille Trapeze Bleu clair
  • Aretes orthogonales (splines=ortho), labels "Mere"/"Fille" sur les petits graphes
  • Espacement adaptatif selon la taille du graphe
  • Zoom et pan interactifs (d3.zoom)

Exemple de filiation


Structure du projet

dgfip-dfi/
    config/
        database.php            # Connexion PDO PostgreSQL
        communes-vca.php        # Liste des 30 communes VCA (codes INSEE)
    data/
        2026/
            dfiano-dep380-03012026.txt
            dfiano-dep690-03012026.txt
    docs/
        images/                 # Captures d'ecran de la visualisation
        pdf/                    # Specification officielle du format DFI
    scripts/
        import.php              # Import TXT -> PostgreSQL (staging + COPY)
    sql/
        schema.sql              # Schema PostgreSQL (tables + index)
    viewer/
        public/
            index.php           # Interface web (formulaire + d3-graphviz)
            api/
                filiation.php   # Endpoint JSON
        src/
            Filiation.php       # CTE recursive (ascendants + descendants)
            DotGenerator.php    # Generation du source DOT (Graphviz)

Pipeline d'import

Le script scripts/import.php utilise une architecture staging + COPY :

Phase Description
0 Arguments CLI + connexion PDO
1 Drop des index (accelere les INSERT)
2 Truncate des tables si --truncate
3 Parsing PHP + COPY : fgets(), batch 100 000, pgsqlCopyFromArray() dans dfi_staging
4 Normalisation SQL : 3 INSERT...SELECT vers dfi_documents, dfi_lots, dfi_parcelles
5 Nettoyage : TRUNCATE de dfi_staging
6 Recreation des index
7 ANALYZE (statistiques PostgreSQL)

Les phases 3 a 5 sont repetees pour chaque fichier. Avec --communes-vca, le filtre s'applique en phase 3 (seules les lignes des communes VCA sont chargees dans le staging).


Verification post-import

psql vca
SET search_path TO dgfip_dfi, public;

-- Comptages
SELECT COUNT(*) AS documents FROM dfi_documents;
SELECT COUNT(*) AS lots      FROM dfi_lots;
SELECT COUNT(*) AS parcelles FROM dfi_parcelles;

-- Distribution par departement
SELECT LEFT(dept, 2) AS dept_code, COUNT(*) AS nb_documents
FROM dfi_documents
GROUP BY dept_code
ORDER BY dept_code;

-- Verifier une reference cadastrale
SELECT p.parcelle_id, p.type, p.section, p.numero, l.num_lot, d.id_dfi, d.dept, d.commune
FROM dfi_parcelles p
JOIN dfi_lots l ON l.id = p.lot_id
JOIN dfi_documents d ON d.id = l.document_id
WHERE p.parcelle_id = '38544000BI0498';

Format des fichiers source

Les fichiers TXT sont telecharges depuis data.economie.gouv.fr. Separateur ;.

index:  0     1       2       3       4      5     6         7       8       9          10+
champ:  dept; commune;prefixe;id_dfi; nature;date; geometre; anonyme;num_lot;type_ligne;parcelle1;parcelle2;...
Index Champ Taille Description
0 dept 3 Code departement (2) + direction DGFiP (1)
1 commune 3 Code commune INSEE
2 prefixe 3 Prefixe de section
3 id_dfi 7 Numero du document DFI
4 nature 1 Code nature (1,2,4,5,6,7,8)
5 date 8 Date AAAAMMJJ
6 geometre 30 Redacteur (anonymise : XXXXXREDACTEUR...)
7 anonyme - Champ XNUMX (absent de la spec officielle)
8 num_lot 5 Numero de lot
9 type_ligne 1 1 = parcelles meres, 2 = parcelles filles
10+ parcelles 6 chacune Section (2 car.) + numero (4 car.)

Le nombre de parcelles est variable (0 a N par ligne).

Exemple

Division de la parcelle AC 26 en parcelles AC 214 et AC 215 :

023;001;000;0000450;1;19900813;XXXXXREDACTEURDUDOCUMENTXXXXXX;XNUMX;00001;1;AC0026;
023;001;000;0000450;1;19900813;XXXXXREDACTEURDUDOCUMENTXXXXXX;XNUMX;00001;2;AC0214;AC0215;

References de test

Parcelles utilisables pour valider la filiation (communes VCA) :

  • 38544000BI0498 -- Vienne (grand arbre, 43 noeuds)
  • 382150000A0727 -- Luzinay
  • 690800000A0638 -- Echalas
  • 69253000AE0308 -- Tupin-et-Semons

Licence

Donnees sous Licence Ouverte v2.0 (Etalab).