# Décisions prises seul — Noyales 3D (Ferme éolienne de la région de Guise, V117)

Réponses obtenues au démarrage : relief IGN RGE ALTI « si pas trop lourd », étendue « zone chantier + route des convois »,
itinéraires déduits des flèches + OSM, séquence E01 → E09 avec un convoi à la fois. Tout le reste ci-dessous a été décidé seul.

## Données et emprise
- **Emprise modélisée** : lon 3,498 → 3,556 / lat 49,899 → 49,934 (≈ 4,2 × 3,9 km). Elle contient les 9 éoliennes, toutes les
  pistes, la base vie et les deux entrées fléchées au sud. Le cadastre du KMZ déborde de cette emprise ; les parcelles hors zone sont ignorées.
- **Projection locale** : plan tangent équirectangulaire centré sur l'emprise (x = est, y = nord, en mètres). Dans three.js : X = est,
  Y = altitude, Z = −nord. Erreur négligeable à cette échelle.
- **Relief** : IGN RGE ALTI via le WMS-Raster de la Géoplateforme (`ELEVATION.ELEVATIONGRIDCOVERAGE.HIGHRES`, format BIL 32 bits),
  une seule requête 1024 × 1024 (4 Mo, ≈ 4 m/pixel) — jugée « pas trop lourde ». Vérification : l'écart avec les « Z TN » du KMZ est
  de 0,1 à 0,6 m sur les 9 éoliennes. Un léger lissage (σ ≈ 1 pixel) gomme le crénelage du rééchantillonnage WMS.
- **OpenStreetMap** : requête Overpass unique (bâtiments, routes, occupation du sol, bois, haies, alignements d'arbres, cours d'eau,
  ligne HT). `overpass-api.de` renvoyait 406/504 pendant le développement : le script essaie successivement trois miroirs
  (overpass-api.de, overpass.private.coffee, overpass.kumi.systems).
- **Cache** : tout est dans `./data` (`plan.json`, `osm.json`, `dem_ign_1024.bin`, `terrain.bin/json`, `routes.json`). `./run.sh` ne
  retélécharge rien si les fichiers existent ; `node scripts/prepare.js --force` recalcule terrassement et itinéraires.
- **Aucune dépendance npm** : three.js (r170) est vendu dans `./vendor`, le serveur est du Node natif. Le KMZ est copié dans `./plan`.

## Lecture du plan KMZ (couches DXF exportées par My Maps)
- Les couleurs de style ne suffisaient pas ; la classification se fait sur le nom de calque DXF présent dans la description :
  `VW_40_Plateforme` (hachure SOLID = plateforme permanente, ANSI32 = temporaire), `VW_40_Piste_Acces_permanent` (hachures jaunes =
  pistes), `VW_40_Acces_temporaire`, `VW_40_Aire de contournement`, `VW_40_Stockage_pales` (silhouettes de pales de 57 m = position
  exacte des pales stockées, rectangles = zone de stockage), `VW_40_Grue_Flèche` (rectangle 126 × 12 m = aire de montage de la flèche),
  `VW_60_Sens_convois` (flèches), `VW_60_Porte à faux`, `VW_50_PDL`, `VW_70_Base_vie`, `VW_30_Pilone` (pylônes RTE H = 18 m),
  `VW_40_Eolienne_rotor_V117` (cercles de rotor), `VW_10_Emphytéose`.
