6.7 KiB
Plan de développement — WebCarto
Plan incrémental suivant l'ordre défini dans la consigne : carte → import GeoJSON → édition point → import KML → persistance → export
Phase 0 — Scaffolding & Infrastructure
Objectif : structure du repo, Docker, CI minimal, tout tourne à vide.
- Créer l'arborescence projet (
frontend/,backend/,samples/) - Initialiser le frontend : Vite + React + TypeScript, TailwindCSS, Zustand
- Configurer le thème gruvbox dark vintage (tokens CSS / Tailwind)
- Initialiser le backend : FastAPI, SQLModel, Alembic, structure
app/ - Créer les Dockerfiles (frontend Nginx, backend uvicorn)
- Créer
docker-compose.yml+.env.example - Configurer linting : ruff + black (backend), ESLint + Prettier (frontend)
- Vérifier que
docker-compose up --buildlance les 2 services
Livrable : page blanche frontend servie par Nginx, backend répond sur /api/health.
Phase 1 — Carte & fonds de plan
Objectif : carte plein écran avec 3 fonds commutables.
- Installer MapLibre GL JS
- Composant
<MapView>: carte plein écran - Configurer 3 fonds : Satellite (raster), Hybride (satellite + labels), Vecteur (OSM)
- Abstraction
BaseLayerProvider: URL template + attribution + type, configurable via.env - Sélecteur de fond (contrôle UI sur la carte)
- Affichage correct des attributions
Livrable : carte navigable avec switch entre les 3 fonds.
Phase 2 — Layout UI & thème
Objectif : structure de l'interface complète (vide mais fonctionnelle).
- Header : nom projet + boutons Import / Export / Save / Settings (désactivés pour l'instant)
- Volet gauche : panneau couches (vide) avec recherche + filtres (placeholder)
- Volet droit : panneau propriétés (vide)
- Système de toasts + barre de statut
- Panneaux repliables / redimensionnables
- Appliquer thème gruvbox sur tous les composants
Livrable : layout 3 colonnes avec carte centrale, panneaux latéraux, header.
Phase 3 — Import GeoJSON
Objectif : importer un fichier GeoJSON, l'afficher sur la carte, le persister.
Frontend
- Bouton Import + zone drag & drop (accepte
.geojson,.json) - Parser et valider le GeoJSON côté client
- Envoyer le GeoJSON normalisé au backend via
POST /api/datasets/import - Afficher les features sur la carte (source + layer MapLibre)
- Remplir le volet gauche : liste des couches importées
Backend
- Modèle
Dataset(SQLModel) : id, name, created_at, feature_count, bbox - Modèle
Feature: id, dataset_id, geometry (JSON), properties (JSON) - Migration Alembic initiale
- Route
POST /api/datasets/import: validation Pydantic, stockage raw + features - Route
GET /api/datasets: liste des datasets - Route
GET /api/datasets/{id}: dataset + features - Stockage du fichier raw original sur le volume
/data
Tests
- Backend : test import GeoJSON valide, test rejet fichier invalide, test listing
- Frontend : test parsing GeoJSON (unitaire)
Données exemple
- Créer
samples/example.geojson(quelques points/lignes/polygones)
Livrable : import drag & drop d'un GeoJSON → affiché sur la carte → persisté en base.
Phase 4 — Sélection & édition des points
Objectif : cliquer sur un point, voir ses propriétés, le déplacer, modifier ses attributs.
Sélection
- Clic sur feature → sélection visuelle (highlight)
- Affichage des propriétés dans le volet droit
- Liste des features dans le volet gauche (clic → centrer sur la carte)
- Affichage rich content (HTML safe sanitisé) dans le viewer propriétés
- Affichage des images si URL http(s) détectée dans les propriétés
Édition
- Installer MapLibre Draw (ou équivalent)
- Drag & drop des points sur la carte
- Édition des propriétés : name, description, champs libres
- Undo (au moins 1 niveau) pour le déplacement
- Bouton Save →
PUT /api/features/{id}
Backend
- Route
PUT /api/features/{id}: update geometry + properties - Table
feature_versions: timestamp, feature_id, before (JSON), after (JSON) - Enregistrer chaque modification dans l'historique
Tests
- Backend : test update feature, test versioning
- Frontend : test sélection, test undo
Livrable : sélection d'un point → voir/modifier propriétés → déplacer → sauvegarder avec historique.
Phase 5 — Import KML
Objectif : importer des fichiers KML, les convertir et les traiter comme des GeoJSON.
- Installer
@tmcw/togeojson - Bouton Import accepte aussi
.kml - Parsing KML → GeoJSON côté frontend (togeojson)
- Extraction des images depuis CDATA / descriptions KML
- Envoyer le GeoJSON résultant au backend (même route d'import)
- Stockage du KML raw original sur le volume
Tests
- Frontend : test conversion KML → GeoJSON
- Backend : test import d'un dataset originellement KML
Données exemple
- Créer
samples/example.kml(points avec descriptions, images)
Livrable : import KML → conversion → affichage + édition identique au GeoJSON.
Phase 6 — Export
Objectif : exporter un dataset édité en GeoJSON.
- Route backend
POST /api/datasets/{id}/export?format=geojson - Générer le GeoJSON depuis les features en base (version courante)
- Bouton Export dans le header → téléchargement du fichier
- Option de re-téléchargement du fichier raw original
Tests
- Backend : test export GeoJSON, vérifier cohérence avec les éditions
Livrable : export fonctionnel du dataset modifié en GeoJSON.
Phase 7 — Polish & finalisation MVP
Objectif : stabiliser, documenter, préparer le déploiement.
- Gestion d'erreurs cohérente (toasts pour les erreurs réseau, parsing, etc.)
- Clustering des points si dataset volumineux (>1000 points)
- Performance : vérifier avec un dataset de ~5k points
- README.md : installation, variables
.env, limites connues, roadmap - Vérifier que
docker-compose upfonctionne from scratch - Passe finale sur le thème gruvbox (cohérence, contrastes, accessibilité)
Livrable : MVP complet, documenté, déployable en un docker-compose up.
Post-MVP (roadmap)
Ces éléments ne sont pas dans le scope MVP mais sont prévus :
- Support KMZ (unzip + parsing KML interne)
- Styles KML (icônes, couleurs) appliqués sur la carte
- Édition lignes / polygones
- Export KML
- Auth (OIDC / reverse proxy)
- Multi-utilisateurs, permissions
- Import grands datasets (streaming, Web Worker)
- Serveur tuiles interne / mode offline