- PHP 70.9%
- Hack 29.1%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
- 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> |
||
| config | ||
| data/2026 | ||
| docs | ||
| scripts | ||
| sql | ||
| viewer | ||
| .env.example | ||
| .gitignore | ||
| CLAUDE.md | ||
| LICENSE | ||
| README.md | ||
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
vcaexistante
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 :
- Rechercher la parcelle cible dans
dfi_parcelles - Ascendants : pour chaque lot ou la parcelle est fille (type 2), recuperer les meres (type 1) du meme lot, puis iterer recursivement
- Descendants : pour chaque lot ou la parcelle est mere (type 1), recuperer les filles (type 2) du meme lot, puis iterer recursivement
- 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)
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-- Luzinay690800000A0638-- Echalas69253000AE0308-- Tupin-et-Semons
Licence
Donnees sous Licence Ouverte v2.0 (Etalab).