- **Direction des flèches** : axe = côté le plus long du polygone (bord du fût), pointe = côté où les sommets s'évasent (barbes).
- **Éoliennes** : positions des points E01–E09, avec « Z TN » et « Z béton » lus dans la description.
- **Racine des pales stockées** : extrémité la plus large de la silhouette (la corde maximale est à ~22 % de l'envergure).

## Terrassement (scripts/lib/earthworks.js)
- **Plateformes à plat** au niveau « Z béton » de l'éolienne la plus proche (< 160 m) ; les petites surfaces isolées prennent la
  moyenne du terrain naturel. Aires de contournement, zones de stockage des pales et base vie sont traitées comme des plateformes.
- **Pistes** : profil longitudinal lissé (flou gaussien σ ≈ 25 m du MNT) pour rester « collé » au terrain naturel, puis rampe
  progressive sur 90 m vers le niveau de la plateforme la plus proche. Les aires de montage de flèche suivent ce même traitement.
- **Talus** : autour de chaque terrassement, raccord en pente ≈ 1:3 (largeur mini 6 m) vers le terrain naturel. Remblai max ≈ 6 m,
  déblai max ≈ 7 m sur la zone.
- Le terrain final est baké dans `data/terrain.bin` ; le maillage 3D est fin (4 m) sur la zone chantier et 4 fois plus grossier ailleurs.

## Itinéraires (scripts/lib/routes.js)
- A* sur un raster de 2 m : roulable = routes OSM (largeur selon la classe, chemins agricoles pénalisés ×2,2, sentiers exclus) +
  pistes / plateformes / aires du plan. **L'aire de montage de la flèche n'est pas roulable** (les convois restent sur la piste).
  Coût majoré près des bords pour rouler au milieu de la chaussée.
- **Origine des convois (v2, précisée par Martin)** : tous arrivent par la **D 67 depuis l'ouest** (source = cellules de la D 67 sur le
  bord ouest de l'emprise) ; personne ne passe près de la base vie. Les flèches du plan font le reste : E08/E09 tournent vers le nord,
  E07 rejoint sa piste, E01–E06 continuent sur la D 67 puis montent par la piste sud-est.
- **Sens des convois** : dans un rayon de 22 m autour de chaque flèche, rouler contre la flèche coûte ×30, dans son sens ×0,5.
- **Marche arrière** : si les 420 derniers mètres du trajet contiennent un virage de plus de 70° (un porte-pale ne le prend pas),
  le camion dépasse le carrefour de 78 m sur sa lancée puis recule dans l'accès, diabolo en tête, à 5 km/h (E02 : 120 m, E05 : 84 m).
  Il ressort ensuite en marche avant. E02 est forcée en marche arrière même si la détection échouait.
- Retour à vide par le même itinéraire (chemin inversé). Lissage : Douglas-Peucker 2,5 m, Chaikin ×4, moyenne glissante 10 m.
- **Profil d'altitude des véhicules** : lissé le long de chaque chemin (fenêtre ± 24 m) pour supprimer les soubresauts dus aux
  marches du MNT sur les routes non terrassées.
- La cible d'un convoi est la zone de stockage des pales de l'éolienne ; la grue rejoint la suivante par le même réseau (cible :
  cellules roulables à 25 m de son emplacement de calage).

## Simulation (web/src/sim.js)
- **Séquence complète (v3)** : les 9 machines partent de la fondation seule. Pour chaque machine, dans l'ordre E01 → E09, avec une
  seule grue LG 1750 : (1) convoi « pales + nacelle » déchargé par les deux grues auxiliaires déjà sur la plateforme ; (2) arrivée et
  calage de la LG ; (3) 4 tronçons de mât livrés juste à temps par des camions « en pince » (berceau sur la sellette + diabolo à
  berceau, sans poutre) et posés un à un (accrochage en tête, redressement autour du pied, transfert, descente sur la bride) ;
  (4) pose de la nacelle pré-livrée ; (5) levage des 3 pales ; (6) déplacement. Durée totale ≈ 14 h de chantier.
- **Dimensions V117 (v3)** : rotor 117 m, **bout de pale 150 m**, moyeu 3 m ⇒ pale 57,0 m, moyeu à **91,5 m**, 4 tronçons de 22,25 m.
- **Nacelle** : stockée dans un coin de la plateforme opposé aux pales mais côté fondation (14 à 34 m de l'axe, à l'écart de la
  grue), parallèle au grand axe de la plateforme. Posée avec le **rotor face à la grue** (lacet vers l'emplacement de calage), pour
  enquiller les pales sans conflit avec la flèche ; 5 min après la dernière pale, la nacelle vire face au vent de sud-ouest.
- **Arrêt des camions** : dans l'axe de la piste d'arrivée (prolongement rectiligne de 55 m à l'entrée de la zone de stockage /
  plateforme, si c'est roulable et si l'axe d'arrivée est à moins de 60° de l'axe des pales) ; sinon (E03, E07, E09 : plateforme
  perpendiculaire) le camion suit la piste et tourne. Les grues auxiliaires se placent à 13 m des pales stockées, du côté opposé au
  camion, et de part et d'autre de l'emplacement de la nacelle (11 m) pour le levage en tandem.
- **Grue LG 1750** : stabilisateurs déployés (base ≈ 13 × 13 m, plaques et matelas), porteur soulevé. Après le relevage de la flèche
  elle se retourne (giration de 180°) pour présenter la flèche à l'éolienne et le contrepoids à l'arrière ; elle se déplace flèche
  relevée sur l'avant, stabilisateurs rentrés. La flèche montée au sol est inclinée du minimum nécessaire pour rester au-dessus du
  terrain naturel (aire non terrassée) — plus de flèche « dans le sol ».
- **Montage de la grue (v2)** : au démarrage (15 min de chantier), la LG 1750 est calée au bout de l'aire de montage côté éolienne, la
  flèche est assemblée **au sol, en terrain naturel** (aucun terrassement de cette aire) tronçon par tronçon (23 panneaux de 6 m) par
  deux grues mobiles auxiliaires de 120 t (type LTM), puis relevée à 80° avec ses haubans. Ces deux grues auxiliaires stationnent
  ensuite à 13 m des pales stockées et déchargent chaque pale (une à la racine, une à 78 % de l'envergure), puis suivent la grue
  principale d'une machine à l'autre. Elles roulent sur les pistes ; pas de modélisation de leur calage détaillé.
- Convoi = voiture pilote + 3 semi-remorques porte-pale (une pale de 57 m chacune ; poutre télescopique de la sellette au diabolo
  arrière, pale en porte-à-faux au-delà du diabolo) + voiture d'escorte, à 18 km/h. Les camions font la queue sur la piste et se
  présentent un par un ; déchargement 2 min 30 par pale par les deux grues auxiliaires, puis retour à vide, poutre rétractée.
- Levage : 7 min par pale (accrochage → montée verticale → giration/relevage vers le moyeu → boulonnage). Le moyeu tourne de 120°
  entre deux pales pour présenter la bride à l'horizontale, du côté de la grue (pose « pale horizontale », sans rotor au sol).
- Grue : porteur 8 essieux, flèche treillis 138 m + fléchette fixe 12 m à 15°, calée sur stabilisateurs ; elle se positionne au bout
  de l'aire de montage de flèche côté éolienne. Entre deux machines elle roule à 5 km/h flèche relevée, stabilisateurs rentrés.
- Le convoi suivant part de façon à arriver quand la grue est prête sur la machine suivante. Durée totale ≈ 8 h 11 de chantier ;
  le curseur « Chantier » parcourt toute la séquence (scrub possible dans les deux sens, tout est fonction du temps), lecture ×1 à ×150.
- Rotor : dès la 3e pale posée, la machine démarre et tourne (~7 tr/min). Nacelles orientées face au vent dominant de sud-ouest.
- Vie ambiante : 14 tracteurs avec nuage de poussière (parcelles cadastrales de plus de 1 ha sans terrassement, espacées d'au
  moins 220 m), 27 voitures sur les 9 plus longues routes OSM. Ils vivent en « temps ambiant »
  (au plus ×6) et ne sont pas liés au curseur chantier.
- **Menu des phases (v2)** : 37 entrées (montage de la grue, puis pour chaque machine : trajet du convoi, déchargement, levage,
  déplacement de la grue) ; chaque entrée place le temps et la caméra (suivi du convoi ou de la grue, vue du stockage, vue du moyeu).
  Vitesses de lecture ×1 / ×5 / ×15 / ×60.

## Rendu
- Sol : canvas 4096² peint à partir du cadastre (chaque parcelle = une culture aléatoire avec sillons et passages de pulvérisateur),
  patchwork procédural hors cadastre, occupation du sol OSM, routes (bitume, chemins), pistes et plateformes en grave ; texture de détail
  pour le grain de près. Bâtiments OSM extrudés (toit à deux pans quand l'emprise est quasi rectangulaire, clocher pour les églises).
- Végétation instanciée (≈ 6 000 arbres : bois OSM, alignements, haies, arbres isolés), feuillage animé par le vent dans le shader.
- Ciel physique (three.js Sky) + soleil calculé pour la latitude 49,92° N mi-septembre, midi solaire ≈ 13 h 35 ; nuit avec étoiles,
  lune, feux de balisage rouges à éclats sur les nacelles, gyrophares et phares.
- Ombres portées (carte 4096, recentrée sur la cible de la caméra). Calques : cadastre (parcelles + sections), plan KMZ (contours
  colorés comme dans le KMZ), étiquettes.

## Hébergement
- Application 100 % statique côté serveur (Node natif sans dépendance, ~12 Mo de fichiers dont 8 Mo de MNT). Tout le calcul 3D est dans
  le navigateur du visiteur. `Dockerfile` fourni pour Coolify ; versionner `data/` et `vendor/` pour que le build ne dépende pas
  d'Overpass ni de l'IGN. Empreinte mémoire du conteneur : quelques dizaines de Mo.

## Limites connues
- Retour à vide des camions en marche avant (accès sans virage serré) : demi-tour instantané sur la plateforme.
- Pas de nivellement fin à 2 % : les plateformes sont strictement à plat (simplification demandée).
- Les routes OSM sont peintes sur le sol, pas modelées en 3D ; les chemins agricoles très dégradés (grade 4–5) ne sont pas roulables.
- Le KMZ contient deux lignes RTE ; seule celle du plan (8 pylônes) est modélisée en 3D avec ses câbles.

# Multi-sites (v4) — Arnac-sur-Dourdou

## Architecture commune
- Un seul moteur, un dossier par site : `sites/<id>/site.json` (emprise, règles de lecture du plan, entrée des convois, transport,
  grue, stockage, paramètres de terrassement), `sites/<id>/plan.kmz`, `sites/<id>/data/` (cache). `./run.sh arnac` ou
  `?site=arnac` ; sélecteur de site dans le panneau ; variable `SITE` pour le site par défaut du serveur (Coolify).
- Tout le code 3D et la simulation sont partagés. Ce qui varie est piloté par `site.json` : `storage` (pales stockées au sol ou
  livrées juste à temps), `transport` (`trailer` ou `bladelifter`), `crane` (`LG1750` treillis ou `LTM1650` télescopique + fléchette
  33 m à −20°), `craneAssembly` (montage de la flèche au sol au démarrage), `entry` (route et bord d'arrivée), `turbineCenter`
  (`points` ou `bypass`), `earthworks` (pente maxi, rayon vertical, dévers, pente de talus).

## Lecture du plan d'Arnac
- L'export My Maps a perdu les noms de calques (`$[Layer]`) : classification **par couleur de style**, validée par Martin :
  brun 817717 = plateformes, bordeaux 880E4F = pistes, orange plein F57C00 = retournement (piste, à plat), jaune FFD600 = aire de
  contournement / bypass (les machines sont recentrées dessus, écarts de 1 à 6 m avec les points), lignes orange E65100 = pied de
  remblai, lignes vertes 0F9D58 = crête de déblai. Le polygone vert 097138 (non nommé) est traité comme une piste.
- Pas d'altimétrie dans ce plan : Z TN = MNT au centre du bypass, niveau de plateforme = moyenne du terrain naturel sur le polygone
  (équilibre déblai/remblai), retournement à plat à son propre niveau moyen.

## Terrassement commun (nouvelle méthode, appliquée aussi à Noyales)
- Plateformes, bypass, retournements, zones de stockage, base vie : à 0 %.
- Pistes : profil en long calculé le long des **axes réels des itinéraires** (chemins A* des convois et de la grue) : hauteur
  naturelle lissée, points fixés au niveau des plateformes traversées (tangence), puis pente longitudinale limitée (10 %), puis
  rayon vertical (200 m) par relaxation de la dérivée seconde ; chaque cellule de piste prend la hauteur de l'échantillon d'axe le
  plus proche (dévers 0 ≤ 2 %). Cellules de piste hors axe : rampe vers la plateforme voisine. Talus 1:1,5 à Arnac, 1:3 à Noyales.
- Les lignes déblai/remblai du plan sont affichées dans le calque « Plan KMZ » ; le talus reste calculé (pas encore contraint par
  ces lignes).

## Convois et grue à Arnac
- Entrée : la D 12 ne franchit pas le bord sud de l'emprise ; les convois partent donc de **l'extrémité sud de la D 12** dans
  l'emprise (côté col du Coustel), sans flèches de sens (aucune dans ce plan).
- Pas de stockage de pales : les 3 pales arrivent juste à temps sur **blade lifters** (remorque 10 essieux, berceau basculant, pale à
  45° vers l'arrière et le haut) et la grue les prend directement sur le camion (rotation à l'horizontale pendant la montée).
  Le convoi initial ne transporte que la nacelle, déchargée par les deux grues auxiliaires.
- Grue principale LTM 1650-8.1 : flèche télescopique 80 m (5 sections) + fléchette treillis 33 m ; pas de montage au sol, elle est
  calée à E01 dès le départ. Durée totale ≈ 7 h 50 de chantier.

# Format « KML Chantier » v1 (v5)
- Spécification dans `docs/FORMAT_KML.md`, squelette `docs/modele_chantier.kml`, prompt de l'agent convertisseur
  `docs/PROMPT_AGENT_KML.md`, exemple complet `sites/noyales/standard.kml` (export de Noyales par `scripts/export-standard-kml.js`).
- Sémantique par **nom de dossier** uniquement (EOLIENNES, PLATEFORMES, PISTES, RETOURNEMENTS, BYPASS, STOCKAGE_PALES,
  PALES_STOCKEES, AIRE_GRUE, SENS_CONVOIS, TALUS_REMBLAI, TALUS_DEBLAI, RESEAU_ENTERRE, GROS_ENTRETIEN, BASE_VIE, PDL, PANNEAUX,
  CADASTRE, EMPRISE) ; paramètres du site (entrée, transport, grue, terrassement…) dans un bloc JSON de la description du document.
- Choix de simplification pour l'agent : les flèches deviennent des **lignes orientées** (échantillonnées tous les 30 m par le
  moteur), les silhouettes de pales des **lignes emplanture → pointe**, une piste peut être un axe avec `largeur`.
- Nouveau site standard = un dossier `sites/<id>/` avec `plan.kml` et `site.json` réduit à `{ "id", "format": "standard" }` ;
  l'emprise est déduite du dossier EMPRISE (sinon boîte englobante + 800 m) et écrite dans `site.json` au premier passage.
- Calques activables ajoutés au panneau : Talus, Réseau enterré (pointillés + regards), Gros entretien (aplat translucide), Panneaux
  (texte sur mât à la hauteur demandée). Validation : Noyales exporté puis réimporté en standard donne les mêmes machines, les mêmes
  niveaux, le même terrassement et une simulation identique (50 831 s contre 50 819 s).

# Convois et stockage (v6, précisé par Martin)
- Une zone de stockage n'est **jamais roulable**. Le convoi de pales suit la piste, s'arrête sur la plateforme (dans l'axe d'arrivée
  ou en tournant si la plateforme est perpendiculaire), et les deux grues auxiliaires posent les pales dans la longueur du rectangle
  de stockage : 3 pales parallèles au grand axe, espacées de 7 m maxi, emplanture du côté de la plateforme. Les silhouettes
  `PALES_STOCKEES`, si présentes, priment.
- Sans rectangle de stockage pour une machine, celle-ci passe en **juste-à-temps** (pales prises sur le camion : blade lifter ou
  porte-pale classique selon le site), sans changer le reste de la séquence. Le raccord automatique de 6 m ne concerne plus que les
  plateformes séparées de leur piste.
- Plans convertis par l'agent : aires de grue trop près du massif → calage reculé le long de l'aire jusqu'à 26 m de l'axe ; bloc
  `machine` du KML appliqué (SJL : V126, moyeu 87 m).

# Orthophoto et contexte éolien (v7)
- **Sol** : orthophoto IGN (BD ORTHO, WMS-Raster Géoplateforme, 2 × 2 tuiles JPEG de 2048 px ≈ 1 m/px, ~2 Mo par site) posée sur le
  relief, avec par-dessus les pistes et plateformes du plan en grave et un léger grain. Le sol peint (cadastre, cultures, routes OSM)
  reste disponible par le bouton « Orthophoto » et sert de repli si le service ne répond pas. Les éoliennes déjà visibles sur
  l'orthophoto y apparaissent à plat : c'est le calque `EOLIENNES_EXISTANTES` qui les redresse en 3D.
- **Éoliennes existantes** (dossier `EOLIENNES_EXISTANTES`, points + `tip` / `rotor` facultatifs) : rendues montées et en service
  dès le départ, mises à l'échelle de leur hauteur en bout de pale, étiquette discrète si nommées. L'agent convertisseur demande
  désormais à l'utilisateur s'il existe des machines dans le voisinage.
