API REST pour accéder aux données géographiques et administratives des communes françaises et entités associées.
Basé sur le COG INSEE, les géométries IGN Admin Express, Banatic, La Poste et le référentiel AOM (data.gouv.fr).
Architecture : SQLite pur (data/apigeo.db) — géométries en WKT + GeoJSON pré-calculé, filtres spatiaux via Shapely au runtime (pas d’extension SpatiaLite requise).
- Python 3.11+
- Dépendances :
pip install -r requirements.txt(+requirements-api.txtpour l’API)
Préparer l'environnement avec
uv venv venv
source venv/bin/activate# 1. Installer les dépendances
uv pip install -r requirements.txt
# 2. Télécharger les données administratives (COG, Banatic, AOM, intercos…)
python3 1_download_decoupage_administratif_data.py
# 3. Télécharger les géométries IGN et OSM pour les COM (collectivités d'Outre Mer)
python3 2_download_geometries_ign.py
# 4. Convertir depuis les GPKG en GeoJSON depuis Admin Express (commune, arrondissement_municipal, commune_associee_ou_deleguee, collectivite_territoriale")
python3 3_convert_admin_express_into_geojson.py
# 5. Assemble communes from sources AdminExpress and OSM, generate data for mairies
python3 4_assemble_communes_and_mairies_from_source.py
# 6. Simplifier les GeoJSON des communes, des arrondissements municpaux et des communes déléguées et associées, (5m, 10m, 100m, 1000m)
python3 5_simplify_geojson.py
# 7. Assembler les unités administratives supérieures depuis les données simplifiées des communes (régions, départements, intercommunalités, AOM)
python3 6_assemble_by_admin_units.py
# 6. Charger dans SQLite
python3 7_load_into_spatialite.py
# 7. Lancer l'API
uvicorn app.main:app --reloadL'API est accessible sur http://localhost:8000
# Préparer les données (une fois, en local)
python3 1_download_decoupage_administratif_data.py
python3 2_download_geometries_ign.py
python3 3_convert_admin_express_into_geojson.py
python3 4_assemble_communes_and_mairies_from_source.py
python3 5_simplify_geojson.py
python3 6_assemble_by_admin_units.py
python3 7_load_into_spatialite.py
# Lancer l'API
docker-compose up- Swagger UI : http://localhost:8000/docs
- ReDoc : http://localhost:8000/redoc
- Workflow détaillé : WORKFLOW.md
GET /communes
GET /communes/{code}
GET /communes_associees_deleguees
GET /communes_associees_deleguees/{code}Filtres : nom, codePostal, codeDepartement, departement, region, lat/lon, fields, limit, offset.
GET /departements
GET /departements/{code}
GET /departements/{code}/communes
GET /regions
GET /regions/{code}
GET /regions/{code}/departements
GET /regions/{code}/communesGET /epcis # CA, CU, CC, MET69, METRO
GET /epcis/{code}
GET /epcis/{code}/communes # ?fields=competences
GET /groupement_collectivites_territoriales
GET /groupement_collectivites_territoriales/{code}
GET /groupement_collectivites_territoriales/{code}/communes # ?fields=competencesGET /stats
GET /healthapigeo2/
├── app/
│ ├── main.py # Routes FastAPI
│ ├── database.py # Connexion SQLite
│ ├── schemas.py # Schémas Pydantic
│ ├── entities/ # Logique métier par entité
│ │ ├── communes.py
│ │ ├── departements.py
│ │ ├── regions.py
│ │ ├── intercommunalites.py
│ │ └── epcis.py
│ └── ...
├── data/
│ ├── *.csv # Métadonnées COG, intercos, AOM…
│ ├── *.geojson # Géométries brutes
│ ├── *_5m.geojson # Géométries simplifiées (utilisées en base)
│ └── apigeo.db # Base SQLite
├── sources/ # Shapefiles IGN
├── 1_download_decoupage_administratif_data.py
├── 2_download_geometries_ign.py
├── 3_convert_shape_into_geojson.py
├── 4_simplify_geojson.py
├── 5_load_into_spatialite.py
├── competences_mapping.json # Libellés compétences interco
├── reset_database.py
├── docker-compose.yml
└── requirements.txt
- Fichier unique
data/apigeo.db, portable et sans serveur - Géométries stockées en WKT (
geometry) et GeoJSON (geometry_geojson) pré-calculés à l’import - Vues SQL pour joindre métadonnées et géométries (
communes,departements,regions,interco,aom) - Index sur codes,
nom_recherche, bbox des communes
| Domaine | Métadonnées | Géométries | Liaisons |
|---|---|---|---|
| Communes | communes_metadata |
communes_geometries |
— |
| Départements | departements_metadata |
departements_geometries |
— |
| Régions | regions_metadata |
regions_geometries |
— |
| Intercos | interco_metadata |
interco_geometries |
commune_interco_associations, interco_commune |
| AOM | aom_metadata |
aom_geometries |
aom_commune |
# Supprimer la base et recharger
python3 reset_database.py
python3 5_load_into_spatialite.py
# Migration bbox seule (base existante)
python3 5_load_into_spatialite.py --migrate-bboxsqlite3 data/apigeo.db
SELECT COUNT(*) FROM communes;
SELECT siren, nom FROM aom LIMIT 5;- COG INSEE : data.gouv.fr
- IGN Admin Express : geoservices.ign.fr
- Banatic : SIREN, intercommunalités, membres
- La Poste : codes postaux
- AOM : liste et composition des AOM (fichier ODS annuel — URL à mettre à jour dans le script 1)
Licence Ouverte / Open Licence 2.0.
ls -lh data/apigeo.db
python3 5_load_into_spatialite.pypython3 reset_database.py
python3 1_download_decoupage_administratif_data.py
python3 2_download_geometries_ign.py
python3 3_convert_shape_into_geojson.py
python3 4_simplify_geojson.py
python3 5_load_into_spatialite.pyVérifier que les scripts 2, 3 et 4 ont bien produit les fichiers *_5m.geojson dans data/.
- WORKFLOW.md — pipeline pas à pas
- PERFORMANCE.md — GeoJSON pré-calculé, simplification
- ENRICHISSEMENT_SIREN.md
- ENRICHISSEMENT_EPCI.md
- DEPARTEMENTS.md
- REGIONS.md
Projet et données sources : Licence Ouverte / Open Licence 2.0.