Organisation de projet
La classe Project sert à standardiser un répertoire de travail cartographique avec une structure simple et prévisible.
Quand utiliser Project
Utilisez Project si vous voulez :
- centraliser les données d’entrée et les sorties
- enregistrer rapidement des couches dans
data/ - garder une structure cohérente entre plusieurs notebooks ou scripts
- classer automatiquement les fichiers par type
- vérifier l’intégrité d’un jeu de données avant de le partager (sidecars manquants, fichiers illisibles)
Structure créée
Au minimum, Project.init() crée deux dossiers :
data/output/
Après organize_project(), le contenu de data/ peut être réparti dans :
data/vector/data/raster/data/tabular/
Exemple de départ
from cartograpy.project import Project
project = Project(
path="./mon_projet",
data_dir="data",
output_dir="output",
crs="EPSG:4326",
)
project.init()Ajouter des données au projet
from cartograpy.data import load
regions = load("../data/vector/gadm41_CIV.gpkg")
project.add_data(regions, "geojson", filename="regions_civ")S’appuie sur cartograpy.data.save en interne.
# Copie le fichier + ses sidecars (shapefile : .shx, .dbf, .prj...)
project.add_data("../source/gadm41_CIV.shp")
# Rangé directement dans data/vector/
project.add_data("../source/regions.geojson", category="vector")
# Déplacer au lieu de copier
project.add_data("../source/carte.shp", mode="move")Explorer ce que contient le projet
project.list_data() # tous les fichiers, un par ligne
project.list_data(type_filter="vector") # seulement les fichiers vectoriels
project.list_datasets() # un shapefile + ses sidecars = 1 entrée
project.infos()
# 📋 Projet : /chemin/absolu/mon_projet
# 🌐 CRS : EPSG:4326
# 📁 data/ : ✅ (12 fichier(s))
# ├── vectoriel : 8
# ├── raster : 2
# ├── tabulaire : 2
# └── autre : 0
# 📁 output/ : ✅ (3 fichier(s))Charger, renommer, supprimer un jeu de données
Project résout un nom par correspondance exacte ou par nom de base (sans extension), en ignorant les sidecars pour éviter les ambiguïtés :
gdf = project.load_data("regions_civ") # ou "regions_civ.geojson"
project.rename_data("regions_civ", "civ_admin") # renomme aussi les sidecars
project.remove_data("civ_admin.geojson") # supprime le fichier + sidecars
path = project.get_path("carte_finale.png", folder="output")Organiser automatiquement les fichiers
project.organize_project()Inspecte les extensions de data/ et répartit les fichiers entre vector/, raster/ et tabular/ : met aussi à jour project.vector_files, project.raster_files, project.tabular_files.
Valider l’intégrité du projet
report = project.validate(deep=True)
# report["valid"], report["warnings"], report["errors"]Avec deep=True : détecte les sidecars orphelins, les noms de base ambigus, et tente d’ouvrir réellement chaque fichier géospatial pour vérifier sa lisibilité.
Manifeste de projet
project.save_manifest() # écrit project.json (CRS, dates, inventaire)
manifest = project.load_manifest()
manifest["datasets"]Choisir un CRS de projet
crs_list = Project.available_crs(name_contains="WGS")
crs_list[:3]
project.set_crs("EPSG:32630") # change la référence, ne reprojette aucun fichierLe CRS choisi est stocké comme objet pyproj.CRS dans project.crs.
Workflow recommandé
Créer le répertoire de projet
Project(...).init()Charger ou télécharger les données
via
cartograpy.dataou les classes decartograpy.data(Bound,OSM,DEM…)Enregistrer les jeux de données utiles
project.add_data(...)Ranger le dossier data
project.organize_project()Valider avant de partager
project.validate(deep=True)Produire les cartes et exporter
project.save_output(...), puisproject.save_manifest()
Limites actuelles
- le classement automatique (
organize_project,list_data) repose uniquement sur les extensions de fichiers, pas sur une inspection du contenu - les sous-dossiers ne sont personnalisables qu’au niveau de
data_diretoutput_dir: pas de sous-catégories au-delà devector/raster/tabular set_crs()change la métadonnée de référence du projet, elle ne reprojette aucun fichier déjà présent dansdata/