Releases: julientournois/KarstPro-qgis
Release list
KarstPro v1.16.1
Corrigé
- Aucun fond de carte en Wallonie. La 1.16.0 livrait le territoire wallon
sans fond : un projet s'ouvrait sur du blanc. Deux services SPW sont branchés,
vérifiés avant d'être déclarés — Ortho SPW (ORTHO_LAST, qui pointe
toujours la dernière orthophoto : rien à maintenir au changement de millésime)
et PICC, le fond topographique wallon, tous deux en EPSG:3812. - La carte de décision imprimée n'avait aucun fond hors de France. La liste
des fonds était codée en dur avec les noms français (« Plan IGN », « SCAN25
IGN »), introuvables ailleurs. Chaque fond porte désormais une clé
impressiondans le JSON de son territoire : c'est le territoire qui
décide, plus la mise en page. L'orthophoto satellite en est écartée dans les
trois pays — posée sur une feuille elle masquerait le fond topographique —
mais elle reste dans le projet, activable à la main.
Note
- Le smoke test des mises en page refuse maintenant une carte de décision sans
fond de carte. Il comptait les couches sans regarder ce qu'elles étaient,
et déclarait « OK » sur une feuille qui serait sortie vide.
KarstPro v1.16.0
Ajouté
- Deux mises en page imprimables dans le projet QGIS généré, pour préparer
une sortie sur papier (la navigation reste sur QField).- « Carte de décision » — où aller : fond IGN, cibles P1 et P2
étiquetées par leurdoline_id, cibles déjà visitées, cavités connues,
gouffres, réseau topographié. - « Carte morphologique » — pourquoi c'est là : ombrage du MNT, tous
les polygones de dolines, cibles P1/P2 par-dessus. Sur un ombrage on juge
la forme, l'alignement et la densité. - Légende curée, jamais automatique : une légende automatique listerait
l'hydrologie D8 (235 872 segments sur Bayard) et les 24 formations
BD Charm-50. A3 paysage, barre d'échelle, flèche nord. - Le fond SCAN25 est empilé sur le Plan IGN plutôt que choisi : le SCAN25
rend une couche vide sans erreur quand la clé est invalide, l'empilement
supprime ce cas au lieu de tenter de le détecter. - Pas de carte morphologique si
lidar_work/mnt.tifest absent — mieux vaut
une mise en page manquante qu'une page ouverte sur une couche manquante.
- « Carte de décision » — où aller : fond IGN, cibles P1 et P2
- Territoire Wallonie (expérimental), sélectionnable dans le menu Pays.
Géologie karstifiable et contexte adossés à l'Atlas du Karst Wallon
(9902 sites). MNT LiDAR 1 m 2021-2022 fourni à la main : aucun service
wallon ne le sert (WCS INSPIRE sans couverture, ArcGIS en MapServer). - Type de capacité
manuelpour les territoires dont le MNT n'est
récupérable par aucune API — cas probablement majoritaire hors de France et
d'Espagne. Fournir le MNT soi-même est une source, pas une absence. - Outils de validation réutilisables :
validation/inventaire/valider_akwa.py
(convention ASHM, comparable aux chiffres français),prototypes/cv_wallonie.py
(validation croisée spatiale),prototypes/decouper_mnt.py. - Smoke tests headless pour « Préparer une étude » et pour la composition des
mises en page — le smoke test existant ne couvrait pas ces algorithmes.
Corrigé
- Les couches de cibles étaient écrites sans type de géométrie. Créées
vides, leurGeoSeriesnon typée produisait une géométrie générique et le
.qgsles déclarait « No geometry ». Aucune étiquette ne pouvait y être
posée, et le même défaut empêche QField de reconnaître une couche de points. - Les libellés français de quatre couches valaient leur nom de table
(cavites_georisques,bdtopo_eau,topo_reseau,courbes_niveau), alors
que l'anglais avait de vrais noms : le panneau de couches était plus lisible
en anglais qu'en français.cavites_connuesn'avait aucun libellé. - Le type de capacité
arcgisn'était pas générique : il ignorait l'URL
déclarée et appelait l'IGME espagnol en dur. cavites_connuesn'était pas routée : la préparation appelait Géorisques
(service français) quel que soit le territoire.- Le garde-fou de packaging ne comparait que les versions : ajouter un
fichier après un build laissait l'artefact à la bonne version mais incomplet,
et les tests échouaient au lieu de se sauter. - Le libellé de « MNT pré-téléchargés » annonçait « dernier recours en France,
optionnel en Espagne » alors qu'en Wallonie c'est la seule source.
Vérifié
- Wallonie / Calestienne mesurée, résultat NÉGATIF, piste close. Sur
Rochefort (6437 dolines, 358 sites de l'Atlas) : à géologie constante le
barème Barrois donne AUC 0,455, sous le hasard ; un modèle appris en
validation croisée spatiale atteint 0,697, moins que le TPI 500 m inversé
seul (0,736). Le premier chiffre encourageant (0,770) était une tautologie
—comp_geologieseule fait 0,864. Détail et leçon transposable dans
docs/JOURNAL_EXPERIENCES.md.
KarstPro v1.15.0
Ajouté
- Identifiants de dolines stables entre préparations. Le
fidGeoPackage
est un rang d'écriture : dès qu'une doline apparaissait, disparaissait,
fusionnait ou se scindait, toutes les suivantes se décalaient, et
doline_1247d'un rapport MLL ou d'une note de terrain devenait faux.
Les dolines portent désormais une colonnedoline_id, alimentée par un
registre (tabledoline_idsdu gpkg) et un appariement par recouvrement de
polygones. Une doline qui disparaît puis réapparaît retrouve son
identifiant ; un identifiant retiré n'est jamais recyclé ; une doline qui
se scinde ne le conserve que si la plus grosse pièce représente au moins 60 %
de la surface conservée.- Les études existantes conservent leurs numéros : le registre est amorcé
sur lesfidau premier passage. - Sur une étude neuve, le mécanisme est invisible :
doline_idvaut le
fid, comme avant. Il ne joue qu'à la re-détection suivante. - Le rapport MLL, le GPX, les regroupements, le CSV et le rapport PDF de la
synchro nomment tous les dolines par cet identifiant.
- Les études existantes conservent leurs numéros : le registre est amorcé
Modifié
- Formulaire de cible allégé :
fid,doline_id,bassin_versant_m2,
comp_geologie_dist_metcircularitesont masqués (les colonnes restent en
table et au CSV de labels). Lefidy était devenu trompeur — affiché au-
dessus de l'identifiant, il invitait à lire « doline n° 1 » sur la doline 1247. - Toutes les couches produites par KarstPro sont entièrement libellées :
plus aucun nom de colonne brut surdolines,cibles,gouffresou
courbes_niveau. Les couches de référence externes (Géorisques, BD TOPO,
BD Charm-50) gardent le vocabulaire de leur fournisseur. - Les cibles portent
bassin_versant_m2,comp_geologie_dist_met
circularite: le label d'une cible dont la doline a disparu reste
exploitable au ré-entraînement au lieu de perdre trois features sur neuf. - La suppression des cibles déjà prospectées apparie par identifiant, avec la
position (5 m) en repli — une doline re-détectée dont le centroïde a bougé de
20 m n'est plus re-proposée à l'opérateur.
Corrigé
- Labels d'entraînement corrompus par la re-préparation. Une cible visitée
archivée porte l'identifiant de la préparation où elle a été visitée, et
l'archive survit à la re-préparation.extract_terrain_labelsla joignait par
fidà la couchedolinesfraîchement re-détectée : le verdict terrain
recevait donc la morphométrie d'une doline sans rapport, et ce vecteur
faux partait tel quel danslabels_terrain.csv. La jointure se fait
maintenant pardoline_id. - « Refaire une étude » plantait à chaque appel depuis la v1.14.0 :
t("… {source}", source=…)entrait en collision avec le premier paramètre
positionnel det(), d'où unTypeErrorimmédiat. Jamais publié, donc aucun
utilisateur touché. Un test AST interdit désormais ce mot-clé. - Le journal de préparation annonçait « Dolines déjà calculées — étape ignorée »
alors que la détection re-tournait réellement (MNT rempli en cache mais
dolines.gpkgabsent). C'est justement le cas où les identifiants peuvent
bouger, et le journal est le seul endroit où le constater.
Retiré
- Colonne
score_positionneldes couches de cibles : écrite par le packaging,
jamais produite par le scoring, jamais relue, absente du schéma. Toujours
NULL, et affichée sur le formulaire de terrain.
Vérifié
- Bout-en-bout sur Bayard (1806 dolines, 85 cibles visitées) : deux
re-préparations headless après suppression delidar_work/dolines.gpkg—
donc avec re-détection réelle, whitebox compris — puis deux « Refaire une
étude » depuis l'interface QGIS. Dans tous les cas 1806/1806 identifiants
conservés, aucun doublon, aucune cible archivée orpheline, les 85 noms de
cibles visitées inchangés, géométries identiques à identifiant égal. - Robustesse de l'appariement mesurée sur ces mêmes 1806 polygones réels sous
dérive du seuil de détection : 96,1 % des identifiants conservés à
0,11 m, 92,7 % à 0,12 m, sans aucun doublon ni recyclage.
Note
- Tant que
lidar_work/est intact, « Refaire une étude » saute la détection et
relit les mêmes polygones : les identifiants ne bougeaient déjà pas. Ce
chantier couvre le cas où la détection re-tourne réellement — dossier de
travail supprimé, dossier de sortie neuf, nouvelle génération LiDAR IGN, ou
changement de l'algorithme de détection. - Le registre vit dans le gpkg du dossier de sortie : re-préparer la même
zone dans un dossier neuf, ou sous un autre nom de secteur, renumérote depuis
1 (le journal l'indique alors par « première étude de ce dossier »).
KarstPro v1.13.0
Version multi-pays. Le pipeline nomme désormais ses besoins, jamais ses
fournisseurs : chaque territoire déclare comment il les satisfait, ou déclare
explicitement l'absence. Premier territoire ajouté : l'Espagne
(expérimentale).
Ajouté
- Architecture territoires / capacités (
core/territoires/) : 12 capacités
requises (CRS de travail, MNT, géologie, contexte karstique, cavités connues,
obstacles et végétation pour les gouffres, filtre anthropique, affaissement
historique, modèle appris, fonds de carte, points d'eau karstiques). Chaque
territoire les déclare toutes, par un fournisseur ou parAbsente(raison).
Trois contrôles d'exhaustivité refusent au démarrage une configuration
incomplète, inconnue (faute de frappe) ou invalide (capacité obligatoire
déclarée absente) — plutôt que d'échouer en cours de préparation. - Configuration déclarative par pays (
config/territoires/*.json) : URLs,
couches, champs et projection en configuration ; tout ce qui comporte une
boucle, une condition ou une expression régulière reste du code. - Espagne (expérimentale) — menu Pays dans « Préparer une sortie » :
- LiDAR PNOA 1 m automatique (CNIG), niveaux NPC01/02/03 avec sélection du
plus élaboré par cellule de grille, progression par dalle et cache local
identiques à la France ; repli MDT WCS 5 m si aucune dalle disponible. - Géologie IGME 1/50 000 puis 1/1 M, avec table de karstifiabilité.
- CRS de travail ETRS89 / UTM 29N, 30N ou 31N, résolu depuis la longitude
par table explicite (Canaries non couvertes). - Fonds de carte : ortho PNOA, plan MTN raster et IGN Base.
- Filtrage des gouffres par SIOSE (INSPIRE Land Cover) : 535 → 40
candidats/km² sur le secteur de test.
- LiDAR PNOA 1 m automatique (CNIG), niveaux NPC01/02/03 avec sélection du
- Garde de cohérence du cache
lidar_work/: un MNT en cache n'est réutilisé
que s'il couvre réellement l'emprise demandée ; sinon il est signalé,
supprimé avec ses dérivés, et recalculé. Avertissement également si le dossier
de sortie contient déjà une autre étude. - Doublure
qgis.corepour les tests (tests/qgis_stub.py) : les 6 modules
d'algorithms/deviennent testables sans QGIS installé.
Modifié
- Le pays est choisi par un menu explicite et non plus déduit de l'emprise :
une bbox à cheval sur une frontière n'a pas de réponse correcte. - Les paramètres propres à la France sont grisés et ignorés hors de France,
avec la raison affichée dans le journal plutôt qu'un silence. - « MNT déjà présent » devient « MNT déjà présent et couvrant l'emprise » —
un saut d'étape doit justifier sa validité, pas la supposer.
Corrigé
- Dalles PNOA nommées par le coin haut-gauche, et non bas-gauche : la
sélection était décalée d'une rangée vers le sud. Il manquait jusqu'à 999 m de
LiDAR en haut de chaque emprise espagnole et une rangée entière était
téléchargée pour rien en bas. Mesuré au mètre près sur deux études. - Cache
lidar_work/réutilisé sans contrôle : deux études préparées dans un
même dossier de sortie produisaient des résultats parfaitement cohérents entre
eux mais sur la zone de la première. - 5 corruptions silencieuses de CRS dues à des systèmes codés en dur
(proximité aux cavités, Géorisques non conditionné, couche cavités vide,
export MLL produisant des coordonnées à 1 500 km). - Projet QField figé en EPSG:2154 hors de France ; fond de carte PNOA jamais
atteint (CRS transformé en chaîne au lieu deEPSG:xxxx, puis préfixe de
fuseauEPSG:2582faux pour les zones 30 et 31). - BDLISA et BD Topo (bases françaises) interrogées hors de France, donnant un
avertissement « zone non karstique » trompeur en plein karst espagnol. - PNOA : faux « blocage » du CNIG (en-têtes navigateur manquants), Navarre sans
aucun NPC01, dalles rangées hors delidar_work/laz/, etlaz_filesvide à
tort quand le MNT était déjà en cache (fausse mention « mode MNT manuel »). - Géologie IGME :
inSR/outSRabsents de la requête ArcGIS. - SIOSE : budget de réessais insuffisant face aux HTTP 502 du service espagnol,
et découpe en quadrants au lieu d'une pagination profonde (le temps de réponse
doublait avecSTARTINDEX).
KarstPro v1.12.0
Ajouté
- Signal RGE ALTI — affaissement historique (
core/rgealti.py) : différence
entre le MNT LiDAR HD actuel et un relevé LiDAR ancien de l'IGN (RGE ALTI,
souvent 2009-2016), biais systématique retiré (fond régional 50 m, numpy
pur). Contrôle qualité obligatoire (rugosité du relevé local) qui écarte
automatiquement les zones de corrélation photogrammétrique (non-LiDAR).
Dolines concernées : colonnesrge_contrast_m/rge_eligible, anneau
cyan sur la carte, section dédiée du rapport MLL. Nouveau paramètre
avancéSIGNAL_RGEALTI(activé par défaut). - Contrairement au signal ponctuel (
pc_*, purement informatif), ce
signal CONTRIBUE AU SCORE — mais uniquement là où c'est validé.
Intégré au modèle Barrois (gain LOCO +0,0089, positif sur les 4
secteurs de calibration individuellement). Testé et REJETÉ sur le Lot
(-0,0151) et le Jura plateau (-0,0015) : hypothèse retenue, le signal capte
un affaissement propre au karst sous couverture sédimentaire, sans
équivalent sur du karst à nu (causses, plateaux). Détail complet des
trois domaines :docs/JOURNAL_EXPERIENCES.md.
Modifié
- Fenêtre « Préparer une sortie » simplifiée :
CONTOUR_INTERVALet
SEUIL_SURFACE_PCretirés des paramètres avancés (réglages quasiment
jamais changés d'une préparation à l'autre). Toujours modifiables en
éditantkarstpro_etude.jsonpuis en relançant « Refaire une étude » —
aucune perte de fonctionnalité, juste moins de champs à l'écran.
KarstPro v1.11.1
Documentation uniquement : investigation des pistes d'amélioration de la détection (intensité LiDAR, InSAR/EGMS, coupes de forage BSS/BRGM, recall multi-secteurs, signal ponctuel en détecteur autonome). Aucun changement de comportement du plugin. Détail complet dans docs/JOURNAL_EXPERIENCES.md (dépôt privé).
KarstPro v1.11.0
Version mineure et non corrective : trois comportements par défaut
changent (seuil de surface du signal ponctuel, visibilité/position de la
couchedolines, critère de sélection des gouffres dans l'export MLL) et un
nouveau fichier de sortie apparaît. Une préparation relancée sur un secteur
existant donnera donc des résultats sensiblement différents — en mieux, mais
différents.
Ajouté
- Export MLL : les gouffres jamais visités deviennent des cibles à part
entière. Nouveau fichiermll_gouffres_<secteur>_<date>.csv(fichier
séparé de celui des dolines : un puits se décrit par diamètre/compacité,
une doline par surface/profondeur/score — aucune colonne commune, les
fusionner donnerait un tableau à moitié vide). La section du rapport est
réécrite en conséquence : l'IA est explicitement informée que ce sont des
cibles au même titre que les dolines, pas seulement un renfort d'hypothèse.
Corrigé
- ~90 % des gouffres à prospecter étaient absents du rapport MLL. La
section ne listait que les candidats à ≤ 100 m d'une cible rouge/orange
(plafond 40 lignes), un filtre conçu à l'époque pour masquer les centaines
de faux positifs de canopée. Depuis que la canopée est auto-déclassée en
interet = 0(core/shafts.py), ce filtre de distance ne servait plus qu'à
perdre de vrais puits : mesuré le 2026-07-26, Marnaval 111/124 perdus,
Beurey 22/23, Sommelonne 2/2 — dont le plus gros puits du secteur
(Ø 17,4 m, à 163 m de la doline la plus proche). Le tri se fait désormais
surinteret == -1(jamais visité), sans contrainte de distance ; la
distance reste affichée comme information de regroupement. La colonne
interetn'était d'ailleurs même pas lue par l'export. - BDLISA : le journal annonçait « ✓ Zone karstique confirmée » sans avoir
rien vérifié. Le serveur eaufrance redirige désormais http→https (301)
mais son handshake TLS échoue (UNEXPECTED_EOF_WHILE_READING, reproduit en
TLS brut avec ET sans vérification de certificat) : la vérification partait
systématiquement en fail-open, qui renvoieTruepar principe. Nouvelle
fonctioncheck_bdlisa_karst_statusrenvoyant(karstique, vérifié)—
l'API booléenne historique est conservée. Le message devient « ⚠ Service
BDLISA indisponible — contexte karstique NON vérifié ». L'appel passe au
passage enhttps://(le serveur redirige de toute façon). Le fail-open
est inchangé : une panne externe ne bloque jamais une préparation.
Modifié
- Signal ponctuel : deux limites mesurées et documentées. (1)
Sous-détection sous canopée fermée — la méthode exige que des derniers
retours atteignent le fond du puits ; sous forêt dense il en reste trop peu.
Mesuré sur Marnaval : 7,4 % de dolines avec signal sous canopée contre
11,4 % à découvert, et deux fois moins de points par cellule (médiane 74
contre 134). L'absence de signal n'infirme donc rien, surtout en secteur
boisé — cette phrase manquait partout, alors qu'elle existait déjà pour les
gouffres. Ajoutée au guide, à la doc technique, au journal d'expériences et
au rapport MLL (qui affirmait par ailleurs, à tort depuis la validation, ne
pas être « encore validé contre un inventaire »). (2) Biais de
découvrabilité testé et largement écarté : les dolines à signal sont plus
proches du bâti (médiane 128 m contre 318 m), mais en ne gardant que les
1131 dolines à plus de 500 m de tout bâti, le signal conserve un ratio de
4,9× (16,2 % contre 3,3 %) — la corrélation ne s'explique donc pas par
l'accessibilité. La doc technique rappelle aussi que toute cette validation
reste un proxy (cavités déjà connues), et chiffre le coût d'une vraie
validation terrain (~158 visites appariées pour l'effet observé). - Détection ponctuelle de puits : le seuil de surface par défaut passe de
50 m² à « toutes les dolines ». L'hypothèse initiale (« le signal n'est
fiable que sur les petites dolines ») n'avait jamais été vérifiée — elle est
fausse. Mesuré sur 5 secteurs contre les inventaires de cavités connues
(rayon 20 m), le signal est au moins aussi prédictif au-delà de 50 m² :
Marnaval 7,2× (contre 2,6× sous le seuil), Molain 12,8× (4,1×),
Arc-sous-Cicon 7,1× (5,2×), Besain 4,0× (3,9×), Beurey 4,6× (4,9×). Le taux
de détection reste stable (8,6–9,0 %) quel que soit le seuil : pas
d'explosion de faux positifs. L'ancien défaut excluait donc la population où
le signal marche le mieux, et qui contient 78 % des dolines rouges
(57/73 sur Marnaval — le nombre de rouges avec signal y passe de 12 à 29).
Le paramètre reste réglable (0 = désactivé, valeur basse = petites dolines
seulement). - Couche
dolines: repositionnée et visible par défaut. Elle passe sous
les points de prospection (cibles, gouffres) et au-dessus des couches de
contexte (Géorisques, bdtopo_eau, hydro, géologie) — un polygone ne doit pas
masquer les points. Elle n'est plus décochée à l'ouverture : elle l'était
tant qu'elle n'avait aucune symbologie exploitable (son style catégorisé
n'était en fait jamais chargé), or elle porte désormais la couleur de
priorité et l'anneau du signal ponctuel — la masquer revenait à cacher
ces deux informations. - Documentation de la détection ponctuelle de puits, jusqu'ici absente
partout sauf du CHANGELOG : nouvelle section §2.4 dans
DOC_TECHNIQUE_DETECTION.md(méthode, seuils, piège d'alignement des
grilles PDAL, validation 8 secteurs), encadré dédié dans le guide
utilisateur (donc dans le PDF) avec les 3 colonnespc_*en table de
référence, et ligne chiffrée dansJOURNAL_EXPERIENCES.md. - Aide des fenêtres : « Exporter pour analyse MLL » distingue désormais
explicitement ce qui est à fournir au chat IA de ce qui ne l'est pas
(le GPX est pour le terrain) ; « Préparer une sortie » documente enfin le
paramètre de détection ponctuelle de puits (livré en 1.10.0, jamais
mentionné dans l'aide). - Guide utilisateur : la capture du dossier de sortie est remplacée par une
arborescence texte — l'image datait de juin et ne montrait plus les bons
fichiers d'export. L'image inutilisée est supprimée du dépôt. - Avertissement clé API SCAN25 : la clé est écrite en clair dans le
.qgsetkarstpro_etude.json, qui partent sur QFieldCloud et le
téléphone — ne pas partager ces fichiers, révoquer la clé en cas de doute. - Filtre anthropique : trois affirmations fausses corrigées. Le docstring
annonçait les flags'zone_activite'/'bati'(jamais produits), un
commentaire parlait de « carrière/zone d'activité/bâti », et le message de
log runtime affichait « carrières / zones d'activité ». Le filtre ne traite
que les carrières — le bâti est volontairement exclu (un bâtiment n'est
pas une dépression), choix désormais justifié par la mesure dans le code.
KarstPro v1.10.2
Modifié
- Symboles de carte plafonnés à 2 mm, unité déclarée explicitement
(size_unit=MM, plutôt que de dépendre du défaut QGIS). L'anneau du
signal ponctuel passe de 4 à 2 mm (trait 0,8 → 0,4 mm) — au-delà, il
débordait des petites dolines qu'il signale justement (le signal ne
concerne que les dolines sous le seuil de surface, souvent quelques m²).
Les gouffres passent de 2-4 mm à 1-2 mm, écarts relatifs entre catégories
conservés : en secteur boisé dense, des dizaines de milliers de gouffres
détectés (cf.core/shafts.py) se chevauchaient à l'ancienne taille.
KarstPro v1.10.1
Ajouté
- Export MLL : CSV de données par doline (
mll_data_<secteur>_<date>.csv,
mêmes lignes que le JSON déjà joint, colonnes = union dynamique des
attributs présents). Remplace les tableaux markdown P1 (toutes les rouges)- P2 (30 premières oranges) auparavant embarqués dans le
.txt— pure
redondance avec le JSON. Prompt Marnaval : 133 706 → 119 471 caractères.
- P2 (30 premières oranges) auparavant embarqués dans le
- Symbole « signal ponctuel » intégré aux dolines/à la carte de contexte
MLL. Anneau noir posé au centroïde de chaque doline avec un signal
pc_plongee_m(cf. v1.10.0), intégré DANS le symbole de remplissage de
chaque catégorie de priorité (QgsCentroidFillSymbolLayer, actif via une
propriété data-defined) plutôt qu'une couche point séparée à garder
alignée. Même repère (restreint P1/P2) ajouté à la carte de contexte PNG
de l'export MLL, avec légende dédiée. Décidé après validation croisée
positive sur 8 secteurs réels (ratio 2,2x-6x de cavités connues à
proximité d'une doline signalée vs sans signal, session du 2026-07-25).
Modifié
- Export MLL : le GPX n'est plus régénéré par le LLM. Le fichier
.gpx(coordonnées exactes) est écrit une seule fois par script et n'est
plus embarqué dans le prompt ni joint au message MLL — redondant avec un
fichier déjà correct, et un vrai risque de dégradation silencieuse
(troncature/doublon) en lui demandant de réémettre des centaines de
<wpt>. La mission se limite désormais à donner l'ordre de visite
(liste d'IDs par journée de prospection, quelques lignes) ; le.gpx
reste trié par score brut, à réordonner à la main sur le terrain si
besoin.
Corrigé
- Blocage de 8h+ à la préparation de grands secteurs boisés (Poligny,
Chaux-Neuve). Cause :shafts.pydéclasse automatiquement en
interet=0tout gouffre détecté sous canopée fermée (faux positifs
LiDAR) — sur un secteur boisé, ça représente la quasi-totalité des
gouffres détectés (117 267/118 060 sur Poligny). Le carryover
(capture_investigated_gouffres) confondait ce déclassement automatique
avec un vrai verdict terrain humain, etapply_gouffres_carryoverles
appariait par une double boucle Python sans index spatial —
jusqu'à ~14 milliards de comparaisons. Remplacé par un index spatial
(shapely.strtree.STRtree) dansapply_gouffres_carryoveret
_suppress_cibles_near: même volume réel vérifié en 19,5 s au lieu de
8h+. Question de comportement non tranchée (hors scope de ce correctif) :
un gouffre auto-déclassé canopée ne sera donc jamais reproposé comme
cible fraîche à une re-préparation, même si personne ne l'a vraiment
regardé. prototypes/validate_pc_signal.py: comparaisons de distance fausses
si l'inventaire de cavités connues n'est pas en EPSG:2154. Trouvé en
conditions réelles (inventaire ASHM en EPSG:4326 contre un secteur en
Lambert-93) : les distances comparaient des degrés à des mètres, donnant
0% de correspondance sans rapport avec le signal réel. Reprojection
automatique (pyproj.Transformer) ajoutée avant comparaison.- La coloration des couches
dolines(par priorité) etgouffres(par
intérêt) ne s'est probablement jamais appliquée, dans aucune version
publiée — ni dans le.qgs, ni en ouvrant le gpkg brut hors projet.
Deux bugs cumulés : (1)_embed_stylescodait en dur le nom de colonne
géométrie"geometry"dans la tablelayer_stylesdu gpkg, alors que
pyogrio/GDAL nomme réellement cette colonne"geom"pour un GeoPackage —
QGIS ne retrouvait donc jamais le style associé à ces couches ; (2) même
corrigé, le QML embarqué (_DOLINES_QML/_GOUFFRES_QML) définissait ses
symboles en ligne dans chaque<category>au lieu de les référencer
depuis le bloc<symbols>(format non standard) — QGIS chargeait le bon
type de renderer et l'attribut, mais avec zéro catégorie utilisable.
Corrigé en reconstruisant les deux renderers via l'API QGIS
(_style_dolines,_style_gouffres, mêmes couleurs qu'avant) plutôt
que via QML écrit à la main.
KarstPro v1.10.0
Ajouté
- Détection ponctuelle de puits depuis le nuage de points brut (Phase 1,
informatif). Nouveau signal complémentaire aux dolines/gouffres : sous
un seuil de surface configurable (défaut 50 m²), compare l'altitude
minimale des DERNIERS RETOURS LiDAR bruts (pas seulement les points
classés sol) à une référence de voisinage local — révèle parfois une
profondeur qu'un puits étroit ne laisse pas voir au MNT lissé (validé sur
20+ cas réels, 3 secteurs, 2 régions géologiques, session du
2026-07-23/24 — voir
docs/superpowers/specs/2026-07-24-detection-ponctuelle-puits-design.md).
Nouvelles colonnespc_plongee_m,pc_dist_m,pc_n_pointssur la
couchedolines, purement informatives — n'affecte jamais le score, la
priorité, ni le modèle appris. Nouvelle section dans le rapport MLL
(repère 🔻). Best-effort : ignoré proprement en mode MNT manuel (nuage de
points brut indisponible) ou si le seuil de surface est mis à 0. Script
de validation croisée avec les cavités connues (prototypes/validate_pc_signal.py)
pour accumuler de la preuve avant une éventuelle Phase 2 (intégration au
modèle appris + réentraînement).
⚠️ Bug réel trouvé et corrigé en vérifiant sur données réelles (Marnaval)
avant de livrer : le raster des derniers retours et le MNT étaient générés
par deux appels PDAL séparés, chacun calant sa propre grille sur l'emprise
de ses points — décalage de quelques dixièmes de mètre entre les deux. Un
rééchantillonnage naïf (fenêtre +out_shape) comparait alors des
cellules sans rapport, produisant des « plongées » de 30 à 50 m au lieu
des 2 à 5 m réels. Corrigé en forçantgenerate_pc_rastersà aligner sa
grille pixel pour pixel sur celle du MNT (origin_x/origin_y/width/
heightdewriters.gdal) — plus besoin de rééchantillonnage, lecture
directe. Re-vérifié sur Marnaval après correction (plongées 2,9-5,2 m,
cohérentes avec les cas réels connus).