{
  "format": "geolibre-language-pack",
  "formatVersion": 1,
  "scope": "whitebox",
  "locale": "fr",
  "name": "Pack de langue française pour Whitebox",
  "updatedAt": "2026-09-25T16:57:55.641Z",
  "translations": {
    "processing": {
      "toolMeta": {
        "whitebox": {
          "build_object_hierarchy_multiscale": {
            "name": "Construire une hiérarchie d'objets multi-échelle",
            "description": "Réseau hiérarchique d'objets construit par agrégation itérative sur plusieurs échelles de segmentation, fusionnant progressivement les segments plus fins selon leur similarité spectrale et leur adjacence spatiale. Construit une structure arborescente dont les nœuds feuilles représentent les segments à échelle fine et la racine l'image entière. Les relations d'inclusion encodent des hiérarchies d'objets parent-enfant (partie-tout), permettant une analyse multirésolution et des requêtes d'objets adaptées à l'échelle sur les différents niveaux de la hiérarchie. Caractéristiques clés : hiérarchie de segmentation multi-échelle ; suivi des relations partie-tout ; prise en charge des requêtes d'objets imbriqués ; analyse adaptée à l'échelle ; représentation hiérarchique économe en mémoire ; facilitation de la classification en cascade. Cas d'utilisation : cartographie hiérarchique de l'occupation du sol ; extraction de bâtiments complexes à partir de leurs composants ; détection de parcelles agricoles ; analyse des strates de végétation ; délimitation de quartiers urbains ; cartographie des zones humides avec classification des sous-composants. Interprétation des résultats : la sortie est une base de données hiérarchique d'objets encodant la structure dépendante de l'échelle. Interrogez les objets à des échelles spécifiques ; les échelles intermédiaires révèlent des échelles d'objets transitoires équilibrant détail et généralisation. Les relations parent-enfant révèlent la structure compositionnelle. Les distributions statistiques par niveau d'échelle caractérisent les propriétés de taille et de forme des objets à chaque niveau de la hiérarchie, permettant de choisir la stratégie de classification optimale selon l'échelle.",
            "params": {
              "coarse_segments": {
                "label": "Segments grossiers",
                "description": "Raster de segments grossiers."
              },
              "fine_segments": {
                "label": "Segments fins",
                "description": "Raster de segments fins."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du CSV de hiérarchie en sortie."
              }
            }
          },
          "classify_objects_ensemble_pro": {
            "name": "Classer les objets par ensemble (Pro)",
            "description": "Exécute une configuration de classification d'objets de type ensemble, réglée pour une plus grande stabilité sur des scènes hétérogènes.",
            "params": {
              "features": {
                "label": "Entités",
                "description": "CSV d'entrée des caractéristiques d'objets (doit inclure segment_id et des colonnes de caractéristiques numériques)."
              },
              "training": {
                "label": "Entraînement",
                "description": "CSV d'entraînement avec les colonnes segment_id et d'étiquette de classe."
              },
              "segment_id_field": {
                "label": "Champ d'identifiant de segment",
                "description": "Nom du champ d'identifiant de segment (par défaut segment_id)."
              },
              "class_field": {
                "label": "Champ de classe",
                "description": "Champ d'étiquette de classe dans le CSV d'entraînement (par défaut class)."
              },
              "n_trees": {
                "label": "Nombre d'arbres",
                "description": "Nombre d'arbres (par défaut 200)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du CSV de prédictions en sortie."
              }
            }
          },
          "classify_objects_random_forest": {
            "name": "Classer les objets par forêt aléatoire",
            "description": "Entraîne un classificateur d'ensemble Random Forest sur des échantillons d'entraînement de segments étiquetés, en utilisant des caractéristiques spectrales, morphologiques et de texture comme prédicteurs. Construit plusieurs arbres de décision par échantillonnage bootstrap et randomisation des caractéristiques, puis agrège les prédictions par vote majoritaire. La classification opère sur des vecteurs de caractéristiques par segment, attribuant des étiquettes de classe d'objet de manière probabiliste selon le consensus de l'ensemble, ce qui permet une catégorisation multiclasse robuste des objets à partir des caractéristiques OBIA. Les caractéristiques clés comprennent l'apprentissage d'ensemble combinant plusieurs arbres de décision pour une classification robuste, la gestion des espaces de caractéristiques de grande dimension typiques de l'OBIA multispectrale, des estimations de confiance et de probabilité de classification, un classement de l'importance des caractéristiques identifiant les propriétés discriminantes, une gestion naturelle des interactions non linéaires entre caractéristiques, et la robustesse au bruit et à la redondance des caractéristiques. Les cas d'utilisation couvrent la classification multiclasse de l'occupation du sol à partir de segments OBIA (urbain, agricole, forêt, eau), la classification supervisée au niveau objet affinée par la sélection d'échantillons d'entraînement, la classification de détection de changements sur des séquences de segmentation temporelles, la classification hiérarchique (types d'habitats grossiers affinés en catégories fines) et l'intégration d'échantillons d'entraînement manuels issus de l'interprétation visuelle. En sortie, l'étiquette de classe prédite identifie le type d'objet principal ; la probabilité de confiance indique la certitude de la classification ; une faible confiance suggère des objets intermédiaires ambigus ; l'importance des caractéristiques identifie les propriétés spectrales/morphologiques qui déterminent les décisions de classification ; la carte de classification représente directement la distribution des types d'objets ; la confusion entre classes similaires guide l'amélioration de l'entraînement ; la sortie probabiliste permet de quantifier l'incertitude.",
            "params": {
              "features": {
                "label": "Entités",
                "description": "CSV d'entrée des caractéristiques d'objets (doit inclure segment_id et des colonnes de caractéristiques numériques)."
              },
              "training": {
                "label": "Entraînement",
                "description": "CSV d'entraînement avec les colonnes segment_id et d'étiquette de classe."
              },
              "segment_id_field": {
                "label": "Champ d'identifiant de segment",
                "description": "Nom du champ d'identifiant de segment (par défaut segment_id)."
              },
              "class_field": {
                "label": "Champ de classe",
                "description": "Champ d'étiquette de classe dans le CSV d'entraînement (par défaut class)."
              },
              "n_trees": {
                "label": "Nombre d'arbres",
                "description": "Nombre d'arbres (par défaut 200)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du CSV de prédictions en sortie."
              }
            }
          },
          "classify_objects_rules_basic": {
            "name": "Classer les objets par règles (base)",
            "description": "Applique une classification d'objets transparente fondée sur des règles, à partir d'un fichier CSV de règles caractéristique-opérateur-seuil. Logique de décision entièrement interprétable pour les flux de travail d'experts du domaine et la conformité réglementaire.",
            "params": {
              "features": {
                "label": "Entités",
                "description": "CSV d'entrée des caractéristiques d'objets."
              },
              "rules": {
                "label": "Règles",
                "description": "CSV de règles avec les colonnes : feature, op, value, class, [priority]."
              },
              "default_class": {
                "label": "Classe par défaut",
                "description": "Classe de repli lorsqu'aucune règle ne correspond."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du CSV de prédictions en sortie."
              }
            }
          },
          "classify_objects_rules_hierarchical": {
            "name": "Classer les objets par règles hiérarchiques",
            "description": "Applique une classification d'objets hiérarchique fondée sur des règles ; utilise actuellement des règles ordonnées avec un repli déterministe.",
            "params": {
              "features": {
                "label": "Entités",
                "description": "CSV d'entrée des caractéristiques d'objets."
              },
              "rules": {
                "label": "Règles",
                "description": "CSV de règles avec les colonnes : feature, op, value, class, [priority]."
              },
              "default_class": {
                "label": "Classe par défaut",
                "description": "Classe de repli lorsqu'aucune règle ne correspond."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du CSV de prédictions en sortie."
              }
            }
          },
          "classify_objects_svm": {
            "name": "Classer les objets par SVM",
            "description": "Classifie les objets à l'aide d'un flux de travail de type SVM (implémenté via les paramètres par défaut d'un moteur robuste de classification d'objets).",
            "params": {
              "features": {
                "label": "Entités",
                "description": "CSV d'entrée des caractéristiques d'objets (doit inclure segment_id et des colonnes de caractéristiques numériques)."
              },
              "training": {
                "label": "Entraînement",
                "description": "CSV d'entraînement avec les colonnes segment_id et d'étiquette de classe."
              },
              "segment_id_field": {
                "label": "Champ d'identifiant de segment",
                "description": "Nom du champ d'identifiant de segment (par défaut segment_id)."
              },
              "class_field": {
                "label": "Champ de classe",
                "description": "Champ d'étiquette de classe dans le CSV d'entraînement (par défaut class)."
              },
              "n_trees": {
                "label": "Nombre d'arbres",
                "description": "Nombre d'arbres (par défaut 200)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du CSV de prédictions en sortie."
              }
            }
          },
          "evaluate_object_classification_accuracy": {
            "name": "Évaluer la précision de classification des objets",
            "description": "Calcule des métriques de précision de classification en comparant les étiquettes d'objets prédites aux étiquettes de référence (vérité terrain) ou de validation. Génère une matrice de confusion documentant les schémas d'accord et de désaccord de classification par classe, calcule la précision globale (total des prédictions correctes), la précision du producteur par classe (taux de détection), la précision de l'utilisateur (fiabilité), le score F1 (moyenne harmonique), la statistique kappa (accord corrigé du hasard) et une analyse des erreurs par classe identifiant les schémas systématiques de mauvaise classification. Les caractéristiques clés comprennent une évaluation complète de la précision sur toutes les classes, des métriques de performance par classe permettant des diagnostics spécifiques, une matrice de confusion révélant les schémas systématiques de mauvaise classification, un test de significativité statistique via le coefficient kappa, une gestion naturelle des distributions de classes déséquilibrées et l'identification des problèmes d'adéquation des données d'entraînement. Les cas d'utilisation comprennent la validation des modèles de classification et la quantification de leurs performances, la comparaison d'approches et de paramètres de classification concurrents, l'identification des classes d'objets problématiques nécessitant un entraînement supplémentaire, l'évaluation de l'aptitude de la classification pour des applications opérationnelles, la sélection de modèles et le réglage des hyperparamètres fondés sur la précision, l'assurance qualité dans les flux de cartographie automatisée et la communication de métriques de précision standardisées pour l'évaluation par les pairs. En sortie, la précision globale représente la fiabilité de la classification sur l'ensemble des objets ; la précision du producteur indique l'exhaustivité de la détection par classe ; la précision de l'utilisateur indique la fiabilité des prédictions ; un kappa élevé (>0.8) indique un fort accord au-delà du hasard ; la matrice de confusion révèle quelles classes sont confondues entre elles ; la dominance de la diagonale indique une bonne séparation des classes ; les entrées hors diagonale localisent les sources de mauvaise classification ; les métriques par classe orientent l'amélioration ciblée de l'entraînement.",
            "params": {
              "predictions": {
                "label": "Prédictions",
                "description": "CSV de prédictions contenant segment_id et predicted_class."
              },
              "reference": {
                "label": "Référence",
                "description": "CSV de référence contenant segment_id et class."
              },
              "segment_id_field": {
                "label": "Champ d'identifiant de segment",
                "description": "Nom du champ d'identifiant de segment (par défaut segment_id)."
              },
              "predicted_field": {
                "label": "Champ prédit",
                "description": "Champ de classe prédite (par défaut predicted_class)."
              },
              "reference_field": {
                "label": "Champ de référence",
                "description": "Champ de classe de référence (par défaut class)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du rapport JSON en sortie."
              }
            }
          },
          "evaluate_segmentation_quality_pro": {
            "name": "Évaluer la qualité de segmentation (Pro)",
            "description": "Calcule des diagnostics de qualité de segmentation, notamment le nombre d'objets et des statistiques de recouvrement de l'étiquette dominante.",
            "params": {
              "segments": {
                "label": "Segments",
                "description": "Raster d'étiquettes de segments en entrée."
              },
              "reference": {
                "label": "Référence",
                "description": "Raster d'étiquettes de référence optionnel pour les diagnostics basés sur le chevauchement."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du rapport JSON en sortie."
              }
            }
          },
          "image_segmentation": {
            "name": "Segmentation d'image",
            "description": "Segmente des piles de rasters multibandes en régions homogènes contiguës par croissance de régions à partir de germes.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Tableau de rasters monobandes en entrée (un par bande)."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "threshold": {
                "label": "Seuil",
                "description": "Seuil de distance pour la croissance de régions dans l'espace des caractéristiques standardisées (par défaut 0.5)."
              },
              "steps": {
                "label": "Étapes",
                "description": "Nombre de bandes de priorité des germes (par défaut 10)."
              },
              "min_area": {
                "label": "Surface minimale",
                "description": "Surface minimale de région optionnelle pour le nettoyage post-fusion (par défaut 4)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "image_slider": {
            "name": "Curseur d'images",
            "description": "Image Slider est un outil de visualisation interactif permettant une comparaison directe au niveau du pixel entre des jeux de données raster co-enregistrés, au moyen de séparateurs de superposition horizontaux ou verticaux déplaçables. Algorithme : conserve en mémoire deux jeux de données raster alignés, affiche une vue combinée dont la position du séparateur réglable contrôle la visibilité des couches ; l'interaction de l'utilisateur ajuste dynamiquement le séparateur, créant un effet d'écran partagé. Prend en charge les orientations de division horizontale et verticale. Caractéristiques clés : comparaison interactive en temps réel, visualisation en pleine résolution, interface intuitive ne nécessitant aucune compétence analytique, fonctionne avec les rasters multispectraux et indexés, prise en charge de grands jeux de données grâce à un rendu efficace. Capacités : visualisation de la détection de changements, comparaison avant/après, analyse multitemporelle, évaluation de la normalisation radiométrique, inspection visuelle de la précision de classification. Cas d'utilisation : détection des changements d'imagerie entre deux dates, comparaison des résultats de classification avec des données de référence, évaluation de l'efficacité des prétraitements, détection visuelle des changements dans l'analyse de séries temporelles. Applications : évaluation des dommages lors des interventions en cas de catastrophe, suivi de l'étalement urbain, détection des perturbations forestières, suivi des changements agricoles, contrôle qualité des résultats de traitement d'images. Interprétation des résultats : les différences visuelles révèlent l'ampleur et la localisation des changements ; des bords nets indiquent des changements importants ; des transitions progressives suggèrent une imprécision de recalage ou une gradation temporelle ; des différences systématiques sur toute l'image révèlent des artefacts de traitement systématiques.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Chemin du raster de l'image de gauche ou objet raster typé."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Chemin du raster de l'image de droite ou objet raster typé."
              },
              "label1": {
                "label": "Étiquette 1",
                "description": "Étiquette optionnelle affichée pour l'image de gauche."
              },
              "left_palette": {
                "label": "Palette de gauche",
                "description": "Palette pour l'image de gauche non RVB (par défaut grey)."
              },
              "left_reverse_palette": {
                "label": "Inverser la palette de gauche",
                "description": "Inverser la palette de gauche."
              },
              "label2": {
                "label": "Étiquette 2",
                "description": "Étiquette optionnelle affichée pour l'image de droite."
              },
              "right_palette": {
                "label": "Palette de droite",
                "description": "Palette pour l'image de droite non RVB (par défaut grey)."
              },
              "right_reverse_palette": {
                "label": "Inverser la palette de droite",
                "description": "Inverser la palette de droite."
              },
              "height": {
                "label": "Hauteur",
                "description": "Hauteur d'affichage en pixels (par défaut 600)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du HTML en sortie."
              }
            }
          },
          "image_stack_profile": {
            "name": "Profil de pile d'images",
            "description": "Extrait des profils par point à travers une pile de rasters ordonnée et écrit éventuellement un rapport HTML.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Liste de rasters d'entrée sous forme de tableau de chemins ou de chaîne délimitée par des virgules/points-virgules."
              },
              "points": {
                "label": "Points",
                "description": "Chemin du vecteur de points (ou objet vecteur typé) contenant les emplacements d'échantillonnage."
              },
              "output_html": {
                "label": "HTML de sortie",
                "description": "Chemin de sortie optionnel du rapport HTML."
              }
            }
          },
          "obia_audit_report_pro": {
            "name": "Rapport d'audit OBIA (Pro)",
            "description": "Construit un rapport d'audit des artefacts du flux de travail OBIA, incluant les métadonnées d'existence, de taille et d'horodatage des fichiers.",
            "params": {
              "artifacts": {
                "label": "Artefacts",
                "description": "Tableau de chemins d'artefacts à auditer."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du rapport d'audit JSON en sortie."
              }
            }
          },
          "obia_batch_orchestrator_pro": {
            "name": "Orchestrateur de lots OBIA (Pro)",
            "description": "Exécute plusieurs tâches de chaîne de traitement OBIA en une seule requête et renvoie un rapport de tâches consolidé.",
            "params": {
              "jobs": {
                "label": "Tâches",
                "description": "Tableau d'objets de tâches avec inputs, training, output_prefix et segment_method optionnel."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin optionnel du rapport JSON en sortie."
              }
            }
          },
          "obia_pipeline_basic": {
            "name": "Chaîne OBIA (base)",
            "description": "Exécute un flux de travail OBIA complet de bout en bout : segmentation (SLIC/graphe), fusion des petites régions, extraction de caractéristiques spectrales/de forme et classification par forêt aléatoire en une seule opération.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Tableau de rasters monobandes en entrée pour la segmentation/les caractéristiques."
              },
              "training": {
                "label": "Entraînement",
                "description": "CSV d'entraînement avec les colonnes segment_id et class."
              },
              "output_prefix": {
                "label": "Préfixe de sortie",
                "description": "Préfixe de chemin de sortie pour les artefacts générés."
              },
              "segment_method": {
                "label": "Méthode de segmentation",
                "description": "Méthode de segmentation : slic ou graph (par défaut slic)."
              },
              "min_size": {
                "label": "Taille minimale",
                "description": "Taille minimale de segment pour le nettoyage par fusion (par défaut 10)."
              },
              "class_field": {
                "label": "Champ de classe",
                "description": "Nom du champ de classe d'entraînement (par défaut class)."
              }
            }
          },
          "object_class_probability_maps": {
            "name": "Cartes de probabilité de classe d'objet",
            "description": "Convertit les prédictions en cartes de probabilité par classe, permettant une visualisation raster de l'incertitude et un filtrage fondé sur la confiance. Prend en charge le seuillage de confiance en aval et les scénarios multi-étiquettes.",
            "params": {
              "predictions": {
                "label": "Prédictions",
                "description": "CSV de prédictions avec segment_id et predicted_class."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du CSV de probabilités en sortie."
              }
            }
          },
          "object_features_context_neighbors": {
            "name": "Attributs d'objet : voisins de contexte",
            "description": "Calcule des caractéristiques de contexte spatial : nombre d'objets adjacents, longueurs de frontières partagées et métriques d'isolement. Permet une classification tenant compte du voisinage, capturant les relations entre objets dans le paysage.",
            "params": {
              "segments": {
                "label": "Segments",
                "description": "Raster d'étiquettes de segments en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du CSV en sortie."
              }
            }
          },
          "object_features_shape_basic": {
            "name": "Attributs d'objet : forme (base)",
            "description": "Calcule des descripteurs de forme géométriques et morphologiques pour chaque segment, notamment la superficie (nombre de pixels), le périmètre (longueur de la frontière), la compacité (circularité normalisée par le périmètre), l'allongement (rapport longueur/largeur), le facteur de forme (régularité de forme normalisée) et la solidité (efficacité de l'enveloppe convexe). Les descripteurs de forme capturent des caractéristiques structurelles indépendantes du contenu spectral, permettant la classification de la géométrie des objets et la reconnaissance de motifs morphologiques. Les caractéristiques clés comprennent des ensembles complets de métriques de forme couvrant la superficie, le périmètre, la régularité et l'allongement, des algorithmes de suivi de frontière efficaces en calcul, des métriques invariantes par rotation et translation, une applicabilité sur différentes gammes d'échelles et une capacité de classification morphologique des objets (par exemple, routes allongées par opposition aux bâtiments compacts). Les cas d'utilisation englobent la classification des emprises de bâtiments et l'analyse de la structure urbaine, l'extraction d'entités linéaires (routes, rivières, limites), la caractérisation des taches de végétation et l'analyse de la fragmentation, le contrôle qualité par filtrage fondé sur la forme, la reconnaissance hiérarchique d'objets combinant propriétés de forme et spectrales, et la quantification de la structure du paysage pour le suivi écologique. En sortie, la superficie quantifie la taille du segment en pixels ; le périmètre définit la complexité de la frontière ; une compacité proche de 1.0 indique des formes circulaires/régulières, des valeurs plus faibles indiquent des entités irrégulières/allongées ; un allongement >1 indique des entités linéaires, proche de 1 des objets compacts ; le facteur de forme combine plusieurs propriétés de forme pour une classification intégrée ; les métriques de forme permettent un filtrage morphologique pour isoler les types d'objets cibles.",
            "params": {
              "segments": {
                "label": "Segments",
                "description": "Raster d'étiquettes de segments en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du CSV en sortie."
              }
            }
          },
          "object_features_spectral_basic": {
            "name": "Attributs d'objet : spectral (base)",
            "description": "Calcule des résumés statistiques univariés complets des valeurs de réflectance spectrale dans chaque segment pour toutes les bandes de l'image. Les calculs par segment incluent la réflectance moyenne, l'écart-type (homogénéité), les bornes de réflectance minimale et maximale, des valeurs de quantiles pour une estimation robuste et des statistiques par bande permettant la quantification de la texture multispectrale et la caractérisation du profil spectral, fondamentales pour les flux de classification OBIA. Les caractéristiques clés comprennent la génération de statistiques spectrales par bande pour l'imagerie multispectrale et hyperspectrale, des mesures statistiques robustes capturant la tendance centrale et la dispersion, l'identification des anomalies spectrales et des valeurs aberrantes au sein des segments, une synthèse efficace du raster vers le vecteur et une sortie alimentant directement les chaînes de classification par apprentissage automatique. Les cas d'utilisation couvrent l'extraction de caractéristiques pour la classification orientée objet à l'aide de métriques spectrales, l'identification des types d'occupation du sol par analyse des signatures spectrales, la détection de changements par comparaison de statistiques spectrales sur des séquences temporelles, l'évaluation de la qualité des données et la détection des valeurs aberrantes, le suivi environnemental par analyse de séries temporelles spectrales et les applications d'agriculture de précision nécessitant une caractérisation normalisée de la réponse spectrale. En sortie, les valeurs moyennes représentent la réponse spectrale typique du matériau du segment ; l'écart-type quantifie l'hétérogénéité interne (faible = surface homogène, élevé = matériaux mélangés ou ombres) ; les bornes min/max identifient les extrêmes spectraux au sein des segments ; les profils spectraux permettent la comparaison avec des signatures de référence ; les statistiques constituent la base des vecteurs de caractéristiques de classification ; l'analyse par bande révèle les indices spectraux et la capacité de discrimination des matériaux.",
            "params": {
              "segments": {
                "label": "Segments",
                "description": "Raster d'étiquettes de segments en entrée."
              },
              "inputs": {
                "label": "Entrées",
                "description": "Tableau de rasters monobandes en entrée utilisés pour les caractéristiques spectrales."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du CSV en sortie."
              }
            }
          },
          "object_features_texture_glcm_basic": {
            "name": "Attributs d'objet : texture GLCM (base)",
            "description": "Extrait des caractéristiques de texture par analyse de la matrice de cooccurrence des niveaux de gris (GLCM) calculée à partir des distributions d'intensité par bande dans chaque segment. La GLCM quantifie la cooccurrence spatiale des niveaux de ton, générant des descripteurs tels que le contraste (variation locale), l'homogénéité (régularité spatiale), l'énergie (ordre), l'entropie (désordre) et des métriques de dissimilarité capturant les motifs de texture indépendamment de la luminosité spectrale globale. Les caractéristiques clés comprennent des métriques de texture fondées sur la GLCM capturant les motifs spatiaux locaux au sein des segments, une analyse multidirectionnelle (horizontale, verticale, diagonale) pour une caractérisation de la texture indépendante de l'orientation, une applicabilité à toutes les bandes de l'image permettant une empreinte de texture, la discrimination des surfaces texturées et lisses, et une analyse au niveau du segment peu coûteuse en calcul. Les cas d'utilisation comprennent la classification des matériaux fondée sur la rugosité et la texture de surface (asphalte ou béton, distinction des types de cultures), la caractérisation de la structure et de la densité forestières par la texture de la canopée, l'interprétation d'images SAR et l'analyse de la texture du tissu urbain, la discrimination entre surfaces de qualité et surfaces dégradées, l'évaluation de la santé des cultures par des métriques de texture de la canopée, et la détection des nuages et des ombres via les anomalies de texture. En sortie, un contraste élevé indique une texture rugueuse/variable, faible des surfaces lisses ; une homogénéité élevée indique des motifs spatiaux réguliers, faible une texture chaotique ; une énergie élevée indique une texture organisée, faible un bruit aléatoire ; l'entropie quantifie le désordre de la texture ; la dissimilarité capture l'irrégularité des motifs spatiaux ; les profils de texture permettent une classification propre à chaque matériau ; la combinaison avec des caractéristiques spectrales améliore la discrimination des types d'objets.",
            "params": {
              "segments": {
                "label": "Segments",
                "description": "Raster d'étiquettes de segments en entrée."
              },
              "input": {
                "label": "Entrée",
                "description": "Raster d'intensité monobande pour l'analyse de texture."
              },
              "levels": {
                "label": "Niveaux",
                "description": "Niveaux de quantification pour la GLCM (par défaut 16)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du CSV en sortie."
              }
            }
          },
          "object_features_topology_relations": {
            "name": "Attributs d'objet : relations topologiques",
            "description": "Calcule des caractéristiques de topologie de graphe : degré de l'objet (nombre de voisins), force du voisin dominant et indicateurs de points d'articulation. Capture la position structurelle dans le réseau d'objets pour la classification hiérarchique.",
            "params": {
              "segments": {
                "label": "Segments",
                "description": "Raster d'étiquettes de segments en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du CSV en sortie."
              }
            }
          },
          "object_uncertainty_diagnostics_pro": {
            "name": "Diagnostic d'incertitude des objets (Pro)",
            "description": "Calcule des diagnostics d'incertitude agrégés à partir des sorties de probabilité des objets.",
            "params": {
              "probabilities": {
                "label": "Probabilités",
                "description": "CSV de probabilités en entrée avec les colonnes probability et uncertainty."
              },
              "low_conf_threshold": {
                "label": "Seuil de faible confiance",
                "description": "Seuil de faible confiance sur la probabilité (par défaut 0.7)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du JSON de diagnostics en sortie."
              }
            }
          },
          "objects_boundary_refinement_pro": {
            "name": "Affinement des limites d'objets (Pro)",
            "description": "Affine les frontières des objets par un nettoyage itératif des petites régions avec fusion tenant compte du voisinage.",
            "params": {
              "segments": {
                "label": "Segments",
                "description": "Raster d'étiquettes de segments en entrée."
              },
              "iterations": {
                "label": "Itérations",
                "description": "Itérations de raffinement (par défaut 2)."
              },
              "min_size": {
                "label": "Taille minimale",
                "description": "Seuil de taille minimale d'objet (par défaut 6)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster raffiné en sortie."
              }
            }
          },
          "objects_enforce_min_mapping_unit": {
            "name": "Appliquer l'unité minimale de cartographie aux objets",
            "description": "Impose une unité cartographique minimale en fusionnant les segments d'objets trop petits.",
            "params": {
              "segments": {
                "label": "Segments",
                "description": "Raster d'étiquettes de segments en entrée."
              },
              "min_size": {
                "label": "Taille minimale",
                "description": "Taille minimale de segment en cellules (par défaut 5)."
              },
              "method": {
                "label": "Méthode",
                "description": "Méthode de fusion : longest, largest, nearest (par défaut longest)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "polygons_to_segments": {
            "name": "Polygones vers segments",
            "description": "Rastérise les polygones modifiés vers un raster d'étiquettes de segments en conservant les identifiants d'objets ou les valeurs attributaires. Permet des flux de travail OBIA itératifs combinant segmentation automatisée et affinage manuel.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du vecteur de polygones en entrée."
              },
              "base": {
                "label": "Base",
                "description": "Raster de base définissant la grille de sortie."
              },
              "field": {
                "label": "Champ",
                "description": "Champ numérique optionnel à incruster (par défaut FID)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de segments en sortie."
              }
            }
          },
          "propagate_labels_across_hierarchy": {
            "name": "Propager les étiquettes dans la hiérarchie",
            "description": "Propage les étiquettes de classe du niveau grossier aux objets enfants du niveau fin via les correspondances hiérarchiques. Permet un étiquetage efficace des hiérarchies imbriquées et des flux d'affinage fondés sur l'héritage.",
            "params": {
              "hierarchy": {
                "label": "Hiérarchie",
                "description": "CSV de hiérarchie avec fine_segment_id et coarse_segment_id."
              },
              "parent_labels": {
                "label": "Étiquettes parentes",
                "description": "CSV d'étiquettes parentes avec coarse_segment_id et class."
              },
              "child_labels": {
                "label": "Étiquettes enfants",
                "description": "CSV optionnel d'étiquettes enfants avec fine_segment_id et class."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du CSV d'étiquettes propagées en sortie."
              }
            }
          },
          "segment_graph_felzenszwalb": {
            "name": "Segmentation par graphe de Felzenszwalb",
            "description": "La segmentation fondée sur les graphes de Felzenszwalb traite l'image comme un graphe non orienté pondéré dont les pixels sont les nœuds et dont les arêtes relient les pixels adjacents avec des poids représentant la dissimilarité spectrale. Les segments fusionnent itérativement en comparant les poids des arêtes au sein des composantes à des seuils dynamiques ; les arêtes dont le poids est inférieur au seuil fusionnent, produisant des segments aux caractéristiques spectrales localement homogènes. Cette approche hiérarchique produit des segmentations perceptuellement significatives, sensibles aux variations locales de contraste et aux discontinuités naturelles de couleur et de texture. Caractéristiques clés : segmentation hiérarchique fondée sur les graphes ; complexité de calcul efficace en O(n log n) ; sensibilité aux variations locales de contraste ; segments perceptuellement significatifs ; prise en charge des données multispectrales/hyperspectrales ; régions de taille variable préservant les frontières naturelles. Cas d'utilisation : segmentation d'images multispectrales ; cartographie des habitats naturels ; extraction d'entités urbaines ; délimitation de la canopée forestière ; prétraitement pour la détection de changements ; segmentation de données hyperspectrales. Interprétation des résultats : la sortie est un raster étiqueté ; chaque pixel reçoit un identifiant de segment. La taille des segments varie en sens inverse du contraste spectral local ; les frontières à fort contraste produisent des segments plus petits et plus nombreux ; les régions uniformes fusionnent en segments plus grands. La sensibilité au paramètre k (échelle du seuil) permet de produire des segmentations plus grossières ou plus fines. Les frontières des segments correspondent aux discontinuités spectrales naturelles.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Tableau de rasters monobandes en entrée."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "k": {
                "label": "K",
                "description": "Paramètre d'échelle de segmentation (par défaut 500.0)."
              },
              "sigma": {
                "label": "Sigma",
                "description": "Indication de lissage optionnelle (par défaut 0.8)."
              },
              "min_area": {
                "label": "Surface minimale",
                "description": "Surface minimale pour le nettoyage post-fusion (par défaut 20)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin optionnel du raster de segments en sortie."
              }
            }
          },
          "segment_multiresolution_hierarchical": {
            "name": "Segmentation multirésolution hiérarchique",
            "description": "Génère des segmentations hiérarchiques multi-échelles (grossière et fine) avec des correspondances parent-enfant explicites. Permet l'extraction de caractéristiques dépendante de l'échelle et des flux de classification multiniveaux.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Tableau de rasters monobandes en entrée."
              },
              "coarse_k": {
                "label": "K grossier",
                "description": "Paramètre d'échelle grossière (par défaut 800)."
              },
              "fine_k": {
                "label": "K fin",
                "description": "Paramètre d'échelle fine (par défaut 250)."
              },
              "output_prefix": {
                "label": "Préfixe de sortie",
                "description": "Préfixe de sortie pour les produits générés."
              }
            }
          },
          "segment_scale_parameter_optimizer": {
            "name": "Optimiseur du paramètre d'échelle de segmentation",
            "description": "Parcourt des paramètres d'échelle de segmentation candidats afin d'identifier l'échelle optimale correspondant au nombre d'objets cible. La sélection automatique de l'échelle élimine le réglage manuel pour une qualité de segmentation constante.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Tableau de rasters monobandes en entrée."
              },
              "candidate_scales": {
                "label": "Échelles candidates",
                "description": "Liste des valeurs d'échelle (k) candidates."
              },
              "target_objects": {
                "label": "Objets cibles",
                "description": "Nombre d'objets souhaité. Par défaut sqrt(total_cells)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin optionnel du rapport JSON de l'optimiseur."
              }
            }
          },
          "segment_slic_superpixels": {
            "name": "Segmentation en superpixels SLIC",
            "description": "SLIC (Simple Linear Iterative Clustering) effectue un regroupement itératif des pixels dans l'espace de caractéristiques 5D combinant coordonnées spatiales et valeurs de couleur/spectrales, faisant converger les superpixels vers l'homogénéité locale. L'algorithme initialise une grille régulière de centres de clusters et affecte les pixels aux centres les plus proches, en mettant à jour itérativement les centres et en réduisant les régions de recherche. Il produit des superpixels compacts et de forme régulière avec un minimum de débordements de frontière par rapport aux alternatives par bassins versants ou mean-shift, offrant une meilleure adhérence aux contours naturels. Caractéristiques clés : superpixels uniformes et compacts ; calcul efficace en temps linéaire ; paramètre de compacité configurable équilibrant régularité spatiale et cohérence spectrale ; débordement minimal des frontières ; prise en charge de l'imagerie multispectrale. Cas d'utilisation : prétraitement pour la classification orientée objet ; analyse hiérarchique de régions ; segmentation d'images SAR et optiques ; cartographie urbaine ; délimitation de la végétation ; identification des limites d'utilisation du sol. Interprétation des résultats : la sortie est un raster étiqueté dont les valeurs de pixel représentent les identifiants de superpixels attribués. Les frontières des superpixels s'alignent sur les contours dominants et les transitions de couleur. Des superpixels plus petits (granularité plus élevée) capturent des détails plus fins mais augmentent la charge de calcul ; des superpixels plus grands (granularité plus faible) fusionnent les régions similaires et améliorent l'efficacité. La précision des frontières dépend du réglage du paramètre de compacité et de la séparation des bandes multispectrales.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Tableau de rasters monobandes en entrée."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "region_size": {
                "label": "Taille de région",
                "description": "Taille cible des superpixels en pixels (par défaut 20)."
              },
              "compactness": {
                "label": "Compacité",
                "description": "Contrôle de compacité (par défaut 10.0)."
              },
              "min_area": {
                "label": "Surface minimale",
                "description": "Surface minimale pour la fusion de nettoyage (par défaut dérivée de region_size)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin optionnel du raster de segments en sortie."
              }
            }
          },
          "segment_watershed_markers": {
            "name": "Segmentation par marqueurs de ligne de partage",
            "description": "Segmentation de type bassin versant guidée par des marqueurs, séparant les objets autour de régions germes identifiées. Privilégie la préservation des frontières tout en contrôlant la taille des segments pour les flux de travail OBIA hiérarchiques.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Tableau de rasters monobandes en entrée."
              },
              "gradient_weight": {
                "label": "Poids du gradient",
                "description": "Contrôle de l'accentuation des limites (par défaut 1.0)."
              },
              "min_area": {
                "label": "Surface minimale",
                "description": "Taille minimale de segment (par défaut 12)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin optionnel du raster de segments en sortie."
              }
            }
          },
          "segments_merge_small_regions": {
            "name": "Fusionner les petites régions des segments",
            "description": "La fusion de segments met en œuvre une consolidation hiérarchique par analyse de l'adjacence spatiale et des critères de fusion définis par l'utilisateur. Évalue chaque segment trop petit par rapport aux régions voisines à l'aide de seuils de taille, de mesures de similarité spectrale ou de critères morphologiques personnalisés ; fusionne progressivement les segments candidats dans des voisins absorbants selon des files de priorité fondées sur le coût de fusion, en préservant la connectivité des segments et en évitant les violations de topologie. Les caractéristiques clés comprennent la régularisation en post-traitement d'une imagerie sur-segmentée, des critères de fusion configurables (taille minimale, seuil de similarité spectrale, propriétés morphologiques), la préservation de l'intégrité des frontières des segments lors de la fusion, la production de cartes de segments compactes et simplifiées, et un affinage hiérarchique sans resegmentation complète. Les cas d'utilisation comprennent le nettoyage de résultats OBIA sur-segmentés réduisant la fragmentation et le bruit, la simplification des segments pour une meilleure stabilité de classification, l'élimination des petits segments parasites de la segmentation initiale, la normalisation des propriétés des segments pour une extraction de caractéristiques uniforme en aval, et l'affinage d'assurance qualité des hiérarchies de segmentation multi-échelles. La sortie présente un nombre réduit de segments reflétant la consolidation ; les segments fusionnés héritent des statistiques spectrales des composants absorbés ; les frontières deviennent plus lisses et moins complexes ; les régions fusionnées conservent leur intégrité spatiale mais présentent une hétérogénéité spectrale interne légèrement accrue ; la sortie est optimisée pour la classification en aval et la stabilité des caractéristiques.",
            "params": {
              "segments": {
                "label": "Segments",
                "description": "Raster d'étiquettes de segments en entrée."
              },
              "min_size": {
                "label": "Taille minimale",
                "description": "Taille minimale de segment en cellules (par défaut 5)."
              },
              "method": {
                "label": "Méthode",
                "description": "Méthode de fusion : longest, largest, nearest (par défaut longest)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "segments_split_low_cohesion": {
            "name": "Scinder les segments à faible cohésion",
            "description": "Resegmente les objets existants peu cohésifs avec des paramètres d'échelle plus fins afin d'améliorer l'homogénéité spectrale. Affinage adaptatif des zones problématiques sans affecter les objets bien formés.",
            "params": {
              "segments": {
                "label": "Segments",
                "description": "Raster de segments existant."
              },
              "inputs": {
                "label": "Entrées",
                "description": "Tableau de rasters d'entrée utilisés pour la re-segmentation."
              },
              "split_scale": {
                "label": "Échelle de division",
                "description": "Paramètre d'échelle de division plus fine (par défaut 120)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "segments_to_polygons": {
            "name": "Segments vers polygones",
            "description": "Convertit les étiquettes de segments raster en polygones vectoriels pour l'édition interactive, le contrôle qualité et l'intégration SIG. Permet une transition fluide entre les représentations OBIA raster et vecteur.",
            "params": {
              "segments": {
                "label": "Segments",
                "description": "Raster de segments en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de polygones en sortie."
              }
            }
          },
          "evaluate_training_sites": {
            "name": "Évaluer les sites d'entraînement",
            "description": "Évalue la séparabilité des classes dans des polygones d'entraînement multibandes et écrit un rapport HTML avec des statistiques de distribution par bande.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Tableau de rasters monobandes en entrée (un par bande spectrale), sous forme de chemins ou de chaîne délimitée."
              },
              "training_data": {
                "label": "Données d'entraînement",
                "description": "Chemin des données d'entraînement polygonales."
              },
              "class_field": {
                "label": "Champ de classe",
                "description": "Nom du champ de classe dans les attributs de training_data."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier HTML en sortie."
              }
            }
          },
          "fuzzy_knn_classification": {
            "name": "Classification KNN floue",
            "description": "Effectue une classification floue par k plus proches voisins et produit la confiance d'appartenance aux classes.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Tableau de rasters monobandes en entrée."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "training_data": {
                "label": "Données d'entraînement",
                "description": "Chemin des données d'entraînement vectorielles (points/polygones)."
              },
              "class_field": {
                "label": "Champ de classe",
                "description": "Champ de classe dans les attributs de training_data."
              },
              "scaling": {
                "label": "Mise à l'échelle",
                "description": "Mode de mise à l'échelle des caractéristiques : none (par défaut), normalize, standardize."
              },
              "k": {
                "label": "K",
                "description": "Nombre de voisins (par défaut 5)."
              },
              "m": {
                "label": "M",
                "description": "Paramètre d'exposant flou (> 1 ; par défaut 2.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin optionnel du raster classifié en sortie."
              },
              "probability_output": {
                "label": "Sortie de probabilité",
                "description": "Chemin optionnel du raster de probabilité d'appartenance."
              }
            }
          },
          "generalize_classified_raster": {
            "name": "Généraliser un raster classé",
            "description": "Generalize Classified Raster simplifie les cartes de classification en supprimant les petites taches isolées par filtrage modal itératif, fusionnant les composantes fragmentées d'un ou plusieurs pixels dans les classes voisines spatialement dominantes. Algorithme : applique un filtre modal morphologique préservant la classe dominante dans des fenêtres mobiles, supprime ou regroupe les pixels isolés de leur contexte spatial, affine itérativement la classification par analyse des composantes connexes et absorbe les classes mineures dans les classes dominantes voisines. La taille de fenêtre et la taille minimale de tache configurables contrôlent l'intensité de la généralisation. Caractéristiques clés : réduit la fragmentation de la classification, améliore la cohérence spatiale, élimine les taches isolées dues au bruit, préserve les limites de classes par un filtrage sélectif, traitement des composantes connexes efficace en calcul. Capacités : intensité de généralisation variable, préservation des grandes taches contiguës, application aux données indexées ou catégorielles. Cas d'utilisation : affinage post-classification supprimant l'effet poivre et sel, consolidation de résultats de classification fragmentés, préparation des produits de classification finaux, généralisation à une unité cartographique minimale donnée. Applications : finalisation de cartes d'occupation du sol, élimination des classifications parasites d'un seul pixel, amélioration de la continuité spatiale de la classification. Interprétation des résultats : une fragmentation réduite des classes indique un débruitage efficace ; des limites préservées révèlent des paramètres de généralisation appropriés ; une généralisation excessive indique une fenêtre trop grande ; une amélioration de la cohérence spatiale suggère que le bruit de classification était principalement constitué d'artefacts d'un seul pixel.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster classifié en entrée ou objet raster typé."
              },
              "min_size": {
                "label": "Taille minimale",
                "description": "Taille minimale d'entité en cellules ; les taches plus petites sont réaffectées (par défaut 5)."
              },
              "method": {
                "label": "Méthode",
                "description": "Méthode de généralisation : « longest » (par défaut), « largest » ou « nearest »."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "generalize_with_similarity": {
            "name": "Généraliser par similarité",
            "description": "Généralise les petites taches d'un raster classifié en les fusionnant avec la tache voisine spectralement la plus similaire.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster classifié en entrée."
              },
              "similarity": {
                "label": "Similarité",
                "description": "Tableau de rasters de similarité utilisés pour calculer la similarité des centres d'entités."
              },
              "min_size": {
                "label": "Taille minimale",
                "description": "Taille minimale d'entité en pixels ; les entités plus petites sont fusionnées (par défaut 5)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "k_means_clustering": {
            "name": "Classification par K-moyennes",
            "description": "Le regroupement K-means effectue une classification spectrale non supervisée en partitionnant itérativement les pixels en K clusters spectraux, en minimisant la variance intra-cluster et en découvrant les regroupements spectraux naturels de l'imagerie multispectrale sans échantillons d'entraînement ni définition a priori des classes. L'algorithme initialise K centres de clusters aléatoires, affecte itérativement les pixels aux centres les plus proches et recalcule les centres comme moyennes des clusters jusqu'à convergence, puis produit les affectations et centres finaux. K-means est efficace en calcul, s'adapte aux grandes piles multispectrales et découvre des motifs spectraux guidés par les données, utiles pour l'analyse exploratoire et l'identification des classes naturelles. Les caractéristiques clés comprennent un nombre de clusters K spécifié par l'utilisateur, permettant des compromis flexibles entre détail spectral et interprétabilité, des critères de convergence avec limites d'itérations et seuils de déplacement des centres configurables, un contrôle optionnel de la graine aléatoire garantissant un regroupement reproductible pour les tests et la validation, et une parallélisation efficace pour les grandes images. Les applications couvrent la classification non supervisée de l'occupation du sol découvrant les classes spectrales naturelles, la détection d'anomalies identifiant les pixels spectralement inhabituels, la segmentation d'images en vue d'une classification supervisée ultérieure et l'analyse spectrale exploratoire révélant les motifs spectraux dominants. La sortie de K-means identifie les regroupements spectraux naturels. Elle produit un raster d'appartenance aux clusters avec des entiers de 0 à K-1, un fichier des centres de clusters avec le spectre moyen par cluster et, en option, la variance intra-cluster quantifiant la compacité ; la superposition des classes de clusters sur des composites en couleurs naturelles révèle les motifs spatiaux et la continuité des clusters.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Liste de rasters d'entrée sous forme de tableau de chemins ou de chaîne délimitée par des virgules/points-virgules."
              },
              "classes": {
                "label": "Classes",
                "description": "Nombre de classes cibles (k)."
              },
              "max_iterations": {
                "label": "Itérations maximales",
                "description": "Nombre maximal d'itérations (par défaut 10)."
              },
              "class_change": {
                "label": "Changement de classe",
                "description": "Arrêt lorsque le pourcentage de cellules valides modifiées passe sous ce seuil (par défaut 2.0)."
              },
              "initialize": {
                "label": "Initialisation",
                "description": "Stratégie d'initialisation des centroïdes : « diagonal » (par défaut) ou « random »."
              },
              "min_class_size": {
                "label": "Taille minimale de classe",
                "description": "Taille minimale de classe utilisée lors de la mise à jour des centroïdes (par défaut 10)."
              },
              "out_html": {
                "label": "HTML de sortie",
                "description": "Chemin de sortie optionnel du rapport HTML."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin optionnel du raster de classes en sortie. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "knn_classification": {
            "name": "Classification KNN",
            "description": "La classification par k plus proches voisins affecte les pixels aux classes par vote majoritaire parmi les K échantillons d'entraînement les plus proches dans l'espace spectral, permettant une classification non linéaire flexible sans entraînement explicite de modèle. KNN calcule les distances (euclidienne, angle spectral ou Mahalanobis) de chaque pixel de l'image à tous les échantillons d'entraînement, identifie les K plus proches, applique un vote majoritaire pondéré ou non pour déterminer la classe, et renvoie l'étiquette de classe et éventuellement un score de confiance. KNN excelle avec des données d'entraînement limitées, des frontières de classes fortement non linéaires et des distributions spectrales de classes hétérogènes, là où les modèles paramétriques peinent. Les caractéristiques clés comprennent des métriques de distance au choix (euclidienne, angle spectral, Mahalanobis) adaptées à différentes caractéristiques spectrales et structures de corrélation, des valeurs de K spécifiées par l'utilisateur permettant des compromis précision-complexité, des options de vote pondéré privilégiant les échantillons proches et des seuils de confiance optionnels permettant de rejeter les classifications ambiguës. Les applications comprennent la classification de télédétection de haute précision avec des échantillons d'entraînement collectés sur le terrain, la classification à petits échantillons lorsque la vérité terrain est limitée, la classification de terrains difficiles aux signatures spectrales très variables et la classification tenant compte de la confiance rejetant les décisions limites. La classification KNN permet des résultats de haute précision avec des données d'entraînement flexibles. La sortie comprend un raster d'étiquettes de classe avec des identifiants entiers correspondant aux étiquettes des échantillons d'entraînement, un raster de confiance optionnel enregistrant les pourcentages de vote ou des scores de confiance pondérés par la distance, et une précision de classification pouvant dépasser celle d'autres méthodes avec un choix optimal de K et suffisamment d'échantillons d'entraînement.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Tableau de rasters monobandes en entrée."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "training_data": {
                "label": "Données d'entraînement",
                "description": "Chemin des données d'entraînement vectorielles (points/polygones)."
              },
              "class_field": {
                "label": "Champ de classe",
                "description": "Champ de classe dans les attributs de training_data."
              },
              "scaling": {
                "label": "Mise à l'échelle",
                "description": "Mode de mise à l'échelle des caractéristiques : none (par défaut), normalize, standardize."
              },
              "k": {
                "label": "K",
                "description": "Nombre de voisins (par défaut 5)."
              },
              "clip": {
                "label": "Découper",
                "description": "Si vrai, supprime les échantillons d'entraînement mal classés par une passe préalable « leave-one-out »."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "knn_regression": {
            "name": "Régression KNN",
            "description": "Effectue une régression supervisée par k plus proches voisins sur des rasters multibandes en entrée.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Tableau de rasters monobandes en entrée."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "training_data": {
                "label": "Données d'entraînement",
                "description": "Chemin des données d'entraînement vectorielles ponctuelles."
              },
              "field": {
                "label": "Champ",
                "description": "Champ cible numérique dans les attributs de training_data."
              },
              "scaling": {
                "label": "Mise à l'échelle",
                "description": "Mode de mise à l'échelle des caractéristiques : none (par défaut), normalize, standardize."
              },
              "k": {
                "label": "K",
                "description": "Nombre de voisins (par défaut 5)."
              },
              "distance_weighted": {
                "label": "Pondéré par la distance",
                "description": "Si vrai, utilise une moyenne pondérée par l'inverse de la distance."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "logistic_regression": {
            "name": "Régression logistique",
            "description": "Effectue une classification supervisée par régression logistique sur des rasters multibandes en entrée.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Tableau de rasters monobandes en entrée."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "training_data": {
                "label": "Données d'entraînement",
                "description": "Chemin des données d'entraînement vectorielles (points/polygones)."
              },
              "class_field": {
                "label": "Champ de classe",
                "description": "Champ de classe dans les attributs de training_data."
              },
              "scaling": {
                "label": "Mise à l'échelle",
                "description": "Mode de mise à l'échelle des caractéristiques : none (par défaut), normalize, standardize."
              },
              "alpha": {
                "label": "Alpha",
                "description": "Poids de régularisation L2 (par défaut 0.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "min_dist_classification": {
            "name": "Classification par distance minimale",
            "description": "Effectue une classification supervisée par distance minimale sur des rasters multispectraux à l'aide de données d'entraînement polygonales.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Tableau de rasters monobandes en entrée (un par bande spectrale), sous forme de chemins ou de chaîne délimitée."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "training_data": {
                "label": "Données d'entraînement",
                "description": "Chemin d'un fichier vectoriel de polygones contenant les zones d'entraînement."
              },
              "class_field": {
                "label": "Champ de classe",
                "description": "Nom du champ attributaire des données d'entraînement contenant l'identifiant de classe."
              },
              "dist_threshold": {
                "label": "Seuil de distance",
                "description": "Seuil de score z optionnel ; les pixels plus éloignés que cette valeur de la moyenne de classe la plus proche restent non classés. Par défaut : aucun seuil (tout classer)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel. S'il est omis, le résultat est conservé en mémoire."
              }
            }
          },
          "modified_k_means_clustering": {
            "name": "K-moyennes modifiées",
            "description": "Le K-means modifié améliore le K-means standard avec un prétraitement spectral, une sélection adaptative automatique de K et des critères de convergence renforcés, pour une classification multispectrale non supervisée plus robuste et plus précise. L'algorithme applique un prétraitement optionnel comprenant une standardisation spectrale supprimant les effets d'échelle, une transformation en composantes principales privilégiant les directions de variance dominantes et un filtrage du bruit supprimant les variations spectrales parasites. La sélection adaptative de K utilise la méthode du coude ou l'analyse de silhouette pour découvrir automatiquement le nombre optimal de clusters au lieu d'exiger une spécification manuelle. Les caractéristiques clés comprennent un prétraitement spectral réduisant la sensibilité à l'échelle et privilégiant les directions de variation spectrale dominantes, une sélection automatique de K découvrant objectivement le nombre optimal de clusters, des critères de convergence renforcés incluant des seuils de déplacement relatif des centres et des métriques de similarité d'angle spectral, et un post-traitement optionnel fusionnant les clusters similaires ou scindant les clusters diffus. Les applications comprennent une classification exploratoire améliorée de l'occupation du sol gérant automatiquement les échelles spectrales, une détection d'anomalies robuste séparant le signal du bruit grâce au prétraitement, une segmentation d'images adaptative découvrant automatiquement les niveaux de détail appropriés et l'intégration multicapteur normalisant les échelles spectrales de différents capteurs. La sortie du K-means modifié révèle des classes spectrales naturelles robustes. Elle produit un raster d'appartenance aux clusters optimisé avec un nombre de classes déterminé automatiquement, des centres de clusters avec les transformations de prétraitement documentées et des statistiques de diagnostic quantifiant la qualité, la séparation et la convergence des clusters ; les recommandations de la sélection adaptative de K guident le compromis entre interprétabilité et détail.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Liste de rasters d'entrée sous forme de tableau de chemins ou de chaîne délimitée par des virgules/points-virgules."
              },
              "start_clusters": {
                "label": "Grappes initiales",
                "description": "Nombre initial de grappes avant fusion (par défaut 1000)."
              },
              "merge_dist": {
                "label": "Distance de fusion",
                "description": "Seuil de distance de fusion des grappes (euclidienne)."
              },
              "max_iterations": {
                "label": "Itérations maximales",
                "description": "Nombre maximal d'itérations (par défaut 10)."
              },
              "class_change": {
                "label": "Changement de classe",
                "description": "Arrêt lorsque le pourcentage de cellules valides modifiées passe sous ce seuil (par défaut 2.0)."
              },
              "out_html": {
                "label": "HTML de sortie",
                "description": "Chemin de sortie optionnel du rapport HTML."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin optionnel du raster de classes en sortie. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "nnd_classification": {
            "name": "Classification NND",
            "description": "Effectue une classification par distance normalisée au plus proche, avec rejet optionnel des valeurs aberrantes.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Tableau de rasters monobandes en entrée."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "training_data": {
                "label": "Données d'entraînement",
                "description": "Chemin des données d'entraînement vectorielles (points/polygones)."
              },
              "class_field": {
                "label": "Champ de classe",
                "description": "Champ de classe dans les attributs de training_data."
              },
              "scaling": {
                "label": "Mise à l'échelle",
                "description": "Mode de mise à l'échelle des caractéristiques : none (par défaut), normalize, standardize."
              },
              "z_threshold": {
                "label": "Seuil Z",
                "description": "Score z de distance normalisée maximal accepté avant signalement comme valeur aberrante (par défaut 1.96)."
              },
              "outlier_is_zero": {
                "label": "Valeur aberrante à zéro",
                "description": "Si vrai, les valeurs aberrantes reçoivent la valeur de classe 0 ; sinon NoData."
              },
              "k": {
                "label": "K",
                "description": "Taille de voisinage pour l'estimation de la distance de classe (par défaut 25)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "otsu_thresholding": {
            "name": "Seuillage d'Otsu",
            "description": "Le seuillage d'Otsu est une méthode de segmentation d'image automatique qui détermine la valeur de seuil globale optimale en maximisant la variance interclasse de l'histogramme des intensités de pixels. Algorithme : examine l'histogramme d'une image en niveaux de gris ou à bande unique, teste itérativement toutes les valeurs de seuil possibles, calcule la variance interclasse pour chacune et sélectionne la valeur maximisant la séparation de variance entre les classes d'avant-plan et d'arrière-plan. Non paramétrique, ne nécessite aucune spécification manuelle du seuil. Caractéristiques clés : détermination entièrement automatique du seuil, robuste aux variations d'éclairage, approche fondée sur l'histogramme permettant un calcul rapide, aucun paramètre externe, fournit un seuil global unique. Capacités : segmentation binaire, optimisation d'histogrammes unimodaux et bimodaux, gestion des images à faible dynamique ou à fort contraste. Cas d'utilisation : segmentation d'image automatique sans intervention de l'utilisateur, binarisation de documents, extraction des plans d'eau, détection des nuages dans l'imagerie satellitaire, cartographie de la glace et de la neige. Applications : prétraitement pour la détection de changements, classification simple de l'occupation du sol, génération de masques d'eau, segmentation préliminaire avant une classification avancée. Interprétation des résultats : les pixels sous le seuil sont classés dans une classe, ceux au-dessus dans une autre ; la bimodalité de l'histogramme indique la qualité de la séparation ; des histogrammes mal séparés indiquent une inadéquation à la classification binaire ; des mesures statistiques comme la variance interclasse et l'uniformité indiquent la qualité de la segmentation.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "parallelepiped_classification": {
            "name": "Classification par parallélépipèdes",
            "description": "Effectue une classification supervisée par parallélépipèdes sur des rasters multispectraux à l'aide de données d'entraînement polygonales.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Tableau de rasters monobandes en entrée (un par bande spectrale), sous forme de chemins ou de chaîne délimitée."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "training_data": {
                "label": "Données d'entraînement",
                "description": "Chemin d'un fichier vectoriel de polygones contenant les zones d'entraînement."
              },
              "class_field": {
                "label": "Champ de classe",
                "description": "Nom du champ attributaire des données d'entraînement contenant l'identifiant de classe."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel. S'il est omis, le résultat est conservé en mémoire."
              }
            }
          },
          "random_forest_classification": {
            "name": "Classification par forêt aléatoire",
            "description": "La classification Random Forest attribue des étiquettes au moyen d'un ensemble d'arbres de décision entraînés sur des échantillons bootstrap avec des sous-ensembles aléatoires de caractéristiques. Chaque arbre croît indépendamment sans élagage, capturant les relations non linéaires complexes et les interactions entre caractéristiques. La classification agrège les votes de généralement 100 à 1000 arbres ; la classe finale est celle du vote majoritaire. L'entraînement bootstrap et la sélection aléatoire des caractéristiques réduisent le surapprentissage tout en capturant les motifs de grande dimension. L'importance des caractéristiques peut être calculée à partir des variations de l'erreur hors sac (out-of-bag), identifiant les bandes spectrales ou caractéristiques dérivées les plus pertinentes pour la classification. Les caractéristiques clés comprennent le classement de l'importance des variables identifiant les caractéristiques de classification clés, une confiance de classification par pixel issue du consensus des votes des arbres de l'ensemble, la gestion automatique des données hyperspectrales de grande dimension, la robustesse aux valeurs spectrales aberrantes et au bruit, et un entraînement et une prédiction parallélisables. L'outil traite efficacement les problèmes multiclasses avec des jeux d'entraînement déséquilibrés. Les applications comprennent la classification de l'occupation du sol à partir de données multispectrales et hyperspectrales, la détection de changements identifiant les transitions spectrales entre cartes, la classification des types de cultures à partir d'imagerie satellitaire multitemporelle, la classification des matériaux urbains distinguant les types de bâtiments et de surfaces, et la détection d'anomalies identifiant les valeurs spectrales aberrantes. Les forêts aléatoires atteignent systématiquement une précision élevée en télédétection avec des données d'entraînement relativement modestes. Interprétation des résultats : les nombres de votes fournissent la confiance de classification ; des votes unanimes ou à forte majorité (>80%) indiquent des classifications sûres, tandis que des marges étroites suggèrent une ambiguïté de pixels mixtes. Les classements d'importance des caractéristiques identifient les bandes spectrales ou indices dérivés les plus diagnostiques pour la classification. L'erreur hors sac estime la performance de généralisation sans validation sur un jeu réservé. Les interactions entre caractéristiques sont implicites ; une précision élevée obtenue avec certaines combinaisons de bandes suggère des relations spectrales non linéaires.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Tableau de rasters monobandes en entrée."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "training_data": {
                "label": "Données d'entraînement",
                "description": "Chemin des données d'entraînement vectorielles (points/polygones)."
              },
              "class_field": {
                "label": "Champ de classe",
                "description": "Champ de classe dans les attributs de training_data."
              },
              "scaling": {
                "label": "Mise à l'échelle",
                "description": "Mode de mise à l'échelle des caractéristiques : none (par défaut), normalize, standardize."
              },
              "n_trees": {
                "label": "Nombre d'arbres",
                "description": "Nombre d'arbres dans la forêt (par défaut 200)."
              },
              "min_samples_leaf": {
                "label": "Échantillons minimaux par feuille",
                "description": "Nombre minimal d'échantillons requis à un nœud feuille (par défaut 1)."
              },
              "min_samples_split": {
                "label": "Échantillons minimaux par division",
                "description": "Nombre minimal d'échantillons requis pour diviser un nœud interne (par défaut 2)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "random_forest_regression": {
            "name": "Régression par forêt aléatoire",
            "description": "Effectue une régression supervisée par forêt aléatoire sur des rasters multibandes en entrée.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Tableau de rasters monobandes en entrée."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "training_data": {
                "label": "Données d'entraînement",
                "description": "Chemin des données d'entraînement vectorielles ponctuelles."
              },
              "field": {
                "label": "Champ",
                "description": "Champ cible numérique dans les attributs de training_data."
              },
              "scaling": {
                "label": "Mise à l'échelle",
                "description": "Mode de mise à l'échelle des caractéristiques : none (par défaut), normalize, standardize."
              },
              "n_trees": {
                "label": "Nombre d'arbres",
                "description": "Nombre d'arbres dans la forêt (par défaut 200)."
              },
              "min_samples_leaf": {
                "label": "Échantillons minimaux par feuille",
                "description": "Nombre minimal d'échantillons requis à un nœud feuille (par défaut 1)."
              },
              "min_samples_split": {
                "label": "Échantillons minimaux par division",
                "description": "Nombre minimal d'échantillons requis pour diviser un nœud interne (par défaut 2)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "svm_classification": {
            "name": "Classification SVM",
            "description": "La classification par machine à vecteurs de support (SVM) applique des algorithmes d'apprentissage automatique SVM aux données de télédétection multispectrales, séparant les classes d'entraînement par le placement optimal d'un hyperplan dans un espace de caractéristiques spectrales de grande dimension. Algorithme : transforme les vecteurs de caractéristiques spectrales dans un espace de grande dimension via des fonctions noyau (linéaire, RBF, polynomiale), identifie l'hyperplan à marge maximale séparant les classes d'entraînement et classe les nouveaux pixels selon leur position par rapport à l'hyperplan ; les paramètres de tolérance et le choix du noyau contrôlent la généralisation. Gère efficacement la séparation non linéaire des classes. Caractéristiques clés : robuste aux données spectrales de grande dimension, excellente généralisation avec peu d'échantillons d'entraînement, la flexibilité du noyau s'adapte à des distributions spectrales variées, fournit des estimations de probabilité/confiance. Capacités : classification multiclasse, tolérance à marge souple, équilibrage automatique des poids de classes. Cas d'utilisation : classification détaillée des terres avec des données d'entraînement éparses, intégration de caractéristiques spectrales-spatiales, détection de changements, agriculture de précision, cartographie urbaine. Applications : classification d'images hyperspectrales, cartographie d'écosystèmes complexes, délimitation des types de cultures, classification des infrastructures. Interprétation des résultats : l'appartenance à une classe indique la catégorie prédite, la cohérence spatiale révélant la qualité de la classification ; les estimations de probabilité quantifient la confiance au niveau du pixel ; les schémas de mauvaise classification indiquent des lacunes dans les données d'entraînement ou des problèmes de recouvrement spectral.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Tableau de rasters monobandes en entrée."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "training_data": {
                "label": "Données d'entraînement",
                "description": "Chemin des données d'entraînement vectorielles (points/polygones)."
              },
              "class_field": {
                "label": "Champ de classe",
                "description": "Champ de classe dans les attributs de training_data."
              },
              "scaling": {
                "label": "Mise à l'échelle",
                "description": "Mode de mise à l'échelle des caractéristiques : none (par défaut), normalize, standardize."
              },
              "kernel": {
                "label": "Noyau",
                "description": "Type de noyau : linear (par défaut) ou rbf."
              },
              "c": {
                "label": "C",
                "description": "Paramètre de régularisation SVM (par défaut 1.0)."
              },
              "gamma": {
                "label": "Gamma",
                "description": "Gamma du noyau RBF ; par défaut 1 / nombre de caractéristiques."
              },
              "epoch": {
                "label": "Époque",
                "description": "Nombre d'époques d'entraînement (par défaut 2)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "svm_regression": {
            "name": "Régression SVM",
            "description": "Effectue une régression supervisée par machine à vecteurs de support sur des rasters multibandes en entrée.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Tableau de rasters monobandes en entrée."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "training_data": {
                "label": "Données d'entraînement",
                "description": "Chemin des données d'entraînement vectorielles ponctuelles."
              },
              "field": {
                "label": "Champ",
                "description": "Champ cible numérique dans les attributs de training_data."
              },
              "scaling": {
                "label": "Mise à l'échelle",
                "description": "Mode de mise à l'échelle des caractéristiques : none (par défaut), normalize, standardize."
              },
              "kernel": {
                "label": "Noyau",
                "description": "Type de noyau : linear (par défaut) ou rbf."
              },
              "c": {
                "label": "C",
                "description": "Paramètre de régularisation SVM (par défaut 1.0)."
              },
              "gamma": {
                "label": "Gamma",
                "description": "Gamma du noyau RBF ; par défaut 1 / nombre de caractéristiques."
              },
              "eps": {
                "label": "Eps",
                "description": "Largeur de la perte insensible à epsilon (par défaut 0.1)."
              },
              "tol": {
                "label": "Tolérance",
                "description": "Tolérance de l'optimiseur (par défaut 1e-3)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "change_vector_analysis": {
            "name": "Analyse du vecteur de changement",
            "description": "Effectue une analyse des vecteurs de changement sur des jeux de données multispectraux à deux dates et renvoie des rasters de magnitude et de direction.",
            "params": {
              "date1": {
                "label": "Date 1",
                "description": "Liste de rasters de la date antérieure sous forme de tableau de chemins ou de chaîne délimitée par des virgules/points-virgules."
              },
              "date2": {
                "label": "Date 2",
                "description": "Liste de rasters de la date postérieure sous forme de tableau de chemins ou de chaîne délimitée par des virgules/points-virgules."
              },
              "magnitude_output": {
                "label": "Sortie de magnitude",
                "description": "Chemin de sortie optionnel du raster de magnitude vectorielle."
              },
              "direction_output": {
                "label": "Sortie de direction",
                "description": "Chemin de sortie optionnel du raster de codes de direction."
              }
            }
          },
          "image_difference_change_detection": {
            "name": "Détection de changement par différence d'images",
            "description": "La détection de changements par différence d'images identifie les changements d'occupation du sol en calculant des différences multispectrales pixel par pixel entre des acquisitions satellitaires multitemporelles co-enregistrées, mettant en évidence les zones où les signatures spectrales ont suffisamment changé pour dépasser la variation statistique de fond. L'algorithme co-enregistre les images sur des grilles de pixels communes, calcule les différences dans des bandes ou indices de végétation sélectionnés (par ex. différence de NDVI), applique un seuillage statistique fondé sur la différence absolue moyenne et des intervalles de confiance pour distinguer le changement du bruit, et produit des masques de changement binaires ou des rasters continus de magnitude des différences. La différence d'images est simple en calcul, interprétable et efficace pour détecter les changements majeurs de la végétation, du développement urbain ou des plans d'eau. Les caractéristiques clés comprennent une sélection flexible des bandes permettant une détection ciblée dans des domaines spectraux spécifiques, un seuillage statistique avec des niveaux de confiance automatiques ou manuels, un prétraitement optionnel (normalisation, calcul d'indices) améliorant le rapport signal/bruit du changement, et un traitement rapide permettant la détection de changements à grande échelle. Les applications comprennent la cartographie de la déforestation et le suivi des pertes forestières, le suivi de l'expansion urbaine à partir de séries temporelles satellitaires multispectrales, la cartographie des inondations avant/après événement à partir de données SAR ou optiques, et la détection des changements agricoles suivant les transitions de cultures. La sortie de différence d'images met en évidence les zones de changement. Elle comprend un raster de masque de changement (changement/absence de changement) avec des seuils configurables, un raster continu de magnitude des différences quantifiant l'intensité du changement et un raster optionnel de classes de changement distinguant le type de changement (augmentation, diminution) ; l'agrégation temporelle permet de suivre les changements sur plusieurs années.",
            "params": {
              "t1_inputs": {
                "label": "Entrées T1",
                "description": "Tableau de chemins de rasters de la date 1."
              },
              "t2_inputs": {
                "label": "Entrées T2",
                "description": "Tableau de chemins de rasters de la date 2 ; doit correspondre à la longueur et à l'ordre de t1_inputs."
              },
              "mode": {
                "label": "Mode",
                "description": "Mode de différence : magnitude (par défaut) ou signed."
              },
              "threshold_sigma": {
                "label": "Seuil sigma",
                "description": "Seuil sigma optionnel pour la génération d'un masque de changement binaire."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette les rasters de la pile pour correspondre à t1_inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du raster de l'image de différence."
              },
              "output_absolute": {
                "label": "Sortie absolue",
                "description": "Chemin de sortie optionnel du raster de différence signée absolue (|mean(t2-t1)|)."
              },
              "output_signed": {
                "label": "Sortie signée",
                "description": "Chemin de sortie optionnel du raster de différence signée mean(t2-t1)."
              },
              "output_mask": {
                "label": "Masque de sortie",
                "description": "Chemin de sortie optionnel du raster de masque de changement binaire seuillé."
              }
            }
          },
          "pca_based_change_detection": {
            "name": "Détection de changement par ACP",
            "description": "La détection de changements par analyse en composantes principales identifie les changements d'occupation du sol en calculant les composantes principales de données spectrales multitemporelles empilées, les premières composantes capturant les motifs communs dans le temps et les dernières isolant les changements temporels. L'algorithme empile les données multispectrales multitemporelles (co-enregistrées sur une grille commune), calcule une ACP les transformant en composantes spectro-temporelles orthogonales non corrélées, interprète les dernières CP comme sensibles aux changements et applique un seuillage statistique aux charges/scores des CP pour détecter les changements. La détection par ACP excelle lorsque les signaux de changement sont spectralement subtils, car l'ACP maximise la variance et sépare les motifs spectraux temporellement cohérents (premières CP) de la variation temporelle (dernières CP). Les caractéristiques clés comprennent la fusion de données multidates gérant un nombre variable d'images et les exigences de co-enregistrement, une maximisation automatique de la variance privilégiant les motifs spectro-temporels importants, des statistiques multivariées améliorant la discrimination des changements par rapport à la différence univariée, et un filtrage spatial optionnel réduisant le bruit des pixels. Les applications comprennent la détection du stress subtil de la végétation avant sa reconnaissance visuelle, la détection multispectrale des changements urbains suivant le développement sur plusieurs décennies, l'évaluation de l'impact des catastrophes naturelles par une cartographie rapide des dommages et le suivi environnemental détectant les transitions d'état des écosystèmes. La sortie de la détection par ACP distingue les motifs temporels. Elle comprend une imagerie en composantes principales avec des charges spectro-temporelles interprétables, un raster de probabilité de changement dérivé des scores des dernières composantes et une classification optionnelle des changements distinguant leurs types ; les motifs spatiaux des CP permettent une reconnaissance visuelle complétant la détection statistique.",
            "params": {
              "t1_inputs": {
                "label": "Entrées T1",
                "description": "Tableau de chemins de rasters de la date 1."
              },
              "t2_inputs": {
                "label": "Entrées T2",
                "description": "Tableau de chemins de rasters de la date 2 ; doit correspondre à la longueur et à l'ordre de t1_inputs."
              },
              "component": {
                "label": "Composante",
                "description": "Indice (à partir de 1) de la composante principale à produire (par défaut 1)."
              },
              "standardized": {
                "label": "Standardisé",
                "description": "Si vrai, utilise une ACP sur matrice de corrélation des vecteurs de changement (par défaut false)."
              },
              "threshold_sigma": {
                "label": "Seuil sigma",
                "description": "Seuil sigma optionnel sur le score absolu de la CP pour la sortie du masque binaire."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette les rasters de la pile pour correspondre à t1_inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du raster de score absolu de la CP sélectionnée."
              },
              "output_mask": {
                "label": "Masque de sortie",
                "description": "Chemin de sortie optionnel du raster de masque binaire seuillé (0/1)."
              },
              "output_report": {
                "label": "Rapport de sortie",
                "description": "Chemin de sortie optionnel du rapport JSON des valeurs propres, de la variance expliquée et des saturations des composantes."
              }
            }
          },
          "post_classification_change": {
            "name": "Changement post-classification",
            "description": "La détection de changements post-classification quantifie les transitions d'occupation et d'utilisation du sol (LULC) en comparant directement des cartes classifiées indépendamment à différentes périodes. Les comparaisons de classes pixel par pixel identifient les transitions indiquant les classes « de » et « vers ». Les matrices de tabulation croisée (matrices de confusion) quantifient les fréquences de transition, révélant les trajectoires de changement dominantes. La méthode exige des schémas de classification cohérents entre les dates ; la précision dépend de la qualité de la classification à chaque date. Caractéristiques clés : cartographie directe des transitions de classe à classe ; indépendance des classifications individuelles ; combinaisons de capteurs hétérogènes possibles ; quantification des fréquences de transition ; identification des points chauds de changement. Cas d'utilisation : suivi de la déforestation ; cartographie de la croissance urbaine ; suivi de l'utilisation des terres agricoles ; détection de la perte de zones humides ; évaluation de la fragmentation des habitats. Interprétation des résultats : les matrices de transition présentent les valeurs d'absence de changement sur la diagonale et les fréquences de transition hors diagonale. Les cartes de changement mettent en évidence les pixels modifiés ; la sortie codée par transition encode à la fois les classes source et cible, ce qui facilite l'interprétation. Une précision élevée exige des classifications de qualité ; les erreurs de classification à l'une ou l'autre date se propagent en erreurs de détection de changements. L'agrégation des transitions révèle les motifs dominants (par ex. forêt→agriculture, prairie→urbain). Les transitions sous-pixel ne peuvent pas être détectées par la méthode post-classification ; les changements à échelle fine peuvent être manqués.",
            "params": {
              "t1_classified": {
                "label": "Classification T1",
                "description": "Chemin du raster classifié de la date 1."
              },
              "t2_classified": {
                "label": "Classification T2",
                "description": "Chemin du raster classifié de la date 2."
              },
              "transition_scale": {
                "label": "Échelle de transition",
                "description": "Facteur d'échelle de codage des transitions (par défaut 1000) : code = classe1 * échelle + classe2."
              },
              "t1_class_remap": {
                "label": "Recodage des classes T1",
                "description": "Table de recodage optionnelle des classes de la date 1 sous forme d'objet {\"ancien\": nouveau, ...}."
              },
              "t2_class_remap": {
                "label": "Recodage des classes T2",
                "description": "Table de recodage optionnelle des classes de la date 2 sous forme d'objet {\"ancien\": nouveau, ...}."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette t2_classified dans le SCR de t1_classified si nécessaire."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin optionnel du raster codé en transitions en sortie."
              }
            }
          },
          "write_function_memory_insertion": {
            "name": "Insertion en mémoire de fonction d'écriture",
            "description": "Crée un composite RVB compacté de visualisation des changements à partir de deux ou trois dates à bande unique.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Raster monobande de la première date."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Raster monobande de la seconde date."
              },
              "input3": {
                "label": "Entrée 3",
                "description": "Raster monobande optionnel de la troisième date ; s'il est omis, input2 est utilisé pour le canal bleu."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "brdf_normalization": {
            "name": "Normalisation BRDF",
            "description": "Normalisation BRDF d'une scène unique par correction C ou approche de Minnaert, à l'aide de la géométrie pente/exposition du MNT.",
            "params": {
              "input_raster": {
                "label": "Raster d'entrée",
                "description": "Raster de réflectance en entrée à normaliser (monobande ou pile multibande)."
              },
              "input_dem": {
                "label": "MNT d'entrée",
                "description": "Raster MNT co-enregistré avec l'entrée (même grille, ou sera rééchantillonné pour correspondre)."
              },
              "solar_zenith_deg": {
                "label": "Zénith solaire (deg)",
                "description": "Angle zénithal solaire en degrés au moment de l'acquisition."
              },
              "solar_azimuth_deg": {
                "label": "Azimut solaire (deg)",
                "description": "Azimut solaire en degrés (horaire depuis le nord) au moment de l'acquisition."
              },
              "method": {
                "label": "Méthode",
                "description": "Méthode de correction : c_correction (par défaut) ou minnaert."
              },
              "minnaert_k": {
                "label": "K de Minnaert",
                "description": "Coefficient k de Minnaert dans [0,1] (par défaut 0.5). Utilisé uniquement lorsque method=minnaert."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Exagération verticale pour le calcul de la pente/exposition du MNT (par défaut 1.0)."
              },
              "output_prefix": {
                "label": "Préfixe de sortie",
                "description": "Préfixe des fichiers de sortie (par défaut brdf_normalized)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie du raster normalisé (remplace output_prefix en mode sortie unique)."
              }
            }
          },
          "correct_vignetting": {
            "name": "Corriger le vignettage",
            "description": "La correction du vignettage de l'objectif supprime les artefacts radiométriques causés par les propriétés optiques hors axe de l'objectif, où les bords de l'image reçoivent moins de lumière que son centre, créant des gradients de luminosité artificiels indépendants des variations de réflectance de la surface. La correction du vignettage applique des facteurs multiplicatifs variant spatialement, calculés à partir de modèles de profil de vignettage (formulations gaussienne ou en loi du cosinus à la puissance quatre) étalonnés selon les caractéristiques du capteur, rétablissant une réponse radiométrique uniforme sur tout le champ de vue de l'image. Cette étape de prétraitement est essentielle en télédétection multispectrale et hyperspectrale, où le vignettage altérerait l'analyse spectrale et introduirait des erreurs systématiques dans les flux de classification et de détection de changements. Les caractéristiques clés comprennent l'estimation automatique du profil de vignettage à partir des statistiques de l'image ou de paramètres d'étalonnage fournis par l'utilisateur, des facteurs de correction variant spatialement appliqués pixel par pixel sans artefacts d'interpolation, un masquage optionnel des pixels périphériques surcorrigés évitant l'amplification des bords bruités, et une correction propre à chaque bande gérant un vignettage variable selon les bandes spectrales. Les applications comprennent le prétraitement pour les algorithmes de classification spectrale sensibles à la cohérence radiométrique, la préparation de mosaïques où les limites de vignettage provoquent des discontinuités visibles, la comparaison radiométrique précise sur l'ensemble du cadre de l'image et l'analyse hyperspectrale exigeant une réponse d'éclairage uniforme. L'imagerie corrigée du vignettage présente une luminosité uniforme sur tout le champ de vue. La sortie ne présente plus d'assombrissement des bords et offre une réponse radiométrique uniforme du centre aux bords de l'image ; les pixels périphériques peuvent présenter un bruit accru s'ils sont fortement corrigés ; l'imagerie corrigée s'intègre sans artefacts radiométriques dans les flux d'analyse multispectrale.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Image raster en entrée."
              },
              "pp": {
                "label": "Pp",
                "description": "Chemin du vecteur de points (ou objet vecteur typé) contenant le point principal."
              },
              "focal_length": {
                "label": "Distance focale",
                "description": "Distance focale de la caméra en mm (par défaut 304.8)."
              },
              "image_width": {
                "label": "Largeur de l'image",
                "description": "Distance entre les bords gauche et droit de l'image en mm (par défaut 228.6)."
              },
              "n": {
                "label": "N",
                "description": "Exposant n du modèle en cosinus (par défaut 4.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "dark_object_subtraction": {
            "name": "Soustraction de l'objet sombre",
            "description": "La soustraction de l'objet sombre (DOS) est une heuristique simple mais efficace de suppression de la brume atmosphérique, qui ne nécessite ni données météorologiques auxiliaires ni modèles complexes de transfert radiatif. La technique exploite le principe selon lequel une réflectance nulle devrait produire un signal de réflectance nul (en négligeant la diffusion de Rayleigh) ; tout signal observé sur des surfaces optiquement noires (eau profonde, ombre de forêt dense, asphalte urbain) est attribué à la luminance de trajet atmosphérique due à la diffusion par les aérosols. Cet outil identifie le compte numérique minimal de chaque bande sur l'image, l'interprète comme la brume atmosphérique et le soustrait de tous les pixels comme un décalage constant par bande ; des variantes plus élaborées (DOS2, DOS3, DOS4) tiennent compte de la diffusion de Rayleigh et d'une épaisseur optique des aérosols variable à l'aide d'indices de végétation ou d'un regroupement des pixels sombres. Les capacités clés comprennent l'analyse d'histogramme pour isoler les objets sombres et distinguer la brume dépendante de la scène d'une véritable réflectance nulle, le masquage optionnel des entités connues à forte réflectance (zones urbaines, neige, nuages) qui biaiseraient l'identification des objets sombres, une correction de la brume par bande et un calcul rapide adapté au traitement en temps réel ou à grande échelle. Les cas d'utilisation comprennent les estimations rapides de réflectance, le suivi de la végétation et de la qualité de l'eau lorsque l'étalonnage absolu importe moins que les changements relatifs, la cartographie rapide en réponse aux catastrophes et les données d'archives anciennes pour lesquelles aucune information précise sur les aérosols n'est disponible. L'entrée comprend la réflectance au sommet de l'atmosphère ou la luminance étalonnée, des masques d'occupation du sol optionnels pour exclure les entités brillantes, et les métadonnées de la scène. La sortie comprend la réflectance corrigée de la brume, des estimations de la luminance de trajet atmosphérique par bande et des indicateurs de qualité exprimant la confiance dans l'identification des objets sombres (par ex. peu de pixels sombres, scène à dominante urbaine). Bien que sommaire par rapport aux modèles de transfert radiatif, la DOS reste pratique pour l'analyse multitemporelle et la cartographie à couverture mondiale lorsque des données atmosphériques élaborées ne sont pas disponibles.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Pile de rasters en entrée (un ou plusieurs rasters)."
              },
              "percentile": {
                "label": "Percentile",
                "description": "Percentile d'objet sombre par bande (par défaut 1.0)."
              },
              "clamp_non_negative": {
                "label": "Limiter aux valeurs non négatives",
                "description": "Si vrai, limite à zéro les valeurs corrigées inférieures à zéro (par défaut true)."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette les entrées pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              },
              "output_diagnostic_offsets": {
                "label": "Décalages de diagnostic en sortie",
                "description": "Chemin de sortie optionnel du raster de diagnostics des décalages d'objet sombre par bande."
              }
            }
          },
          "dn_to_toa_reflectance": {
            "name": "CN vers réflectance TOA",
            "description": "La conversion des comptes numériques en réflectance au sommet de l'atmosphère transforme les comptes numériques bruts du capteur en valeurs de réflectance spectrale physiquement significatives, en appliquant des coefficients d'étalonnage radiométrique par bande issus des métadonnées satellitaires. La conversion applique une remise à l'échelle radiométrique, une correction de l'éclairement spectral solaire exoatmosphérique, une compensation de l'angle zénithal solaire et une normalisation optionnelle de la distance Terre-Soleil pour produire des valeurs de réflectance directement comparables entre capteurs, dates d'acquisition et lieux géographiques. La réflectance au sommet de l'atmosphère représente la proportion de l'énergie solaire incidente réfléchie par les cibles de la surface terrestre au niveau du capteur, avant les effets atmosphériques, et sert de référence à l'analyse quantitative de télédétection. Les caractéristiques clés comprennent l'application des coefficients d'étalonnage par bande avec une analyse complète des métadonnées des produits satellitaires standard, le calcul automatique de la géométrie solaire à partir de l'horodatage et de la position d'acquisition, une correction optionnelle de la distance Terre-Soleil pour la variabilité saisonnière et une gestion flexible de plusieurs types de capteurs avec des formats de coefficients standardisés. Les applications couvrent la détection quantitative de changements dans des unités physiques cohérentes, la comparaison radiométrique absolue entre acquisitions multitemporelles et capteurs différents, le calcul d'indices spectraux de végétation exigeant une réflectance précise et la validation intercapteurs dans les constellations de satellites. La réflectance TOA permet des flux d'analyse rigoureux et des résultats scientifiquement défendables. Les valeurs de réflectance en sortie vont de 0 à 1 (parfois exprimées de 0 à 10000 pour une précision entière) et représentent des proportions sans dimension ; les métadonnées intègrent les coefficients d'étalonnage utilisés et les paramètres de géométrie du capteur ; des valeurs négatives indiquent des problèmes de qualité des données nécessitant un masquage avant l'analyse.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Pile de rasters de DN en entrée (un ou plusieurs rasters)."
              },
              "reflectance_mult": {
                "label": "Multiplicateur de réflectance",
                "description": "Coefficient(s) multiplicatif(s) par bande, scalaire ou tableau dimensionné selon inputs."
              },
              "reflectance_add": {
                "label": "Constante additive de réflectance",
                "description": "Coefficient(s) additif(s) par bande, scalaire ou tableau dimensionné selon inputs (par défaut 0)."
              },
              "sensor_bundle_root": {
                "label": "Racine du lot capteur",
                "description": "Racine optionnelle d'un lot Landsat/Sentinel-2 utilisée pour dériver automatiquement les coefficients lorsque les coefficients explicites sont omis."
              },
              "sun_elevation_deg": {
                "label": "Élévation solaire (deg)",
                "description": "Angle d'élévation solaire optionnel en degrés pour la correction en cosinus. Dérivé automatiquement des métadonnées du lot lorsqu'elles sont disponibles."
              },
              "apply_solar_correction": {
                "label": "Appliquer la correction solaire",
                "description": "Si vrai (par défaut), divise par sin(sun_elevation)."
              },
              "clamp_unit_interval": {
                "label": "Limiter à l'intervalle unitaire",
                "description": "Si vrai (par défaut), limite les sorties à [0, 1]."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette les entrées pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "terrain_corrected_optical_analytics": {
            "name": "Analyses optiques corrigées du relief",
            "description": "Correction topographique C des bandes optiques multispectrales à l'aide d'un MNT co-enregistré. Produit une pile de réflectance de surface, un facteur de correction, un masque nuages/ombres et un indice de confiance de qualité.",
            "params": {
              "input_dem": {
                "label": "MNT d'entrée",
                "description": "Raster MNT co-enregistré avec les bandes optiques."
              },
              "bundle_root": {
                "label": "Racine du lot",
                "description": "Répertoire racine optionnel d'un lot de capteur optique (actuellement Sentinel-2 SAFE, Landsat ou DIMAP SPOT/Pléiades) utilisé pour résoudre automatiquement les bandes requises, le QA lorsqu'il est disponible et les métadonnées solaires lorsque les entrées explicites sont omises."
              },
              "input_red": {
                "label": "Rouge d'entrée",
                "description": "Raster de la bande rouge (optionnel lorsque bundle_root est fourni)."
              },
              "input_nir": {
                "label": "PIR d'entrée",
                "description": "Raster de la bande PIR (optionnel lorsque bundle_root est fourni)."
              },
              "input_green": {
                "label": "Vert d'entrée",
                "description": "Raster de la bande verte (optionnel)."
              },
              "input_blue": {
                "label": "Bleu d'entrée",
                "description": "Raster de la bande bleue (optionnel). Résolu automatiquement à partir des métadonnées du lot lorsque bundle_root est fourni."
              },
              "solar_mode": {
                "label": "Mode solaire",
                "description": "Mode de résolution des angles solaires : auto, manual, metadata, datetime_location."
              },
              "solar_zenith_deg": {
                "label": "Zénith solaire (deg)",
                "description": "Angle zénithal solaire en degrés (requis en mode manual)."
              },
              "solar_azimuth_deg": {
                "label": "Azimut solaire (deg)",
                "description": "Azimut solaire en degrés (horaire depuis le nord, requis en mode manual)."
              },
              "acquisition_datetime_utc": {
                "label": "Date et heure d'acquisition (UTC)",
                "description": "Horodatage d'acquisition en RFC3339 UTC pour le mode datetime_location."
              },
              "latitude": {
                "label": "Latitude",
                "description": "Latitude optionnelle pour le mode datetime_location."
              },
              "longitude": {
                "label": "Longitude",
                "description": "Longitude optionnelle pour le mode datetime_location."
              },
              "profile": {
                "label": "Profil",
                "description": "Profil de traitement : conservative, balanced, fast."
              },
              "cloud_threshold": {
                "label": "Seuil de nuages",
                "description": "Seuil de nuages optionnel dans les unités de la bande source. Inféré automatiquement s'il est omis."
              },
              "shadow_threshold": {
                "label": "Seuil d'ombres",
                "description": "Seuil d'ombres de nuages optionnel dans les unités de la bande source. Inféré automatiquement s'il est omis."
              },
              "qa_mask": {
                "label": "Masque QA",
                "description": "Chemin optionnel du raster de masque QA."
              },
              "qa_mask_format": {
                "label": "Format du masque QA",
                "description": "Encodage du masque QA : auto, landsat_qa_pixel, sentinel2_scl, sentinel2_qa60, binary."
              },
              "mask_strategy": {
                "label": "Stratégie de masquage",
                "description": "Stratégie de masquage : auto, qa_only, heuristic_only, qa_plus_heuristic."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Exagération verticale pour la pente/exposition."
              },
              "output_prefix": {
                "label": "Préfixe de sortie",
                "description": "Préfixe de tous les artefacts de sortie."
              }
            }
          },
          "land_surface_temperature_single_channel": {
            "name": "Température de surface par canal unique",
            "description": "L'estimation de la température de surface terrestre à partir d'un seul canal infrarouge thermique évalue la température radiative de peau par inversion de l'équation de transfert radiatif. Les comptes numériques du capteur sont convertis en luminance spectrale à l'aide de coefficients d'étalonnage propres au capteur ; la luminance est inversée en température de brillance via la fonction de Planck à l'aide de constantes thermiques propres à la bande ; la température de brillance est convertie en LST physique via des corrections empiriques d'émissivité. L'émissivité est dérivée d'indices de végétation ou fournie directement, corrigeant les variations d'émissivité thermique dépendantes du matériau. Caractéristiques clés : une seule bande thermique requise ; traitement radiométrique simple ; calcul rapide ; aucune exigence multicanal ; estimation de l'émissivité par indice de végétation ; sortie directe de la température physique. Cas d'utilisation : cartographie des îlots de chaleur urbains ; suivi du stress hydrique ; détection d'entités géothermiques ; suivi de la signature thermique des feux de forêt ; gestion de l'eau agricole. Interprétation des résultats : la sortie est la température radiative de peau en kelvins (ou en degrés Celsius après conversion). L'estimation monocanal ne peut pas éliminer complètement les effets de la vapeur d'eau atmosphérique ; le biais atmosphérique résiduel est généralement de 2-5 K. Les erreurs d'émissivité se propagent directement : une erreur d'émissivité de ±0.05 ≈ une erreur de température de ±1-2 K. L'émissivité fondée sur la végétation varie avec le NDVI ; le sol nu présente une émissivité plus faible que la végétation. Les séries temporelles de LST révèlent les tendances de réchauffement/refroidissement ; des anomalies de LST > fond ± 5K indiquent des entités thermiques.",
            "params": {
              "thermal_input": {
                "label": "Entrée thermique",
                "description": "Chemin du raster thermique (DN par défaut, ou température de brillance si input_is_brightness_temp=true)."
              },
              "input_is_brightness_temp": {
                "label": "L'entrée est une température de brillance",
                "description": "Si vrai, thermal_input est déjà une température de brillance en kelvins (par défaut false)."
              },
              "emissivity_input": {
                "label": "Entrée d'émissivité",
                "description": "Chemin optionnel du raster d'émissivité aligné sur thermal_input."
              },
              "emissivity_constant": {
                "label": "Constante d'émissivité",
                "description": "Émissivité de repli lorsque emissivity_input n'est pas fourni (par défaut 0.98)."
              },
              "sensor_bundle_root": {
                "label": "Racine du lot capteur",
                "description": "Racine optionnelle d'un lot Landsat utilisée pour dériver la radiance thermique et les constantes de Planck."
              },
              "thermal_band_number": {
                "label": "Numéro de bande thermique",
                "description": "Numéro de bande thermique pour la recherche dans les métadonnées (par défaut 10)."
              },
              "radiance_mult": {
                "label": "Multiplicateur de radiance",
                "description": "Facteur multiplicatif de radiance thermique pour la conversion DN->radiance."
              },
              "radiance_add": {
                "label": "Constante additive de radiance",
                "description": "Facteur additif de radiance thermique pour la conversion DN->radiance."
              },
              "k1_constant": {
                "label": "Constante K1",
                "description": "Constante thermique K1 de Planck."
              },
              "k2_constant": {
                "label": "Constante K2",
                "description": "Constante thermique K2 de Planck."
              },
              "wavelength_um": {
                "label": "Longueur d'onde (µm)",
                "description": "Longueur d'onde thermique effective en micromètres (par défaut inférée de thermal_band_number)."
              },
              "output_units": {
                "label": "Unités de sortie",
                "description": "Unités de sortie : celsius (par défaut) ou kelvin."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette emissivity_input dans le SCR de thermal_input si nécessaire."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "land_surface_temperature_split_window": {
            "name": "Température de surface par fenêtre partagée",
            "description": "L'estimation de la LST par fenêtre fractionnée (split-window) utilise deux bandes infrarouges thermiques pour estimer simultanément la température et l'émissivité de surface par inversion de l'équation de transfert radiatif. L'absorption atmosphérique différentielle entre les deux bandes (généralement dans la région 10-12 μm) permet de corriger la vapeur d'eau atmosphérique, améliorant la précision par rapport aux méthodes monocanal. Les températures de brillance des deux bandes sont inversées à l'aide d'une paramétrisation de l'émissivité fondée sur la fraction de végétation ou de grilles d'émissivité fournies par l'utilisateur. Caractéristiques clés : deux bandes thermiques requises ; correction atmosphérique par absorption différentielle ; estimation simultanée température/émissivité ; algorithmes publiés pour les capteurs standard ; compensation atmosphérique supérieure à celle des méthodes monocanal. Cas d'utilisation : cartographie des îlots de chaleur urbains ; détection de la sécheresse agricole ; détection d'entités géothermiques ; études des interactions surface-atmosphère ; détection d'anomalies volcaniques/thermiques. Interprétation des résultats : la sortie est la température radiative de surface avec une correction atmosphérique améliorée. L'estimation split-window réduit le biais dû à la vapeur d'eau atmosphérique à <1-2 K, contre 2-5 K d'erreur en monocanal. Le compromis température/émissivité subsiste : les zones à indice de végétation élevé présentent une faible émissivité nécessitant une interprétation prudente. Les surfaces hétérogènes (végétation/sol mixtes) présentent des valeurs intermédiaires. La cohérence temporelle améliore la fiabilité de la détection de changements ; des tendances de LST > ±3K indiquent des changements thermiques significatifs.",
            "params": {
              "thermal1_input": {
                "label": "Entrée thermique 1",
                "description": "Chemin du premier raster thermique (p. ex. Landsat B10)."
              },
              "thermal2_input": {
                "label": "Entrée thermique 2",
                "description": "Chemin du second raster thermique (p. ex. Landsat B11)."
              },
              "input_is_brightness_temp": {
                "label": "L'entrée est une température de brillance",
                "description": "Si vrai, les entrées thermiques sont déjà des températures de brillance en kelvins (par défaut false)."
              },
              "emissivity_mean_input": {
                "label": "Entrée d'émissivité moyenne",
                "description": "Chemin optionnel du raster d'émissivité moyenne."
              },
              "emissivity_delta_input": {
                "label": "Entrée de différence d'émissivité",
                "description": "Chemin optionnel du raster de différence d'émissivité (epsilon1 - epsilon2)."
              },
              "emissivity_mean_constant": {
                "label": "Constante d'émissivité moyenne",
                "description": "Constante d'émissivité moyenne de repli lorsque emissivity_mean_input est absent (par défaut 0.98)."
              },
              "emissivity_delta_constant": {
                "label": "Constante de différence d'émissivité",
                "description": "Constante de différence d'émissivité de repli lorsque emissivity_delta_input est absent (par défaut 0.0)."
              },
              "sensor_bundle_root": {
                "label": "Racine du lot capteur",
                "description": "Racine optionnelle d'un lot Landsat utilisée pour dériver la radiance thermique et les constantes de Planck."
              },
              "thermal_band1_number": {
                "label": "Numéro de bande thermique 1",
                "description": "Numéro de bande pour la recherche des métadonnées de thermal1_input (par défaut 10)."
              },
              "thermal_band2_number": {
                "label": "Numéro de bande thermique 2",
                "description": "Numéro de bande pour la recherche des métadonnées de thermal2_input (par défaut 11)."
              },
              "radiance1_mult": {
                "label": "Multiplicateur de radiance 1",
                "description": "Facteur multiplicatif de radiance de la bande 1."
              },
              "radiance1_add": {
                "label": "Constante additive de radiance 1",
                "description": "Facteur additif de radiance de la bande 1."
              },
              "k1_1": {
                "label": "K1 1",
                "description": "Constante K1 de Planck de la bande 1."
              },
              "k2_1": {
                "label": "K2 1",
                "description": "Constante K2 de Planck de la bande 1."
              },
              "radiance2_mult": {
                "label": "Multiplicateur de radiance 2",
                "description": "Facteur multiplicatif de radiance de la bande 2."
              },
              "radiance2_add": {
                "label": "Constante additive de radiance 2",
                "description": "Facteur additif de radiance de la bande 2."
              },
              "k1_2": {
                "label": "K1 2",
                "description": "Constante K1 de Planck de la bande 2."
              },
              "k2_2": {
                "label": "K2 2",
                "description": "Constante K2 de Planck de la bande 2."
              },
              "coeff_a0": {
                "label": "Coefficient A0",
                "description": "Coefficient split-window a0 (par défaut 0.0)."
              },
              "coeff_a1": {
                "label": "Coefficient A1",
                "description": "Coefficient split-window a1 pour le terme T1 (par défaut 1.0)."
              },
              "coeff_a2": {
                "label": "Coefficient A2",
                "description": "Coefficient split-window a2 pour le terme (T1-T2) (par défaut 0.0)."
              },
              "coeff_a3": {
                "label": "Coefficient A3",
                "description": "Coefficient split-window a3 pour le terme (T1-T2)^2 (par défaut 0.0)."
              },
              "coeff_a4": {
                "label": "Coefficient A4",
                "description": "Coefficient split-window a4 pour le terme (1-emissivity_mean) (par défaut 0.0)."
              },
              "coeff_a5": {
                "label": "Coefficient A5",
                "description": "Coefficient split-window a5 pour le terme emissivity_delta (par défaut 0.0)."
              },
              "output_units": {
                "label": "Unités de sortie",
                "description": "Unités de sortie : celsius (par défaut) ou kelvin."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette les rasters supplémentaires pour correspondre au SCR de thermal1_input si nécessaire."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "ndvi_based_emissivity": {
            "name": "Émissivité fondée sur le NDVI",
            "description": "L'estimation de l'émissivité de la surface terrestre fondée sur le NDVI dérive l'émissivité thermique à large bande de la fraction de végétation calculée à partir du NDVI, permettant les corrections de transfert radiatif thermique pour l'estimation de la température de surface terrestre à partir de données satellitaires infrarouges thermiques. L'algorithme calcule le NDVI à partir des réflectances rouge et proche infrarouge, transforme le NDVI en fraction de végétation, puis applique des relations empiriques entre fraction de végétation et émissivité validées par des mesures de terrain et des simulations de transfert radiatif. La végétation influe fortement sur l'émissivité thermique ; davantage de végétation fait tendre l'émissivité vers ~0.99, tandis que l'émissivité du sol nu varie de ~0.90 à 0.98 selon la composition du sol et la rugosité de surface. Les caractéristiques clés comprennent le calcul automatique de la fraction de végétation à partir du NDVI sans étalonnage de terrain, des relations empiriques standard fondées sur la théorie physique du transfert radiatif, une analyse de sensibilité optionnelle explorant les variations d'émissivité et une compatibilité directe avec les données satellitaires infrarouges thermiques. Les applications comprennent l'estimation de la température de surface terrestre à partir de données satellitaires thermiques exigeant des corrections d'émissivité précises (Landsat, MODIS, Sentinel-3), l'analyse des îlots de chaleur urbains corrigée d'une végétation variable, la modélisation thermique pour les ressources en eau et l'agriculture, et les applications climatiques exigeant des jeux de données thermiques mondiaux cohérents. L'émissivité fondée sur le NDVI permet une correction thermique précise. La sortie produit un raster d'émissivité (0-1) adapté à la correction du transfert radiatif thermique, un produit intermédiaire de fraction de végétation facilitant l'interprétation et des métadonnées documentant les relations empiriques et les propriétés supposées du sol/de la surface ; les valeurs d'émissivité renseignent sur l'incertitude de la correction thermique et son adéquation à des applications spécifiques.",
            "params": {
              "red_input": {
                "label": "Entrée rouge",
                "description": "Chemin du raster de la bande rouge."
              },
              "nir_input": {
                "label": "Entrée PIR",
                "description": "Chemin du raster de la bande PIR."
              },
              "ndvi_soil": {
                "label": "NDVI du sol",
                "description": "Seuil NDVI pour la fraction de sol nu (par défaut 0.2)."
              },
              "ndvi_vegetation": {
                "label": "NDVI de la végétation",
                "description": "Seuil NDVI pour la fraction de végétation complète (par défaut 0.5)."
              },
              "emissivity_soil": {
                "label": "Émissivité du sol",
                "description": "Émissivité du sol supposée (par défaut 0.97)."
              },
              "emissivity_vegetation": {
                "label": "Émissivité de la végétation",
                "description": "Émissivité de la végétation supposée (par défaut 0.99)."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette nir_input dans le SCR de red_input si nécessaire."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "continuum_removal": {
            "name": "Suppression du continuum",
            "description": "La suppression du continuum normalise les spectres multispectraux en estimant l'enveloppe convexe supérieure (continuum) qui enveloppe le spectre et en divisant chaque bande par la valeur correspondante du continuum. Supprime la pente spectrale globale et les variations de luminosité, permettant une meilleure visualisation des caractéristiques d'absorption (bandes, profondeurs). Les profondeurs et positions d'absorption sont normalisées, permettant l'identification des minéraux/matériaux via des bibliothèques spectrales. La ligne de continuum est calculée par un algorithme d'enveloppe convexe reliant les maxima locaux sur la gamme spectrale. Caractéristiques clés : supprime le continuum spectral ; renforce les caractéristiques d'absorption ; normalise les variations de luminosité ; permet la comparaison avec des bibliothèques spectrales ; normalise la forme spectrale. Cas d'utilisation : identification des minéraux ; classification des matériaux ; analyse spectrale de la végétation ; détection d'anomalies spectrales ; cartographie des caractéristiques d'absorption. Interprétation des résultats : les spectres sans continuum présentent des caractéristiques d'absorption (valeurs <1.0) indiquant des bandes propres aux matériaux. Les profondeurs d'absorption indiquent l'intensité des caractéristiques ; les caractéristiques peu profondes (<0.2) indiquent des composants mineurs ; les caractéristiques profondes (>0.5) indiquent des absorptions dominantes. Les positions des caractéristiques en longueur d'onde permettent l'identification des matériaux via des bibliothèques de référence. Des spectres sans continuum plats (proches de 1.0) indiquent des matériaux spectralement neutres.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Pile de rasters en entrée (un raster par bande)."
              },
              "wavelengths": {
                "label": "Longueurs d'onde",
                "description": "Tableau optionnel de longueurs d'onde strictement croissantes correspondant à la longueur de inputs."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin optionnel du raster multibande en sortie."
              }
            }
          },
          "linear_spectral_unmixing": {
            "name": "Démixage spectral linéaire",
            "description": "Le démélange spectral linéaire décompose le vecteur multispectral de chaque pixel en une combinaison linéaire non négative de spectres de pôles purs (endmembers) représentant des signatures de matériaux purs. Une optimisation par moindres carrés non négatifs résout min ||y - Ax||² sous la contrainte x ≥ 0, où y est le spectre du pixel, A contient les signatures des pôles purs et x représente les fractions d'abondance. Une contrainte de somme à un est imposée pour que les valeurs d'abondance représentent des proportions physiques. Les pôles purs sont issus de données d'entraînement, de bibliothèques ou extraits par des algorithmes d'extraction de pôles purs. Caractéristiques clés : estimation des matériaux au niveau sous-pixel ; interprétation physique des fractions d'abondance ; prise en charge de plusieurs pôles purs ; sortie contrainte à des plages valides [0,1] ; détection des changements de matériaux. Cas d'utilisation : cartographie de l'abondance de l'occupation du sol ; estimation de la composition minérale ; inventaire des matériaux urbains ; fractions végétation/sol/surfaces imperméables ; classification fondée sur des bibliothèques spectrales. Interprétation des résultats : les cartes d'abondance en sortie présentent les fractions de matériaux par pixel dont la somme vaut 1.0. Des abondances <0.1 indiquent des composants mineurs ; des abondances >0.7 indiquent des matériaux dominants. L'erreur résiduelle indique la qualité du démélange ; des résidus faibles indiquent un bon ajustement spectral ; des résidus élevés indiquent une inadéquation des pôles purs ou une complexité du pixel.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Pile de rasters en entrée (un raster par bande)."
              },
              "endmembers": {
                "label": "Pôles purs",
                "description": "Signatures des pôles purs sous forme de tableau d'objets {name, values} ou de tableaux numériques."
              },
              "sum_to_one": {
                "label": "Somme égale à un",
                "description": "Si vrai (par défaut), normalise les fractions non négatives pour que leur somme soit égale à un."
              },
              "iterations": {
                "label": "Itérations",
                "description": "Nombre d'itérations du gradient projeté (par défaut 80)."
              },
              "step_size": {
                "label": "Taille du pas",
                "description": "Taille du pas du gradient projeté (par défaut 0.05)."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin optionnel du raster multibande de fractions en sortie."
              },
              "output_residual": {
                "label": "Résidu en sortie",
                "description": "Chemin optionnel du raster de RMS des résidus en sortie."
              }
            }
          },
          "minimum_noise_fraction": {
            "name": "Fraction de bruit minimale",
            "description": "La fraction de bruit minimale (MNF) transforme les données hyperspectrales en deux étapes : estimation de la covariance du bruit, puis blanchiment du bruit et analyse en composantes principales. Le blanchiment décorrèle le bruit entre les bandes ; l'ACP dans l'espace blanchi identifie les directions dominées par le signal. Les composantes en sortie sont ordonnées par rapport signal/bruit, les premières représentant le signal et les dernières le bruit. Permet de réduire le bruit par troncature des composantes sans les artefacts d'un lissage classique. Caractéristiques clés : sépare le signal du bruit ; concentration du bruit dans les dernières composantes ; la sélection des composantes permet le filtrage du bruit ; préserve la fidélité spectrale ; permet la réduction de dimension. Cas d'utilisation : débruitage d'images hyperspectrales ; réduction de dimension pour la classification ; rehaussement du signal ; caractérisation du bruit ; évaluation de la qualité d'image. Interprétation des résultats : les 1 à 3 premières composantes MNF contiennent généralement 70-90% du signal ; les composantes suivantes sont de plus en plus bruitées. La troncature (conservation des N premières composantes) supprime le bruit tout en préservant l'information spectrale essentielle. Les images des composantes MNF permettent une évaluation visuelle du bruit ; l'écart-type des dernières composantes indique le niveau de bruit.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Pile de rasters en entrée (un raster par bande)."
              },
              "num_components": {
                "label": "Nombre de composantes",
                "description": "Nombre de composantes MNF en sortie (par défaut : toutes les bandes)."
              },
              "noise_mode": {
                "label": "Mode de bruit",
                "description": "Mode d'estimation du bruit : « difference_x » (par défaut) ou « difference_y »."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin optionnel du raster multibande des composantes MNF en sortie."
              },
              "output_inverse": {
                "label": "Inverse en sortie",
                "description": "Chemin optionnel du raster multibande reconstruit à partir des composantes MNF conservées."
              }
            }
          },
          "spectral_angle_mapper": {
            "name": "Mesure d'angle spectral (SAM)",
            "description": "Le Spectral Angle Mapping (SAM) classe les pixels en calculant les angles spectraux entre le spectre de chaque pixel et les spectres d'une bibliothèque de référence, affectant chaque pixel au spectre de la bibliothèque d'angle minimal, qui représente la similarité spectrale maximale indépendamment de l'intensité d'éclairement. SAM traite chaque spectre de pixel et de référence comme un vecteur dans un espace spectral à N dimensions et calcule les angles entre vecteurs à l'aide de produits scalaires et de la fonction arc cosinus. Cette classification fondée sur l'angle spectral est invariante aux effets d'éclairement et topographiques qui modifient l'échelle de la luminosité globale mais préservent la forme spectrale, ce qui la rend robuste en terrain complexe et dans des conditions d'acquisition variables. Les caractéristiques clés comprennent la définition automatique d'un seuil d'angle spectral permettant une confiance de classification probabiliste, l'import de bibliothèques de référence prenant en charge des signatures spectrales fournies par l'utilisateur à partir d'échantillons de terrain ou de bibliothèques spectrales, une invariance à l'éclairement gérant un éclairage variable tout en préservant la discrimination spectrale, et un calcul rapide permettant la classification en temps réel de grandes images. Les applications courantes comprennent l'identification des matériaux et la cartographie géologique à l'aide des bibliothèques spectrales de l'USGS, la classification des espèces végétales combinant données satellitaires multispectrales et spectres collectés sur le terrain, la prospection minérale par levés hyperspectraux aéroportés et l'évaluation de la précision comparant les spectres de l'image à des signatures de référence collectées au sol. La sortie SAM permet une identification fiable des matériaux s'appuyant sur les signatures de forme spectrale. La classification produit une image à bande unique avec des étiquettes de classe entières correspondant aux entrées de la bibliothèque ; un raster de confiance optionnel enregistre les angles spectraux minimaux de chaque pixel, permettant un filtrage par seuil ; la sortie permet une identification directe des matériaux et un filtrage fondé sur la confiance.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Pile de rasters en entrée (un raster par bande)."
              },
              "endmembers": {
                "label": "Pôles purs",
                "description": "Signatures des pôles purs sous forme de tableau d'objets {name, values} ou de tableaux numériques."
              },
              "threshold_angle_deg": {
                "label": "Angle seuil (deg)",
                "description": "Angle spectral maximal accepté optionnel en degrés ; les pixels non appariés reçoivent la classe 0."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin optionnel du raster de classes en sortie."
              },
              "output_angle": {
                "label": "Angle en sortie",
                "description": "Chemin de sortie optionnel du raster d'angle spectral minimal (degrés)."
              }
            }
          },
          "spectral_library_matching": {
            "name": "Appariement à une bibliothèque spectrale",
            "description": "La mise en correspondance avec une bibliothèque spectrale effectue une classification en comparant les spectres des pixels de l'image aux spectres de référence d'une bibliothèque à l'aide de plusieurs métriques de similarité, dont l'angle spectral (angle entre les vecteurs spectraux), la distance euclidienne (différence de magnitude) et la divergence d'information spectrale. L'algorithme accepte une bibliothèque spectrale de référence fournie par l'utilisateur, contenant des spectres de matériaux/classes connus, calcule les métriques de similarité entre chaque pixel et les entrées de la bibliothèque, identifie le spectre offrant la meilleure correspondance (angle, distance ou divergence minimal) et produit des étiquettes de classe avec des scores optionnels de confiance/similarité. La mise en correspondance permet d'identifier les matériaux sans échantillons d'entraînement de terrain, en s'appuyant sur des spectres de référence de l'USGS, de levés de terrain ou de spectroscopie de laboratoire. Les caractéristiques clés comprennent plusieurs métriques de similarité permettant de choisir la métrique selon les caractéristiques spectrales et les distributions de classes, une grande souplesse d'import prenant en charge divers formats de bibliothèques spectrales, une quantification optionnelle de la confiance/incertitude et une sortie directe des matériaux identifiables. Les applications comprennent la cartographie géologique à l'aide de la bibliothèque spectrale de l'USGS pour la minéralogie, la classification de la végétation à l'aide de bibliothèques spectrales de référence de plantes, l'identification des matériaux de construction en zone urbaine et l'analyse de levés hyperspectraux aéroportés. La mise en correspondance avec une bibliothèque spectrale permet une identification automatisée des matériaux. La sortie comprend une carte classifiée dont les étiquettes de classe sont les identifiants des entrées de la bibliothèque, un raster de similarité/confiance quantifiant la qualité de la correspondance et une pile optionnelle complète d'angles/distances spectraux pour chaque entrée de la bibliothèque permettant un filtrage par seuil ; les métadonnées documentent la source de la bibliothèque de référence et la métrique de similarité utilisée.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Pile de rasters en entrée (un raster par bande)."
              },
              "library": {
                "label": "Bibliothèque",
                "description": "Entrées de la bibliothèque spectrale sous forme de tableau d'objets {name, values} ou de tableaux numériques."
              },
              "library_csv": {
                "label": "Bibliothèque CSV",
                "description": "Chemin optionnel d'une bibliothèque spectrale CSV (lignes name,b1,b2,... ou b1,b2,...). Utilisé lorsque « library » n'est pas fourni."
              },
              "metric": {
                "label": "Métrique",
                "description": "Métrique d'appariement : « sam » (par défaut), « euclidean » ou « sid »."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin optionnel du raster de classes en sortie."
              },
              "output_score": {
                "label": "Score en sortie",
                "description": "Chemin optionnel du raster de score de meilleure correspondance en sortie (angle ou distance)."
              }
            }
          },
          "canny_edge_detection": {
            "name": "Détection de contours de Canny",
            "description": "Applique la détection de contours multi-étapes de Canny (flou gaussien → gradient de Sobel → suppression des non-maxima → double seuil → hystérésis).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée (monobande ou RVB compacté)."
              },
              "sigma": {
                "label": "Sigma",
                "description": "Écart-type du noyau de lissage gaussien en pixels. Par défaut : 0.5."
              },
              "low_threshold": {
                "label": "Seuil bas",
                "description": "Seuil bas d'hystérésis (fraction 0–1 du gradient maximal). Par défaut : 0.05."
              },
              "high_threshold": {
                "label": "Seuil haut",
                "description": "Seuil haut d'hystérésis (fraction 0–1 du gradient maximal). Par défaut : 0.15."
              },
              "add_back": {
                "label": "Réinjecter",
                "description": "Si vrai, les pixels de contour sont mis à zéro dans l'image d'origine au lieu de produire une carte de contours binaire. Par défaut : false."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel. S'il est omis, le résultat est conservé en mémoire."
              }
            }
          },
          "corner_detection": {
            "name": "Détection de coins",
            "description": "Identifie les motifs de coins dans des rasters binaires à l'aide de gabarits hit-and-miss.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "laplacian_filter": {
            "name": "Filtre laplacien",
            "description": "Le filtre laplacien calcule la dérivée spatiale seconde de l'intensité de l'image, offrant une détection de contours performante par une mesure isotrope (toutes directions) du gradient. L'implémentation applique un noyau fixe approchant l'opérateur laplacien (somme des dérivées secondes selon x et y), capturant les variations d'intensité quelle que soit l'orientation des contours. Contrairement aux filtres directionnels, cette approche traite toutes les directions de contours de la même façon, ce qui la rend idéale pour la détection d'entités exigeant une indépendance vis-à-vis de l'orientation. Le fondement mathématique repose sur l'approximation discrète : ∇²I ≈ I(x+1,y) + I(x-1,y) + I(x,y+1) + I(x,y-1) - 4·I(x,y). Les caractéristiques clés comprennent la détection des passages par zéro (les vrais contours se situent là où la sortie change de signe), l'insensibilité à la direction des contours et la capacité à détecter de façon identique les transitions clair-sombre et sombre-clair. Le filtrage laplacien excelle en cartographie géologique, où les limites des structures apparaissent comme des passages par zéro, dans la délimitation des limites de végétation, l'extraction de réseaux routiers à partir d'imagerie haute résolution et la détection des emprises de bâtiments. L'interprétation des résultats repose sur la compréhension des changements de signe : de fortes valeurs positives indiquent des minima sombres locaux, des valeurs négatives des maxima clairs locaux, et les passages par zéro marquent les vrais contours. La sortie varie généralement de -1000 à +1000 pour une imagerie source 8 bits selon le contraste local. Une magnitude élevée indique des contours nets et bien définis ; une faible magnitude suggère des transitions progressives. La détection des passages par zéro exige un choix de seuil soigné. Notez que le laplacien est sensible au bruit (il amplifie le bruit haute fréquence) ; un pré-filtrage par lissage gaussien est donc généralement recommandé avant son application.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "variant": {
                "label": "Variante",
                "description": "Variante de noyau : 3x3(1), 3x3(2), 3x3(3), 3x3(4), 5x5(1), 5x5(2)."
              },
              "clip_amount": {
                "label": "Quantité d'écrêtage",
                "description": "Pourcentage optionnel d'écrêtage symétrique des queues (0-40)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "laplacian_of_gaussians_filter": {
            "name": "Filtre laplacien de gaussiennes",
            "description": "Effectue un rehaussement des contours par laplacien de gaussienne (LoG), combinant un lissage gaussien et une détection de contours laplacienne. Approché en calcul par une différence de gaussiennes (DoG). Lisse d'abord l'image (réduction du bruit), puis applique le laplacien (détection des contours). Technique classique de détection de contours multi-échelle. La détection des passages par zéro sur la sortie LoG identifie la position précise des contours. Le LoG est la référence pour la détection de contours dans l'espace-échelle : la gaussienne supprime le bruit, le laplacien amplifie les contours. Le paramètre sigma contrôle l'échelle des contours détectés : un petit sigma détecte les contours fins, un grand sigma les contours larges. Le LoG est approché par DoG pour plus d'efficacité. Plusieurs valeurs de sigma permettent une détection de contours multi-échelle (identification d'entités à différentes échelles). Applications : (1) détection de contours robuste (résistante au bruit), (2) détection de contours multi-échelle (plusieurs sigma), (3) localisation des contours par passages par zéro, (4) prétraitement pour la segmentation, (5) détection de blobs via les passages par zéro du LoG. Flux de travail : appliquer le LoG→identifier les passages par zéro→suivre les contours→vectorisation ou traitement ultérieur.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "sigma": {
                "label": "Sigma",
                "description": "Sigma gaussien utilisé par le noyau LoG (0.5-20.0, par défaut 0.75)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "prewitt_filter": {
            "name": "Filtre de Prewitt",
            "description": "L'opérateur de Prewitt effectue une détection de contours fondée sur le gradient, semblable à Sobel, avec d'autres poids de noyau optimisés pour des caractéristiques de bruit différentes. L'implémentation emploie deux noyaux de convolution 3×3 calculant les dérivées directionnelles en x et en y avec une pondération uniforme de la ligne/colonne centrale et des lignes/colonnes adjacentes, contrairement à l'approche de Sobel qui privilégie le centre. La magnitude du gradient combine les composantes directionnelles via √(Gx² + Gy²), offrant une réponse directionnelle uniforme. Le fondement mathématique repose sur des approximations de différenciation discrète pondérant également tous les pixels contributeurs au lieu de privilégier le centre. Les caractéristiques clés comprennent une réponse au bruit légèrement différente de celle de Sobel (parfois supérieure sur une imagerie extrêmement bruitée), une véritable décomposition magnitude/direction permettant une analyse fine des contours, une efficacité de calcul ne nécessitant que des opérations de convolution standard et une efficacité éprouvée sur l'imagerie radar, optique et thermique. Le filtrage de Prewitt excelle dans l'analyse d'images SAR, où la pondération uniforme réduit mieux que Sobel les artefacts de chatoiement, dans la détection d'anomalies thermiques mettant en évidence les entités linéaires et dans l'extraction de contours multispectraux exigeant un traitement indépendant de la direction. L'interprétation des résultats est analogue à Sobel : la magnitude indique la force du contour (plus elle est élevée, plus il est net), et la direction calculée via atan2(Gy, Gx) fournit l'orientation du contour en radians. La magnitude varie généralement de 0 à 256 pour une entrée 8 bits ; des magnitudes supérieures à 80 indiquent généralement des contours significatifs. Les valeurs de direction vont de -π à +π ; 0 radian indique des contours purement horizontaux, ±π/2 des contours purement verticaux. La pondération uniforme du noyau produit généralement des réponses de gradient légèrement plus lisses que Sobel, potentiellement meilleures pour des entités d'imagerie éparses ou fines. Appliquez un filtrage médian complémentaire pour réduire les faux positifs dus au bruit. Combinez la sortie directionnelle avec un choix de seuil pour les flux de chaînage des contours et d'extraction des limites, essentiels aux chaînes de segmentation.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "clip_tails": {
                "label": "Écrêter les queues",
                "description": "Pourcentage optionnel d'écrêtage symétrique des queues (0-40)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "roberts_cross_filter": {
            "name": "Filtre croix de Roberts",
            "description": "Le filtre croisé de Roberts est l'un des premiers opérateurs de détection de contours ; il utilise un motif de noyau en croix diagonale 2×2, simple mais efficace, pour calculer les gradients de l'image avec un coût de calcul minimal. Cet opérateur utilise deux matrices 2×2 orthogonales tournées de 45° par rapport à l'alignement horizontal-vertical, créant des masques de convolution en croix qui détectent les contours en privilégiant les coins et les transitions diagonales. Le filtre applique des noyaux distincts pour les gradients X et Y et calcule la magnitude par la somme des valeurs absolues ou la norme euclidienne. Les caractéristiques clés comprennent une efficacité de calcul exceptionnelle grâce à la petite taille du noyau 2×2, des besoins en mémoire minimes et un traitement rapide sur de grands jeux de données raster. Le filtre de Roberts est particulièrement efficace pour détecter les entités à échelle fine et les transitions nettes dans l'imagerie haute résolution. Les principaux cas d'utilisation comprennent la détection rapide de contours dans les applications à contrainte de temps, le traitement de flux vidéo en temps réel, la détection préliminaire des limites avant des algorithmes avancés et les environnements aux ressources limitées. Les applications couvrent le prétraitement de levés aériens, l'évaluation de la qualité de l'imagerie satellitaire, l'extraction de caractéristiques pour les chaînes d'apprentissage automatique et les implémentations SIG mobiles. En sortie, les contours apparaissent comme des pixels de forte magnitude là où des changements spectraux se produisent dans le voisinage 2×2. Les zones de fond présentent généralement des valeurs proches de zéro ; les contours apparaissent comme des entités linéaires claires indiquant les limites entre classes d'occupation du sol distinctes. La sortie est intrinsèquement éparse et ne contient des contours que là où les gradients dépassent les seuils de précision de calcul. Pour les images multispectrales, appliquez-le indépendamment à chaque bande ou calculez d'abord un indice de différence normalisée. Un post-traitement d'amincissement des contours suit souvent l'application de Roberts afin d'affiner la sortie pour les flux de conversion vectorielle.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "clip_amount": {
                "label": "Quantité d'écrêtage",
                "description": "Pourcentage optionnel d'écrêtage symétrique des queues (0-50)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "sobel_filter": {
            "name": "Filtre de Sobel",
            "description": "L'opérateur de Sobel détecte les contours par estimation du gradient directionnel selon x (horizontal) et y (vertical), combinant des noyaux de dérivées orthogonales en une représentation unifiée de la magnitude. L'implémentation applique indépendamment deux noyaux de convolution 3×3 (l'un privilégiant les contours horizontaux, l'autre les verticaux), puis combine les résultats via la norme euclidienne : magnitude = √(Gx² + Gy²). Cette approche séparable réduit le coût de calcul tout en conservant la précision de détection des contours. La base mathématique découle d'approximations discrètes des gradients de l'image, les poids du noyau privilégiant les pixels centraux pour améliorer la robustesse au bruit. Les caractéristiques clés comprennent une mesure du gradient directionnel permettant de déterminer l'orientation des contours, un coût de calcul relativement faible, une efficacité éprouvée sur l'imagerie satellitaire et aérienne et un réglage minimal des paramètres. Le filtrage de Sobel est largement utilisé pour le calcul de la pente et de l'exposition du terrain, l'extraction des limites d'entités pour les flux de détection d'objets, la délimitation des réseaux hydrographiques à partir de données MNT et la cartographie des infrastructures (routes, bâtiments, lignes électriques) à partir d'imagerie haute résolution. En sortie, la magnitude indique la force du contour (valeurs plus élevées = transitions plus nettes), tandis que les composantes directionnelles (Gx, Gy) permettent l'analyse de l'orientation. La magnitude du gradient varie généralement de 0 à 256 pour une imagerie 8 bits ; des valeurs supérieures à 100 indiquent généralement des contours significatifs. Le rapport Gx/Gy renseigne sur l'orientation du contour : un rapport proche de 1 indique des contours à 45 degrés, un rapport >>1 des entités horizontales, un rapport <<1 des entités verticales. Des faux positifs apparaissent souvent dans les zones bruitées ; un filtrage médian ou des opérations morphologiques réduisent efficacement les détections parasites. Combinez-le avec un seuillage pour obtenir des masques de contours binaires adaptés aux chaînes de segmentation.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "variant": {
                "label": "Variante",
                "description": "Variante de taille de noyau : 3x3 (par défaut) ou 5x5."
              },
              "clip_tails": {
                "label": "Écrêter les queues",
                "description": "Pourcentage optionnel d'écrêtage symétrique des queues (0-40)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "balance_contrast_enhancement": {
            "name": "Rehaussement de contraste équilibré",
            "description": "Réduit la dominante de couleur d'une image RVB compactée à l'aide d'étirements paraboliques par canal.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "band_mean": {
                "label": "Moyenne de bande",
                "description": "Luminosité moyenne de sortie souhaitée pour chaque canal (par défaut 100.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "create_colour_composite": {
            "name": "Créer une composition colorée",
            "description": "Crée un composite couleur RVB compacté à partir de rasters rouge, vert, bleu et d'opacité optionnelle.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "red": {
                "label": "Rouge",
                "description": "Chemin du raster de la bande rouge ou objet raster typé."
              },
              "green": {
                "label": "Vert",
                "description": "Chemin du raster de la bande verte ou objet raster typé."
              },
              "blue": {
                "label": "Bleu",
                "description": "Chemin du raster de la bande bleue ou objet raster typé."
              },
              "opacity": {
                "label": "Opacité",
                "description": "Chemin optionnel du raster d'opacité ou objet raster typé."
              },
              "enhance": {
                "label": "Rehausser",
                "description": "Applique un rehaussement de contraste par équilibrage après composition (par défaut true)."
              },
              "treat_zeros_as_nodata": {
                "label": "Traiter les zéros comme NoData",
                "description": "Traite les valeurs nulles des entrées RVB comme NoData/fond (par défaut false)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "direct_decorrelation_stretch": {
            "name": "Étirement par décorrélation directe",
            "description": "Améliore la saturation des couleurs d'une image RVB compactée en réduisant la composante achromatique et en étirant linéairement les canaux.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "achromatic_factor": {
                "label": "Facteur achromatique",
                "description": "Facteur de réduction de la composante grise de 0 à 1 (par défaut 0.5)."
              },
              "clip_percent": {
                "label": "Pourcentage d'écrêtage",
                "description": "Pourcentage d'écrêtage des queues pour la remise à l'échelle linéaire après étirement (par défaut 1.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "false_colour_composite": {
            "name": "Composition en fausses couleurs",
            "description": "Construit un raster composite en fausses couleurs (PIR/Rouge/Vert) à partir d'un ensemble de données d'un capteur optique pris en charge.",
            "params": {
              "wbe": {
                "label": "Wbe",
                "description": "Wbe"
              },
              "output": {
                "label": "Sortie",
                "description": "Sortie"
              }
            }
          },
          "gamma_correction": {
            "name": "Correction gamma",
            "description": "La correction gamma applique un ajustement non linéaire de la luminosité par une transformation en loi de puissance afin d'optimiser le contraste de l'image, la fidélité d'affichage et la distribution perceptuelle de la luminance. La transformation mathématique est I_corrected = I^(1/γ), où γ (gamma) est un exposant spécifié par l'utilisateur contrôlant le sens et l'ampleur de l'ajustement de luminosité. Des valeurs γ > 1 assombrissent les images (compensation d'un affichage éclaircissant), tandis que γ < 1 les éclaircissent (compensation d'un affichage assombrissant). L'implémentation opère indépendamment sur chaque pixel ou bande spectrale, préservant les relations spatiales tout en ajustant l'échelle d'intensité. Les caractéristiques clés comprennent la préservation de la structure de l'image tout en redistribuant les valeurs tonales, une efficacité de calcul ne nécessitant que des tables de correspondance, une applicabilité à toutes les données radiométriques, y compris l'imagerie 16/32 bits, et une réversibilité permettant une correction inverse. La correction gamma est essentielle pour préparer l'imagerie satellitaire à l'interprétation visuelle en compensant les caractéristiques du capteur, normaliser la luminosité des orthophotos entre lignes de vol ou types de capteurs, rehausser l'imagerie thermique pour la visibilité des entités et prétraiter les données multispectrales pour les chaînes d'apprentissage automatique, où la normalisation des entrées améliore la convergence. En sortie, les valeurs corrigées suivent une loi de puissance : les tons moyens subissent l'ajustement relatif le plus important, tandis que les extrêmes sont moins compressés. Pour une entrée 8 bits (0-255), un gamma typique de 0.4-0.6 éclaircit nettement les images ; un gamma de 1.4-1.6 les assombrit fortement. La forme des histogrammes se transforme de façon prévisible : les histogrammes asymétriques à gauche (images sombres) bénéficient de γ < 1, les histogrammes asymétriques à droite (images claires) de γ > 1. Vérifiez la sortie corrigée par visualisation de l'histogramme et inspection visuelle. Appliquez-la de manière cohérente aux collections d'images exigeant un prétraitement uniforme. Un flux de travail courant enchaîne la correction gamma avant le choix du seuil ou la classification afin d'assurer une visibilité équilibrée des entités.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "gamma": {
                "label": "Gamma",
                "description": "Exposant gamma dans [0, 4], par défaut 0.5."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "gaussian_contrast_stretch": {
            "name": "Étirement de contraste gaussien",
            "description": "Étire le contraste par ajustement à une distribution de référence gaussienne.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "num_tones": {
                "label": "Nombre de tons",
                "description": "Nombre de tons en sortie (par défaut 256)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "histogram_equalization": {
            "name": "Égalisation d'histogramme",
            "description": "Applique une égalisation d'histogramme pour améliorer le contraste de l'image.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "num_tones": {
                "label": "Nombre de tons",
                "description": "Nombre de tons en sortie (par défaut 256)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "histogram_matching": {
            "name": "Appariement d'histogrammes",
            "description": "Ajuste l'histogramme d'une image à un histogramme de référence fourni.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "histogram": {
                "label": "Histogramme",
                "description": "Histogramme de référence sous forme de [[valeur, fréquence], ...] ou [{x, y}, ...]."
              },
              "is_cumulative": {
                "label": "Cumulatif",
                "description": "Vrai si les valeurs d'histogramme fournies sont déjà cumulées."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "histogram_matching_two_images": {
            "name": "Appariement d'histogrammes de deux images",
            "description": "Ajuste l'histogramme d'une image en entrée à celui d'une image de référence.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "reference": {
                "label": "Référence",
                "description": "Chemin du raster de référence ou objet raster typé."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "ihs_to_rgb": {
            "name": "IHS vers RVB",
            "description": "La transformation inverse IHS vers RVB convertit les composantes Intensité-Teinte-Saturation dans l'espace colorimétrique rouge-vert-bleu, permettant de retrouver les couleurs naturelles à partir de données de télédétection décomposées. Les formules inverses opèrent sur des coordonnées polaires cylindriques, convertissant l'angle de teinte, la magnitude de saturation et l'intensité en coordonnées RVB cartésiennes tout en maintenant la stabilité numérique et en minimisant les artefacts de quantification. Cette transformation est le complément essentiel des opérations RVB vers IHS, notamment dans les flux de pan-sharpening où l'intensité a été remplacée par des données panchromatiques haute résolution. Les caractéristiques clés comprennent une inversion mathématique exacte de la transformation directe assurant la cohérence des allers-retours, une gestion automatique des pixels achromatiques à teinte indéfinie empêchant la propagation d'artefacts numériques, une stabilité numérique pour des valeurs de saturation extrêmes proches de zéro et une efficacité de calcul permettant une intégration fluide dans des chaînes de traitement rapides. La transformation inverse complète les flux de pan-sharpening en restituant une imagerie en couleurs naturelles après remplacement de l'intensité par des données panchromatiques, permettant la visualisation en couleur de données à résolution améliorée, la reconstruction spectrale à partir des composantes décomposées et la validation de la cohérence des transformations dans les flux de contrôle qualité. La sortie IHS vers RVB produit une imagerie en couleurs naturelles à trois bandes dont la résolution spatiale est héritée de la bande d'intensité en entrée, adaptée à la visualisation directe et à l'analyse. Les bandes en sortie représentent les canaux rouge, vert et bleu dans l'ordre standard ; les couleurs présentent un détail spatial accru si l'intensité a été remplacée par des données panchromatiques à plus haute résolution, tout en préservant les caractéristiques spectrales des composantes de teinte et de saturation d'origine.",
            "params": {
              "intensity": {
                "label": "Intensité",
                "description": "Raster de la bande d'intensité (0–1)."
              },
              "hue": {
                "label": "Teinte",
                "description": "Raster de la bande de teinte (0–2π radians)."
              },
              "saturation": {
                "label": "Saturation",
                "description": "Raster de la bande de saturation (0–1)."
              },
              "red_output": {
                "label": "Sortie rouge",
                "description": "Chemin de sortie optionnel de la bande rouge."
              },
              "green_output": {
                "label": "Sortie verte",
                "description": "Chemin de sortie optionnel de la bande verte."
              },
              "blue_output": {
                "label": "Sortie bleue",
                "description": "Chemin de sortie optionnel de la bande bleue."
              }
            }
          },
          "min_max_contrast_stretch": {
            "name": "Étirement de contraste min-max",
            "description": "Étire linéairement les valeurs entre un minimum et un maximum spécifiés par l'utilisateur.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "min_val": {
                "label": "Valeur min",
                "description": "Valeur d'entrée minimale pour la mise à l'échelle."
              },
              "max_val": {
                "label": "Valeur max",
                "description": "Valeur d'entrée maximale pour la mise à l'échelle."
              },
              "num_tones": {
                "label": "Nombre de tons",
                "description": "Nombre de tons en sortie (par défaut 256)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "mosaic": {
            "name": "Mosaïque",
            "description": "Le mosaïquage combine plusieurs rasters qui se chevauchent en une sortie continue par recalage géométrique, rééchantillonnage vers une projection et une grille de pixels communes et fondu des bords afin de minimiser les discontinuités. L'algorithme recale les rasters à l'aide des coordonnées géographiques ou de points d'appui, les rééchantillonne à la résolution et à l'étendue cibles et applique un fondu pondéré (fondu progressif ou pondération exponentielle) dans les zones de recouvrement. Les pixels qui se chevauchent sont fondus par une moyenne pondérée par la distance aux bords des rasters, créant des transitions douces tout en préservant la précision des pixels intérieurs. On obtient ainsi des mosaïques raster continentales ou mondiales continues, sans artefacts de bord ni discontinuités radiométriques. Les caractéristiques clés comprennent l'alignement géométrique de plusieurs rasters sur une projection commune, le choix de la méthode de rééchantillonnage (bilinéaire, cubique, plus proche voisin), un fondu des bords éliminant les jointures, une normalisation radiométrique compensant les différences de capteur ou d'éclairement et la prise en charge de milliers de rasters en entrée. L'outil gère automatiquement la priorité des rasters et évite les lacunes grâce à des stratégies de remplissage intelligentes. Les applications comprennent la production de mosaïques d'images satellitaires continentales à partir de collections de scènes, la génération de modèles numériques d'élévation continus à partir de plusieurs lignes de vol, la création de mosaïques optiques composites à partir d'imagerie multitemporelle, la construction d'orthomosaïques à partir de levés par drone (UAV) et la production de cartes de base de grandes zones à partir de scènes satellitaires qui se chevauchent. Le mosaïquage est essentiel aux flux d'analyse continentaux et mondiaux. Interprétation des résultats : les rasters en sortie héritent de la projection et de la résolution des entrées ; les zones de fondu présentent des valeurs interpolées équilibrant les rasters en entrée. Des artefacts de bord indiquent un recouvrement insuffisant ou une mauvaise normalisation radiométrique ; l'évaluation examine les jointures et la cohérence des couleurs aux limites de la mosaïque. La gestion des NoData aux bords de la mosaïque exige une attention aux valeurs de remplissage et à la définition de l'étendue. L'évaluation de la qualité comprend une vérification géométrique par points d'appui et une évaluation radiométrique comparant les valeurs de la mosaïque à celles des rasters en entrée.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Liste de rasters d'entrée sous forme de tableau de chemins ou de chaîne délimitée par des virgules/points-virgules."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "method": {
                "label": "Méthode",
                "description": "Méthode de rééchantillonnage : « nn » (par défaut), « bilinear » ou « cc »."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "mosaic_with_feathering": {
            "name": "Mosaïque avec fondu",
            "description": "Mosaïque deux rasters et fond progressivement les cellules qui se chevauchent à l'aide de poids fondés sur la distance aux bords.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Premier raster en entrée."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Second raster en entrée."
              },
              "method": {
                "label": "Méthode",
                "description": "Méthode de rééchantillonnage : « cc » (par défaut), « nn » ou « bilinear »."
              },
              "weight": {
                "label": "Poids",
                "description": "Exposant de pondération par la distance utilisé pour le fondu des chevauchements (par défaut 4.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "normalized_difference_index": {
            "name": "Indice de différence normalisée",
            "description": "Calcule (band1 - band2) / (band1 + band2) à partir d'un raster multibande.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "band1": {
                "label": "Bande 1",
                "description": "Indice (à partir de 1) de la première bande (par défaut 1)."
              },
              "band2": {
                "label": "Bande 2",
                "description": "Indice (à partir de 1) de la seconde bande (par défaut 2)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "panchromatic_sharpening": {
            "name": "Pansharpening",
            "description": "Le pan-sharpening fusionne une imagerie panchromatique haute résolution avec des données multispectrales de plus faible résolution à l'aide de la méthode de Brovey, une technique de multiplication spectrale qui renforce le détail spatial tout en préservant l'information spectrale. La méthode rééchantillonne d'abord les bandes multispectrales à la résolution panchromatique, puis calcule le rapport d'intensité entre l'image panchromatique et l'intensité multispectrale calculée afin de mettre chaque bande à l'échelle en conséquence. Cette approche maintient la fidélité spectrale tout en améliorant considérablement la résolution spatiale. Les caractéristiques clés comprennent la préservation des caractéristiques spectrales d'origine, une efficacité algébrique linéaire permettant un traitement rapide de grandes images, une compatibilité de rééchantillonnage automatique avec des entrées recalées par bande et une normalisation automatique assurant la cohérence radiométrique entre capteurs hétérogènes. La technique est largement utilisée pour rehausser l'imagerie satellitaire dans des applications cartographiques comme l'urbanisme, le suivi agricole et l'exploration des ressources, où le détail spectral et spatial est essentiel. Le pan-sharpening crée une sortie multispectrale rehaussée, d'une définition spatiale supérieure, adaptée à l'interprétation visuelle et à la cartographie détaillée. Les bandes en sortie conservent l'ordre des bandes multispectrales d'origine avec une résolution de niveau panchromatique, permettant une intégration fluide dans les flux d'analyse d'images standard et les SIG. La résolution spatiale augmente jusqu'à celle de l'entrée panchromatique, permettant l'extraction d'entités à des échelles plus fines que les données multispectrales d'origine.",
            "params": {
              "red": {
                "label": "Rouge",
                "description": "Raster de la bande rouge (requis sauf si « composite » est fourni)."
              },
              "green": {
                "label": "Vert",
                "description": "Raster de la bande verte (requis sauf si « composite » est fourni)."
              },
              "blue": {
                "label": "Bleu",
                "description": "Raster de la bande bleue (requis sauf si « composite » est fourni)."
              },
              "composite": {
                "label": "Composite",
                "description": "Composite multispectral RVB compacté (mutuellement exclusif avec red/green/blue)."
              },
              "pan": {
                "label": "Panchromatique",
                "description": "Bande raster panchromatique."
              },
              "method": {
                "label": "Méthode",
                "description": "Méthode de fusion : « brovey » (par défaut) ou « ihs »."
              },
              "output_mode": {
                "label": "Mode de sortie",
                "description": "Encodage de sortie : « packed » (par défaut) ou « bands » (raster RVB à 3 bandes)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "percentage_contrast_stretch": {
            "name": "Étirement de contraste en pourcentage",
            "description": "Percentage Contrast Stretch effectue un rehaussement linéaire du contraste en supprimant des pourcentages spécifiés de valeurs extrêmes (queues) de l'histogramme avant d'étirer sur toute la dynamique. Algorithme : supprime indépendamment les valeurs des percentiles inférieur et supérieur de chaque bande, projette linéairement la plage restante sur la plage de sortie (généralement 0-255 ou toute la profondeur de bits) et élimine les extrêmes radiométriques responsables d'un faible contraste. Le choix du percentile (couramment 2-3%) équilibre le rehaussement du contraste et la préservation de l'intégrité des données. Caractéristiques clés : suppression automatique des valeurs radiométriques aberrantes, prévention de la compression du contraste par des valeurs anormales, application par bande ou globale, transformation linéaire efficace en calcul, opération inversible. Capacités : gestion des artefacts radiométriques, meilleure visibilité des entités subtiles, adaptation à des plages d'entrée variables. Cas d'utilisation : prétraitement avant classification ou fusion, exploitation d'une dynamique sous-utilisée, préparation à l'affichage multispectral, normalisation radiométrique entre scènes. Applications : rehaussement de l'imagerie satellitaire pour l'interprétation visuelle, prétraitement pour la détection satellitaire des glissements de terrain, normalisation avant classification, remise en état d'imagerie d'archives. Interprétation des résultats : l'imagerie rehaussée présente un meilleur contraste ; les valeurs extrêmes sont écrêtées ; des entités subtiles auparavant masquées deviennent visibles ; les valeurs d'écrêtage par bande révèlent la qualité de la distribution radiométrique.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "clip": {
                "label": "Découper",
                "description": "Pourcentage d'écrêtage par percentile (par défaut 1.0)."
              },
              "tail": {
                "label": "Queue",
                "description": "Mode d'écrêtage des queues : both (par défaut), upper ou lower."
              },
              "num_tones": {
                "label": "Nombre de tons",
                "description": "Nombre de tons en sortie (par défaut 256)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "piecewise_contrast_stretch": {
            "name": "Étirement de contraste par morceaux",
            "description": "Effectue un étirement linéaire du contraste par morceaux à l'aide de points de rupture spécifiés par l'utilisateur.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "function": {
                "label": "Fonction",
                "description": "Chaîne d'instruction de points de rupture, p. ex. '(50,0.1);(120,0.6);(180,0.85)'."
              },
              "greytones": {
                "label": "Niveaux de gris",
                "description": "Nombre de tons en sortie pour les rasters non RVB (par défaut 1024)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "resample": {
            "name": "Rééchantillonner",
            "description": "Le rééchantillonnage d'image modifie la résolution des pixels à l'aide de méthodes d'interpolation comprenant le plus proche voisin (le plus rapide, le moins lissant), le bilinéaire (interpolation linéaire entre pixels adjacents), le bicubique (ajustement polynomial cubique) et la spline cubique (interpolation continue et lisse). Le rééchantillonnage est essentiel pour le recalage géométrique, la création de piles multispectrales à résolution uniforme à partir de capteurs de résolutions différentes et l'intégration de données auxiliaires à différentes échelles. Chaque méthode ajuste des noyaux d'interpolation locaux aux valeurs des pixels d'origine, les évalue aux nouvelles positions de pixels et renvoie les valeurs interpolées. Le plus proche voisin préserve les valeurs radiométriques (adapté aux données catégorielles) ; les méthodes d'ordre supérieur lissent les contours et réduisent le crénelage, mais estompent les limites nettes. Les caractéristiques clés comprennent des méthodes d'interpolation au choix optimisant le compromis vitesse-précision, la spécification de la résolution de sortie par taille de pixel cible ou par dimensions, une gestion automatique de la valeur de fond pour les zones hors de l'étendue d'entrée et un filtrage anticrénelage optionnel réduisant les artefacts de rééchantillonnage. Les applications comprennent le recalage d'images alignant les données sur des grilles communes, l'harmonisation des résolutions unifiant des piles multispectrales de résolutions natives différentes, le sous-échantillonnage réduisant le volume de données tout en préservant les motifs spatiaux et le suréchantillonnage améliorant le détail visuel pour la visualisation. La sortie du rééchantillonnage intègre l'imagerie à une résolution cohérente. La résolution de sortie correspond à la spécification de l'utilisateur ; la méthode d'interpolation influe sur la définition des contours (le plus proche voisin les préserve ; les méthodes d'ordre supérieur les lissent) ; les zones de fond (hors de l'étendue d'entrée) reçoivent des valeurs de remplissage configurables ; la sortie s'intègre de façon fluide dans les flux d'analyse multispectrale.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Liste de rasters d'entrée sous forme de tableau de chemins ou de chaîne délimitée par des virgules/points-virgules."
              },
              "base": {
                "label": "Base",
                "description": "Raster de base optionnel définissant l'emprise et la grille de sortie. Prioritaire sur cell_size."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule de sortie optionnelle lorsque base n'est pas fourni."
              },
              "method": {
                "label": "Méthode",
                "description": "Méthode de rééchantillonnage : « cc » (par défaut), « nn » ou « bilinear »."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "rgb_to_ihs": {
            "name": "RVB vers IHS",
            "description": "La transformation RVB vers Intensité-Teinte-Saturation décompose l'espace colorimétrique rouge-vert-bleu en composantes perceptuellement pertinentes : intensité (luminosité), teinte (couleur) et saturation (pureté de la couleur). La décomposition utilise des formules mathématiques standard convertissant les valeurs trichromatiques RVB en coordonnées polaires cylindriques, où l'intensité représente la luminance, la teinte encode l'angle de couleur et la saturation mesure la concentration de la couleur. Cet espace colorimétrique est particulièrement utile en télédétection, car l'intensité peut être remplacée par des données haute résolution tout en préservant les caractéristiques de couleur d'origine grâce à la transformation inverse. Les caractéristiques clés comprennent une formulation numériquement stable gérant de façon robuste les cas limites (pixels achromatiques), la conservation de toute la dynamique sans écrêtage ni perte d'information, une mise à l'échelle automatique des bandes pour des résultats cohérents quelles que soient les plages d'entrée et une efficacité de calcul adaptée aux grandes piles multispectrales. La technique sert plusieurs applications : les flux de pan-sharpening où l'intensité est remplacée par des données panchromatiques, l'amélioration de la visualisation des couleurs, le prétraitement spectral pour les algorithmes de classification et les conversions couleur vers niveaux de gris conservant l'information perceptuelle. La transformation RVB vers IHS est essentielle aux techniques de fusion combinant la résolution panchromatique et l'information de couleur multispectrale. La sortie comprend trois fichiers à bande unique représentant les composantes d'intensité, de teinte et de saturation, utilisables indépendamment dans les flux d'analyse. La bande d'intensité approche la luminance ; la teinte varie de 0 à 360 degrés et encode l'information de couleur ; la saturation varie de 0 à 100 pour cent et indique la pureté de la couleur.",
            "params": {
              "red": {
                "label": "Rouge",
                "description": "Raster de la bande rouge (mutuellement exclusif avec « composite »)."
              },
              "green": {
                "label": "Vert",
                "description": "Raster de la bande verte (mutuellement exclusif avec « composite »)."
              },
              "blue": {
                "label": "Bleu",
                "description": "Raster de la bande bleue (mutuellement exclusif avec « composite »)."
              },
              "composite": {
                "label": "Composite",
                "description": "Raster composite RVB compacté (mutuellement exclusif avec red/green/blue)."
              },
              "intensity_output": {
                "label": "Sortie d'intensité",
                "description": "Chemin de sortie optionnel de la bande d'intensité."
              },
              "hue_output": {
                "label": "Sortie de teinte",
                "description": "Chemin de sortie optionnel de la bande de teinte."
              },
              "saturation_output": {
                "label": "Sortie de saturation",
                "description": "Chemin de sortie optionnel de la bande de saturation."
              }
            }
          },
          "sigmoidal_contrast_stretch": {
            "name": "Étirement de contraste sigmoïdal",
            "description": "Effectue un étirement sigmoïde du contraste à l'aide d'un gain et d'un seuil de coupure.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "cutoff": {
                "label": "Coupure",
                "description": "Point médian de la sigmoïde en unités normalisées (par défaut 0.0)."
              },
              "gain": {
                "label": "Gain",
                "description": "Paramètre de gain de la sigmoïde (par défaut 1.0)."
              },
              "num_tones": {
                "label": "Nombre de tons",
                "description": "Nombre de tons en sortie (par défaut 256)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "split_colour_composite": {
            "name": "Séparer une composition colorée",
            "description": "Scinde un raster composite couleur RVB compacté en trois rasters distincts à bande unique représentant les canaux rouge, vert et bleu. Algorithme : cet outil extrait les bandes de couleur individuelles d'une image composite dont les valeurs R, V et B sont compactées dans un seul raster (souvent selon un encodage standard RVB 24 bits ou RVBA 32 bits). La séparation est effectuée par des opérations bit à bit isolant chaque composante de canal 8 bits. Caractéristiques clés : préserve les valeurs radiométriques d'origine (0–255), gère les composites RVB standard et les formats étendus, produit trois rasters géoréférencés indépendants. Cas d'utilisation : analyse spectrale nécessitant le traitement séparé de chaque bande ; création de jeux de données d'entrée pour le calcul d'indices de végétation (NDVI, EVI) ; préparation de données pour des opérations d'algèbre de bandes ; transformations de couleur avancées comme la conversion RVB vers IHS ; extraction de bandes spécifiques pour des flux de classification supervisée ou non supervisée. Applications : analyse d'images de télédétection, prétraitement de données satellitaires, préparation à l'analyse multispectrale, chaînes de rehaussement d'images. Interprétation des résultats : trois rasters à bande unique sont produits avec une étendue spatiale, une projection et un géoréférencement identiques à ceux du composite en entrée. Chaque bande en sortie contient des valeurs radiométriques 8 bits (0–255) représentant l'intensité de cette composante de couleur sur la scène. Les statistiques de bande (min, max, moyenne) reflètent les caractéristiques spectrales de ce canal de couleur ; les valeurs dominantes indiquent la dominance de couleur sur l'image. Les rasters en sortie sont immédiatement utilisables pour des calculs de bandes, des indices spectraux ou d'autres flux de traitement multibande.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster RVB compacté en entrée."
              },
              "red_output": {
                "label": "Sortie rouge",
                "description": "Chemin de sortie optionnel de la bande rouge."
              },
              "green_output": {
                "label": "Sortie verte",
                "description": "Chemin de sortie optionnel de la bande verte."
              },
              "blue_output": {
                "label": "Sortie bleue",
                "description": "Chemin de sortie optionnel de la bande bleue."
              }
            }
          },
          "standard_deviation_contrast_stretch": {
            "name": "Étirement de contraste par écart-type",
            "description": "Effectue un étirement linéaire du contraste à l'aide de la moyenne plus/moins un multiplicateur de l'écart-type.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "clip": {
                "label": "Découper",
                "description": "Multiplicateur d'écart-type utilisé pour dériver les bornes d'écrêtage (par défaut 2.0)."
              },
              "num_tones": {
                "label": "Nombre de tons",
                "description": "Nombre de tons en sortie (par défaut 256)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "true_colour_composite": {
            "name": "Composition en vraies couleurs",
            "description": "Construit un raster composite en couleurs naturelles (RVB) à partir d'un ensemble de données d'un capteur optique pris en charge.",
            "params": {
              "wbe": {
                "label": "Wbe",
                "description": "Wbe"
              },
              "output": {
                "label": "Sortie",
                "description": "Sortie"
              }
            }
          },
          "adaptive_filter": {
            "name": "Filtre adaptatif",
            "description": "Le filtre adaptatif ajuste dynamiquement l'intensité du filtrage selon les statistiques locales de l'image (moyenne, variance, kurtosis), permettant un lissage contextuel qui s'adapte aux caractéristiques de la scène. L'implémentation découpe les images en fenêtres mobiles, calcule des statistiques locales (distinguant les zones dominées par le bruit de celles dominées par les entités) et sélectionne les paramètres du filtre en conséquence. Les zones planes sont lissées fortement ; les zones complexes sont filtrées doucement. La base mathématique utilise des tests statistiques pour identifier le caractère local : les zones dont la variance est inférieure au seuil sont fortement lissées ; celles qui le dépassent conservent leurs détails. Les caractéristiques clés comprennent une adaptation automatique des paramètres (l'utilisateur spécifie des plages ; l'algorithme choisit localement), une applicabilité à tout noyau de filtre (gaussien, médian, morphologique) et une efficacité sur l'imagerie optique et radar. Le filtrage adaptatif excelle dans le prétraitement de mosaïques satellitaires hétérogènes (capteurs et conditions d'acquisition différents), le lissage de nuages de points LiDAR (préservation des bords de végétation en forêt, lissage du sol en zone ouverte), la réduction sélective du chatoiement SAR respectant à la fois les cibles et le fond, et l'empilement d'images multitemporelles. En sortie, les zones homogènes subissent un filtrage intensif (faible variance locale → fort lissage) ; les zones complexes sont filtrées de manière conservatrice (variance élevée → traitement minimal). Le rayon de lissage s'ajuste dynamiquement par zone : les zones planes reçoivent un filtrage à grand rayon, les zones texturées un filtrage à petit rayon ou aucun filtrage. Les valeurs de sortie restent dans la plage d'entrée ; examinez la carte spatiale de l'intensité du filtrage pour valider l'adaptation. Les statistiques tendent vers les moyennes locales dans les zones lisses ; les zones complexes restent largement inchangées. Les artefacts courants comprennent un éventuel surlissage aux limites des zones (une transition douce est généralement appliquée) et une sensibilité aux relations bruit-variance. Vérifiez l'adaptation en analysant les cartes de variance locale. À appliquer dans des chaînes de prétraitement automatisées traitant des données multisources pour lesquelles un filtrage uniforme est insuffisant.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "filter_size_x": {
                "label": "Taille du filtre X",
                "description": "Largeur du voisinage en pixels (entier impair, par défaut 11)."
              },
              "filter_size_y": {
                "label": "Taille du filtre Y",
                "description": "Hauteur du voisinage en pixels (entier impair, par défaut 11)."
              },
              "threshold": {
                "label": "Seuil",
                "description": "Seuil de score z absolu pour le remplacement par la moyenne (par défaut 2.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "anisotropic_diffusion_filter": {
            "name": "Filtre de diffusion anisotrope",
            "description": "Le filtrage par diffusion anisotrope met en œuvre un lissage itératif préservant les contours via des processus de diffusion directionnelle qui distinguent contours et zones planes. L'algorithme met à jour itérativement chaque pixel selon des différences pondérées avec ses voisins, à l'aide d'une fonction de conductance qui réduit la diffusion à travers les limites à fort gradient tout en permettant le lissage au sein des zones homogènes. L'implémentation résout l'équation aux dérivées partielles ∂I/∂t = div(c(|∇I|)∇I), où la conductance c(·) s'adapte à la magnitude locale du gradient. Cette approche guidée par les données préserve les transitions nettes tout en réduisant progressivement le bruit dans les zones uniformes. Les caractéristiques clés comprennent une véritable préservation des contours sans masques de contours explicites, une sélection automatique de l'échelle via le nombre d'itérations, une réduction efficace du bruit maintenant la netteté des entités et une applicabilité aux données monobandes et multispectrales. La diffusion anisotrope excelle dans le lissage de nuages de points LiDAR préservant les ruptures de terrain, le débruitage d'images satellitaires pour la détection d'entités géologiques subtiles, la réduction du chatoiement SAR maintenant les bords des cibles radar et l'imagerie médicale/scientifique où la fidélité des contours est essentielle. L'interprétation des résultats suppose de comprendre que les zones lisses s'homogénéisent progressivement (les valeurs convergent vers la moyenne locale), tandis que les contours se raidissent jusqu'à se stabiliser. Les premières itérations (t<5) produisent une légère réduction du bruit ; les itérations intermédiaires (t=5-20) un lissage important ; des itérations excessives (t>50) risquent un sur-rehaussement des limites ou de fausses entités. Les valeurs de sortie restent dans les plages des données source ; les statistiques tendent vers les moyennes régionales au fil du traitement. Surveillez la variance de sortie pour évaluer le degré de lissage. Les métriques courantes comprennent l'amélioration du rapport signal/bruit et des indices de netteté des contours. À appliquer avec soin dans les flux multi-échelles où la précision de préservation des contours influe directement sur la précision de la classification ou de la détection de changements en aval.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "iterations": {
                "label": "Itérations",
                "description": "Nombre d'itérations de diffusion (par défaut 10)."
              },
              "kappa": {
                "label": "Kappa",
                "description": "Paramètre de sensibilité aux contours (par défaut 20.0)."
              },
              "lambda": {
                "label": "Lambda",
                "description": "Pas de temps dans (0, 0.25], par défaut 0.2."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "bilateral_filter": {
            "name": "Filtre bilatéral",
            "description": "Lissage bilatéral préservant les contours via des noyaux spatial + d'intensité. Supérieur au gaussien pour la préservation des détails. Sigma_dist=rayon, sigma_int=seuil de préservation des contours. Compatible RVB.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "sigma_dist": {
                "label": "Sigma de distance",
                "description": "Écart-type du noyau gaussien spatial en pixels (0.5–20.0, par défaut 0.75)."
              },
              "sigma_int": {
                "label": "Sigma d'intensité",
                "description": "Écart-type du noyau gaussien d'intensité en unités de valeurs du raster (par défaut 1.0)."
              },
              "treat_as_rgb": {
                "label": "Traiter comme RVB",
                "description": "Mettre à vrai pour forcer le traitement HSI du RVB compacté. Si faux, le RVB compacté peut toujours être détecté automatiquement à partir des métadonnées du raster."
              },
              "assume_three_band_rgb": {
                "label": "Supposer un RVB à trois bandes",
                "description": "Si vrai (par défaut), les rasters à 3 bandes uint8/uint16 peuvent être traités comme RVB dans les filtres prenant en charge le traitement d'intensité RVB à 3 bandes."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "closing": {
            "name": "Fermeture",
            "description": "Effectue une opération morphologique de fermeture à l'aide d'un élément structurant rectangulaire.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "filter_size_x": {
                "label": "Taille du filtre X",
                "description": "Largeur impaire du voisinage (par défaut 11)."
              },
              "filter_size_y": {
                "label": "Taille du filtre Y",
                "description": "Hauteur impaire du voisinage (par défaut identique à filter_size_x)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "conservative_smoothing_filter": {
            "name": "Filtre de lissage conservatif",
            "description": "Le lissage conservatif met en œuvre un filtrage non linéaire en remplaçant chaque pixel par la moyenne des voisins similaires (dans une plage d'intensité définie), préservant les contours tout en réduisant le bruit. L'implémentation examine les voisinages, identifie les pixels dont l'intensité est à moins d'un seuil de celle du pixel central et fait la moyenne de ces pixels de valeur similaire. Formulation mathématique : F = (1/N) Σ(I_j : |I_j - I_center| < T), où T est le seuil de similarité et N le nombre de pixels similaires. Les caractéristiques clés comprennent une définition simple de la similarité par seuil, une efficacité sur l'imagerie optique et radar, des paramètres interprétables (le seuil contrôle la netteté des contours) et un coût de calcul minimal. Le lissage conservatif excelle dans le prétraitement d'images satellitaires multispectrales (réduction du bruit tout en préservant les limites spectrales), le rehaussement d'images thermiques (lissage du bruit radiométrique tout en conservant les discontinuités de température), le lissage de classifications LiDAR (préservation des limites végétation/sol) et le prétraitement de données de levé bruitées. En sortie, les zones homogènes sont entièrement moyennées (tous les voisins sont similaires) ; les contours sont peu filtrés (seuls les pixels similaires du même côté comptent). Le paramètre de seuil contrôle la préservation des contours : un petit seuil (similarité stricte) produit un lissage léger ; un grand seuil (similarité lâche) un lissage agressif risquant de perdre les contours. Les valeurs de sortie proviennent exactement des valeurs des voisins en entrée (pas d'interpolation ; la sortie est une moyenne de valeurs existantes). Les statistiques tendent vers les groupes locaux ; les zones hétérogènes changent peu. Vérifiez l'efficacité du seuil par inspection visuelle et analyse de l'histogramme local. Les artefacts courants comprennent un lissage insuffisant si les seuils sont trop stricts et un flou des contours s'ils sont trop lâches. Le nombre d'itérations permet un filtrage progressif : une seule passe donne un lissage doux ; plusieurs passes intensifient l'effet. À appliquer avant la classification lorsqu'il faut réduire la confusion de catégories due au bruit tout en gardant des limites de classes nettes.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "filter_size_x": {
                "label": "Taille du filtre X",
                "description": "Largeur du voisinage en pixels (entier impair, par défaut 3)."
              },
              "filter_size_y": {
                "label": "Taille du filtre Y",
                "description": "Hauteur du voisinage en pixels (entier impair, par défaut 3)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "diff_of_gaussians_filter": {
            "name": "Filtre différence de gaussiennes",
            "description": "Le filtrage par différence de gaussiennes (DoG) détecte les contours et les entités fines en soustrayant deux versions floutées par des gaussiennes de rayons différents, créant un filtre passe-bande qui privilégie les fréquences spatiales intermédiaires. L'implémentation calcule deux flous gaussiens (petit rayon σ₁ et grand rayon σ₂), puis les soustrait : DoG = G(σ₁) - G(σ₂). Cette combinaison renforce les contours et les crêtes tout en supprimant à la fois le bruit fin et les tendances d'éclairement larges. Les caractéristiques clés comprennent une réponse en fréquence réglable (le rapport σ₂/σ₁ contrôle les caractéristiques du passe-bande), une sortie centrée sur zéro (bipolaire : valeurs positives et négatives), une applicabilité à la détection de contours et à l'extraction d'entités, et une efficacité de calcul par réutilisation des gaussiennes. La différence de gaussiennes excelle dans la détection de structures géologiques (failles et linéaments produisent une forte réponse DoG), l'extraction de bâtiments à partir d'orthophotos, le rehaussement des textures fines dans les mosaïques de télédétection et les modèles de traitement inspirés des neurosciences. En sortie, les contours produisent des réponses maximales (positives du côté clair, négatives du côté sombre) avec un passage par zéro précisément au niveau des transitions. La détection des passages par zéro révèle les vrais contours indépendamment de leur direction. La magnitude DoG indique la force des contours ; la plage typique va de -1000 à +1000 pour une entrée 8 bits selon le contraste local. Le rapport σ₂/σ₁ détermine le centre du passe-bande : un rapport ~2 privilégie les entités très fines ; ~5 les entités intermédiaires ; ~10 les entités plus grossières. Des distributions de sortie bimodales (pics aux extrêmes positif et négatif) indiquent une bonne séparation des contours. Les artefacts courants comprennent des halos autour des contours forts et une réponse potentiellement insuffisante si la bande de fréquences ne correspond pas à l'échelle des entités. Combinez-le avec un seuillage de magnitude pour l'extraction des contours. À appliquer avant un post-traitement morphologique pour une extraction robuste d'entités à partir d'imagerie satellitaire bruitée.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "filter_size_x": {
                "label": "Taille du filtre X",
                "description": "Sigma gaussien le plus petit (0.25-20.0, par défaut 2.0)."
              },
              "sigma2": {
                "label": "Sigma 2",
                "description": "Sigma gaussien le plus grand (0.5-20.0, par défaut 4.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "diversity_filter": {
            "name": "Filtre de diversité",
            "description": "Calcule la diversité en fenêtre mobile comme le nombre de valeurs/classes uniques dans le voisinage. Mesure l'hétérogénéité locale : diversité élevée = terrain/classes variés, diversité faible = homogène. Révèle la texture, la fragmentation et la diversité des motifs. Souvent appliqué à une imagerie classifiée ou catégorielle pour identifier les zones de transition/de bordure.\n\nLe filtre de diversité crée une métrique de variation locale indépendante des valeurs spécifiques. Utile en écologie du paysage (diversité des habitats, métriques de fragmentation), pour l'évaluation de la qualité de classification (diversité élevée = zones mixtes/incertaines) et l'analyse de texture. Appliquée aux données d'altitude, la diversité indique la rugosité à l'échelle du voisinage. Appliquée à une classification, elle identifie les zones mixtes, d'écotone ou de bordure.\n\nApplications : (1) cartographie de la fragmentation du paysage (diversité élevée = mosaïque variée, diversité faible = taches uniformes), (2) évaluation de la confiance/incertitude de classification (diversité élevée = zone incertaine), (3) analyse de texture (cartographie de l'hétérogénéité), (4) détection de contours/limites via les pics de diversité, (5) diversité des habitats pour l'analyse écologique (l'adéquation dépend de la diversité locale).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "filter_size_x": {
                "label": "Taille du filtre X",
                "description": "Largeur de la fenêtre en pixels (entier impair, par défaut 11). Alias : filterx."
              },
              "filter_size_y": {
                "label": "Taille du filtre Y",
                "description": "Hauteur de la fenêtre en pixels (entier impair, par défaut = filter_size_x). Alias : filtery."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "edge_preserving_mean_filter": {
            "name": "Filtre moyen préservant les contours",
            "description": "Le filtre de moyenne préservant les contours effectue une moyenne sélective des pixels en calculant des moyennes locales tout en excluant les pixels aberrants qui représentent probablement des contours ou du bruit. L'implémentation trie les voisinages de pixels, supprime les valeurs extrêmes (la plus basse et la plus haute, ou les valeurs dépassant un seuil statistique) et fait la moyenne des valeurs restantes. Cette approche robuste équilibre lissage et préservation de la netteté. Les variantes comprennent une moyenne pondérée privilégiant les pixels centraux et un choix de seuil adaptatif fondé sur les statistiques locales. Les caractéristiques clés comprennent un contrôle simple des paramètres (nombre d'exclusions ou seuil), une efficacité de calcul grâce au tri de petits voisinages, une réduction efficace du bruit sans flou des détails et une applicabilité aux données optiques, radar et thermiques. Le filtrage par moyenne préservant les contours excelle dans le prétraitement satellitaire optique pour le calcul d'indices de végétation (suppression des ombres et des nuages sans flouter les entités), le lissage de MNT préservant les ruptures de pente, le débruitage d'images thermiques conservant la netteté des limites et la préparation d'orthophotos pour la numérisation manuelle. En sortie, les valeurs aberrantes supprimées se concentrent aux contours et dans les zones bruitées ; les valeurs restantes sont moyennées, créant un lissage local. Les paramètres d'exclusion contrôlent la netteté des contours : exclure un seul extrême supprime le bruit poivre et sel ; exclure plusieurs extrêmes produit des résultats plus lisses avec une transition des contours plus douce. Les valeurs de sortie restent dans la plage d'entrée ; les statistiques tendent vers les moyennes des valeurs conservées. Surveillez la différence entre sortie et entrée pour identifier les zones filtrées (généralement à forte variance). La qualité de préservation des contours dépend de la précision de l'identification des valeurs aberrantes ; vérifiez visuellement que les entités restent nettes. Les artefacts courants comprennent un lissage inadéquat si les seuils sont trop stricts et un filtrage excessif si le nombre d'exclusions est trop élevé. Le nombre d'itérations permet un filtrage progressif ; une seule passe donne un lissage doux. À appliquer avant une classification par seuil pour réduire les erreurs de catégorie dues au bruit tout en conservant les limites des entités.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "filter_size": {
                "label": "Taille du filtre",
                "description": "Taille du voisinage carré en pixels (entier impair, par défaut 11)."
              },
              "threshold": {
                "label": "Seuil",
                "description": "Différence absolue maximale avec un voisin pour l'inclure dans la moyenne locale (par défaut 15.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "emboss_filter": {
            "name": "Filtre de repoussage",
            "description": "Le filtre d'estampage (emboss) rehausse les contours par un ombrage directionnel, créant un aspect de relief tridimensionnel caractéristique où les contours apparaissent comme des surfaces en saillie ou en creux selon la simulation d'éclairage directionnel. Ce filtre applique un noyau 3×3 combinant détection de contours et éclairage unidirectionnel, simulant généralement une lumière provenant du quadrant supérieur gauche, créant un contraste visuel marqué aux limites tout en préservant les zones lisses. La transformation d'estampage soustrait des valeurs de voisins pondérées dans des directions spécifiques, produisant une sortie où les hautes lumières et les ombres accentuent les discontinuités topographiques et des entités. Les caractéristiques clés comprennent un contrôle directionnel intuitif permettant d'ajuster la direction de la lumière simulée (variantes à huit directions), une intégration naturelle de la perception 3D améliorant l'interprétation visuelle et des performances robustes quelles que soient les conditions d'éclairage de l'imagerie source. Le filtre d'estampage sert à l'assurance qualité, à la visualisation interprétative et à la mise en valeur des limites d'entités. Les cas d'utilisation comprennent le rehaussement visuel pour l'interprétation géologique, où les limites minérales deviennent visibles sous forme de motifs en relief, l'interprétation de photographies aériennes améliorant la visibilité des limites subtiles, la production cartographique où des modèles numériques d'élévation estampés génèrent des cartes en relief saisissantes et la détection d'entités archéologiques où des structures enfouies apparaissent comme de subtiles variations topographiques. En sortie, les valeurs élevées correspondent aux surfaces éclairées et les valeurs faibles aux ombres, créant une profondeur perceptuelle que l'œil humain interprète naturellement comme un relief. La sortie estampée nécessite généralement une mise à l'échelle sur la plage de visualisation 0-255 ; la sortie brute contient souvent des valeurs négatives représentant les zones d'ombre. L'effet est purement visuel : l'estampage ne calcule pas un véritable éclairement et ne crée pas de dérivées d'altitude. Pour l'imagerie multispectrale, appliquez-le aux composantes principales ou à des bandes choisies selon les objectifs analytiques. Le post-traitement comprend souvent un rehaussement du contraste ou un mappage tonal optimisant l'impact visuel.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "direction": {
                "label": "Direction",
                "description": "Direction du relief : n,s,e,w,ne,nw,se,sw."
              },
              "clip_amount": {
                "label": "Quantité d'écrêtage",
                "description": "Pourcentage optionnel d'écrêtage symétrique des queues (0-40)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "fast_almost_gaussian_filter": {
            "name": "Filtre gaussien rapide approché",
            "description": "Le filtre quasi gaussien rapide offre un lissage approchant une gaussienne par filtrage itératif séparable en boîte (moyenne), obtenant une réponse de flou quasi gaussienne avec une complexité de calcul en O(N) quel que soit le rayon du flou. L'implémentation applique des convolutions en boîte successives (chacune calculant des moyennes locales de pixels) pour approcher la distribution gaussienne cumulée ; N itérations approchent des noyaux gaussiens de plus en plus grands. La base mathématique repose sur le théorème central limite : la convolution répétée de fonctions boîte tend asymptotiquement vers une distribution gaussienne. Les caractéristiques clés comprennent une vitesse de calcul permettant un lissage à grand noyau sur de grandes images, une implémentation séparable réduisant les besoins en mémoire, un contrôle des paramètres via le nombre d'itérations (qui contrôle le rayon du flou) et une efficacité sur tout type de données. Le filtrage quasi gaussien rapide excelle dans la construction rapide de pyramides d'images pour l'analyse multi-échelle, la navigation en temps réel dans l'imagerie satellitaire, le prétraitement de très grands jeux de données de télédétection avant classification et les visionneuses d'images interactives exigeant un lissage réactif. En sortie, le nombre d'itérations est directement lié au rayon du flou : N=1 produit un lissage minimal ; N=3-5 un flou modéré ; N>10 un fort lissage approchant des gaussiennes à grand noyau. Les valeurs de sortie tendent progressivement vers la moyenne locale à mesure que les itérations augmentent ; la réduction de variance suit des schémas prévisibles. Les valeurs restent dans les plages des données d'entrée. La comparaison avec un véritable filtrage gaussien montre une approximation acceptable, avec 2-5% d'erreur pour la plupart des applications. Le gain de vitesse par rapport au véritable filtrage gaussien augmente fortement pour les grands rayons : 5 à 20× plus rapide pour un rayon >20 pixels. Les artefacts mineurs comprennent de légères ondulations le long des contours (artefacts de boîte cumulés au fil des itérations) et une gestion des bords légèrement différente de celle de la gaussienne. Surveillez les histogrammes de sortie pour repérer des distributions multimodales indiquant un lissage suffisant. À appliquer dans les chaînes de prétraitement d'images où la vitesse justifie de faibles erreurs d'approximation.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "sigma": {
                "label": "Sigma",
                "description": "Sigma gaussien approximatif (>=1.8 recommandé, par défaut 1.8)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "flip_image": {
            "name": "Retourner l'image",
            "description": "Retourne une image verticalement, horizontalement ou dans les deux sens.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "direction": {
                "label": "Direction",
                "description": "Direction du retournement : vertical (par défaut), horizontal ou both."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "frangi_filter": {
            "name": "Filtre de Frangi",
            "description": "Effectue un rehaussement multi-échelle de la vascularité de Frangi pour détecter les structures de type vaisseau (tubulaires) à plusieurs échelles. Fondé sur l'analyse des valeurs propres de la matrice hessienne. Répond fortement aux entités linéaires (vaisseaux, routes, rivières) et faiblement aux structures de type blob. L'analyse multi-échelle (essai de plusieurs valeurs de sigma) détecte automatiquement les vaisseaux de différentes largeurs. Largement utilisé en imagerie médicale et en télédétection pour la détection d'entités linéaires. La vascularité de Frangi utilise les courbures principales (valeurs propres de la hessienne) pour classer la structure locale : vascularité élevée pour les entités linéaires, faible pour les plateaux ou les blobs. L'implémentation multi-échelle applique le filtre à plusieurs valeurs de sigma (largeur) et combine les réponses. Excellent pour détecter les routes, les rivières et les réseaux de vaisseaux. Coût de calcul modéré pour plusieurs échelles. Sortie très interprétable, qui répond à des entités reconnaissables. Applications : (1) détection des routes dans l'imagerie satellitaire, (2) extraction des réseaux de rivières/cours d'eau, (3) détection d'entités linéaires en général, (4) détection de vaisseaux (imagerie médicale), (5) détection de structures multi-échelles.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "scales": {
                "label": "Échelles",
                "description": "Liste d'échelles de type gaussien en pixels (par défaut [1.0, 2.0, 3.0])."
              },
              "beta": {
                "label": "Bêta",
                "description": "Paramètre bêta de Frangi pour la suppression des taches (par défaut 0.5)."
              },
              "c": {
                "label": "C",
                "description": "Paramètre c de Frangi pour la sensibilité aux structures (par défaut 15.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "gabor_filter_bank": {
            "name": "Banc de filtres de Gabor",
            "description": "Effectue un filtrage de réponse de Gabor multi-orientation, une analyse de texture directionnelle. Applique un banc de filtres de Gabor à plusieurs orientations (généralement 0°, 45°, 90°, 135°) pour extraire des caractéristiques de texture directionnelles. Les réponses de Gabor indiquent la force et l'orientation de la texture. Utile pour la détection d'entités directionnelles, la caractérisation de la texture et l'analyse de motifs orientés. Chaque orientation est produite séparément. Le filtrage de Gabor extrait la texture directionnelle par convolution avec des ondelettes propres à chaque orientation. Chaque orientation révèle les entités alignées dans cette direction. Produit plusieurs bandes (une par orientation) révélant la direction et la force locales de la texture. Les réponses de Gabor sont fondamentales pour l'extraction de caractéristiques de texture et la détection d'objets en vision par ordinateur. Le banc de filtres permet une analyse directionnelle complète. Applications : (1) analyse de texture directionnelle, (2) détection d'entités orientées (crêtes, vallées, structures linéaires), (3) cartographie directionnelle de l'érosion/du dépôt, (4) détection des routes/cours d'eau (entités linéaires), (5) classification fondée sur la texture.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "sigma": {
                "label": "Sigma",
                "description": "Sigma de l'enveloppe gaussienne en pixels (par défaut 2.0)."
              },
              "frequency": {
                "label": "Fréquence",
                "description": "Fréquence spatiale de la sinusoïde en cycles/pixel (par défaut 0.2)."
              },
              "orientations": {
                "label": "Orientations",
                "description": "Nombre d'orientations dans le banc de filtres (par défaut 6)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "gaussian_filter": {
            "name": "Filtre gaussien",
            "description": "Lissage gaussien mathématiquement optimal avec un noyau pondéré par la distance. Fondamental pour l'analyse multi-échelle, la détection de contours et le filtrage passe-bande. Le paramètre sigma contrôle l'intensité du lissage ; compatible RVB.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "sigma": {
                "label": "Sigma",
                "description": "Écart-type gaussien en pixels (0.5-20.0, par défaut 0.75)."
              },
              "treat_as_rgb": {
                "label": "Traiter comme RVB",
                "description": "Mettre à vrai pour forcer le comportement dans l'espace d'intensité RVB."
              },
              "assume_three_band_rgb": {
                "label": "Supposer un RVB à trois bandes",
                "description": "Si vrai (par défaut), les rasters à 3 bandes uint8/uint16 peuvent être traités comme RVB si les métadonnées explicites sont absentes."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "glcm_texture": {
            "name": "Texture GLCM",
            "description": "L'analyseur de texture par matrice de cooccurrence des niveaux de gris (GLCM) extrait des mesures statistiques de texture du second ordre quantifiant les relations spatiales entre les niveaux de gris des pixels à des distances et directions de déplacement spécifiées, permettant une classification de texture élaborée distinguant les motifs de végétation agricole, les structures du bâti et les formations géologiques. La GLCM calcule des matrices de probabilité indiquant la fréquence à laquelle des paires de niveaux de gris apparaissent à des décalages fixes, et calcule quatre statistiques canoniques de Haralick : le contraste (variation locale), la corrélation (dépendance linéaire), l'homogénéité (proximité de la diagonale) et l'énergie (uniformité). L'outil prend en charge huit décalages directionnels (0°, 45°, 90°, 135° et leurs opposés), offrant une sensibilité directionnelle de la texture pour détecter des motifs orientés comme les rangs de cultures, les alignements de bâtiments ou les structures géologiques. Les caractéristiques clés comprennent une analyse multidirectionnelle révélant les propriétés anisotropes de la texture, un réglage du paramètre de déplacement optimisant la sensibilité à l'échelle, le calcul simultané de plusieurs mesures de texture réduisant le coût de traitement et une capacité intrinsèque à distinguer des propriétés de surface visuellement subtiles. Les cas d'utilisation couvrent l'agriculture de précision (classification des types de cultures, détection des limites de parcelles, évaluation du stress des cultures), l'analyse urbaine (cartographie de la densité du bâti, extraction des surfaces imperméables) et la télédétection géologique (discrimination des types de roches, reconnaissance de motifs structuraux). Les applications comprennent la classification de l'occupation du sol combinant caractéristiques spectrales et texturales, l'analyse d'images orientée objet améliorant la précision de classification, le contrôle qualité détectant les artefacts instrumentaux de l'imagerie satellitaire et la détection de changements isolant les modifications significatives du bruit du capteur. L'interprétation des résultats suppose de comprendre la signification de chaque statistique : un contraste élevé indique des textures rugueuses/variées ; une corrélation élevée des motifs linéaires ; une homogénéité élevée des textures uniformes ; une énergie élevée des motifs ordonnés et répétitifs. Les bandes de sortie peuvent être combinées en indices de texture (par ex. l'homogénéité GLCM divisée par le contraste met en valeur les zones homogènes). Les modes d'agrégation directionnelle (moyenne/min/max/séparé) influent sur la dimensionnalité et l'interprétation de la sortie. L'analyse de texture typique utilise simultanément plusieurs mesures GLCM pour une classification robuste.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster monobande en entrée."
              },
              "window_size": {
                "label": "Taille de fenêtre",
                "description": "Taille impaire de la fenêtre glissante en pixels (par défaut 7)."
              },
              "distance": {
                "label": "Distance",
                "description": "Distance en pixels pour les décalages des paires de co-occurrence (par défaut 1)."
              },
              "angles": {
                "label": "Angles",
                "description": "Angles séparés par des virgules parmi 0,45,90,135 (par défaut '0,45,90,135')."
              },
              "features": {
                "label": "Entités",
                "description": "Caractéristiques séparées par des virgules : contrast,dissimilarity,homogeneity,asm,energy,entropy,mean,variance,correlation."
              },
              "direction_aggregation": {
                "label": "Agrégation des directions",
                "description": "Mode d'agrégation des directions : mean (par défaut), min, max, range, separate."
              },
              "levels": {
                "label": "Niveaux",
                "description": "Nombre de niveaux de quantification (par défaut 32 ; plage 8-128)."
              },
              "symmetric": {
                "label": "Symétrique",
                "description": "Si vrai (par défaut), construit des GLCM symétriques."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel (GeoTIFF multibande)."
              }
            }
          },
          "guided_filter": {
            "name": "Filtre guidé",
            "description": "Le filtre guidé met en œuvre un lissage préservant les contours en contraignant les sorties du filtre à des relations localement linéaires avec une image guide, généralement l'image d'origine ou une couche de référence associée. L'implémentation divise l'image en régions rectangulaires qui se chevauchent et calcule des paramètres de régression linéaire dans chacune afin d'imposer la régularité de la sortie tout en respectant la structure de l'image guide. La formulation mathématique minimise ||Fᵢ - a·Gᵢ - b||² + ε||a||², où Fᵢ est la sortie filtrée, Gᵢ l'image guide et (a, b) les paramètres localement linéaires. Les caractéristiques clés comprennent une grande souplesse (l'image guide peut être indépendante de l'image filtrée), une efficacité de calcul grâce à une implémentation séparable en O(N), un contrôle des paramètres permettant d'ajuster l'intensité de préservation des contours et une efficacité avec un guidage monobande ou multispectral. Le filtrage guidé excelle dans les flux de fusion multicapteur où les données optiques guident le débruitage SAR, l'affinage de classifications LiDAR à l'aide d'orthophotos simultanées, la suppression des ombres/nuages dans les mosaïques satellitaires à l'aide d'images de référence temporelles et le rehaussement des détails dans les tâches de régularisation cartographique. En sortie, les zones filtrées restent localement similaires à la structure de l'image guide tandis que l'intensité est moyennée au sein des zones homogènes. Le rayon de lissage contrôle l'étendue spatiale (rayon plus grand = lissage plus fort) ; le paramètre de régularisation ε équilibre régularité et fidélité à la structure (ε plus grand = plus lisse, ε plus petit = plus de détails). Les plages de sortie correspondent à l'entrée ; une comparaison visuelle avec l'image guide valide la fidélité de préservation des contours. Les artefacts courants comprennent un surlissage aux fortes discontinuités (choisir des paramètres appropriés) et un lissage insuffisant dans les zones pauvres en information de guidage (vérifier la qualité de l'image guide). Surveillez la corrélation croisée entre la sortie filtrée et l'image guide pour évaluer la qualité de l'alignement. À appliquer de façon ciblée dans les flux de fusion, d'accentuation et de reconstruction d'images où l'information de contours d'une source guide le filtrage d'une autre.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "radius": {
                "label": "Rayon",
                "description": "Rayon de la fenêtre du filtre guidé en pixels (par défaut 4)."
              },
              "epsilon": {
                "label": "Epsilon",
                "description": "Paramètre de régularisation de la variance locale (par défaut 0.01)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "high_pass_bilateral_filter": {
            "name": "Filtre bilatéral passe-haut",
            "description": "Calcule un résidu passe-haut en soustrayant un lissage bilatéral du raster en entrée.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "sigma_dist": {
                "label": "Sigma de distance",
                "description": "Écart-type du noyau gaussien spatial (distance), en pixels (0.5–20.0, par défaut 0.75)."
              },
              "sigma_int": {
                "label": "Sigma d'intensité",
                "description": "Écart-type du noyau gaussien d'intensité, en unités de valeurs du raster (par défaut 1.0)."
              },
              "treat_as_rgb": {
                "label": "Traiter comme RVB",
                "description": "Mettre à vrai pour forcer le filtrage de l'intensité HSI des rasters RVB compactés avant la différenciation passe-haut."
              },
              "assume_three_band_rgb": {
                "label": "Supposer un RVB à trois bandes",
                "description": "Si vrai (par défaut), et en l'absence de métadonnées de couleur explicites, autorise l'interprétation RVB des rasters à 3 bandes uint8/uint16."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "high_pass_filter": {
            "name": "Filtre passe-haut",
            "description": "Le filtre passe-haut isole les composantes spatiales haute fréquence de l'imagerie en soustrayant une version basse fréquence (lissée) de l'image d'origine. Mathématiquement, on convolue l'image avec un noyau conçu pour renforcer les gradients et supprimer les variations tonales larges. L'implémentation utilise soit une convolution directe, soit un traitement dans le domaine fréquentiel selon la taille du noyau et les dimensions de l'image. Le filtre renforce les contours, les détails de texture fins et les variations à petite échelle tout en supprimant les tendances d'éclairement à grande échelle. Parmi ses caractéristiques distinctives figurent la préservation du contraste des contours sans artefacts de bord, une atténuation sélective des fréquences selon le rayon du noyau et une applicabilité directe à l'imagerie en niveaux de gris comme multispectrale. Le filtrage passe-haut est précieux pour l'analyse du terrain lorsque des entités topographiques subtiles doivent être renforcées, l'accentuation de l'imagerie satellitaire pour l'interprétation visuelle, la détection de structures géologiques à petite échelle et le prétraitement des données pour la classification par apprentissage automatique. Il est aussi essentiel pour préparer des orthophotos à la détection de changements et pour rehausser les produits dérivés du LiDAR. L'interprétation des résultats suppose de comprendre que les valeurs positives indiquent des maxima locaux (contours clairs) et les valeurs négatives des minima locaux (contours sombres). La plage typique est de ±100 pour une imagerie 8 bits ; une sortie de moyenne nulle indique une extraction réussie des hautes fréquences. Les artefacts courants comprennent des oscillations (ringing) aux fortes discontinuités et un bruit amplifié si l'imagerie source est bruitée. L'interprétation de l'échelle dépend du rayon du noyau : les petits noyaux renforcent la texture fine (pixels individuels), les grands noyaux les entités d'échelle moyenne (variations du terrain sur des dizaines de pixels). Surveillez les statistiques de sortie ; un centrage excessif sur zéro indique un possible surtraitement. À appliquer avec les résultats passe-bas complémentaires pour reconstruire l'original ou dans des flux de décomposition multi-échelle.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "filter_size_x": {
                "label": "Taille du filtre X",
                "description": "Largeur de la fenêtre en pixels (entier impair, par défaut 11). Alias : filterx."
              },
              "filter_size_y": {
                "label": "Taille du filtre Y",
                "description": "Hauteur de la fenêtre en pixels (entier impair, par défaut = filter_size_x). Alias : filtery."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "high_pass_median_filter": {
            "name": "Filtre médian passe-haut",
            "description": "Effectue un filtrage passe-haut en soustrayant la médiane locale des valeurs centrales : sortie = pixel - médiane_voisinage. Combine le filtrage passe-haut (renforcement des détails) et la robustesse de la médiane (suppression du bruit). Sortie centrée sur zéro (négative = plus sombre que l'environnement, positive = plus claire). Plus robuste aux valeurs aberrantes qu'un passe-haut gaussien. Le résidu passe-haut révèle les écarts locaux par rapport à la tendance médiane. Particulièrement robuste pour les données bruitées : la médiane est plus stable que la moyenne face aux valeurs aberrantes. La sortie met en valeur la variation à échelle fine. Souvent appliqué à des versions lissées par gaussienne (crée un filtre passe-bande). Utile pour le rehaussement de texture et l'extraction d'entités à partir d'imagerie bruitée. Applications : (1) rehaussement de texture à partir de données bruitées, (2) extraction de détails avant classification, (3) détection robuste d'entités, (4) prétraitement pour la segmentation fondée sur la texture, (5) prétraitement SAR.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "filter_size_x": {
                "label": "Taille du filtre X",
                "description": "Largeur du voisinage en pixels (entier impair, par défaut 11)."
              },
              "filter_size_y": {
                "label": "Taille du filtre Y",
                "description": "Hauteur du voisinage en pixels (entier impair, par défaut 11)."
              },
              "sig_digits": {
                "label": "Chiffres significatifs",
                "description": "Chiffres significatifs utilisés pour le classement de l'histogramme (par défaut 2)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "integral_image_transform": {
            "name": "Transformée en image intégrale",
            "description": "Calcule une transformation en table de sommes cumulées (image intégrale) pour chaque bande.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "k_nearest_mean_filter": {
            "name": "Filtre de moyenne des K plus proches",
            "description": "Effectue un lissage par moyenne des k plus proches voisins préservant les contours : trie le voisinage selon la distance à la valeur centrale et fait la moyenne des k valeurs les plus proches. Approche hybride préservant les contours par pondération de similarité. Le pixel central et les k-1 voisins les plus similaires sont moyennés. Plus élaboré qu'un k-NN simple (prend en compte à la fois la similarité spatiale et d'intensité). Efficace en calcul par rapport au filtre bilatéral. L'approche des k plus proches sélectionne les voisins de manière adaptative : les valeurs de pixels proches du centre sont moyennées, les pixels dissemblables ignorés. Le paramètre k contrôle le lissage : k=1 (aucun lissage), k=n (tous les voisins = filtre moyen). Généralement k=n/2 (la moitié du voisinage). Alternative efficace au filtre bilatéral, avec une préservation des contours similaire pour un coût de calcul moindre. Particulièrement utile pour les images présentant de fortes discontinuités d'intensité. Applications : (1) lissage préservant les contours (alternative au bilatéral), (2) prétraitement rapide pour la classification, (3) prétraitement lorsque l'efficacité est critique, (4) filtrage d'images multibandes. Paramètres typiques : k=taille_voisinage/2 à 3/4.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "filter_size_x": {
                "label": "Taille du filtre X",
                "description": "Largeur du voisinage en pixels (entier impair, par défaut 3)."
              },
              "filter_size_y": {
                "label": "Taille du filtre Y",
                "description": "Hauteur du voisinage en pixels (entier impair, par défaut 3)."
              },
              "k": {
                "label": "K",
                "description": "Nombre de plus proches voisins à moyenner (par défaut 5)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "kuwahara_filter": {
            "name": "Filtre de Kuwahara",
            "description": "Le filtre de Kuwahara met en œuvre un lissage non linéaire préservant les contours en divisant le voisinage de chaque pixel en quatre quadrants, en calculant des statistiques dans chacun et en retenant comme valeur de sortie le quadrant de plus faible variance. L'implémentation partitionne une fenêtre (2k+1)×(2k+1) en quatre sous-fenêtres k×k qui se chevauchent, calcule la moyenne et la variance de chaque quadrant et produit la moyenne du quadrant de variance minimale. Cette approche fondée sur le rang lisse les zones homogènes tout en accentuant les contours. Les caractéristiques clés comprennent une véritable préservation des contours par sélection des quadrants (les contours entre quadrants empêchent le flou de la sortie), une simplicité de calcul ne nécessitant que des calculs de moyenne/variance, un contrôle des paramètres via la taille de quadrant k et une efficacité sur l'imagerie optique, radar et thermique. Le filtrage de Kuwahara excelle dans le lissage de MNT dérivés du LiDAR préservant escarpements et terrasses, l'extraction de réseaux routiers à partir d'imagerie haute résolution conservant la netteté des axes, la délimitation des emprises de bâtiments à partir de photos aériennes et la détection des limites de nappes d'hydrocarbures dans l'imagerie SAR. En sortie, les zones homogènes produisent le quadrant qui moyenne naturellement (variance la plus faible) ; les contours produisent le quadrant contenant la structure uniforme la plus proche du contour, ancrant de fait la sortie du côté le plus net. La taille de quadrant k contrôle la préservation des détails : k=1 (lissage minimal) préserve les contours fins ; k=3-4 offre un équilibre entre lissage et préservation des contours ; k>5 risque une perte de détails. Les valeurs de sortie correspondent exactement aux valeurs des pixels d'entrée des quadrants sélectionnés (pas d'interpolation). Surveillez les histogrammes de sortie pour repérer des distributions bimodales (contours et zones homogènes nettement séparés) ; des distributions unimodales suggèrent un flou des contours. Appliquez une accentuation complémentaire en cas de surlissage. Les artefacts courants comprennent un biais directionnel dépendant de l'alignement des quadrants et un effet de blocs près des contours faibles. À utiliser en prétraitement pour la segmentation lorsque la préservation des contours garantit une extraction précise des limites.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "radius": {
                "label": "Rayon",
                "description": "Rayon des quadrants de Kuwahara en pixels (par défaut 2)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "lee_filter": {
            "name": "Filtre de Lee",
            "description": "Le filtre de Lee réduit le chatoiement SAR à l'aide du modèle multiplicatif de Lee, supposant que les échos radar suivent un bruit multiplicatif : I = S·N, où S est le signal et N le bruit multiplicatif. L'implémentation calcule des moyennes et variances locales, estime la variance du chatoiement, puis filtre selon : F = μ + (1 - σₙ²/σ_I²)·(I - μ), où σₙ² est la variance du chatoiement et σ_I² la variance totale. Cette approche fondée sur un modèle préserve les entités à forte cohérence tout en supprimant le chatoiement. Les caractéristiques clés comprennent un modèle de bruit propre au SAR (multiplicatif plutôt que gaussien), la préservation des cibles ponctuelles et des contours, une interprétation simple des paramètres (la taille de fenêtre contrôle la mesure de cohérence) et une efficacité éprouvée sur le SAR à polarisation simple et multiple. Le filtrage de Lee excelle dans le prétraitement SAR pour le suivi agricole, la classification forestière, la surveillance de la surface des océans et les flux de cartographie des inondations. En sortie, les zones à forte cohérence (cibles ponctuelles, contours forts) sont peu filtrées ; les zones à faible cohérence (bruit de chatoiement, limites faibles) sont filtrées fortement. L'estimation de la variance du chatoiement influe sur la sortie : une estimation précise exige suffisamment de pixels homogènes ; une variance sous-estimée entraîne un lissage insuffisant, une variance surestimée un surlissage. La taille de fenêtre contrôle la résolution de la mesure de cohérence : les petites fenêtres (3×3) préservent les détails fins ; les grandes fenêtres (7×7) améliorent l'estimation de la variance mais risquent une perte de détails. La mise à l'échelle de la sortie correspond à l'entrée ; une visualisation logarithmique améliore la lisibilité. La réduction de bruit typique atteint une diminution de variance de 5-10 dB selon le nombre de vues. Surveillez l'histogramme de sortie pour repérer une signature de chatoiement résiduelle ; des distributions lisses suggèrent un filtrage adéquat. Les artefacts comprennent un possible flou des contours dans les zones à faible cohérence et un biais directionnel sur les entités linéaires. À appliquer de façon ciblée dans les classifications SAR exigeant la suppression du chatoiement tout en préservant l'intégrité des caractéristiques de classification.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "filter_size_x": {
                "label": "Taille du filtre X",
                "description": "Largeur du voisinage en pixels (entier impair, par défaut 11)."
              },
              "filter_size_y": {
                "label": "Taille du filtre Y",
                "description": "Hauteur du voisinage en pixels (entier impair, par défaut 11)."
              },
              "sigma": {
                "label": "Sigma",
                "description": "Demi-largeur d'inclusion d'intensité autour de la valeur centrale (par défaut 10.0)."
              },
              "m_value": {
                "label": "Valeur M",
                "description": "Nombre minimal d'échantillons dans la plage avant le moyennage de repli (par défaut 5.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "line_detection_filter": {
            "name": "Filtre de détection de lignes",
            "description": "Le filtre de détection de lignes est un détecteur de contours spécialisé conçu pour renforcer les entités linéaires (routes, rivières, lignes électriques et linéaments géologiques) selon quatre directions principales (horizontale, verticale et les deux diagonales), en appliquant des noyaux de convolution directionnels optimisés pour la connectivité et la continuité des lignes. Ce filtre emploie des noyaux 3×3 qui mettent en valeur les structures linéaires alignées sur chaque direction tout en supprimant le bruit perpendiculaire et les variations aléatoires. L'approche directionnelle sépare les détections par orientation, permettant aux applications en aval de distinguer les infrastructures horizontales (pipelines, limites de parcelles) des structures verticales (rangées d'arbres, corridors de réseaux). Les caractéristiques clés comprennent une décomposition multidirectionnelle générant des bandes distinctes de magnitude et de direction, un réglage adaptatif de la sensibilité aux variations de largeur et de contraste des lignes et des performances exceptionnelles sur des entités linéaires subtiles intégrées dans un terrain complexe. Les cas d'utilisation couvrent la cartographie des infrastructures (routes, voies ferrées, lignes électriques), l'extraction d'entités naturelles (cours d'eau, crêtes, failles) et la délimitation des limites d'utilisation du sol. Les applications comprennent le prétraitement de conversion vectorielle pour la numérisation cadastrale, l'extraction des réseaux de transport à partir d'orthophotographies, la cartographie des structures géologiques à partir d'imagerie satellitaire et la reconnaissance de formes en télédétection. L'interprétation des résultats suppose de comprendre que chaque composante directionnelle révèle la force des lignes dans cette orientation : examinez les quatre sorties pour identifier les directions prédominantes des entités. Des magnitudes plus élevées indiquent une meilleure continuité des lignes ; des valeurs faibles suggèrent du bruit ou des interruptions. La sortie est naturellement éparse et ne met en évidence que les pixels représentant des entités linéaires ; les zones de fond restent proches de zéro. La sortie multidirectionnelle permet une post-classification distinguant les routes (généralement horizontales/verticales en zone bâtie) des linéaments naturels (orientation arbitraire). Combinez les composantes directionnelles pour générer une carte de lignes unifiée ou analysez chaque direction séparément pour cartographier les structures orientées.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "variant": {
                "label": "Variante",
                "description": "Variante de direction de ligne : v, h, 45 ou 135."
              },
              "abs_values": {
                "label": "Valeurs absolues",
                "description": "Si vrai, produit les valeurs de réponse absolues."
              },
              "clip_tails": {
                "label": "Écrêter les queues",
                "description": "Pourcentage optionnel d'écrêtage symétrique des queues (0-40)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "line_thinning": {
            "name": "Amincissement de lignes",
            "description": "Réduit les entités raster binaires connexes à des lignes de squelette d'une cellule de large.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "lidar_ground_point_filter": {
            "name": "Filtre de points sol LiDAR",
            "description": "Sépare le terrain des points hors sol : classification/filtrage fondé sur la pente à l'aide de la géométrie de plans locaux et de seuils de hauteur. Segmentation efficace du sol.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "search_radius": {
                "label": "Rayon de recherche",
                "description": "Rayon de recherche du voisinage (par défaut 2.0)."
              },
              "min_neighbours": {
                "label": "Voisins minimaux",
                "description": "Nombre minimal de voisins cible (par défaut 0)."
              },
              "slope_threshold": {
                "label": "Seuil de pente",
                "description": "Seuil de pente en degrés (par défaut 45.0, max 88)."
              },
              "height_threshold": {
                "label": "Seuil de hauteur",
                "description": "Séparation verticale minimale pour signaler un point hors terrain (par défaut 1.0)."
              },
              "classify": {
                "label": "Classer",
                "description": "Si vrai, classe les points (sol=2, hors terrain=1) ; sinon filtre les points hors terrain."
              },
              "slope_norm": {
                "label": "Normalisation par la pente",
                "description": "Si vrai, applique une normalisation du terrain par chapeau haut de forme avant le test de pente (par défaut true)."
              },
              "height_above_ground": {
                "label": "Hauteur au-dessus du sol",
                "description": "Si vrai, produit les valeurs z comme hauteur locale au-dessus du voisin inférieur le plus proche."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel pour le mode à entrée unique."
              }
            }
          },
          "majority_filter": {
            "name": "Filtre majoritaire",
            "description": "Calcule le mode (valeur/classe la plus fréquente) en fenêtre mobile pour chaque pixel. Filtre non linéaire préservant les limites catégorielles et les motifs dominants. Particulièrement utile pour l'imagerie classifiée, dont la sortie doit rester dans l'ensemble de classes d'origine (contrairement au filtre moyen qui crée des valeurs interpolées). Essentiel pour le nettoyage morphologique des sorties de classification.\n\nLe filtrage majoritaire est l'équivalent modal du filtrage médian. Pour les données catégorielles (imagerie classifiée, occupation du sol), il préserve les définitions de classes tout en lissant le bruit. Pour les données continues, il peut révéler des pics locaux dans la distribution des valeurs. Souvent suivi de l'élimination des classes minoritaires (nettoyage post-classification) pour supprimer les artefacts de classification « poivre et sel ».\n\nApplications : (1) lissage post-classification (suppression des petites taches de classes parasites), (2) carte de classe majoritaire à partir de sorties multiclassifiées, (3) nettoyage de données vectorielles (désagrégation des classes), (4) suppression du bruit dans l'imagerie seuillée, (5) lissage attributaire des sorties de segmentation. Flux de travail typique : classifier→filtre majoritaire→élimination des minoritaires→carte finale nettoyée.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "filter_size_x": {
                "label": "Taille du filtre X",
                "description": "Largeur de la fenêtre en pixels (entier impair, par défaut 11). Alias : filterx."
              },
              "filter_size_y": {
                "label": "Taille du filtre Y",
                "description": "Hauteur de la fenêtre en pixels (entier impair, par défaut = filter_size_x). Alias : filtery."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "maximum_filter": {
            "name": "Filtre maximum",
            "description": "Calcule la valeur maximale en fenêtre mobile, révélant les pics et crêtes locaux. Opérateur de dilatation en traitement morphologique d'images. Utile pour détecter les pics, les lignes de crête et les entités d'amplitude maximale. Sensible à une seule valeur aberrante (une valeur élevée dans la fenêtre produit une sortie élevée).\n\nLe filtre maximum est l'opérateur morphologique de « dilatation » : il étend les zones claires et réduit les zones sombres. Appliqué de façon répétée (dilatation multipasse), il crée des pics lissés et les entités isolées s'étendent jusqu'à remplir leur voisinage. Combiné au filtre minimum, il permet la fermeture (dilatation puis érosion) et l'ouverture (érosion puis dilatation). Essentiel pour la détection morphologique d'entités et l'analyse multi-échelle.\n\nApplications : (1) dilatation morphologique pour un filtrage fondé sur la taille, (2) fermeture par dilatation→érosion pour combler les petits trous, (3) identification des pics/crêtes dans le terrain et l'imagerie, (4) niveau plafond local en bathymétrie/MNT, (5) analyse multi-échelle d'entités (comparaison de la dilatation entre échelles). Flux de travail typique : maximum→comparaison avec le minimum→fermeture ou ouverture selon le type d'entité.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "filter_size_x": {
                "label": "Taille du filtre X",
                "description": "Largeur de la fenêtre en pixels (entier impair, par défaut 11). Alias : filterx."
              },
              "filter_size_y": {
                "label": "Taille du filtre Y",
                "description": "Hauteur de la fenêtre en pixels (entier impair, par défaut = filter_size_x). Alias : filtery."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "mean_filter": {
            "name": "Filtre moyen",
            "description": "Calcule la moyenne en fenêtre mobile pour chaque pixel. Opération de lissage fondamentale réduisant le bruit local tout en estompant les transitions nettes. La sortie représente la tendance centrale locale. Largement utilisé pour le prétraitement, la réduction du bruit et l'analyse multi-échelle.\n\nLe filtrage par la moyenne est l'opération de lissage passe-bas la plus courante. Très sensible aux valeurs aberrantes (les valeurs extrêmes peuvent fausser les résultats), ce qui rend le filtre médian préférable pour les données bruitées. Efficace en calcul. La taille du filtre contrôle l'ampleur du lissage : petite (3×3), elle préserve les détails ; grande (31×31+), elle crée une surface fortement lissée. Souvent appliqué de façon itérative ou à plusieurs échelles pour l'analyse multirésolution.\n\nApplications : (1) réduction du bruit de base, (2) prétraitement avant la détection d'entités (lissage des faux positifs), (3) analyse multi-échelle (application en 3×3, 11×11, 31×31), (4) lissage temporel (combinaison de scènes), (5) base pour d'autres opérations statistiques. Comparez avec la médiane (non linéaire, préserve les contours) pour une meilleure préservation des contours.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "filter_size_x": {
                "label": "Taille du filtre X",
                "description": "Largeur de la fenêtre en pixels (entier impair, par défaut 11). Alias : filterx."
              },
              "filter_size_y": {
                "label": "Taille du filtre Y",
                "description": "Hauteur de la fenêtre en pixels (entier impair, par défaut = filter_size_x). Alias : filtery."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "median_filter": {
            "name": "Filtre médian",
            "description": "Calcule la valeur médiane en fenêtre mobile pour chaque pixel, en la remplaçant par le 50e percentile du voisinage. Filtre de bruit robuste préservant les contours (non linéaire). Particulièrement efficace pour supprimer le bruit impulsionnel (poivre et sel) tout en conservant des limites nettes. Les valeurs de sortie sont des valeurs réelles de pixels du voisinage (non interpolées).\n\nLe filtrage médian est non linéaire : c'est un avantage décisif sur le filtrage par la moyenne pour la réduction du bruit, car il ne crée pas de nouvelles valeurs et n'estompe pas les contours. Les grandes tailles de filtre lissent fortement tout en préservant les transitions nettes. Largement utilisé en télédétection, en imagerie médicale et en traitement d'images SAR. Le coût de calcul augmente avec la taille du filtre, mais reste généralement inférieur à celui des filtres bilatéral ou guidé.\n\nApplications : (1) réduction du chatoiement des images SAR (particulièrement efficace pour la cohérence de phase), (2) suppression du bruit poivre et sel, (3) prétraitement avant la détection de contours (réduction des faux contours), (4) préservation des limites dans le prétraitement pour la classification, (5) correction radiométrique des valeurs aberrantes. Flux de travail typique : appliquer la médiane→sortie aux contours rehaussés→seuillage pour l'extraction d'entités.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "filter_size_x": {
                "label": "Taille du filtre X",
                "description": "Largeur de la fenêtre en pixels (entier impair, par défaut 11). Alias : filterx."
              },
              "filter_size_y": {
                "label": "Taille du filtre Y",
                "description": "Hauteur de la fenêtre en pixels (entier impair, par défaut = filter_size_x). Alias : filtery."
              },
              "sig_digits": {
                "label": "Chiffres significatifs",
                "description": "Nombre de chiffres significatifs utilisés pour le filtrage de rang quantifié (par défaut 2)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "minimum_filter": {
            "name": "Filtre minimum",
            "description": "Calcule la valeur minimale en fenêtre mobile, révélant les creux et dépressions locaux. Opérateur d'érosion en traitement morphologique d'images. Utile pour détecter les fonds de vallée, les dépressions et les entités d'altitude minimale. Sensible à une seule valeur aberrante (une valeur faible dans la fenêtre produit une sortie faible).\n\nLe filtre minimum est l'opérateur morphologique d'« érosion » : il réduit les zones claires et étend les zones sombres. Appliqué de façon répétée (érosion multipasse), il crée des vallées lissées et les entités isolées disparaissent. Combiné au filtre maximum (dilatation), il permet les opérations d'ouverture (érosion puis dilatation) et de fermeture (dilatation puis érosion). Souvent utilisé en décomposition multi-échelle : comparez le minimum en 3×3, 11×11, 31×31 pour identifier les échelles des entités.\n\nApplications : (1) érosion morphologique pour un filtrage fondé sur la taille, (2) ouverture par érosion→dilatation pour supprimer les petits objets de bruit, (3) identification des dépressions/vallées dans le terrain, (4) niveau plancher local en bathymétrie/MNT, (5) analyse multi-échelle d'entités (comparaison de l'érosion entre échelles). Flux de travail typique : minimum→comparaison avec le maximum→ouverture ou fermeture selon le type d'entité.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "filter_size_x": {
                "label": "Taille du filtre X",
                "description": "Largeur de la fenêtre en pixels (entier impair, par défaut 11). Alias : filterx."
              },
              "filter_size_y": {
                "label": "Taille du filtre Y",
                "description": "Hauteur de la fenêtre en pixels (entier impair, par défaut = filter_size_x). Alias : filtery."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "non_local_means_filter": {
            "name": "Filtre de moyennes non locales",
            "description": "Le filtrage par moyennes non locales (non-local means) effectue un débruitage puissant en faisant la moyenne de patchs similaires identifiés sur toute l'image plutôt que des pixels voisins, exploitant l'autosimilarité de l'image pour supprimer le bruit tout en préservant les structures. L'implémentation identifie les patchs similaires à chaque patch cible par distance euclidienne dans l'espace des patchs, pondère exponentiellement les patchs selon leur similarité et fait la moyenne des patchs pondérés. L'algorithme calcule : Fᵢ = (1/Z) Σⱼ exp(-d(Pᵢ, Pⱼ)²/h²) · Iⱼ, où d mesure la distance entre patchs, h contrôle la largeur de bande et Z normalise. Les caractéristiques clés comprennent un débruitage supérieur grâce à la recherche de similarité plutôt qu'à la seule proximité spatiale, une efficacité sur les textures complexes et les détails fins, une applicabilité à tout type de données et des performances éprouvées sur l'imagerie médicale, satellitaire et photographique. Le filtrage par moyennes non locales excelle dans la restauration détaillée d'images satellitaires préservant la texture et la structure fines, la moyenne de piles multitemporelles pour préparer la détection de changements, le débruitage de données de levé très bruitées (ultrasons, hyperspectral) et le rehaussement d'imagerie de levés archéologiques/aériens. L'interprétation des résultats suppose de comprendre que les zones similaires de toute l'image contribuent à chaque pixel de sortie ; les zones localement dissemblables contribuent de façon négligeable. La taille des patchs contrôle la préservation des entités (patchs plus grands = résultats plus lisses, patchs plus fins = plus de détails) ; la largeur de bande h contrôle la pondération de similarité (h plus grand = davantage de patchs inclus, h plus petit = exigence de similarité plus stricte). Les plages de sortie correspondent à l'entrée ; les statistiques tendent vers les moyennes régionales tandis que les structures fines subsistent. Le coût de calcul croît avec la taille de l'image et le rayon des patchs ; l'exécution demande généralement un temps de traitement important pour les grandes images. Suivez la progression du filtrage via le PSNR ou une inspection visuelle. Les artefacts courants comprennent un surlissage des textures fines (augmenter prudemment la taille des patchs) et un lissage insuffisant dans les zones très bruitées (augmenter la largeur de bande). À appliquer de façon ciblée dans les flux exigeant une réduction maximale du bruit tout en préservant les entités à échelle fine.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "search_radius": {
                "label": "Rayon de recherche",
                "description": "Rayon de la fenêtre de recherche en pixels (par défaut 5)."
              },
              "patch_radius": {
                "label": "Rayon de la fenêtre",
                "description": "Rayon de la fenêtre (patch) en pixels (par défaut 1)."
              },
              "h": {
                "label": "H",
                "description": "Paramètre d'intensité du filtrage (par défaut 10.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "opening": {
            "name": "Ouverture",
            "description": "Effectue une opération morphologique d'ouverture à l'aide d'un élément structurant rectangulaire.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "filter_size_x": {
                "label": "Taille du filtre X",
                "description": "Largeur impaire du voisinage (par défaut 11)."
              },
              "filter_size_y": {
                "label": "Taille du filtre Y",
                "description": "Hauteur impaire du voisinage (par défaut identique à filter_size_x)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "olympic_filter": {
            "name": "Filtre olympique",
            "description": "Le filtre olympique met en œuvre un lissage fondé sur le rang en supprimant la valeur la plus élevée et la plus faible de chaque voisinage de pixels, puis en faisant la moyenne des pixels restants. Cette approche de filtrage robuste élimine les valeurs aberrantes extrêmes (probablement du bruit ou des valeurs parasites) tout en préservant la tendance centrale. Formulation mathématique : F = (1/(N-2)) Σ(I_sorted[2:N-1]), où les valeurs triées du voisinage excluent la plus élevée et la plus faible. L'implémentation nécessite le tri de petits voisinages (efficace en calcul) mais produit une réduction du bruit efficace. Les caractéristiques clés comprennent une stratégie simple de suppression des valeurs aberrantes, une réduction efficace du bruit poivre et sel, un filtrage tenant compte des contours (les contours apparaissent souvent comme des extrêmes) et une applicabilité à tout type de données. Le filtrage olympique excelle dans le prétraitement d'imagerie satellitaire optique (suppression des pixels de nuage clairs isolés et des ombres sombres), le lissage de MNT réduisant les artefacts de bruit de levé, le débruitage d'images thermiques (suppression des valeurs aberrantes du capteur) et le prétraitement d'images radar. En sortie, les distributions de bruit symétriques (autant de valeurs aberrantes hautes que basses) sont filtrées symétriquement ; les distributions asymétriques (plus de hautes ou de basses) produisent un filtrage directionnel. La taille du voisinage contrôle l'ampleur du lissage : une fenêtre 3×3 supprime 2 extrêmes sur 9 pixels (filtrage léger) ; les fenêtres plus grandes filtrent plus fortement. Les valeurs de sortie restent dans la plage d'entrée (la sortie est une moyenne de valeurs réelles du voisinage). Les statistiques montrent une réduction de variance contrôlée ciblant spécifiquement les valeurs aberrantes. Les images de différence (original - filtré) mettent en évidence les valeurs aberrantes supprimées ; des zones concentrées de valeurs élevées indiquent un isolement efficace du bruit. Les artefacts courants comprennent un lissage insuffisant si les valeurs aberrantes sont peu fréquentes et un flou des contours si les pixels de contour se classent systématiquement parmi les extrêmes. Plusieurs itérations permettent un lissage progressif : une seule passe réduit le bruit ; des passes répétées intensifient le lissage. À appliquer dans des flux de réduction rapide du bruit exigeant un filtrage simple et interprétable, particulièrement efficace contre le bruit poivre et sel dans les mosaïques multicapteurs.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "filter_size_x": {
                "label": "Taille du filtre X",
                "description": "Largeur du voisinage en pixels (entier impair, par défaut 11)."
              },
              "filter_size_y": {
                "label": "Taille du filtre Y",
                "description": "Hauteur du voisinage en pixels (entier impair, par défaut 11)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "percentile_filter": {
            "name": "Filtre de percentile",
            "description": "Calcule le rang centile local de l'altitude/valeur de la cellule centrale dans une fenêtre mobile (0-100%). Analogue à Elevation Percentile pour des données raster génériques. Mesure la position relative : une sortie de 0 indique un minimum local, 100 un maximum local et 50 la médiane. Révèle la position locale dans la distribution indépendamment des valeurs absolues.\n\nLe filtrage par centile permet une analyse relative à la position. Utile pour l'analyse par couches : les cellules se classant à un centile élevé (>80) dans toutes les bandes indiquent des entités « claires » ; un centile faible (<20) des entités « sombres ». Particulièrement utile en prétraitement pour la classification, car il sépare la position du terrain/de la texture plutôt que la seule magnitude. Souvent combiné à des filtres statistiques pour une caractérisation multimétrique.\n\nApplications : (1) classification relative clair/sombre, (2) caractérisation de la texture (variance de centile élevée = rugueux, faible = lisse), (3) rehaussement du contraste local (normalisation fondée sur les centiles), (4) identification des formes du relief, comme avec le centile d'altitude, (5) analyse de texture multibande (appliquer le centile à chaque bande et comparer les motifs).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "filter_size_x": {
                "label": "Taille du filtre X",
                "description": "Largeur de la fenêtre en pixels (entier impair, par défaut 11). Alias : filterx."
              },
              "filter_size_y": {
                "label": "Taille du filtre Y",
                "description": "Hauteur de la fenêtre en pixels (entier impair, par défaut = filter_size_x). Alias : filtery."
              },
              "sig_digits": {
                "label": "Chiffres significatifs",
                "description": "Nombre de chiffres significatifs utilisés pour le filtrage de rang quantifié (par défaut 2)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "range_filter": {
            "name": "Filtre d'étendue",
            "description": "Calcule l'étendue en fenêtre mobile (maximum - minimum), révélant la dispersion locale des valeurs indépendamment du niveau moyen. Métrique d'hétérogénéité simple : étendue élevée = valeurs diverses, étendue faible = valeurs uniformes. Plus simple que l'écart-type mais tout aussi informative pour de nombreuses applications, et plus robuste à la forme de la distribution.\n\nL'étendue est efficace en calcul (elle ne nécessite que deux comparaisons). Particulièrement utile pour détecter les transitions/limites, où des pics d'étendue indiquent des zones de contraste. Moins sensible à la forme de la distribution que l'écart-type (l'écart-type accentue les valeurs aberrantes, l'étendue n'utilise que les extrêmes). L'étendue normalisée (étendue/moyenne) permet la comparaison entre bandes, comme le coefficient de variation permet la comparaison entre échelles.\n\nApplications : (1) cartographie de la texture/du contraste (interprétation facile : étendue élevée = rugueux/contrasté), (2) détection des limites via les pics d'étendue, (3) alternative efficace en calcul à l'écart-type, (4) contrôle qualité (fond uniforme = étendue faible, zones d'entités = étendue élevée), (5) rugosité/variabilité de données génériques. Flux de travail typique : calculer l'étendue→seuiller pour identifier les zones de transition→vectoriser les limites à forte étendue.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "filter_size_x": {
                "label": "Taille du filtre X",
                "description": "Largeur de la fenêtre en pixels (entier impair, par défaut 11). Alias : filterx."
              },
              "filter_size_y": {
                "label": "Taille du filtre Y",
                "description": "Hauteur de la fenêtre en pixels (entier impair, par défaut = filter_size_x). Alias : filtery."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "remove_spurs": {
            "name": "Supprimer les barbules",
            "description": "Supprime les artefacts d'éperons courts des entités raster binaires par élagage itératif.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "max_iterations": {
                "label": "Itérations maximales",
                "description": "Nombre maximal d'itérations d'élagage (par défaut 10)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "savitzky_golay_2d_filter": {
            "name": "Filtre Savitzky-Golay 2D",
            "description": "Effectue un lissage 2D de Savitzky-Golay, un filtre fondé sur l'ajustement polynomial qui préserve les entités polynomiales locales. Ajuste un polynôme local au voisinage et remplace le centre par la valeur ajustée. Préserve mieux les pics/vallées que le filtre gaussien. Utile pour les données bruitées lorsque la préservation des entités est importante. Moins de flou que le gaussien pour les polynômes de faible ordre ; le lissage augmente avec l'ordre du polynôme. Le filtrage de Savitzky-Golay ajuste un polynôme local (généralement quadratique/cubique) par moindres carrés au voisinage. La valeur centrale est remplacée par la valeur du polynôme. Il diffère du médian/gaussien : il préserve les entités qui se présentent comme des structures polynomiales (pics, vallées, crêtes). Simple en calcul mais plus lent qu'une convolution simple. L'ordre du polynôme contrôle le compromis lissage/préservation. Applications : (1) lissage de données bruitées tout en préservant les structures de pics, (2) traitement de grilles d'altitude (préservation de la topographie des crêtes/vallées), (3) lissage de données spectrales (préservation des caractéristiques d'absorption), (4) prétraitement préservant les entités.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "window_size": {
                "label": "Taille de fenêtre",
                "description": "Taille impaire de fenêtre (par défaut 5). Prend actuellement en charge 5 pour un ordre polynomial de 2."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "scharr_filter": {
            "name": "Filtre de Scharr",
            "description": "Le filtre de Scharr est un opérateur de détection de contours qui améliore le filtre de Sobel grâce à des coefficients de noyau optimisés, conçus spécifiquement pour réduire le biais directionnel et offrir une meilleure invariance par rotation. L'opérateur de Scharr emploie des noyaux de convolution 3×3 à coefficients entiers (3, 10, 3), optimisés empiriquement pour les directions de contours à 0°, 45°, 90° et 135°, offrant une estimation du gradient plus précise que les filtres de Sobel traditionnels, en particulier pour les entités circulaires et les contours tournés. Le filtre calcule simultanément la composante horizontale et la magnitude du gradient, permettant une localisation robuste des contours. Ses avantages clés comprennent une précision supérieure pour les gradients directionnels, un biais de rotation réduit par rapport à Sobel et un calcul efficace par noyau 3×3 nécessitant très peu de mémoire. La sortie comprend la magnitude et, en option, les composantes directionnelles. Le filtre de Scharr excelle dans l'extraction d'entités, la détection de limites et les flux d'assurance qualité exigeant une grande précision directionnelle. Les cas d'utilisation comprennent l'extraction des emprises de bâtiments à partir d'imagerie aérienne, la détection des réseaux routiers, la délimitation des limites des plans d'eau avec un minimum de distorsion et l'identification des linéaments géologiques dans les données satellitaires. Le filtre est particulièrement performant en cartographie urbaine, en détection des limites agricoles et dans les applications de navigation autonome. L'interprétation des résultats suppose de comprendre que les valeurs de magnitude représentent la force des contours : des valeurs plus élevées indiquent des transitions plus nettes entre classes spectrales distinctes. Les composantes directionnelles révèlent l'orientation prédominante des contours (horizontale, diagonale ou verticale), utile pour l'analyse des linéaments. Pour les rasters multibandes, appliquez-le séparément à chaque bande ou utilisez un indice calculé. Les valeurs de fond apparaissent sombres en sortie ; les contours forts apparaissent clairs. Une comparaison RMSE avec des contours de référence valide les performances du filtre. Mettez la sortie à l'échelle 0-255 pour une visualisation standard ou conservez la virgule flottante pour l'analyse quantitative.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "clip_tails": {
                "label": "Écrêter les queues",
                "description": "Pourcentage optionnel d'écrêtage symétrique des queues (0-40)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "standard_deviation_filter": {
            "name": "Filtre d'écart-type",
            "description": "Calcule l'écart-type en fenêtre mobile, mesurant la variation/dispersion locale des valeurs. Écart-type élevé = valeurs diverses (rugueux/hétérogène), faible = valeurs uniformes (lisse/homogène). Révèle les motifs de texture, de rugosité et de variabilité. Essentiel pour la quantification de l'incertitude et l'évaluation de la qualité.\n\nL'écart-type est plus robuste que l'étendue pour caractériser la variation locale (il n'est pas biaisé par une seule valeur aberrante). Il permet de classer les zones par texture : pentes raides (écart-type élevé), pentes douces (faible) ; forêts (élevé), prairies (faible). Souvent normalisé (coefficient de variation = écart-type/moyenne) pour permettre la comparaison entre données de plages de valeurs différentes. Peut être calculé à partir de l'histogramme (variance = moyenne_des_carrés - carré_de_la_moyenne).\n\nApplications : (1) cartographie de la texture (analyse de la rugosité/hétérogénéité), (2) quantification de l'incertitude dans les données bruitées, (3) évaluation de la qualité (fond uniforme = écart-type faible, zones riches en entités = élevé), (4) confiance de classification (écart-type élevé = classes mixtes/incertaines), (5) hétérogénéité multibande (empiler les écarts-types de chaque bande). Flux de travail typique : calculer l'écart-type à plusieurs échelles→comparer l'évolution des motifs entre échelles→identifier les échelles caractéristiques.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "filter_size_x": {
                "label": "Taille du filtre X",
                "description": "Largeur de la fenêtre en pixels (entier impair, par défaut 11). Alias : filterx."
              },
              "filter_size_y": {
                "label": "Taille du filtre Y",
                "description": "Hauteur de la fenêtre en pixels (entier impair, par défaut = filter_size_x). Alias : filtery."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "thicken_raster_line": {
            "name": "Épaissir les lignes raster",
            "description": "Épaissit les segments de lignes raster diagonaux pour empêcher les fuites en diagonale.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "tophat_transform": {
            "name": "Transformée chapeau haut-de-forme",
            "description": "Effectue une transformation morphologique top-hat blanche ou noire.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "filter_size_x": {
                "label": "Taille du filtre X",
                "description": "Largeur impaire du voisinage (par défaut 11)."
              },
              "filter_size_y": {
                "label": "Taille du filtre Y",
                "description": "Hauteur impaire du voisinage (par défaut identique à filter_size_x)."
              },
              "variant": {
                "label": "Variante",
                "description": "Variante du chapeau haut de forme : white (par défaut) ou black."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "total_filter": {
            "name": "Filtre total",
            "description": "Calcule la somme en fenêtre mobile (total) des valeurs de pixels du voisinage. Intègre l'intensité locale du signal. Les applications dépendent de la sémantique des données : pour des comptages/densités, le total révèle les motifs de densité locale ; pour les précipitations, l'accumulation à l'échelle du bassin ; pour la réflectance, le total est proportionnel à la taille locale de la cible.\n\nLe filtrage par total s'interprète différemment selon le domaine. Pour les données de comptage/population, il révèle les regroupements et les points chauds. Pour les données d'altitude, il est rarement utilisé (la somme n'a pas de signification géomorphologique). En analyse spectrale, il peut révéler l'intensité du signal multibande. Souvent utilisé comme étape intermédiaire (par ex. diviser par le nombre de cellules du voisinage pour obtenir la moyenne, ou comparer avec les totaux voisins pour détecter l'hétérogénéité locale).\n\nApplications : (1) détection de points chauds dans les données de comptage (total élevé = regroupements), (2) modèles d'accumulation par bassin/bassin versant, (3) intégration de mesures distribuées, (4) calcul intermédiaire (total/N = moyenne), (5) agrégation de l'intensité du signal dans les mosaïques multicapteurs.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "filter_size_x": {
                "label": "Taille du filtre X",
                "description": "Largeur de la fenêtre en pixels (entier impair, par défaut 11). Alias : filterx."
              },
              "filter_size_y": {
                "label": "Taille du filtre Y",
                "description": "Hauteur de la fenêtre en pixels (entier impair, par défaut = filter_size_x). Alias : filtery."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "unsharp_masking": {
            "name": "Masque flou",
            "description": "Le masque flou (unsharp masking) accentue l'image en soustrayant une version lissée (passe-bas) de l'image d'origine, renforçant les contours et les détails fins. La transformation mathématique est I_sharp = I_original + w·(I_original - I_smooth), où w est le poids d'accentuation contrôlant l'intensité du rehaussement. Le processus isole les composantes haute fréquence et les amplifie, séparant efficacement le détail des variations tonales larges. Les caractéristiques clés comprennent un contrôle souple des paramètres (rayon du flou et poids permettant de contrôler les détails), une efficacité de calcul par réutilisation du lissage gaussien, un rehaussement interprétable (poids=0 donne l'original ; poids=1 un vrai passe-haut ; poids>1 une accentuation agressive) et une efficacité sur les données multispectrales. Le masque flou excelle dans la préparation d'images satellitaires pour l'interprétation manuelle (rehaussement du terrain subtil, de la végétation, des infrastructures), le rehaussement de produits dérivés du LiDAR (accentuation des MNT, des métriques de végétation), l'amélioration de la qualité des orthophotos pour la visibilité des entités et le rehaussement d'imagerie archéologique/de levé. L'interprétation des résultats suppose de comprendre que les valeurs accentuées se concentrent sur les contours ; les zones homogènes restent inchangées. Le paramètre de poids contrôle l'ampleur du rehaussement : w=0.5-1.0 donne un rehaussement subtil ; w=1.0-2.0 une accentuation modérée ; w>2.0 des résultats agressifs, potentiellement chargés d'artefacts. Le rayon du flou contrôle l'échelle des entités : un petit rayon (3-5 pixels) renforce la texture fine ; un rayon plus grand (10-20 pixels) les entités moyennes. Les valeurs de sortie peuvent dépasser la plage d'entrée ; un écrêtage est généralement nécessaire. Les artefacts comprennent des halos autour des contours forts (d'autant plus marqués que le poids ou le rayon est grand), un bruit amplifié si la source est bruitée et de possibles fausses couleurs en accentuation multispectrale. Vérifiez le rehaussement au moyen d'images de différence. À appliquer de façon sélective dans les flux de visualisation ; à éviter avant une analyse automatisée sensible aux changements de plage de sortie.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "sigma": {
                "label": "Sigma",
                "description": "Sigma gaussien utilisé par le masque de flou (0.5-20.0, par défaut 0.75)."
              },
              "amount": {
                "label": "Quantité",
                "description": "Multiplicateur de la quantité d'accentuation appliqué au résidu (par défaut 100.0)."
              },
              "threshold": {
                "label": "Seuil",
                "description": "Résidu absolu minimal à accentuer (par défaut 0.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "user_defined_weights_filter": {
            "name": "Filtre à pondérations définies par l'utilisateur",
            "description": "Le filtre à pondérations définies par l'utilisateur offre une flexibilité maximale pour l'analyse par convolution personnalisée en acceptant des coefficients de pondération arbitraires pour les pixels du voisinage, permettant l'implémentation d'opérateurs spécialisés, de noyaux propres à un domaine et d'algorithmes de niveau recherche sans modification de l'outil ni logiciel spécialisé. L'utilisateur spécifie les dimensions du noyau (généralement 3×3 ou 5×5), attribue des poids en virgule flottante à chaque position et désigne éventuellement la méthode de gestion des bords (réflexion, bouclage, remplissage constant). Ce filtre applique le noyau personnalisé sur tout le raster selon les mathématiques de convolution standard : chaque pixel de sortie est égal à la somme des voisins pondérés, ce qui permet à la fois des filtres de traitement d'images classiques et des noyaux analytiques personnalisés. Les caractéristiques clés comprennent une personnalisation complète pour les applications de recherche, la prise en charge des opérations de rehaussement comme d'analyse, la compatibilité avec les noyaux normalisés et non normalisés et la préservation de la précision en virgule flottante tout au long du calcul. Les cas d'utilisation couvrent le filtrage spatial avancé pour des indices spectraux spécialisés, l'implémentation d'opérateurs expérimentaux pour la validation d'algorithmes, des noyaux d'analyse de texture personnalisés, des agrégations de voisinage pondérées pour l'analyse multicritère et l'application standardisée de noyaux à des jeux de données variés. Les applications comprennent le prototypage en recherche académique, l'évaluation d'algorithmes dans l'industrie, l'adaptation régionale des chaînes de traitement et les études comparatives de performances. L'interprétation des résultats dépend entièrement des coefficients définis par l'utilisateur ; des noyaux différents produisent des résultats fondamentalement différents. Les noyaux normalisés (somme des poids égale à 1.0) préservent les plages de valeurs, ce qui est utile pour le lissage ; les noyaux non normalisés (généralement de somme nulle) mettent en valeur les différences, ce qui est utile pour la détection de contours/dérivées. L'utilisateur doit valider les propriétés du noyau (signe, magnitude et somme des coefficients) avant toute utilisation en production. La documentation des spécifications du noyau est essentielle pour des flux de travail reproductibles. Les plages de valeurs de sortie dépendent de la conception du noyau ; la documentation doit préciser les caractéristiques de sortie attendues et les besoins de mise à l'échelle.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "weights": {
                "label": "Poids",
                "description": "Poids du noyau 2D sous forme de tableaux imbriqués."
              },
              "kernel_center": {
                "label": "Centre du noyau",
                "description": "Mode de centre du noyau : center, upper-left, upper-right, lower-left, lower-right."
              },
              "normalize_weights": {
                "label": "Normaliser les poids",
                "description": "Si vrai, normalise par la somme locale des poids actifs."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "wiener_filter": {
            "name": "Filtre de Wiener",
            "description": "Le filtre de Wiener effectue une réduction adaptative du bruit en minimisant l'erreur quadratique moyenne entre la sortie filtrée et le signal réel, en supposant connues les propriétés statistiques du signal et du bruit. L'implémentation estime les variances locales du signal et du bruit dans des fenêtres mobiles et calcule des coefficients de filtre équilibrant suppression du bruit et préservation des détails : F = μ + (σ² - σₙ²)/σ² · (I - μ), où μ est la moyenne locale, σ² la variance du signal et σₙ² la variance du bruit. Cette adaptation guidée par les données fait que l'intensité du filtrage répond aux caractéristiques locales de l'image. Les caractéristiques clés comprennent une adaptation automatique aux statistiques locales (les zones planes sont fortement lissées ; les zones détaillées conservent leur structure), une efficacité éprouvée sur l'imagerie optique et SAR, des paramètres interprétables fondés sur les hypothèses du modèle de bruit et une faisabilité de calcul grâce à des approximations séparables. Le filtrage de Wiener excelle dans le prétraitement d'images satellitaires où le bruit varie spatialement, la réduction du chatoiement SAR préservant les cibles ponctuelles, les données multispectrales débruitées pour la cartographie de la végétation et le débruitage de fusions radar-optique. En sortie, les zones à forte variance (détaillées) sont peu filtrées, tandis que les zones à faible variance (bruitées) sont filtrées fortement. L'estimation de la variance du bruit influe sur la sortie : une variance sous-estimée entraîne un lissage insuffisant ; une variance surestimée un surlissage et une perte de détails. Les plages de sortie sont proches de celles de l'entrée ; examinez les images de différence (original - filtré) pour vérifier la réduction du bruit. Le rapport signal/bruit de crête (PSNR) et l'indice de similarité structurelle (SSIM) quantifient l'efficacité du filtrage. Les seuils de variance locale indiquent l'impact du traitement : les zones dont le rapport de variance détecté est > 5 sont fortement filtrées ; celles dont le rapport est < 1 le sont peu. Les écueils courants comprennent une estimation imprécise de la variance du bruit (effectuez une analyse sur image noire ou sur zone homogène pour l'estimer) et un choix de taille de fenêtre affectant la localisation. À appliquer avant la classification ou l'extraction d'entités pour réduire les erreurs de catégorie dues au bruit.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "radius": {
                "label": "Rayon",
                "description": "Rayon de la fenêtre locale de Wiener en pixels (par défaut 2)."
              },
              "noise_variance": {
                "label": "Variance du bruit",
                "description": "Variance du bruit additif optionnelle. Si elle est omise, elle est estimée à partir de la carte de variance locale."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "cloude_pottier_decomposition": {
            "name": "Décomposition de Cloude-Pottier",
            "description": "La décomposition de Cloude-Pottier diagonalise la matrice de cohérence des données SAR quadri-polarimétriques, extrayant les valeurs propres et vecteurs propres qui caractérisent les mécanismes de diffusion. L'entropie, l'anisotropie et l'angle alpha moyen calculés à partir des vecteurs propres caractérisent respectivement le désordre de la diffusion, la dominance du mécanisme et le type de diffusion. L'espace des paramètres H-alpha permet une classification physique des mécanismes de diffusion indépendante des variations d'amplitude, en exploitant l'information de phase polarimétrique. Caractéristiques clés : décomposition SAR quadri-polarimétrique ; exploitation de l'information de phase ; paramètres de diffusion physiquement significatifs ; séparation des mécanismes de diffusion ; robustesse au chatoiement d'amplitude ; classification et interprétation des cibles. Cas d'utilisation : reconnaissance de cibles SAR ; estimation de la biomasse forestière ; caractérisation des zones humides ; détection de navires/véhicules ; classification de l'occupation du sol ; interprétation de données SAR polarimétriques. Interprétation des résultats : la sortie comprend l'entropie (degré de désordre ; 0=diffusion ordonnée, 1=aléatoire), l'anisotropie (dominance du mécanisme, 0-1) et l'angle alpha (type de diffusion : ~45°=dipôle, ~30°=surface, ~60°=volume). Les nuages de points H-alpha révèlent des regroupements indiquant les types de diffusion. La double réflexion (urbain) présente un alpha élevé ; la diffusion de surface (eau) un alpha faible ; la diffusion de volume (forêt) des valeurs intermédiaires.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Rasters de matrice : diag3 [m11,m22,m33], full3x3 compact [m11,m22,m33,m12,m13,m23] ou 9 rasters complets ordonnés par ligne."
              },
              "matrix_format": {
                "label": "Format de matrice",
                "description": "Format de la matrice d'entrée : diag3 (par défaut avec 3 rasters) ou full3x3."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster de sortie optionnel à 3 bandes [H, A, alpha_deg]."
              }
            }
          },
          "enhanced_lee_filter": {
            "name": "Filtre de Lee amélioré",
            "description": "Le filtre de Lee amélioré combine le modèle multiplicatif de Lee avec une estimation affinée de la variance et un traitement multi-échelle, offrant une réduction du chatoiement supérieure tout en préservant les détails fins et les contours de l'imagerie SAR. L'implémentation emploie des statistiques locales calculées dans des fenêtres de taille adaptative, intègre une détection de contours fondée sur le laplacien et applique des paramètres de filtre variant spatialement. La formulation améliorée applique : F = μ + w·(I - μ), où w s'adapte à la proximité des contours : w→0 près des contours (filtrage minimal), w→1 dans les zones homogènes (filtrage agressif). Les caractéristiques clés comprennent un traitement adapté aux contours (préservation des limites), une adaptation multi-échelle des paramètres, une meilleure préservation des cibles que le filtre de Lee standard et une efficacité sur le SAR très bruité. Le filtrage de Lee amélioré excelle dans les scènes SAR complexes comportant de nombreuses entités, les applications de cartographie des inondations où la localisation des contours est essentielle, la détection de bâtiments en SAR urbain et l'analyse des changements multitemporels. En sortie, la préservation des contours se traduit par un filtrage réduit près des transitions : les pixels de limite conservent une variance plus élevée que les pixels éloignés. L'adaptation multi-échelle devient apparente à l'analyse de l'histogramme, qui présente des pics marqués correspondant aux classes de la scène. Les plages de sortie correspondent à l'entrée ; la comparaison avec le filtre de Lee standard montre un flou des contours réduit et une netteté des cibles maintenue. La qualité de la détection des contours influe directement sur la sortie : des contours forts permettent une bonne préservation des limites ; des contours faibles peuvent induire un surlissage. Les statistiques montrent une réduction de variance contrôlée équilibrant suppression du bruit et préservation des détails. Les artefacts courants comprennent un possible aspect en blocs si les transitions multi-échelles deviennent visibles et une surpréservation si la détection des contours est trop agressive. Surveillez la qualité de la carte des contours pour valider le comportement du filtrage. À appliquer dans des chaînes d'analyse SAR complètes où plusieurs entités doivent être préservées et les contours rester nets, ce qui est particulièrement important pour le prétraitement en apprentissage automatique exigeant des données d'entraînement aux limites d'entités nettes.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "filter_size_x": {
                "label": "Taille du filtre X",
                "description": "Largeur du voisinage en pixels (entier impair, par défaut 11)."
              },
              "filter_size_y": {
                "label": "Taille du filtre Y",
                "description": "Hauteur du voisinage en pixels (entier impair, par défaut 11)."
              },
              "enl": {
                "label": "ENL",
                "description": "Paramètre de nombre équivalent de vues pour la pondération par rapport sigma (par défaut 4.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "freeman_durden_decomposition": {
            "name": "Décomposition de Freeman-Durden",
            "description": "La décomposition de Freeman-Durden quantifie les contributions des mécanismes de diffusion du SAR quadri-polarimétrique par décomposition sur une base orthogonale en composantes de réflexion de surface, de double réflexion (urbain/dièdre) et de volume (végétation/milieux aléatoires). Une optimisation par moindres carrés non négatifs contraint les fractions de puissance, garantissant leur réalisabilité physique et leur interprétabilité. Les cartes de puissance en sortie sont directement liées aux propriétés du terrain : une forte dominance de surface indique un sol nu/de l'eau, une forte double réflexion des structures urbaines, un fort volume de la forêt/végétation. Caractéristiques clés : composantes de diffusion physiquement interprétables ; signatures propres au terrain ; optimisation sous contraintes ; prise en charge du SAR quadri-polarimétrique ; robustesse au chatoiement ; classification propre aux cibles. Cas d'utilisation : classification urbain-rural ; estimation de la biomasse forestière ; détection de l'humidité du sol ; détection des inondations ; suivi de la phénologie des cultures ; cartographie de l'occupation du sol. Interprétation des résultats : la puissance de surface indique une réflexion spéculaire sur terrain sec/eau ; la puissance de double réflexion indique des structures anthropiques/zones urbaines ; la puissance de volume indique la végétation/forêt. Les combinaisons de composantes permettent de discriminer l'occupation du sol : volume élevé + double réflexion faible indique une forêt ; double réflexion élevée + volume faible indique une zone urbaine ; surface/volume équilibrés indiquent un terrain mixte.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Rasters de matrice : diag3 [m11,m22,m33], full3x3 compact [m11,m22,m33,m12,m13,m23] ou 9 rasters complets ordonnés par ligne."
              },
              "matrix_format": {
                "label": "Format de matrice",
                "description": "Format de la matrice d'entrée : diag3 (par défaut avec 3 rasters) ou full3x3."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster de sortie optionnel à 3 bandes [surface, double_bounce, volume]."
              },
              "output_clip_mask": {
                "label": "Masque d'écrêtage en sortie",
                "description": "Raster de masque d'écrêtage optionnel en sortie (1 là où un écrêtage/une renormalisation non physique a eu lieu)."
              }
            }
          },
          "frost_filter": {
            "name": "Filtre de Frost",
            "description": "Le filtre de Frost réduit le chatoiement SAR à l'aide d'un modèle de bruit multiplicatif et de statistiques locales adaptatives ; il est conçu spécifiquement pour l'imagerie radar, où le chatoiement suit une distribution gamma plutôt qu'un bruit gaussien. L'implémentation calcule la moyenne et la variance locales, puis applique une pondération multiplicative adaptative : F = I · exp(-variance/(2·mean²)·distance²), où la distance mesure l'écart du pixel à la moyenne locale. Cette formulation réduit l'intensité du chatoiement en proportion inverse de la cohérence estimée. Les caractéristiques clés comprennent une adaptation propre au SAR (modèle de bruit multiplicatif plutôt qu'additif), la préservation des cibles ponctuelles et des contours (entités cohérentes), une adaptation guidée par la variance locale permettant d'ajuster l'intensité et une efficacité éprouvée sur les données SAR à polarisation simple et multiple. Le filtrage de Frost excelle dans le prétraitement d'images SAR pour la classification (suivi agricole, cartographie de l'utilisation du sol), la fusion SAR-optique pondérée par la cohérence, la cartographie des inondations par radar sous couverture nuageuse et les flux de détection de changements par radar à synthèse d'ouverture. En sortie, les zones à forte variance (cibles potentiellement cohérentes) sont peu filtrées ; les zones à faible variance (dominées par le chatoiement) sont filtrées fortement. Les plages de sortie typiques correspondent à l'entrée ; une mise à l'échelle logarithmique (décibels) est souvent appliquée avant ou après le filtrage pour la visualisation. Le rapport variance/moyenne contrôle directement l'intensité du filtre : un rapport > 0.5 indique un chatoiement probable ; un rapport < 0.1 suggère des cibles cohérentes. Les artefacts de sortie comprennent une possible perte de détails si l'estimation de la variance n'est pas fiable et un biais directionnel sur les entités orientées. Une vérification par cartes de cohérence confirme la préservation des contours dans les zones à forte cohérence. Surveillez les statistiques de sortie : la moyenne doit se stabiliser au fil des itérations de filtrage ; la variance doit nettement diminuer. À appliquer avant la classification pour améliorer la précision catégorielle. Combinez-le avec un post-traitement morphologique pour affiner les limites des objets et supprimer les résidus de chatoiement.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "radius": {
                "label": "Rayon",
                "description": "Rayon de la fenêtre locale en pixels (par défaut 2)."
              },
              "damping_factor": {
                "label": "Facteur d'amortissement",
                "description": "Facteur d'amortissement de Frost contrôlant la décroissance exponentielle (par défaut 2.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "gamma_map_filter": {
            "name": "Filtre Gamma MAP",
            "description": "Le filtre Gamma MAP réduit le chatoiement SAR à l'aide d'un modèle statistique fondé sur la distribution gamma, tenant explicitement compte des caractéristiques de chatoiement multiplicatif du signal radar par une adaptation paramétrique. L'implémentation estime les paramètres locaux de la distribution gamma (forme α et échelle β) à partir des statistiques de l'image, puis filtre via une fonction de pondération respectant la distribution : F = I · [1 - (1-L/N)/(1 + L/N)·√(1 + N/L²)], où L est le nombre de vues équivalent (mesure de cohérence) et N le paramètre estimé. Les caractéristiques clés comprennent des statistiques SAR théoriquement rigoureuses (la distribution gamma est la référence pour le radar), une estimation automatique du nombre de vues nécessitant un minimum de saisie de l'utilisateur, une meilleure préservation des contours que les filtres uniformes et une applicabilité au SAR mono-vue et multivue. Le filtrage Gamma MAP excelle dans le débruitage de piles SAR multitemporelles pour la détection de changements en séries temporelles, le renforcement de la cohérence de phase en SAR interférométrique (InSAR), le prétraitement pour la décomposition SAR polarimétrique et la normalisation de la rétrodiffusion SAR en foresterie. En sortie, l'intensité du filtre s'adapte à la cohérence de la scène : les zones à forte cohérence (α grand) sont filtrées doucement, préservant les cibles ; les zones à faible cohérence (α petit) sont filtrées fortement, supprimant le chatoiement. Le nombre de vues équivalent L indique l'efficacité du filtrage : L=1 (filtrage minimal) préserve tous les détails ; L>5 produit un lissage important. La mise à l'échelle de la sortie reste dans les unités d'entrée ; une conversion logarithmique facilite la visualisation. Les réductions de variance typiques vont de 50 à 80% selon le caractère de la scène et le nombre de vues choisi. Surveillez les histogrammes de sortie pour repérer une signature de chatoiement résiduelle ; des distributions bimodales suggèrent une bonne séparation des composantes de la scène. Les artefacts comprennent un possible effet de rayures sur les entités orientées ou une légère dégradation de la texture si L est surestimé. Validez le filtrage par rapport à la vérité terrain dans des zones d'entraînement. À appliquer de façon ciblée dans la classification SAR polarimétrique ou le filtrage de phase InSAR exigeant un rehaussement pondéré par la cohérence.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "radius": {
                "label": "Rayon",
                "description": "Rayon de la fenêtre locale en pixels (par défaut 2)."
              },
              "enl": {
                "label": "ENL",
                "description": "Nombre équivalent de vues (par défaut 1.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "h_alpha_wisart_classification": {
            "name": "Classification H-Alpha Wisart",
            "description": "La classification H/α/A-Wishart combine un zonage non supervisé par partition de l'espace des paramètres H/α/A et un regroupement statistique de Wishart pour classer automatiquement les données SAR polarimétriques en 9 zones physiquement significatives correspondant à des classes de mécanismes de diffusion. L'algorithme reçoit les paramètres d'entropie (H), d'anisotropie (A) et d'alpha (α) issus de la décomposition de Cloude-Pottier et partitionne l'espace de caractéristiques 3D (H,A,α) en 9 régions à l'aide de seuils fixes : la zone 1 (H faible, α~20°) représente la réflexion de Bragg sur des surfaces sèches ; la zone 5 (H~0.7, α~45°) indique une diffusion de volume isotrope en forêt ; la zone 9 (H élevé, α~80°) représente une diffusion dièdre (double réflexion) par des structures urbaines. Au sein de chaque zone, le regroupement de Wishart affine éventuellement la classification en calculant des distances statistiques dans l'espace polarimétrique multivarié, améliorant la discrimination de mécanismes similaires. Les caractéristiques clés comprennent une classification automatique et non supervisée ne nécessitant aucun échantillon d'entraînement ; 9 classes physiquement interprétables aux définitions standardisées permettant une comparabilité mondiale ; un fonctionnement optionnel en double mode (seuils seuls pour la vitesse, seuils+Wishart pour la précision) ; et des métriques de confiance intégrées fondées sur la distance aux limites des zones et la vraisemblance de Wishart. L'outil accepte des images (H,A,α) précalculées ou appelle automatiquement la décomposition de Cloude-Pottier si des matrices brutes sont fournies. Les principaux cas d'utilisation englobent la segmentation d'images SAR et la génération de cartes à partir de données polarimétriques, la classification non supervisée des types d'occupation du sol (eau, agriculture, forêt, urbain) directement à partir des matrices de cohérence SAR, l'évaluation rapide de la qualité des données polarimétriques par les distributions d'occupation des zones et la détection de changements révélant des transitions de mécanismes de diffusion qui indiquent une modification de l'occupation du sol. Interprétation des résultats : la carte à 9 classes correspond directement aux types de terrain ; les zones peuvent être agrégées en catégories plus larges (eau/spéculaire = zones 1-2, végétation/volume = zones 4-6, urbain/dièdre = zones 7-9). Les pixels non classés (classe 0) indiquent des signatures polarimétriques inhabituelles nécessitant une investigation.",
            "params": {
              "h_raster": {
                "label": "Raster H",
                "description": "Raster d'entropie (H) en entrée issu de la décomposition de Cloude-Pottier (plage 0-1)."
              },
              "alpha_raster": {
                "label": "Raster alpha",
                "description": "Raster alpha (α) en entrée issu de la décomposition de Cloude-Pottier (degrés, 0-90)."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette alpha pour correspondre à H lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster de sortie optionnel avec des étiquettes en 9 classes (1-9)."
              }
            }
          },
          "kuan_filter": {
            "name": "Filtre de Kuan",
            "description": "Effectue un filtrage du chatoiement de Kuan pour l'imagerie SAR/radar selon une approche paramétrique estimant les moyennes et la variance locales. Pondération adaptative fondée sur la variance du bruit et la variance locale de l'image. Semblable à Lee, mais avec des hypothèses statistiques différentes. Méthode de traitement SAR opérationnelle largement utilisée. Bon équilibre entre efficacité de calcul et qualité des résultats sur des données SAR variées. Le filtrage de Kuan suppose des statistiques gaussiennes avec un modèle de chatoiement multiplicatif. Il s'adapte à la variance locale et distingue la variation du signal du chatoiement. Particulièrement efficace pour l'imagerie SAR hétérogène (entités claires et sombres mélangées). Coût de calcul raisonnable. Représente un compromis pratique entre sophistication et coût de calcul. Standard dans de nombreux systèmes de traitement SAR. Applications : (1) débruitage SAR opérationnel, (2) prétraitement SAR à rétrodiffusion mixte, (3) prétraitement RadarSat/Sentinel-1, (4) traitement SAR courant. Paramètres typiques : filter_size=5×7 à 7×7.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "radius": {
                "label": "Rayon",
                "description": "Rayon de la fenêtre locale en pixels (par défaut 2)."
              },
              "enl": {
                "label": "ENL",
                "description": "Nombre équivalent de vues (par défaut 1.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "refined_lee_filter": {
            "name": "Filtre de Lee raffiné",
            "description": "Le filtre de Lee raffiné améliore le filtrage de Lee standard grâce à une meilleure estimation de la cohérence et à des adaptations préservant les contours, en utilisant des statistiques locales affinées et une analyse directionnelle pour une réduction supérieure du chatoiement. L'implémentation étend le modèle de Lee en détectant l'orientation des contours, en appliquant des fenêtres directionnelles alignées sur les limites et en calculant des estimations de cohérence affinées. Mathématiquement : F = μ + √(σ_p²/(σ_I²))·(I - μ), avec un calcul de variance aligné directionnellement. Cet affinage améliore la préservation des contours tout en maintenant la suppression du chatoiement. Les caractéristiques clés comprennent une sensibilité directionnelle (adaptation de la direction du filtrage aux structures de l'image), une meilleure estimation de la cohérence (fenêtres anisotropes), une préservation des contours supérieure au Lee standard et une efficacité sur les scènes SAR complexes. Le filtrage de Lee raffiné excelle dans la détection de changements exigeant des limites nettes, la préparation de cartes de cohérence InSAR, le traitement SAR polarimétrique où la préservation des cibles est essentielle et l'analyse SAR forestière distinguant les arbres du fond. En sortie, le filtrage respecte l'orientation des contours : les contours horizontaux sont filtrés horizontalement, les verticaux verticalement et les diagonaux en diagonale. Cette adaptation directionnelle minimise le filtrage à travers les vraies limites. Les estimations de cohérence sont généralement plus précises qu'avec le Lee standard, ce qui réduit les artefacts de filtrage. Les plages de sortie correspondent à l'entrée ; l'adaptation directionnelle est visible à l'inspection (les contours restent plus nets qu'avec le Lee standard). Les statistiques montrent une meilleure préservation des zones à fort contraste. Les composantes directionnelles révèlent l'orientation de la structure de la scène ; un fort biais directionnel indique une orientation prédominante des entités. Les artefacts courants sont réduits par rapport au Lee standard, en particulier près des contours et des entités complexes. Les artefacts comprennent une possible suradaptation en cas d'échec de l'estimation directionnelle et des artefacts de fenêtres directionnelles aux limites faibles. Surveillez les cartes de cohérence pour valider la précision de la détection des contours. À appliquer de façon ciblée dans la classification SAR où les structures directionnelles (par ex. forêts, parcelles agricoles alignées) doivent être préservées.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "filter_size_x": {
                "label": "Taille du filtre X",
                "description": "Largeur du voisinage en pixels (entier impair, par défaut 11)."
              },
              "filter_size_y": {
                "label": "Taille du filtre Y",
                "description": "Hauteur du voisinage en pixels (entier impair, par défaut 11)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "wisart_iterative_clustering": {
            "name": "Classification itérative Wisart",
            "description": "Le regroupement itératif de Wishart effectue une classification non supervisée des données SAR polarimétriques en affinant itérativement les centres des clusters à l'aide de la distance statistique de Wishart complexe, qui mesure la similarité entre distributions de probabilité polarimétriques multivariées. L'algorithme s'initialise à partir des zones de la décomposition H/α (fournissant 9 clusters germes d'interprétation physique connue), puis entre dans une boucle de type espérance-maximisation : (1) calcul de la distance de Wishart entre la matrice de cohérence estimée de chaque pixel et chaque prototype de cluster ; (2) réaffectation des pixels au cluster le plus proche ; (3) mise à jour des prototypes par moyenne des matrices des pixels affectés ; (4) itération jusqu'à convergence (taux de réaffectation des pixels <convergence_threshold) ou jusqu'à atteindre max_iterations. Les caractéristiques clés comprennent un cadre statistique à valeurs complexes gérant correctement la structure des données polarimétriques, contrairement à la distance euclidienne ; une initialisation automatique à partir de zones H/α interprétables réduisant la dépendance aux graines aléatoires ; un suivi de la convergence par pixel permettant un ciblage adaptatif des itérations ; l'entrée optionnelle de (H,α) précalculés ou le calcul automatique des matrices à partir d'entrées de cohérence brutes ; et une robustesse intégrée au chatoiement mono-vue grâce à la compatibilité avec le traitement multivue. L'outil prend en charge les formats de matrice classique et compact. Les principaux cas d'utilisation englobent la classification d'images SAR polarimétriques produisant des cartes d'occupation du sol affinées au-delà de la partition H/α à 9 zones, l'affinage itératif d'une classification non supervisée initiale pour la cartographie, l'évaluation automatisée de la qualité des données polarimétriques par des métriques de stabilité des clusters et la classification SAR en séries temporelles permettant la détection des changements par analyse des transitions entre clusters. Interprétation des résultats : carte de clusters affinée (généralement 3 à 9 classes selon la convergence) présentant des groupes de mécanismes de diffusion bien séparés. L'historique de convergence fournit une métrique de confiance : une convergence rapide dès le début indique une séparation stable des classes ; une convergence lente suggère des pixels ambigus qui bénéficieraient d'une analyse multivue ou de détection de changements. L'intégration avec les zones H/α facilite l'élaboration de la légende : conservez si possible la correspondance avec les zones H/α pour préserver l'interprétabilité.",
            "params": {
              "h_raster": {
                "label": "Raster H",
                "description": "Raster d'entropie (H) en entrée (plage 0-1)."
              },
              "alpha_raster": {
                "label": "Raster alpha",
                "description": "Raster alpha (α) en entrée (degrés, 0-90)."
              },
              "max_iterations": {
                "label": "Itérations maximales",
                "description": "Nombre maximal d'itérations de regroupement (par défaut 10)."
              },
              "convergence_threshold": {
                "label": "Seuil de convergence",
                "description": "Critère de convergence : fraction de pixels inchangés (par défaut 0.99)."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette alpha pour correspondre à H lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster d'étiquettes de grappes optionnel en sortie."
              }
            }
          },
          "yamaguchi_4component_decomposition": {
            "name": "Décomposition de Yamaguchi à 4 composantes",
            "description": "La décomposition SAR à 4 composantes de Yamaguchi décompose les données de radar à synthèse d'ouverture en double polarisation en composantes physiquement interprétables représentant la diffusion de surface, la diffusion en double réflexion (volume), la diffusion hélicoïdale et la diffusion de volume, par une analyse polarimétrique fondée sur un modèle avec intégration optionnelle d'un MNT. La décomposition sépare les différents mécanismes de rétrodiffusion par analyse des valeurs propres des matrices de covariance polarimétriques, interprétant les composantes comme la réflexion de surface (diffusion de Bragg), la double réflexion par des réflecteurs en coin, la rotation hélicoïdale de la polarisation (peu fréquente) et la diffusion de volume diffuse par la végétation ou une surface rugueuse. L'intégration d'un MNT externe estime la contribution topographique à la diffusion, permettant de mieux distinguer la véritable diffusion de volume des effets topographiques. Les caractéristiques clés comprennent une interprétation physique fondée sur un modèle permettant l'extraction de paramètres géophysiques significatifs, une correction topographique optionnelle fondée sur le MNT améliorant la précision des composantes en terrain accidenté, des contraintes de non-négativité des composantes empêchant des résultats de décomposition non physiques et une gestion automatique des lacunes de données et des zones de repliement (layover). Les applications comprennent l'estimation de la biomasse forestière à partir de la composante de diffusion de volume, la cartographie urbaine exploitant la dominance de la double réflexion dans les zones bâties, l'estimation de l'humidité du sol à partir du comportement de la diffusion de surface et la détection de glissements de terrain/de changements par les variations des rapports entre composantes. La sortie de la décomposition de Yamaguchi permet une interprétation géophysique. Elle comprend une imagerie à quatre composantes (puissances de diffusion de surface, de double réflexion, hélicoïdale et de volume), des métriques de qualité de décomposition quantifiant la précision de l'ajustement, des indices de type de diffusion moyen facilitant la caractérisation de l'occupation du sol et des diagnostics optionnels de cohérence/entropie guidant l'évaluation de la qualité des données.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Rasters de matrice : 6 compacts [m11,m22,m33,m12,m13,m23] ou 9 éléments complets ordonnés par ligne d'une matrice complexe 3x3."
              },
              "matrix_format": {
                "label": "Format de matrice",
                "description": "Format de la matrice d'entrée : full3x3 (par défaut) pour les matrices hermitiennes avec parties réelle/imaginaire."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster de sortie optionnel à 4 bandes [surface, double_bounce, volume, helix]."
              }
            }
          },
          "ascii_to_las": {
            "name": "ASCII vers LAS",
            "description": "Conversion de format : traitement par lot CSV→LAS. Analyse des fichiers texte délimités par espaces/virgules/tabulations (x,y,z,intensity,class,returns,angle,time) vers LAS avec des métadonnées EPSG.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Tableau de chemins de fichiers ASCII en entrée."
              },
              "pattern": {
                "label": "Motif",
                "description": "Motif des champs, p. ex. 'x,y,z,i,c,rn,nr,sa'."
              },
              "epsg_code": {
                "label": "Code EPSG",
                "description": "Code EPSG pour les métadonnées de SCR du LAS en sortie."
              },
              "output_directory": {
                "label": "Répertoire de sortie",
                "description": "Répertoire de sortie optionnel pour les fichiers LAS générés."
              }
            }
          },
          "las_to_ascii": {
            "name": "LAS vers ASCII",
            "description": "Conversion de format : sortie LAS→CSV. Exporte tous les attributs des points vers un texte délimité pour l'import dans un tableur/une base de données ou pour des scripts.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée optionnel ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin CSV de sortie optionnel (mode à entrée unique uniquement)."
              }
            }
          },
          "las_to_shapefile": {
            "name": "LAS vers shapefile",
            "description": "Convertit des nuages de points LAS/LAZ en shapefiles vectoriels de points.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée optionnel ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel pour le mode à entrée unique."
              },
              "output_multipoint": {
                "label": "Multipoints en sortie",
                "description": "Si vrai, produit une géométrie multipoint avec une seule entité ; sinon produit une entité ponctuelle par point."
              }
            }
          },
          "lidar_colourize": {
            "name": "Coloriser le LiDAR",
            "description": "Attribue aux points des couleurs issues d'une image : échantillonne l'orthophoto/l'image géoréférencée superposée à chaque position de point et stocke la couleur en RVB. Rendu photoréaliste de nuages de points.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé."
              },
              "image": {
                "label": "Image",
                "description": "Chemin du raster d'image en entrée ou objet raster typé."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "lidar_join": {
            "name": "Joindre des LiDAR",
            "description": "Fusionne plusieurs fichiers LiDAR : concatène les nuages de points tout en préservant les attributs et la cohérence des en-têtes. Traitement par lot de collections de tuiles.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Tableau de chemins LiDAR en entrée ou d'objets LiDAR typés."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "lidar_shift": {
            "name": "Décaler le LiDAR",
            "description": "Translate les coordonnées d'un nuage de points : décalages x/y/z pour les changements de datum, les corrections de recalage ou les transformations de système de coordonnées. Ajustement en masse des coordonnées.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "x_shift": {
                "label": "Décalage X",
                "description": "Décalage à ajouter aux coordonnées x."
              },
              "y_shift": {
                "label": "Décalage Y",
                "description": "Décalage à ajouter aux coordonnées y."
              },
              "z_shift": {
                "label": "Décalage Z",
                "description": "Décalage à ajouter aux coordonnées z."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "lidar_tile": {
            "name": "Découper le LiDAR en tuiles",
            "description": "Découpe un nuage de points en tuiles de grille régulière : partition selon l'étendue x/y avec des dimensions configurables et un seuil minimal de points. Distribution et traitement standard des données.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé."
              },
              "tile_width": {
                "label": "Largeur de tuile",
                "description": "Largeur de tuile en unités x (par défaut 1000)."
              },
              "tile_height": {
                "label": "Hauteur de tuile",
                "description": "Hauteur de tuile en unités y (par défaut 1000)."
              },
              "origin_x": {
                "label": "Origine X",
                "description": "Coordonnée x de l'origine de la grille (par défaut 0)."
              },
              "origin_y": {
                "label": "Origine Y",
                "description": "Coordonnée y de l'origine de la grille (par défaut 0)."
              },
              "min_points_in_tile": {
                "label": "Points minimaux par tuile",
                "description": "Nombre minimal de points requis pour écrire une tuile (par défaut 2)."
              },
              "output_laz_format": {
                "label": "Format LAZ en sortie",
                "description": "Si vrai, écrit des sorties .laz ; sinon .las (par défaut true)."
              },
              "output_directory": {
                "label": "Répertoire de sortie",
                "description": "Répertoire optionnel pour écrire les tuiles de sortie ; par défaut <répertoire_entrée>/<nom_entrée>/."
              }
            }
          },
          "lidar_tophat_transform": {
            "name": "Transformée chapeau haut-de-forme LiDAR",
            "description": "Extrait la hauteur au-dessus du sol par top-hat blanc morphologique : érosion + dilatation approchent le sol local, le résidu = la hauteur. Normalisation sans classification du sol.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé."
              },
              "search_radius": {
                "label": "Rayon de recherche",
                "description": "Rayon de voisinage utilisé pour l'érosion et la dilatation."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "recover_flightline_info": {
            "name": "Récupérer les informations de ligne de vol",
            "description": "Reconstitue les identifiants de lignes de vol à partir des écarts de temps GPS : déduit les limites des lignes de vol et les enregistre dans point-source-ID/user-data/RVB. Récupération de la trajectoire de vol.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé."
              },
              "max_time_diff": {
                "label": "Différence de temps maximale",
                "description": "Écart maximal de temps GPS au sein d'une ligne de vol avant de commencer une nouvelle ligne de vol."
              },
              "pt_src_id": {
                "label": "ID de source de points",
                "description": "Si vrai, écrit les identifiants de lignes de vol inférés dans point_source_id."
              },
              "user_data": {
                "label": "Données utilisateur",
                "description": "Si vrai, écrit les identifiants de lignes de vol inférés dans user_data (modulo 256)."
              },
              "rgb": {
                "label": "RVB",
                "description": "Si vrai, affecte une couleur aléatoire par ligne de vol inférée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "select_tiles_by_polygon": {
            "name": "Sélectionner des tuiles par polygone",
            "description": "Sélection de tuiles par lot : copie les tuiles LAS/LAZ d'un répertoire vers la sortie lorsque les points d'échantillonnage de la tuile intersectent les limites d'un polygone. Extraction de données par zone d'intérêt.",
            "params": {
              "input_directory": {
                "label": "Répertoire d'entrée",
                "description": "Répertoire d'entrée contenant les tuiles LiDAR."
              },
              "output_directory": {
                "label": "Répertoire de sortie",
                "description": "Répertoire de sortie pour les tuiles LiDAR sélectionnées."
              },
              "polygons": {
                "label": "Polygones",
                "description": "Chemin du vecteur de polygones en entrée ou objet vecteur typé."
              }
            }
          },
          "sort_lidar": {
            "name": "Trier le LiDAR",
            "description": "Ordonne les points selon plusieurs critères : x/y/z avec tailles de classes, plus des attributs dérivés. Optimise la cohérence spatiale pour la compression et le traitement par tuiles.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "sort_criteria": {
                "label": "Critères de tri",
                "description": "Expression de critères de tri, p. ex. 'x 100, y 100, z 10, scan_angle'."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "split_lidar": {
            "name": "Scinder le LiDAR",
            "description": "Répartit les points dans des fichiers distincts selon un attribut : regroupement par classe, source-id, fenêtre temporelle, case spatiale ou nombre de points. Stratification et distribution des données.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "split_criterion": {
                "label": "Critère de division",
                "description": "Critère de regroupement : num_pts, x, y, z, intensity, class, user_data, point_source_id, scan_angle ou time."
              },
              "interval": {
                "label": "Intervalle",
                "description": "Taille de classe pour les critères numériques ; pour num_pts, c'est le nombre de points par fichier de sortie."
              },
              "min_pts": {
                "label": "Points minimaux",
                "description": "Nombre minimal de points requis avant d'écrire un fichier de sortie divisé (par défaut 5)."
              },
              "output_directory": {
                "label": "Répertoire de sortie",
                "description": "Répertoire optionnel pour les sorties divisées."
              }
            }
          },
          "classify_buildings_in_lidar": {
            "name": "Classer les bâtiments dans le LiDAR",
            "description": "Marque les points situés dans les emprises de bâtiments : attribue la classe 6 à tous les points spatialement inclus dans les limites des polygones. Extraction des bâtiments à partir de données vectorielles.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé."
              },
              "buildings": {
                "label": "Bâtiments",
                "description": "Chemin du vecteur de polygones d'emprises de bâtiments en entrée ou objet vecteur typé."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "classify_lidar": {
            "name": "Classer le LiDAR",
            "description": "Classification automatique des points : sol, végétation, bâtiments via la géométrie locale (linéarité, planéité) et l'ajustement de plans par RANSAC. Segmentation fondée sur la géométrie.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "search_radius": {
                "label": "Rayon de recherche",
                "description": "Rayon de voisinage (par défaut 2.5)."
              },
              "grd_threshold": {
                "label": "Seuil sol",
                "description": "Hauteur au-dessus du minimum local considérée comme sol (par défaut 0.1)."
              },
              "oto_threshold": {
                "label": "Seuil OTO",
                "description": "Hauteur au-dessus du minimum local considérée comme objet hors terrain (par défaut 1.0)."
              },
              "linearity_threshold": {
                "label": "Seuil de linéarité",
                "description": "Seuil de linéarité utilisé dans le filtrage final des points non classés (par défaut 0.5)."
              },
              "planarity_threshold": {
                "label": "Seuil de planéité",
                "description": "Seuil de planéité utilisé dans la segmentation et le raffinement (par défaut 0.85)."
              },
              "num_iter": {
                "label": "Nombre d'itérations",
                "description": "Nombre d'itérations RANSAC locales pour les estimations de planéité/linéarité (par défaut 30)."
              },
              "facade_threshold": {
                "label": "Seuil de façade",
                "description": "Distance de voisinage utilisée pour l'étiquetage des façades de bâtiments (par défaut 0.5)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "classify_overlap_points": {
            "name": "Classer les points de recouvrement",
            "description": "Identifie les recouvrements de lignes de vol : détecte les cellules de grille comportant plusieurs identifiants de source de points, marque ou supprime les points de recouvrement. Contrôle qualité pour la validation de l'acquisition.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé."
              },
              "resolution": {
                "label": "Résolution",
                "description": "Taille de cellule de grille utilisée pour l'analyse des chevauchements."
              },
              "overlap_criterion": {
                "label": "Critère de chevauchement",
                "description": "angle de balayage max, identifiant de source de points non minimal, temps non minimal, ou identifiants de source de points multiples."
              },
              "filter": {
                "label": "Filtre",
                "description": "Si vrai, supprime les points de chevauchement ; sinon classe les points de chevauchement en classe 12."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "clip_lidar_to_polygon": {
            "name": "Découper le LiDAR selon un polygone",
            "description": "Sous-ensemble spatial d'un nuage de points : conserve les points situés dans les limites des polygones. Sélection de points par données vectorielles pour l'extraction d'une zone d'étude.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé."
              },
              "polygons": {
                "label": "Polygones",
                "description": "Chemin du vecteur de polygones en entrée ou objet vecteur typé."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "erase_polygon_from_lidar": {
            "name": "Effacer un polygone du LiDAR",
            "description": "Supprime les points LiDAR situés dans la géométrie d'un polygone.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé."
              },
              "polygons": {
                "label": "Polygones",
                "description": "Chemin du vecteur de polygones en entrée ou objet vecteur typé."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "filter_lidar": {
            "name": "Filtrer le LiDAR",
            "description": "Supprime des points via une expression : logique booléenne sur les attributs (class, elevation, return_number, scan_angle, noise_flag, etc.). Sélection de points flexible.",
            "params": {
              "statement": {
                "label": "Instruction",
                "description": "Expression booléenne, p. ex. '!is_noise && class == 2' ou 'NOT is_noise AND class == 2'."
              },
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel pour le mode à entrée unique."
              }
            }
          },
          "filter_lidar_by_percentile": {
            "name": "Filtrer le LiDAR par percentile",
            "description": "Sélectionne le point de rang centile par cellule : conserve un point par bloc de grille au centile d'altitude spécifié. Décimation par échantillon représentatif.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "percentile": {
                "label": "Percentile",
                "description": "Percentile dans [0, 100] (0=le plus bas, 100=le plus haut)."
              },
              "block_size": {
                "label": "Taille de bloc",
                "description": "Taille de bloc de grille pour la sélection locale par percentile (par défaut 1.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "filter_lidar_by_reference_surface": {
            "name": "Filtrer le LiDAR par surface de référence",
            "description": "Extrait des points par rapport à une surface de référence : z<surface, z>surface ou dans un seuil. Identifie la végétation au-dessus du MNT ou les points sous la surface.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé."
              },
              "ref_surface": {
                "label": "Surface de référence",
                "description": "Chemin du raster de référence ou objet raster typé."
              },
              "query": {
                "label": "Requête",
                "description": "Type de requête : within, <, <=, >, >= (par défaut within)."
              },
              "threshold": {
                "label": "Seuil",
                "description": "Seuil de distance z absolue utilisé par query=within."
              },
              "classify": {
                "label": "Classer",
                "description": "Si vrai, classe les points ; sinon filtre et ne conserve que les correspondances."
              },
              "true_class_value": {
                "label": "Valeur de classe vraie",
                "description": "Valeur de classe affectée aux points correspondants en mode classification."
              },
              "false_class_value": {
                "label": "Valeur de classe fausse",
                "description": "Valeur de classe affectée aux points non correspondants en mode classification."
              },
              "preserve_classes": {
                "label": "Conserver les classes",
                "description": "Si vrai, préserve les classes non correspondantes en mode classification."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "filter_lidar_classes": {
            "name": "Filtrer les classes LiDAR",
            "description": "Supprime des points selon leur classification : filtre les classes LAS indésirables (bruit, eau, bâtiments, etc.). Prétraitement essentiel des flux de conditionnement du terrain.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "excluded_classes": {
                "label": "Classes exclues",
                "description": "Classes à exclure (tableau ou chaîne délimitée par des virgules)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "filter_lidar_noise": {
            "name": "Filtrer le bruit LiDAR",
            "description": "Supprime les classes de bruit ASPRS : filtre la classe 7 (bruit bas) et la classe 18 (bruit haut). Nettoyage standard de nuages de points pour les données conformes à LAS 1.4.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "filter_lidar_scan_angles": {
            "name": "Filtrer les angles de balayage LiDAR",
            "description": "Supprime les retours LiDAR obliques : filtre les points selon un seuil d'angle de balayage. Améliore la précision verticale en supprimant les retours rasants entachés d'erreur de position.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "threshold": {
                "label": "Seuil",
                "description": "Angle de balayage absolu maximal (unités LAS entières ; 1 unité = 0,006°). Requis."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "height_above_ground": {
            "name": "Hauteur au-dessus du sol",
            "description": "Normalise via la géométrie du nuage de points : calcule la hauteur de chaque point au-dessus du voisin de classe sol inférieur le plus proche. Surface de terrain locale sans raster de référence.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "improved_ground_point_filter": {
            "name": "Filtre de points sol amélioré",
            "description": "Chaîne de filtrage des points sol en plusieurs étapes.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée."
              },
              "block_size": {
                "label": "Taille de bloc",
                "description": "Taille de cellule de grille en unités xy."
              },
              "max_building_size": {
                "label": "Taille maximale de bâtiment",
                "description": "Largeur maximale attendue des bâtiments en unités xy."
              },
              "slope_threshold": {
                "label": "Seuil de pente",
                "description": "Pente minimale des bords en degrés."
              },
              "elev_threshold": {
                "label": "Seuil d'élévation",
                "description": "Seuil de distance d'élévation."
              },
              "classify": {
                "label": "Classer",
                "description": "Classer les points plutôt que les filtrer."
              },
              "preserve_classes": {
                "label": "Conserver les classes",
                "description": "Préserver les classes existantes en mode classification."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "individual_tree_segmentation": {
            "name": "Segmentation d'arbres individuels",
            "description": "Segmente les points de végétation en houppiers : regroupement mean-shift avec une largeur de bande adaptative issue de la géométrie locale de la canopée. Délimitation des arbres au niveau de l'inventaire.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé."
              },
              "only_use_veg": {
                "label": "Utiliser uniquement la végétation",
                "description": "Si vrai, ne traite que les classes de végétation (par défaut true)."
              },
              "veg_classes": {
                "label": "Classes de végétation",
                "description": "Classes de végétation sous forme de texte délimité par des virgules ou de tableau d'entiers (par défaut '3,4,5')."
              },
              "min_height": {
                "label": "Hauteur minimale",
                "description": "Hauteur minimale des points pour la segmentation (par défaut 2.0)."
              },
              "max_height": {
                "label": "Hauteur maximale",
                "description": "Hauteur maximale optionnelle des points."
              },
              "bandwidth_min": {
                "label": "Largeur de bande minimale",
                "description": "Largeur de bande horizontale minimale (par défaut 1.0)."
              },
              "bandwidth_max": {
                "label": "Largeur de bande maximale",
                "description": "Largeur de bande horizontale maximale (par défaut 6.0)."
              },
              "adaptive_bandwidth": {
                "label": "Largeur de bande adaptative",
                "description": "Estime la largeur de bande horizontale par germe à partir de la géométrie locale du houppier (par défaut true)."
              },
              "adaptive_neighbors": {
                "label": "Voisins adaptatifs",
                "description": "Nombre de voisins utilisé pour l'échelle de densité locale adaptative (par défaut 24)."
              },
              "adaptive_sector_count": {
                "label": "Nombre de secteurs adaptatifs",
                "description": "Nombre de secteurs angulaires pour l'estimation locale du rayon du houppier (par défaut 8)."
              },
              "grid_acceleration": {
                "label": "Accélération par grille",
                "description": "Utilise une approximation par grille de type MeanShift++ pour des mises à jour de modes plus rapides (par défaut false)."
              },
              "grid_cell_size": {
                "label": "Taille de cellule de grille",
                "description": "Taille de cellule de grille pour les mises à jour de modes accélérées (par défaut 0.5)."
              },
              "grid_refine_exact": {
                "label": "Raffinement exact de grille",
                "description": "Exécute un court raffinement par voisins exacts après l'accélération par grille (par défaut false)."
              },
              "grid_refine_iterations": {
                "label": "Itérations de raffinement de grille",
                "description": "Plafond d'itérations de raffinement exact après les mises à jour de modes par grille (par défaut 2)."
              },
              "tile_size": {
                "label": "Taille de tuile",
                "description": "Taille de tuile optionnelle pour l'ordonnancement des germes ; <=0 désactive le tuilage (par défaut 0.0)."
              },
              "tile_overlap": {
                "label": "Chevauchement des tuiles",
                "description": "Largeur de chevauchement des tuiles pour l'ordonnancement tuilé des germes (par défaut 0.0)."
              },
              "vertical_bandwidth": {
                "label": "Largeur de bande verticale",
                "description": "Largeur de bande du noyau vertical (par défaut 5.0)."
              },
              "max_iterations": {
                "label": "Itérations maximales",
                "description": "Nombre maximal d'itérations mean-shift par germe (par défaut 30)."
              },
              "convergence_tol": {
                "label": "Tolérance de convergence",
                "description": "Tolérance de convergence sur la magnitude du déplacement (par défaut 0.05)."
              },
              "min_cluster_points": {
                "label": "Points minimaux par grappe",
                "description": "Nombre minimal de points par grappe d'arbre conservée (par défaut 50)."
              },
              "mode_merge_dist": {
                "label": "Distance de fusion des modes",
                "description": "Seuil de distance pour la fusion des modes convergés (par défaut 0.8)."
              },
              "threads": {
                "label": "Threads",
                "description": "Remplacement du nombre de threads (0 utilise le pool Rayon par défaut)."
              },
              "simd": {
                "label": "SIMD",
                "description": "Active l'arithmétique assistée par SIMD dans les boucles de pondération (par défaut true)."
              },
              "output_id_mode": {
                "label": "Mode d'identifiant en sortie",
                "description": "Encodage de l'identifiant de segment en sortie {rgb|user_data|point_source_id|rgb+user_data|rgb+point_source_id} (par défaut rgb)."
              },
              "output_sidecar_csv": {
                "label": "CSV annexe en sortie",
                "description": "Si vrai, écrit un CSV point_index,segment_id à côté de la sortie lidar."
              },
              "seed": {
                "label": "Graine",
                "description": "Graine déterministe pour la correspondance des couleurs (par défaut 1)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "lidar_classify_subset": {
            "name": "Classer un sous-ensemble LiDAR",
            "description": "Transfère la classification : marque les points de base correspondant aux positions du nuage de sous-ensemble. Permet une reclassification spatiale fondée sur des ensembles de points auxiliaires.",
            "params": {
              "base": {
                "label": "Base",
                "description": "Chemin LiDAR de base ou objet LiDAR typé."
              },
              "subset": {
                "label": "Sous-ensemble",
                "description": "Chemin LiDAR du sous-ensemble ou objet LiDAR typé."
              },
              "subset_class_value": {
                "label": "Valeur de classe du sous-ensemble",
                "description": "Valeur de classification affectée aux points du sous-ensemble appariés (0-18)."
              },
              "nonsubset_class_value": {
                "label": "Valeur de classe hors sous-ensemble",
                "description": "Classe optionnelle pour les points non correspondants (0-18). Utilisez 255 pour préserver les classes existantes."
              },
              "tolerance": {
                "label": "Tolérance",
                "description": "Tolérance d'appariement par plus proche voisin 3D en unités carte."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "lidar_elevation_slice": {
            "name": "Tranche d'altitude LiDAR",
            "description": "Extrait les points d'une tranche d'altitude : filtre ou reclassifie les points dans une plage de z. Isole des couches spécifiques (sol, sous-étage, canopée) ou des zones d'altitude.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "minz": {
                "label": "Z min",
                "description": "Borne inférieure de la tranche d'élévation (par défaut -infini)."
              },
              "maxz": {
                "label": "Z max",
                "description": "Borne supérieure de la tranche d'élévation (par défaut +infini)."
              },
              "classify": {
                "label": "Classer",
                "description": "Si vrai, reclasse les points au lieu de les filtrer (par défaut false)."
              },
              "in_class_value": {
                "label": "Valeur de classe d'entrée",
                "description": "Classification affectée aux points à l'intérieur de la tranche lorsque classify=true (par défaut 2)."
              },
              "out_class_value": {
                "label": "Valeur de classe de sortie",
                "description": "Classification affectée aux points à l'extérieur de la tranche lorsque classify=true (par défaut 1)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "lidar_remove_outliers": {
            "name": "Supprimer les points aberrants LiDAR",
            "description": "Détecte les points aberrants via les résidus d'altitude locaux : compare chaque point à la moyenne/médiane du voisinage et signale les anomalies. Supprime les erreurs grossières et le bruit.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "search_radius": {
                "label": "Rayon de recherche",
                "description": "Rayon de voisinage pour le calcul des résidus locaux (par défaut 2.0)."
              },
              "elev_diff": {
                "label": "Différence d'élévation",
                "description": "Seuil de résidu d'élévation absolu pour la détection des valeurs aberrantes (par défaut 50.0)."
              },
              "use_median": {
                "label": "Utiliser la médiane",
                "description": "Utilise la médiane au lieu de la moyenne de l'élévation du voisinage."
              },
              "classify": {
                "label": "Classer",
                "description": "Si vrai, classe les valeurs aberrantes en classe 7/18 au lieu de les supprimer."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "lidar_segmentation": {
            "name": "Segmentation LiDAR",
            "description": "Partitionne le nuage de points : l'ajustement de plans par RANSAC + la croissance de régions créent des composantes connexes. Attribue des identifiants de segments stockés en RVB. Regroupement de points fondé sur la forme.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé."
              },
              "search_radius": {
                "label": "Rayon de recherche",
                "description": "Rayon de voisinage pour la croissance de régions."
              },
              "num_iterations": {
                "label": "Nombre d'itérations",
                "description": "Nombre d'itérations RANSAC utilisées pour détecter les modèles planaires locaux."
              },
              "num_samples": {
                "label": "Nombre d'échantillons",
                "description": "Nombre de points échantillonnés par ajustement de modèle RANSAC local."
              },
              "inlier_threshold": {
                "label": "Seuil d'inliers",
                "description": "Seuil de résidu utilisé pour classer les points comme inliers du plan local."
              },
              "acceptable_model_size": {
                "label": "Taille de modèle acceptable",
                "description": "Nombre minimal d'inliers requis pour un modèle de plan local accepté."
              },
              "max_planar_slope": {
                "label": "Pente planaire maximale",
                "description": "Pente planaire maximale acceptée en degrés."
              },
              "norm_diff_threshold": {
                "label": "Seuil de différence des normales",
                "description": "Différence angulaire maximale (degrés) entre normales planaires voisines pendant la croissance."
              },
              "max_z_diff": {
                "label": "Différence Z maximale",
                "description": "Différence de Z maximale autorisée pendant la croissance d'un segment."
              },
              "classes": {
                "label": "Classes",
                "description": "Si vrai, ne franchit pas les limites de classes pendant la croissance des segments."
              },
              "ground": {
                "label": "Sol",
                "description": "Si vrai, affecte class=2 au plus grand segment et class=1 aux autres points segmentés."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "lidar_segmentation_based_filter": {
            "name": "Filtre fondé sur la segmentation LiDAR",
            "description": "Filtrage du sol par segmentation à faible relief : fait croître des composantes connexes à partir de zones localement planes et sépare le terrain de la végétation. Séparation robuste du sol.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé."
              },
              "search_radius": {
                "label": "Rayon de recherche",
                "description": "Rayon de voisinage pour la croissance des composantes connexes."
              },
              "norm_diff_threshold": {
                "label": "Seuil de différence des normales",
                "description": "Paramètre de compatibilité pour les anciennes vérifications d'angle des normales."
              },
              "max_z_diff": {
                "label": "Différence Z maximale",
                "description": "Différence d'élévation maximale pour la croissance connexe."
              },
              "classify_points": {
                "label": "Classer les points",
                "description": "Si vrai, classe les points au lieu de les filtrer."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "modify_lidar": {
            "name": "Modifier le LiDAR",
            "description": "Met à jour les attributs des points via des affectations : z=z+offset, class=reclassify_expr, intensity=scale_factor. Transformations flexibles au niveau du point.",
            "params": {
              "statement": {
                "label": "Instruction",
                "description": "Une ou plusieurs expressions d'affectation séparées par des points-virgules, p. ex. 'z = z + 1; class = if(z > 5, 2, class)'."
              },
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel pour le mode à entrée unique."
              }
            }
          },
          "normalize_lidar": {
            "name": "Normaliser le LiDAR",
            "description": "Convertit les altitudes LiDAR absolues en hauteur au-dessus du sol : soustrait le MNT (raster) des valeurs z des points. Crée un nuage de points normalisé pour l'analyse de structure.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé."
              },
              "dtm": {
                "label": "MNT",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "no_negatives": {
                "label": "Pas de valeurs négatives",
                "description": "Limite à zéro les hauteurs normalisées négatives."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "remove_duplicates": {
            "name": "Supprimer les doublons",
            "description": "Déduplique le nuage de points : supprime les points de x/y identiques (et éventuellement z). Gère les recouvrements de balayages multiples et améliore l'efficacité du traitement.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "include_z": {
                "label": "Inclure Z",
                "description": "Si vrai, la détection des doublons inclut z ; sinon utilise uniquement x/y."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "flightline_overlap": {
            "name": "Recouvrement des lignes de vol",
            "description": "Détecte les recouvrements d'acquisition : compte les identifiants de source de points distincts par cellule. Visualisation des recouvrements sur grille pour évaluer la couverture des lignes de vol.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée optionnel ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "resolution": {
                "label": "Résolution",
                "description": "Résolution de grille utilisée pour compter les lignes de vol distinctes par cellule."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "lidar_block_maximum": {
            "name": "Maximum par bloc LiDAR",
            "description": "Raster à partir de l'attribut LiDAR maximal : valeur de cellule = retour du point le plus élevé (altitude, intensité, classe, etc.). Génération de MNS, extraction du sommet de la canopée, statistiques d'impulsions.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "resolution": {
                "label": "Résolution",
                "description": "Taille de cellule en sortie."
              },
              "interpolation_parameter": {
                "label": "Paramètre d'interpolation",
                "description": "Attribut de point (elevation/intensity/class/return_number/number_of_returns/scan_angle/time/rgb/user_data)."
              },
              "returns_included": {
                "label": "Retours inclus",
                "description": "Mode de filtrage des retours : all, first ou last."
              },
              "excluded_classes": {
                "label": "Classes exclues",
                "description": "Classes à exclure (tableau ou chaîne délimitée par des virgules)."
              },
              "min_elev": {
                "label": "Élévation minimale",
                "description": "Seuil d'élévation minimal utilisé pour le filtrage d'inclusion des points."
              },
              "max_elev": {
                "label": "Élévation maximale",
                "description": "Seuil d'élévation maximal utilisé pour le filtrage d'inclusion des points."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "lidar_block_minimum": {
            "name": "Minimum par bloc LiDAR",
            "description": "Raster à partir de l'attribut LiDAR minimal : valeur de cellule = retour du point le plus bas (altitude, intensité, classe). Génération de MNT, extraction de la surface du sol, référence du terrain.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "resolution": {
                "label": "Résolution",
                "description": "Taille de cellule en sortie."
              },
              "interpolation_parameter": {
                "label": "Paramètre d'interpolation",
                "description": "Attribut de point (elevation/intensity/class/return_number/number_of_returns/scan_angle/time/rgb/user_data)."
              },
              "returns_included": {
                "label": "Retours inclus",
                "description": "Mode de filtrage des retours : all, first ou last."
              },
              "excluded_classes": {
                "label": "Classes exclues",
                "description": "Classes à exclure (tableau ou chaîne délimitée par des virgules)."
              },
              "min_elev": {
                "label": "Élévation minimale",
                "description": "Seuil d'élévation minimal utilisé pour le filtrage d'inclusion des points."
              },
              "max_elev": {
                "label": "Élévation maximale",
                "description": "Seuil d'élévation maximal utilisé pour le filtrage d'inclusion des points."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "lidar_construct_vector_tin": {
            "name": "Construire un TIN vectoriel LiDAR",
            "description": "Construit un maillage 3D : triangulation de Delaunay à partir des points filtrés, produite sous forme de couche vectorielle de polygones. Représentation de surface et analyse topographique.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée optionnel ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel ; en mode lot, chaque entrée écrit un fichier _tin.shp voisin."
              },
              "returns": {
                "label": "Retours",
                "description": "Filtre de retours : all, first ou last."
              },
              "excluded_classes": {
                "label": "Classes exclues",
                "description": "Valeurs de classes optionnelles à exclure."
              },
              "min_elev": {
                "label": "Élévation minimale",
                "description": "Élévation minimale autorisée des points."
              },
              "max_elev": {
                "label": "Élévation maximale",
                "description": "Élévation maximale autorisée des points."
              },
              "max_triangle_edge_length": {
                "label": "Longueur maximale d'arête de triangle",
                "description": "Longueur maximale optionnelle autorisée des arêtes de triangles."
              }
            }
          },
          "lidar_contour": {
            "name": "Courbes de niveau LiDAR",
            "description": "Extrait des lignes de contour vectorielles : génération de courbes fondée sur un TIN avec interpolation de l'altitude, de l'intensité ou du temps. Intervalles configurables et filtrage par longueur d'arête.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée optionnel ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel (.shp/.geojson). En mode lot, chaque entrée écrit un fichier .shp voisin."
              },
              "interval": {
                "label": "Intervalle",
                "description": "Intervalle des courbes de niveau (doit être > 0)."
              },
              "base_contour": {
                "label": "Courbe de base",
                "description": "Valeur de décalage de la courbe de base."
              },
              "smooth": {
                "label": "Lisser",
                "description": "Paramètre de lissage de compatibilité (accepté pour la parité de la forme d'appel)."
              },
              "interpolation_parameter": {
                "label": "Paramètre d'interpolation",
                "description": "L'un de elevation, intensity, scan_angle, time ou user_data."
              },
              "returns": {
                "label": "Retours",
                "description": "Filtre de retours : all, first ou last."
              },
              "excluded_classes": {
                "label": "Classes exclues",
                "description": "Valeurs de classes optionnelles à exclure."
              },
              "min_elev": {
                "label": "Élévation minimale",
                "description": "Élévation minimale autorisée des points."
              },
              "max_elev": {
                "label": "Élévation maximale",
                "description": "Élévation maximale autorisée des points."
              },
              "max_triangle_edge_length": {
                "label": "Longueur maximale d'arête de triangle",
                "description": "Longueur maximale optionnelle des arêtes de triangles ; les triangles plus longs sont ignorés."
              }
            }
          },
          "lidar_digital_surface_model": {
            "name": "Modèle numérique de surface LiDAR",
            "description": "Génère un MNS à partir des retours de surface supérieure LiDAR via un TIN : utilise les points candidats les plus hauts localement dans un rayon, puis une triangulation. Représentation de la canopée végétale et du sommet des entités.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "resolution": {
                "label": "Résolution",
                "description": "Taille de cellule en sortie."
              },
              "search_radius": {
                "label": "Rayon de recherche",
                "description": "Rayon de voisinage pour la sélection des candidats de la surface supérieure."
              },
              "min_elev": {
                "label": "Élévation minimale",
                "description": "Seuil d'élévation minimal utilisé pour le filtrage d'inclusion des points."
              },
              "max_elev": {
                "label": "Élévation maximale",
                "description": "Seuil d'élévation maximal utilisé pour le filtrage d'inclusion des points."
              },
              "max_triangle_edge_length": {
                "label": "Longueur maximale d'arête de triangle",
                "description": "Longueur maximale optionnelle des arêtes de triangles pour supprimer les facettes à longues arêtes."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "lidar_hex_bin": {
            "name": "Regroupement hexagonal LiDAR",
            "description": "Agrège les points en hexagones : grille de regroupement avec des résumés par cellule (nombre, z moyen, intensité). Échantillonnage uniforme et regroupement statistique.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé."
              },
              "width": {
                "label": "Largeur",
                "description": "Largeur des hexagones (distance entre côtés opposés)."
              },
              "orientation": {
                "label": "Orientation",
                "description": "Orientation de la grille : h (pointe vers le haut) ou v (côté plat vers le haut)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel."
              }
            }
          },
          "lidar_hillshade": {
            "name": "Ombrage du relief LiDAR",
            "description": "Rendu de la surface LiDAR par ombrage du relief : calcule les normales de surface par point à partir d'un ajustement de plan local, puis ombre selon l'angle d'éclairement. Stocké en RVB pour la visualisation 3D.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "search_radius": {
                "label": "Rayon de recherche",
                "description": "Rayon de voisinage pour l'estimation locale des normales. Les valeurs <= 0 utilisent l'espacement nominal estimé."
              },
              "azimuth": {
                "label": "Azimut",
                "description": "Azimut d'illumination en degrés."
              },
              "altitude": {
                "label": "Altitude",
                "description": "Altitude d'illumination en degrés."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "lidar_idw_interpolation": {
            "name": "Interpolation IDW LiDAR",
            "description": "Maillage LiDAR pondéré par la distance : attribue à chaque cellule la moyenne pondérée des points environnants (puissance de l'inverse de la distance). Surfaces lisses, contrôle via le paramètre d'exposant.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "resolution": {
                "label": "Résolution",
                "description": "Taille de cellule en sortie."
              },
              "weight": {
                "label": "Poids",
                "description": "Exposant IDW (puissance)."
              },
              "search_radius": {
                "label": "Rayon de recherche",
                "description": "Rayon de voisinage ; <=0 bascule en mode k plus proches voisins."
              },
              "interpolation_parameter": {
                "label": "Paramètre d'interpolation",
                "description": "Attribut de point à interpoler (elevation, intensity, class, return_number, number_of_returns, scan_angle, time, rgb, user_data)."
              },
              "returns_included": {
                "label": "Retours inclus",
                "description": "Mode de filtrage des retours : all, first ou last."
              },
              "excluded_classes": {
                "label": "Classes exclues",
                "description": "Classes à exclure (tableau ou chaîne délimitée par des virgules)."
              },
              "min_elev": {
                "label": "Élévation minimale",
                "description": "Seuil d'élévation minimal utilisé pour le filtrage d'inclusion des points."
              },
              "max_elev": {
                "label": "Élévation maximale",
                "description": "Seuil d'élévation maximal utilisé pour le filtrage d'inclusion des points."
              },
              "min_points": {
                "label": "Points minimaux",
                "description": "Nombre minimal de points pour le repli en k plus proches voisins."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "lidar_nearest_neighbour_gridding": {
            "name": "Maillage au plus proche voisin LiDAR",
            "description": "Maillage LiDAR rapide : attribue à chaque cellule la valeur du point le plus proche dans le rayon de recherche. Biais d'interpolation minimal, efficace pour les nuages de points à haute densité. Génération rapide de MNS/MNT.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "resolution": {
                "label": "Résolution",
                "description": "Taille de cellule en sortie."
              },
              "search_radius": {
                "label": "Rayon de recherche",
                "description": "Distance maximale au plus proche voisin ; les cellules au-delà deviennent NoData."
              },
              "interpolation_parameter": {
                "label": "Paramètre d'interpolation",
                "description": "Attribut de point à interpoler (elevation, intensity, class, return_number, number_of_returns, scan_angle, time, rgb, user_data)."
              },
              "returns_included": {
                "label": "Retours inclus",
                "description": "Mode de filtrage des retours : all, first ou last."
              },
              "excluded_classes": {
                "label": "Classes exclues",
                "description": "Classes à exclure (tableau ou chaîne délimitée par des virgules)."
              },
              "min_elev": {
                "label": "Élévation minimale",
                "description": "Seuil d'élévation minimal utilisé pour le filtrage d'inclusion des points."
              },
              "max_elev": {
                "label": "Élévation maximale",
                "description": "Seuil d'élévation maximal utilisé pour le filtrage d'inclusion des points."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "lidar_radial_basis_function_interpolation": {
            "name": "Interpolation par fonctions de base radiale LiDAR",
            "description": "Surface LiDAR lisse par RBF : les fonctions de base radiales capturent la courbure locale et la microtopographie. Maillage de haute qualité avec des dérivées continues à travers les limites.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "resolution": {
                "label": "Résolution",
                "description": "Taille de cellule en sortie."
              },
              "num_points": {
                "label": "Nombre de points",
                "description": "Nombre minimal de voisins utilisés pour l'interpolation locale."
              },
              "search_radius": {
                "label": "Rayon de recherche",
                "description": "Rayon de voisinage ; <=0 utilise uniquement le mode k plus proches voisins."
              },
              "func_type": {
                "label": "Type de fonction",
                "description": "Type de base RBF (thinplatespline, polyharmonic, gaussian, multiquadric, inversemultiquadric)."
              },
              "poly_order": {
                "label": "Ordre du polynôme",
                "description": "Ordre de la tendance polynomiale utilisée pour la correction locale (none, constant, quadratic)."
              },
              "weight": {
                "label": "Poids",
                "description": "Paramètre de forme/exposant de la base selon func_type."
              },
              "interpolation_parameter": {
                "label": "Paramètre d'interpolation",
                "description": "Attribut de point à interpoler (elevation, intensity, class, return_number, number_of_returns, scan_angle, time, rgb, user_data)."
              },
              "returns_included": {
                "label": "Retours inclus",
                "description": "Mode de filtrage des retours : all, first ou last."
              },
              "excluded_classes": {
                "label": "Classes exclues",
                "description": "Classes à exclure (tableau ou chaîne délimitée par des virgules)."
              },
              "min_elev": {
                "label": "Élévation minimale",
                "description": "Seuil d'élévation minimal utilisé pour le filtrage d'inclusion des points."
              },
              "max_elev": {
                "label": "Élévation maximale",
                "description": "Seuil d'élévation maximal utilisé pour le filtrage d'inclusion des points."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "lidar_sibson_interpolation": {
            "name": "Interpolation de Sibson LiDAR",
            "description": "Maillage LiDAR par voisins naturels : interpolation fondée sur Voronoi à l'aide de poids de voisins naturels. Surfaces lisses et d'aspect naturel, sans artefacts de pente aux positions des points.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "resolution": {
                "label": "Résolution",
                "description": "Taille de cellule en sortie."
              },
              "interpolation_parameter": {
                "label": "Paramètre d'interpolation",
                "description": "Attribut de point à interpoler (elevation, intensity, class, return_number, number_of_returns, scan_angle, time, rgb, user_data)."
              },
              "returns_included": {
                "label": "Retours inclus",
                "description": "Mode de filtrage des retours : all, first ou last."
              },
              "excluded_classes": {
                "label": "Classes exclues",
                "description": "Classes à exclure (tableau ou chaîne délimitée par des virgules)."
              },
              "min_elev": {
                "label": "Élévation minimale",
                "description": "Seuil d'élévation minimal utilisé pour le filtrage d'inclusion des points."
              },
              "max_elev": {
                "label": "Élévation maximale",
                "description": "Seuil d'élévation maximal utilisé pour le filtrage d'inclusion des points."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "lidar_thin": {
            "name": "Éclaircir le LiDAR",
            "description": "Décime la densité du nuage de points : conserve ≤1 point par cellule de grille selon une stratégie premier/dernier/plus bas/plus haut/plus proche. Réduit le stockage tout en préservant la couverture et la complexité topographique.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "resolution": {
                "label": "Résolution",
                "description": "Taille de cellule de grille pour l'amincissement (par défaut 1.0)."
              },
              "method": {
                "label": "Méthode",
                "description": "Méthode de sélection du point par cellule : first, last, lowest, highest, nearest (par défaut 'first')."
              },
              "save_filtered": {
                "label": "Enregistrer les points filtrés",
                "description": "Si vrai, écrit aussi les points filtrés et renvoie leur localisateur dans outputs.filtered_path."
              },
              "filtered_output": {
                "label": "Sortie filtrée",
                "description": "Chemin de sortie optionnel pour les points filtrés (mode à entrée unique)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "lidar_thin_high_density": {
            "name": "Éclaircir le LiDAR haute densité",
            "description": "Décimation adaptative de la densité : réduit le nombre de points dans les zones trop denses tout en préservant les zones éparses. Égalise l'échantillonnage malgré des schémas de recouvrement des lignes de vol variables.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "density": {
                "label": "Densité",
                "description": "Seuil de densité de points cible en points par unité de surface."
              },
              "resolution": {
                "label": "Résolution",
                "description": "Résolution de grille utilisée pour le classement en x/y et z (par défaut 1.0)."
              },
              "save_filtered": {
                "label": "Enregistrer les points filtrés",
                "description": "Si vrai, écrit les points filtrés et renvoie outputs.filtered_path."
              },
              "filtered_output": {
                "label": "Sortie filtrée",
                "description": "Chemin de sortie optionnel pour les points filtrés en mode à entrée unique."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "lidar_tile_footprint": {
            "name": "Emprise des tuiles LiDAR",
            "description": "Génère des emprises : boîtes englobantes alignées sur les axes ou enveloppes convexes par nuage de points. Sortie en polygones vectoriels pour l'indexation spatiale et le catalogage des données.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée optionnel ou objet LiDAR typé. S'il est omis, s'exécute sur tous les fichiers LiDAR du répertoire courant."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel pour les emprises."
              },
              "output_hulls": {
                "label": "Enveloppes en sortie",
                "description": "Si vrai, écrit des emprises en enveloppe convexe ; sinon écrit des rectangles englobants alignés sur les axes."
              }
            }
          },
          "lidar_tin_gridding": {
            "name": "Maillage TIN LiDAR",
            "description": "Interpolation LiDAR exacte par TIN : construit une triangulation de Delaunay à partir des points et interpole les valeurs des cellules à partir des plans des triangles. Respecte les hauteurs des points, excellent pour une couverture irrégulière.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "resolution": {
                "label": "Résolution",
                "description": "Taille de cellule en sortie."
              },
              "max_triangle_edge_length": {
                "label": "Longueur maximale d'arête de triangle",
                "description": "Longueur maximale optionnelle des arêtes de triangles pour supprimer les facettes à longues arêtes."
              },
              "interpolation_parameter": {
                "label": "Paramètre d'interpolation",
                "description": "Attribut de point à interpoler (elevation, intensity, class, return_number, number_of_returns, scan_angle, time, rgb, user_data)."
              },
              "returns_included": {
                "label": "Retours inclus",
                "description": "Mode de filtrage des retours : all, first ou last."
              },
              "excluded_classes": {
                "label": "Classes exclues",
                "description": "Classes à exclure (tableau ou chaîne délimitée par des virgules)."
              },
              "min_elev": {
                "label": "Élévation minimale",
                "description": "Seuil d'élévation minimal utilisé pour le filtrage d'inclusion des points."
              },
              "max_elev": {
                "label": "Élévation maximale",
                "description": "Seuil d'élévation maximal utilisé pour le filtrage d'inclusion des points."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              },
              "triangulation_backend": {
                "label": "Moteur de triangulation",
                "description": "Sélection du moteur de triangulation : auto, delaunator ou wbtopology."
              },
              "triangulation_auto_threshold": {
                "label": "Seuil automatique de triangulation",
                "description": "Lorsque backend=auto, bascule vers wbtopology à ce nombre d'échantillons (désactivé par défaut ; à définir explicitement pour activer)."
              },
              "triangulation_epsilon": {
                "label": "Epsilon de triangulation",
                "description": "Epsilon utilisé par le moteur wbtopology pour la gestion des doublons (par défaut 1e-12)."
              },
              "triangulation_thin_cell_size": {
                "label": "Taille de cellule d'amincissement de triangulation",
                "description": "Taille de cellule optionnelle de pré-amincissement des échantillons de triangulation ; les valeurs > 0 activent l'amincissement et 0 le désactive."
              },
              "triangulation_thin_method": {
                "label": "Méthode d'amincissement de triangulation",
                "description": "Méthode du point représentatif pour l'amincissement : nearest_center, min_value ou max_value."
              }
            }
          },
          "colourize_based_on_class": {
            "name": "Coloriser selon la classe",
            "description": "Colore les points par classe : couleurs standard ASPRS (vert=végétation, marron=sol, gris=bâtiment, etc.). Fondu avec l'intensité pour le contraste. Visualisation de la classification.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "intensity_blending_amount": {
                "label": "Quantité de mélange d'intensité",
                "description": "Pourcentage de mélange [0,100] entre la couleur de classe et l'intensité."
              },
              "clr_str": {
                "label": "Chaîne de couleurs",
                "description": "Remplacements optionnels des couleurs de classes, p. ex. '2:(184,167,108);5:#9ab86c'."
              },
              "use_unique_clrs_for_buildings": {
                "label": "Couleurs uniques pour les bâtiments",
                "description": "Si vrai, affecte des couleurs uniques aux grappes de bâtiments connexes."
              },
              "search_radius": {
                "label": "Rayon de recherche",
                "description": "Rayon de voisinage utilisé pour la coloration des grappes de bâtiments."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "colourize_based_on_point_returns": {
            "name": "Coloriser selon les retours du point",
            "description": "Colore les points selon l'ordre de retour : les retours premier/intermédiaire/dernier ont des couleurs distinctes. Visualisation de la structure des impulsions à retours multiples pour la validation du traitement.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "intensity_blending_amount": {
                "label": "Quantité de mélange d'intensité",
                "description": "Pourcentage de mélange [0,100] entre la couleur de retour et l'intensité."
              },
              "only_ret_colour": {
                "label": "Couleur des retours uniques",
                "description": "Couleur des points à retour unique."
              },
              "first_ret_colour": {
                "label": "Couleur des premiers retours",
                "description": "Couleur des points de premier retour dans les impulsions à retours multiples."
              },
              "intermediate_ret_colour": {
                "label": "Couleur des retours intermédiaires",
                "description": "Couleur des points de retours intermédiaires."
              },
              "last_ret_colour": {
                "label": "Couleur des derniers retours",
                "description": "Couleur des points de dernier retour dans les impulsions à retours multiples."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "find_flightline_edge_points": {
            "name": "Trouver les points de bord de ligne de vol",
            "description": "Filtre les points de bord de vol : extrait uniquement les points situés aux limites des fauchées d'acquisition. Contrôle qualité des recouvrements de bandes et des effets de bord.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "individual_tree_detection": {
            "name": "Détection d'arbres individuels",
            "description": "Identifie les sommets des arbres : maxima locaux dans un nuage de points filtré par hauteur avec un rayon de recherche adaptatif. Renvoie un shapefile vectoriel de points des positions potentielles des troncs.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé."
              },
              "min_search_radius": {
                "label": "Rayon de recherche minimal",
                "description": "Rayon de recherche minimal en unités carte (par défaut 1.0)."
              },
              "min_height": {
                "label": "Hauteur minimale",
                "description": "Hauteur minimale pour considérer les points (par défaut 0.0)."
              },
              "max_search_radius": {
                "label": "Rayon de recherche maximal",
                "description": "Rayon de recherche maximal ; s'il n'est pas défini, utilise min_search_radius."
              },
              "max_height": {
                "label": "Hauteur maximale",
                "description": "Hauteur maximale ; si elle n'est pas définie, utilise min_height."
              },
              "only_use_veg": {
                "label": "Utiliser uniquement la végétation",
                "description": "Si vrai, ne traite que les classes de végétation (par défaut true)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du shapefile vectoriel en sortie."
              }
            }
          },
          "lidar_eigenvalue_features": {
            "name": "Attributs de valeurs propres LiDAR",
            "description": "Dérive des caractéristiques ACP : valeurs/vecteurs propres des voisinages. Descripteurs de forme (planéité, linéarité, variance de hauteur) pour l'analyse de nuages de points.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée optionnel ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "num_neighbours": {
                "label": "Nombre de voisins",
                "description": "Taille de voisinage cible optionnelle (hors point lui-même)."
              },
              "search_radius": {
                "label": "Rayon de recherche",
                "description": "Rayon de recherche maximal optionnel pour la collecte du voisinage."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin .eigen de sortie optionnel en mode à entrée unique."
              }
            }
          },
          "lidar_histogram": {
            "name": "Histogramme LiDAR",
            "description": "Calcule la distribution d'un attribut : histogramme de fréquences de l'altitude, de l'intensité, de l'angle de balayage ou de la classe. Centiles écrêtés pour supprimer les valeurs aberrantes. Visualisation HTML.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin HTML de sortie optionnel pour le rapport d'histogramme."
              },
              "parameter": {
                "label": "Paramètre",
                "description": "L'un de elevation, intensity, scan angle, class ou time."
              },
              "clip_percent": {
                "label": "Pourcentage d'écrêtage",
                "description": "Quantité d'écrêtage par percentile dans [0,50] pour les queues inférieure/supérieure."
              }
            }
          },
          "lidar_info": {
            "name": "Informations LiDAR",
            "description": "Génère un rapport de synthèse des métadonnées : nombre de points, étendue, plage d'intensité, histogramme des classes, distribution des retours. Sortie HTML/texte pour la documentation des données.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du rapport (.html/.txt)."
              },
              "show_point_density": {
                "label": "Afficher la densité de points",
                "description": "Si vrai, inclut des métriques approximatives de densité de points de l'emprise."
              },
              "show_vlrs": {
                "label": "Afficher les VLR",
                "description": "Indicateur de compatibilité ; réservé à une future sortie détaillée de métadonnées."
              },
              "show_geokeys": {
                "label": "Afficher les clés GeoTIFF",
                "description": "Indicateur de compatibilité ; réservé à une future sortie détaillée des clés de SCR."
              }
            }
          },
          "lidar_kappa": {
            "name": "Kappa LiDAR",
            "description": "Calcule un rapport d'accord kappa entre deux nuages LiDAR classifiés et écrit un raster d'accord des classes.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Chemin LiDAR de classification ou objet LiDAR typé."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Chemin LiDAR de référence ou objet LiDAR typé."
              },
              "report": {
                "label": "Rapport",
                "description": "Chemin du rapport HTML en sortie."
              },
              "resolution": {
                "label": "Résolution",
                "description": "Résolution de grille pour la sortie spatiale de concordance des classes."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              },
              "output_class_accuracy": {
                "label": "Précision par classe en sortie",
                "description": "Indicateur de compatibilité conservé pour la parité avec l'ancienne version ; le raster de concordance est toujours produit."
              }
            }
          },
          "lidar_point_density": {
            "name": "Densité de points LiDAR",
            "description": "Cartographie l'intensité d'échantillonnage LiDAR : nombre de points par unité de surface (comptage dans un rayon par cellule). Évaluation de la qualité des données, analyse de la couverture, visualisation des schémas d'acquisition.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "resolution": {
                "label": "Résolution",
                "description": "Taille de cellule en sortie."
              },
              "search_radius": {
                "label": "Rayon de recherche",
                "description": "Rayon de voisinage pour le comptage des points."
              },
              "returns_included": {
                "label": "Retours inclus",
                "description": "Mode de filtrage des retours : all, first ou last."
              },
              "excluded_classes": {
                "label": "Classes exclues",
                "description": "Classes à exclure (tableau ou chaîne délimitée par des virgules)."
              },
              "min_elev": {
                "label": "Élévation minimale",
                "description": "Seuil d'élévation minimal utilisé pour le filtrage d'inclusion des points."
              },
              "max_elev": {
                "label": "Élévation maximale",
                "description": "Seuil d'élévation maximal utilisé pour le filtrage d'inclusion des points."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "lidar_point_return_analysis": {
            "name": "Analyse des retours de points LiDAR",
            "description": "Outil de contrôle qualité : vérifie la validité des séquences de retours (cohérence multiple/premier/dernier). Génère un rapport + une sortie classifiée signalant les anomalies de retours. Contrôle d'intégrité des données.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé."
              },
              "create_output": {
                "label": "Créer une sortie",
                "description": "Si vrai, écrit une sortie LiDAR classifiée de contrôle qualité."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie LiDAR optionnel utilisé lorsque create_output=true."
              },
              "report": {
                "label": "Rapport",
                "description": "Chemin de sortie optionnel du rapport texte."
              }
            }
          },
          "lidar_point_stats": {
            "name": "Statistiques de points LiDAR",
            "description": "Crée des grilles raster de statistiques : nombre de points, nombre d'impulsions, points moyens par impulsion, plage de z/intensité, classe prédominante par cellule. Analyse à sorties multiples.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée optionnel ou objet LiDAR typé. S'il est omis, s'exécute en mode lot sur les fichiers LiDAR du répertoire courant."
              },
              "resolution": {
                "label": "Résolution",
                "description": "Résolution de la grille en sortie."
              },
              "num_points": {
                "label": "Nombre de points",
                "description": "Créer un raster de nombre de points."
              },
              "num_pulses": {
                "label": "Nombre d'impulsions",
                "description": "Créer un raster de nombre d'impulsions à retour précoce."
              },
              "avg_points_per_pulse": {
                "label": "Points moyens par impulsion",
                "description": "Créer un raster de points moyens par impulsion."
              },
              "z_range": {
                "label": "Plage Z",
                "description": "Créer un raster de plage d'élévation."
              },
              "intensity_range": {
                "label": "Plage d'intensité",
                "description": "Créer un raster de plage d'intensité."
              },
              "predominant_class": {
                "label": "Classe prédominante",
                "description": "Créer un raster de classe prédominante."
              },
              "output_directory": {
                "label": "Répertoire de sortie",
                "description": "Répertoire de sortie optionnel pour les rasters générés."
              }
            }
          },
          "lidar_ransac_planes": {
            "name": "Plans RANSAC LiDAR",
            "description": "Identifie les points LiDAR localement plans par ajustement de plans RANSAC dans le voisinage.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé."
              },
              "search_radius": {
                "label": "Rayon de recherche",
                "description": "Rayon de voisinage pour l'ajustement de plan local."
              },
              "num_iterations": {
                "label": "Nombre d'itérations",
                "description": "Nombre d'itérations RANSAC par point."
              },
              "num_samples": {
                "label": "Nombre d'échantillons",
                "description": "Nombre de points voisins échantillonnés par itération RANSAC."
              },
              "inlier_threshold": {
                "label": "Seuil d'inliers",
                "description": "Résidu point-plan maximal pour les inliers."
              },
              "acceptable_model_size": {
                "label": "Taille de modèle acceptable",
                "description": "Nombre minimal de points inliers requis pour un modèle planaire."
              },
              "max_planar_slope": {
                "label": "Pente planaire maximale",
                "description": "Pente de plan maximale acceptée en degrés."
              },
              "classify": {
                "label": "Classer",
                "description": "Si vrai, classe les points planaires et non planaires au lieu de filtrer."
              },
              "only_last_returns": {
                "label": "Derniers retours uniquement",
                "description": "Si vrai, n'utilise que les retours tardifs dans l'ajustement du modèle."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "lidar_rooftop_analysis": {
            "name": "Analyse de toitures LiDAR",
            "description": "Identifie les segments de toiture plans dans les emprises de bâtiments et produit des polygones de segments avec des attributs de toiture.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Chemins LiDAR en entrée ou objets LiDAR typés."
              },
              "building_footprints": {
                "label": "Emprises de bâtiments",
                "description": "Couche de polygones d'emprises de bâtiments."
              },
              "search_radius": {
                "label": "Rayon de recherche",
                "description": "Rayon de voisinage pour l'analyse locale des toits."
              },
              "inlier_threshold": {
                "label": "Seuil d'inliers",
                "description": "Résidu maximal pour le support planaire local."
              },
              "acceptable_model_size": {
                "label": "Taille de modèle acceptable",
                "description": "Taille minimale de segment."
              },
              "max_planar_slope": {
                "label": "Pente planaire maximale",
                "description": "Pente maximale des facettes de toiture en degrés."
              },
              "norm_diff_threshold": {
                "label": "Seuil de différence des normales",
                "description": "Différence angulaire maximale entre normales voisines en degrés."
              },
              "azimuth": {
                "label": "Azimut",
                "description": "Azimut d'illumination pour l'éclairage des facettes de type ombrage."
              },
              "altitude": {
                "label": "Altitude",
                "description": "Altitude d'illumination pour l'éclairage des facettes de type ombrage."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel."
              }
            }
          },
          "normal_vectors": {
            "name": "Vecteurs normaux",
            "description": "Calcule les normales de surface par point : une ACP sur le voisinage local estime l'orientation du plan. Normales stockées dans les enregistrements de points et visualisation RVB.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin LiDAR en entrée ou objet LiDAR typé."
              },
              "search_radius": {
                "label": "Rayon de recherche",
                "description": "Rayon de voisinage pour l'ajustement de plan local. Les valeurs <= 0 utilisent un espacement nominal estimé."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel."
              }
            }
          },
          "snap_events_to_routes": {
            "name": "Accrocher les événements aux routes",
            "description": "Accroche des points d'événements aux lignes d'itinéraire et fournit des diagnostics de mesure/décalage d'itinéraire.",
            "params": {
              "routes": {
                "label": "Itinéraires",
                "description": "Couche de lignes d'itinéraires en entrée."
              },
              "events": {
                "label": "Événements",
                "description": "Couche de points d'événements en entrée."
              },
              "max_offset_distance": {
                "label": "Distance de décalage maximale",
                "description": "Distance maximale optionnelle de décalage par rapport à l'itinéraire en unités carte."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de points d'événements accrochés en sortie."
              }
            }
          },
          "locate_points_along_routes": {
            "name": "Localiser des points le long des routes",
            "description": "Localise des entités ponctuelles le long de lignes d'itinéraire et écrit des attributs de mesure d'itinéraire.",
            "params": {
              "routes": {
                "label": "Itinéraires",
                "description": "Couche de lignes d'itinéraires en entrée."
              },
              "points": {
                "label": "Points",
                "description": "Couche de points en entrée à localiser le long des itinéraires."
              },
              "max_offset_distance": {
                "label": "Distance de décalage maximale",
                "description": "Distance maximale optionnelle de décalage entre le point et l'itinéraire."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de points en sortie."
              }
            }
          },
          "points_along_lines": {
            "name": "Points le long des lignes",
            "description": "Génère des entités ponctuelles régulièrement espacées le long de polylignes en entrée pour la surveillance des infrastructures, l'échantillonnage environnemental et l'analyse spatiale.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de lignes en entrée."
              },
              "spacing": {
                "label": "Espacement",
                "description": "Distance d'espacement entre les points."
              },
              "include_end": {
                "label": "Inclure la fin",
                "description": "Inclure les extrémités des lignes (par défaut true)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de points en sortie."
              }
            }
          },
          "route_calibrate": {
            "name": "Calibrer une route",
            "description": "Étalonne les mesures de début/fin d'itinéraire à partir de points de contrôle de mesures connues.",
            "params": {
              "routes": {
                "label": "Itinéraires",
                "description": "Couche de lignes d'itinéraires en entrée."
              },
              "control_points": {
                "label": "Points de contrôle",
                "description": "Couche de points de contrôle en entrée."
              },
              "control_measure_field": {
                "label": "Champ de mesure de contrôle",
                "description": "Champ des points de contrôle contenant les valeurs de mesure connues."
              },
              "route_id_field": {
                "label": "Champ d'identifiant d'itinéraire",
                "description": "Champ d'identifiant d'itinéraire optionnel dans routes. Par défaut le FID de l'entité."
              },
              "control_route_id_field": {
                "label": "Champ d'identifiant d'itinéraire de contrôle",
                "description": "Champ d'identifiant d'itinéraire optionnel dans les points de contrôle. Par défaut le FID de l'entité."
              },
              "from_measure_field": {
                "label": "Champ de mesure de début",
                "description": "Champ de sortie pour la mesure de début de l'itinéraire (par défaut 'from_measure')."
              },
              "to_measure_field": {
                "label": "Champ de mesure de fin",
                "description": "Champ de sortie pour la mesure de fin de l'itinéraire (par défaut 'to_measure')."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Distance maximale de décalage des points de contrôle par rapport à la géométrie de l'itinéraire (par défaut 1.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche d'itinéraires calibrés en sortie."
              }
            }
          },
          "route_event_lines_from_layer": {
            "name": "Lignes d'événements de route depuis une couche",
            "description": "Crée des événements linéaires d'itinéraire à partir d'une couche vectorielle d'événements à l'aide de mesures de/à.",
            "params": {
              "routes": {
                "label": "Itinéraires",
                "description": "Couche de lignes d'itinéraires en entrée."
              },
              "events": {
                "label": "Événements",
                "description": "Couche vectorielle d'événements en entrée."
              },
              "event_route_field": {
                "label": "Champ d'itinéraire d'événement",
                "description": "Champ de la couche d'événements contenant les identifiants d'itinéraires."
              },
              "from_measure_field": {
                "label": "Champ de mesure de début",
                "description": "Champ de la couche d'événements contenant les mesures de début."
              },
              "to_measure_field": {
                "label": "Champ de mesure de fin",
                "description": "Champ de la couche d'événements contenant les mesures de fin."
              },
              "route_id_field": {
                "label": "Champ d'identifiant d'itinéraire",
                "description": "Champ optionnel de la couche d'itinéraires contenant les identifiants d'itinéraires. Par défaut le FID de l'entité."
              },
              "write_event_fid": {
                "label": "Écrire le FID d'événement",
                "description": "Écrire EVENT_FID pour préserver les identifiants d'entités des événements sources (par défaut true)."
              },
              "write_event_xy": {
                "label": "Écrire les XY d'événement",
                "description": "Écrire les attributs X/Y de la géométrie des événements sources (par défaut false)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de lignes en sortie."
              }
            }
          },
          "route_event_lines_from_table": {
            "name": "Lignes d'événements de route depuis une table",
            "description": "Crée des événements linéaires d'itinéraire à partir d'une table d'événements CSV et d'une couche d'itinéraires à l'aide de mesures de/à.",
            "params": {
              "routes": {
                "label": "Itinéraires",
                "description": "Couche de lignes d'itinéraires en entrée."
              },
              "events": {
                "label": "Événements",
                "description": "Chemin de la table CSV d'événements en entrée."
              },
              "event_route_field": {
                "label": "Champ d'itinéraire d'événement",
                "description": "Champ CSV contenant les identifiants d'itinéraires."
              },
              "from_measure_field": {
                "label": "Champ de mesure de début",
                "description": "Champ CSV contenant les mesures de début."
              },
              "to_measure_field": {
                "label": "Champ de mesure de fin",
                "description": "Champ CSV contenant les mesures de fin."
              },
              "route_id_field": {
                "label": "Champ d'identifiant d'itinéraire",
                "description": "Champ optionnel de la couche d'itinéraires contenant les identifiants d'itinéraires. Par défaut le FID de l'entité."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de lignes en sortie."
              }
            }
          },
          "route_event_merge": {
            "name": "Fusionner les événements de route",
            "description": "Fusionne les événements d'itinéraire adjacents compatibles.",
            "params": {
              "events": {
                "label": "Événements",
                "description": "Couche d'événements en entrée contenant les intervalles d'itinéraires."
              },
              "event_route_field": {
                "label": "Champ d'itinéraire d'événement",
                "description": "Champ d'identifiant d'itinéraire de la couche d'événements."
              },
              "from_measure_field": {
                "label": "Champ de mesure de début",
                "description": "Champ de début d'intervalle de la couche d'événements."
              },
              "to_measure_field": {
                "label": "Champ de mesure de fin",
                "description": "Champ de fin d'intervalle de la couche d'événements."
              },
              "group_fields": {
                "label": "Champs de regroupement",
                "description": "Champs optionnels délimités par des virgules utilisés pour la compatibilité de fusion. Par défaut tous les champs hors mesures."
              },
              "gap_tolerance": {
                "label": "Tolérance d'écart",
                "description": "Écart maximal autorisé pour la fusion par adjacence (par défaut 0.0)."
              },
              "conflict_mode": {
                "label": "Mode de conflit",
                "description": "Mode de gestion des chevauchements : error|skip (par défaut error)."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche d'événements fusionnés en sortie."
              }
            }
          },
          "route_event_overlay": {
            "name": "Superposer les événements de route",
            "description": "Superpose deux couches d'événements d'itinéraire selon le recouvrement des intervalles.",
            "params": {
              "primary_events": {
                "label": "Événements primaires",
                "description": "Couche d'événements primaires."
              },
              "overlay_events": {
                "label": "Événements de superposition",
                "description": "Couche d'événements de superposition."
              },
              "primary_route_field": {
                "label": "Champ d'itinéraire primaire",
                "description": "Champ d'identifiant d'itinéraire de la couche primaire."
              },
              "primary_from_measure_field": {
                "label": "Champ de mesure de début primaire",
                "description": "Champ de début d'intervalle de la couche primaire."
              },
              "primary_to_measure_field": {
                "label": "Champ de mesure de fin primaire",
                "description": "Champ de fin d'intervalle de la couche primaire."
              },
              "overlay_route_field": {
                "label": "Champ d'itinéraire de superposition",
                "description": "Champ d'identifiant d'itinéraire de la couche de superposition."
              },
              "overlay_from_measure_field": {
                "label": "Champ de mesure de début de superposition",
                "description": "Champ de début d'intervalle de la couche de superposition."
              },
              "overlay_to_measure_field": {
                "label": "Champ de mesure de fin de superposition",
                "description": "Champ de fin d'intervalle de la couche de superposition."
              },
              "min_overlap_length": {
                "label": "Longueur de chevauchement minimale",
                "description": "Longueur de chevauchement minimale à conserver (par défaut 0.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche de superposition en sortie."
              }
            }
          },
          "route_event_points_from_layer": {
            "name": "Points d'événements de route depuis une couche",
            "description": "Crée des événements ponctuels d'itinéraire à partir d'une couche vectorielle d'événements et d'une couche d'itinéraires.",
            "params": {
              "routes": {
                "label": "Itinéraires",
                "description": "Couche de lignes d'itinéraires en entrée."
              },
              "events": {
                "label": "Événements",
                "description": "Couche vectorielle d'événements en entrée."
              },
              "event_route_field": {
                "label": "Champ d'itinéraire d'événement",
                "description": "Champ de la couche d'événements contenant les identifiants d'itinéraires."
              },
              "measure_field": {
                "label": "Champ de mesure",
                "description": "Champ de la couche d'événements contenant les mesures des événements ponctuels."
              },
              "route_id_field": {
                "label": "Champ d'identifiant d'itinéraire",
                "description": "Champ optionnel de la couche d'itinéraires contenant les identifiants d'itinéraires. Par défaut le FID de l'entité."
              },
              "write_event_fid": {
                "label": "Écrire le FID d'événement",
                "description": "Écrire EVENT_FID pour préserver les identifiants d'entités des événements sources (par défaut true)."
              },
              "write_event_xy": {
                "label": "Écrire les XY d'événement",
                "description": "Écrire les attributs X/Y de la géométrie des événements sources (par défaut false)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de points en sortie."
              }
            }
          },
          "route_event_points_from_table": {
            "name": "Points d'événements de route depuis une table",
            "description": "Crée des événements ponctuels d'itinéraire à partir d'une table d'événements CSV et d'une couche d'itinéraires.",
            "params": {
              "routes": {
                "label": "Itinéraires",
                "description": "Couche de lignes d'itinéraires en entrée."
              },
              "events": {
                "label": "Événements",
                "description": "Chemin de la table CSV d'événements en entrée."
              },
              "event_route_field": {
                "label": "Champ d'itinéraire d'événement",
                "description": "Champ CSV contenant les identifiants d'itinéraires."
              },
              "measure_field": {
                "label": "Champ de mesure",
                "description": "Champ CSV contenant les mesures des événements ponctuels."
              },
              "route_id_field": {
                "label": "Champ d'identifiant d'itinéraire",
                "description": "Champ optionnel de la couche d'itinéraires contenant les identifiants d'itinéraires. Par défaut le FID de l'entité."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de points en sortie."
              }
            }
          },
          "route_event_split": {
            "name": "Scinder les événements de route",
            "description": "Scinde les événements d'itinéraire selon des mesures de limites par itinéraire.",
            "params": {
              "events": {
                "label": "Événements",
                "description": "Couche d'événements en entrée contenant les intervalles d'itinéraires."
              },
              "boundaries": {
                "label": "Limites",
                "description": "Couche de limites en entrée contenant les points de rupture de mesure des itinéraires."
              },
              "event_route_field": {
                "label": "Champ d'itinéraire d'événement",
                "description": "Champ d'identifiant d'itinéraire de la couche d'événements."
              },
              "from_measure_field": {
                "label": "Champ de mesure de début",
                "description": "Champ de début d'intervalle de la couche d'événements."
              },
              "to_measure_field": {
                "label": "Champ de mesure de fin",
                "description": "Champ de fin d'intervalle de la couche d'événements."
              },
              "boundary_route_field": {
                "label": "Champ d'itinéraire de limite",
                "description": "Champ d'identifiant d'itinéraire de la couche de limites."
              },
              "boundary_measure_field": {
                "label": "Champ de mesure de limite",
                "description": "Champ de mesure de la couche de limites."
              },
              "min_segment_length": {
                "label": "Longueur minimale de segment",
                "description": "Longueur minimale optionnelle des segments divisés à conserver (par défaut 0.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche d'événements divisés en sortie."
              }
            }
          },
          "route_measure_qa": {
            "name": "Contrôle qualité des mesures de route",
            "description": "Diagnostique les lacunes de mesures, les chevauchements, les séquences non monotones et les mesures en double des événements d'itinéraire.",
            "params": {
              "events": {
                "label": "Événements",
                "description": "Couche d'événements en entrée contenant les intervalles d'itinéraires."
              },
              "route_field": {
                "label": "Champ d'itinéraire",
                "description": "Champ d'identifiant d'itinéraire."
              },
              "from_measure_field": {
                "label": "Champ de mesure de début",
                "description": "Champ de début d'intervalle."
              },
              "to_measure_field": {
                "label": "Champ de mesure de fin",
                "description": "Champ de fin d'intervalle."
              },
              "gap_tolerance": {
                "label": "Tolérance d'écart",
                "description": "Tolérance d'écart (par défaut 0.0)."
              },
              "overlap_tolerance": {
                "label": "Tolérance de chevauchement",
                "description": "Tolérance de chevauchement (par défaut 0.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche de diagnostics de contrôle qualité en sortie."
              }
            }
          },
          "route_recalibrate": {
            "name": "Recalibrer une route",
            "description": "Réétalonne les mesures d'itinéraire modifiées à partir d'une couche d'itinéraires de référence tout en préservant la continuité des mesures.",
            "params": {
              "original_routes": {
                "label": "Itinéraires d'origine",
                "description": "Itinéraires de référence contenant les mesures calibrées antérieures."
              },
              "edited_routes": {
                "label": "Itinéraires modifiés",
                "description": "Itinéraires modifiés à recalibrer."
              },
              "route_id_field": {
                "label": "Champ d'identifiant d'itinéraire",
                "description": "Champ d'identifiant d'itinéraire partagé optionnel. Par défaut le FID de l'entité."
              },
              "from_measure_field": {
                "label": "Champ de mesure de début",
                "description": "Nom du champ de début de mesure (par défaut 'from_measure')."
              },
              "to_measure_field": {
                "label": "Champ de mesure de fin",
                "description": "Nom du champ de fin de mesure (par défaut 'to_measure')."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche d'itinéraires recalibrés en sortie."
              }
            }
          },
          "build_network_topology": {
            "name": "Construire la topologie du réseau",
            "description": "Construit un réseau linéaire topologique nodé avec des sorties d'arêtes et de nœuds stables.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de réseau linéaire en entrée."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage optionnelle utilisée lors de la détection et de la division des intersections."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur d'arêtes nodées topologiquement en sortie."
              },
              "nodes_output": {
                "label": "Nœuds en sortie",
                "description": "Chemin du vecteur de nœuds en sortie optionnel."
              }
            }
          },
          "closest_facility_network": {
            "name": "Ressource la plus proche sur le réseau",
            "description": "Trouve l'itinéraire réseau de coût minimal de chaque point d'incident vers le point d'équipement accessible le plus proche.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de réseau linéaire en entrée."
              },
              "incidents": {
                "label": "Incidents",
                "description": "Couche de points d'incidents/de demande."
              },
              "facilities": {
                "label": "Installations",
                "description": "Couche de points d'installations/d'offre."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage des nœuds optionnelle pour la construction du graphe."
              },
              "max_snap_distance": {
                "label": "Distance d'accrochage maximale",
                "description": "Distance maximale optionnelle entre les points d'incidents/d'installations et le nœud de réseau le plus proche."
              },
              "edge_cost_field": {
                "label": "Champ de coût d'arête",
                "description": "Champ numérique de ligne optionnel utilisé comme multiplicateur d'impédance de la longueur des segments."
              },
              "one_way_field": {
                "label": "Champ de sens unique",
                "description": "Champ de ligne optionnel marquant les arêtes numérisées à sens unique (true/1/yes signifie du premier au second sommet uniquement)."
              },
              "blocked_field": {
                "label": "Champ de blocage",
                "description": "Champ de ligne optionnel marquant les arêtes bloquées/fermées à exclure du routage (true/1/yes bloque)."
              },
              "barriers": {
                "label": "Barrières",
                "description": "Couche de points de barrières optionnelle ; les nœuds de réseau les plus proches sont exclus de la traversée."
              },
              "barrier_snap_distance": {
                "label": "Distance d'accrochage des barrières",
                "description": "Distance maximale optionnelle entre chaque point de barrière et un nœud de réseau pour le blocage."
              },
              "node_cost_points": {
                "label": "Points de coût de nœud",
                "description": "Couche de points optionnelle fournissant des coûts d'entrée par nœud (p. ex. délai aux intersections)."
              },
              "node_cost_field": {
                "label": "Champ de coût de nœud",
                "description": "Champ numérique de node_cost_points contenant les coûts non négatifs par nœud."
              },
              "node_cost_snap_distance": {
                "label": "Distance d'accrochage du coût de nœud",
                "description": "Distance maximale optionnelle entre chaque point de coût de nœud et un nœud de réseau pour l'affectation."
              },
              "turn_penalty": {
                "label": "Pénalité de virage",
                "description": "Coût additif optionnel appliqué aux virages non rectilignes aux nœuds du réseau."
              },
              "u_turn_penalty": {
                "label": "Pénalité de demi-tour",
                "description": "Coût additif optionnel appliqué aux transitions en demi-tour."
              },
              "forbid_u_turns": {
                "label": "Interdire les demi-tours",
                "description": "Si vrai, interdit les transitions en demi-tour."
              },
              "forbid_left_turns": {
                "label": "Interdire les virages à gauche",
                "description": "Si vrai, interdit les transitions en virage à gauche."
              },
              "forbid_right_turns": {
                "label": "Interdire les virages à droite",
                "description": "Si vrai, interdit les transitions en virage à droite."
              },
              "turn_restrictions_csv": {
                "label": "CSV des restrictions de virage",
                "description": "CSV optionnel de transitions de virage utilisant les colonnes prev_x,prev_y,node_x,node_y,next_x,next_y. Colonnes optionnelles : forbidden (par défaut true lorsqu'aucune colonne turn_cost n'est fournie) et turn_cost (ou penalty/cost/extra_cost) pour un coût additif par virage."
              },
              "temporal_cost_profile": {
                "label": "Profil de coût temporel",
                "description": "CSV optionnel définissant des coûts d'arêtes dépendant du temps (colonnes : edge_id,dow,start_minute,end_minute,value)."
              },
              "temporal_edge_id_field": {
                "label": "Champ d'identifiant d'arête temporel",
                "description": "Champ de réseau optionnel utilisé pour faire correspondre les valeurs edge_id de temporal_cost_profile (par défaut EDGE_ID)."
              },
              "departure_time": {
                "label": "Heure de départ",
                "description": "Heure de départ RFC3339 optionnelle utilisée pour la recherche dans le profil temporel."
              },
              "temporal_mode": {
                "label": "Mode temporel",
                "description": "Mode d'interprétation temporelle optionnel : multiplier ou absolute."
              },
              "temporal_fallback": {
                "label": "Repli temporel",
                "description": "Repli optionnel lorsque la ligne temporelle est absente : static_cost ou error."
              },
              "temporal_profile_report": {
                "label": "Rapport du profil temporel",
                "description": "Chemin de sortie JSON optionnel pour les diagnostics du profil temporel (couverture, arêtes non appariées, utilisation du repli)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de lignes d'itinéraires vers l'installation la plus proche en sortie."
              }
            }
          },
          "generate_network_nodes": {
            "name": "Générer les nœuds du réseau",
            "description": "Génère des nœuds de réseau et des diagnostics de nœuds à partir de la topologie des lignes.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de réseau linéaire en entrée."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage des nœuds optionnelle pour la construction du graphe."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de points de nœuds en sortie."
              }
            }
          },
          "k_shortest_paths_network": {
            "name": "K plus courts chemins sur le réseau",
            "description": "Trouve les k plus courts chemins simples entre des coordonnées de départ et d'arrivée sur un réseau linéaire.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de réseau linéaire en entrée."
              },
              "start_x": {
                "label": "X de départ",
                "description": "Coordonnée x de départ."
              },
              "start_y": {
                "label": "Y de départ",
                "description": "Coordonnée y de départ."
              },
              "end_x": {
                "label": "X d'arrivée",
                "description": "Coordonnée x d'arrivée."
              },
              "end_y": {
                "label": "Y d'arrivée",
                "description": "Coordonnée y d'arrivée."
              },
              "k": {
                "label": "K",
                "description": "Nombre de plus courts chemins à renvoyer."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage des nœuds optionnelle pour la construction du graphe."
              },
              "max_snap_distance": {
                "label": "Distance d'accrochage maximale",
                "description": "Distance maximale optionnelle entre les coordonnées de départ/d'arrivée et le nœud de réseau le plus proche."
              },
              "edge_cost_field": {
                "label": "Champ de coût d'arête",
                "description": "Champ numérique de ligne optionnel utilisé comme multiplicateur d'impédance de la longueur des segments."
              },
              "one_way_field": {
                "label": "Champ de sens unique",
                "description": "Champ de ligne optionnel marquant les arêtes numérisées à sens unique (true/1/yes signifie du premier au second sommet uniquement)."
              },
              "blocked_field": {
                "label": "Champ de blocage",
                "description": "Champ de ligne optionnel marquant les arêtes bloquées/fermées à exclure du routage (true/1/yes bloque)."
              },
              "barriers": {
                "label": "Barrières",
                "description": "Couche de points de barrières optionnelle ; les nœuds de réseau les plus proches sont exclus de la traversée."
              },
              "barrier_snap_distance": {
                "label": "Distance d'accrochage des barrières",
                "description": "Distance maximale optionnelle entre chaque point de barrière et un nœud de réseau pour le blocage."
              },
              "node_cost_points": {
                "label": "Points de coût de nœud",
                "description": "Couche de points optionnelle fournissant des coûts d'entrée par nœud (p. ex. délai aux intersections)."
              },
              "node_cost_field": {
                "label": "Champ de coût de nœud",
                "description": "Champ numérique de node_cost_points contenant les coûts non négatifs par nœud."
              },
              "node_cost_snap_distance": {
                "label": "Distance d'accrochage du coût de nœud",
                "description": "Distance maximale optionnelle entre chaque point de coût de nœud et un nœud de réseau pour l'affectation."
              },
              "turn_penalty": {
                "label": "Pénalité de virage",
                "description": "Coût additif optionnel appliqué aux virages non rectilignes aux nœuds du réseau."
              },
              "u_turn_penalty": {
                "label": "Pénalité de demi-tour",
                "description": "Coût additif optionnel appliqué aux transitions en demi-tour."
              },
              "forbid_u_turns": {
                "label": "Interdire les demi-tours",
                "description": "Si vrai, interdit les transitions en demi-tour."
              },
              "forbid_left_turns": {
                "label": "Interdire les virages à gauche",
                "description": "Si vrai, interdit les transitions en virage à gauche."
              },
              "forbid_right_turns": {
                "label": "Interdire les virages à droite",
                "description": "Si vrai, interdit les transitions en virage à droite."
              },
              "turn_restrictions_csv": {
                "label": "CSV des restrictions de virage",
                "description": "CSV optionnel de transitions de virage utilisant les colonnes prev_x,prev_y,node_x,node_y,next_x,next_y. Colonnes optionnelles : forbidden (par défaut true lorsqu'aucune colonne turn_cost n'est fournie) et turn_cost (ou penalty/cost/extra_cost) pour un coût additif par virage."
              },
              "temporal_cost_profile": {
                "label": "Profil de coût temporel",
                "description": "CSV optionnel définissant des coûts d'arêtes dépendant du temps (colonnes : edge_id,dow,start_minute,end_minute,value)."
              },
              "temporal_edge_id_field": {
                "label": "Champ d'identifiant d'arête temporel",
                "description": "Champ de réseau optionnel utilisé pour faire correspondre les valeurs edge_id de temporal_cost_profile (par défaut EDGE_ID)."
              },
              "departure_time": {
                "label": "Heure de départ",
                "description": "Heure de départ RFC3339 optionnelle utilisée pour la recherche dans le profil temporel."
              },
              "temporal_mode": {
                "label": "Mode temporel",
                "description": "Mode d'interprétation temporelle optionnel : multiplier ou absolute."
              },
              "temporal_fallback": {
                "label": "Repli temporel",
                "description": "Repli optionnel lorsque la ligne temporelle est absente : static_cost ou error."
              },
              "temporal_profile_report": {
                "label": "Rapport du profil temporel",
                "description": "Chemin de sortie JSON optionnel pour les diagnostics du profil temporel (couverture, arêtes non appariées, utilisation du repli)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de lignes en sortie."
              }
            }
          },
          "location_allocation_network": {
            "name": "Localisation-affectation sur le réseau",
            "description": "Sélectionne k équipements et affecte les points de demande selon le coût réseau par une résolution gloutonne ou exacte, avec capacités optionnelles et contraintes de candidats obligatoires/interdits.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de réseau linéaire en entrée."
              },
              "demand_points": {
                "label": "Points de demande",
                "description": "Couche de points de demande à allouer."
              },
              "facilities": {
                "label": "Installations",
                "description": "Couche de points d'installations candidates."
              },
              "facility_count": {
                "label": "Nombre d'installations",
                "description": "Nombre d'installations à sélectionner (k)."
              },
              "solver_mode": {
                "label": "Mode du solveur",
                "description": "Mode du solveur : auto, greedy ou exact (exact est destiné aux problèmes de petite taille)."
              },
              "demand_weight_field": {
                "label": "Champ de poids de demande",
                "description": "Champ numérique optionnel de poids de demande dans demand_points (par défaut poids=1)."
              },
              "facility_capacity_field": {
                "label": "Champ de capacité d'installation",
                "description": "Champ numérique optionnel de capacité dans facilities ; la capacité est consommée par les valeurs de demand_weight_field."
              },
              "required_facility_field": {
                "label": "Champ d'installation requise",
                "description": "Champ booléen optionnel des installations marquant les candidats qui doivent être sélectionnés."
              },
              "forbidden_facility_field": {
                "label": "Champ d'installation interdite",
                "description": "Champ booléen optionnel des installations marquant les candidats qui ne doivent pas être sélectionnés."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage des nœuds optionnelle pour la construction du graphe."
              },
              "max_snap_distance": {
                "label": "Distance d'accrochage maximale",
                "description": "Distance maximale optionnelle entre les points de demande/d'installations et le nœud de réseau le plus proche."
              },
              "edge_cost_field": {
                "label": "Champ de coût d'arête",
                "description": "Champ numérique de ligne optionnel utilisé comme multiplicateur d'impédance de la longueur des segments."
              },
              "one_way_field": {
                "label": "Champ de sens unique",
                "description": "Champ de ligne optionnel marquant les arêtes numérisées à sens unique (true/1/yes signifie du premier au second sommet uniquement)."
              },
              "blocked_field": {
                "label": "Champ de blocage",
                "description": "Champ de ligne optionnel marquant les arêtes bloquées/fermées à exclure du routage (true/1/yes bloque)."
              },
              "barriers": {
                "label": "Barrières",
                "description": "Couche de points de barrières optionnelle ; les nœuds de réseau les plus proches sont exclus de la traversée."
              },
              "barrier_snap_distance": {
                "label": "Distance d'accrochage des barrières",
                "description": "Distance maximale optionnelle entre chaque point de barrière et un nœud de réseau pour le blocage."
              },
              "node_cost_points": {
                "label": "Points de coût de nœud",
                "description": "Couche de points optionnelle fournissant des coûts d'entrée par nœud (p. ex. délai aux intersections)."
              },
              "node_cost_field": {
                "label": "Champ de coût de nœud",
                "description": "Champ numérique de node_cost_points contenant les coûts non négatifs par nœud."
              },
              "node_cost_snap_distance": {
                "label": "Distance d'accrochage du coût de nœud",
                "description": "Distance maximale optionnelle entre chaque point de coût de nœud et un nœud de réseau pour l'affectation."
              },
              "turn_penalty": {
                "label": "Pénalité de virage",
                "description": "Coût additif optionnel appliqué aux virages non rectilignes aux nœuds du réseau."
              },
              "u_turn_penalty": {
                "label": "Pénalité de demi-tour",
                "description": "Coût additif optionnel appliqué aux transitions en demi-tour."
              },
              "forbid_u_turns": {
                "label": "Interdire les demi-tours",
                "description": "Si vrai, interdit les transitions en demi-tour."
              },
              "forbid_left_turns": {
                "label": "Interdire les virages à gauche",
                "description": "Si vrai, interdit les transitions en virage à gauche."
              },
              "forbid_right_turns": {
                "label": "Interdire les virages à droite",
                "description": "Si vrai, interdit les transitions en virage à droite."
              },
              "turn_restrictions_csv": {
                "label": "CSV des restrictions de virage",
                "description": "CSV optionnel de transitions de virage utilisant les colonnes prev_x,prev_y,node_x,node_y,next_x,next_y. Colonnes optionnelles : forbidden (par défaut true lorsqu'aucune colonne turn_cost n'est fournie) et turn_cost (ou penalty/cost/extra_cost) pour un coût additif par virage."
              },
              "temporal_cost_profile": {
                "label": "Profil de coût temporel",
                "description": "CSV optionnel définissant des coûts d'arêtes dépendant du temps (colonnes : edge_id,dow,start_minute,end_minute,value)."
              },
              "temporal_edge_id_field": {
                "label": "Champ d'identifiant d'arête temporel",
                "description": "Champ de réseau optionnel utilisé pour faire correspondre les valeurs edge_id de temporal_cost_profile (par défaut EDGE_ID)."
              },
              "departure_time": {
                "label": "Heure de départ",
                "description": "Heure de départ RFC3339 optionnelle utilisée pour la recherche dans le profil temporel."
              },
              "temporal_mode": {
                "label": "Mode temporel",
                "description": "Mode d'interprétation temporelle optionnel : multiplier ou absolute."
              },
              "temporal_fallback": {
                "label": "Repli temporel",
                "description": "Repli optionnel lorsque la ligne temporelle est absente : static_cost ou error."
              },
              "temporal_profile_report": {
                "label": "Rapport du profil temporel",
                "description": "Chemin de sortie JSON optionnel pour les diagnostics du profil temporel (couverture, arêtes non appariées, utilisation du repli)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de lignes d'itinéraires alloués en sortie."
              }
            }
          },
          "map_matching_v1": {
            "name": "Appariement cartographique v1",
            "description": "Accroche des points de trajectoire sur un réseau linéaire et reconstitue un itinéraire déduit avec des diagnostics.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de réseau linéaire en entrée."
              },
              "trajectory_points": {
                "label": "Points de trajectoire",
                "description": "Couche de points de trajectoire en entrée."
              },
              "timestamp_field": {
                "label": "Champ d'horodatage",
                "description": "Champ de trajectoire utilisé pour l'ordonnancement temporel."
              },
              "search_radius": {
                "label": "Rayon de recherche",
                "description": "Rayon de recherche optionnel des candidats autour de chaque point de trajectoire."
              },
              "candidate_k": {
                "label": "K candidats",
                "description": "Nombre optionnel de candidats les plus proches conservés par point."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage des nœuds optionnelle pour la construction du graphe."
              },
              "max_snap_distance": {
                "label": "Distance d'accrochage maximale",
                "description": "Distance maximale optionnelle pour l'accrochage des points de trajectoire aux nœuds du réseau."
              },
              "edge_cost_field": {
                "label": "Champ de coût d'arête",
                "description": "Champ numérique de ligne optionnel utilisé comme multiplicateur d'impédance de la longueur des segments."
              },
              "one_way_field": {
                "label": "Champ de sens unique",
                "description": "Champ de ligne optionnel marquant les arêtes numérisées à sens unique (prend en charge FT/TF/B ainsi que les anciennes valeurs booléennes)."
              },
              "blocked_field": {
                "label": "Champ de blocage",
                "description": "Champ de ligne optionnel marquant les arêtes bloquées/fermées à exclure du routage (true/1/yes bloque)."
              },
              "barriers": {
                "label": "Barrières",
                "description": "Couche de points de barrières optionnelle ; les nœuds de réseau les plus proches sont exclus de la traversée."
              },
              "barrier_snap_distance": {
                "label": "Distance d'accrochage des barrières",
                "description": "Distance maximale optionnelle entre chaque point de barrière et un nœud de réseau pour le blocage."
              },
              "node_cost_points": {
                "label": "Points de coût de nœud",
                "description": "Couche de points optionnelle fournissant des coûts d'entrée par nœud (p. ex. délai aux intersections)."
              },
              "node_cost_field": {
                "label": "Champ de coût de nœud",
                "description": "Champ numérique de node_cost_points contenant les coûts non négatifs par nœud."
              },
              "node_cost_snap_distance": {
                "label": "Distance d'accrochage du coût de nœud",
                "description": "Distance maximale optionnelle entre chaque point de coût de nœud et un nœud de réseau pour l'affectation."
              },
              "turn_penalty": {
                "label": "Pénalité de virage",
                "description": "Coût additif optionnel appliqué aux virages non rectilignes aux nœuds du réseau."
              },
              "u_turn_penalty": {
                "label": "Pénalité de demi-tour",
                "description": "Coût additif optionnel appliqué aux transitions en demi-tour."
              },
              "forbid_u_turns": {
                "label": "Interdire les demi-tours",
                "description": "Si vrai, interdit les transitions en demi-tour."
              },
              "forbid_left_turns": {
                "label": "Interdire les virages à gauche",
                "description": "Si vrai, interdit les transitions en virage à gauche."
              },
              "forbid_right_turns": {
                "label": "Interdire les virages à droite",
                "description": "Si vrai, interdit les transitions en virage à droite."
              },
              "turn_restrictions_csv": {
                "label": "CSV des restrictions de virage",
                "description": "CSV optionnel de transitions de virage utilisant les colonnes prev_x,prev_y,node_x,node_y,next_x,next_y. Colonnes optionnelles : forbidden (par défaut true lorsqu'aucune colonne turn_cost n'est fournie) et turn_cost (ou penalty/cost/extra_cost) pour un coût additif par virage."
              },
              "matched_points_output": {
                "label": "Points appariés en sortie",
                "description": "Chemin vectoriel de sortie optionnel pour les diagnostics par point."
              },
              "match_report": {
                "label": "Rapport d'appariement",
                "description": "Chemin de sortie JSON optionnel pour les diagnostics de synthèse."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de lignes en sortie pour l'itinéraire inféré."
              }
            }
          },
          "multimodal_od_cost_matrix": {
            "name": "Matrice de coûts OD multimodale",
            "description": "Calcule par lot les coûts OD multimodaux et des résumés par mode entre des ensembles de points d'origine et de destination.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de réseau linéaire en entrée."
              },
              "origins": {
                "label": "Origines",
                "description": "Couche de points d'origine."
              },
              "destinations": {
                "label": "Destinations",
                "description": "Couche de points de destination."
              },
              "mode_field": {
                "label": "Champ de mode",
                "description": "Champ attributaire de ligne identifiant le mode de déplacement par segment."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage des nœuds optionnelle pour la construction du graphe."
              },
              "max_snap_distance": {
                "label": "Distance d'accrochage maximale",
                "description": "Distance maximale optionnelle entre les points d'origine/destination et le nœud de réseau le plus proche."
              },
              "default_mode_speed": {
                "label": "Vitesse par défaut du mode",
                "description": "Vitesse par défaut du mode en unités de coordonnées par unité de temps (par défaut : 1)."
              },
              "mode_speed_overrides": {
                "label": "Vitesses spécifiques par mode",
                "description": "Remplacements optionnels mode:vitesse séparés par des virgules (par exemple : walk:1.4,drive:12,transit:8)."
              },
              "allowed_modes": {
                "label": "Modes autorisés",
                "description": "Liste blanche optionnelle de modes à inclure dans le routage, séparés par des virgules."
              },
              "transfer_penalty": {
                "label": "Pénalité de transfert",
                "description": "Pénalité additive optionnelle appliquée à chaque changement de mode de l'itinéraire."
              },
              "temporal_cost_profile": {
                "label": "Profil de coût temporel",
                "description": "CSV optionnel définissant des coûts d'arêtes dépendant du temps (colonnes : edge_id,dow,start_minute,end_minute,value)."
              },
              "temporal_edge_id_field": {
                "label": "Champ d'identifiant d'arête temporel",
                "description": "Champ de réseau optionnel utilisé pour faire correspondre les valeurs edge_id de temporal_cost_profile (par défaut EDGE_ID)."
              },
              "departure_time": {
                "label": "Heure de départ",
                "description": "Heure de départ RFC3339 optionnelle utilisée pour la recherche dans le profil temporel."
              },
              "temporal_mode": {
                "label": "Mode temporel",
                "description": "Mode d'interprétation temporelle optionnel : multiplier ou absolute."
              },
              "temporal_fallback": {
                "label": "Repli temporel",
                "description": "Repli optionnel lorsque la ligne temporelle est absente : static_cost ou error."
              },
              "temporal_profile_report": {
                "label": "Rapport du profil temporel",
                "description": "Chemin de sortie JSON optionnel pour les diagnostics du profil temporel lors de l'utilisation d'une entrée temporelle directe."
              },
              "scenario_bundle_csv": {
                "label": "CSV du lot de scénarios",
                "description": "CSV optionnel listant des scénarios temporels nommés pour une sortie OD comparative multi-scénarios."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du CSV en sortie."
              }
            }
          },
          "multimodal_routes_from_od": {
            "name": "Itinéraires multimodaux depuis une OD",
            "description": "Construit des géométries d'itinéraires pour des paires de points origine-destination multimodales avec des résumés par mode et par itinéraire.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de réseau linéaire en entrée."
              },
              "origins": {
                "label": "Origines",
                "description": "Couche de points d'origine."
              },
              "destinations": {
                "label": "Destinations",
                "description": "Couche de points de destination."
              },
              "mode_field": {
                "label": "Champ de mode",
                "description": "Champ attributaire de ligne identifiant le mode de déplacement par segment."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage des nœuds optionnelle pour la construction du graphe."
              },
              "max_snap_distance": {
                "label": "Distance d'accrochage maximale",
                "description": "Distance maximale optionnelle entre les points d'origine/destination et le nœud de réseau le plus proche."
              },
              "default_mode_speed": {
                "label": "Vitesse par défaut du mode",
                "description": "Vitesse par défaut du mode en unités de coordonnées par unité de temps (par défaut : 1)."
              },
              "mode_speed_overrides": {
                "label": "Vitesses spécifiques par mode",
                "description": "Remplacements optionnels mode:vitesse séparés par des virgules (par exemple : walk:1.4,drive:12,transit:8)."
              },
              "allowed_modes": {
                "label": "Modes autorisés",
                "description": "Liste blanche optionnelle de modes à inclure dans le routage, séparés par des virgules."
              },
              "transfer_penalty": {
                "label": "Pénalité de transfert",
                "description": "Pénalité additive optionnelle appliquée à chaque changement de mode de l'itinéraire."
              },
              "temporal_cost_profile": {
                "label": "Profil de coût temporel",
                "description": "CSV optionnel définissant des coûts d'arêtes dépendant du temps (colonnes : edge_id,dow,start_minute,end_minute,value)."
              },
              "temporal_edge_id_field": {
                "label": "Champ d'identifiant d'arête temporel",
                "description": "Champ de réseau optionnel utilisé pour faire correspondre les valeurs edge_id de temporal_cost_profile (par défaut EDGE_ID)."
              },
              "departure_time": {
                "label": "Heure de départ",
                "description": "Heure de départ RFC3339 optionnelle utilisée pour la recherche dans le profil temporel."
              },
              "temporal_mode": {
                "label": "Mode temporel",
                "description": "Mode d'interprétation temporelle optionnel : multiplier ou absolute."
              },
              "temporal_fallback": {
                "label": "Repli temporel",
                "description": "Repli optionnel lorsque la ligne temporelle est absente : static_cost ou error."
              },
              "temporal_profile_report": {
                "label": "Rapport du profil temporel",
                "description": "Chemin de sortie JSON optionnel pour les diagnostics du profil temporel lors de l'utilisation d'une entrée temporelle directe."
              },
              "scenario_bundle_csv": {
                "label": "CSV du lot de scénarios",
                "description": "CSV optionnel listant des scénarios temporels nommés pour une sortie d'itinéraires comparative multi-scénarios."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de lignes d'itinéraires en sortie."
              }
            }
          },
          "multimodal_shortest_path": {
            "name": "Plus court chemin multimodal",
            "description": "Trouve un plus court chemin tenant compte des modes sur un réseau linéaire avec des pénalités de correspondance configurables.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de réseau linéaire en entrée."
              },
              "start_x": {
                "label": "X de départ",
                "description": "Coordonnée x de départ."
              },
              "start_y": {
                "label": "Y de départ",
                "description": "Coordonnée y de départ."
              },
              "end_x": {
                "label": "X d'arrivée",
                "description": "Coordonnée x d'arrivée."
              },
              "end_y": {
                "label": "Y d'arrivée",
                "description": "Coordonnée y d'arrivée."
              },
              "mode_field": {
                "label": "Champ de mode",
                "description": "Champ attributaire de ligne identifiant le mode de déplacement par segment."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage des nœuds optionnelle pour la construction du graphe."
              },
              "max_snap_distance": {
                "label": "Distance d'accrochage maximale",
                "description": "Distance maximale optionnelle entre les coordonnées de départ/d'arrivée et le nœud de réseau le plus proche."
              },
              "default_mode_speed": {
                "label": "Vitesse par défaut du mode",
                "description": "Vitesse par défaut du mode en unités de coordonnées par unité de temps (par défaut : 1)."
              },
              "mode_speed_overrides": {
                "label": "Vitesses spécifiques par mode",
                "description": "Remplacements optionnels mode:vitesse séparés par des virgules (par exemple : walk:1.4,drive:12,transit:8)."
              },
              "allowed_modes": {
                "label": "Modes autorisés",
                "description": "Liste blanche optionnelle de modes à inclure dans le routage, séparés par des virgules."
              },
              "transfer_penalty": {
                "label": "Pénalité de transfert",
                "description": "Pénalité additive optionnelle appliquée à chaque changement de mode de l'itinéraire."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de lignes en sortie."
              }
            }
          },
          "network_accessibility_metrics": {
            "name": "Métriques d'accessibilité du réseau",
            "description": "Calcule des indices d'accessibilité pour des points d'origine selon l'atteignabilité des destinations, avec seuils d'impédance et fonctions de décroissance optionnels.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de réseau linéaire en entrée."
              },
              "origins": {
                "label": "Origines",
                "description": "Couche de points d'origine."
              },
              "destinations": {
                "label": "Destinations",
                "description": "Couche de points de destination."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage des nœuds optionnelle pour la construction du graphe."
              },
              "max_snap_distance": {
                "label": "Distance d'accrochage maximale",
                "description": "Distance maximale optionnelle entre les points d'origine/destination et le nœud de réseau le plus proche."
              },
              "impedance_cutoff": {
                "label": "Seuil d'impédance",
                "description": "Seuil de distance maximale optionnel pour le comptage des destinations accessibles (par défaut : infini)."
              },
              "decay_function": {
                "label": "Fonction de décroissance",
                "description": "Fonction de décroissance optionnelle : 'none' (par défaut), 'linear' ou 'exponential' pour une accessibilité pondérée par la distance."
              },
              "decay_parameter": {
                "label": "Paramètre de décroissance",
                "description": "Paramètre de décroissance optionnel (lambda pour exponential, taux pour linear)."
              },
              "edge_cost_field": {
                "label": "Champ de coût d'arête",
                "description": "Champ numérique de ligne optionnel utilisé comme multiplicateur d'impédance de la longueur des segments."
              },
              "one_way_field": {
                "label": "Champ de sens unique",
                "description": "Champ de ligne optionnel marquant les arêtes numérisées à sens unique (prend en charge FT/TF/B ainsi que les anciennes valeurs booléennes)."
              },
              "blocked_field": {
                "label": "Champ de blocage",
                "description": "Champ de ligne optionnel marquant les arêtes bloquées/fermées à exclure du routage (true/1/yes bloque)."
              },
              "node_cost_points": {
                "label": "Points de coût de nœud",
                "description": "Couche de points optionnelle fournissant des coûts d'entrée par nœud (p. ex. délai aux intersections)."
              },
              "node_cost_field": {
                "label": "Champ de coût de nœud",
                "description": "Champ numérique de node_cost_points contenant les coûts non négatifs par nœud."
              },
              "node_cost_snap_distance": {
                "label": "Distance d'accrochage du coût de nœud",
                "description": "Distance maximale optionnelle entre chaque point de coût de nœud et un nœud de réseau pour l'affectation."
              },
              "parallel_execution": {
                "label": "Exécution parallèle",
                "description": "Si vrai (par défaut), évalue les origines en parallèle pour un calcul d'accessibilité plus rapide."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de points en sortie (origines avec métriques d'accessibilité)."
              }
            }
          },
          "network_centrality_metrics": {
            "name": "Métriques de centralité du réseau",
            "description": "Calcule des métriques de base de centralité de degré, de proximité et d'intermédiarité pour les nœuds du réseau.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de réseau linéaire en entrée."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage des nœuds optionnelle pour la construction du graphe."
              },
              "edge_cost_field": {
                "label": "Champ de coût d'arête",
                "description": "Champ numérique de ligne optionnel utilisé comme multiplicateur d'impédance de la longueur des segments."
              },
              "one_way_field": {
                "label": "Champ de sens unique",
                "description": "Champ de ligne optionnel marquant les arêtes numérisées à sens unique (prend en charge FT/TF/B ainsi que les anciennes valeurs booléennes)."
              },
              "blocked_field": {
                "label": "Champ de blocage",
                "description": "Champ de ligne optionnel marquant les arêtes bloquées/fermées à exclure de la construction du graphe (true/1/yes bloque)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de points en sortie."
              }
            }
          },
          "network_connected_components": {
            "name": "Composantes connexes du réseau",
            "description": "Attribue un identifiant de composante connexe à chaque entité linéaire d'un réseau.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de réseau linéaire en entrée."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage des nœuds optionnelle pour la construction du graphe."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de lignes en sortie."
              }
            }
          },
          "network_node_degree": {
            "name": "Degré des nœuds du réseau",
            "description": "Extrait les nœuds du réseau à partir d'entités linéaires et calcule le degré et le type de chaque nœud.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de réseau linéaire en entrée."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage des nœuds optionnelle pour la construction du graphe."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de points en sortie."
              }
            }
          },
          "network_od_cost_matrix": {
            "name": "Matrice de coûts OD du réseau",
            "description": "Calcule les coûts de plus court chemin origine-destination sur un réseau linéaire et écrit une matrice CSV.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de réseau linéaire en entrée."
              },
              "origins": {
                "label": "Origines",
                "description": "Couche de points d'origine."
              },
              "destinations": {
                "label": "Destinations",
                "description": "Couche de points de destination."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage des nœuds optionnelle pour la construction du graphe."
              },
              "max_snap_distance": {
                "label": "Distance d'accrochage maximale",
                "description": "Distance maximale optionnelle entre les points d'origine/destination et le nœud de réseau le plus proche."
              },
              "edge_cost_field": {
                "label": "Champ de coût d'arête",
                "description": "Champ numérique de ligne optionnel utilisé comme multiplicateur d'impédance de la longueur des segments."
              },
              "one_way_field": {
                "label": "Champ de sens unique",
                "description": "Champ de ligne optionnel marquant les arêtes numérisées à sens unique (prend en charge FT/TF/B ainsi que les anciennes valeurs booléennes)."
              },
              "blocked_field": {
                "label": "Champ de blocage",
                "description": "Champ de ligne optionnel marquant les arêtes bloquées/fermées à exclure du routage (true/1/yes bloque)."
              },
              "barriers": {
                "label": "Barrières",
                "description": "Couche de points de barrières optionnelle ; les nœuds de réseau les plus proches sont exclus de la traversée."
              },
              "barrier_snap_distance": {
                "label": "Distance d'accrochage des barrières",
                "description": "Distance maximale optionnelle entre chaque point de barrière et un nœud de réseau pour le blocage."
              },
              "node_cost_points": {
                "label": "Points de coût de nœud",
                "description": "Couche de points optionnelle fournissant des coûts d'entrée par nœud (p. ex. délai aux intersections)."
              },
              "node_cost_field": {
                "label": "Champ de coût de nœud",
                "description": "Champ numérique de node_cost_points contenant les coûts non négatifs par nœud."
              },
              "node_cost_snap_distance": {
                "label": "Distance d'accrochage du coût de nœud",
                "description": "Distance maximale optionnelle entre chaque point de coût de nœud et un nœud de réseau pour l'affectation."
              },
              "turn_penalty": {
                "label": "Pénalité de virage",
                "description": "Coût additif optionnel appliqué aux virages non rectilignes aux nœuds du réseau."
              },
              "u_turn_penalty": {
                "label": "Pénalité de demi-tour",
                "description": "Coût additif optionnel appliqué aux transitions en demi-tour."
              },
              "forbid_u_turns": {
                "label": "Interdire les demi-tours",
                "description": "Si vrai, interdit les transitions en demi-tour."
              },
              "forbid_left_turns": {
                "label": "Interdire les virages à gauche",
                "description": "Si vrai, interdit les transitions en virage à gauche."
              },
              "forbid_right_turns": {
                "label": "Interdire les virages à droite",
                "description": "Si vrai, interdit les transitions en virage à droite."
              },
              "turn_restrictions_csv": {
                "label": "CSV des restrictions de virage",
                "description": "CSV optionnel de transitions de virage utilisant les colonnes prev_x,prev_y,node_x,node_y,next_x,next_y. Colonnes optionnelles : forbidden (par défaut true lorsqu'aucune colonne turn_cost n'est fournie) et turn_cost (ou penalty/cost/extra_cost) pour un coût additif par virage."
              },
              "temporal_cost_profile": {
                "label": "Profil de coût temporel",
                "description": "CSV optionnel définissant des coûts d'arêtes dépendant du temps (colonnes : edge_id,dow,start_minute,end_minute,value)."
              },
              "temporal_edge_id_field": {
                "label": "Champ d'identifiant d'arête temporel",
                "description": "Champ de réseau optionnel utilisé pour faire correspondre les valeurs edge_id de temporal_cost_profile (par défaut EDGE_ID)."
              },
              "departure_time": {
                "label": "Heure de départ",
                "description": "Heure de départ RFC3339 optionnelle utilisée pour la recherche dans le profil temporel."
              },
              "temporal_mode": {
                "label": "Mode temporel",
                "description": "Mode d'interprétation temporelle optionnel : multiplier ou absolute."
              },
              "temporal_fallback": {
                "label": "Repli temporel",
                "description": "Repli optionnel lorsque la ligne temporelle est absente : static_cost ou error."
              },
              "temporal_profile_report": {
                "label": "Rapport du profil temporel",
                "description": "Chemin de sortie JSON optionnel pour les diagnostics du profil temporel (couverture, arêtes non appariées, utilisation du repli)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du CSV en sortie."
              }
            }
          },
          "network_routes_from_od": {
            "name": "Itinéraires du réseau depuis une OD",
            "description": "Construit des géométries d'itinéraires pour des paires de points origine-destination sur un réseau linéaire.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de réseau linéaire en entrée."
              },
              "origins": {
                "label": "Origines",
                "description": "Couche de points d'origine."
              },
              "destinations": {
                "label": "Destinations",
                "description": "Couche de points de destination."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage des nœuds optionnelle pour la construction du graphe."
              },
              "max_snap_distance": {
                "label": "Distance d'accrochage maximale",
                "description": "Distance maximale optionnelle entre les points d'origine/destination et le nœud de réseau le plus proche."
              },
              "edge_cost_field": {
                "label": "Champ de coût d'arête",
                "description": "Champ numérique de ligne optionnel utilisé comme multiplicateur d'impédance de la longueur des segments."
              },
              "one_way_field": {
                "label": "Champ de sens unique",
                "description": "Champ de ligne optionnel marquant les arêtes numérisées à sens unique (prend en charge FT/TF/B ainsi que les anciennes valeurs booléennes)."
              },
              "blocked_field": {
                "label": "Champ de blocage",
                "description": "Champ de ligne optionnel marquant les arêtes bloquées/fermées à exclure du routage (true/1/yes bloque)."
              },
              "barriers": {
                "label": "Barrières",
                "description": "Couche de points de barrières optionnelle ; les nœuds de réseau les plus proches sont exclus de la traversée."
              },
              "barrier_snap_distance": {
                "label": "Distance d'accrochage des barrières",
                "description": "Distance maximale optionnelle entre chaque point de barrière et un nœud de réseau pour le blocage."
              },
              "node_cost_points": {
                "label": "Points de coût de nœud",
                "description": "Couche de points optionnelle fournissant des coûts d'entrée par nœud (p. ex. délai aux intersections)."
              },
              "node_cost_field": {
                "label": "Champ de coût de nœud",
                "description": "Champ numérique de node_cost_points contenant les coûts non négatifs par nœud."
              },
              "node_cost_snap_distance": {
                "label": "Distance d'accrochage du coût de nœud",
                "description": "Distance maximale optionnelle entre chaque point de coût de nœud et un nœud de réseau pour l'affectation."
              },
              "turn_penalty": {
                "label": "Pénalité de virage",
                "description": "Coût additif optionnel appliqué aux virages non rectilignes aux nœuds du réseau."
              },
              "u_turn_penalty": {
                "label": "Pénalité de demi-tour",
                "description": "Coût additif optionnel appliqué aux transitions en demi-tour."
              },
              "forbid_u_turns": {
                "label": "Interdire les demi-tours",
                "description": "Si vrai, interdit les transitions en demi-tour."
              },
              "forbid_left_turns": {
                "label": "Interdire les virages à gauche",
                "description": "Si vrai, interdit les transitions en virage à gauche."
              },
              "forbid_right_turns": {
                "label": "Interdire les virages à droite",
                "description": "Si vrai, interdit les transitions en virage à droite."
              },
              "turn_restrictions_csv": {
                "label": "CSV des restrictions de virage",
                "description": "CSV optionnel de transitions de virage utilisant les colonnes prev_x,prev_y,node_x,node_y,next_x,next_y. Colonnes optionnelles : forbidden (par défaut true lorsqu'aucune colonne turn_cost n'est fournie) et turn_cost (ou penalty/cost/extra_cost) pour un coût additif par virage."
              },
              "temporal_cost_profile": {
                "label": "Profil de coût temporel",
                "description": "CSV optionnel définissant des coûts d'arêtes dépendant du temps (colonnes : edge_id,dow,start_minute,end_minute,value)."
              },
              "temporal_edge_id_field": {
                "label": "Champ d'identifiant d'arête temporel",
                "description": "Champ de réseau optionnel utilisé pour faire correspondre les valeurs edge_id de temporal_cost_profile (par défaut EDGE_ID)."
              },
              "departure_time": {
                "label": "Heure de départ",
                "description": "Heure de départ RFC3339 optionnelle utilisée pour la recherche dans le profil temporel."
              },
              "temporal_mode": {
                "label": "Mode temporel",
                "description": "Mode d'interprétation temporelle optionnel : multiplier ou absolute."
              },
              "temporal_fallback": {
                "label": "Repli temporel",
                "description": "Repli optionnel lorsque la ligne temporelle est absente : static_cost ou error."
              },
              "temporal_profile_report": {
                "label": "Rapport du profil temporel",
                "description": "Chemin de sortie JSON optionnel pour les diagnostics du profil temporel (couverture, arêtes non appariées, utilisation du repli)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de lignes d'itinéraires en sortie."
              }
            }
          },
          "network_service_area": {
            "name": "Zone de service du réseau",
            "description": "Calcule les nœuds du réseau accessibles depuis des points d'origine dans la limite d'un coût réseau maximal.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de réseau linéaire en entrée."
              },
              "origins": {
                "label": "Origines",
                "description": "Couche de points d'origine."
              },
              "max_cost": {
                "label": "Coût maximal",
                "description": "Coût de chemin maximal accessible."
              },
              "ring_costs": {
                "label": "Coûts des anneaux",
                "description": "Seuils d'anneaux optionnels séparés par des virgules pour les sorties multi-anneaux (par exemple : 5,10,15)."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage des nœuds optionnelle pour la construction du graphe."
              },
              "max_snap_distance": {
                "label": "Distance d'accrochage maximale",
                "description": "Distance maximale optionnelle entre les points d'origine et le nœud de réseau le plus proche."
              },
              "output_mode": {
                "label": "Mode de sortie",
                "description": "Mode de sortie : 'nodes' (par défaut), 'edges' pour les segments d'arêtes accessibles tronqués au coût, ou 'polygons' pour des polygones de type isochrone par origine à partir des enveloppes des arêtes accessibles."
              },
              "polygon_merge_origins": {
                "label": "Fusionner les origines des polygones",
                "description": "Si vrai et output_mode='polygons', fusionne les polygones d'origines qui se chevauchent en une couverture fusionnée par anneau au lieu d'émettre un polygone par origine."
              },
              "mode_field": {
                "label": "Champ de mode",
                "description": "Champ attributaire de ligne optionnel identifiant le mode de déplacement par segment ; active des coûts de zone de desserte sensibles au mode."
              },
              "default_mode_speed": {
                "label": "Vitesse par défaut du mode",
                "description": "Vitesse par défaut du mode en unités de coordonnées par unité de temps lorsque mode_field est fourni (par défaut : 1)."
              },
              "mode_speed_overrides": {
                "label": "Vitesses spécifiques par mode",
                "description": "Remplacements optionnels mode:vitesse séparés par des virgules (par exemple : walk:1.4,drive:12)."
              },
              "allowed_modes": {
                "label": "Modes autorisés",
                "description": "Liste blanche optionnelle de modes à inclure lorsque mode_field est fourni, séparés par des virgules."
              },
              "edge_cost_field": {
                "label": "Champ de coût d'arête",
                "description": "Champ numérique de ligne optionnel utilisé comme multiplicateur d'impédance de la longueur des segments."
              },
              "one_way_field": {
                "label": "Champ de sens unique",
                "description": "Champ de ligne optionnel marquant les arêtes numérisées à sens unique (prend en charge FT/TF/B ainsi que les anciennes valeurs booléennes)."
              },
              "blocked_field": {
                "label": "Champ de blocage",
                "description": "Champ de ligne optionnel marquant les arêtes bloquées/fermées à exclure du routage (true/1/yes bloque)."
              },
              "barriers": {
                "label": "Barrières",
                "description": "Couche de points de barrières optionnelle ; les nœuds de réseau les plus proches sont exclus de la traversée."
              },
              "barrier_snap_distance": {
                "label": "Distance d'accrochage des barrières",
                "description": "Distance maximale optionnelle entre chaque point de barrière et un nœud de réseau pour le blocage."
              },
              "node_cost_points": {
                "label": "Points de coût de nœud",
                "description": "Couche de points optionnelle fournissant des coûts d'entrée par nœud (p. ex. délai aux intersections)."
              },
              "node_cost_field": {
                "label": "Champ de coût de nœud",
                "description": "Champ numérique de node_cost_points contenant les coûts non négatifs par nœud."
              },
              "node_cost_snap_distance": {
                "label": "Distance d'accrochage du coût de nœud",
                "description": "Distance maximale optionnelle entre chaque point de coût de nœud et un nœud de réseau pour l'affectation."
              },
              "turn_penalty": {
                "label": "Pénalité de virage",
                "description": "Coût additif optionnel appliqué aux virages non rectilignes aux nœuds du réseau."
              },
              "u_turn_penalty": {
                "label": "Pénalité de demi-tour",
                "description": "Coût additif optionnel appliqué aux transitions en demi-tour."
              },
              "forbid_u_turns": {
                "label": "Interdire les demi-tours",
                "description": "Si vrai, interdit les transitions en demi-tour."
              },
              "forbid_left_turns": {
                "label": "Interdire les virages à gauche",
                "description": "Si vrai, interdit les transitions en virage à gauche."
              },
              "forbid_right_turns": {
                "label": "Interdire les virages à droite",
                "description": "Si vrai, interdit les transitions en virage à droite."
              },
              "turn_restrictions_csv": {
                "label": "CSV des restrictions de virage",
                "description": "CSV optionnel de transitions de virage utilisant les colonnes prev_x,prev_y,node_x,node_y,next_x,next_y. Colonnes optionnelles : forbidden (par défaut true lorsqu'aucune colonne turn_cost n'est fournie) et turn_cost (ou penalty/cost/extra_cost) pour un coût additif par virage."
              },
              "temporal_cost_profile": {
                "label": "Profil de coût temporel",
                "description": "CSV optionnel définissant des coûts d'arêtes dépendant du temps (colonnes : edge_id,dow,start_minute,end_minute,value)."
              },
              "temporal_edge_id_field": {
                "label": "Champ d'identifiant d'arête temporel",
                "description": "Champ de réseau optionnel utilisé pour faire correspondre les valeurs edge_id de temporal_cost_profile (par défaut EDGE_ID)."
              },
              "departure_time": {
                "label": "Heure de départ",
                "description": "Heure de départ RFC3339 optionnelle utilisée pour la recherche dans le profil temporel."
              },
              "temporal_mode": {
                "label": "Mode temporel",
                "description": "Mode d'interprétation temporelle optionnel : multiplier ou absolute."
              },
              "temporal_fallback": {
                "label": "Repli temporel",
                "description": "Repli optionnel lorsque la ligne temporelle est absente : static_cost ou error."
              },
              "temporal_profile_report": {
                "label": "Rapport du profil temporel",
                "description": "Chemin de sortie JSON optionnel pour les diagnostics du profil temporel (couverture, arêtes non appariées, utilisation du repli)."
              },
              "snapped_origins_output": {
                "label": "Origines accrochées en sortie",
                "description": "Chemin vectoriel de sortie optionnel pour les points d'ancrage d'origines accrochés internes utilisés pour amorcer la traversée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de zone de desserte en sortie."
              }
            }
          },
          "network_topology_audit": {
            "name": "Audit de topologie du réseau",
            "description": "Vérifie un réseau linéaire à la recherche d'anomalies topologiques (composantes déconnectées, impasses et anomalies de degré) qui provoquent des échecs de calcul d'itinéraires.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de réseau linéaire en entrée."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage des nœuds optionnelle pour la construction du graphe."
              },
              "one_way_field": {
                "label": "Champ de sens unique",
                "description": "Champ de ligne optionnel marquant les arêtes à sens unique (prend en charge FT/TF/B ainsi que les anciennes valeurs booléennes)."
              },
              "blocked_field": {
                "label": "Champ de blocage",
                "description": "Champ de ligne optionnel marquant les arêtes bloquées à exclure de l'analyse."
              },
              "report": {
                "label": "Rapport",
                "description": "Chemin de sortie JSON optionnel pour le rapport de synthèse de l'audit."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de points en sortie pour les diagnostics par nœud."
              }
            }
          },
          "od_sensitivity_analysis": {
            "name": "Analyse de sensibilité OD",
            "description": "Calcule les coûts de plus court chemin OD avec des perturbations d'impédance et produit des statistiques de sensibilité par échantillonnage de Monte Carlo.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de réseau linéaire en entrée."
              },
              "origins": {
                "label": "Origines",
                "description": "Couche de points d'origine."
              },
              "destinations": {
                "label": "Destinations",
                "description": "Couche de points de destination."
              },
              "edge_cost_field": {
                "label": "Champ de coût d'arête",
                "description": "Champ numérique de ligne requis utilisé comme multiplicateur d'impédance pour l'analyse de perturbation."
              },
              "impedance_disturbance_range": {
                "label": "Plage de perturbation d'impédance",
                "description": "Plage de perturbation du coût sous la forme 'facteur_min,facteur_max' (p. ex. '0.8,1.2' pour une variation de ±20 %)."
              },
              "monte_carlo_samples": {
                "label": "Échantillons Monte-Carlo",
                "description": "Nombre d'échantillons Monte-Carlo pour l'analyse de perturbation (par défaut 1, max 100)."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage des nœuds optionnelle pour la construction du graphe."
              },
              "max_snap_distance": {
                "label": "Distance d'accrochage maximale",
                "description": "Distance maximale optionnelle entre les points d'origine/destination et le nœud de réseau le plus proche."
              },
              "one_way_field": {
                "label": "Champ de sens unique",
                "description": "Champ de ligne optionnel marquant les arêtes numérisées à sens unique (prend en charge FT/TF/B ainsi que les anciennes valeurs booléennes)."
              },
              "blocked_field": {
                "label": "Champ de blocage",
                "description": "Champ de ligne optionnel marquant les arêtes bloquées/fermées."
              },
              "node_cost_points": {
                "label": "Points de coût de nœud",
                "description": "Couche de points optionnelle fournissant des coûts d'entrée par nœud (p. ex. délai aux intersections)."
              },
              "node_cost_field": {
                "label": "Champ de coût de nœud",
                "description": "Champ numérique de node_cost_points contenant les coûts non négatifs par nœud."
              },
              "node_cost_snap_distance": {
                "label": "Distance d'accrochage du coût de nœud",
                "description": "Distance maximale optionnelle entre chaque point de coût de nœud et un nœud de réseau pour l'affectation."
              },
              "parallel_execution": {
                "label": "Exécution parallèle",
                "description": "Si vrai (par défaut), évalue les recherches d'origines en parallèle pour les exécutions OD de référence et perturbées."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du CSV en sortie avec les paires OD et les statistiques de sensibilité."
              }
            }
          },
          "shortest_path_network": {
            "name": "Plus court chemin sur le réseau",
            "description": "Trouve le plus court chemin entre des coordonnées de départ et d'arrivée sur un réseau linéaire.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de réseau linéaire en entrée."
              },
              "start_x": {
                "label": "X de départ",
                "description": "Coordonnée x de départ."
              },
              "start_y": {
                "label": "Y de départ",
                "description": "Coordonnée y de départ."
              },
              "end_x": {
                "label": "X d'arrivée",
                "description": "Coordonnée x d'arrivée."
              },
              "end_y": {
                "label": "Y d'arrivée",
                "description": "Coordonnée y d'arrivée."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage des nœuds optionnelle pour la construction du graphe."
              },
              "max_snap_distance": {
                "label": "Distance d'accrochage maximale",
                "description": "Distance maximale optionnelle entre les coordonnées de départ/d'arrivée et le nœud de réseau le plus proche."
              },
              "edge_cost_field": {
                "label": "Champ de coût d'arête",
                "description": "Champ numérique de ligne optionnel utilisé comme multiplicateur d'impédance de la longueur des segments."
              },
              "one_way_field": {
                "label": "Champ de sens unique",
                "description": "Champ de ligne optionnel marquant les arêtes numérisées à sens unique (prend en charge FT/TF/B ainsi que les anciennes valeurs booléennes)."
              },
              "blocked_field": {
                "label": "Champ de blocage",
                "description": "Champ de ligne optionnel marquant les arêtes bloquées/fermées à exclure du routage (true/1/yes bloque)."
              },
              "barriers": {
                "label": "Barrières",
                "description": "Couche de points de barrières optionnelle ; les nœuds de réseau les plus proches sont exclus de la traversée."
              },
              "barrier_snap_distance": {
                "label": "Distance d'accrochage des barrières",
                "description": "Distance maximale optionnelle entre chaque point de barrière et un nœud de réseau pour le blocage."
              },
              "turn_penalty": {
                "label": "Pénalité de virage",
                "description": "Coût additif optionnel appliqué aux virages non rectilignes aux nœuds du réseau."
              },
              "u_turn_penalty": {
                "label": "Pénalité de demi-tour",
                "description": "Coût additif optionnel appliqué aux transitions en demi-tour."
              },
              "forbid_u_turns": {
                "label": "Interdire les demi-tours",
                "description": "Si vrai, interdit les transitions en demi-tour."
              },
              "forbid_left_turns": {
                "label": "Interdire les virages à gauche",
                "description": "Si vrai, interdit les transitions en virage à gauche."
              },
              "forbid_right_turns": {
                "label": "Interdire les virages à droite",
                "description": "Si vrai, interdit les transitions en virage à droite."
              },
              "turn_restrictions_csv": {
                "label": "CSV des restrictions de virage",
                "description": "CSV optionnel de transitions de virage utilisant les colonnes prev_x,prev_y,node_x,node_y,next_x,next_y. Colonnes optionnelles : forbidden (par défaut true lorsqu'aucune colonne turn_cost n'est fournie) et turn_cost (ou penalty/cost/extra_cost) pour un coût additif par virage."
              },
              "temporal_cost_profile": {
                "label": "Profil de coût temporel",
                "description": "CSV optionnel définissant des coûts d'arêtes dépendant du temps (colonnes : edge_id,dow,start_minute,end_minute,value)."
              },
              "temporal_edge_id_field": {
                "label": "Champ d'identifiant d'arête temporel",
                "description": "Champ de réseau optionnel utilisé pour faire correspondre les valeurs edge_id de temporal_cost_profile (par défaut EDGE_ID)."
              },
              "departure_time": {
                "label": "Heure de départ",
                "description": "Heure de départ RFC3339 optionnelle utilisée pour la recherche dans le profil temporel."
              },
              "temporal_mode": {
                "label": "Mode temporel",
                "description": "Mode d'interprétation temporelle optionnel : multiplier ou absolute."
              },
              "temporal_fallback": {
                "label": "Repli temporel",
                "description": "Repli optionnel lorsque la ligne temporelle est absente : static_cost ou error."
              },
              "temporal_profile_report": {
                "label": "Rapport du profil temporel",
                "description": "Chemin de sortie JSON optionnel pour les diagnostics du profil temporel (couverture, arêtes non appariées, utilisation du repli)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de lignes en sortie."
              }
            }
          },
          "split_lines_at_intersections": {
            "name": "Scinder les lignes aux intersections",
            "description": "Scinde un réseau linéaire partout où des segments se croisent, y compris les auto-intersections.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de lignes en entrée à diviser aux intersections."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage optionnelle utilisée par les opérations de division ; par défaut l'epsilon machine."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de lignes divisées en sortie."
              }
            }
          },
          "snap_points_to_network": {
            "name": "Accrocher les points au réseau",
            "description": "Accroche les entités ponctuelles en entrée à la position la plus proche le long d'une couche de lignes de réseau.",
            "params": {
              "points": {
                "label": "Points",
                "description": "Couche de points en entrée à accrocher."
              },
              "network": {
                "label": "Réseau",
                "description": "Couche de lignes du réseau en entrée."
              },
              "max_snap_distance": {
                "label": "Distance d'accrochage maximale",
                "description": "Distance d'accrochage maximale optionnelle en unités carte."
              },
              "keep_unsnapped": {
                "label": "Conserver les non accrochés",
                "description": "Si vrai (par défaut), conserve les points qui ne peuvent pas être accrochés dans la tolérance."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de points accrochés en sortie."
              }
            }
          },
          "transfer_attributes": {
            "name": "Transférer les attributs",
            "description": "Transfère les attributs source sur les entités cibles à l'aide d'un prédicat spatial.",
            "params": {
              "target": {
                "label": "Cible",
                "description": "Couche cible recevant les attributs transférés."
              },
              "source": {
                "label": "Source",
                "description": "Couche source fournissant les attributs."
              },
              "predicate": {
                "label": "Prédicat",
                "description": "Prédicat spatial : intersects, within, contains, touches, crosses, overlaps, within_distance."
              },
              "distance": {
                "label": "Distance",
                "description": "Seuil de distance lorsque predicate=within_distance."
              },
              "strategy": {
                "label": "Stratégie",
                "description": "Stratégie de transfert : first, last, count, sum, mean, min, max."
              },
              "prefix": {
                "label": "Préfixe",
                "description": "Préfixe des champs sources transférés (par défaut SRC_)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "travelling_salesman_problem": {
            "name": "Problème du voyageur de commerce",
            "description": "Trouve des solutions approchées au problème du voyageur de commerce (TSP) à l'aide d'heuristiques 2-opt. À partir d'un ensemble de positions de points, identifie l'itinéraire le plus court reliant tous les points.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points en entrée."
              },
              "duration": {
                "label": "Durée",
                "description": "Durée maximale d'optimisation en secondes."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de polyligne de sortie optionnel."
              }
            }
          },
          "vehicle_routing_cvrp": {
            "name": "Tournées de véhicules CVRP",
            "description": "Construit des tournées de livraison multidépôts sous contrainte de capacité, avec contrôle d'une flotte hétérogène, modes d'objectif et optimisation locale optionnelle.",
            "params": {
              "network": {
                "label": "Réseau",
                "description": "Couche de réseau linéaire en entrée (validée pour la parité du contrat)."
              },
              "depot_points": {
                "label": "Points de dépôt",
                "description": "Couche de points de dépôts ; chaque point peut fournir un ou plusieurs véhicules."
              },
              "stop_points": {
                "label": "Points d'arrêt",
                "description": "Couche de points d'arrêts de livraison."
              },
              "demand_field": {
                "label": "Champ de demande",
                "description": "Champ numérique de demande dans stop_points (par défaut : demand)."
              },
              "priority_field": {
                "label": "Champ de priorité",
                "description": "Champ optionnel de priorité des arrêts utilisant des valeurs comme required/high/normal/low ou des rangs numériques."
              },
              "allowed_vehicle_profiles_field": {
                "label": "Champ des profils de véhicule autorisés",
                "description": "Champ d'arrêt optionnel listant les profils de véhicules compatibles (délimités par virgule/point-virgule/barre verticale)."
              },
              "allowed_route_classes_field": {
                "label": "Champ des classes d'itinéraire autorisées",
                "description": "Alias optionnel de allowed_vehicle_profiles_field pour les règles de compatibilité de classe d'itinéraire."
              },
              "depot_id_field": {
                "label": "Champ d'identifiant de dépôt",
                "description": "Champ d'identifiant de dépôt optionnel utilisé dans les sorties d'itinéraires/d'affectation."
              },
              "vehicle_count_field": {
                "label": "Champ du nombre de véhicules",
                "description": "Champ de dépôt optionnel pour le nombre de véhicules générés à chaque dépôt."
              },
              "vehicle_capacity_field": {
                "label": "Champ de capacité de véhicule",
                "description": "Champ de dépôt optionnel remplaçant vehicle_capacity par modèle de dépôt/véhicule."
              },
              "vehicle_fixed_cost_field": {
                "label": "Champ de coût fixe de véhicule",
                "description": "Champ de dépôt optionnel remplaçant vehicle_fixed_cost par modèle de dépôt/véhicule."
              },
              "travel_speed_field": {
                "label": "Champ de vitesse de déplacement",
                "description": "Champ de dépôt optionnel remplaçant travel_speed par modèle de dépôt/véhicule."
              },
              "max_route_distance_field": {
                "label": "Champ de distance maximale d'itinéraire",
                "description": "Champ de dépôt optionnel remplaçant max_route_distance par modèle de dépôt/véhicule."
              },
              "max_route_time_field": {
                "label": "Champ de temps maximal d'itinéraire",
                "description": "Champ de dépôt optionnel remplaçant max_route_time par modèle de dépôt/véhicule."
              },
              "vehicle_profile_field": {
                "label": "Champ de profil de véhicule",
                "description": "Champ de dépôt optionnel définissant le jeton de profil/catégorie de véhicule utilisé pour la compatibilité des arrêts."
              },
              "vehicle_route_class_field": {
                "label": "Champ de classe d'itinéraire de véhicule",
                "description": "Alias optionnel de vehicle_profile_field pour les règles de compatibilité de classe d'itinéraire."
              },
              "vehicle_capacity": {
                "label": "Capacité de véhicule",
                "description": "Capacité par véhicule (> 0)."
              },
              "vehicle_fixed_cost": {
                "label": "Coût fixe de véhicule",
                "description": "Coût fixe optionnel facturé par véhicule/itinéraire dépêché (par défaut : 0)."
              },
              "max_vehicles": {
                "label": "Nombre maximal de véhicules",
                "description": "Nombre maximal optionnel de véhicules/itinéraires à construire."
              },
              "max_route_distance": {
                "label": "Distance maximale d'itinéraire",
                "description": "Distance de déplacement maximale optionnelle par itinéraire, retour au dépôt inclus."
              },
              "travel_speed": {
                "label": "Vitesse de déplacement",
                "description": "Vitesse de déplacement en unités de coordonnées par unité de temps (par défaut : 1)."
              },
              "max_route_time": {
                "label": "Temps maximal d'itinéraire",
                "description": "Durée maximale optionnelle de l'itinéraire en unités de temps du modèle, retour au dépôt inclus."
              },
              "max_stops_per_vehicle": {
                "label": "Arrêts maximaux par véhicule",
                "description": "Nombre maximal optionnel d'arrêts affectés à chaque itinéraire de véhicule."
              },
              "objective_mode": {
                "label": "Mode d'objectif",
                "description": "Objectif de construction des itinéraires : minimize_distance, minimize_vehicles ou minimize_cost."
              },
              "apply_local_optimization": {
                "label": "Appliquer l'optimisation locale",
                "description": "Si vrai, applique une passe déterministe d'amélioration locale 2-opt à chaque itinéraire construit (par défaut : true)."
              },
              "apply_simulated_annealing": {
                "label": "Appliquer le recuit simulé",
                "description": "Si vrai, applique une passe de raffinement par recuit simulé avec graine par itinéraire après l'optimisation gloutonne/locale (par défaut : false)."
              },
              "sa_iterations": {
                "label": "Itérations du recuit simulé",
                "description": "Nombre maximal d'itérations de recuit simulé par itinéraire lorsque apply_simulated_annealing=true (par défaut : 1500)."
              },
              "sa_initial_temperature": {
                "label": "Température initiale du recuit simulé",
                "description": "Température initiale du recuit simulé (> 0, par défaut : 1.0)."
              },
              "sa_cooling_rate": {
                "label": "Taux de refroidissement du recuit simulé",
                "description": "Multiplicateur de refroidissement du recuit simulé dans (0, 1) ; par défaut 0.995."
              },
              "sa_seed": {
                "label": "Graine du recuit simulé",
                "description": "Graine aléatoire déterministe optionnelle pour le recuit simulé (par défaut : 42)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de lignes d'itinéraires en sortie."
              },
              "assignment_output": {
                "label": "Affectation en sortie",
                "description": "Sortie optionnelle de points d'affectation des arrêts avec diagnostics d'ordre de visite/de charge."
              }
            }
          },
          "vehicle_routing_pickup_delivery": {
            "name": "Tournées de véhicules avec collecte et livraison",
            "description": "Construit des tournées de collecte-livraison appariées avec contraintes de précédence et de capacité à l'aide d'une référence déterministe du plus proche voisin.",
            "params": {
              "network": {
                "label": "Réseau",
                "description": "Couche de réseau linéaire en entrée (validée pour la parité du contrat)."
              },
              "depot_points": {
                "label": "Points de dépôt",
                "description": "Couche de points de dépôts ; le premier point est utilisé comme dépôt actif dans cette implémentation de base."
              },
              "stop_points": {
                "label": "Points d'arrêt",
                "description": "Couche de points d'arrêts contenant des enregistrements appariés de collecte et de livraison."
              },
              "request_id_field": {
                "label": "Champ d'identifiant de demande",
                "description": "Champ d'identifiant de demande dans stop_points utilisé pour apparier les enregistrements de collecte et de livraison (par défaut : request_id)."
              },
              "stop_type_field": {
                "label": "Champ de type d'arrêt",
                "description": "Champ de type d'arrêt dans stop_points contenant les étiquettes pickup/delivery (par défaut : stop_type)."
              },
              "demand_field": {
                "label": "Champ de demande",
                "description": "Champ numérique de demande dans stop_points ; la demande de collecte est chargée et la demande livrée est ignorée (par défaut : demand)."
              },
              "vehicle_capacity": {
                "label": "Capacité de véhicule",
                "description": "Capacité par véhicule (> 0)."
              },
              "max_vehicles": {
                "label": "Nombre maximal de véhicules",
                "description": "Nombre maximal optionnel de véhicules/itinéraires à construire."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de lignes d'itinéraires en sortie."
              },
              "assignment_output": {
                "label": "Affectation en sortie",
                "description": "Sortie optionnelle de points d'affectation des arrêts avec diagnostics de demande et de précédence."
              }
            }
          },
          "vehicle_routing_vrptw": {
            "name": "Tournées de véhicules VRPTW",
            "description": "Construit des tournées VRPTW multidépôts sous contrainte de capacité avec paramètres de flotte hétérogène, fenêtres de pause et contrôle du mode d'objectif.",
            "params": {
              "network": {
                "label": "Réseau",
                "description": "Couche de réseau linéaire en entrée (validée pour la parité du contrat)."
              },
              "depot_points": {
                "label": "Points de dépôt",
                "description": "Couche de points de dépôts ; chaque point peut fournir un ou plusieurs véhicules."
              },
              "stop_points": {
                "label": "Points d'arrêt",
                "description": "Couche de points d'arrêts de livraison avec champs de demande et de fenêtre horaire."
              },
              "demand_field": {
                "label": "Champ de demande",
                "description": "Champ numérique de demande dans stop_points (par défaut : demand)."
              },
              "priority_field": {
                "label": "Champ de priorité",
                "description": "Champ optionnel de priorité des arrêts utilisant des valeurs comme required/high/normal/low ou des rangs numériques."
              },
              "allowed_vehicle_profiles_field": {
                "label": "Champ des profils de véhicule autorisés",
                "description": "Champ d'arrêt optionnel listant les profils de véhicules compatibles (délimités par virgule/point-virgule/barre verticale)."
              },
              "allowed_route_classes_field": {
                "label": "Champ des classes d'itinéraire autorisées",
                "description": "Alias optionnel de allowed_vehicle_profiles_field pour les règles de compatibilité de classe d'itinéraire."
              },
              "tw_start_field": {
                "label": "Champ de début de fenêtre horaire",
                "description": "Champ numérique de début de fenêtre horaire dans stop_points (par défaut : tw_start)."
              },
              "tw_end_field": {
                "label": "Champ de fin de fenêtre horaire",
                "description": "Champ numérique de fin de fenêtre horaire dans stop_points (par défaut : tw_end)."
              },
              "service_time_field": {
                "label": "Champ de temps de service",
                "description": "Champ numérique de temps de service par arrêt dans stop_points (par défaut : service_time)."
              },
              "depot_id_field": {
                "label": "Champ d'identifiant de dépôt",
                "description": "Champ d'identifiant de dépôt optionnel utilisé dans les sorties d'itinéraires/d'affectation."
              },
              "vehicle_count_field": {
                "label": "Champ du nombre de véhicules",
                "description": "Champ de dépôt optionnel pour le nombre de véhicules générés à chaque dépôt."
              },
              "vehicle_capacity_field": {
                "label": "Champ de capacité de véhicule",
                "description": "Champ de dépôt optionnel remplaçant vehicle_capacity par modèle de dépôt/véhicule."
              },
              "vehicle_fixed_cost_field": {
                "label": "Champ de coût fixe de véhicule",
                "description": "Champ de dépôt optionnel remplaçant vehicle_fixed_cost par modèle de dépôt/véhicule."
              },
              "travel_speed_field": {
                "label": "Champ de vitesse de déplacement",
                "description": "Champ de dépôt optionnel remplaçant travel_speed par modèle de dépôt/véhicule."
              },
              "max_route_distance_field": {
                "label": "Champ de distance maximale d'itinéraire",
                "description": "Champ de dépôt optionnel remplaçant max_route_distance par modèle de dépôt/véhicule."
              },
              "max_route_time_field": {
                "label": "Champ de temps maximal d'itinéraire",
                "description": "Champ de dépôt optionnel remplaçant max_route_time par modèle de dépôt/véhicule."
              },
              "vehicle_profile_field": {
                "label": "Champ de profil de véhicule",
                "description": "Champ de dépôt optionnel définissant le jeton de profil/catégorie de véhicule utilisé pour la compatibilité des arrêts."
              },
              "vehicle_route_class_field": {
                "label": "Champ de classe d'itinéraire de véhicule",
                "description": "Alias optionnel de vehicle_profile_field pour les règles de compatibilité de classe d'itinéraire."
              },
              "depot_close_time_field": {
                "label": "Champ d'heure de fermeture du dépôt",
                "description": "Champ de dépôt optionnel remplaçant depot_close_time par modèle de dépôt/véhicule."
              },
              "break_start_field": {
                "label": "Champ de début de pause",
                "description": "Champ de dépôt optionnel remplaçant break_start_time par modèle de dépôt/véhicule."
              },
              "break_end_field": {
                "label": "Champ de fin de pause",
                "description": "Champ de dépôt optionnel remplaçant break_end_time par modèle de dépôt/véhicule."
              },
              "break_duration_field": {
                "label": "Champ de durée de pause",
                "description": "Champ de dépôt optionnel remplaçant break_duration par modèle de dépôt/véhicule."
              },
              "vehicle_capacity": {
                "label": "Capacité de véhicule",
                "description": "Capacité par véhicule (> 0)."
              },
              "vehicle_fixed_cost": {
                "label": "Coût fixe de véhicule",
                "description": "Coût fixe optionnel facturé par véhicule/itinéraire dépêché (par défaut : 0)."
              },
              "start_time": {
                "label": "Heure de début",
                "description": "Heure de début de l'itinéraire en unités de temps du modèle (par défaut : 0)."
              },
              "travel_speed": {
                "label": "Vitesse de déplacement",
                "description": "Vitesse de déplacement en unités de coordonnées par unité de temps (par défaut : 1)."
              },
              "enforce_time_windows": {
                "label": "Respecter les fenêtres horaires",
                "description": "Si vrai, seuls les arrêts dont le retard est <= allowed_lateness sont éligibles à l'affectation (par défaut : false)."
              },
              "allowed_lateness": {
                "label": "Retard autorisé",
                "description": "Retard maximal toléré lorsque enforce_time_windows=true (par défaut : 0)."
              },
              "depot_close_time": {
                "label": "Heure de fermeture du dépôt",
                "description": "Heure de fermeture stricte optionnelle avant laquelle chaque itinéraire doit revenir au dépôt."
              },
              "break_start_time": {
                "label": "Heure de début de pause",
                "description": "Heure de début optionnelle de la fenêtre de pause globale pour tous les véhicules."
              },
              "break_end_time": {
                "label": "Heure de fin de pause",
                "description": "Heure de fin optionnelle de la fenêtre de pause globale pour tous les véhicules."
              },
              "break_duration": {
                "label": "Durée de pause",
                "description": "Durée de pause globale optionnelle appliquée une fois par itinéraire lorsque la fenêtre de pause est intersectée."
              },
              "use_priority_scoring": {
                "label": "Utiliser le score de priorité",
                "description": "Si vrai, classe les candidats faisables par retard/marge projetés avant la distance de déplacement ; si faux, utilise la référence du plus proche voisin (par défaut : true)."
              },
              "max_vehicles": {
                "label": "Nombre maximal de véhicules",
                "description": "Nombre maximal optionnel de véhicules/itinéraires à construire."
              },
              "max_route_distance": {
                "label": "Distance maximale d'itinéraire",
                "description": "Distance de déplacement maximale optionnelle de l'itinéraire, retour au dépôt inclus."
              },
              "max_route_time": {
                "label": "Temps maximal d'itinéraire",
                "description": "Durée maximale optionnelle de l'itinéraire en unités de temps du modèle, retour au dépôt inclus."
              },
              "max_stops_per_vehicle": {
                "label": "Arrêts maximaux par véhicule",
                "description": "Nombre maximal optionnel d'arrêts affectés à chaque itinéraire de véhicule."
              },
              "objective_mode": {
                "label": "Mode d'objectif",
                "description": "Objectif de construction des itinéraires : minimize_lateness, minimize_distance, minimize_vehicles ou minimize_cost."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de lignes d'itinéraires en sortie."
              },
              "assignment_output": {
                "label": "Affectation en sortie",
                "description": "Sortie optionnelle de points d'affectation des arrêts avec diagnostics de fenêtres horaires."
              }
            }
          },
          "clip": {
            "name": "Découper",
            "description": "Découpe les polygones en entrée selon les limites des polygones de superposition par intersection topologique.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "overlay": {
                "label": "Superposition",
                "description": "Couche polygonale de superposition."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage optionnelle utilisée par les opérations topologiques ; par défaut l'epsilon machine."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "difference": {
            "name": "Différence",
            "description": "Retire les surfaces des polygones de superposition des polygones en entrée par différence topologique.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "overlay": {
                "label": "Superposition",
                "description": "Couche polygonale de superposition."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage optionnelle utilisée par les opérations topologiques ; par défaut l'epsilon machine."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "dissolve": {
            "name": "Dissoudre",
            "description": "Supprime les limites partagées entre polygones globalement ou selon un champ attributaire de fusion.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de polygones en entrée."
              },
              "dissolve_field": {
                "label": "Champ de fusion",
                "description": "Champ attributaire optionnel utilisé pour fusionner les polygones par groupes ; s'il est omis, fusionne tous les polygones."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage optionnelle utilisée pendant les opérations topologiques."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de polygones en sortie."
              }
            }
          },
          "erase": {
            "name": "Effacer",
            "description": "Efface les surfaces des polygones de superposition des polygones en entrée et préserve les attributs en entrée.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "overlay": {
                "label": "Superposition",
                "description": "Couche polygonale de superposition."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage optionnelle utilisée par les opérations topologiques ; par défaut l'epsilon machine."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "identity": {
            "name": "Identité",
            "description": "Préserve toutes les entités en entrée ; les parties qui recouvrent la couche d'identité acquièrent aussi les attributs d'identité.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "overlay": {
                "label": "Superposition",
                "description": "Couche polygonale de superposition."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage optionnelle utilisée par les opérations topologiques ; par défaut l'epsilon machine."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "intersect": {
            "name": "Intersecter",
            "description": "Intersecte les polygones en entrée et de superposition par superposition topologique et suit les identifiants des entités source.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "overlay": {
                "label": "Superposition",
                "description": "Couche polygonale de superposition."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage optionnelle utilisée par les opérations topologiques ; par défaut l'epsilon machine."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "line_intersections": {
            "name": "Intersections de lignes",
            "description": "Trouve les points d'intersection de lignes entre les couches en entrée et de superposition et ajoute les identifiants parents avec les attributs fusionnés.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de lignes ou de polygones en entrée."
              },
              "overlay": {
                "label": "Superposition",
                "description": "Couche de lignes ou de polygones de superposition."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage optionnelle utilisée par les opérations géométriques ; par défaut l'epsilon machine."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "line_polygon_clip": {
            "name": "Découpage de lignes par polygone",
            "description": "Découpe des entités linéaires à l'intérieur de polygones et produit les segments de lignes découpés.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de lignes en entrée."
              },
              "clip": {
                "label": "Découper",
                "description": "Couche polygonale de découpage."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "near": {
            "name": "Proximité",
            "description": "Ajoute les attributs NEAR_FID et NEAR_DIST identifiant les entités les plus proches et leurs distances à l'aide d'un index spatial.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "near": {
                "label": "Proximité",
                "description": "Couche vectorielle des entités proches."
              },
              "max_distance": {
                "label": "Distance maximale",
                "description": "Distance de recherche maximale optionnelle."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "select_by_location": {
            "name": "Sélectionner par localisation",
            "description": "Filtre les entités cibles selon des prédicats spatiaux (intersects, within, contains, touches, overlaps, etc.) par rapport aux entités de requête.",
            "params": {
              "target": {
                "label": "Cible",
                "description": "Couche d'entités cibles à filtrer."
              },
              "query": {
                "label": "Requête",
                "description": "Couche d'entités de requête."
              },
              "predicate": {
                "label": "Prédicat",
                "description": "Prédicat spatial : intersects, within, contains, touches, crosses, overlaps, disjoint, within_distance."
              },
              "distance": {
                "label": "Distance",
                "description": "Seuil de distance pour le prédicat within_distance."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "spatial_join": {
            "name": "Jointure spatiale",
            "description": "Transfère les attributs des entités de la couche de jointure vers les cibles à l'aide de prédicats spatiaux ; prend en charge des stratégies d'agrégation (count, sum, mean, min, max) pour les correspondances multiples.",
            "params": {
              "target": {
                "label": "Cible",
                "description": "Couche cible recevant les attributs joints."
              },
              "join": {
                "label": "Jointure",
                "description": "Couche de jointure fournissant les attributs."
              },
              "predicate": {
                "label": "Prédicat",
                "description": "Prédicat spatial : intersects, within, contains, touches, crosses, overlaps, within_distance."
              },
              "distance": {
                "label": "Distance",
                "description": "Seuil de distance pour le prédicat within_distance."
              },
              "strategy": {
                "label": "Stratégie",
                "description": "Stratégie de jointure : first, last, count, sum, mean, min, max."
              },
              "prefix": {
                "label": "Préfixe",
                "description": "Préfixe des noms de champs joints (par défaut JOIN_)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "symmetrical_difference": {
            "name": "Différence symétrique",
            "description": "Calcule les régions polygonales sans chevauchement à partir des couches en entrée et de superposition.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "overlay": {
                "label": "Superposition",
                "description": "Couche polygonale de superposition."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage optionnelle utilisée par les opérations topologiques ; par défaut l'epsilon machine."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "union": {
            "name": "Union",
            "description": "Fusionne les polygones combinés en entrée et de superposition en une couverture polygonale unifiée.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "overlay": {
                "label": "Superposition",
                "description": "Couche polygonale de superposition."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage optionnelle utilisée par les opérations topologiques ; par défaut l'epsilon machine."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "update": {
            "name": "Mettre à jour",
            "description": "Remplace les entités en entrée par les entités de mise à jour là où elles se chevauchent ; les entités en entrée situées hors de la couche de mise à jour sont préservées.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "overlay": {
                "label": "Superposition",
                "description": "Couche polygonale de superposition."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage optionnelle utilisée par les opérations topologiques ; par défaut l'epsilon machine."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "centroid_vector": {
            "name": "Centroïde vectoriel",
            "description": "Calcule le centre géographique (coordonnée moyenne de masse) de chaque entité vectorielle, produisant une couche de points pour le placement d'étiquettes, le regroupement et l'analyse spatiale.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de points en sortie."
              }
            }
          },
          "concave_hull": {
            "name": "Enveloppe concave",
            "description": "Crée des polygones d'enveloppe concave autour des coordonnées des entités en entrée à l'aide de l'algorithme concaveman.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "concavity": {
                "label": "Concavité",
                "description": "Rapport de concavité (par défaut 2.0). Des valeurs plus élevées produisent une enveloppe moins concave, plus proche de l'enveloppe convexe. Des valeurs plus faibles autorisent des concavités plus serrées."
              },
              "max_edge_length": {
                "label": "Longueur maximale d'arête",
                "description": "Seuil de longueur : les arêtes d'enveloppe plus courtes que cette valeur ne sont pas raffinées davantage. Par défaut illimité (infini)."
              },
              "epsilon": {
                "label": "Epsilon",
                "description": "Epsilon de robustesse (par défaut 1e-9)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "densify_features": {
            "name": "Densifier les entités",
            "description": "Ajoute des sommets le long des lignes et des limites de polygones à un espacement spécifié.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "spacing": {
                "label": "Espacement",
                "description": "Espacement maximal entre sommets adjacents."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "eliminate_coincident_points": {
            "name": "Éliminer les points coïncidents",
            "description": "Supprime les points coïncidents ou quasi coïncidents dans une distance de tolérance.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points en entrée."
              },
              "tolerance_dist": {
                "label": "Distance de tolérance",
                "description": "Seuil de distance pour considérer des points comme coïncidents."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de points en sortie."
              }
            }
          },
          "extend_vector_lines": {
            "name": "Prolonger les lignes vectorielles",
            "description": "Prolonge les extrémités des polylignes d'une distance spécifiée au début, à la fin ou aux deux.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de polylignes en entrée."
              },
              "distance": {
                "label": "Distance",
                "description": "Distance d'extension des extrémités des polylignes."
              },
              "extend_direction": {
                "label": "Direction d'extension",
                "description": "Direction d'extension des extrémités : both, start ou end."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "merge_line_segments": {
            "name": "Fusionner les segments de ligne",
            "description": "Fusionne les segments de lignes connectés qui se rejoignent à des extrémités sans embranchement.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de polylignes en entrée."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage des extrémités optionnelle utilisée pour apparier les extrémités de lignes ; par défaut l'epsilon machine."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "minimum_bounding_box": {
            "name": "Rectangle englobant minimal",
            "description": "Calcule les rectangles englobants minimaux orientés autour de chaque entité ou de toute la couche.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "min_criteria": {
                "label": "Critères minimaux",
                "description": "Critère de minimisation : area, perimeter, length ou width. Par défaut area."
              },
              "individual_feature_hulls": {
                "label": "Enveloppes par entité",
                "description": "Si vrai, produit un rectangle par entité ; sinon produit un rectangle pour toute la couche."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de polygones en sortie."
              }
            }
          },
          "minimum_bounding_circle": {
            "name": "Cercle englobant minimal",
            "description": "Calcule les cercles englobants minimaux autour de chaque entité ou de toute la couche.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "individual_feature_hulls": {
                "label": "Enveloppes par entité",
                "description": "Si vrai, produit un cercle par entité ; sinon produit un cercle pour toute la couche."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de polygones en sortie."
              }
            }
          },
          "minimum_bounding_envelope": {
            "name": "Enveloppe englobante minimale",
            "description": "Calcule les enveloppes englobantes minimales alignées sur les axes autour de chaque entité ou de toute la couche.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "individual_feature_hulls": {
                "label": "Enveloppes par entité",
                "description": "Si vrai, produit une enveloppe par entité ; sinon produit une enveloppe pour toute la couche."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de polygones en sortie."
              }
            }
          },
          "minimum_convex_hull": {
            "name": "Enveloppe convexe minimale",
            "description": "Crée des polygones d'enveloppe convexe autour de chaque entité ou de toute la couche en entrée.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "individual_feature_hulls": {
                "label": "Enveloppes par entité",
                "description": "Si vrai, produit une enveloppe par entité d'entrée ; sinon produit une enveloppe pour toute la couche."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de polygones en sortie."
              }
            }
          },
          "polygonize": {
            "name": "Polygoniser",
            "description": "Crée des polygones à partir des lignes en entrée, y compris des segments sécants/ouverts lorsque des faces fermées peuvent être formées.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Couches vectorielles de lignes en entrée sous forme de tableau ou de chaîne délimitée par des points-virgules/virgules. Si omis, 'input' est utilisé."
              },
              "input": {
                "label": "Entrée",
                "description": "Chemin optionnel d'une seule couche vectorielle de lignes en entrée."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage optionnelle utilisée par la polygonisation ; par défaut l'epsilon machine."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "representative_point_vector": {
            "name": "Point représentatif vectoriel",
            "description": "Génère un point intérieur garanti de se trouver dans ou sur chaque géométrie à l'aide du pôle d'inaccessibilité, idéal pour le placement d'étiquettes dans des polygones concaves.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de points en sortie."
              }
            }
          },
          "simplify_features": {
            "name": "Simplifier les entités",
            "description": "Réduit la complexité des géométries à l'aide de l'algorithme de Douglas-Peucker pour minimiser la taille des fichiers, supprimer le bruit GPS et optimiser les performances de rendu tout en préservant la forme.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "tolerance": {
                "label": "Tolérance",
                "description": "Tolérance de simplification en unités carte."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "smooth_vectors": {
            "name": "Lisser les vecteurs",
            "description": "Lisse les géométries de polylignes ou de polygones par filtrage à moyenne mobile afin de réduire le bruit de numérisation et l'instabilité des traces GPS.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de lignes ou de polygones en entrée."
              },
              "filter_size": {
                "label": "Taille du filtre",
                "description": "Taille impaire de la fenêtre de moyenne mobile (>= 3). Les valeurs paires sont incrémentées à la valeur impaire suivante."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "snap_endnodes": {
            "name": "Accrocher les nœuds terminaux",
            "description": "Accroche les extrémités de polylignes proches à une position commune dans une tolérance donnée.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de polylignes en entrée."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage des extrémités en unités carte."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de polylignes accrochées en sortie."
              }
            }
          },
          "split_vector_lines": {
            "name": "Scinder les lignes vectorielles",
            "description": "Scinde chaque entité polyligne en segments d'une longueur maximale spécifiée.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de polylignes en entrée."
              },
              "segment_length": {
                "label": "Longueur de segment",
                "description": "Longueur maximale de segment en unités carte."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de polylignes en sortie."
              }
            }
          },
          "split_with_lines": {
            "name": "Scinder avec des lignes",
            "description": "Scinde les polylignes en entrée aux points d'intersection avec une couche de lignes de découpe.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de lignes en entrée à diviser."
              },
              "split": {
                "label": "Diviser",
                "description": "Couche de lignes de division utilisée pour créer les points de rupture."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance d'accrochage optionnelle utilisée par les opérations de division ; par défaut l'epsilon machine."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "compactness_ratio": {
            "name": "Rapport de compacité",
            "description": "Calcule le rapport de compacité (surface / périmètre) des entités polygonales.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de polygones en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Vecteur de sortie avec un champ de compacité ajouté."
              }
            }
          },
          "deviation_from_regional_direction": {
            "name": "Écart à la direction régionale",
            "description": "Calcule l'écart directionnel des polygones par rapport à l'orientation moyenne régionale pondérée et ajoute DEV_DIR.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de polygones en entrée."
              },
              "elongation_threshold": {
                "label": "Seuil d'élongation",
                "description": "Élongation minimale utilisée pour inclure les polygones dans l'estimation de la direction régionale ; par défaut 0.75."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "elongation_ratio": {
            "name": "Rapport d'élongation",
            "description": "Calcule le rapport d'allongement (petit axe / grand axe du rectangle englobant) des entités polygonales.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de polygones en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Vecteur de sortie avec un champ d'élongation ajouté."
              }
            }
          },
          "hole_proportion": {
            "name": "Proportion de trous",
            "description": "Calcule la surface des trous d'un polygone divisée par la surface de son enveloppe et ajoute HOLE_PROP.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de polygones en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "linearity_index": {
            "name": "Indice de linéarité",
            "description": "Calcule l'indice de linéarité (r² de régression) des entités polygonales.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de polygones en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Vecteur de sortie avec un champ de linéarité ajouté."
              }
            }
          },
          "narrowness_index_vector": {
            "name": "Indice d'étroitesse vectoriel",
            "description": "Calcule l'indice d'étroitesse (périmètre / sqrt(surface)) des entités polygonales.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de polygones en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Vecteur de sortie avec un champ d'étroitesse ajouté."
              }
            }
          },
          "patch_orientation": {
            "name": "Orientation de la tache",
            "description": "Calcule l'orientation des polygones (degrés depuis le nord) par régression sur l'axe majeur réduit et ajoute ORIENT.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de polygones en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "perimeter_area_ratio": {
            "name": "Rapport périmètre-aire",
            "description": "Calcule le rapport périmètre/surface des polygones et ajoute P_A_RATIO.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de polygones en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "polygon_area": {
            "name": "Aire du polygone",
            "description": "Calcule la surface des polygones et ajoute un champ attributaire AREA.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de polygones en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "polygon_long_axis": {
            "name": "Grand axe du polygone",
            "description": "Représente le grand axe de la boîte englobante minimale de chaque entité polygonale sous forme de lignes.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de polygones en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de polylignes en sortie."
              }
            }
          },
          "polygon_perimeter": {
            "name": "Périmètre du polygone",
            "description": "Calcule le périmètre des polygones et ajoute un champ attributaire PERIMETER.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de polygones en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "polygon_short_axis": {
            "name": "Petit axe du polygone",
            "description": "Représente le petit axe de la boîte englobante minimale de chaque entité polygonale sous forme de lignes.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de polygones en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de polylignes en sortie."
              }
            }
          },
          "related_circumscribing_circle": {
            "name": "Cercle circonscrit associé",
            "description": "Calcule 1 - (surface du polygone / surface du plus petit cercle circonscrit) et ajoute RC_CIRCLE.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de polygones en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "shape_complexity_index_vector": {
            "name": "Indice de complexité de forme vectoriel",
            "description": "Calcule un indice de complexité de forme pour les entités polygonales vectorielles à l'aide d'un facteur de forme normalisé.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de polygones en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Vecteur de sortie avec un champ d'indice de complexité ajouté."
              }
            }
          },
          "global_morans_i": {
            "name": "I de Moran global",
            "description": "Calcule l'indice global de Moran (I de Moran) pour tester l'autocorrélation spatiale, c'est-à-dire si des valeurs similaires se regroupent dans l'espace. Base essentielle de l'analyse géostatistique.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "field": {
                "label": "Champ",
                "description": "Champ attributaire numérique à analyser."
              },
              "weights_mode": {
                "label": "Mode de pondération",
                "description": "Mode de voisinage : queen, rook, k_nearest, distance_band."
              },
              "k": {
                "label": "K",
                "description": "Valeur k pour le mode k_nearest."
              },
              "distance": {
                "label": "Distance",
                "description": "Seuil de distance pour le mode distance_band."
              },
              "row_standardize": {
                "label": "Standardisation par ligne",
                "description": "Appliquer une standardisation par ligne aux poids (par défaut true)."
              },
              "inference": {
                "label": "Inférence",
                "description": "Mode d'inférence : asymptotic ou permutation (par défaut : asymptotic)."
              },
              "num_simulations": {
                "label": "Nombre de simulations",
                "description": "Nombre de permutations pour le test par permutation (par défaut : 999)."
              },
              "seed": {
                "label": "Graine",
                "description": "Graine aléatoire pour un test par permutation reproductible."
              },
              "island_policy": {
                "label": "Politique des îles",
                "description": "Gestion des îles : drop_with_warning, keep_zero_weight, error."
              },
              "output_json": {
                "label": "JSON de sortie",
                "description": "Chemin de sortie optionnel du rapport JSON."
              },
              "output_html": {
                "label": "HTML de sortie",
                "description": "Chemin de sortie optionnel du rapport HTML."
              },
              "output_csv": {
                "label": "CSV de sortie",
                "description": "Chemin de sortie optionnel du résumé CSV."
              },
              "output_distribution": {
                "label": "Distribution en sortie",
                "description": "Chemin optionnel pour enregistrer la distribution des permutations en JSON."
              }
            }
          },
          "getis_ord_gi_star": {
            "name": "Gi* de Getis-Ord",
            "description": "Calcule les scores z Gi/Gi* de Getis-Ord pour identifier les points chauds/froids locaux. Mesure directe de la concentration des valeurs élevées/faibles.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "field": {
                "label": "Champ",
                "description": "Champ attributaire numérique à analyser."
              },
              "weights_mode": {
                "label": "Mode de pondération",
                "description": "Mode de voisinage : queen, rook, k_nearest, distance_band."
              },
              "k": {
                "label": "K",
                "description": "Valeur k pour le mode k_nearest."
              },
              "distance": {
                "label": "Distance",
                "description": "Seuil de distance pour le mode distance_band."
              },
              "row_standardize": {
                "label": "Standardisation par ligne",
                "description": "Appliquer une standardisation par ligne aux poids (par défaut true)."
              },
              "variant": {
                "label": "Variante",
                "description": "Variante : gi ou gi_star (par défaut gi_star)."
              },
              "inference": {
                "label": "Inférence",
                "description": "Mode d'inférence : asymptotic ou permutation (par défaut : asymptotic)."
              },
              "num_simulations": {
                "label": "Nombre de simulations",
                "description": "Nombre de permutations pour le test par permutation (par défaut : 999)."
              },
              "seed": {
                "label": "Graine",
                "description": "Graine aléatoire pour un test par permutation reproductible."
              },
              "island_policy": {
                "label": "Politique des îles",
                "description": "Gestion des îles : drop_with_warning, keep_zero_weight, error."
              },
              "alpha": {
                "label": "Alpha",
                "description": "Seuil de significativité dans [0, 1] ; par défaut 0.05."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie avec les champs GI."
              },
              "output_html": {
                "label": "HTML de sortie",
                "description": "Chemin de sortie optionnel du rapport HTML."
              }
            }
          },
          "local_morans_i_lisa": {
            "name": "I de Moran local (LISA)",
            "description": "Calcule l'indice local de Moran pour chaque entité afin d'identifier les agrégats et valeurs aberrantes spatiaux locaux, avec test de significativité statistique.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "field": {
                "label": "Champ",
                "description": "Champ attributaire numérique à analyser."
              },
              "weights_mode": {
                "label": "Mode de pondération",
                "description": "Mode de voisinage : queen, rook, k_nearest, distance_band."
              },
              "k": {
                "label": "K",
                "description": "Valeur k pour le mode k_nearest."
              },
              "distance": {
                "label": "Distance",
                "description": "Seuil de distance pour le mode distance_band."
              },
              "row_standardize": {
                "label": "Standardisation par ligne",
                "description": "Appliquer une standardisation par ligne aux poids (par défaut true)."
              },
              "inference": {
                "label": "Inférence",
                "description": "Mode d'inférence : asymptotic ou permutation (par défaut : asymptotic)."
              },
              "num_simulations": {
                "label": "Nombre de simulations",
                "description": "Nombre de permutations pour le test par permutation (par défaut : 999)."
              },
              "seed": {
                "label": "Graine",
                "description": "Graine aléatoire pour un test par permutation reproductible."
              },
              "island_policy": {
                "label": "Politique des îles",
                "description": "Gestion des îles : drop_with_warning, keep_zero_weight, error."
              },
              "alpha": {
                "label": "Alpha",
                "description": "Seuil de significativité dans [0, 1] ; par défaut 0.05."
              },
              "fdr_correction": {
                "label": "Correction FDR",
                "description": "Appliquer la correction FDR-BH (par défaut true pour la permutation)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie avec les champs LISA."
              },
              "output_html": {
                "label": "HTML de sortie",
                "description": "Chemin de sortie optionnel du rapport HTML."
              }
            }
          },
          "nearest_neighbour_index": {
            "name": "Indice du plus proche voisin",
            "description": "Calcule l'indice du plus proche voisin de Clark-Evans pour tester l'aléa spatial complet. Détecte le regroupement ou la dispersion.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points en entrée."
              },
              "study_area_mode": {
                "label": "Mode de zone d'étude",
                "description": "Mode de zone d'étude : hull, envelope, polygon_layer."
              },
              "study_area_polygon": {
                "label": "Polygone de zone d'étude",
                "description": "Couche polygonale utilisée lorsque study_area_mode=polygon_layer."
              },
              "output_json": {
                "label": "JSON de sortie",
                "description": "Chemin de sortie optionnel du rapport JSON."
              },
              "output_html": {
                "label": "HTML de sortie",
                "description": "Chemin de sortie optionnel du rapport HTML."
              },
              "output_csv": {
                "label": "CSV de sortie",
                "description": "Chemin de sortie optionnel du résumé CSV."
              }
            }
          },
          "quadrat_count_test": {
            "name": "Test de comptage par quadrats",
            "description": "Effectue un test du khi-deux de l'aléa d'un semis de points à l'aide de comptages par quadrats. Teste le regroupement ou la dispersion.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points en entrée."
              },
              "grid_mode": {
                "label": "Mode de grille",
                "description": "Mode de grille : rows_cols ou cell_size."
              },
              "rows": {
                "label": "Lignes",
                "description": "Lignes lorsque grid_mode=rows_cols."
              },
              "cols": {
                "label": "Colonnes",
                "description": "Colonnes lorsque grid_mode=rows_cols."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule lorsque grid_mode=cell_size."
              },
              "study_area_mode": {
                "label": "Mode de zone d'étude",
                "description": "Mode de zone d'étude : hull, envelope, polygon_layer."
              },
              "study_area_polygon": {
                "label": "Polygone de zone d'étude",
                "description": "Couche polygonale utilisée lorsque study_area_mode=polygon_layer."
              },
              "output_grid": {
                "label": "Grille en sortie",
                "description": "Chemin de sortie optionnel de la grille polygonale de quadrats."
              },
              "output_json": {
                "label": "JSON de sortie",
                "description": "Chemin de sortie optionnel du rapport JSON."
              },
              "output_html": {
                "label": "HTML de sortie",
                "description": "Chemin de sortie optionnel du rapport HTML."
              },
              "output_csv": {
                "label": "CSV de sortie",
                "description": "Chemin de sortie optionnel du résumé CSV."
              }
            }
          },
          "spatial_lag_regression": {
            "name": "Régression à décalage spatial",
            "description": "Estime un modèle autorégressif spatial capturant les effets de débordement endogènes, où la variable dépendante est influencée par ses voisins spatiaux.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "response_field": {
                "label": "Champ de réponse",
                "description": "Variable de réponse (dépendante)."
              },
              "predictor_fields": {
                "label": "Champs prédicteurs",
                "description": "Noms des champs prédicteurs séparés par des virgules."
              },
              "weights_mode": {
                "label": "Mode de pondération",
                "description": "Mode de voisinage spatial."
              },
              "k": {
                "label": "K",
                "description": "Valeur k pour k_nearest."
              },
              "distance": {
                "label": "Distance",
                "description": "Seuil de distance."
              },
              "row_standardize": {
                "label": "Standardisation par ligne",
                "description": "Standardiser les poids par ligne."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche vectorielle en sortie."
              }
            }
          },
          "spatial_error_regression": {
            "name": "Régression à erreur spatiale",
            "description": "Estime un modèle d'erreur spatiale traitant la dépendance spatiale exogène des résidus due à des variables omises ou à des erreurs de mesure.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "response_field": {
                "label": "Champ de réponse",
                "description": "Variable de réponse."
              },
              "predictor_fields": {
                "label": "Champs prédicteurs",
                "description": "Champs prédicteurs séparés par des virgules."
              },
              "weights_mode": {
                "label": "Mode de pondération",
                "description": "Mode de voisinage spatial."
              },
              "k": {
                "label": "K",
                "description": "k pour k_nearest."
              },
              "distance": {
                "label": "Distance",
                "description": "Seuil de distance."
              },
              "row_standardize": {
                "label": "Standardisation par ligne",
                "description": "Standardiser les poids par ligne."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche vectorielle en sortie."
              }
            }
          },
          "geographically_weighted_regression": {
            "name": "Régression géographiquement pondérée",
            "description": "Régression linéaire locale avec des poids de noyau à décroissance selon la distance (GWR) : coefficients par entité, R² local, résidus et prédictions, plus diagnostics globaux AICc / R² ; largeur de bande fixe ou adaptative, éventuellement optimisée par AICc.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche d'entités en entrée (points, ou autres géométries via leur point représentatif)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel (pilote selon son extension). S'il est omis, stocké en mémoire."
              },
              "y_field": {
                "label": "Champ Y",
                "description": "Champ numérique dépendant (réponse)."
              },
              "x_fields": {
                "label": "Champs X",
                "description": "Champ(s) numérique(s) explicatif(s) séparés par des virgules."
              },
              "kernel": {
                "label": "Noyau",
                "description": "Noyau de décroissance avec la distance : 'gaussian' (par défaut) ou 'bisquare'."
              },
              "bandwidth_type": {
                "label": "Type de largeur de bande",
                "description": "'adaptive' (par défaut ; largeur de bande = k plus proches voisins) ou 'fixed' (largeur de bande = une distance)."
              },
              "bandwidth": {
                "label": "Largeur de bande",
                "description": "Largeur de bande : nombre de voisins pour adaptive, ou distance pour fixed. Omettre pour la sélectionner en minimisant l'AICc."
              }
            }
          },
          "ripleys_k_test": {
            "name": "Test K de Ripley",
            "description": "Calcule la statistique de regroupement multi-échelle K de Ripley. Révèle le regroupement/la dispersion dépendant de l'échelle sur des plages de distances.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points en entrée."
              },
              "max_distance": {
                "label": "Distance maximale",
                "description": "Distance d'analyse maximale."
              },
              "step_size": {
                "label": "Taille du pas",
                "description": "Taille du pas de distance."
              },
              "output": {
                "label": "Sortie",
                "description": "Vecteur de sortie avec les statistiques K."
              }
            }
          },
          "envelope_test": {
            "name": "Test d'enveloppe",
            "description": "Effectue un test d'enveloppe de Monte Carlo comparant le semis observé à la distribution nulle CSR. Détermine la significativité du regroupement/de la dispersion.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points en entrée."
              },
              "num_simulations": {
                "label": "Nombre de simulations",
                "description": "Nombre de simulations Monte-Carlo."
              },
              "max_distance": {
                "label": "Distance maximale",
                "description": "Distance d'analyse maximale."
              },
              "output": {
                "label": "Sortie",
                "description": "Vecteur de sortie avec les bornes de l'enveloppe."
              }
            }
          },
          "point_process_residuals": {
            "name": "Résidus du processus ponctuel",
            "description": "Calcule les résidus d'un modèle de processus ponctuel de Poisson ajusté à des fins de diagnostic. Détecte une structure spatiale non modélisée.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points en entrée."
              },
              "intensity_field": {
                "label": "Champ d'intensité",
                "description": "Champ d'intensité ajustée."
              },
              "output": {
                "label": "Sortie",
                "description": "Vecteur de sortie avec les résidus."
              }
            }
          },
          "ripleys_k_function": {
            "name": "Fonction K de Ripley",
            "description": "Calcule K(t) et L(t) pour caractériser les motifs de regroupement spatial.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points."
              },
              "max_distance": {
                "label": "Distance maximale",
                "description": "Seuil de distance maximale."
              },
              "num_distances": {
                "label": "Nombre de distances",
                "description": "Nombre de pas de distance."
              },
              "output": {
                "label": "Sortie",
                "description": "CSV en sortie."
              }
            }
          },
          "point_pattern_envelope": {
            "name": "Enveloppe du semis de points",
            "description": "Génère des enveloppes de bande critique pour les tests d'hypothèse par rapport au CSR.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points."
              },
              "max_distance": {
                "label": "Distance maximale",
                "description": "Distance maximale."
              },
              "num_distances": {
                "label": "Nombre de distances",
                "description": "Classes de distance."
              },
              "num_simulations": {
                "label": "Nombre de simulations",
                "description": "Réplications Monte-Carlo."
              },
              "alpha": {
                "label": "Alpha",
                "description": "Niveau de significativité."
              },
              "output": {
                "label": "Sortie",
                "description": "CSV en sortie."
              }
            }
          },
          "inhomogeneous_baseline": {
            "name": "Référence inhomogène",
            "description": "Estime une surface d'intensité et calcule la fonction K corrigée de l'intensité.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points."
              },
              "max_distance": {
                "label": "Distance maximale",
                "description": "Distance maximale."
              },
              "num_distances": {
                "label": "Nombre de distances",
                "description": "Classes de distance."
              },
              "bandwidth": {
                "label": "Largeur de bande",
                "description": "Largeur de bande KDE (sélection automatique si omise)."
              },
              "output": {
                "label": "Sortie",
                "description": "CSV en sortie."
              }
            }
          },
          "hotspot_vs_process": {
            "name": "Point chaud contre processus",
            "description": "Compare les motifs de points chauds à l'intensité du processus ponctuel sous-jacent.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points."
              },
              "hotspot_field": {
                "label": "Champ de points chauds",
                "description": "Champ de classification des points chauds."
              },
              "intensity_field": {
                "label": "Champ d'intensité",
                "description": "Champ d'intensité."
              },
              "output": {
                "label": "Sortie",
                "description": "CSV en sortie."
              }
            }
          },
          "point_process_residuals_comparison": {
            "name": "Comparaison des résidus de processus ponctuels",
            "description": "Calcule des diagnostics de résidus pour vérifier l'adéquation du modèle.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points."
              },
              "observed_field": {
                "label": "Champ observé",
                "description": "Champ des valeurs observées."
              },
              "predicted_field": {
                "label": "Champ prédit",
                "description": "Champ des valeurs prédites."
              },
              "residual_type": {
                "label": "Type de résidu",
                "description": "Type de résidu."
              },
              "output": {
                "label": "Sortie",
                "description": "CSV en sortie."
              }
            }
          },
          "construct_vector_tin": {
            "name": "Construire un TIN vectoriel",
            "description": "Construit un réseau triangulé irrégulier (TIN) à partir d'un ensemble de points en entrée par triangulation de Delaunay.",
            "params": {
              "input_points": {
                "label": "Points d'entrée",
                "description": "Couche vectorielle de points ou de multipoints en entrée."
              },
              "field_name": {
                "label": "Nom du champ",
                "description": "Nom de champ optionnel pour les hauteurs des sommets (champ numérique)."
              },
              "use_z": {
                "label": "Utiliser Z",
                "description": "Si vrai, utilise les valeurs Z de la géométrie pour les élévations des triangles."
              },
              "max_triangle_edge_length": {
                "label": "Longueur maximale d'arête de triangle",
                "description": "Longueur maximale autorisée des arêtes de triangles (filtre les longues arêtes). Utilisez 0 ou une valeur négative pour aucune limite."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche vectorielle de polygones en sortie (TIN)."
              }
            }
          },
          "contours_from_points": {
            "name": "Courbes de niveau depuis des points",
            "description": "Crée des polylignes de courbes de niveau à partir des altitudes de points à l'aide d'un TIN de Delaunay.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du vecteur de points ou de multipoints en entrée."
              },
              "base": {
                "label": "Base",
                "description": "Élévation de la courbe de base (par défaut 0.0)."
              },
              "field_name": {
                "label": "Nom du champ",
                "description": "Champ attributaire numérique contenant les valeurs d'élévation (ignoré lorsque use_z_values=true)."
              },
              "interval": {
                "label": "Intervalle",
                "description": "Valeur de l'intervalle des courbes de niveau (par défaut 10.0)."
              },
              "max_triangle_edge_length": {
                "label": "Longueur maximale d'arête de triangle",
                "description": "Longueur maximale des arêtes de triangles à inclure dans le tracé des courbes (unités carte)."
              },
              "smooth": {
                "label": "Lisser",
                "description": "Taille du filtre de lissage (entier impair, par défaut 9)."
              },
              "use_z_values": {
                "label": "Utiliser les valeurs Z",
                "description": "Utiliser les valeurs Z de la géométrie comme élévations (par défaut false)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "contours_from_raster": {
            "name": "Courbes de niveau depuis un raster",
            "description": "Crée des polylignes de courbes de niveau à partir d'un modèle de surface raster.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster de surface en entrée ou objet raster typé."
              },
              "base": {
                "label": "Base",
                "description": "Élévation de la courbe de base (par défaut 0.0)."
              },
              "interval": {
                "label": "Intervalle",
                "description": "Valeur de l'intervalle des courbes de niveau (par défaut 10.0)."
              },
              "smooth": {
                "label": "Lisser",
                "description": "Taille du filtre de lissage (entier impair, par défaut 9)."
              },
              "tolerance": {
                "label": "Tolérance",
                "description": "Angle minimal de déviation des lignes en degrés pour la simplification (par défaut 10.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "extract_nodes": {
            "name": "Extraire les nœuds",
            "description": "Convertit les sommets de polylignes et de polygones en entités ponctuelles.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de polylignes ou de polygones en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de points en sortie."
              }
            }
          },
          "extract_raster_values_at_points": {
            "name": "Extraire les valeurs raster aux points",
            "description": "Échantillonne un ou plusieurs rasters aux positions des points et écrit les valeurs dans les attributs des points.",
            "params": {
              "rasters": {
                "label": "Rasters",
                "description": "Chemins des rasters en entrée sous forme de tableau ou de chaîne délimitée."
              },
              "points": {
                "label": "Points",
                "description": "Couche vectorielle de points en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de points en sortie."
              }
            }
          },
          "find_lowest_or_highest_points": {
            "name": "Trouver les points les plus bas ou les plus hauts",
            "description": "Localise les cellules raster les plus basses et/ou les plus hautes et produit leurs positions sous forme de points.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster en entrée."
              },
              "out_type": {
                "label": "Type de sortie",
                "description": "Type de sortie : lowest, highest ou both."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de points en sortie."
              }
            }
          },
          "hexagonal_grid_from_raster_base": {
            "name": "Grille hexagonale sur base raster",
            "description": "Crée une grille de polygones hexagonaux de largeur et d'orientation configurables, offrant un pavage non biaisé pour les cartes de chaleur et l'agrégation.",
            "params": {
              "base": {
                "label": "Base",
                "description": "Raster de base contrôlant l'emprise de la grille."
              },
              "width": {
                "label": "Largeur",
                "description": "Largeur des hexagones en unités carte."
              },
              "orientation": {
                "label": "Orientation",
                "description": "Orientation des hexagones : horizontal ou vertical."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de polygones en sortie."
              }
            }
          },
          "hexagonal_grid_from_vector_base": {
            "name": "Grille hexagonale sur base vectorielle",
            "description": "Crée une grille de polygones hexagonaux alignée sur l'étendue d'une couche vectorielle, permettant une agrégation spatiale non biaisée et la visualisation de la densité.",
            "params": {
              "base": {
                "label": "Base",
                "description": "Couche vectorielle de base contrôlant l'emprise de la grille."
              },
              "width": {
                "label": "Largeur",
                "description": "Largeur des hexagones en unités carte."
              },
              "orientation": {
                "label": "Orientation",
                "description": "Orientation des hexagones : horizontal ou vertical."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de polygones en sortie."
              }
            }
          },
          "layer_footprint_raster": {
            "name": "Emprise de couche raster",
            "description": "Crée un polygone d'emprise représentant l'étendue complète d'un raster en entrée.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de polygones en sortie."
              }
            }
          },
          "layer_footprint_vector": {
            "name": "Emprise de couche vectorielle",
            "description": "Crée un polygone d'emprise représentant l'étendue englobante complète d'une couche vectorielle en entrée.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de polygones en sortie."
              }
            }
          },
          "medoid": {
            "name": "Médoïde",
            "description": "Calcule les points médoïdes des géométries vectorielles.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de points médoïdes en sortie."
              }
            }
          },
          "random_points_in_polygon": {
            "name": "Points aléatoires dans un polygone",
            "description": "Génère des points aléatoires uniformément répartis dans les géométries polygonales en entrée.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de polygones en entrée."
              },
              "num_points": {
                "label": "Nombre de points",
                "description": "Nombre de points aléatoires à créer."
              },
              "seed": {
                "label": "Graine",
                "description": "Graine aléatoire optionnelle pour la reproductibilité."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "rectangular_grid_from_raster_base": {
            "name": "Grille rectangulaire sur base raster",
            "description": "Crée une grille de polygones rectangulaires couvrant l'étendue d'un raster.",
            "params": {
              "base": {
                "label": "Base",
                "description": "Raster de base contrôlant l'emprise de la grille."
              },
              "width": {
                "label": "Largeur",
                "description": "Largeur des cellules de grille en unités carte."
              },
              "height": {
                "label": "Hauteur",
                "description": "Hauteur des cellules de grille en unités carte."
              },
              "x_origin": {
                "label": "Origine X",
                "description": "Origine x optionnelle pour l'alignement de la grille."
              },
              "y_origin": {
                "label": "Origine Y",
                "description": "Origine y optionnelle pour l'alignement de la grille."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de polygones en sortie."
              }
            }
          },
          "rectangular_grid_from_vector_base": {
            "name": "Grille rectangulaire sur base vectorielle",
            "description": "Crée une grille de polygones rectangulaires couvrant l'étendue englobante d'une couche vectorielle.",
            "params": {
              "base": {
                "label": "Base",
                "description": "Couche vectorielle de base contrôlant l'emprise de la grille."
              },
              "width": {
                "label": "Largeur",
                "description": "Largeur des cellules de grille en unités carte."
              },
              "height": {
                "label": "Hauteur",
                "description": "Hauteur des cellules de grille en unités carte."
              },
              "x_origin": {
                "label": "Origine X",
                "description": "Origine x optionnelle pour l'alignement de la grille."
              },
              "y_origin": {
                "label": "Origine Y",
                "description": "Origine y optionnelle pour l'alignement de la grille."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de polygones en sortie."
              }
            }
          },
          "vector_hex_binning": {
            "name": "Regroupement hexagonal vectoriel",
            "description": "Agrège les entités ponctuelles dans des cases hexagonales en comptant les points par cellule hexagonale.",
            "params": {
              "vector_points": {
                "label": "Points vecteur",
                "description": "Couche vectorielle de points ou de multipoints en entrée."
              },
              "width": {
                "label": "Largeur",
                "description": "Largeur des hexagones (distance entre côtés opposés)."
              },
              "orientation": {
                "label": "Orientation",
                "description": "Orientation des hexagones : 'h' pour horizontale (pointe en haut) ou 'v' pour verticale (côté plat en haut)."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche de polygones hexagonaux en sortie avec les comptages."
              }
            }
          },
          "voronoi_diagram": {
            "name": "Diagramme de Voronoï",
            "description": "Crée des polygones de Voronoi (Thiessen) à partir des positions de points en entrée.",
            "params": {
              "input_points": {
                "label": "Points d'entrée",
                "description": "Couche vectorielle de points ou de multipoints en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de polygones de Voronoï en sortie."
              }
            }
          },
          "add_field": {
            "name": "Ajouter un champ",
            "description": "Ajoute un nouveau champ attributaire avec une valeur par défaut optionnelle.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "field": {
                "label": "Champ",
                "description": "Nom du nouveau champ."
              },
              "field_type": {
                "label": "Type de champ",
                "description": "Type de champ : integer, float, text, boolean."
              },
              "default": {
                "label": "Par défaut",
                "description": "Valeur par défaut optionnelle."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "add_geometry_attributes": {
            "name": "Ajouter des attributs de géométrie",
            "description": "Calcule automatiquement des propriétés géométriques (surface, longueur, périmètre, centroïde) et les ajoute comme nouveaux champs, avec prise en charge des mesures planes et géodésiques.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "measurement_mode": {
                "label": "Mode de mesure",
                "description": "Méthode de mesure : auto (par défaut), planar ou geodesic."
              },
              "area": {
                "label": "Surface",
                "description": "Inclure le champ de surface (AREA_M2 pour geodesic, AREA_MAP2 pour planar)."
              },
              "length": {
                "label": "Longueur",
                "description": "Inclure le champ de longueur (LENGTH_M pour geodesic, LENGTH_MAP pour planar)."
              },
              "perimeter": {
                "label": "Périmètre",
                "description": "Inclure le champ de périmètre (PERIM_M pour geodesic, PERIM_MAP pour planar)."
              },
              "centroid": {
                "label": "Centroïde",
                "description": "Inclure les champs X/Y du centroïde (par défaut true)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "attribute_correlation": {
            "name": "Corrélation d'attributs",
            "description": "Effectue une analyse de corrélation de Pearson sur des champs attributaires vectoriels numériques.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin vectoriel en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du rapport HTML (alias : output_html_file)."
              }
            }
          },
          "attribute_histogram": {
            "name": "Histogramme d'attributs",
            "description": "Crée un histogramme des valeurs d'un champ numérique d'une table attributaire vectorielle.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin vectoriel en entrée."
              },
              "field": {
                "label": "Champ",
                "description": "Nom du champ attributaire numérique."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du rapport HTML (alias : output_html_file)."
              }
            }
          },
          "attribute_scattergram": {
            "name": "Nuage de points d'attributs",
            "description": "Calcule des statistiques de synthèse de nuage de points entre deux champs vectoriels numériques.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin vectoriel en entrée."
              },
              "fieldx": {
                "label": "Champ X",
                "description": "Nom du champ numérique de l'axe x."
              },
              "fieldy": {
                "label": "Champ Y",
                "description": "Nom du champ numérique de l'axe y."
              },
              "trendline": {
                "label": "Ligne de tendance",
                "description": "Inclure un résumé de la ligne de tendance (par défaut false)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du rapport HTML (alias : output_html_file)."
              }
            }
          },
          "delete_field": {
            "name": "Supprimer un champ",
            "description": "Supprime un ou plusieurs champs attributaires d'une couche vectorielle.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "fields": {
                "label": "Champs",
                "description": "Noms de champs délimités par des virgules à supprimer."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "extract_by_attribute": {
            "name": "Extraire par attribut",
            "description": "Extrait les entités vectorielles qui satisfont une expression attributaire.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "statement": {
                "label": "Instruction",
                "description": "Expression booléenne évaluée sur les champs attributaires ; accepte les alias AND/OR/NOT/XOR de style SQL."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "field_calculator": {
            "name": "Calculatrice de champs",
            "description": "Calcule la valeur d'un champ à partir d'une expression utilisant les attributs et des variables de géométrie des entités ; prend en charge les constructions de type SQL CASE, CAST, les tests de nullité et les enveloppes UPDATE ... SET ... [WHERE ...].",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "field": {
                "label": "Champ",
                "description": "Nom du champ de sortie."
              },
              "field_type": {
                "label": "Type de champ",
                "description": "Type du champ de sortie : float, integer, text."
              },
              "expression": {
                "label": "Expression",
                "description": "Expression évaluée par entité. Prend en charge CASE de style SQL, CAST(... AS type), IS NULL/IS NOT NULL et les enveloppes UPDATE ... SET CHAMP = ... [WHERE ...]."
              },
              "overwrite": {
                "label": "Écraser",
                "description": "Écraser le champ existant s'il est présent (par défaut true)."
              },
              "preview_rows": {
                "label": "Lignes d'aperçu",
                "description": "Nombre optionnel de lignes d'aperçu à renvoyer dans la charge utile du résultat. Lorsque > 0, la sortie peut être omise pour une évaluation en aperçu uniquement."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie. Optionnel lorsque preview_rows > 0."
              }
            }
          },
          "filter_vector_features_by_area": {
            "name": "Filtrer les entités vectorielles par superficie",
            "description": "Filtre les entités polygonales dont la surface est inférieure à un seuil minimal.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de polygones en entrée."
              },
              "threshold": {
                "label": "Seuil",
                "description": "Surface minimale des polygones à conserver, en unités de coordonnées de la couche au carré."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "list_unique_values": {
            "name": "Lister les valeurs uniques",
            "description": "Liste les valeurs uniques et leurs fréquences dans un champ attributaire vectoriel.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin vectoriel en entrée."
              },
              "field": {
                "label": "Champ",
                "description": "Nom du champ attributaire."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin CSV de sortie optionnel."
              }
            }
          },
          "rename_field": {
            "name": "Renommer un champ",
            "description": "Renomme un champ attributaire d'une couche vectorielle.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "field": {
                "label": "Champ",
                "description": "Nom du champ existant."
              },
              "new_field": {
                "label": "Nouveau champ",
                "description": "Nom du champ de remplacement."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "download_osm_vector": {
            "name": "Télécharger des vecteurs OSM",
            "description": "Télécharge des entités OpenStreetMap depuis l'API Overpass pour une emprise rectangulaire et écrit le résultat sous forme de couche vectorielle.",
            "params": {
              "west": {
                "label": "Ouest",
                "description": "Longitude de la limite ouest (EPSG:4326)."
              },
              "south": {
                "label": "Sud",
                "description": "Latitude de la limite sud (EPSG:4326)."
              },
              "east": {
                "label": "Est",
                "description": "Longitude de la limite est (EPSG:4326)."
              },
              "north": {
                "label": "Nord",
                "description": "Latitude de la limite nord (EPSG:4326)."
              },
              "input_extent_epsg": {
                "label": "EPSG de l'emprise d'entrée",
                "description": "Code EPSG de l'emprise d'entrée ouest/sud/est/nord (par défaut 4326)."
              },
              "filter_preset": {
                "label": "Préréglage de filtre",
                "description": "Préréglage de classe d'entités : all, roads, buildings, water, landuse, trails, parks, rail, amenities, boundaries, transit, poi (par défaut all)."
              },
              "include_tags": {
                "label": "Inclure les tags",
                "description": "Liste de clés de tags à filtrer délimitée par des points-virgules, p. ex. amenity;shop."
              },
              "include_key_values": {
                "label": "Inclure les valeurs de clé",
                "description": "Liste de filtres clé=valeur délimitée par des points-virgules, p. ex. amenity=school;building=yes."
              },
              "filter_key": {
                "label": "Clé de filtre",
                "description": "Ancien filtre à clé de tag unique (obsolète ; utilisez include_tags)."
              },
              "filter_key_value": {
                "label": "Valeur de clé de filtre",
                "description": "Ancien filtre clé=valeur unique (obsolète ; utilisez include_key_values)."
              },
              "include_points": {
                "label": "Inclure les points",
                "description": "Inclure les entités de nœuds OSM avec tags en géométries Point (par défaut true)."
              },
              "include_lines": {
                "label": "Inclure les lignes",
                "description": "Inclure les entités de chemins OSM en géométries LineString (par défaut true)."
              },
              "include_polygons": {
                "label": "Inclure les polygones",
                "description": "Inclure les chemins OSM fermés avec tags de surface en géométries Polygon (par défaut true)."
              },
              "clip_to_extent": {
                "label": "Découper selon l'emprise",
                "description": "Découper les géométries de sortie selon l'emprise de la requête (par défaut true)."
              },
              "split_output_by_geometry": {
                "label": "Séparer la sortie par géométrie",
                "description": "Écrire des sorties séparées par type de géométrie (<sortie>_points|lines|polygons.ext)."
              },
              "output_epsg": {
                "label": "EPSG de sortie",
                "description": "Reprojeter la sortie vers ce code EPSG ; omettre pour conserver EPSG:4326."
              },
              "overpass_profile": {
                "label": "Profil Overpass",
                "description": "Profil du point d'accès Overpass : main, kumi, fr ou custom (par défaut main)."
              },
              "overpass_url": {
                "label": "URL Overpass",
                "description": "URL du point d'accès de l'API Overpass (par défaut https://overpass-api.de/api/interpreter)."
              },
              "timeout_seconds": {
                "label": "Délai d'attente (secondes)",
                "description": "Délai d'attente de la requête en secondes (par défaut 25)."
              },
              "max_elements": {
                "label": "Éléments maximaux",
                "description": "Nombre maximal d'éléments Overpass renvoyés avant de lever une erreur (par défaut 50 000)."
              },
              "chunk_large_aoi": {
                "label": "Découper les grandes zones d'intérêt",
                "description": "Diviser automatiquement les grandes zones d'intérêt en plusieurs requêtes Overpass (par défaut true)."
              },
              "chunk_max_area_deg2": {
                "label": "Surface maximale par bloc (deg²)",
                "description": "Surface maximale par bloc en degrés carrés lors du découpage (par défaut 4.0)."
              },
              "max_chunk_count": {
                "label": "Nombre maximal de blocs",
                "description": "Plafond strict du nombre de blocs lors du découpage des grandes zones d'intérêt (par défaut 64)."
              },
              "chunk_parallel_requests": {
                "label": "Requêtes parallèles par bloc",
                "description": "Nombre maximal de requêtes de blocs parallèles pour les grandes zones d'intérêt (par défaut 1 = séquentiel)."
              },
              "cache_dir": {
                "label": "Répertoire de cache",
                "description": "Répertoire optionnel pour mettre en cache les réponses JSON Overpass par hachage point d'accès+requête."
              },
              "cache_ttl_hours": {
                "label": "Durée de vie du cache (heures)",
                "description": "Durée de vie du cache en heures (par défaut 24 ; 0 signifie aucune vérification d'expiration)."
              },
              "provenance_output": {
                "label": "Provenance en sortie",
                "description": "Chemin JSON optionnel pour écrire le fichier annexe de métadonnées de requête/provenance."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel ; s'il est omis, une sortie temporaire est utilisée."
              }
            }
          },
          "assign_projection_lidar": {
            "name": "Affecter une projection au LiDAR",
            "description": "Attribue un système de coordonnées de référence à un nuage de points LiDAR sans reprojeter ses points.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier LiDAR en entrée (LAS/LAZ/COPC, ou référence en mémoire)."
              },
              "epsg": {
                "label": "EPSG",
                "description": "Code EPSG du SCR à affecter, p. ex. 4326 (WGS84) ou 3857 (Web Mercator). Les coordonnées ne sont pas transformées."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin LiDAR de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "assign_projection_raster": {
            "name": "Affecter une projection au raster",
            "description": "Attribue un système de coordonnées de référence à un raster sans déformer ses cellules.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée (ou référence en mémoire)."
              },
              "epsg": {
                "label": "EPSG",
                "description": "Code EPSG du SCR à affecter, p. ex. 4326 (WGS84) ou 3857 (Web Mercator). Les coordonnées ne sont pas transformées."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "assign_projection_vector": {
            "name": "Affecter une projection au vecteur",
            "description": "Attribue un système de coordonnées de référence à une couche vectorielle sans reprojeter ses géométries.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier vectoriel en entrée, format détecté automatiquement (ou référence en mémoire)."
              },
              "epsg": {
                "label": "EPSG",
                "description": "Code EPSG du SCR à affecter, p. ex. 4326 (WGS84) ou 3857 (Web Mercator). Les coordonnées ne sont pas transformées."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel (pilote selon son extension). S'il est omis, stocké en mémoire."
              }
            }
          },
          "georeference_raster_from_control_points": {
            "name": "Géoréférencer un raster à partir de points d'appui",
            "description": "Ajuste une transformation à partir de points d'appui (GCP) et déforme un raster en une sortie géoréférencée.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée."
              },
              "control_points": {
                "label": "Points de contrôle",
                "description": "Chemin du CSV de points de contrôle avec pixel_x,pixel_y,map_x,map_y (et alias acceptés)."
              },
              "epsg": {
                "label": "EPSG",
                "description": "Code EPSG cible."
              },
              "transform_type": {
                "label": "Type de transformation",
                "description": "Type de transformation : affine, projective, polynomial ou thin_plate_spline."
              },
              "transform_order": {
                "label": "Ordre de transformation",
                "description": "Ordre du polynôme lorsque transform_type=polynomial."
              },
              "resample": {
                "label": "Rééchantillonner",
                "description": "Méthode de rééchantillonnage ; par défaut bilinear."
              },
              "allow_auto_downgrade": {
                "label": "Autoriser la rétrogradation automatique",
                "description": "Autoriser la rétrogradation automatique vers une transformation plus simple lorsque les GCP sont peu nombreux."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster géoréférencé en sortie."
              },
              "report": {
                "label": "Rapport",
                "description": "Chemin du rapport JSON en sortie."
              }
            }
          },
          "reproject_lidar": {
            "name": "Reprojeter le LiDAR",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Entrée"
              },
              "dst_epsg": {
                "label": "EPSG de destination",
                "description": "EPSG de destination"
              },
              "output": {
                "label": "Sortie",
                "description": "Sortie"
              },
              "use_3d_transform": {
                "label": "Utiliser une transformation 3D",
                "description": "Utiliser une transformation 3D"
              },
              "failure_policy": {
                "label": "Politique d'échec",
                "description": "Politique d'échec"
              },
              "coordinate_epoch": {
                "label": "Époque des coordonnées",
                "description": "Époque des coordonnées"
              },
              "source_reference_epoch": {
                "label": "Époque de référence source",
                "description": "Époque de référence source"
              },
              "target_reference_epoch": {
                "label": "Époque de référence cible",
                "description": "Époque de référence cible"
              },
              "operation_code": {
                "label": "Code d'opération",
                "description": "Code d'opération"
              },
              "prefer_official_operation": {
                "label": "Préférer l'opération officielle",
                "description": "Préférer l'opération officielle"
              },
              "epoch_policy": {
                "label": "Politique d'époque",
                "description": "Politique d'époque"
              }
            }
          },
          "reproject_raster": {
            "name": "Reprojeter le raster",
            "description": "Reprojette (déforme) un raster dans un système de coordonnées de référence EPSG cible.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée. Doit comporter un SCR source (EPSG ou WKT)."
              },
              "epsg": {
                "label": "EPSG",
                "description": "Code EPSG de destination, p. ex. 3857 (Web Mercator) ou 4326 (WGS84)."
              },
              "method": {
                "label": "Méthode",
                "description": "Méthode de rééchantillonnage : nearest (par défaut), bilinear, cubic, lanczos, average, min, max, mode, median."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "reproject_vector": {
            "name": "Reprojeter le vecteur",
            "description": "Reprojette les géométries vectorielles dans une projection EPSG de destination tout en préservant la topologie et les attributs, permettant l'intégration de sources multiples.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "epsg": {
                "label": "EPSG",
                "description": "Code EPSG de destination."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "orthorectification": {
            "name": "Orthorectification",
            "description": "Correction géométrique d'une imagerie brute fondée sur un MNT à l'aide du modèle de caméra RPC. Supprime le déplacement dû au relief pour produire une ortho-image géoréférencée.",
            "params": {
              "input_raster": {
                "label": "Raster d'entrée",
                "description": "Chemin du raster d'image brute (non corrigée) en entrée. Les métadonnées RPC doivent être intégrées au fichier ou présentes dans un fichier annexe .RPB adjacent."
              },
              "input_dem": {
                "label": "MNT d'entrée",
                "description": "Raster MNT utilisé pour obtenir l'élévation du terrain pour chaque pixel de sortie. Doit couvrir toute l'emprise de la scène. S'il n'est pas en coordonnées géographiques, l'outil le reprojette si nécessaire."
              },
              "output_epsg": {
                "label": "EPSG de sortie",
                "description": "Code EPSG du système de coordonnées de référence de sortie (par défaut 4326 géographique ; spécifiez un SCR projeté comme 32617 pour la zone UTM 17N)."
              },
              "output_resolution": {
                "label": "Résolution de sortie",
                "description": "Résolution des pixels de sortie dans les unités du SCR de sortie (p. ex. degrés pour géographique, mètres pour projeté). Par défaut le GSD approximatif de l'image d'entrée."
              },
              "resample_method": {
                "label": "Méthode de rééchantillonnage",
                "description": "Méthode de rééchantillonnage en sortie : nearest, bilinear (par défaut), cubic."
              },
              "nodata_value": {
                "label": "Valeur NoData",
                "description": "Valeur NoData à affecter aux pixels sans couverture source valide (par défaut identique à l'entrée)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster d'orthoimage en sortie."
              }
            }
          },
          "average_flowpath_slope": {
            "name": "Pente moyenne du chemin d'écoulement",
            "description": "Calcule la pente moyenne des chemins d'écoulement traversant chaque cellule du MNT.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT sans dépressions en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              }
            }
          },
          "average_upslope_flowpath_length": {
            "name": "Longueur moyenne du chemin d'écoulement amont",
            "description": "Calcule la longueur moyenne des chemins d'écoulement amont traversant chaque cellule du MNT.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT sans dépressions en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              }
            }
          },
          "d8_flow_accum": {
            "name": "Accumulation de flux D8",
            "description": "Calcule l'accumulation de flux D8 à partir d'un MNT ou d'un raster de pointeurs D8.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster MNT ou pointeur D8 en entrée"
              },
              "clip": {
                "label": "Découper",
                "description": "Maximum d'affichage écrêté (accepté pour compatibilité)"
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Utiliser l'encodage de pointeur ESRI pour les entrées de pointeurs"
              },
              "input_is_pointer": {
                "label": "L'entrée est un pointeur",
                "description": "Traiter l'entrée comme un raster de pointeurs D8"
              },
              "log_transform": {
                "label": "Transformation logarithmique",
                "description": "Transformation logarithmique de la sortie"
              },
              "out_type": {
                "label": "Type de sortie",
                "description": "Type de sortie : cells, ca ou sca"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "d8_mass_flux": {
            "name": "Flux de masse D8",
            "description": "Effectue une accumulation de flux de masse fondée sur D8 à l'aide de rasters de charge, d'efficacité et d'absorption.",
            "params": {
              "absorption": {
                "label": "Absorption",
                "description": "Raster des pertes de masse par cellule en unités de charge."
              },
              "dem": {
                "label": "MNT",
                "description": "Raster MNT sans dépressions en entrée utilisé pour dériver les directions d'écoulement D8."
              },
              "efficiency": {
                "label": "Efficacité",
                "description": "Raster des valeurs d'efficacité de transfert, soit dans `[0, 1]` soit en pourcentage."
              },
              "loading": {
                "label": "Charge",
                "description": "Raster des valeurs de charge de masse initiale."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              }
            }
          },
          "d8_pointer": {
            "name": "Pointeur D8",
            "description": "Direction d'écoulement selon la plus grande pente parmi 8 voisins (N/NE/E/SE/S/SO/O/NO). Base de l'analyse hydrologique D8 et de la délimitation des bassins versants.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée"
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Utiliser l'encodage de pointeur ESRI"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "dinf_flow_accum": {
            "name": "Accumulation de flux D-infini",
            "description": "Calcule l'accumulation de flux D-Infinity à partir d'un MNT ou d'un raster de pointeurs D-Infinity.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster MNT ou pointeur D-infini en entrée"
              },
              "clip": {
                "label": "Découper",
                "description": "Maximum d'affichage écrêté (accepté pour compatibilité)"
              },
              "convergence_threshold": {
                "label": "Seuil de convergence",
                "description": "Seuil au-dessus duquel l'écoulement n'est pas dispersé"
              },
              "input_is_pointer": {
                "label": "L'entrée est un pointeur",
                "description": "Traiter l'entrée comme un raster de pointeurs D-infini"
              },
              "log_transform": {
                "label": "Transformation logarithmique",
                "description": "Transformation logarithmique de la sortie"
              },
              "out_type": {
                "label": "Type de sortie",
                "description": "Type de sortie : cells, ca ou sca"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "dinf_mass_flux": {
            "name": "Flux de masse D-infini",
            "description": "Effectue une accumulation de flux de masse D-Infinity à l'aide de rasters de charge, d'efficacité et d'absorption.",
            "params": {
              "absorption": {
                "label": "Absorption",
                "description": "Raster d'absorption en entrée en unités de charge."
              },
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée."
              },
              "efficiency": {
                "label": "Efficacité",
                "description": "Raster d'efficacité en entrée (valeurs `0-1` ou en pourcentage)."
              },
              "loading": {
                "label": "Charge",
                "description": "Raster de charge en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              }
            }
          },
          "dinf_pointer": {
            "name": "Pointeur D-infini",
            "description": "Directions d'écoulement continues (0-2π radians) éliminant le biais diagonal de D8. Mieux adapté à la modélisation du transport sédimentaire et des écoulements divergents.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "downslope_flowpath_length": {
            "name": "Longueur du chemin d'écoulement aval",
            "description": "Calcule la longueur du chemin d'écoulement aval de chaque cellule jusqu'à un exutoire dans un raster de pointeurs D8.",
            "params": {
              "d8_pntr": {
                "label": "Pointeur D8",
                "description": "Raster de pointeurs D8 en entrée"
              },
              "watersheds": {
                "label": "Bassins versants",
                "description": "Raster de bassins versants optionnel"
              },
              "weights": {
                "label": "Poids",
                "description": "Raster optionnel de pondération par la distance par cellule"
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Utiliser l'encodage de pointeur ESRI"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "fd8_flow_accum": {
            "name": "Accumulation de flux FD8",
            "description": "Calcule l'accumulation de flux FD8 à partir d'un MNT.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée"
              },
              "clip": {
                "label": "Découper",
                "description": "Maximum d'affichage écrêté (accepté pour compatibilité)"
              },
              "exponent": {
                "label": "Exposant",
                "description": "Exposant de pondération par la pente"
              },
              "log_transform": {
                "label": "Transformation logarithmique",
                "description": "Transformation logarithmique de la sortie"
              },
              "out_type": {
                "label": "Type de sortie",
                "description": "Type de sortie : cells, ca ou sca"
              },
              "threshold": {
                "label": "Seuil",
                "description": "Seuil"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "fd8_pointer": {
            "name": "Pointeur FD8",
            "description": "Écoulement fractionné vers plusieurs voisins en aval, pondéré par le gradient. Meilleur que D8 pour les processus dispersifs et diffusifs et la conservation de la masse.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "flow_accum_full_workflow": {
            "name": "Chaîne complète d'accumulation de flux",
            "description": "Exécute un flux de travail complet d'accumulation de flux non divergent et renvoie le MNT percé, le pointeur de direction d'écoulement et l'accumulation.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée."
              },
              "clip": {
                "label": "Découper",
                "description": "Si vrai, écrête le maximum d'affichage de l'accumulation (comportement de compatibilité)."
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Si vrai, encode la sortie de direction d'écoulement en style de pointeur Esri."
              },
              "log_transform": {
                "label": "Transformation logarithmique",
                "description": "Si vrai, applique une transformation logarithmique aux valeurs d'accumulation."
              },
              "out_type": {
                "label": "Type de sortie",
                "description": "L'un de `\"cells\"`, `\"ca\"`, `\"sca\"` (par défaut)."
              },
              "breached_dem_output": {
                "label": "MNT percé en sortie",
                "description": "Chemin de sortie optionnel pour le raster MNT sans dépressions."
              },
              "flow_dir_output": {
                "label": "Direction d'écoulement en sortie",
                "description": "Chemin de sortie optionnel pour le raster de direction d'écoulement."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel pour le raster d'accumulation d'écoulement."
              },
              "output_pointer": {
                "label": "Pointeur en sortie",
                "description": "Chemin de sortie optionnel pour le pointeur de direction d'écoulement D8 (alias de flow_dir_output ; encodé ESRI lorsque esri_pntr est défini)"
              }
            }
          },
          "flow_length_diff": {
            "name": "Différence de longueur d'écoulement",
            "description": "Calcule les différences absolues maximales locales de longueur du chemin aval à partir d'un raster de pointeurs D8.",
            "params": {
              "d8_pntr": {
                "label": "Pointeur D8",
                "description": "Raster de pointeurs D8 en entrée."
              },
              "weights": {
                "label": "Poids",
                "description": "Poids"
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Si vrai, interprète les valeurs de pointeurs selon l'encodage D8 ESRI."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              }
            }
          },
          "max_upslope_flowpath_length": {
            "name": "Longueur maximale du chemin d'écoulement amont",
            "description": "Calcule la longueur maximale des chemins d'écoulement amont traversant chaque cellule du MNT.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT sans dépressions en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              }
            }
          },
          "max_upslope_value": {
            "name": "Valeur maximale en amont",
            "description": "Propage la valeur amont maximale le long des chemins d'écoulement D8 sur un MNT.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée"
              },
              "values": {
                "label": "Valeurs",
                "description": "Raster de valeurs en entrée"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "mdinf_flow_accum": {
            "name": "Accumulation de flux MD-infini",
            "description": "Accumulation à écoulements multiples avec pondération par le gradient de pente (exposant 1.1). Équilibre le réalisme de la dispersion et l'identification des écoulements principaux concentrés. Sorties : cellules, CA ou SCA.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée."
              },
              "clip": {
                "label": "Découper",
                "description": "Indicateur de compatibilité accepté par l'API."
              },
              "convergence_threshold": {
                "label": "Seuil de convergence",
                "description": "Seuil au-dessus duquel l'écoulement n'est pas dispersé"
              },
              "exponent": {
                "label": "Exposant",
                "description": "Exposant de pondération par la pente (par défaut `1.1`)."
              },
              "log_transform": {
                "label": "Transformation logarithmique",
                "description": "Transformation logarithmique de la sortie"
              },
              "out_type": {
                "label": "Type de sortie",
                "description": "L'un de `\"cells\"`, `\"ca\"`, `\"sca\"` (par défaut)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              }
            }
          },
          "minimal_dispersion_flow_algorithm": {
            "name": "Algorithme d'écoulement à dispersion minimale",
            "description": "Génère des rasters de direction d'écoulement et d'accumulation de flux MDFA à partir d'un MNT.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée"
              },
              "clip": {
                "label": "Découper",
                "description": "Indicateur de compatibilité accepté par l'API."
              },
              "debug_stats": {
                "label": "Statistiques de débogage",
                "description": "Émettre des diagnostics MDFA sur une ligne (comptages et maximum brut)"
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Si vrai, encode la sortie de direction d'écoulement en style de pointeur Esri."
              },
              "log_transform": {
                "label": "Transformation logarithmique",
                "description": "Si vrai, applique une transformation logarithmique aux valeurs d'accumulation."
              },
              "out_type": {
                "label": "Type de sortie",
                "description": "L'un de `\"cells\"`, `\"ca\"`, `\"sca\"` (par défaut)."
              },
              "path_corrected_direction_preference": {
                "label": "Préférence de direction corrigée par le chemin",
                "description": "Paramètre de préférence `p` dans `[0, 1]` ; `1.0` est totalement non dispersif."
              },
              "flow_dir_output": {
                "label": "Direction d'écoulement en sortie",
                "description": "Chemin de sortie optionnel pour le raster de direction d'écoulement."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel pour le raster d'accumulation d'écoulement."
              }
            }
          },
          "num_inflowing_neighbours": {
            "name": "Nombre de voisins entrants",
            "description": "Compte le nombre de voisins D8 affluents pour chaque cellule du MNT.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "qin_flow_accumulation": {
            "name": "Accumulation de flux de Qin",
            "description": "Calcule l'accumulation de flux MFD de Qin à partir d'un MNT.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée."
              },
              "clip": {
                "label": "Découper",
                "description": "Indicateur de compatibilité accepté par l'API."
              },
              "convergence_threshold": {
                "label": "Seuil de convergence",
                "description": "Seuil au-dessus duquel l'écoulement n'est pas dispersé"
              },
              "exponent": {
                "label": "Exposant",
                "description": "Paramètre d'exposant de borne supérieure (par défaut `10.0`)."
              },
              "log_transform": {
                "label": "Transformation logarithmique",
                "description": "Transformation logarithmique de la sortie"
              },
              "max_slope": {
                "label": "Pente maximale",
                "description": "Pente de borne supérieure en degrés utilisée par la fonction d'exposant dynamique (par défaut `45.0`)."
              },
              "out_type": {
                "label": "Type de sortie",
                "description": "L'un de `\"cells\"`, `\"ca\"`, `\"sca\"` (par défaut)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              }
            }
          },
          "quinn_flow_accumulation": {
            "name": "Accumulation de flux de Quinn",
            "description": "Calcule l'accumulation de flux MFD de Quinn à partir d'un MNT.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée."
              },
              "clip": {
                "label": "Découper",
                "description": "Indicateur de compatibilité accepté par l'API."
              },
              "convergence_threshold": {
                "label": "Seuil de convergence",
                "description": "Seuil au-dessus duquel l'écoulement n'est pas dispersé"
              },
              "exponent": {
                "label": "Exposant",
                "description": "Paramètre d'exposant (par défaut `1.1`)."
              },
              "log_transform": {
                "label": "Transformation logarithmique",
                "description": "Transformation logarithmique de la sortie"
              },
              "out_type": {
                "label": "Type de sortie",
                "description": "L'un de `\"cells\"`, `\"ca\"`, `\"sca\"` (par défaut)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              }
            }
          },
          "rho8_flow_accum": {
            "name": "Accumulation de flux Rho8",
            "description": "Calcule l'accumulation de flux Rho8 à partir d'un MNT ou d'un raster de pointeurs Rho8.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "MNT"
              },
              "clip": {
                "label": "Découper",
                "description": "Maximum d'affichage écrêté (accepté pour compatibilité)"
              },
              "log_transform": {
                "label": "Transformation logarithmique",
                "description": "Transformation logarithmique de la sortie"
              },
              "out_type": {
                "label": "Type de sortie",
                "description": "Type de sortie : cells, ca ou sca"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "rho8_pointer": {
            "name": "Pointeur Rho8",
            "description": "Direction d'écoulement unique stochastique pondérée par le gradient de pente. À exécuter plusieurs fois pour une analyse d'ensemble réduisant les artefacts de chenalisation de D8.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "trace_downslope_flowpaths": {
            "name": "Tracer les chemins d'écoulement aval",
            "description": "Marque les chemins d'écoulement D8 issus de points germes jusqu'à l'absence d'écoulement ou le bord de la grille.",
            "params": {
              "d8_pntr": {
                "label": "Pointeur D8",
                "description": "Raster de pointeurs D8 en entrée."
              },
              "seed_points": {
                "label": "Points de départ",
                "description": "Vecteur de points en entrée des emplacements de départ."
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Si vrai, interprète les pointeurs D8 avec l'encodage ESRI."
              },
              "zero_background": {
                "label": "Fond à zéro",
                "description": "Si vrai, le fond est `0` ; sinon le fond est NoData."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              }
            }
          },
          "breach_depressions_least_cost": {
            "name": "Percer les dépressions au moindre coût",
            "description": "Perce les dépressions d'un MNT à l'aide d'une recherche de chemin de moindre coût sous contraintes.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée."
              },
              "fill_deps": {
                "label": "Remplir les dépressions",
                "description": "Si vrai, remplit les dépressions non résolues après percement."
              },
              "flat_increment": {
                "label": "Incrément des zones plates",
                "description": "Incrément de décrément monotone optionnel."
              },
              "max_cost": {
                "label": "Coût maximal",
                "description": "Coût de percement maximal autorisé."
              },
              "max_dist": {
                "label": "Distance maximale",
                "description": "Distance de recherche maximale en cellules."
              },
              "minimize_dist": {
                "label": "Minimiser la distance",
                "description": "Si vrai, pondère les coûts de percement par la distance."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel."
              }
            }
          },
          "breach_single_cell_pits": {
            "name": "Percer les cuvettes d'une cellule",
            "description": "Perce les cuvettes d'une cellule d'un MNT en creusant des chenaux d'une cellule.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est renvoyé en mémoire lorsque c'est pris en charge."
              }
            }
          },
          "burn_streams": {
            "name": "Graver les cours d'eau",
            "description": "Grave un réseau hydrographique dans un MNT en abaissant l'altitude des cellules de cours d'eau.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée."
              },
              "streams": {
                "label": "Cours d'eau",
                "description": "Vecteur de cours d'eau en entrée."
              },
              "decrement_value": {
                "label": "Valeur de décrément",
                "description": "Décrément d'élévation appliqué aux cellules de cours d'eau (par défaut 5.0)."
              },
              "gradient_distance": {
                "label": "Distance de gradient",
                "description": "Distance de gradient en cellules de grille (0 = décrément plat uniquement ; par défaut 5)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du MNT incrusté en sortie."
              }
            }
          },
          "burn_streams_at_roads": {
            "name": "Graver les cours d'eau aux routes",
            "description": "Abaisse l'altitude des cours d'eau près des croisements cours d'eau-route pour percer les remblais routiers dans un MNT.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée."
              },
              "roads": {
                "label": "Routes",
                "description": "Couche vectorielle de routes."
              },
              "streams": {
                "label": "Cours d'eau",
                "description": "Couche vectorielle de cours d'eau."
              },
              "method": {
                "label": "Méthode",
                "description": "Méthode"
              },
              "road_width": {
                "label": "Largeur de route",
                "description": "Largeur maximale de remblai en unités carte utilisée pour définir la portée d'incrustation le long du cours d'eau."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              }
            }
          },
          "depth_in_sink": {
            "name": "Profondeur dans la cuvette",
            "description": "Mesure la profondeur de chaque cellule du MNT sous une surface aux dépressions comblées.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée."
              },
              "zero_background": {
                "label": "Fond à zéro",
                "description": "Si vrai, affecte `0.0` aux cellules hors dépressions ; sinon affecte NoData."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "fill_burn": {
            "name": "Remplir et graver",
            "description": "Applique un conditionnement hydrologique à un MNT en gravant les cours d'eau puis en remplissant les dépressions.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée."
              },
              "streams": {
                "label": "Cours d'eau",
                "description": "Couche vectorielle de cours d'eau en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              }
            }
          },
          "fill_depressions": {
            "name": "Remplir les dépressions",
            "description": "Remplit les dépressions d'un MNT selon une stratégie priority-flood avec, par défaut, la résolution des zones plates de Garbrecht-Martz et, en option, l'ancienne résolution des zones plates par chemin naturel.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée."
              },
              "fix_flats": {
                "label": "Corriger les zones plates",
                "description": "Si vrai, impose un léger gradient sur les zones plates remplies."
              },
              "flat_increment": {
                "label": "Incrément des zones plates",
                "description": "Incrément des zones plates (par défaut `0.0001`)."
              },
              "flat_resolution": {
                "label": "Résolution des zones plates",
                "description": "Mode de résolution des zones plates. L'un de `\"garbrecht_martz\"` ou `\"natural\"`."
              },
              "max_depth": {
                "label": "Profondeur maximale",
                "description": "Profondeur de remplissage maximale autorisée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel."
              }
            }
          },
          "fill_depressions_planchon_and_darboux": {
            "name": "Remplir les dépressions (Planchon et Darboux)",
            "description": "Remplit les dépressions d'un MNT avec une interface compatible Planchon-Darboux.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée."
              },
              "fix_flats": {
                "label": "Corriger les zones plates",
                "description": "Si vrai, impose un léger gradient sur les zones plates remplies."
              },
              "flat_increment": {
                "label": "Incrément des zones plates",
                "description": "Incrément des zones plates (par défaut `0.0001`)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel."
              }
            }
          },
          "fill_depressions_wang_and_liu": {
            "name": "Remplir les dépressions (Wang et Liu)",
            "description": "Remplit les dépressions d'un MNT avec une interface compatible Wang-Liu.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée."
              },
              "fix_flats": {
                "label": "Corriger les zones plates",
                "description": "Si vrai, impose un léger gradient sur les zones plates remplies."
              },
              "flat_increment": {
                "label": "Incrément des zones plates",
                "description": "Incrément des zones plates (par défaut `0.0001`)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel."
              }
            }
          },
          "fill_pits": {
            "name": "Remplir les cuvettes",
            "description": "Remplit les cuvettes d'une cellule d'un MNT.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est renvoyé en mémoire lorsque c'est pris en charge."
              }
            }
          },
          "flatten_lakes": {
            "name": "Aplanir les lacs",
            "description": "Aplanit l'altitude des lacs à l'aide de l'altitude minimale du périmètre de chaque polygone.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée."
              },
              "lakes": {
                "label": "Lacs",
                "description": "Vecteur de polygones en entrée des entités lacustres."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              }
            }
          },
          "impoundment_size_index": {
            "name": "Indice de taille de retenue",
            "description": "Calcule des métriques de retenue : profondeur moyenne/maximale, volume, surface et hauteur du barrage.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée."
              },
              "max_dam_length": {
                "label": "Longueur maximale de barrage",
                "description": "Longueur maximale de barrage en unités carte."
              },
              "output_area": {
                "label": "Surface en sortie",
                "description": "Inclure le raster de surface inondée dans le tuple de sortie."
              },
              "output_height": {
                "label": "Hauteur en sortie",
                "description": "Inclure le raster de hauteur de barrage dans le tuple de sortie."
              },
              "output_max": {
                "label": "Maximum en sortie",
                "description": "Inclure le raster de profondeur d'inondation maximale dans le tuple de sortie."
              },
              "output_mean": {
                "label": "Moyenne en sortie",
                "description": "Inclure le raster de profondeur d'inondation moyenne dans le tuple de sortie."
              },
              "output_volume": {
                "label": "Volume en sortie",
                "description": "Inclure le raster de volume inondé dans le tuple de sortie."
              },
              "out_area": {
                "label": "Surface en sortie",
                "description": "Chemin de sortie optionnel pour le raster de surface"
              },
              "out_dam_height": {
                "label": "Hauteur de barrage en sortie",
                "description": "Chemin de sortie optionnel pour le raster de hauteur de barrage"
              },
              "out_max": {
                "label": "Maximum en sortie",
                "description": "Chemin de sortie optionnel pour le raster de profondeur maximale"
              },
              "out_mean": {
                "label": "Moyenne en sortie",
                "description": "Chemin de sortie optionnel pour le raster de profondeur moyenne"
              },
              "out_volume": {
                "label": "Volume en sortie",
                "description": "Chemin de sortie optionnel pour le raster de volume"
              }
            }
          },
          "insert_dams": {
            "name": "Insérer des barrages",
            "description": "Ajoute des remblais de barrage locaux aux points spécifiés à l'aide d'une sélection de la crête fondée sur des profils.",
            "params": {
              "dam_points": {
                "label": "Points de barrage",
                "description": "Vecteur de points en entrée des emplacements de barrages."
              },
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée."
              },
              "dam_length": {
                "label": "Longueur de barrage",
                "description": "Longueur maximale de barrage en unités carte."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              }
            }
          },
          "raise_walls": {
            "name": "Élever des murs",
            "description": "Rehausse l'altitude du MNT le long de vecteurs de murs et perce éventuellement certains croisements.",
            "params": {
              "breach_lines": {
                "label": "Lignes de percement",
                "description": "Vecteur optionnel définissant les emplacements de percement."
              },
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée."
              },
              "walls": {
                "label": "Murs",
                "description": "Vecteur de lignes ou de polygones en entrée définissant les segments de murs."
              },
              "wall_height": {
                "label": "Hauteur de mur",
                "description": "Incrément d'élévation appliqué aux cellules de murs."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              }
            }
          },
          "sink": {
            "name": "Cuvette",
            "description": "Identifie les cellules appartenant à des dépressions topographiques d'un MNT.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée."
              },
              "zero_background": {
                "label": "Fond à zéro",
                "description": "Si vrai, affecte `0.0` aux cellules hors dépressions ; sinon affecte NoData."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "stochastic_depression_analysis": {
            "name": "Analyse stochastique des dépressions",
            "description": "Exécute des perturbations de Monte Carlo du MNT et estime la probabilité d'appartenance aux dépressions.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée."
              },
              "iterations": {
                "label": "Itérations",
                "description": "Nombre d'itérations Monte-Carlo."
              },
              "range": {
                "label": "Plage",
                "description": "Portée d'autocorrélation de l'erreur en unités carte."
              },
              "rmse": {
                "label": "RMSE",
                "description": "RMSE d'élévation utilisée pour la perturbation gaussienne."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              }
            }
          },
          "topological_breach_burn": {
            "name": "Gravure topologique des brèches",
            "description": "Grave les cours d'eau dans un MNT, conditionne la surface et renvoie les rasters de cours d'eau, de MNT, de pointeurs et d'accumulation.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée."
              },
              "streams": {
                "label": "Cours d'eau",
                "description": "Vecteur du réseau de cours d'eau en entrée."
              },
              "snap_distance": {
                "label": "Distance d'accrochage",
                "description": "Distance d'accrochage optionnelle des cours d'eau utilisée dans la mise à l'échelle de la profondeur d'incrustation."
              },
              "out_dem": {
                "label": "MNT en sortie",
                "description": "Chemin de sortie optionnel pour le MNT incrusté/conditionné."
              },
              "out_dir": {
                "label": "Direction en sortie",
                "description": "Chemin de sortie optionnel pour le raster de pointeurs D8."
              },
              "out_fa": {
                "label": "Accumulation en sortie",
                "description": "Chemin de sortie optionnel pour le raster d'accumulation d'écoulement."
              },
              "out_streams": {
                "label": "Cours d'eau en sortie",
                "description": "Chemin de sortie optionnel pour les cours d'eau rasterisés."
              }
            }
          },
          "upslope_depression_storage": {
            "name": "Stockage dans les dépressions amont",
            "description": "Cartographie la profondeur moyenne amont du stockage en dépressions en routant la profondeur des dépressions sur un MNT conditionné.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              }
            }
          },
          "basins": {
            "name": "Bassins",
            "description": "Délimite tous les bassins de drainage D8 qui s'écoulent vers les bords des données valides.",
            "params": {
              "d8_pntr": {
                "label": "Pointeur D8",
                "description": "Raster de pointeurs D8 en entrée."
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Si vrai, interprète les valeurs de pointeurs selon l'encodage D8 ESRI."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              }
            }
          },
          "flood_order": {
            "name": "Ordre d'inondation",
            "description": "Produit l'ordre séquentiel priority-flood de chaque cellule du MNT.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              }
            }
          },
          "hillslopes": {
            "name": "Versants",
            "description": "Identifie les versants qui s'écoulent vers chaque tronçon de cours d'eau, en séparant les zones de rive gauche et de rive droite.",
            "params": {
              "d8_pntr": {
                "label": "Pointeur D8",
                "description": "Raster de pointeurs D8."
              },
              "streams": {
                "label": "Cours d'eau",
                "description": "Raster du réseau de cours d'eau où les cellules de cours d'eau ont une valeur > 0 et ne sont pas NoData."
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Indicateur d'encodage de pointeur ESRI."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "isobasins": {
            "name": "Isobassins",
            "description": "Divise un paysage en bassins versants de taille approximativement égale (isobassins) selon un seuil de surface cible.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT hydrologiquement conditionné en entrée."
              },
              "target_size": {
                "label": "Taille cible",
                "description": "Surface cible des isobassins en nombre de cellules de grille (entier ou flottant positif)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              }
            }
          },
          "jenson_snap_pour_points": {
            "name": "Accrocher les exutoires (Jenson)",
            "description": "Accroche chaque exutoire à la cellule de cours d'eau la plus proche dans une distance de recherche, en préservant tous les attributs en entrée.",
            "params": {
              "pour_pts": {
                "label": "Points d'exutoire",
                "description": "Fichier vectoriel en entrée des points d'exutoire (géométries point ou multipoint)."
              },
              "streams": {
                "label": "Cours d'eau",
                "description": "Raster du réseau de cours d'eau en entrée où les cellules de cours d'eau ont une valeur > 0 et ne sont pas NoData."
              },
              "snap_dist": {
                "label": "Distance d'accrochage",
                "description": "Rayon de recherche maximal en unités carte. Par défaut une largeur de cellule s'il est omis ou nul."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie du fichier vectoriel des points d'exutoire accrochés (requis ; par défaut `snapped_pour_points.geojson` dans le répertoire de travail s'il n'est pas fourni à l'enveloppe)."
              }
            }
          },
          "longest_flowpath": {
            "name": "Chemin d'écoulement le plus long",
            "description": "Délimite les lignes du plus long chemin d'écoulement de chaque bassin d'un raster de bassins.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée"
              },
              "basins": {
                "label": "Bassins",
                "description": "Raster de bassins en entrée"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie"
              }
            }
          },
          "max_branch_length": {
            "name": "Longueur maximale de branche",
            "description": "Calcule la longueur maximale de branche entre chemins d'écoulement D8 voisins, utile pour mettre en évidence les lignes de partage des eaux.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "log_transform": {
                "label": "Transformation logarithmique",
                "description": "Appliquer une transformation logarithmique naturelle aux sorties positives."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel."
              }
            }
          },
          "snap_pour_points": {
            "name": "Accrocher les exutoires",
            "description": "Accroche les exutoires à la cellule d'accumulation de flux la plus élevée dans une distance de recherche.",
            "params": {
              "flow_accum": {
                "label": "Accumulation d'écoulement",
                "description": "Raster d'accumulation d'écoulement en entrée."
              },
              "pour_pts": {
                "label": "Points d'exutoire",
                "description": "Fichier vectoriel en entrée des points d'exutoire (géométries point ou multipoint)."
              },
              "snap_dist": {
                "label": "Distance d'accrochage",
                "description": "Rayon de recherche maximal en unités carte. Par défaut une largeur de cellule s'il est omis ou nul."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie du fichier vectoriel des points d'exutoire accrochés (requis ; par défaut `snapped_pour_points.geojson` dans le répertoire de travail s'il n'est pas fourni à l'enveloppe)."
              }
            }
          },
          "subbasins": {
            "name": "Sous-bassins",
            "description": "Identifie le bassin d'alimentation de chaque tronçon de cours d'eau (sous-bassins) dans un réseau hydrographique D8.",
            "params": {
              "d8_pntr": {
                "label": "Pointeur D8",
                "description": "Raster de pointeurs D8 produit par `d8_pointer`."
              },
              "streams": {
                "label": "Cours d'eau",
                "description": "Raster du réseau de cours d'eau où les cellules de cours d'eau ont une valeur > 0 et ne sont pas NoData."
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Si vrai, interprète les valeurs de pointeurs selon l'encodage ESRI. Par défaut `False`."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              }
            }
          },
          "unnest_basins": {
            "name": "Désimbriquer les bassins",
            "description": "Crée un raster de bassins par niveau d'emboîtement des exutoires à partir d'une grille de pointeurs D8.",
            "params": {
              "d8_pntr": {
                "label": "Pointeur D8",
                "description": "Raster de pointeurs D8 en entrée"
              },
              "pour_points": {
                "label": "Points d'exutoire",
                "description": "Vecteur de points d'exutoire en entrée"
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Interpréter les pointeurs en style ESRI"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie de base optionnel pour les rasters numérotés"
              }
            }
          },
          "watershed": {
            "name": "Bassin versant",
            "description": "Délimite les bassins versants à partir d'un pointeur D8 et d'exutoires vectoriels.",
            "params": {
              "d8_pntr": {
                "label": "Pointeur D8",
                "description": "Raster de pointeurs D8 en entrée."
              },
              "pour_pts": {
                "label": "Points d'exutoire",
                "description": "Fichier vectoriel en entrée des points d'exutoire (géométries point ou multipoint)."
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Si vrai, interprète les valeurs de pointeurs selon l'encodage D8 ESRI."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              }
            }
          },
          "watershed_from_raster_pour_points": {
            "name": "Bassin versant depuis des exutoires raster",
            "description": "Délimite les bassins versants à partir d'un pointeur D8 et d'un raster d'identifiants d'exutoires.",
            "params": {
              "d8_pntr": {
                "label": "Pointeur D8",
                "description": "Raster de pointeurs D8 en entrée."
              },
              "pour_points": {
                "label": "Points d'exutoire",
                "description": "Raster de points d'exutoire ; les valeurs de cellules non nulles et non NoData deviennent des identifiants d'exutoires."
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Si vrai, interprète les valeurs de pointeurs selon l'encodage D8 ESRI."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              }
            }
          },
          "depth_to_water": {
            "name": "Profondeur jusqu'à l'eau",
            "description": "Calcule la profondeur cartographique jusqu'à l'eau (depth-to-water) par accumulation de moindre coût à partir d'entités source de cours d'eau/lacs.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée."
              },
              "stream_raster": {
                "label": "Raster de cours d'eau",
                "description": "Raster de cours d'eau"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              }
            }
          },
          "distance_to_outlet": {
            "name": "Distance à l'exutoire",
            "description": "Calcule la distance aval jusqu'à l'exutoire pour chaque cellule de cours d'eau.",
            "params": {
              "d8_pntr": {
                "label": "Pointeur D8",
                "description": "Raster de pointeurs d'écoulement D8"
              },
              "streams": {
                "label": "Cours d'eau",
                "description": "Cours d'eau"
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Pointeur ESRI"
              },
              "zero_background": {
                "label": "Fond à zéro",
                "description": "Fond à zéro"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "downslope_distance_to_stream": {
            "name": "Distance aval jusqu'au cours d'eau",
            "description": "Calcule la distance aval de chaque cellule du MNT jusqu'au cours d'eau le plus proche le long des chemins d'écoulement.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT sans dépressions en entrée."
              },
              "streams": {
                "label": "Cours d'eau",
                "description": "Raster de cours d'eau en entrée ; les cellules de cours d'eau sont les valeurs `> 0` et non NoData."
              },
              "dinf": {
                "label": "D-infini",
                "description": "Si vrai, utilise le routage D-infini ; sinon utilise le routage D8."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              }
            }
          },
          "downslope_index": {
            "name": "Indice aval",
            "description": "Calcule l'indice aval de Hjerdt et al. (2004) à l'aide des directions d'écoulement D8.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "output_type": {
                "label": "Type de sortie",
                "description": "Métrique de sortie : tangent, degrees, radians, distance (par défaut tangent)."
              },
              "vertical_drop": {
                "label": "Dénivelé",
                "description": "Seuil de dénivelé d pour la traversée vers l'aval."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel."
              }
            }
          },
          "edge_contamination": {
            "name": "Contamination des bords",
            "description": "Identifie les cellules du MNT dont l'aire amont s'étend au-delà du bord du MNT pour les schémas courants de routage des écoulements.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT sans dépressions en entrée."
              },
              "flow_type": {
                "label": "Type d'écoulement",
                "description": "Méthode de routage à utiliser : l'une de `\"d8\"`, `\"mfd\"`/`\"fd8\"` ou `\"dinf\"`."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur d'échelle vertical optionnel. Les valeurs `<= 0` sont traitées comme `1.0`."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              }
            }
          },
          "elev_relative_to_watershed_min_max": {
            "name": "Altitude relative au min-max du bassin",
            "description": "Calcule la position altimétrique relative d'une cellule du MNT au sein de chaque bassin versant, en pourcentage.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "watersheds": {
                "label": "Bassins versants",
                "description": "Chemin du raster d'identifiants de bassins versants ou objet raster typé."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat reste en mémoire."
              }
            }
          },
          "elevation_above_stream": {
            "name": "Hauteur au-dessus du cours d'eau",
            "description": "Calcule l'altitude au-dessus du cours d'eau le plus proche, mesurée le long des chemins d'écoulement aval.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT sans dépressions en entrée."
              },
              "streams": {
                "label": "Cours d'eau",
                "description": "Raster de cours d'eau en entrée ; les cellules de cours d'eau sont les valeurs `> 0` et non NoData."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              }
            }
          },
          "elevation_above_stream_euclidean": {
            "name": "Hauteur au-dessus du cours d'eau (euclidienne)",
            "description": "Calcule l'altitude au-dessus du cours d'eau le plus proche à l'aide de la proximité en ligne droite (euclidienne).",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée."
              },
              "streams": {
                "label": "Cours d'eau",
                "description": "Raster de cours d'eau en entrée ; les cellules de cours d'eau sont les valeurs `> 0` et non NoData."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              }
            }
          },
          "find_noflow_cells": {
            "name": "Trouver les cellules sans écoulement",
            "description": "Trouve les cellules du MNT qui n'ont aucun voisin D8 plus bas.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée."
              },
              "interior_only": {
                "label": "Intérieur uniquement",
                "description": "Si vrai, ne signale que les véritables cellules intérieures sans écoulement (hors exutoires en bordure du raster et adjacents à NoData)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              }
            }
          },
          "find_parallel_flow": {
            "name": "Trouver les écoulements parallèles",
            "description": "Identifie les cellules de cours d'eau présentant des directions d'écoulement D8 parallèles.",
            "params": {
              "d8_pntr": {
                "label": "Pointeur D8",
                "description": "Raster de pointeurs D8 en entrée."
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Pointeur ESRI"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              }
            }
          },
          "hydrologic_connectivity": {
            "name": "Connectivité hydrologique",
            "description": "Calcule les indices de connectivité DUL et UDSA à partir d'un MNT.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée."
              },
              "convergence_threshold": {
                "label": "Seuil de convergence",
                "description": "Seuil optionnel d'initiation des cours d'eau en cellules contributives."
              },
              "exponent": {
                "label": "Exposant",
                "description": "Paramètre de compatibilité pour le contrôle de la dispersion."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur d'échelle vertical optionnel."
              },
              "output1": {
                "label": "Sortie 1",
                "description": "Chemin de sortie optionnel pour le raster DUL."
              },
              "output2": {
                "label": "Sortie 2",
                "description": "Chemin de sortie optionnel pour le raster UDSA."
              }
            }
          },
          "relative_stream_power_index": {
            "name": "Indice de puissance relative du cours d'eau",
            "description": "Calcule l'indice relatif de puissance du courant à partir de l'aire contributive spécifique et de la pente.",
            "params": {
              "sca": {
                "label": "SCA",
                "description": "Chemin du raster de surface de captage spécifique ou objet raster typé."
              },
              "slope": {
                "label": "Pente",
                "description": "Raster de pente en degrés."
              },
              "exponent": {
                "label": "Exposant",
                "description": "Exposant p de la surface de captage spécifique (par défaut 1.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat reste en mémoire."
              }
            }
          },
          "sediment_transport_index": {
            "name": "Indice de transport sédimentaire",
            "description": "Calcule l'indice de transport sédimentaire (facteur LS) à partir de l'aire contributive spécifique et de la pente.",
            "params": {
              "sca": {
                "label": "SCA",
                "description": "Chemin du raster de surface de captage spécifique ou objet raster typé."
              },
              "slope": {
                "label": "Pente",
                "description": "Raster de pente en degrés."
              },
              "sca_exponent": {
                "label": "Exposant SCA",
                "description": "Exposant n de la surface de captage spécifique (par défaut 0.4)."
              },
              "slope_exponent": {
                "label": "Exposant de pente",
                "description": "Exposant de pente m (par défaut 1.3)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat reste en mémoire."
              }
            }
          },
          "wetness_index": {
            "name": "Indice d'humidité",
            "description": "Calcule l'indice topographique d'humidité ln(SCA / tan(slope)).",
            "params": {
              "sca": {
                "label": "SCA",
                "description": "Chemin du raster de surface de captage spécifique ou objet raster typé."
              },
              "slope": {
                "label": "Pente",
                "description": "Raster de pente en degrés."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "extract_streams": {
            "name": "Extraire les cours d'eau",
            "description": "Extrait les cours d'eau selon un seuil d'accumulation de flux.",
            "params": {
              "flow_accumulation": {
                "label": "Accumulation d'écoulement",
                "description": "Raster d'accumulation d'écoulement en entrée."
              },
              "threshold": {
                "label": "Seuil",
                "description": "Valeur d'accumulation minimale requise pour faire partie d'un chenal."
              },
              "zero_background": {
                "label": "Fond à zéro",
                "description": "Si vrai, le fond hors cours d'eau est 0 au lieu de NoData."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin optionnel du raster de cours d'eau en sortie."
              }
            }
          },
          "extract_valleys": {
            "name": "Extraire les vallées",
            "description": "Extrait les vallées d'un MNT.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "MNT"
              },
              "filter_size": {
                "label": "Taille du filtre",
                "description": "Taille du filtre"
              },
              "line_thin": {
                "label": "Amincissement des lignes",
                "description": "Amincissement des lignes"
              },
              "variant": {
                "label": "Variante",
                "description": "Variante"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "prune_vector_streams": {
            "name": "Élaguer les cours d'eau vectoriels",
            "description": "Élague un réseau hydrographique vectoriel selon la magnitude de Shreve.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée utilisé pour déterminer la direction d'écoulement"
              },
              "streams": {
                "label": "Cours d'eau",
                "description": "Réseau de cours d'eau vectoriel en entrée"
              },
              "max_ridge_cutting_height": {
                "label": "Hauteur maximale de coupe de crête",
                "description": "Élévation maximale autorisée lors de la connexion des tronçons aval"
              },
              "snap_distance": {
                "label": "Distance d'accrochage",
                "description": "Distance d'accrochage maximale pour la connectivité des extrémités"
              },
              "threshold": {
                "label": "Seuil",
                "description": "Magnitude de Shreve minimale à conserver"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie"
              }
            }
          },
          "raster_streams_to_vector": {
            "name": "Cours d'eau raster vers vecteur",
            "description": "Convertit un réseau hydrographique raster en vecteur.",
            "params": {
              "d8_pntr": {
                "label": "Pointeur D8",
                "description": "Raster de pointeurs d'écoulement D8"
              },
              "streams_raster": {
                "label": "Raster de cours d'eau",
                "description": "Raster de cours d'eau"
              },
              "all_vertices": {
                "label": "Tous les sommets",
                "description": "Tous les sommets"
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Pointeur ESRI"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "rasterize_streams": {
            "name": "Rastériser les cours d'eau",
            "description": "Rastérise un réseau hydrographique vectoriel.",
            "params": {
              "input_vector": {
                "label": "Vecteur d'entrée",
                "description": "Vecteur d'entrée"
              },
              "reference_raster": {
                "label": "Raster de référence",
                "description": "Raster de référence"
              },
              "use_feature_id": {
                "label": "Utiliser l'identifiant d'entité",
                "description": "Utiliser l'identifiant d'entité"
              },
              "zero_background": {
                "label": "Fond à zéro",
                "description": "Fond à zéro"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "remove_short_streams": {
            "name": "Supprimer les cours d'eau courts",
            "description": "Supprime les tronçons de cours d'eau plus courts qu'une longueur minimale.",
            "params": {
              "d8_pntr": {
                "label": "Pointeur D8",
                "description": "Raster de pointeurs d'écoulement D8"
              },
              "streams": {
                "label": "Cours d'eau",
                "description": "Cours d'eau"
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Pointeur ESRI"
              },
              "min_length": {
                "label": "Longueur minimale",
                "description": "Longueur minimale"
              },
              "zero_background": {
                "label": "Fond à zéro",
                "description": "Fond à zéro"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "repair_stream_vector_topology": {
            "name": "Réparer la topologie vectorielle des cours d'eau",
            "description": "Répare la topologie d'un réseau hydrographique vectoriel.",
            "params": {
              "input_vector": {
                "label": "Vecteur d'entrée",
                "description": "Vecteur d'entrée"
              },
              "snap": {
                "label": "Accrocher",
                "description": "Accrocher"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "river_centerlines": {
            "name": "Axes de rivière",
            "description": "Extrait les axes centraux des rivières à partir d'un raster d'eau à l'aide de l'axe médian.",
            "params": {
              "raster": {
                "label": "Raster",
                "description": "Raster binaire eau/non-eau"
              },
              "min_length": {
                "label": "Longueur minimale",
                "description": "Longueur minimale des lignes centrales en cellules raster"
              },
              "search_radius": {
                "label": "Rayon de recherche",
                "description": "Rayon de recherche (cellules) utilisé pour connecter les extrémités proches"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de lignes centrales en sortie"
              }
            }
          },
          "farthest_channel_head": {
            "name": "Tête de chenal la plus éloignée",
            "description": "Calcule la distance jusqu'à la tête de chenal la plus éloignée.",
            "params": {
              "d8_pntr": {
                "label": "Pointeur D8",
                "description": "Raster de pointeurs d'écoulement D8"
              },
              "streams": {
                "label": "Cours d'eau",
                "description": "Cours d'eau"
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Pointeur ESRI"
              },
              "zero_background": {
                "label": "Fond à zéro",
                "description": "Fond à zéro"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "find_main_stem": {
            "name": "Trouver le cours principal",
            "description": "Identifie le cours principal du réseau hydrographique.",
            "params": {
              "d8_pntr": {
                "label": "Pointeur D8",
                "description": "Raster de pointeurs d'écoulement D8"
              },
              "streams": {
                "label": "Cours d'eau",
                "description": "Cours d'eau"
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Pointeur ESRI"
              },
              "zero_background": {
                "label": "Fond à zéro",
                "description": "Fond à zéro"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "length_of_upstream_channels": {
            "name": "Longueur des chenaux amont",
            "description": "Calcule la longueur totale des chenaux en amont.",
            "params": {
              "d8_pntr": {
                "label": "Pointeur D8",
                "description": "Raster de pointeurs d'écoulement D8"
              },
              "streams": {
                "label": "Cours d'eau",
                "description": "Cours d'eau"
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Pointeur ESRI"
              },
              "zero_background": {
                "label": "Fond à zéro",
                "description": "Fond à zéro"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "long_profile": {
            "name": "Profil en long",
            "description": "Crée un profil longitudinal de cours d'eau.",
            "params": {
              "d8_pntr": {
                "label": "Pointeur D8",
                "description": "Raster de pointeurs d'écoulement D8"
              },
              "dem": {
                "label": "MNT",
                "description": "MNT"
              },
              "streams_raster": {
                "label": "Raster de cours d'eau",
                "description": "Raster de cours d'eau"
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Pointeur ESRI"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "long_profile_from_points": {
            "name": "Profil en long depuis des points",
            "description": "Crée un profil en long à partir de points vectoriels.",
            "params": {
              "d8_pntr": {
                "label": "Pointeur D8",
                "description": "Raster de pointeurs d'écoulement D8"
              },
              "dem": {
                "label": "MNT",
                "description": "MNT"
              },
              "points": {
                "label": "Points",
                "description": "Points"
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Pointeur ESRI"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "hack_stream_order": {
            "name": "Ordre de Hack",
            "description": "Attribue l'ordre de Hack aux cellules de cours d'eau.",
            "params": {
              "d8_pntr": {
                "label": "Pointeur D8",
                "description": "Raster de pointeurs d'écoulement D8"
              },
              "streams": {
                "label": "Cours d'eau",
                "description": "Raster de cours d'eau"
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Utiliser un pointeur de style ESRI"
              },
              "zero_background": {
                "label": "Fond à zéro",
                "description": "Affecter zéro au fond"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "horton_ratios": {
            "name": "Rapports de Horton",
            "description": "Calcule les rapports de Horton de bifurcation, de longueur, de surface drainée et de pente.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée."
              },
              "streams_raster": {
                "label": "Raster de cours d'eau",
                "description": "Raster binaire de cours d'eau (positif = cours d'eau)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du rapport texte en sortie (optionnel)."
              }
            }
          },
          "horton_stream_order": {
            "name": "Ordre de Horton",
            "description": "Attribue l'ordre de Horton aux cellules de cours d'eau.",
            "params": {
              "d8_pntr": {
                "label": "Pointeur D8",
                "description": "Raster de pointeurs d'écoulement D8"
              },
              "streams": {
                "label": "Cours d'eau",
                "description": "Raster de cours d'eau"
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Utiliser un pointeur de style ESRI"
              },
              "zero_background": {
                "label": "Fond à zéro",
                "description": "Affecter zéro au fond"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "shreve_stream_magnitude": {
            "name": "Magnitude de Shreve",
            "description": "Calcule la magnitude de Shreve des cours d'eau.",
            "params": {
              "d8_pntr": {
                "label": "Pointeur D8",
                "description": "Raster de pointeurs d'écoulement D8"
              },
              "streams": {
                "label": "Cours d'eau",
                "description": "Raster de cours d'eau"
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Utiliser un pointeur de style ESRI"
              },
              "zero_background": {
                "label": "Fond à zéro",
                "description": "Affecter zéro au fond"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "strahler_order_basins": {
            "name": "Bassins par ordre de Strahler",
            "description": "Délimite les bassins versants étiquetés selon l'ordre de Horton-Strahler de leur tronçon de cours d'eau exutoire.",
            "params": {
              "d8_pntr": {
                "label": "Pointeur D8",
                "description": "Raster de pointeurs D8."
              },
              "streams": {
                "label": "Cours d'eau",
                "description": "Raster du réseau de cours d'eau où les cellules de cours d'eau ont une valeur > 0 et ne sont pas NoData."
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Indicateur d'encodage de pointeur ESRI."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "strahler_stream_order": {
            "name": "Ordre de Strahler",
            "description": "Attribue l'ordre de Strahler aux cellules de cours d'eau.",
            "params": {
              "d8_pntr": {
                "label": "Pointeur D8",
                "description": "Raster de pointeurs d'écoulement D8"
              },
              "streams": {
                "label": "Cours d'eau",
                "description": "Raster de cours d'eau (valeurs positives = cellules de cours d'eau)"
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Utiliser des valeurs de pointeurs de style ESRI (par défaut : Whitebox)"
              },
              "zero_background": {
                "label": "Fond à zéro",
                "description": "Affecter zéro au fond au lieu de NoData"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "stream_link_class": {
            "name": "Classe de tronçon",
            "description": "Classe les tronçons de cours d'eau comme intérieurs, extérieurs ou sources.",
            "params": {
              "d8_pntr": {
                "label": "Pointeur D8",
                "description": "Raster de pointeurs d'écoulement D8"
              },
              "streams": {
                "label": "Cours d'eau",
                "description": "Cours d'eau"
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Pointeur ESRI"
              },
              "zero_background": {
                "label": "Fond à zéro",
                "description": "Fond à zéro"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "stream_link_identifier": {
            "name": "Identifiant de tronçon",
            "description": "Attribue un identifiant unique à chaque tronçon de cours d'eau.",
            "params": {
              "d8_pntr": {
                "label": "Pointeur D8",
                "description": "Raster de pointeurs d'écoulement D8"
              },
              "streams": {
                "label": "Cours d'eau",
                "description": "Cours d'eau"
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Pointeur ESRI"
              },
              "zero_background": {
                "label": "Fond à zéro",
                "description": "Fond à zéro"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "stream_link_length": {
            "name": "Longueur de tronçon",
            "description": "Calcule la longueur totale de chaque tronçon de cours d'eau.",
            "params": {
              "d8_pntr": {
                "label": "Pointeur D8",
                "description": "Raster de pointeurs d'écoulement D8"
              },
              "linkid": {
                "label": "ID de lien",
                "description": "ID de lien"
              },
              "streams": {
                "label": "Cours d'eau",
                "description": "Cours d'eau"
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Pointeur ESRI"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "stream_link_slope": {
            "name": "Pente de tronçon",
            "description": "Calcule la pente moyenne de chaque tronçon de cours d'eau.",
            "params": {
              "d8_pntr": {
                "label": "Pointeur D8",
                "description": "Raster de pointeurs d'écoulement D8"
              },
              "dem": {
                "label": "MNT",
                "description": "MNT"
              },
              "linkid": {
                "label": "ID de lien",
                "description": "ID de lien"
              },
              "streams": {
                "label": "Cours d'eau",
                "description": "Cours d'eau"
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Pointeur ESRI"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "stream_slope_continuous": {
            "name": "Pente continue du cours d'eau",
            "description": "Calcule la valeur de pente de chaque cellule de cours d'eau.",
            "params": {
              "d8_pntr": {
                "label": "Pointeur D8",
                "description": "Raster de pointeurs d'écoulement D8"
              },
              "dem": {
                "label": "MNT",
                "description": "MNT"
              },
              "streams": {
                "label": "Cours d'eau",
                "description": "Cours d'eau"
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Pointeur ESRI"
              },
              "zero_background": {
                "label": "Fond à zéro",
                "description": "Fond à zéro"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "topological_stream_order": {
            "name": "Ordre topologique des cours d'eau",
            "description": "Attribue un ordre topologique aux cours d'eau selon le nombre de tronçons.",
            "params": {
              "d8_pntr": {
                "label": "Pointeur D8",
                "description": "Raster de pointeurs d'écoulement D8"
              },
              "streams": {
                "label": "Cours d'eau",
                "description": "Cours d'eau"
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Pointeur ESRI"
              },
              "zero_background": {
                "label": "Fond à zéro",
                "description": "Fond à zéro"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "tributary_identifier": {
            "name": "Identifiant d'affluent",
            "description": "Attribue un identifiant unique à chaque affluent.",
            "params": {
              "d8_pntr": {
                "label": "Pointeur D8",
                "description": "Raster de pointeurs d'écoulement D8"
              },
              "streams": {
                "label": "Cours d'eau",
                "description": "Cours d'eau"
              },
              "esri_pntr": {
                "label": "Pointeur ESRI",
                "description": "Pointeur ESRI"
              },
              "zero_background": {
                "label": "Fond à zéro",
                "description": "Fond à zéro"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "vector_stream_network_analysis": {
            "name": "Analyse du réseau hydrographique vectoriel",
            "description": "Analyse complète d'un réseau hydrographique vectoriel.",
            "params": {
              "streams": {
                "label": "Cours d'eau",
                "description": "Couche vectorielle du réseau de cours d'eau en entrée."
              },
              "dem": {
                "label": "MNT",
                "description": "Raster d'élévation (MNT) en entrée."
              },
              "max_ridge_cutting_height": {
                "label": "Hauteur maximale de coupe de crête",
                "description": "Hauteur maximale admissible de coupe de crête."
              },
              "snap_distance": {
                "label": "Distance d'accrochage",
                "description": "Tolérance de distance d'accrochage pour le nettoyage du réseau."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel."
              }
            }
          },
          "add_point_coordinates_to_table": {
            "name": "Ajouter les coordonnées des points à la table",
            "description": "Copie une couche de points et ajoute les champs attributaires XCOORD et YCOORD.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du vecteur de points en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie. S'il est omis, un chemin GeoJSON est dérivé à côté de l'entrée."
              }
            }
          },
          "clean_vector": {
            "name": "Nettoyer le vecteur",
            "description": "Supprime les géométries vectorielles nulles et non valides (par ex. lignes/polygones trop petits) tout en préservant les entités valides et leurs attributs.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin vectoriel en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie. S'il est omis, un chemin GeoJSON est dérivé à côté de l'entrée."
              }
            }
          },
          "csv_points_to_vector": {
            "name": "Points CSV vers vecteur",
            "description": "Importe des enregistrements de points d'un fichier CSV dans une couche vectorielle de points.",
            "params": {
              "input_file": {
                "label": "Fichier d'entrée",
                "description": "Chemin du fichier CSV en entrée."
              },
              "x_field_num": {
                "label": "Numéro du champ X",
                "description": "Indice (à partir de 0) du champ de coordonnée X. Par défaut 0."
              },
              "y_field_num": {
                "label": "Numéro du champ Y",
                "description": "Indice (à partir de 0) du champ de coordonnée Y. Par défaut 1."
              },
              "epsg": {
                "label": "EPSG",
                "description": "Code EPSG optionnel du SCR de sortie."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "export_table_to_csv": {
            "name": "Exporter la table en CSV",
            "description": "Exporte une table attributaire vectorielle vers un fichier CSV.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin vectoriel en entrée."
              },
              "output_csv_file": {
                "label": "Fichier CSV de sortie",
                "description": "Chemin du fichier CSV en sortie."
              },
              "headers": {
                "label": "En-têtes",
                "description": "Inclure une ligne d'en-tête dans la sortie. Par défaut true."
              }
            }
          },
          "join_tables": {
            "name": "Joindre des tables",
            "description": "Joint les attributs d'une table vectorielle externe à une table vectorielle principale à l'aide de champs clés.",
            "params": {
              "primary_vector": {
                "label": "Vecteur primaire",
                "description": "Chemin du vecteur primaire recevant les champs joints."
              },
              "primary_key_field": {
                "label": "Champ de clé primaire",
                "description": "Champ de clé primaire dans le vecteur primaire."
              },
              "foreign_vector": {
                "label": "Vecteur étranger",
                "description": "Chemin du vecteur étranger contenant les champs sources."
              },
              "foreign_key_field": {
                "label": "Champ de clé étrangère",
                "description": "Champ de clé étrangère dans le vecteur étranger."
              },
              "import_field": {
                "label": "Champ à importer",
                "description": "Champ unique optionnel à importer ; par défaut tous les champs hors clé et hors FID."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie. Par défaut un chemin GeoJSON dérivé à côté de l'entrée primaire."
              }
            }
          },
          "merge_table_with_csv": {
            "name": "Fusionner une table avec un CSV",
            "description": "Fusionne les attributs d'une table CSV dans une table attributaire vectorielle selon des champs clés.",
            "params": {
              "primary_vector": {
                "label": "Vecteur primaire",
                "description": "Chemin du vecteur primaire recevant les champs fusionnés."
              },
              "primary_key_field": {
                "label": "Champ de clé primaire",
                "description": "Champ de clé primaire dans le vecteur primaire."
              },
              "foreign_csv_filename": {
                "label": "Nom du fichier CSV étranger",
                "description": "Fichier CSV contenant la table étrangère."
              },
              "foreign_key_field": {
                "label": "Champ de clé étrangère",
                "description": "Nom du champ de clé étrangère dans l'en-tête CSV."
              },
              "import_field": {
                "label": "Champ à importer",
                "description": "Champ CSV unique optionnel à importer ; par défaut tous les champs hors clé."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie. Par défaut un chemin GeoJSON dérivé à côté de l'entrée primaire."
              }
            }
          },
          "merge_vectors": {
            "name": "Fusionner des vecteurs",
            "description": "Combine deux vecteurs en entrée ou plus de même type de géométrie en un seul vecteur en sortie.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Tableau de chemins vectoriels en entrée (au moins deux requis)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "reinitialize_attribute_table": {
            "name": "Réinitialiser la table attributaire",
            "description": "Crée une copie d'une couche vectorielle ne contenant qu'un attribut FID régénéré.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin vectoriel en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie. S'il est omis, écrase le chemin d'entrée."
              }
            }
          },
          "vector_summary_statistics": {
            "name": "Statistiques résumées vectorielles",
            "description": "Calcule le nombre, la somme, la moyenne, le min, le max et l'écart-type par groupe catégoriel et exporte vers CSV.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "group_field": {
                "label": "Champ de regroupement",
                "description": "Nom du champ de regroupement."
              },
              "value_field": {
                "label": "Champ de valeur",
                "description": "Nom du champ de valeur numérique."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du CSV en sortie."
              }
            }
          },
          "fix_dangling_arcs": {
            "name": "Corriger les arcs pendants",
            "description": "Corrige les arcs pendants trop courts ou trop longs d'un réseau linéaire en accrochant les extrémités des lignes dans une distance seuil.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du vecteur de polylignes en entrée."
              },
              "snap": {
                "label": "Accrocher",
                "description": "Seuil de distance d'accrochage en unités carte."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie. S'il est omis, un chemin GeoJSON est dérivé à côté de l'entrée."
              }
            }
          },
          "lines_to_polygons": {
            "name": "Lignes vers polygones",
            "description": "Convertit des entités polylignes en entités polygonales, la première partie étant traitée comme l'anneau extérieur et les parties suivantes comme des trous.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du vecteur de polylignes en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de polygones en sortie. S'il est omis, un chemin GeoJSON est dérivé à côté de l'entrée."
              }
            }
          },
          "multipart_to_singlepart": {
            "name": "Multi-parties vers parties simples",
            "description": "Convertit un vecteur contenant des entités multiparties en un vecteur ne contenant que des entités à partie unique.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin vectoriel en entrée (polyligne, polygone ou multipoint)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie. Par défaut un GeoJSON horodaté à côté de l'entrée."
              },
              "exclude_holes": {
                "label": "Exclure les trous",
                "description": "Si vrai, les trous des polygones restent attachés à leur anneau extérieur englobant (par défaut : false)."
              }
            }
          },
          "polygons_to_lines": {
            "name": "Polygones vers lignes",
            "description": "Convertit des entités polygonales et multipolygonales en lignes suivant leurs limites.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du vecteur de polygones en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de lignes en sortie. S'il est omis, un chemin GeoJSON est dérivé à côté de l'entrée."
              }
            }
          },
          "remove_polygon_holes": {
            "name": "Supprimer les trous des polygones",
            "description": "Supprime les anneaux intérieurs des entités polygonales tout en préservant les attributs.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du vecteur de polygones en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de polygones en sortie. S'il est omis, un chemin GeoJSON est dérivé à côté de l'entrée."
              }
            }
          },
          "singlepart_to_multipart": {
            "name": "Parties simples vers multi-parties",
            "description": "Fusionne des entités à partie unique en entités multiparties, regroupées selon un champ catégoriel optionnel.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin vectoriel en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie. Par défaut un GeoJSON horodaté à côté de l'entrée."
              },
              "field": {
                "label": "Champ",
                "description": "Nom de champ attributaire optionnel pour regrouper les entités. S'il est omis, toutes les entités sont fusionnées en une seule géométrie."
              }
            }
          },
          "topology_rule_autofix": {
            "name": "Correction automatique des règles topologiques",
            "description": "Applique automatiquement des corrections sûres et vérifiables aux violations de topologie détectées par topology_rule_validate : accrochage des extrémités entre entités, accrochage/projection des extrémités pendantes et projection point-sur-ligne. polygon_must_not_have_gaps n'a pas de correction automatique et est signalé avec zéro modification.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin vectoriel en entrée."
              },
              "rule_set": {
                "label": "Jeu de règles",
                "description": "Configuration des règles sous forme de tableau/objet JSON, de chaîne CSV ou de chemin de fichier. Règles avec corrections automatiques : line_endpoints_must_snap_within_tolerance, line_must_not_have_dangles, point_must_be_covered_by_line. polygon_must_not_have_gaps est acceptée mais ne produit jamais de changements."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance des opérations d'accrochage en unités de coordonnées. Par défaut 0.01."
              },
              "dry_run": {
                "label": "Simulation",
                "description": "Si vrai (PAR DÉFAUT), aperçu uniquement : le rapport de changements est émis mais aucune sortie n'est écrite. Passez false pour appliquer les corrections."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie des entités corrigées. S'il est omis, dérivé à côté de l'entrée."
              },
              "change_report": {
                "label": "Rapport de changements",
                "description": "Chemin optionnel du rapport JSON de traçabilité des changements."
              }
            }
          },
          "topology_rule_validate": {
            "name": "Valider les règles topologiques",
            "description": "Valide la topologie vectorielle au moyen de contrôles par ensemble de règles (auto-intersection, chevauchement, lacunes, extrémités pendantes, couverture de points, accrochage des extrémités) et émet les violations au niveau des entités.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin vectoriel en entrée."
              },
              "rule_set": {
                "label": "Jeu de règles",
                "description": "Configuration des règles sous forme de tableau/objet JSON, de chaîne CSV ou de chemin de fichier. Par défaut les 6 règles MVP. Prises en charge : line_must_not_self_intersect, polygon_must_not_overlap, polygon_must_not_have_gaps, line_must_not_have_dangles, point_must_be_covered_by_line, line_endpoints_must_snap_within_tolerance."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Tolérance de la règle line_endpoints_must_snap_within_tolerance en unités de coordonnées. Par défaut 1.0."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie des violations. S'il est omis, dérivé à côté de l'entrée."
              },
              "report": {
                "label": "Rapport",
                "description": "Chemin optionnel du rapport JSON de synthèse."
              }
            }
          },
          "topology_validation_report": {
            "name": "Rapport de validation topologique",
            "description": "Vérifie les problèmes de topologie d'une couche vectorielle et écrit un rapport CSV par entité.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin vectoriel en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du CSV en sortie."
              }
            }
          },
          "convert_nodata_to_zero": {
            "name": "Convertir NoData en zéro",
            "description": "Remplace les cellules NoData d'un raster par 0 en laissant les cellules valides inchangées.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              }
            }
          },
          "modify_nodata_value": {
            "name": "Modifier la valeur NoData",
            "description": "Modifie la valeur NoData d'un raster et réécrit les cellules NoData existantes avec la nouvelle valeur.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée."
              },
              "new_value": {
                "label": "Nouvelle valeur",
                "description": "Nouvelle valeur NoData. Par défaut -32768.0."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              }
            }
          },
          "new_raster_from_base_raster": {
            "name": "Nouveau raster à partir d'un raster de base",
            "description": "Crée un nouveau raster à partir de l'étendue, des dimensions et du SCR d'un raster de base.",
            "params": {
              "base": {
                "label": "Base",
                "description": "Chemin du raster de base."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              },
              "out_val": {
                "label": "Valeur de sortie",
                "description": "Valeur de remplissage optionnelle. Par défaut la valeur NoData du raster."
              },
              "data_type": {
                "label": "Type de données",
                "description": "Type de données optionnel : 'float', 'double' ou 'integer'."
              }
            }
          },
          "new_raster_from_base_vector": {
            "name": "Nouveau raster à partir d'un vecteur de base",
            "description": "Crée un nouveau raster à partir de l'étendue d'un vecteur de base et d'une taille de cellule, rempli d'une valeur optionnelle.",
            "params": {
              "base": {
                "label": "Base",
                "description": "Chemin du vecteur de base."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule de la grille en sortie (> 0)."
              },
              "out_val": {
                "label": "Valeur de sortie",
                "description": "Valeur de remplissage optionnelle. Par défaut NoData (-32768)."
              },
              "data_type": {
                "label": "Type de données",
                "description": "Mot-clé optionnel du type de données en sortie : integer, float ou double."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "raster_to_vector_lines": {
            "name": "Raster vers lignes vectorielles",
            "description": "Convertit les cellules de lignes raster non nulles et non NoData en entités vectorielles polylignes.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée (monobande)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie. S'il est omis, un chemin GeoJSON est dérivé à côté de l'entrée."
              }
            }
          },
          "raster_to_vector_points": {
            "name": "Raster vers points vectoriels",
            "description": "Convertit les cellules non nulles et non NoData d'un raster en entités ponctuelles situées au centre des cellules.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de points en sortie. S'il est omis, un chemin GeoJSON est dérivé à côté de l'entrée."
              }
            }
          },
          "raster_to_vector_polygons": {
            "name": "Raster vers polygones vectoriels",
            "description": "Convertit les régions raster non nulles et non NoData en entités vectorielles polygonales avec les attributs FID et VALUE.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée (monobande)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie. S'il est omis, un chemin GeoJSON est dérivé à côté de l'entrée."
              }
            }
          },
          "remove_raster_polygon_holes": {
            "name": "Supprimer les trous des polygones raster",
            "description": "Supprime les trous de fond intérieurs (régions à 0 ou NoData entourées par l'avant-plan) des polygones raster.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée (monobande)."
              },
              "threshold": {
                "label": "Seuil",
                "description": "Taille maximale optionnelle des trous à supprimer, en cellules. 0 signifie tous les trous fermés."
              },
              "use_diagonals": {
                "label": "Utiliser les diagonales",
                "description": "Utiliser la connexité à 8 voisins pour l'agrégation et la connectivité des bords."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "set_nodata_value": {
            "name": "Définir la valeur NoData",
            "description": "Définit la valeur NoData d'un raster et associe les cellules NoData existantes à la valeur de fond spécifiée.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée."
              },
              "back_value": {
                "label": "Valeur d'arrière-plan",
                "description": "Valeur de fond à affecter comme NoData. Par défaut 0.0."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel. S'il est omis, renvoie un raster en mémoire."
              }
            }
          },
          "vector_lines_to_raster": {
            "name": "Lignes vectorielles vers raster",
            "description": "Rastérise les géométries de lignes et de limites de polygones sur une grille raster.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin vectoriel en entrée (lignes ou polygones)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              },
              "field": {
                "label": "Champ",
                "description": "Nom de champ numérique optionnel à incruster. Par défaut FID."
              },
              "zero_background": {
                "label": "Fond à zéro",
                "description": "Si vrai, initialise le fond de la sortie à 0 au lieu de NoData."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule de sortie lorsque 'base' n'est pas fourni. Si elle est omise et qu'aucune base n'est donnée, la taille de cellule automatique est l'emprise maximale / 500."
              },
              "base": {
                "label": "Base",
                "description": "Chemin optionnel du raster de base définissant la grille et l'emprise de sortie."
              }
            }
          },
          "vector_points_to_raster": {
            "name": "Points vectoriels vers raster",
            "description": "Rastérise des vecteurs de points ou multipoints sur une grille à l'aide d'une opération d'affectation choisie.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin vectoriel en entrée (point/multipoint)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel. S'il est omis, le résultat est en mémoire."
              },
              "field": {
                "label": "Champ",
                "description": "Champ numérique optionnel utilisé pour les valeurs du raster. Par défaut FID."
              },
              "assign": {
                "label": "Affecter",
                "description": "Opération d'affectation : last, first, min, max, sum, num, mean."
              },
              "zero_background": {
                "label": "Fond à zéro",
                "description": "Si vrai, initialise le fond à 0 ; sinon NoData."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule de sortie. Requise lorsque 'base' n'est pas fourni."
              },
              "base": {
                "label": "Base",
                "description": "Chemin optionnel du raster de base définissant l'emprise/la grille."
              }
            }
          },
          "vector_polygons_to_raster": {
            "name": "Polygones vectoriels vers raster",
            "description": "Rastérise des vecteurs polygonaux sur une grille, avec prise en charge de valeurs d'incrustation issues d'attributs.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du vecteur de polygones en entrée."
              },
              "field": {
                "label": "Champ",
                "description": "Nom de champ numérique optionnel pour les valeurs à incruster (par défaut FID)."
              },
              "zero_background": {
                "label": "Fond à zéro",
                "description": "Si vrai, initialise le fond de la sortie à 0 au lieu de NoData."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule de sortie lorsque 'base' n'est pas fourni."
              },
              "base": {
                "label": "Base",
                "description": "Chemin optionnel du raster de base définissant la grille et l'emprise de sortie."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel. S'il est omis, la sortie reste en mémoire."
              }
            }
          },
          "local_morans_i_lisa_raster": {
            "name": "I de Moran local (LISA) raster",
            "description": "Calcule une analyse d'agrégats LISA à partir de points et produit un raster catégoriel (HH/LL/HL/LH/NS). Permet une intégration raster.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée avec les points d'observation."
              },
              "field": {
                "label": "Champ",
                "description": "Champ attributaire numérique à analyser."
              },
              "weights_mode": {
                "label": "Mode de pondération",
                "description": "Mode de voisinage : queen, rook, k_nearest, distance_band."
              },
              "k": {
                "label": "K",
                "description": "Valeur k pour le mode k_nearest (par défaut 8)."
              },
              "distance": {
                "label": "Distance",
                "description": "Seuil de distance pour le mode distance_band."
              },
              "row_standardize": {
                "label": "Standardisation par ligne",
                "description": "Appliquer une standardisation par ligne aux poids (par défaut true)."
              },
              "island_policy": {
                "label": "Politique des îles",
                "description": "Gestion des îles : drop_with_warning, keep_zero_weight, error."
              },
              "alpha": {
                "label": "Alpha",
                "description": "Seuil de significativité dans [0, 1] ; par défaut 0.05."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule du raster de sortie (optionnelle ; calculée automatiquement à partir de l'emprise)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie (classification : 0=NS, 1=HH, 2=LL, 3=HL, 4=LH)."
              }
            }
          },
          "getis_ord_gi_star_raster": {
            "name": "Gi* de Getis-Ord raster",
            "description": "Calcule des classifications de points chauds/froids Gi* à partir de points et produit un raster (-1=froid, 0=NS, 1=chaud). Pour l'analyse fondée sur les points chauds.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée avec les points d'observation."
              },
              "field": {
                "label": "Champ",
                "description": "Champ attributaire numérique à analyser."
              },
              "weights_mode": {
                "label": "Mode de pondération",
                "description": "Mode de voisinage : queen, rook, k_nearest, distance_band."
              },
              "k": {
                "label": "K",
                "description": "Valeur k pour le mode k_nearest (par défaut 8)."
              },
              "distance": {
                "label": "Distance",
                "description": "Seuil de distance pour le mode distance_band."
              },
              "row_standardize": {
                "label": "Standardisation par ligne",
                "description": "Appliquer une standardisation par ligne aux poids (par défaut true)."
              },
              "island_policy": {
                "label": "Politique des îles",
                "description": "Gestion des îles : drop_with_warning, keep_zero_weight, error."
              },
              "alpha": {
                "label": "Alpha",
                "description": "Seuil de significativité dans [0, 1] ; par défaut 0.05."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule du raster de sortie (optionnelle ; calculée automatiquement à partir de l'emprise)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie (classification : -1=Froid, 0=NS, 1=Chaud)."
              }
            }
          },
          "ordinary_kriging": {
            "name": "Krigeage ordinaire",
            "description": "Effectue une interpolation par krigeage ordinaire pour estimer les valeurs des cellules de grille non cartographiées à partir d'un échantillon de mesures ponctuelles. Le krigeage ordinaire est une méthode géostatistique qui exploite la structure d'autocorrélation spatiale pour fournir à la fois des prédictions et la variance de krigeage associée (incertitude de prédiction). L'outil estime automatiquement un variogramme empirique à partir des données ponctuelles en entrée et ajuste un modèle de variogramme théorique (sphérique, exponentiel ou gaussien) pour capturer la dépendance spatiale.",
            "params": {
              "points": {
                "label": "Points",
                "description": "Couche vectorielle de points en entrée."
              },
              "value_field": {
                "label": "Champ de valeur",
                "description": "Champ attributaire numérique contenant les valeurs à interpoler."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule de sortie en unités carte (requise sans base_raster)."
              },
              "base_raster": {
                "label": "Raster de base",
                "description": "Raster de base optionnel contrôlant la géométrie de sortie."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "local_kriging": {
            "name": "Krigeage local",
            "description": "Effectue une interpolation locale par krigeage ordinaire à l'aide des k plus proches voisins, offrant une estimation spatiale efficace pour les grands jeux de données. Cette approche est plus praticable en calcul que le krigeage ordinaire global pour des jeux de données de plusieurs milliers de points.",
            "params": {
              "points": {
                "label": "Points",
                "description": "Couche vectorielle de points en entrée."
              },
              "value_field": {
                "label": "Champ de valeur",
                "description": "Champ attributaire numérique contenant les valeurs à interpoler."
              },
              "k_neighbors": {
                "label": "K voisins",
                "description": "Nombre de plus proches voisins à utiliser ; par défaut 10."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule de sortie en unités carte (requise sans base_raster)."
              },
              "base_raster": {
                "label": "Raster de base",
                "description": "Raster de base optionnel contrôlant la géométrie de sortie."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "simple_kriging": {
            "name": "Krigeage simple",
            "description": "Effectue une interpolation par krigeage simple lorsque la moyenne du champ spatial est connue a priori. Cette méthode réduit la variance de krigeage et fournit des prédictions plus stables lorsque la moyenne est connue de manière fiable grâce à des informations externes.",
            "params": {
              "points": {
                "label": "Points",
                "description": "Couche vectorielle de points en entrée."
              },
              "value_field": {
                "label": "Champ de valeur",
                "description": "Champ attributaire numérique contenant les valeurs à interpoler."
              },
              "known_mean": {
                "label": "Moyenne connue",
                "description": "Moyenne connue du champ spatial."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule de sortie en unités carte (requise sans base_raster)."
              },
              "base_raster": {
                "label": "Raster de base",
                "description": "Raster de base optionnel contrôlant la géométrie de sortie."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "universal_kriging": {
            "name": "Krigeage universel",
            "description": "Effectue une interpolation par krigeage universel lorsque le phénomène spatial présente une tendance ou une dérive systématique. Combine le krigeage et l'estimation d'une surface de tendance polynomiale.",
            "params": {
              "points": {
                "label": "Points",
                "description": "Couche vectorielle de points en entrée."
              },
              "value_field": {
                "label": "Champ de valeur",
                "description": "Champ attributaire numérique contenant les valeurs à interpoler."
              },
              "trend_order": {
                "label": "Ordre de tendance",
                "description": "Ordre de la tendance polynomiale (1=linéaire, 2=quadratique) ; par défaut 1."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule de sortie en unités carte (requise sans base_raster)."
              },
              "base_raster": {
                "label": "Raster de base",
                "description": "Raster de base optionnel contrôlant la géométrie de sortie."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "spacetime_kriging": {
            "name": "Krigeage spatio-temporel",
            "description": "Effectue une interpolation par krigeage spatio-temporel pour modéliser conjointement la variation spatiale et temporelle des mesures ponctuelles. Idéal pour les données de séries temporelles distribuées spatialement.",
            "params": {
              "points": {
                "label": "Points",
                "description": "Couche vectorielle de points en entrée."
              },
              "value_field": {
                "label": "Champ de valeur",
                "description": "Champ attributaire numérique contenant les valeurs à interpoler."
              },
              "time_field": {
                "label": "Champ de temps",
                "description": "Champ attributaire temporel contenant les valeurs de temps."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule de sortie en unités carte (requise sans base_raster)."
              },
              "base_raster": {
                "label": "Raster de base",
                "description": "Raster de base optionnel contrôlant la géométrie de sortie."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "spatial_lag_regression_raster": {
            "name": "Régression à décalage spatial (raster)",
            "description": "Estime un modèle SAR et produit une surface de valeurs ajustées.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "response_field": {
                "label": "Champ de réponse",
                "description": "Variable de réponse."
              },
              "predictor_fields": {
                "label": "Champs prédicteurs",
                "description": "Champs prédicteurs."
              },
              "weights_mode": {
                "label": "Mode de pondération",
                "description": "Mode de voisinage."
              },
              "k": {
                "label": "K",
                "description": "k pour k_nearest."
              },
              "distance": {
                "label": "Distance",
                "description": "Seuil de distance."
              },
              "row_standardize": {
                "label": "Standardisation par ligne",
                "description": "Standardiser les poids par ligne."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule du raster de sortie."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster en sortie."
              }
            }
          },
          "spatial_error_regression_raster": {
            "name": "Régression à erreur spatiale (raster)",
            "description": "Estime un modèle SEM et produit une surface de valeurs ajustées.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "response_field": {
                "label": "Champ de réponse",
                "description": "Variable de réponse."
              },
              "predictor_fields": {
                "label": "Champs prédicteurs",
                "description": "Champs prédicteurs."
              },
              "weights_mode": {
                "label": "Mode de pondération",
                "description": "Mode de voisinage."
              },
              "k": {
                "label": "K",
                "description": "k pour k_nearest."
              },
              "distance": {
                "label": "Distance",
                "description": "Seuil de distance."
              },
              "row_standardize": {
                "label": "Standardisation par ligne",
                "description": "Standardiser les poids par ligne."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule du raster de sortie."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster en sortie."
              }
            }
          },
          "geographically_weighted_regression_raster": {
            "name": "Régression géographiquement pondérée (raster)",
            "description": "Estime une GWR et produit des surfaces raster de coefficients locaux.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "response_field": {
                "label": "Champ de réponse",
                "description": "Variable de réponse."
              },
              "predictor_fields": {
                "label": "Champs prédicteurs",
                "description": "Champs prédicteurs."
              },
              "bandwidth": {
                "label": "Largeur de bande",
                "description": "Largeur de bande du noyau."
              },
              "kernel": {
                "label": "Noyau",
                "description": "Type de noyau."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule du raster de sortie."
              },
              "output_prefix": {
                "label": "Préfixe de sortie",
                "description": "Préfixe du raster en sortie."
              }
            }
          },
          "inhomogeneous_intensity_raster": {
            "name": "Intensité inhomogène (raster)",
            "description": "Calcule une surface d'estimation de densité par noyau (KDE) visualisant l'intensité spatiale des points. Révèle les points chauds et froids au-delà de la simple densité.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points en entrée."
              },
              "bandwidth": {
                "label": "Largeur de bande",
                "description": "Largeur de bande du noyau."
              },
              "kernel": {
                "label": "Noyau",
                "description": "Type de noyau."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule du raster de sortie."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster d'intensité en sortie."
              }
            }
          },
          "add": {
            "name": "Additionner",
            "description": "Additionne deux rasters cellule par cellule.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Premier raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Second raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, la sortie reste en mémoire et est renvoyée sous forme de référence raster memory://."
              }
            }
          },
          "average_overlay": {
            "name": "Superposition par moyenne",
            "description": "Calcule la moyenne par cellule d'une pile de rasters, en ignorant les NoData sauf si toutes les entrées sont NoData.",
            "params": {
              "input_rasters": {
                "label": "Rasters d'entrée",
                "description": "Pile de rasters en entrée sous forme de tableau de chemins ou de chaîne délimitée par des points-virgules/virgules."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat reste en mémoire."
              }
            }
          },
          "bool_and": {
            "name": "ET logique",
            "description": "Calcule un ET logique de deux rasters cellule par cellule.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Premier raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Second raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, la sortie reste en mémoire et est renvoyée sous forme de référence raster memory://."
              }
            }
          },
          "bool_not": {
            "name": "NON logique",
            "description": "Calcule un NON logique de chaque cellule raster, produisant 1 pour les cellules de valeur nulle et 0 sinon.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "bool_or": {
            "name": "OU logique",
            "description": "Calcule un OU logique de deux rasters cellule par cellule.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Premier raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Second raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, la sortie reste en mémoire et est renvoyée sous forme de référence raster memory://."
              }
            }
          },
          "bool_xor": {
            "name": "OU exclusif logique",
            "description": "Calcule un OU exclusif (XOR) logique de deux rasters cellule par cellule.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Premier raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Second raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, la sortie reste en mémoire et est renvoyée sous forme de référence raster memory://."
              }
            }
          },
          "count_if": {
            "name": "Compter si",
            "description": "Compte le nombre de rasters en entrée dont la cellule est égale à une valeur de comparaison.",
            "params": {
              "input_rasters": {
                "label": "Rasters d'entrée",
                "description": "Pile de rasters en entrée sous forme de tableau de chemins ou de chaîne délimitée par des points-virgules/virgules."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "comparison_value": {
                "label": "Valeur de comparaison",
                "description": "Valeur de comparaison à compter dans la pile de rasters."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat reste en mémoire."
              }
            }
          },
          "divide": {
            "name": "Diviser",
            "description": "Divise le premier raster par le second cellule par cellule.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Premier raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Second raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, la sortie reste en mémoire et est renvoyée sous forme de référence raster memory://."
              }
            }
          },
          "highest_position": {
            "name": "Position la plus haute",
            "description": "Renvoie l'indice (à partir de zéro) du raster de la pile contenant la valeur la plus élevée pour chaque cellule.",
            "params": {
              "input_rasters": {
                "label": "Rasters d'entrée",
                "description": "Pile de rasters en entrée sous forme de tableau de chemins ou de chaîne délimitée par des points-virgules/virgules."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat reste en mémoire."
              }
            }
          },
          "lowest_position": {
            "name": "Position la plus basse",
            "description": "Renvoie l'indice (à partir de zéro) du raster de la pile contenant la valeur la plus faible pour chaque cellule.",
            "params": {
              "input_rasters": {
                "label": "Rasters d'entrée",
                "description": "Pile de rasters en entrée sous forme de tableau de chemins ou de chaîne délimitée par des points-virgules/virgules."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat reste en mémoire."
              }
            }
          },
          "max_absolute_overlay": {
            "name": "Superposition par maximum absolu",
            "description": "Calcule la valeur absolue maximale par cellule d'une pile de rasters, en propageant NoData si une cellule en entrée est NoData.",
            "params": {
              "input_rasters": {
                "label": "Rasters d'entrée",
                "description": "Pile de rasters en entrée sous forme de tableau de chemins ou de chaîne délimitée par des points-virgules/virgules."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat reste en mémoire."
              }
            }
          },
          "max_overlay": {
            "name": "Superposition par maximum",
            "description": "Calcule le maximum par cellule d'une pile de rasters, en propageant NoData si une cellule en entrée est NoData.",
            "params": {
              "input_rasters": {
                "label": "Rasters d'entrée",
                "description": "Pile de rasters en entrée sous forme de tableau de chemins ou de chaîne délimitée par des points-virgules/virgules."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat reste en mémoire."
              }
            }
          },
          "min_absolute_overlay": {
            "name": "Superposition par minimum absolu",
            "description": "Calcule la valeur absolue minimale par cellule d'une pile de rasters, en propageant NoData si une cellule en entrée est NoData.",
            "params": {
              "input_rasters": {
                "label": "Rasters d'entrée",
                "description": "Pile de rasters en entrée sous forme de tableau de chemins ou de chaîne délimitée par des points-virgules/virgules."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat reste en mémoire."
              }
            }
          },
          "min_overlay": {
            "name": "Superposition par minimum",
            "description": "Calcule le minimum par cellule d'une pile de rasters, en propageant NoData si une cellule en entrée est NoData.",
            "params": {
              "input_rasters": {
                "label": "Rasters d'entrée",
                "description": "Pile de rasters en entrée sous forme de tableau de chemins ou de chaîne délimitée par des points-virgules/virgules."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat reste en mémoire."
              }
            }
          },
          "modulo": {
            "name": "Modulo",
            "description": "Calcule le reste de la division du premier raster par le second cellule par cellule.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Premier raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Second raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, la sortie reste en mémoire et est renvoyée sous forme de référence raster memory://."
              }
            }
          },
          "multiply": {
            "name": "Multiplier",
            "description": "Multiplie deux rasters cellule par cellule.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Premier raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Second raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, la sortie reste en mémoire et est renvoyée sous forme de référence raster memory://."
              }
            }
          },
          "multiply_overlay": {
            "name": "Superposition par produit",
            "description": "Calcule le produit par cellule d'une pile de rasters, en propageant NoData si une cellule en entrée est NoData.",
            "params": {
              "input_rasters": {
                "label": "Rasters d'entrée",
                "description": "Pile de rasters en entrée sous forme de tableau de chemins ou de chaîne délimitée par des points-virgules/virgules."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat reste en mémoire."
              }
            }
          },
          "percent_equal_to": {
            "name": "Pourcentage égal à",
            "description": "Calcule la fraction des rasters d'une pile dont les valeurs sont égales au raster de comparaison pour chaque cellule.",
            "params": {
              "input_rasters": {
                "label": "Rasters d'entrée",
                "description": "Pile de rasters en entrée sous forme de tableau de chemins ou de chaîne délimitée par des points-virgules/virgules."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "comparison": {
                "label": "Comparaison",
                "description": "Chemin du raster de comparaison ou référence raster en mémoire."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat reste en mémoire."
              }
            }
          },
          "percent_greater_than": {
            "name": "Pourcentage supérieur à",
            "description": "Calcule la fraction des rasters d'une pile dont les valeurs sont supérieures au raster de comparaison pour chaque cellule.",
            "params": {
              "input_rasters": {
                "label": "Rasters d'entrée",
                "description": "Pile de rasters en entrée sous forme de tableau de chemins ou de chaîne délimitée par des points-virgules/virgules."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "comparison": {
                "label": "Comparaison",
                "description": "Chemin du raster de comparaison ou référence raster en mémoire."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat reste en mémoire."
              }
            }
          },
          "percent_less_than": {
            "name": "Pourcentage inférieur à",
            "description": "Calcule la fraction des rasters d'une pile dont les valeurs sont inférieures au raster de comparaison pour chaque cellule.",
            "params": {
              "input_rasters": {
                "label": "Rasters d'entrée",
                "description": "Pile de rasters en entrée sous forme de tableau de chemins ou de chaîne délimitée par des points-virgules/virgules."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "comparison": {
                "label": "Comparaison",
                "description": "Chemin du raster de comparaison ou référence raster en mémoire."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat reste en mémoire."
              }
            }
          },
          "pick_from_list": {
            "name": "Choisir dans une liste",
            "description": "Sélectionne les valeurs par cellule d'une pile de rasters à l'aide d'un raster de positions (à partir de zéro).",
            "params": {
              "input_rasters": {
                "label": "Rasters d'entrée",
                "description": "Pile de rasters en entrée sous forme de tableau de chemins ou de chaîne délimitée par des points-virgules/virgules."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "pos_input": {
                "label": "Entrée de position",
                "description": "Raster des positions dans la pile (à partir de 0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "power": {
            "name": "Puissance",
            "description": "Élève le premier raster à la puissance du second cellule par cellule.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Premier raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Second raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, la sortie reste en mémoire et est renvoyée sous forme de référence raster memory://."
              }
            }
          },
          "standard_deviation_overlay": {
            "name": "Superposition par écart-type",
            "description": "Calcule l'écart-type par cellule d'une pile de rasters, en propageant NoData si une cellule en entrée est NoData.",
            "params": {
              "input_rasters": {
                "label": "Rasters d'entrée",
                "description": "Pile de rasters en entrée sous forme de tableau de chemins ou de chaîne délimitée par des points-virgules/virgules."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat reste en mémoire."
              }
            }
          },
          "subtract": {
            "name": "Soustraire",
            "description": "Soustrait le second raster du premier cellule par cellule.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Premier raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Second raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, la sortie reste en mémoire et est renvoyée sous forme de référence raster memory://."
              }
            }
          },
          "sum_overlay": {
            "name": "Superposition par somme",
            "description": "Calcule la somme par cellule d'une pile de rasters, en propageant NoData si une cellule en entrée est NoData.",
            "params": {
              "input_rasters": {
                "label": "Rasters d'entrée",
                "description": "Pile de rasters en entrée sous forme de tableau de chemins ou de chaîne délimitée par des points-virgules/virgules."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat reste en mémoire."
              }
            }
          },
          "update_nodata_cells": {
            "name": "Mettre à jour les cellules NoData",
            "description": "Remplace les cellules NoData de input1 par les cellules valides correspondantes de input2.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Raster primaire à mettre à jour."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Raster secondaire fournissant les valeurs de remplacement."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "weighted_overlay": {
            "name": "Superposition pondérée",
            "description": "Combine des rasters de facteurs à l'aide de poids normalisés, d'indicateurs de coût optionnels et de contraintes binaires optionnelles.",
            "params": {
              "factors": {
                "label": "Facteurs",
                "description": "Pile de rasters de facteurs en entrée."
              },
              "weights": {
                "label": "Poids",
                "description": "Poids numériques correspondant à chaque raster de facteur."
              },
              "cost": {
                "label": "Coût",
                "description": "Indicateurs booléens optionnels signalant les facteurs de coût."
              },
              "constraints": {
                "label": "Contraintes",
                "description": "Pile de rasters de contraintes optionnelle ; les valeurs <= 0 forcent la sortie à zéro."
              },
              "scale_max": {
                "label": "Échelle maximale",
                "description": "Valeur d'échelle maximale utilisée après normalisation des facteurs."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "weighted_sum": {
            "name": "Somme pondérée",
            "description": "Calcule une somme pondérée sur une pile de rasters après normalisation des poids pour que leur somme soit égale à un.",
            "params": {
              "input_rasters": {
                "label": "Rasters d'entrée",
                "description": "Pile de rasters en entrée."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "weights": {
                "label": "Poids",
                "description": "Poids numériques correspondant à chaque raster d'entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "image_correlation_neighbourhood_analysis": {
            "name": "Analyse de voisinage par corrélation d'images",
            "description": "Effectue une analyse de corrélation en fenêtre mobile entre deux rasters et renvoie des rasters de corrélation et de valeur p.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Chemin du premier raster en entrée."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Chemin du second raster en entrée."
              },
              "filter_size": {
                "label": "Taille du filtre",
                "description": "Taille de la fenêtre glissante en cellules (minimum 3, par défaut 11)."
              },
              "correlation_stat": {
                "label": "Statistique de corrélation",
                "description": "Métrique de corrélation : pearson, spearman ou kendall (par défaut pearson)."
              },
              "output1": {
                "label": "Sortie 1",
                "description": "Chemin de sortie optionnel du raster de corrélation."
              },
              "output2": {
                "label": "Sortie 2",
                "description": "Chemin de sortie optionnel du raster de significativité (valeur p)."
              }
            }
          },
          "natural_neighbour_interpolation": {
            "name": "Interpolation par voisins naturels",
            "description": "Interpole un raster à partir d'échantillons ponctuels à l'aide d'une véritable pondération par surface des voisins naturels de Sibson.",
            "params": {
              "points": {
                "label": "Points",
                "description": "Couche vectorielle de points en entrée."
              },
              "field_name": {
                "label": "Nom du champ",
                "description": "Champ attributaire numérique optionnel ; par défaut repli sur le FID."
              },
              "use_z": {
                "label": "Utiliser Z",
                "description": "Utiliser les valeurs Z de la géométrie des points au lieu des attributs."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule de sortie lorsque base_raster n'est pas fourni."
              },
              "base_raster": {
                "label": "Raster de base",
                "description": "Raster de base optionnel contrôlant la géométrie de sortie."
              },
              "clip_to_hull": {
                "label": "Découper selon l'enveloppe",
                "description": "Limiter l'interpolation à l'enveloppe convexe des points."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "nearest_neighbour_interpolation": {
            "name": "Interpolation au plus proche voisin",
            "description": "Interpole un raster à partir d'échantillons ponctuels en attribuant à chaque cellule la valeur de l'échantillon le plus proche.",
            "params": {
              "points": {
                "label": "Points",
                "description": "Couche vectorielle de points en entrée."
              },
              "field_name": {
                "label": "Nom du champ",
                "description": "Champ attributaire numérique optionnel ; par défaut repli sur le FID."
              },
              "use_z": {
                "label": "Utiliser Z",
                "description": "Utiliser les valeurs Z de la géométrie des points au lieu des attributs."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule de sortie lorsque base_raster n'est pas fourni."
              },
              "base_raster": {
                "label": "Raster de base",
                "description": "Raster de base optionnel contrôlant la géométrie de sortie."
              },
              "max_dist": {
                "label": "Distance maximale",
                "description": "Distance de recherche maximale optionnelle en unités carte ; par défaut l'infini."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "conditional_evaluation": {
            "name": "Évaluation conditionnelle",
            "description": "Effectue une évaluation conditionnelle si-alors-sinon sur les cellules raster.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée."
              },
              "statement": {
                "label": "Instruction",
                "description": "Expression conditionnelle évaluée par cellule."
              },
              "true": {
                "label": "Vrai",
                "description": "Valeur ou raster/expression utilisé lorsque la condition est vraie."
              },
              "false": {
                "label": "Faux",
                "description": "Valeur ou raster/expression utilisé lorsque la condition est fausse."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "reclass": {
            "name": "Reclassifier",
            "description": "Reclassifie les valeurs raster à l'aide de plages ou de paires d'affectation exactes.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster en entrée."
              },
              "reclass_values": {
                "label": "Valeurs de reclassification",
                "description": "Valeurs de reclassification sous forme de lignes [nouveau, de, jusqu'à_exclu] ou [nouveau, ancien] lorsque assign_mode=true."
              },
              "assign_mode": {
                "label": "Mode d'affectation",
                "description": "Si vrai, utilise le mode d'affectation exacte avec des paires [nouvelle_valeur, ancienne_valeur]."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel. S'il est omis, le résultat est conservé en mémoire."
              }
            }
          },
          "reclass_equal_interval": {
            "name": "Reclassifier par intervalles égaux",
            "description": "Reclassifie les valeurs raster en intervalles d'égale amplitude sur une plage de valeurs optionnelle.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster en entrée."
              },
              "interval_size": {
                "label": "Taille d'intervalle",
                "description": "Largeur des classes à intervalle égal."
              },
              "start_value": {
                "label": "Valeur de début",
                "description": "Borne inférieure optionnelle de la reclassification ; par défaut le minimum du raster."
              },
              "end_value": {
                "label": "Valeur de fin",
                "description": "Borne supérieure optionnelle de la reclassification ; par défaut le maximum du raster."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel. S'il est omis, le résultat est conservé en mémoire."
              }
            }
          },
          "buffer_raster": {
            "name": "Zone tampon raster",
            "description": "Crée une zone tampon binaire autour des cellules raster non nulles et non NoData dans une distance spécifiée.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster en entrée dont les cellules non nulles sont les cibles du tampon."
              },
              "buffer_size": {
                "label": "Taille de tampon",
                "description": "Seuil de distance du tampon."
              },
              "grid_cell_units": {
                "label": "Unités en cellules de grille",
                "description": "Si vrai, interprète buffer_size en unités de cellules de grille au lieu d'unités carte."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "cost_allocation": {
            "name": "Affectation de coût",
            "description": "Affecte chaque cellule à une région source à l'aide d'un raster de liens arrière issu d'une analyse de distance de coût.",
            "params": {
              "source": {
                "label": "Source",
                "description": "Raster source avec des cellules sources positives."
              },
              "backlink": {
                "label": "Lien arrière",
                "description": "Raster de liens arrière issu de cost_distance."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "cost_distance": {
            "name": "Distance de coût",
            "description": "Calcule des rasters de coût de déplacement cumulé et de liens arrière à partir de surfaces de sources et de coûts.",
            "params": {
              "source": {
                "label": "Source",
                "description": "Raster source avec des cellules sources positives."
              },
              "cost": {
                "label": "Coût",
                "description": "Raster de coût/friction."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du raster de coût accumulé."
              },
              "backlink_output": {
                "label": "Lien arrière en sortie",
                "description": "Chemin de sortie optionnel du raster de liens arrière."
              }
            }
          },
          "cost_pathway": {
            "name": "Chemin de coût",
            "description": "Trace les chemins de moindre coût à partir des cellules de destination à l'aide d'un raster de liens arrière.",
            "params": {
              "destination": {
                "label": "Destination",
                "description": "Raster de destinations avec des cellules de destination positives."
              },
              "backlink": {
                "label": "Lien arrière",
                "description": "Raster de liens arrière issu de cost_distance."
              },
              "zero_background": {
                "label": "Fond à zéro",
                "description": "Si vrai, le fond de la sortie est zéro au lieu de NoData."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "euclidean_allocation": {
            "name": "Affectation euclidienne",
            "description": "Attribue à chaque cellule valide la valeur de la cellule cible non nulle la plus proche.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster en entrée avec des cellules cibles non nulles."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "euclidean_distance": {
            "name": "Distance euclidienne",
            "description": "Calcule la distance euclidienne à la cellule cible non nulle la plus proche d'un raster.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster en entrée avec des cellules cibles non nulles."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "abs": {
            "name": "Valeur absolue",
            "description": "Calcule la valeur absolue de chaque cellule raster.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "aggregate_raster": {
            "name": "Agréger le raster",
            "description": "Réduit la résolution d'un raster en agrégeant des blocs par moyenne, somme, min, max ou étendue.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster en entrée."
              },
              "aggregation_factor": {
                "label": "Facteur d'agrégation",
                "description": "Taille de bloc en cellules sources."
              },
              "aggregation_type": {
                "label": "Type d'agrégation",
                "description": "L'un de mean, sum, maximum, minimum ou range."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "anova": {
            "name": "ANOVA",
            "description": "Effectue une ANOVA à un facteur sur les valeurs raster regroupées selon les catégories d'un raster de classes.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster de mesures."
              },
              "features": {
                "label": "Entités",
                "description": "Chemin du raster de classes/catégories."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du rapport HTML (alias : output_html_file)."
              }
            }
          },
          "arccos": {
            "name": "Arc cosinus",
            "description": "Calcule le cosinus inverse (arccos) de chaque cellule raster.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "arcosh": {
            "name": "Arc cosinus hyperbolique",
            "description": "Calcule le cosinus hyperbolique inverse de chaque cellule raster.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "arcsin": {
            "name": "Arc sinus",
            "description": "Calcule le sinus inverse (arcsin) de chaque cellule raster.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "arctan": {
            "name": "Arc tangente",
            "description": "Calcule la tangente inverse (arctan) de chaque cellule raster.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "arsinh": {
            "name": "Arc sinus hyperbolique",
            "description": "Calcule le sinus hyperbolique inverse de chaque cellule raster.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "artanh": {
            "name": "Arc tangente hyperbolique",
            "description": "Calcule la tangente hyperbolique inverse de chaque cellule raster.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "atan2": {
            "name": "Atan2",
            "description": "Calcule la tangente inverse à quatre quadrants à l'aide de deux rasters, cellule par cellule.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Premier raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Second raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, la sortie reste en mémoire et est renvoyée sous forme de référence raster memory://."
              }
            }
          },
          "block_maximum": {
            "name": "Maximum par bloc",
            "description": "Rastérise des entités ponctuelles en attribuant la valeur maximale observée dans chaque cellule de sortie.",
            "params": {
              "points": {
                "label": "Points",
                "description": "Couche vectorielle de points en entrée."
              },
              "field_name": {
                "label": "Nom du champ",
                "description": "Champ attributaire numérique optionnel à rasteriser ; par défaut repli sur le FID."
              },
              "use_z": {
                "label": "Utiliser Z",
                "description": "Utiliser les valeurs Z de la géométrie des points au lieu des attributs."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule de sortie lorsque base_raster n'est pas fourni."
              },
              "base_raster": {
                "label": "Raster de base",
                "description": "Raster de base optionnel contrôlant la géométrie de sortie."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "block_minimum": {
            "name": "Minimum par bloc",
            "description": "Rastérise des entités ponctuelles en attribuant la valeur minimale observée dans chaque cellule de sortie.",
            "params": {
              "points": {
                "label": "Points",
                "description": "Couche vectorielle de points en entrée."
              },
              "field_name": {
                "label": "Nom du champ",
                "description": "Champ attributaire numérique optionnel à rasteriser ; par défaut repli sur le FID."
              },
              "use_z": {
                "label": "Utiliser Z",
                "description": "Utiliser les valeurs Z de la géométrie des points au lieu des attributs."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule de sortie lorsque base_raster n'est pas fourni."
              },
              "base_raster": {
                "label": "Raster de base",
                "description": "Raster de base optionnel contrôlant la géométrie de sortie."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "boundary_shape_complexity": {
            "name": "Complexité de forme de la limite",
            "description": "Calcule la complexité de forme des limites des taches raster à l'aide d'une métrique de branches du squelette obtenu par amincissement.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster d'identifiants de taches en entrée avec des identifiants entiers positifs."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "ceil": {
            "name": "Plafond",
            "description": "Arrondit chaque cellule raster à l'entier supérieur.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "centroid_raster": {
            "name": "Centroïde raster",
            "description": "Calcule la cellule centroïde de chaque identifiant de tache à valeur positive d'un raster.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster de taches en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "clip_raster_to_polygon": {
            "name": "Découper le raster selon un polygone",
            "description": "Découpe un raster selon l'étendue de polygones ; les cellules hors des polygones sont mises à NoData.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster en entrée."
              },
              "polygons": {
                "label": "Polygones",
                "description": "Couche vectorielle de polygones en entrée."
              },
              "maintain_dimensions": {
                "label": "Conserver les dimensions",
                "description": "Préserver les dimensions du raster d'origine au lieu de rogner à l'emprise du polygone."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "clump": {
            "name": "Regrouper",
            "description": "Regroupe les cellules raster contiguës de même valeur en identifiants de taches uniques.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster catégoriel en entrée."
              },
              "diag": {
                "label": "Diagonale",
                "description": "Si vrai, inclut la connectivité diagonale (8 voisins) ; sinon utilise 4 voisins."
              },
              "zero_background": {
                "label": "Fond à zéro",
                "description": "Si vrai, traite les cellules de valeur nulle comme fond et les conserve à zéro en sortie."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "cos": {
            "name": "Cosinus",
            "description": "Calcule le cosinus de la valeur de chaque cellule raster.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "cosh": {
            "name": "Cosinus hyperbolique",
            "description": "Calcule le cosinus hyperbolique de chaque cellule raster.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "create_plane": {
            "name": "Créer un plan",
            "description": "Crée un raster à partir d'une équation de plan en utilisant la géométrie d'un raster de base.",
            "params": {
              "base": {
                "label": "Base",
                "description": "Raster de base définissant la géométrie de sortie."
              },
              "gradient": {
                "label": "Gradient",
                "description": "Gradient de pente du plan en degrés."
              },
              "aspect": {
                "label": "Exposition",
                "description": "Exposition du plan en degrés."
              },
              "constant": {
                "label": "Constante",
                "description": "Terme constant additif de l'équation du plan."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "crispness_index": {
            "name": "Indice de netteté",
            "description": "Calcule l'indice de netteté (crispness) d'un raster de probabilités d'appartenance.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du rapport HTML (alias : output_html_file)."
              }
            }
          },
          "cross_tabulation": {
            "name": "Tabulation croisée",
            "description": "Effectue une tabulation croisée de deux rasters catégoriels.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Chemin du raster 1 en entrée."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Chemin du raster 2 en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du rapport HTML (alias : output_html_file)."
              }
            }
          },
          "cumulative_distribution": {
            "name": "Distribution cumulée",
            "description": "Convertit les valeurs raster en probabilités de distribution cumulée.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "dbscan": {
            "name": "DBSCAN",
            "description": "Effectue un regroupement non supervisé par densité DBSCAN sur une pile de rasters en entrée.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Liste délimitée par des virgules/points-virgules ou tableau JSON de chemins de rasters en entrée (bandes de caractéristiques)."
              },
              "scaling_method": {
                "label": "Méthode de mise à l'échelle",
                "description": "Mise à l'échelle des caractéristiques : 'none' (par défaut), 'normalize' (plage 0-1) ou 'standardize' (scores z)."
              },
              "search_distance": {
                "label": "Distance de recherche",
                "description": "Epsilon : rayon de recherche du voisinage dans l'espace des caractéristiques (par défaut 1.0)."
              },
              "min_points": {
                "label": "Points minimaux",
                "description": "Nombre minimal de voisins dans epsilon pour un point central (par défaut 5)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du raster d'étiquettes d'identifiants de grappes."
              }
            }
          },
          "decrement": {
            "name": "Décrément",
            "description": "Soustrait une valeur (1.0 par défaut) de chaque cellule raster non NoData.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "value": {
                "label": "Valeur",
                "description": "Quantité à soustraire de chaque cellule. Par défaut 1.0."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "edge_proportion": {
            "name": "Proportion de bordure",
            "description": "Calcule la proportion de cellules de bordure de chaque tache et reporte cette valeur sur les cellules de la tache.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster d'identifiants de taches en entrée avec des identifiants entiers positifs."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "equal_to": {
            "name": "Égal à",
            "description": "Teste si deux rasters sont égaux cellule par cellule.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Premier raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Second raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, la sortie reste en mémoire et est renvoyée sous forme de référence raster memory://."
              }
            }
          },
          "erase_polygon_from_raster": {
            "name": "Effacer un polygone du raster",
            "description": "Met à NoData les cellules raster situées dans des polygones tout en préservant les cellules situées dans les trous des polygones.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster en entrée."
              },
              "polygons": {
                "label": "Polygones",
                "description": "Couche vectorielle de polygones en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "exp": {
            "name": "Exponentielle",
            "description": "Calcule e élevé à la puissance de chaque cellule raster.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "exp2": {
            "name": "Exponentielle base 2",
            "description": "Calcule 2 élevé à la puissance de chaque cellule raster.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "fft_random_field": {
            "name": "Champ aléatoire FFT",
            "description": "Crée un champ aléatoire spatialement autocorrélé par synthèse spectrale FFT.",
            "params": {
              "base_raster": {
                "label": "Raster de base",
                "description": "Chemin du raster de base utilisé pour la géométrie de la grille."
              },
              "range": {
                "label": "Plage",
                "description": "Portée de corrélation approximative en unités carte. Par défaut : 1.0."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "filter_raster_features_by_area": {
            "name": "Filtrer les entités raster par superficie",
            "description": "Supprime les entités raster étiquetées par des entiers dont la taille est inférieure à un seuil de nombre de cellules.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster en entrée contenant des étiquettes de classes entières."
              },
              "threshold": {
                "label": "Seuil",
                "description": "Taille minimale d'entité en cellules à conserver."
              },
              "zero_background": {
                "label": "Fond à zéro",
                "description": "Si vrai, les entités supprimées reçoivent 0 ; sinon elles reçoivent NoData."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel. S'il est omis, le résultat est conservé en mémoire."
              }
            }
          },
          "find_patch_edge_cells": {
            "name": "Trouver les cellules de bordure de tache",
            "description": "Identifie les cellules de bordure de chaque identifiant de tache raster positif ; les cellules de tache hors bordure sont mises à zéro.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster d'identifiants de taches en entrée ; les valeurs positives sont traitées comme cellules de taches."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "floor": {
            "name": "Plancher",
            "description": "Arrondit chaque cellule raster à l'entier inférieur.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "greater_than": {
            "name": "Supérieur à",
            "description": "Teste si le premier raster est supérieur au second cellule par cellule.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Premier raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Second raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, la sortie reste en mémoire et est renvoyée sous forme de référence raster memory://."
              }
            }
          },
          "heat_map": {
            "name": "Carte de chaleur",
            "description": "Génère un raster de carte de chaleur par densité de noyau à partir d'occurrences ponctuelles.",
            "params": {
              "points": {
                "label": "Points",
                "description": "Couche vectorielle de points en entrée."
              },
              "field_name": {
                "label": "Nom du champ",
                "description": "Champ de poids numérique optionnel ; par défaut occurrences non pondérées."
              },
              "bandwidth": {
                "label": "Largeur de bande",
                "description": "Largeur de bande du noyau en unités carte."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule de sortie lorsque base_raster n'est pas fourni."
              },
              "base_raster": {
                "label": "Raster de base",
                "description": "Raster de base optionnel contrôlant la géométrie de sortie."
              },
              "kernel_function": {
                "label": "Fonction de noyau",
                "description": "Type de fonction de noyau ; par défaut quartic."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "idw_interpolation": {
            "name": "Interpolation IDW",
            "description": "Interpole un raster à partir d'échantillons ponctuels par pondération par l'inverse de la distance.",
            "params": {
              "points": {
                "label": "Points",
                "description": "Couche vectorielle de points en entrée."
              },
              "field_name": {
                "label": "Nom du champ",
                "description": "Champ attributaire numérique optionnel ; par défaut repli sur le FID."
              },
              "use_z": {
                "label": "Utiliser Z",
                "description": "Utiliser les valeurs Z de la géométrie des points au lieu des attributs."
              },
              "weight": {
                "label": "Poids",
                "description": "Exposant de distance IDW ; par défaut 2.0."
              },
              "radius": {
                "label": "Rayon",
                "description": "Rayon de voisinage optionnel en unités carte ; <=0 utilise le repli par k plus proches voisins."
              },
              "min_points": {
                "label": "Points minimaux",
                "description": "Nombre minimal de voisins à utiliser ; par défaut 0."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule de sortie lorsque base_raster n'est pas fourni."
              },
              "base_raster": {
                "label": "Raster de base",
                "description": "Raster de base optionnel contrôlant la géométrie de sortie."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "image_autocorrelation": {
            "name": "Autocorrélation d'image",
            "description": "Calcule l'indice de Moran (I de Moran) pour une ou plusieurs images raster.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Liste des chemins de rasters en entrée."
              },
              "contiguity": {
                "label": "Contiguïté",
                "description": "Règle de voisinage : rook, king/queen ou bishop."
              }
            }
          },
          "image_correlation": {
            "name": "Corrélation d'images",
            "description": "Calcule la matrice de corrélation de Pearson de deux images raster ou plus.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Liste des chemins de rasters en entrée."
              }
            }
          },
          "image_regression": {
            "name": "Régression d'images",
            "description": "Effectue une régression linéaire bivariée entre deux rasters et produit un raster de résidus et un rapport.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Chemin du raster de la variable indépendante."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Chemin du raster de la variable dépendante."
              },
              "standardize_residuals": {
                "label": "Standardiser les résidus",
                "description": "Indique s'il faut standardiser les résidus par l'erreur type du modèle."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du raster des résidus."
              }
            }
          },
          "increment": {
            "name": "Incrément",
            "description": "Ajoute une valeur (1.0 par défaut) à chaque cellule raster non NoData.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "value": {
                "label": "Valeur",
                "description": "Valeur à ajouter à chaque cellule. Par défaut 1.0."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "inplace_add": {
            "name": "Addition sur place",
            "description": "Effectue une addition sur place (input1 += input2).",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Raster d'entrée à modifier."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Chemin du raster en entrée ou constante numérique."
              }
            }
          },
          "inplace_divide": {
            "name": "Division sur place",
            "description": "Effectue une division sur place (input1 /= input2).",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Raster d'entrée à modifier."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Chemin du raster en entrée ou constante numérique non nulle."
              }
            }
          },
          "inplace_multiply": {
            "name": "Multiplication sur place",
            "description": "Effectue une multiplication sur place (input1 *= input2).",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Raster d'entrée à modifier."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Chemin du raster en entrée ou constante numérique."
              }
            }
          },
          "inplace_subtract": {
            "name": "Soustraction sur place",
            "description": "Effectue une soustraction sur place (input1 -= input2).",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Raster d'entrée à modifier."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Chemin du raster en entrée ou constante numérique."
              }
            }
          },
          "integer_division": {
            "name": "Division entière",
            "description": "Divise deux rasters et tronque chaque résultat vers zéro.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Premier raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Second raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, la sortie reste en mémoire et est renvoyée sous forme de référence raster memory://."
              }
            }
          },
          "inverse_pca": {
            "name": "ACP inverse",
            "description": "Reconstitue les images de bandes d'origine à partir des rasters de composantes ACP à l'aide des vecteurs propres stockés.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Chemins des rasters de composantes."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "pca_report": {
                "label": "Rapport ACP",
                "description": "Chaîne du rapport JSON issue de l'ACP."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie de base optionnel."
              }
            }
          },
          "is_nodata": {
            "name": "Est NoData",
            "description": "Produit 1 pour les cellules NoData et 0 pour toutes les cellules valides.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "kappa_index": {
            "name": "Indice kappa",
            "description": "Calcule le kappa de Cohen et des métriques d'accord entre deux rasters catégoriels.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Chemin du raster de classification en entrée."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Chemin du raster de référence en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du rapport HTML (alias : output_html_file)."
              }
            }
          },
          "ks_normality_test": {
            "name": "Test de normalité KS",
            "description": "Évalue si les valeurs raster sont issues d'une distribution normale.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée."
              },
              "num_samples": {
                "label": "Nombre d'échantillons",
                "description": "Taille d'échantillon aléatoire optionnelle. Omettre pour utiliser toutes les cellules valides."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du rapport HTML (alias : output_html_file)."
              }
            }
          },
          "less_than": {
            "name": "Inférieur à",
            "description": "Teste si le premier raster est inférieur au second cellule par cellule.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Premier raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Second raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, la sortie reste en mémoire et est renvoyée sous forme de référence raster memory://."
              }
            }
          },
          "list_unique_values_raster": {
            "name": "Lister les valeurs uniques (raster)",
            "description": "Liste les catégories raster valides uniques et leurs fréquences.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin CSV de sortie optionnel."
              },
              "strict_parity": {
                "label": "Parité stricte",
                "description": "Si vrai, renvoie la sortie complète des fréquences de catégories (par défaut vrai)."
              },
              "max_values": {
                "label": "Valeurs maximales",
                "description": "Nombre maximal de valeurs uniques à inclure lorsque strict_parity est faux (par défaut 10000)."
              }
            }
          },
          "ln": {
            "name": "Logarithme népérien",
            "description": "Calcule le logarithme naturel de chaque cellule raster.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "log10": {
            "name": "Logarithme base 10",
            "description": "Calcule le logarithme en base 10 de chaque cellule raster.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "log2": {
            "name": "Logarithme base 2",
            "description": "Calcule le logarithme en base 2 de chaque cellule raster.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "map_features": {
            "name": "Cartographier les entités",
            "description": "Cartographie les formes de terrain surélevées distinctes d'un raster par croissance de régions à priorité décroissante.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster en entrée."
              },
              "min_feature_height": {
                "label": "Hauteur minimale d'entité",
                "description": "Séparation verticale minimale pour les entités indépendantes."
              },
              "min_feature_size": {
                "label": "Taille minimale d'entité",
                "description": "Taille minimale d'entité en cellules."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "max": {
            "name": "Maximum",
            "description": "Effectue une opération MAX sur deux rasters ou sur un raster et une valeur constante.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Chemin du premier raster ou constante numérique."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Chemin du second raster ou constante numérique."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "min": {
            "name": "Minimum",
            "description": "Effectue une opération MIN sur deux rasters ou sur un raster et une valeur constante.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Chemin du premier raster ou constante numérique."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Chemin du second raster ou constante numérique."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "modified_shepard_interpolation": {
            "name": "Interpolation de Shepard modifiée",
            "description": "Interpole un raster à partir d'échantillons ponctuels par mélange de Shepard modifié pondéré localement.",
            "params": {
              "points": {
                "label": "Points",
                "description": "Couche vectorielle de points en entrée."
              },
              "field_name": {
                "label": "Nom du champ",
                "description": "Champ attributaire numérique optionnel ; par défaut repli sur le FID."
              },
              "use_z": {
                "label": "Utiliser Z",
                "description": "Utiliser les valeurs Z de la géométrie des points au lieu des attributs."
              },
              "weight": {
                "label": "Poids",
                "description": "Exposant de pondération de Shepard ; par défaut 2.0."
              },
              "radius": {
                "label": "Rayon",
                "description": "Rayon de voisinage optionnel en unités carte."
              },
              "min_points": {
                "label": "Points minimaux",
                "description": "Nombre minimal de voisins ; par défaut 8."
              },
              "use_quadratic_basis": {
                "label": "Utiliser une base quadratique",
                "description": "Applique des corrections de base quadratique locale (mode compatible avec l'ancienne version)."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule de sortie lorsque base_raster n'est pas fourni."
              },
              "base_raster": {
                "label": "Raster de base",
                "description": "Raster de base optionnel contrôlant la géométrie de sortie."
              },
              "use_data_hull": {
                "label": "Utiliser l'enveloppe des données",
                "description": "Limiter l'interpolation à l'enveloppe convexe des points."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "narrowness_index": {
            "name": "Indice d'étroitesse",
            "description": "Calcule l'indice d'étroitesse des taches raster comme la surface divisée par la surface du plus grand cercle inscrit, fondée sur la distance maximale au bord.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster d'identifiants de taches en entrée avec des identifiants entiers positifs."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "negate": {
            "name": "Négation",
            "description": "Change le signe de la valeur de chaque cellule raster non NoData.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "nibble": {
            "name": "Nibble",
            "description": "Remplit les zones de fond par allocation au plus proche voisin.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster d'entrée à grignoter."
              },
              "mask": {
                "label": "Masque",
                "description": "Raster de masque binaire."
              },
              "use_nodata": {
                "label": "Utiliser NoData",
                "description": "Traite le NoData d'entrée comme une valeur de classe (et non comme de l'arrière-plan)."
              },
              "nibble_nodata": {
                "label": "Grignoter NoData",
                "description": "Grignote également dans les zones NoData hors masque."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "not_equal_to": {
            "name": "Différent de",
            "description": "Teste si deux rasters sont différents cellule par cellule.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Premier raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Second raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, la sortie reste en mémoire et est renvoyée sous forme de référence raster memory://."
              }
            }
          },
          "paired_sample_t_test": {
            "name": "Test t pour échantillons appariés",
            "description": "Effectue un test t sur échantillons appariés sur deux rasters à l'aide des cellules valides appariées.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Chemin du premier raster en entrée."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Chemin du second raster en entrée."
              },
              "num_samples": {
                "label": "Nombre d'échantillons",
                "description": "Taille d'échantillon optionnelle avec remise."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du rapport HTML (alias : output_html_file)."
              }
            }
          },
          "phi_coefficient": {
            "name": "Coefficient phi",
            "description": "Effectue une évaluation de l'accord de classification binaire à l'aide du coefficient phi.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Chemin du premier raster binaire."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Chemin du second raster binaire."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du rapport HTML (alias : output_html_file)."
              }
            }
          },
          "principal_component_analysis": {
            "name": "Analyse en composantes principales",
            "description": "Effectue une ACP sur une pile de rasters et renvoie les images des composantes et un rapport JSON.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Chemins des rasters en entrée (≥3)."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "num_components": {
                "label": "Nombre de composantes",
                "description": "Nombre de composantes. Par défaut : toutes."
              },
              "standardized": {
                "label": "Standardisé",
                "description": "Utilise la matrice de corrélation. Par défaut : faux."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie de base optionnel."
              }
            }
          },
          "print_geotiff_tags": {
            "name": "Afficher les balises GeoTIFF",
            "description": "Produit un rapport texte décrivant les balises TIFF/GeoTIFF et les principales métadonnées d'un raster de la famille GeoTIFF en entrée.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée."
              }
            }
          },
          "quantiles": {
            "name": "Quantiles",
            "description": "Transforme les valeurs raster en classes de quantiles.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée."
              },
              "num_quantiles": {
                "label": "Nombre de quantiles",
                "description": "Nombre de quantiles (par défaut 5)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "radial_basis_function_interpolation": {
            "name": "Interpolation par fonctions de base radiale",
            "description": "Interpole un raster à partir d'échantillons ponctuels par pondération locale de similarité à base radiale.",
            "params": {
              "points": {
                "label": "Points",
                "description": "Couche vectorielle de points en entrée."
              },
              "field_name": {
                "label": "Nom du champ",
                "description": "Champ attributaire numérique optionnel ; par défaut repli sur le FID."
              },
              "use_z": {
                "label": "Utiliser Z",
                "description": "Utiliser les valeurs Z de la géométrie des points au lieu des attributs."
              },
              "approximate_mode": {
                "label": "Mode approximatif",
                "description": "Si vrai, utilise la pondération approchée rapide NG ; si faux, résout les systèmes RBF locaux (à l'ancienne)."
              },
              "radius": {
                "label": "Rayon",
                "description": "Rayon de voisinage optionnel en unités carte."
              },
              "min_points": {
                "label": "Points minimaux",
                "description": "Nombre minimal de voisins à utiliser."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule de sortie lorsque base_raster n'est pas fourni."
              },
              "base_raster": {
                "label": "Raster de base",
                "description": "Raster de base optionnel contrôlant la géométrie de sortie."
              },
              "func_type": {
                "label": "Type de fonction",
                "description": "Type de base radiale (thinplatespline, polyharmonic, gaussian, multiquadric, inversemultiquadric)."
              },
              "poly_order": {
                "label": "Ordre du polynôme",
                "description": "Indication d'ordre polynomial (none, constant, quadratic)."
              },
              "weight": {
                "label": "Poids",
                "description": "Paramètre de forme/exposant de la base selon func_type."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "radius_of_gyration": {
            "name": "Rayon de giration",
            "description": "Calcule le rayon de giration par tache et reporte les valeurs sur les cellules de la tache.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster d'identifiants de taches en entrée avec des identifiants entiers positifs."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "random_field": {
            "name": "Champ aléatoire",
            "description": "Crée un raster contenant des valeurs aléatoires suivant la loi normale centrée réduite.",
            "params": {
              "base": {
                "label": "Base",
                "description": "Chemin du raster de base utilisé pour la géométrie de la grille."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "random_forest_classification_fit": {
            "name": "Ajuster la classification par forêt aléatoire",
            "description": "Ajuste un modèle de classification par forêt aléatoire et renvoie les octets du modèle sérialisé.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Tableau de rasters monobandes en entrée."
              },
              "training_data": {
                "label": "Données d'entraînement",
                "description": "Chemin des données d'entraînement vectorielles (points/polygones)."
              },
              "class_field": {
                "label": "Champ de classe",
                "description": "Champ de classe dans les attributs de training_data."
              },
              "scaling": {
                "label": "Mise à l'échelle",
                "description": "Mode de mise à l'échelle des caractéristiques : none (par défaut), normalize, standardize."
              },
              "split_criterion": {
                "label": "Critère de division",
                "description": "Indication de critère de division d'arbre (conservée pour la compatibilité ascendante)."
              },
              "n_trees": {
                "label": "Nombre d'arbres",
                "description": "Nombre d'arbres dans la forêt (par défaut 200)."
              },
              "min_samples_leaf": {
                "label": "Échantillons minimaux par feuille",
                "description": "Nombre minimal d'échantillons requis à un nœud feuille (par défaut 1)."
              },
              "min_samples_split": {
                "label": "Échantillons minimaux par division",
                "description": "Nombre minimal d'échantillons requis pour diviser un nœud interne (par défaut 2)."
              },
              "test_proportion": {
                "label": "Proportion de test",
                "description": "Argument de compatibilité héritée ; réservé à de futurs diagnostics."
              }
            }
          },
          "random_forest_classification_predict": {
            "name": "Prédire la classification par forêt aléatoire",
            "description": "Applique un modèle sérialisé de classification par forêt aléatoire à des prédicteurs multibandes.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Tableau de rasters monobandes en entrée."
              },
              "model_bytes": {
                "label": "Octets du modèle",
                "description": "Octets du modèle produits par random_forest_classification_fit."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "random_forest_regression_fit": {
            "name": "Ajuster la régression par forêt aléatoire",
            "description": "Ajuste un modèle de régression par forêt aléatoire et renvoie les octets du modèle sérialisé.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Tableau de rasters monobandes en entrée."
              },
              "training_data": {
                "label": "Données d'entraînement",
                "description": "Chemin des données d'entraînement vectorielles ponctuelles."
              },
              "field": {
                "label": "Champ",
                "description": "Champ cible numérique dans les attributs de training_data."
              },
              "scaling": {
                "label": "Mise à l'échelle",
                "description": "Mode de mise à l'échelle des caractéristiques : none (par défaut), normalize, standardize."
              },
              "n_trees": {
                "label": "Nombre d'arbres",
                "description": "Nombre d'arbres dans la forêt (par défaut 200)."
              },
              "min_samples_leaf": {
                "label": "Échantillons minimaux par feuille",
                "description": "Nombre minimal d'échantillons requis à un nœud feuille (par défaut 1)."
              },
              "min_samples_split": {
                "label": "Échantillons minimaux par division",
                "description": "Nombre minimal d'échantillons requis pour diviser un nœud interne (par défaut 2)."
              },
              "test_proportion": {
                "label": "Proportion de test",
                "description": "Argument de compatibilité héritée ; réservé à de futurs diagnostics."
              }
            }
          },
          "random_forest_regression_predict": {
            "name": "Prédire la régression par forêt aléatoire",
            "description": "Applique un modèle sérialisé de régression par forêt aléatoire à des prédicteurs multibandes.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Tableau de rasters monobandes en entrée."
              },
              "model_bytes": {
                "label": "Octets du modèle",
                "description": "Octets du modèle produits par random_forest_regression_fit."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "random_sample": {
            "name": "Échantillon aléatoire",
            "description": "Crée un raster contenant des cellules d'échantillonnage placées aléatoirement avec des identifiants uniques.",
            "params": {
              "base": {
                "label": "Base",
                "description": "Chemin du raster de base utilisé pour la géométrie de la grille et le masque des cellules valides."
              },
              "num_samples": {
                "label": "Nombre d'échantillons",
                "description": "Nombre de cellules d'échantillon à générer."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "raster_area": {
            "name": "Superficie du raster",
            "description": "Estime la surface des polygones raster par classe en unités de cellules de grille ou en unités cartographiques et écrit les totaux de classe dans chaque cellule de la classe.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster catégoriel en entrée."
              },
              "units": {
                "label": "Unités",
                "description": "Unités de surface : 'map units' (par défaut) ou 'grid cells'."
              },
              "zero_background": {
                "label": "Fond à zéro",
                "description": "Si vrai, les cellules de valeur zéro sont exclues de l'analyse."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "raster_calculator": {
            "name": "Calculatrice raster",
            "description": "Évalue une expression mathématique sur une liste de rasters en entrée, cellule par cellule.",
            "params": {
              "expression": {
                "label": "Expression",
                "description": "Expression mathématique avec des noms de variables raster entre guillemets."
              },
              "inputs": {
                "label": "Entrées",
                "description": "Chemins des rasters en entrée, dans l'ordre."
              },
              "auto_reproject": {
                "label": "Reprojection automatique",
                "description": "Si vrai (par défaut), reprojette automatiquement les rasters de la pile pour correspondre à inputs[0] lorsque le SCR diffère."
              },
              "auto_reproject_method": {
                "label": "Méthode de reprojection automatique",
                "description": "Méthode de rééchantillonnage de reprojection optionnelle : nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "raster_cell_assignment": {
            "name": "Affectation des cellules raster",
            "description": "Crée un raster dérivé d'un raster de base en attribuant à chaque cellule la valeur de ligne, de colonne, de x ou de y.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster de base en entrée."
              },
              "what_to_assign": {
                "label": "Valeur à affecter",
                "description": "Cible d'affectation : column, row, x ou y."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "raster_histogram": {
            "name": "Histogramme raster",
            "description": "Construit un histogramme à classes fixes pour les cellules raster valides.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du rapport HTML (alias : output_html_file)."
              },
              "bins": {
                "label": "Classes d'histogramme",
                "description": "Nombre de classes de l'histogramme (par défaut log2(rows*cols)+1)."
              }
            }
          },
          "raster_perimeter": {
            "name": "Périmètre du raster",
            "description": "Estime le périmètre des polygones raster par classe à l'aide d'une table de correspondance anticrénelage et écrit les totaux de classe dans chaque cellule de la classe.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster catégoriel en entrée."
              },
              "units": {
                "label": "Unités",
                "description": "Unités de périmètre : 'map units' (par défaut) ou 'grid cells'."
              },
              "zero_background": {
                "label": "Fond à zéro",
                "description": "Si vrai, les cellules de valeur zéro sont exclues de l'analyse."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "raster_summary_stats": {
            "name": "Statistiques résumées du raster",
            "description": "Calcule des statistiques de synthèse de base pour les cellules raster valides.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du rapport (.json ou .csv)."
              }
            }
          },
          "reciprocal": {
            "name": "Inverse",
            "description": "Calcule l'inverse (1/x) de chaque cellule raster.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "rescale_value_range": {
            "name": "Redimensionner la plage de valeurs",
            "description": "Remet à l'échelle linéairement les valeurs raster dans une plage cible.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée."
              },
              "out_min": {
                "label": "Minimum en sortie",
                "description": "Valeur minimale de sortie."
              },
              "out_max": {
                "label": "Maximum en sortie",
                "description": "Valeur maximale de sortie."
              },
              "clip_min": {
                "label": "Minimum d'écrêtage",
                "description": "Minimum d'entrée optionnel pour l'écrêtage avant remise à l'échelle."
              },
              "clip_max": {
                "label": "Maximum d'écrêtage",
                "description": "Maximum d'entrée optionnel pour l'écrêtage avant remise à l'échelle."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "root_mean_square_error": {
            "name": "Erreur quadratique moyenne",
            "description": "Calcule la RMSE et des statistiques de précision associées entre deux rasters.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster de comparaison."
              },
              "base": {
                "label": "Base",
                "description": "Chemin du raster de base."
              }
            }
          },
          "round": {
            "name": "Arrondir",
            "description": "Arrondit chaque cellule raster à l'entier le plus proche.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "shape_complexity_index_raster": {
            "name": "Indice de complexité de forme raster",
            "description": "Calcule la complexité de forme des taches raster à partir de la fréquence des transitions horizontales/verticales normalisée par l'étendue de la tache.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster d'identifiants de taches en entrée avec des identifiants entiers positifs."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "sieve": {
            "name": "Tamiser",
            "description": "Supprime les petites taches isolées sous un seuil de nombre de cellules.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster catégoriel en entrée."
              },
              "threshold": {
                "label": "Seuil",
                "description": "Taille minimale de tache en cellules à conserver."
              },
              "zero_background": {
                "label": "Fond à zéro",
                "description": "Met à zéro les cellules d'arrière-plan (valeur 0) dans la sortie."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "sin": {
            "name": "Sinus",
            "description": "Calcule le sinus de la valeur de chaque cellule raster.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "sinh": {
            "name": "Sinus hyperbolique",
            "description": "Calcule le sinus hyperbolique de chaque cellule raster.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "sqrt": {
            "name": "Racine carrée",
            "description": "Calcule la racine carrée de chaque cellule raster.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "square": {
            "name": "Carré",
            "description": "Élève au carré la valeur de chaque cellule raster.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "tan": {
            "name": "Tangente",
            "description": "Calcule la tangente de la valeur de chaque cellule raster.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "tanh": {
            "name": "Tangente hyperbolique",
            "description": "Calcule la tangente hyperbolique de chaque cellule raster.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "tin_interpolation": {
            "name": "Interpolation TIN",
            "description": "Interpole un raster à partir d'échantillons ponctuels par triangulation de Delaunay et interpolation plane au sein de chaque triangle.",
            "params": {
              "points": {
                "label": "Points",
                "description": "Couche vectorielle de points en entrée."
              },
              "field_name": {
                "label": "Nom du champ",
                "description": "Champ attributaire numérique optionnel ; par défaut repli sur le FID."
              },
              "use_z": {
                "label": "Utiliser Z",
                "description": "Utiliser les valeurs Z de la géométrie des points au lieu des attributs."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule de sortie lorsque base_raster n'est pas fourni."
              },
              "base_raster": {
                "label": "Raster de base",
                "description": "Raster de base optionnel contrôlant la géométrie de sortie."
              },
              "max_triangle_edge_length": {
                "label": "Longueur maximale d'arête de triangle",
                "description": "Longueur maximale autorisée optionnelle des arêtes de triangle en unités carte."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "to_degrees": {
            "name": "Vers degrés",
            "description": "Convertit chaque cellule raster des radians en degrés.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "to_radians": {
            "name": "Vers radians",
            "description": "Convertit chaque cellule raster des degrés en radians.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "trend_surface": {
            "name": "Surface de tendance",
            "description": "Ajuste une surface de tendance polynomiale à un raster par régression des moindres carrés.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée."
              },
              "polynomial_order": {
                "label": "Ordre du polynôme",
                "description": "Ordre polynomial 1–10. Par défaut : 1."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "trend_surface_vector_points": {
            "name": "Surface de tendance depuis des points vectoriels",
            "description": "Ajuste une surface de tendance polynomiale à des données vectorielles ponctuelles par régression des moindres carrés.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier vectoriel de points en entrée."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule du raster de sortie en unités carte."
              },
              "field_name": {
                "label": "Nom du champ",
                "description": "Champ attributaire des valeurs Z. Par défaut : 'FID'."
              },
              "polynomial_order": {
                "label": "Ordre du polynôme",
                "description": "Ordre polynomial 1–10. Par défaut : 1."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "truncate": {
            "name": "Tronquer",
            "description": "Tronque la valeur de chaque cellule raster à sa partie entière.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "turning_bands_simulation": {
            "name": "Simulation par bandes tournantes",
            "description": "Crée un champ aléatoire spatialement autocorrélé à l'aide de l'algorithme des bandes tournantes.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster de base."
              },
              "range": {
                "label": "Plage",
                "description": "Portée de corrélation en unités carte. Par défaut : 1.0."
              },
              "iterations": {
                "label": "Itérations",
                "description": "Nombre de directions de bandes. Par défaut : 1000."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "two_sample_ks_test": {
            "name": "Test KS à deux échantillons",
            "description": "Effectue un test de Kolmogorov-Smirnov à deux échantillons sur deux distributions de valeurs raster.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Chemin du premier raster en entrée."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Chemin du second raster en entrée."
              },
              "num_samples": {
                "label": "Nombre d'échantillons",
                "description": "Taille d'échantillon optionnelle avec remise par raster."
              }
            }
          },
          "wilcoxon_signed_rank_test": {
            "name": "Test des rangs signés de Wilcoxon",
            "description": "Effectue un test des rangs signés de Wilcoxon sur les différences raster appariées.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Chemin du premier raster en entrée."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Chemin du second raster en entrée."
              },
              "num_samples": {
                "label": "Nombre d'échantillons",
                "description": "Taille d'échantillon optionnelle avec remise."
              }
            }
          },
          "z_scores": {
            "name": "Scores Z",
            "description": "Standardise les valeurs raster en scores z à l'aide de la moyenne et de l'écart-type globaux.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "zonal_statistics": {
            "name": "Statistiques zonales",
            "description": "Résume les valeurs d'un raster de données au sein des zones définies par un raster d'entités.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster de données en entrée."
              },
              "features": {
                "label": "Entités",
                "description": "Chemin du raster de définition des zones."
              },
              "stat_type": {
                "label": "Type de statistique",
                "description": "Statistique : 'mean', 'median', 'min', 'max', 'range', 'standard deviation', 'diversity', 'total'. Par défaut : 'mean'."
              },
              "zero_is_background": {
                "label": "Zéro est le fond",
                "description": "Exclut les cellules de zone 0. Par défaut : faux."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "assess_route": {
            "name": "Évaluer un itinéraire",
            "description": "Segmente des lignes d'itinéraire et évalue des métriques de terrain par segment à partir d'un MNT.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "routes": {
                "label": "Itinéraires",
                "description": "Chemin du vecteur de polylignes d'itinéraires en entrée."
              },
              "search_radius": {
                "label": "Rayon de recherche",
                "description": "Rayon de recherche de visibilité en cellules de grille (par défaut 15, minimum 4)."
              },
              "segment_length": {
                "label": "Longueur de segment",
                "description": "Longueur cible des segments d'itinéraire en unités carte (par défaut 100.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel."
              }
            }
          },
          "breakline_mapping": {
            "name": "Cartographie des lignes de rupture",
            "description": "Cartographie les lignes de rupture par seuillage de la courbure (curvedness) transformée en logarithme et vectorisation des entités linéaires amincies.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "threshold": {
                "label": "Seuil",
                "description": "Seuil minimal de courbure logarithmique utilisé pour l'extraction des lignes de rupture (par défaut 0.8)."
              },
              "min_length": {
                "label": "Longueur minimale",
                "description": "Longueur minimale des lignes en sortie, en cellules de grille (par défaut 3)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de sortie optionnel (par défaut un .shp temporaire)."
              }
            }
          },
          "convergence_index": {
            "name": "Indice de convergence",
            "description": "Convergence/divergence des écoulements à partir de l'alignement local de l'exposition. Identifie les vallées (convergentes) et les crêtes (divergentes) sans routage complet des écoulements. Alternative efficace aux algorithmes de direction d'écoulement.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur de conversion Z."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel."
              }
            }
          },
          "dem_void_filling": {
            "name": "Comblement des vides du MNT",
            "description": "Comble les vides d'un MNT à l'aide d'une surface secondaire et de décalages d'altitude interpolés pour une fusion sans raccord.",
            "params": {
              "fill": {
                "label": "Remplir",
                "description": "Chemin du raster MNT de remplissage ou objet raster typé utilisé pour combler les vides."
              },
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT d'entrée (avec vides) ou objet raster typé."
              },
              "edge_treatment": {
                "label": "Traitement des bords",
                "description": "Traitement des bords de vides : 'dem', 'fill' ou 'average' (par défaut 'dem')."
              },
              "mean_plane_dist": {
                "label": "Distance au plan moyen",
                "description": "Distance en cellules depuis les bords des vides au-delà de laquelle les décalages prennent la valeur du décalage moyen global (par défaut 20)."
              },
              "weight_value": {
                "label": "Valeur de poids",
                "description": "Puissance d'interpolation par distance inverse pour l'interpolation des décalages près des bords (par défaut 2.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel."
              }
            }
          },
          "deviation_from_mean_elevation": {
            "name": "Écart à l'altitude moyenne",
            "description": "Calcule le score z topographique local à l'aide de la moyenne et de l'écart-type locaux.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "filter_size_x": {
                "label": "Taille du filtre X",
                "description": "Largeur impaire du filtre en cellules (par défaut 11). Alias : filterx."
              },
              "filter_size_y": {
                "label": "Taille du filtre Y",
                "description": "Hauteur impaire du filtre en cellules (par défaut filter_size_x). Alias : filtery."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat reste en mémoire."
              }
            }
          },
          "difference_from_mean_elevation": {
            "name": "Différence par rapport à l'altitude moyenne",
            "description": "Calcule la différence entre chaque altitude et l'altitude moyenne locale.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "filter_size_x": {
                "label": "Taille du filtre X",
                "description": "Largeur impaire du filtre en cellules (par défaut 11). Alias : filterx."
              },
              "filter_size_y": {
                "label": "Taille du filtre Y",
                "description": "Hauteur impaire du filtre en cellules (par défaut filter_size_x). Alias : filtery."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat reste en mémoire."
              }
            }
          },
          "directional_relief": {
            "name": "Relief directionnel",
            "description": "Calcule le relief directionnel par lancer de rayons sur l'altitude selon un azimut spécifié.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "azimuth": {
                "label": "Azimut",
                "description": "Azimut de direction en degrés dans le sens horaire depuis le nord."
              },
              "max_dist": {
                "label": "Distance maximale",
                "description": "Distance maximale optionnelle du rayon en unités carte."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel."
              }
            }
          },
          "elev_above_pit": {
            "name": "Hauteur au-dessus de la cuvette",
            "description": "Calcule l'altitude au-dessus de la cellule de cuvette aval la plus proche (ou du puits de bord).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel."
              }
            }
          },
          "elev_above_pit_dist": {
            "name": "Distance de la hauteur au-dessus de la cuvette",
            "description": "Alias de compatibilité pour elev_above_pit.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel."
              }
            }
          },
          "elevation_percentile": {
            "name": "Percentile d'altitude",
            "description": "Rang centile local de l'altitude dans le voisinage (0-100). Identifie les vallées (% faible), les crêtes (% élevé) et les versants (% intermédiaire). Métrique de classification des formes du relief indépendante de l'altitude absolue.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "filter_size_x": {
                "label": "Taille du filtre X",
                "description": "Largeur impaire du filtre en cellules (par défaut 11). Alias : filterx."
              },
              "filter_size_y": {
                "label": "Taille du filtre Y",
                "description": "Hauteur impaire du filtre en cellules (par défaut filter_size_x). Alias : filtery."
              },
              "sig_digits": {
                "label": "Chiffres significatifs",
                "description": "Nombre de décimales significatives à conserver lors du regroupement en classes (par défaut 2)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel."
              }
            }
          },
          "embankment_mapping": {
            "name": "Cartographie des remblais",
            "description": "Cartographie les remblais d'infrastructures de transport à partir d'un MNT et d'un réseau routier, avec suppression optionnelle de la surface des remblais par interpolation. Auteurs : John Lindsay et Nigel VanNieuwenhuizen.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "roads_vector": {
                "label": "Vecteur de routes",
                "description": "Chemin du vecteur de routes en entrée (géométrie de polylignes)."
              },
              "embankment_max_width": {
                "label": "Largeur maximale de remblai",
                "description": "Largeur maximale du remblai en unités carte (par défaut 60.0)."
              },
              "max_upwards_increment": {
                "label": "Incrément ascendant maximal",
                "description": "Incrément local ascendant maximal autorisé pendant la croissance (par défaut 0.05)."
              },
              "min_road_width": {
                "label": "Largeur minimale de route",
                "description": "Largeur minimale de route cartographiée en unités carte (par défaut 6.0)."
              },
              "remove_embankments": {
                "label": "Supprimer les remblais",
                "description": "Si vrai, produit en plus un MNT sans remblais par interpolation locale."
              },
              "search_dist": {
                "label": "Distance de recherche",
                "description": "Distance de repositionnement des germes de route en unités carte (par défaut 2.5)."
              },
              "spillout_slope": {
                "label": "Pente de débordement",
                "description": "Pente de débordement maximale en degrés pour les transitions montantes (par défaut 4.0)."
              },
              "typical_embankment_max_height": {
                "label": "Hauteur maximale typique de remblai",
                "description": "Hauteur maximale typique de remblai en unités d'altitude (par défaut 2.0)."
              },
              "typical_embankment_width": {
                "label": "Largeur typique de remblai",
                "description": "Largeur typique de remblai en unités carte (par défaut 30.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du masque de remblais."
              },
              "output_dem": {
                "label": "MNT en sortie",
                "description": "Chemin de sortie optionnel du MNT sans remblais lorsque remove_embankments=true."
              }
            }
          },
          "exposure_towards_wind_flux": {
            "name": "Exposition au flux du vent",
            "description": "Calcule l'exposition du terrain par rapport à la direction dominante du vent et à l'abri procuré par l'horizon au vent.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "azimuth": {
                "label": "Azimut",
                "description": "Azimut du vent dominant en degrés dans le sens horaire depuis le nord."
              },
              "max_dist": {
                "label": "Distance maximale",
                "description": "Distance de recherche maximale de l'angle d'horizon au vent, en unités carte."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur d'échelle verticale optionnel pour les MNT projetés."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel."
              }
            }
          },
          "feature_preserving_smoothing": {
            "name": "Lissage préservant les formes",
            "description": "Lisse la rugosité du MNT tout en préservant les ruptures de pente par filtrage des vecteurs normaux.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "filter_size": {
                "label": "Taille du filtre",
                "description": "Taille impaire du filtre en cellules (par défaut 11)."
              },
              "iterations": {
                "label": "Itérations",
                "description": "Nombre d'itérations de lissage (par défaut 3)."
              },
              "max_elevation_diff": {
                "label": "Différence d'élévation maximale",
                "description": "Variation verticale maximale autorisée par rapport au MNT d'origine (par défaut inf)."
              },
              "normal_diff_threshold": {
                "label": "Seuil de différence des normales",
                "description": "Différence d'angle des normales maximale en degrés (par défaut 8.0)."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur de conversion Z optionnel (par défaut 1.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat reste en mémoire."
              }
            }
          },
          "feature_preserving_smoothing_multiscale": {
            "name": "Lissage multi-échelle préservant les formes",
            "description": "Lisse la rugosité du MNT par une continuation multi-échelle du grossier au fin. Chaque échelle recalcule les normales, applique une diffusion robuste adaptative du champ de normales et reconstruit les altitudes par une résolution de Poisson écrantée.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "smoothing_amount": {
                "label": "Quantité de lissage",
                "description": "Intensité globale de lissage dans [0,1] (par défaut 0.65). Des valeurs plus élevées augmentent le budget de diffusion, en particulier aux échelles grossières."
              },
              "edge_preservation": {
                "label": "Préservation des bords",
                "description": "Force de préservation des bords dans [0,1] (par défaut 0.75). Des valeurs plus élevées suppriment plus fortement le lissage à travers les ruptures de pente majeures."
              },
              "scale_levels": {
                "label": "Niveaux d'échelle",
                "description": "Nombre de niveaux de pyramide pour le lissage du grossier vers le fin (par défaut 3)."
              },
              "fidelity": {
                "label": "Fidélité",
                "description": "Poids de fidélité aux données dans la reconstruction de Poisson filtrée (par défaut 0.45). Des valeurs plus élevées maintiennent le résultat plus proche du MNT source."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur de conversion Z optionnel (par défaut 1.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat reste en mémoire."
              }
            }
          },
          "fetch_analysis": {
            "name": "Analyse de fetch",
            "description": "Calcule la distance au vent jusqu'au premier obstacle topographique selon un azimut spécifié.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "azimuth": {
                "label": "Azimut",
                "description": "Azimut du vent en degrés dans le sens horaire depuis le nord."
              },
              "hgt_inc": {
                "label": "Incrément de hauteur",
                "description": "Seuil d'incrément de hauteur en m/m (par défaut 0.05)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel."
              }
            }
          },
          "fill_missing_data": {
            "name": "Combler les données manquantes",
            "description": "Comble les lacunes NoData par pondération par l'inverse de la distance à partir des cellules valides en bordure des lacunes.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster en entrée ou objet raster typé."
              },
              "exclude_edge_nodata": {
                "label": "Exclure les NoData de bordure",
                "description": "Exclut du remplissage les régions NoData connectées au bord (par défaut faux). Alias : no_edges."
              },
              "filter_size": {
                "label": "Taille du filtre",
                "description": "Rayon de recherche en cellules de grille (par défaut 11)."
              },
              "weight": {
                "label": "Poids",
                "description": "Exposant de puissance de la distance inverse (par défaut 2.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat reste en mémoire."
              }
            }
          },
          "find_ridges": {
            "name": "Trouver les crêtes",
            "description": "Identifie les cellules potentielles de crêtes et de sommets d'un MNT, avec amincissement optionnel des lignes.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "line_thin": {
                "label": "Amincissement des lignes",
                "description": "Applique un amincissement itératif des lignes (par défaut vrai)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel."
              }
            }
          },
          "hillshade": {
            "name": "Ombrage du relief",
            "description": "Visualisation d'ombrage du relief directionnel à source unique (niveaux de gris 0-255). Les paramètres d'azimut et d'altitude contrôlent la direction de la lumière. Visualisation rapide du terrain pour l'inspection de MNT et l'affichage cartographique.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster MNT en entrée"
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Exagération verticale appliquée aux altitudes"
              },
              "altitude": {
                "label": "Altitude",
                "description": "Hauteur d'illumination au-dessus de l'horizon en degrés"
              },
              "azimuth": {
                "label": "Azimut",
                "description": "Azimut d'illumination en degrés dans le sens horaire depuis le nord"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "hypsometrically_tinted_hillshade": {
            "name": "Ombrage du relief teinté hypsométriquement",
            "description": "Crée un rendu du terrain de style suisse en mélangeant un ombrage du relief multi-azimut, une teinte hypsométrique et une brume atmosphérique optionnelle.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Chemin du raster MNT en entrée."
              },
              "solar_altitude": {
                "label": "Altitude solaire",
                "description": "Hauteur solaire en degrés [0, 90]."
              },
              "hillshade_weight": {
                "label": "Poids de l'ombrage",
                "description": "Poids de fusion de l'ombrage dans [0, 1]."
              },
              "brightness": {
                "label": "Luminosité",
                "description": "Réglage de luminosité dans [0, 1]."
              },
              "atmospheric_effects": {
                "label": "Effets atmosphériques",
                "description": "Quantité de brume atmosphérique dans [0, 1]."
              },
              "palette": {
                "label": "Palette",
                "description": "Nom de la palette (atlas, high_relief, arid, soft, muted, viridis, dem, grey, white, etc.)."
              },
              "reverse_palette": {
                "label": "Inverser la palette",
                "description": "Inverse l'ordre de la palette."
              },
              "full_360_mode": {
                "label": "Mode 360° complet",
                "description": "Utilise une illumination à 8 directions au lieu du mode à 4 directions."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Multiplicateur d'exagération verticale."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie."
              }
            }
          },
          "local_hypsometric_analysis": {
            "name": "Analyse hypsométrique locale",
            "description": "Calcule l'intégrale hypsométrique locale minimale sur une gamme d'échelles de voisinage échantillonnée de façon non linéaire.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "min_scale": {
                "label": "Échelle minimale",
                "description": "Rayon minimal de demi-fenêtre en cellules (par défaut 4)."
              },
              "step_size": {
                "label": "Taille du pas",
                "description": "Pas de base en cellules (par défaut 1). Alias : step."
              },
              "num_steps": {
                "label": "Nombre de pas",
                "description": "Nombre d'échelles à évaluer (par défaut 10)."
              },
              "step_nonlinearity": {
                "label": "Non-linéarité des pas",
                "description": "Non-linéarité du pas d'échelle dans [1,4] (par défaut 1.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du raster du minimum local d'HI."
              },
              "output_scale": {
                "label": "Échelle en sortie",
                "description": "Chemin de sortie optionnel du raster de l'échelle du minimum d'HI."
              }
            }
          },
          "low_points_on_headwater_divides": {
            "name": "Points bas sur les lignes de partage de tête de bassin",
            "description": "Localise les cols bas le long des lignes de partage entre sous-bassins de tête voisins.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Chemin du raster MNT sans dépressions en entrée ou objet raster typé."
              },
              "streams": {
                "label": "Cours d'eau",
                "description": "Chemin du raster de cours d'eau en entrée (les valeurs positives indiquent les cellules de chenal)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de sortie optionnel (par défaut un .shp temporaire)."
              }
            }
          },
          "max_downslope_elev_change": {
            "name": "Changement d'altitude aval maximal",
            "description": "Calcule la plus grande dénivelée vers les cellules voisines plus basses.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel."
              }
            }
          },
          "max_upslope_elev_change": {
            "name": "Changement d'altitude amont maximal",
            "description": "Calcule le plus grand gain d'altitude vers les cellules voisines plus hautes.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel."
              }
            }
          },
          "min_downslope_elev_change": {
            "name": "Changement d'altitude aval minimal",
            "description": "Calcule la plus petite dénivelée non négative vers les cellules voisines.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel."
              }
            }
          },
          "multidirectional_hillshade": {
            "name": "Ombrage multidirectionnel",
            "description": "Ombrage du relief multidirectionnel (8+ sources lumineuses) éliminant les artefacts d'ombre d'une source unique. Visibilité équilibrée des entités en terrain complexe ; à privilégier pour les publications et l'analyse détaillée.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster MNT en entrée"
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Exagération verticale appliquée aux altitudes"
              },
              "altitude": {
                "label": "Altitude",
                "description": "Hauteur d'illumination au-dessus de l'horizon en degrés"
              },
              "full_360_mode": {
                "label": "Mode 360° complet",
                "description": "Combine 8 sources de lumière sur les 360 degrés complets au lieu des 4 par défaut"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie"
              }
            }
          },
          "num_downslope_neighbours": {
            "name": "Nombre de voisins aval",
            "description": "Compte le nombre de cellules du 8-voisinage plus basses que chaque cellule du MNT.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel."
              }
            }
          },
          "num_upslope_neighbours": {
            "name": "Nombre de voisins amont",
            "description": "Compte le nombre de cellules du 8-voisinage plus hautes que chaque cellule du MNT.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel."
              }
            }
          },
          "profile": {
            "name": "Profil",
            "description": "Crée un graphique HTML de profil altimétrique pour une ou plusieurs entités polylignes en entrée, échantillonnées sur un raster de surface.",
            "params": {
              "lines_vector": {
                "label": "Vecteur de lignes",
                "description": "Chemin du vecteur de polylignes en entrée."
              },
              "surface": {
                "label": "Surface",
                "description": "Chemin du raster de surface en entrée ou objet raster typé."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du rapport HTML en sortie."
              }
            }
          },
          "slope_vs_aspect_plot": {
            "name": "Graphique pente / exposition",
            "description": "Crée un graphique HTML d'analyse radiale pente/exposition pour un MNT en entrée.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "aspect_bin_size": {
                "label": "Taille de classe d'exposition",
                "description": "Taille de classe d'exposition en degrés (par défaut 2.0)."
              },
              "min_slope": {
                "label": "Pente minimale",
                "description": "Ignore les pentes inférieures à ce seuil en degrés (par défaut 0.1)."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur d'échelle verticale des valeurs d'altitude."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du rapport HTML en sortie."
              }
            }
          },
          "slope_vs_elev_plot": {
            "name": "Graphique pente / altitude",
            "description": "Crée un graphique HTML d'analyse pente/altitude pour un ou plusieurs MNT.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Chemins des MNT d'entrée sous forme de chaîne séparée par ';' ou ',', ou de liste."
              },
              "watershed": {
                "label": "Bassin versant",
                "description": "Rasters de bassins versants optionnels correspondant à chaque MNT d'entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du rapport HTML en sortie."
              }
            }
          },
          "surface_area_ratio": {
            "name": "Rapport de surface",
            "description": "Rapport surface 3D / surface planimétrique (méthode de Jenness). >1.0=terrain rugueux, ≈1.0=plat. Métrique de rugosité sans dimension permettant de comparer le terrain entre régions.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "topographic_hachures": {
            "name": "Hachures topographiques",
            "description": "Crée des polylignes de hachures topographiques à partir d'un MNT à l'aide de lignes d'écoulement aval et amont amorcées sur les courbes de niveau. L'attribution de paternité historique est intentionnellement conservée pour cet outil.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "base": {
                "label": "Base",
                "description": "Élévation de la courbe de base (par défaut 0.0)."
              },
              "depth": {
                "label": "Profondeur",
                "description": "Profondeur de remplissage récursif utilisée dans les zones divergentes (par défaut 16)."
              },
              "discretization": {
                "label": "Discrétisation",
                "description": "Longueur de pas des lignes d'écoulement en unités de cellule moyenne (par défaut 0.5)."
              },
              "distmax": {
                "label": "Distance max",
                "description": "Multiplicateur d'espacement maximal utilisé pour insérer des hachures supplémentaires (par défaut 2.0)."
              },
              "distmin": {
                "label": "Distance min",
                "description": "Multiplicateur d'espacement minimal utilisé pour tronquer les hachures voisines (par défaut 0.5)."
              },
              "interval": {
                "label": "Intervalle",
                "description": "Valeur de l'intervalle des courbes de niveau (par défaut 10.0)."
              },
              "separation": {
                "label": "Séparation",
                "description": "Séparation nominale des germes de courbes de niveau en unités de cellule moyenne (par défaut 2.0)."
              },
              "slopemin": {
                "label": "Pente min",
                "description": "Angle de pente minimal en degrés pour la poursuite du tracé (par défaut 0.5)."
              },
              "smooth": {
                "label": "Lisser",
                "description": "Taille du filtre de lissage des courbes de niveau (entier impair de préférence, par défaut 9)."
              },
              "tolerance": {
                "label": "Tolérance",
                "description": "Angle de courbure minimal en degrés conservé lors de la simplification des courbes de niveau (par défaut 10.0)."
              },
              "turnmax": {
                "label": "Virage max",
                "description": "Angle de virage maximal autorisé en degrés lors du tracé des hachures (par défaut 45.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "map_off_terrain_objects": {
            "name": "Cartographier les objets sur-terrain",
            "description": "Cartographie les segments d'objets hors terrain dans les MNS par croissance de régions contrainte par la pente et filtrage optionnel par taille minimale d'entité.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNS en entrée ou objet raster typé."
              },
              "max_slope": {
                "label": "Pente maximale",
                "description": "Pente de connexion maximale en degrés [1, 90] (par défaut inf, bornée à 90)."
              },
              "min_feature_size": {
                "label": "Taille minimale d'entité",
                "description": "Taille minimale de segment conservée en cellules (par défaut 0). Les segments plus petits sont affectés à la classe d'arrière-plan 1."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat reste en mémoire."
              }
            }
          },
          "remove_off_terrain_objects": {
            "name": "Supprimer les objets sur-terrain",
            "description": "Supprime les objets hors terrain abrupts des MNT par normalisation top-hat blanche, croissance de régions contrainte par la pente et interpolation locale.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "filter_size": {
                "label": "Taille du filtre",
                "description": "Largeur d'objet maximale attendue en cellules ; ramenée à une taille impaire >= 3 (par défaut 11)."
              },
              "slope_threshold": {
                "label": "Seuil de pente",
                "description": "Pente minimale des bords d'objet en degrés (par défaut 15.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat reste en mémoire."
              }
            }
          },
          "ridge_and_valley_vectors": {
            "name": "Vecteurs de crêtes et de vallées",
            "description": "Extrait des vecteurs d'axes centraux de crêtes et de vallées à partir d'un MNT.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée."
              },
              "filter_size": {
                "label": "Taille du filtre",
                "description": "Taille du voisinage pour le percentile d'altitude."
              },
              "ep_threshold": {
                "label": "Seuil EP",
                "description": "Seuil de percentile d'altitude [5, 50]."
              },
              "slope_threshold": {
                "label": "Seuil de pente",
                "description": "Seuil de pente minimal en degrés."
              },
              "min_length": {
                "label": "Longueur minimale",
                "description": "Longueur minimale d'axe médian en cellules."
              },
              "output_ridges": {
                "label": "Crêtes en sortie",
                "description": "Chemin de sortie des axes médians de crête."
              },
              "output_valleys": {
                "label": "Vallées en sortie",
                "description": "Chemin de sortie des axes médians de vallée."
              }
            }
          },
          "smooth_vegetation_residual": {
            "name": "Lisser le résidu de végétation",
            "description": "Réduit la rugosité résiduelle de la canopée en masquant les fortes réponses DEV locales aux petites échelles et en réinterpolant les altitudes masquées.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "max_scale": {
                "label": "Échelle maximale",
                "description": "Rayon maximal de demi-fenêtre DEV en cellules (par défaut 30)."
              },
              "dev_threshold": {
                "label": "Seuil de déviation",
                "description": "Magnitude DEV minimale utilisée pour marquer les cellules de rugosité (par défaut 1.0)."
              },
              "scale_threshold": {
                "label": "Seuil d'échelle",
                "description": "Échelle maximale considérée comme rugosité (par défaut 5)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat reste en mémoire."
              }
            }
          },
          "average_horizon_distance": {
            "name": "Distance moyenne à l'horizon",
            "description": "Calcule la distance moyenne à l'horizon sur l'ensemble des directions d'azimut.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Chemin du raster MNT/MNS en entrée."
              },
              "az_fraction": {
                "label": "Fraction d'azimut",
                "description": "Pas d'azimut en degrés [1, 45]."
              },
              "max_dist": {
                "label": "Distance maximale",
                "description": "Distance de recherche maximale en unités carte."
              },
              "observer_hgt_offset": {
                "label": "Décalage de hauteur de l'observateur",
                "description": "Décalage de hauteur de l'observateur au-dessus du terrain."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie."
              }
            }
          },
          "horizon_angle": {
            "name": "Angle d'horizon",
            "description": "Calcule l'angle d'horizon (pente maximale) selon une direction d'azimut spécifiée.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Chemin du raster MNT en entrée."
              },
              "azimuth": {
                "label": "Azimut",
                "description": "Azimut en degrés [0, 360)."
              },
              "max_dist": {
                "label": "Distance maximale",
                "description": "Distance de recherche maximale en unités carte."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie."
              }
            }
          },
          "horizon_area": {
            "name": "Aire d'horizon",
            "description": "Calcule la surface du polygone d'horizon (hectares).",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Chemin du raster MNT/MNS en entrée."
              },
              "az_fraction": {
                "label": "Fraction d'azimut",
                "description": "Pas d'azimut en degrés [1, 45]."
              },
              "max_dist": {
                "label": "Distance maximale",
                "description": "Distance de recherche maximale en unités carte."
              },
              "observer_hgt_offset": {
                "label": "Décalage de hauteur de l'observateur",
                "description": "Décalage de hauteur de l'observateur au-dessus du terrain."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie."
              }
            }
          },
          "openness": {
            "name": "Ouverture",
            "description": "Ouverture topographique de Yokoyama : métriques d'exposition positive (crêtes/sommets exposés) et négative (vallées encaissées). Classification des formes du relief et analyse de la visibilité/du microclimat.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "dist": {
                "label": "Distance",
                "description": "Distance de recherche en cellules (par défaut 20)."
              },
              "neg_output": {
                "label": "Sortie négative",
                "description": "Chemin de sortie optionnel de l'ouverture négative."
              },
              "pos_output": {
                "label": "Sortie positive",
                "description": "Chemin de sortie optionnel de l'ouverture positive."
              }
            }
          },
          "shadow_animation": {
            "name": "Animation d'ombres",
            "description": "Crée une visionneuse HTML interactive et un GIF animé montrant les ombres du terrain au cours d'une journée.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Chemin du raster MNT/MNS en entrée."
              },
              "date": {
                "label": "Date",
                "description": "Date au format DD/MM/YYYY."
              },
              "delay": {
                "label": "Délai",
                "description": "Délai GIF par image en millisecondes."
              },
              "image_height": {
                "label": "Hauteur de l'image",
                "description": "Hauteur de l'image affichée en pixels."
              },
              "label": {
                "label": "Étiquette",
                "description": "Étiquette optionnelle affichée dans la visionneuse."
              },
              "location": {
                "label": "Emplacement",
                "description": "Chaîne de localisation LAT/LON/UTC_OFFSET, par ex. 43.5448/-80.2482/-4."
              },
              "max_dist": {
                "label": "Distance maximale",
                "description": "Distance de recherche maximale de l'horizon en unités carte."
              },
              "palette": {
                "label": "Palette",
                "description": "Nom de la palette hypsométrique (par ex. soft, atlas, high_relief, turbo, viridis, dem, grey, white)."
              },
              "time_interval": {
                "label": "Intervalle de temps",
                "description": "Intervalle entre les images en minutes [1, 60]."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du HTML en sortie."
              }
            }
          },
          "shadow_image": {
            "name": "Image d'ombres",
            "description": "Génère un raster d'intensité des ombres du terrain pour une date, une heure et un lieu spécifiés.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Chemin du raster MNT/MNS en entrée."
              },
              "date": {
                "label": "Date",
                "description": "Date au format DD/MM/YYYY."
              },
              "location": {
                "label": "Emplacement",
                "description": "Chaîne de localisation LAT/LON/UTC_OFFSET, par ex. 43.5448/-80.2482/-4."
              },
              "max_dist": {
                "label": "Distance maximale",
                "description": "Distance de recherche maximale de l'horizon en unités carte."
              },
              "palette": {
                "label": "Palette",
                "description": "Nom de la palette hypsométrique (par ex. soft, atlas, high_relief, turbo, viridis, dem, grey, white)."
              },
              "time": {
                "label": "Heure",
                "description": "Heure locale au format HH:MM ou HH:MMAM/HH:MMPM."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "sky_view_factor": {
            "name": "Facteur de vue du ciel",
            "description": "Calcule la proportion de ciel visible à partir d'un MNT/MNS.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Chemin du raster MNT/MNS en entrée."
              },
              "az_fraction": {
                "label": "Fraction d'azimut",
                "description": "Pas d'azimut en degrés [1, 45]."
              },
              "max_dist": {
                "label": "Distance maximale",
                "description": "Distance de recherche maximale en unités carte."
              },
              "observer_hgt_offset": {
                "label": "Décalage de hauteur de l'observateur",
                "description": "Décalage de hauteur de l'observateur au-dessus du terrain."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie."
              }
            }
          },
          "skyline_analysis": {
            "name": "Analyse de la ligne d'horizon",
            "description": "Effectue une analyse de la ligne d'horizon pour un ou plusieurs points d'observation et écrit un tracé vectoriel de l'horizon ainsi qu'un rapport HTML.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Chemin du raster MNT/MNS en entrée."
              },
              "points": {
                "label": "Points",
                "description": "Chemin du vecteur de points en entrée."
              },
              "az_fraction": {
                "label": "Fraction d'azimut",
                "description": "Pas d'azimut en degrés [0.01, 45]."
              },
              "max_dist": {
                "label": "Distance maximale",
                "description": "Distance de recherche maximale en unités carte."
              },
              "observer_hgt_offset": {
                "label": "Décalage de hauteur de l'observateur",
                "description": "Décalage de hauteur de l'observateur au-dessus du terrain."
              },
              "output_as_polygons": {
                "label": "Sortie en polygones",
                "description": "Écrit les horizons sous forme de polygones plutôt que de polylignes."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              },
              "output_html": {
                "label": "HTML de sortie",
                "description": "Chemin optionnel du rapport HTML."
              }
            }
          },
          "time_in_daylight": {
            "name": "Durée d'ensoleillement",
            "description": "Calcule la proportion de la journée pendant laquelle chaque cellule est éclairée (hors de l'ombre du terrain/des objets).",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Chemin du raster MNT/MNS en entrée."
              },
              "az_fraction": {
                "label": "Fraction d'azimut",
                "description": "Taille de classe d'azimut en degrés (0, 360)."
              },
              "end_day": {
                "label": "Jour de fin",
                "description": "Jour de l'année de fin (1..366)."
              },
              "end_time": {
                "label": "Heure de fin",
                "description": "Heure de fin HH:MM:SS ou 'sunset'."
              },
              "latitude": {
                "label": "Latitude",
                "description": "Latitude de remplacement optionnelle en degrés ; sinon déduite du SCR du MNT."
              },
              "longitude": {
                "label": "Longitude",
                "description": "Longitude de remplacement optionnelle en degrés ; sinon déduite du SCR du MNT."
              },
              "max_dist": {
                "label": "Distance maximale",
                "description": "Distance de recherche maximale de l'horizon en unités carte."
              },
              "start_day": {
                "label": "Jour de début",
                "description": "Jour de l'année de début (1..366)."
              },
              "start_time": {
                "label": "Heure de début",
                "description": "Heure de début HH:MM:SS ou 'sunrise'."
              },
              "utc_offset": {
                "label": "Décalage UTC",
                "description": "Chaîne de décalage UTC optionnelle comme UTC+00:00 ; si omise, estimée à partir de la longitude centrale."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel."
              }
            }
          },
          "viewshed": {
            "name": "Bassin de visibilité",
            "description": "Calcule le nombre de stations visibles à partir de stations ponctuelles sur un MNT.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "stations": {
                "label": "Stations",
                "description": "Fichier vectoriel de points en entrée des stations d'observation."
              },
              "height": {
                "label": "Hauteur",
                "description": "Hauteur de la station d'observation au-dessus du sol en unités Z du MNT (par défaut 2.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel."
              }
            }
          },
          "visibility_index": {
            "name": "Indice de visibilité",
            "description": "Calcule un indice de visibilité fondé sur la topographie à partir de bassins de visibilité échantillonnés.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Chemin du raster MNT en entrée."
              },
              "max_dist": {
                "label": "Distance maximale",
                "description": "Distance de recherche de visibilité maximale en unités carte."
              },
              "resolution_factor": {
                "label": "Facteur de résolution",
                "description": "Facteur de résolution d'échantillonnage [1, 25]."
              },
              "station_height": {
                "label": "Hauteur de station",
                "description": "Hauteur de l'observateur au-dessus du sol."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie."
              }
            }
          },
          "accumulation_curvature": {
            "name": "Courbure d'accumulation",
            "description": "Calcule la courbure d'accumulation à partir d'un MNT.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur de conversion Z optionnel (par défaut 1.0). Alias : zfactor."
              },
              "log_transform": {
                "label": "Transformation logarithmique",
                "description": "Transformation logarithmique optionnelle des valeurs de sortie (par défaut faux). Alias : log."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "aspect": {
            "name": "Exposition",
            "description": "Direction de la pente maximale (0°=N, 90°=E, 180°=S, 270°=O). Essentielle pour l'analyse du rayonnement solaire, des motifs de végétation, du microclimat et de l'exposition.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur de conversion Z."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel."
              }
            }
          },
          "casorati_curvature": {
            "name": "Courbure de Casorati",
            "description": "Calcule la courbure de Casorati à partir d'un MNT.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur de conversion Z optionnel (par défaut 1.0). Alias : zfactor."
              },
              "log_transform": {
                "label": "Transformation logarithmique",
                "description": "Transformation logarithmique optionnelle des valeurs de sortie (par défaut faux). Alias : log."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "curvedness": {
            "name": "Courbure globale",
            "description": "Calcule le descripteur de forme de surface curvedness à partir d'un MNT.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur de conversion Z optionnel (par défaut 1.0). Alias : zfactor."
              },
              "log_transform": {
                "label": "Transformation logarithmique",
                "description": "Transformation logarithmique optionnelle des valeurs de sortie (par défaut faux). Alias : log."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "difference_curvature": {
            "name": "Courbure de différence",
            "description": "Calcule la courbure de différence à partir d'un MNT.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur de conversion Z optionnel (par défaut 1.0). Alias : zfactor."
              },
              "log_transform": {
                "label": "Transformation logarithmique",
                "description": "Transformation logarithmique optionnelle des valeurs de sortie (par défaut faux). Alias : log."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "gaussian_curvature": {
            "name": "Courbure gaussienne",
            "description": "Calcule la courbure gaussienne (intrinsèque) (produit des courbures principales). Indique la topologie locale de la surface : positive (cuvette/dôme), négative (selle), nulle (cylindrique). Classe le terrain en catégories de formes du relief : entités convexes (crêtes), entités concaves (vallées), entités en selle (cols/brèches). Utilisée dans la classification avancée des formes du relief.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur de conversion Z optionnel lorsque les unités verticales et horizontales diffèrent (par défaut 1.0). Alias : zfactor."
              },
              "log_transform": {
                "label": "Transformation logarithmique",
                "description": "Transformation logarithmique optionnelle des valeurs de sortie pour la lisibilité (par défaut faux). Alias : log."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "generating_function": {
            "name": "Fonction génératrice",
            "description": "Calcule la fonction génératrice à partir d'un MNT.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur de conversion Z optionnel (par défaut 1.0). Alias : zfactor."
              },
              "log_transform": {
                "label": "Transformation logarithmique",
                "description": "Transformation logarithmique optionnelle des valeurs de sortie (par défaut faux). Alias : log."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "horizontal_excess_curvature": {
            "name": "Courbure d'excès horizontal",
            "description": "Calcule la courbure horizontale excédentaire à partir d'un MNT.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur de conversion Z optionnel (par défaut 1.0). Alias : zfactor."
              },
              "log_transform": {
                "label": "Transformation logarithmique",
                "description": "Transformation logarithmique optionnelle des valeurs de sortie (par défaut faux). Alias : log."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "maximal_curvature": {
            "name": "Courbure maximale",
            "description": "Calcule la courbure maximale (courbure principale maximale) à partir d'un MNT.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur de conversion Z optionnel (par défaut 1.0). Alias : zfactor."
              },
              "log_transform": {
                "label": "Transformation logarithmique",
                "description": "Transformation logarithmique optionnelle des valeurs de sortie (par défaut faux). Alias : log."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "mean_curvature": {
            "name": "Courbure moyenne",
            "description": "Calcule la courbure moyenne (moyenne des courbures principales). Liée à la courbure totale, elle met toutefois l'accent sur la régularité de la surface. Des valeurs proches de 0 indiquent un terrain régulier ; des valeurs élevées des changements de courbure brusques. Utile pour la caractérisation de surface et la détection des lignes de rupture.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur de conversion Z optionnel lorsque les unités verticales et horizontales diffèrent (par défaut 1.0). Alias : zfactor."
              },
              "log_transform": {
                "label": "Transformation logarithmique",
                "description": "Transformation logarithmique optionnelle des valeurs de sortie pour la lisibilité (par défaut faux). Alias : log."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "minimal_curvature": {
            "name": "Courbure minimale",
            "description": "Calcule la courbure minimale (courbure principale minimale) à partir d'un MNT.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur de conversion Z optionnel (par défaut 1.0). Alias : zfactor."
              },
              "log_transform": {
                "label": "Transformation logarithmique",
                "description": "Transformation logarithmique optionnelle des valeurs de sortie (par défaut faux). Alias : log."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "plan_curvature": {
            "name": "Courbure planaire",
            "description": "Calcule la courbure en plan (des courbes de niveau), qui mesure la convergence/divergence des écoulements à travers les courbes de niveau. Les valeurs positives (convergentes) indiquent une concentration des écoulements vers le centre (concave) ; les valeurs négatives (divergentes) une dispersion des écoulements depuis le centre (convexe). Identifie les zones de concentration latérale des écoulements (vallées) et les zones de dispersion (crêtes). Essentielle pour prévoir la répartition de l'humidité du sol et la susceptibilité aux glissements de terrain.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur de conversion Z optionnel lorsque les unités verticales et horizontales diffèrent (par défaut 1.0). Alias : zfactor."
              },
              "log_transform": {
                "label": "Transformation logarithmique",
                "description": "Transformation logarithmique optionnelle des valeurs de sortie pour la lisibilité (par défaut faux). Alias : log."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "principal_curvature_direction": {
            "name": "Direction de la courbure principale",
            "description": "Calcule l'angle de direction de courbure principale (degrés).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur de conversion Z optionnel (par défaut 1.0). Alias : zfactor."
              },
              "log_transform": {
                "label": "Transformation logarithmique",
                "description": "Transformation logarithmique optionnelle des valeurs de sortie (par défaut faux). Alias : log."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "profile_curvature": {
            "name": "Courbure de profil",
            "description": "Calcule la courbure de profil (dans le sens de la pente), qui mesure l'accélération/décélération des écoulements dans la direction de la pente. Les valeurs positives (concaves) indiquent des zones d'accélération des écoulements (érosion) ; les valeurs négatives (convexes) des zones de décélération (dépôt). Révèle la forme du versant : concave (fonds de vallée, érosion), convexe (crêtes, ablation de matériaux), rectiligne (transition).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur de conversion Z optionnel lorsque les unités verticales et horizontales diffèrent (par défaut 1.0). Alias : zfactor."
              },
              "log_transform": {
                "label": "Transformation logarithmique",
                "description": "Transformation logarithmique optionnelle des valeurs de sortie pour la lisibilité (par défaut faux). Alias : log."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "relative_aspect": {
            "name": "Exposition relative",
            "description": "Calcule l'exposition du terrain par rapport à un azimut spécifié par l'utilisateur (0 à 180 degrés).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "azimuth": {
                "label": "Azimut",
                "description": "Azimut de référence en degrés dans le sens horaire depuis le nord."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur d'échelle vertical optionnel."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel."
              }
            }
          },
          "ring_curvature": {
            "name": "Courbure annulaire",
            "description": "Calcule la courbure annulaire (torsion au carré des lignes d'écoulement) à partir d'un MNT.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur de conversion Z optionnel (par défaut 1.0). Alias : zfactor."
              },
              "log_transform": {
                "label": "Transformation logarithmique",
                "description": "Transformation logarithmique optionnelle des valeurs de sortie (par défaut faux). Alias : log."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "rotor": {
            "name": "Rotor",
            "description": "Calcule le rotor (torsion des lignes d'écoulement) à partir d'un MNT.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur de conversion Z optionnel (par défaut 1.0). Alias : zfactor."
              },
              "log_transform": {
                "label": "Transformation logarithmique",
                "description": "Transformation logarithmique optionnelle des valeurs de sortie (par défaut faux). Alias : log."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "shape_index": {
            "name": "Indice de forme",
            "description": "Calcule le descripteur de forme de surface indice de forme (shape index) à partir d'un MNT.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur de conversion Z optionnel (par défaut 1.0). Alias : zfactor."
              },
              "log_transform": {
                "label": "Transformation logarithmique",
                "description": "Transformation logarithmique optionnelle des valeurs de sortie (par défaut faux). Alias : log."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "slope": {
            "name": "Pente",
            "description": "Pente selon Zevenbergen-Thorne (degrés/radians/pour cent). Métrique géomorphométrique fondamentale ; entrée en aval pour la courbure, la direction d'écoulement, l'ombrage et la visibilité.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "units": {
                "label": "Unités",
                "description": "Unités de sortie : degrees, radians, percent."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur de conversion Z."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel."
              }
            }
          },
          "tangential_curvature": {
            "name": "Courbure tangentielle",
            "description": "Calcule la courbure tangentielle (composante de direction E-O), semblable à la courbure en plan mais directionnelle. Utilisée pour une caractérisation complète de la courbure capturant la divergence latérale des écoulements perpendiculairement à la direction de la pente. Souvent combinée à la courbure de profil pour une compréhension complète de la courbure 3D.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur de conversion Z optionnel lorsque les unités verticales et horizontales diffèrent (par défaut 1.0). Alias : zfactor."
              },
              "log_transform": {
                "label": "Transformation logarithmique",
                "description": "Transformation logarithmique optionnelle des valeurs de sortie pour la lisibilité (par défaut faux). Alias : log."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "total_curvature": {
            "name": "Courbure totale",
            "description": "Calcule la courbure totale (moyenne quadratique des courbures principales). Métrique scalaire indépendante de la direction. Des valeurs élevées indiquent un terrain très courbé (sommets, cuvettes) ; des valeurs faibles un terrain plan. Utile comme métrique de rugosité sans dimension pour la classification du terrain et la détection d'anomalies.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur de conversion Z optionnel lorsque les unités verticales et horizontales diffèrent (par défaut 1.0). Alias : zfactor."
              },
              "log_transform": {
                "label": "Transformation logarithmique",
                "description": "Transformation logarithmique optionnelle des valeurs de sortie pour la lisibilité (par défaut faux). Alias : log."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "unsphericity": {
            "name": "Non-sphéricité",
            "description": "Calcule la courbure de non-sphéricité (moitié de la différence des courbures principales) à partir d'un MNT.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur de conversion Z optionnel (par défaut 1.0). Alias : zfactor."
              },
              "log_transform": {
                "label": "Transformation logarithmique",
                "description": "Transformation logarithmique optionnelle des valeurs de sortie (par défaut faux). Alias : log."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "vertical_excess_curvature": {
            "name": "Courbure d'excès vertical",
            "description": "Calcule la courbure verticale excédentaire à partir d'un MNT.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur de conversion Z optionnel (par défaut 1.0). Alias : zfactor."
              },
              "log_transform": {
                "label": "Transformation logarithmique",
                "description": "Transformation logarithmique optionnelle des valeurs de sortie (par défaut faux). Alias : log."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "average_normal_vector_angular_deviation": {
            "name": "Écart angulaire moyen du vecteur normal",
            "description": "Calcule l'écart angulaire moyen local entre les normales de surface d'origine et lissées.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "filter_size": {
                "label": "Taille du filtre",
                "description": "Taille impaire du voisinage en cellules (par défaut 11). Alias : filter."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur d'échelle vertical optionnel."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel."
              }
            }
          },
          "circular_variance_of_aspect": {
            "name": "Variance circulaire de l'exposition",
            "description": "Calcule la variance circulaire locale de l'exposition dans un voisinage mobile.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "filter": {
                "label": "Filtre",
                "description": "Taille impaire du voisinage en cellules (par défaut 11)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel."
              }
            }
          },
          "edge_density": {
            "name": "Densité de bordures",
            "description": "Calcule la densité locale des ruptures de pente à l'aide des différences angulaires entre vecteurs normaux.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "filter_size": {
                "label": "Taille du filtre",
                "description": "Taille impaire du voisinage en cellules (par défaut 11). Alias : filter."
              },
              "norm_diff": {
                "label": "Différence des normales",
                "description": "Seuil angulaire du vecteur normal en degrés (par défaut 5)."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur d'échelle vertical optionnel."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel."
              }
            }
          },
          "ruggedness_index": {
            "name": "Indice de rugosité",
            "description": "Rugosité du terrain via le TRI de Riley (somme des carrés des différences d'altitude). Métrique de classification du terrain indépendante de l'échelle : faible=plaines lisses, élevée=montagnes accidentées. Cartographie écologique et géomorphologique des formes du relief.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "spherical_std_dev_of_normals": {
            "name": "Écart-type sphérique des normales",
            "description": "Calcule l'écart-type sphérique des normales de surface locales.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "filter_size": {
                "label": "Taille du filtre",
                "description": "Taille impaire du voisinage en cellules (par défaut 11). Alias : filter."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur d'échelle vertical optionnel."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel."
              }
            }
          },
          "standard_deviation_of_slope": {
            "name": "Écart-type de la pente",
            "description": "Calcule l'écart-type local de la pente comme métrique de rugosité du terrain.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "filter_size": {
                "label": "Taille du filtre",
                "description": "Taille impaire du filtre en cellules (par défaut 11)."
              },
              "filter_size_x": {
                "label": "Taille du filtre X",
                "description": "Largeur impaire du filtre en cellules (par défaut filter_size). Alias : filterx."
              },
              "filter_size_y": {
                "label": "Taille du filtre Y",
                "description": "Hauteur impaire du filtre en cellules (par défaut filter_size). Alias : filtery."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur de conversion Z lorsque les unités verticales et horizontales diffèrent (par défaut 1.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat reste en mémoire."
              }
            }
          },
          "elev_relative_to_min_max": {
            "name": "Altitude relative au min-max",
            "description": "Exprime chaque altitude en pourcentage (0–100) de la plage d'altitudes du raster.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "geomorphons": {
            "name": "Géomorphons",
            "description": "Classe les formes du relief à l'aide de motifs ternaires de ligne de visée dans 8 directions dérivés de comparaisons d'angles zénithaux et nadiraux, ou des 10 formes courantes de géomorphons.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "analyze_residuals": {
                "label": "Analyser les résidus",
                "description": "Si vrai, supprime la tendance du MNT à l'aide d'un plan linéaire ajusté avant la classification."
              },
              "flatness_distance": {
                "label": "Distance de planéité",
                "description": "Distance en cellules au-delà de laquelle le seuil de planéité décroît avec la distance à l'horizon (par défaut 0)."
              },
              "flatness_threshold": {
                "label": "Seuil de planéité",
                "description": "Seuil de planéité en degrés (par défaut 1.0), appliqué à la différence d'angle zénith-nadir."
              },
              "output_forms": {
                "label": "Formes en sortie",
                "description": "Si vrai, produit les 10 classes de formes de terrain courantes ; sinon, produit le code géomorphon ternaire brut ordonné dans le sens antihoraire depuis l'est."
              },
              "search_distance": {
                "label": "Distance de recherche",
                "description": "Distance de recherche maximale en cellules par direction (par défaut 50) ; la cellule d'extrémité est incluse."
              },
              "skip_distance": {
                "label": "Distance à ignorer",
                "description": "Distance en cellules à ignorer avant d'évaluer la ligne de visée (par défaut 0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel."
              }
            }
          },
          "hypsometric_analysis": {
            "name": "Analyse hypsométrique",
            "description": "Crée un rapport HTML de courbe hypsométrique (surface-altitude) pour un ou plusieurs MNT.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Chemins des MNT d'entrée sous forme de chaîne séparée par ';' ou ',', ou de liste."
              },
              "watershed": {
                "label": "Bassin versant",
                "description": "Rasters de bassins versants optionnels correspondant à chaque MNT d'entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du rapport HTML en sortie."
              }
            }
          },
          "multiscale_topographic_position_class": {
            "name": "Classe de position topographique multi-échelle",
            "description": "Classe chaque cellule du MNT dans un système de position topographique relative à neuf classes (large/locale) à l'aide de deux mosaïques d'échelle DEVmax.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "local_min_scale": {
                "label": "Échelle locale minimale",
                "description": "Rayon minimal de demi-fenêtre en cellules pour la plage d'échelles locale (par défaut 5)."
              },
              "local_max_scale": {
                "label": "Échelle locale maximale",
                "description": "Rayon maximal de demi-fenêtre en cellules pour la plage d'échelles locale (par défaut 80)."
              },
              "local_step_size": {
                "label": "Pas d'échelle locale",
                "description": "Incrément d'échelle en cellules pour la plage d'échelles locale (par défaut 1). Alias : local_step."
              },
              "broad_min_scale": {
                "label": "Échelle large minimale",
                "description": "Rayon minimal de demi-fenêtre en cellules pour la plage d'échelles large (par défaut 500)."
              },
              "broad_max_scale": {
                "label": "Échelle large maximale",
                "description": "Rayon maximal de demi-fenêtre en cellules pour la plage d'échelles large (par défaut 2000)."
              },
              "broad_step_size": {
                "label": "Pas d'échelle large",
                "description": "Incrément d'échelle en cellules pour la plage d'échelles large (par défaut 20). Alias : broad_step."
              },
              "local_threshold": {
                "label": "Seuil local",
                "description": "Seuil DEV utilisé pour classer la mosaïque d'échelle locale en états de creux, de position intermédiaire et de butte (par défaut 0.5)."
              },
              "broad_threshold": {
                "label": "Seuil large",
                "description": "Seuil DEV utilisé pour classer la mosaïque d'échelle large en états de basse terre, intermédiaire et de haute terre (par défaut 0.5)."
              },
              "min_patch_size": {
                "label": "Taille minimale de tache",
                "description": "Taille minimale de tache optionnelle en cellules pour le filtrage des taches après classification (par défaut 0, désactivé)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du raster catégoriel à neuf classes."
              },
              "output_confidence": {
                "label": "Confiance en sortie",
                "description": "Chemin de sortie optionnel d'un raster de confiance dans la plage [0, 1]."
              }
            }
          },
          "pennock_landform_classification": {
            "name": "Classification des formes de relief de Pennock",
            "description": "Classe les éléments du relief en sept classes de terrain selon Pennock et al. (1987).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "plan_curv_threshold": {
                "label": "Seuil de courbure en plan",
                "description": "Seuil de courbure planaire en degrés (par défaut 0.0)."
              },
              "prof_curv_threshold": {
                "label": "Seuil de courbure en profil",
                "description": "Seuil de courbure profilée en degrés (par défaut 0.1)."
              },
              "slope_threshold": {
                "label": "Seuil de pente",
                "description": "Seuil de pente en degrés (par défaut 3.0)."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur d'échelle verticale optionnel (si < 0 et si le SCR est géographique, estimé à partir de la latitude médiane)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel."
              }
            }
          },
          "percent_elev_range": {
            "name": "Pourcentage de l'amplitude altimétrique",
            "description": "Calcule la position topographique locale en pourcentage de la plage d'altitudes du voisinage.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "filter_size_x": {
                "label": "Taille du filtre X",
                "description": "Largeur impaire du filtre en cellules (par défaut 11). Alias : filterx."
              },
              "filter_size_y": {
                "label": "Taille du filtre Y",
                "description": "Hauteur impaire du filtre en cellules (par défaut filter_size_x). Alias : filtery."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel."
              }
            }
          },
          "relative_topographic_position": {
            "name": "Position topographique relative",
            "description": "Calcule la RTP à l'aide des altitudes minimale, moyenne et maximale du voisinage.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "filter_size_x": {
                "label": "Taille du filtre X",
                "description": "Largeur impaire du filtre en cellules (par défaut 11). Alias : filterx."
              },
              "filter_size_y": {
                "label": "Taille du filtre Y",
                "description": "Hauteur impaire du filtre en cellules (par défaut filter_size_x). Alias : filtery."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel."
              }
            }
          },
          "max_anisotropy_dev": {
            "name": "Écart d'anisotropie maximal",
            "description": "Calcule l'anisotropie maximale de l'écart d'altitude sur une gamme d'échelles de voisinage. Écrit par Dan Newman.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "min_scale": {
                "label": "Échelle minimale",
                "description": "Rayon minimal de demi-fenêtre en cellules (par défaut 3)."
              },
              "max_scale": {
                "label": "Échelle maximale",
                "description": "Rayon maximal de demi-fenêtre en cellules (par défaut 100)."
              },
              "step_size": {
                "label": "Taille du pas",
                "description": "Incrément d'échelle en cellules (par défaut 2). Alias : step."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du raster de magnitude d'anisotropie."
              },
              "output_scale": {
                "label": "Échelle en sortie",
                "description": "Chemin de sortie optionnel du raster stockant l'échelle de réponse maximale."
              }
            }
          },
          "max_anisotropy_dev_signature": {
            "name": "Signature de l'écart d'anisotropie maximal",
            "description": "Calcule des signatures d'anisotropie multi-échelles pour des sites ponctuels en entrée et écrit un rapport HTML. Écrit par Dan Newman.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée."
              },
              "points": {
                "label": "Points",
                "description": "Chemin du fichier vectoriel de points ou de multipoints en entrée."
              },
              "min_scale": {
                "label": "Échelle minimale",
                "description": "Rayon minimal de demi-fenêtre en cellules (par défaut 1)."
              },
              "max_scale": {
                "label": "Échelle maximale",
                "description": "Rayon maximal de demi-fenêtre en cellules (par défaut 100)."
              },
              "step_size": {
                "label": "Taille du pas",
                "description": "Incrément d'échelle en cellules (par défaut 1). Alias : step."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du rapport HTML de signature."
              }
            }
          },
          "max_difference_from_mean": {
            "name": "Différence maximale à la moyenne",
            "description": "Calcule la différence absolue maximale à la moyenne sur une gamme d'échelles de voisinage.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "min_scale": {
                "label": "Échelle minimale",
                "description": "Rayon minimal de demi-fenêtre en cellules (par défaut 1)."
              },
              "max_scale": {
                "label": "Échelle maximale",
                "description": "Rayon maximal de demi-fenêtre en cellules (par défaut 100)."
              },
              "step_size": {
                "label": "Taille du pas",
                "description": "Incrément d'échelle en cellules (par défaut 1). Alias : step."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du raster de magnitude de différence maximale."
              },
              "output_scale": {
                "label": "Échelle en sortie",
                "description": "Chemin de sortie optionnel du raster stockant l'échelle de réponse maximale."
              }
            }
          },
          "max_elevation_deviation": {
            "name": "Écart altimétrique maximal",
            "description": "Calcule l'écart d'altitude standardisé maximal (DEVmax) sur une gamme d'échelles de voisinage.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "min_scale": {
                "label": "Échelle minimale",
                "description": "Rayon minimal de demi-fenêtre en cellules (par défaut 1)."
              },
              "max_scale": {
                "label": "Échelle maximale",
                "description": "Rayon maximal de demi-fenêtre en cellules (par défaut 100)."
              },
              "step_size": {
                "label": "Taille du pas",
                "description": "Incrément d'échelle en cellules (par défaut 1). Alias : step."
              },
              "min_vertical": {
                "label": "Dénivelé minimal",
                "description": "Seuil minimal d'écart-type local ; les réponses de relief plus faible sont supprimées (par défaut 0.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du raster de magnitude DEVmax."
              },
              "output_scale": {
                "label": "Échelle en sortie",
                "description": "Chemin de sortie optionnel du raster stockant l'échelle de réponse maximale."
              }
            }
          },
          "max_elev_dev_signature": {
            "name": "Signature de l'écart altimétrique maximal",
            "description": "Calcule des signatures multi-échelles d'écart d'altitude pour des sites ponctuels en entrée et écrit un rapport HTML.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée."
              },
              "points": {
                "label": "Points",
                "description": "Chemin du fichier vectoriel de points ou de multipoints en entrée."
              },
              "min_scale": {
                "label": "Échelle minimale",
                "description": "Rayon minimal de demi-fenêtre en cellules (par défaut 1)."
              },
              "max_scale": {
                "label": "Échelle maximale",
                "description": "Rayon maximal de demi-fenêtre en cellules (par défaut 100)."
              },
              "step_size": {
                "label": "Taille du pas",
                "description": "Incrément d'échelle en cellules (par défaut 10). Alias : step."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du rapport HTML de signature."
              }
            }
          },
          "multiscale_curvatures": {
            "name": "Courbures multi-échelles",
            "description": "Calcule des courbures multi-échelles et des indices fondés sur la courbure à partir d'un MNT.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé. Alias : dem."
              },
              "curv_type": {
                "label": "Type de courbure",
                "description": "Type de courbure."
              },
              "out_mag": {
                "label": "Magnitude en sortie",
                "description": "Chemin de sortie optionnel de la magnitude. Alias : output."
              },
              "out_scale": {
                "label": "Échelle en sortie",
                "description": "Chemin de sortie optionnel de l'échelle lorsque num_steps > 1."
              },
              "min_scale": {
                "label": "Échelle minimale",
                "description": "Rayon minimal du voisinage de recherche en cellules de grille."
              },
              "step": {
                "label": "Pas",
                "description": "Taille du pas."
              },
              "num_steps": {
                "label": "Nombre de pas",
                "description": "Nombre de pas d'échelle échantillonnés."
              },
              "step_nonlinearity": {
                "label": "Non-linéarité des pas",
                "description": "Facteur de non-linéarité du pas."
              },
              "log_transform": {
                "label": "Transformation logarithmique",
                "description": "Applique une transformation logarithmique signée. Alias : log."
              },
              "standardize": {
                "label": "Standardiser",
                "description": "Standardise chaque échelle en scores z."
              }
            }
          },
          "multiscale_elevated_index": {
            "name": "Indice multi-échelle de surélévation",
            "description": "Calcule l'indice d'élévation multi-échelle (MsEI) et des rasters d'échelle clé à l'aide des résidus de l'espace-échelle gaussien.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "min_scale": {
                "label": "Échelle minimale",
                "description": "Rayon de recherche minimal en cellules de grille (par défaut 2)."
              },
              "num_steps": {
                "label": "Nombre de pas",
                "description": "Nombre d'échelles à évaluer (par défaut 100)."
              },
              "step_nonlinearity": {
                "label": "Non-linéarité des pas",
                "description": "Non-linéarité du pas d'échelle dans [1,4] (par défaut 1.1)."
              },
              "step_size": {
                "label": "Taille du pas",
                "description": "Pas de base en cellules (par défaut 1). Alias : step."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du raster d'indice."
              },
              "output_scale": {
                "label": "Échelle en sortie",
                "description": "Chemin de sortie optionnel du raster d'échelle clé."
              }
            }
          },
          "multiscale_elevation_percentile": {
            "name": "Percentile d'altitude multi-échelle",
            "description": "Calcule le centile d'altitude local le plus extrême sur une gamme d'échelles de voisinage.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "min_scale": {
                "label": "Échelle minimale",
                "description": "Rayon minimal de demi-fenêtre en cellules (par défaut 4)."
              },
              "num_steps": {
                "label": "Nombre de pas",
                "description": "Nombre d'échelles à évaluer (par défaut 10)."
              },
              "step_size": {
                "label": "Taille du pas",
                "description": "Incrément d'échelle en cellules (par défaut 1). Alias : step."
              },
              "step_nonlinearity": {
                "label": "Non-linéarité des pas",
                "description": "Exposant de mise à l'échelle non linéaire ; >1.0 regroupe les échelles vers les résolutions plus fines (par défaut 1.0)."
              },
              "sig_digits": {
                "label": "Chiffres significatifs",
                "description": "Décimales significatives utilisées lors du regroupement en classes de percentiles (par défaut 3)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du raster de magnitude de percentile."
              },
              "output_scale": {
                "label": "Échelle en sortie",
                "description": "Chemin de sortie optionnel du raster stockant l'échelle de la réponse de percentile la plus extrême."
              }
            }
          },
          "multiscale_low_lying_index": {
            "name": "Indice multi-échelle de zones basses",
            "description": "Calcule l'indice de dépression multi-échelle (MsLLI) et des rasters d'échelle clé à l'aide des résidus de l'espace-échelle gaussien.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "min_scale": {
                "label": "Échelle minimale",
                "description": "Rayon de recherche minimal en cellules de grille (par défaut 2)."
              },
              "num_steps": {
                "label": "Nombre de pas",
                "description": "Nombre d'échelles à évaluer (par défaut 100)."
              },
              "step_nonlinearity": {
                "label": "Non-linéarité des pas",
                "description": "Non-linéarité du pas d'échelle dans [1,4] (par défaut 1.1)."
              },
              "step_size": {
                "label": "Taille du pas",
                "description": "Pas de base en cellules (par défaut 1). Alias : step."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du raster d'indice."
              },
              "output_scale": {
                "label": "Échelle en sortie",
                "description": "Chemin de sortie optionnel du raster d'échelle clé."
              }
            }
          },
          "multiscale_roughness": {
            "name": "Rugosité multi-échelle",
            "description": "Calcule la rugosité de surface sur une gamme d'échelles de voisinage.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "min_scale": {
                "label": "Échelle minimale",
                "description": "Rayon minimal de demi-fenêtre en cellules (par défaut 1)."
              },
              "max_scale": {
                "label": "Échelle maximale",
                "description": "Rayon maximal de demi-fenêtre en cellules (par défaut 100)."
              },
              "step_size": {
                "label": "Taille du pas",
                "description": "Incrément d'échelle en cellules (par défaut 1). Alias : step."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur de conversion Z lorsque les unités verticales et horizontales diffèrent (par défaut 1.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du raster de magnitude de rugosité."
              },
              "output_scale": {
                "label": "Échelle en sortie",
                "description": "Chemin de sortie optionnel du raster stockant l'échelle de réponse maximale."
              }
            }
          },
          "multiscale_roughness_signature": {
            "name": "Signature de rugosité multi-échelle",
            "description": "Calcule des signatures de rugosité multi-échelles pour des sites ponctuels en entrée et écrit un rapport HTML.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée."
              },
              "points": {
                "label": "Points",
                "description": "Chemin du fichier vectoriel de points ou de multipoints en entrée."
              },
              "min_scale": {
                "label": "Échelle minimale",
                "description": "Rayon minimal de demi-fenêtre en cellules (par défaut 1)."
              },
              "max_scale": {
                "label": "Échelle maximale",
                "description": "Rayon maximal de demi-fenêtre en cellules (par défaut 100)."
              },
              "step_size": {
                "label": "Taille du pas",
                "description": "Incrément d'échelle en cellules (par défaut 1). Alias : step."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur de conversion Z lorsque les unités verticales et horizontales diffèrent (par défaut 1.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du rapport HTML de signature."
              }
            }
          },
          "multiscale_std_dev_normals": {
            "name": "Écart-type multi-échelle des normales",
            "description": "Calcule l'écart-type sphérique maximal des normales de surface sur une gamme d'échelles échantillonnée de façon non linéaire.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "min_scale": {
                "label": "Échelle minimale",
                "description": "Rayon minimal de demi-fenêtre en cellules (par défaut 4)."
              },
              "step": {
                "label": "Pas",
                "description": "Pas de base en cellules utilisé par la progression d'échelles non linéaire (par défaut 1)."
              },
              "num_steps": {
                "label": "Nombre de pas",
                "description": "Nombre d'échelles échantillonnées (par défaut 10)."
              },
              "step_nonlinearity": {
                "label": "Non-linéarité des pas",
                "description": "Exposant de non-linéarité de la progression d'échelles (par défaut 1.0)."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur de conversion Z lorsque les unités verticales et horizontales diffèrent (par défaut 1.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du raster de magnitude d'écart-type sphérique."
              },
              "output_scale": {
                "label": "Échelle en sortie",
                "description": "Chemin de sortie optionnel du raster stockant l'échelle de réponse maximale."
              }
            }
          },
          "multiscale_std_dev_normals_signature": {
            "name": "Signature de l'écart-type multi-échelle des normales",
            "description": "Calcule des signatures d'échelle de l'écart-type sphérique pour des sites ponctuels en entrée et écrit un rapport HTML.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée."
              },
              "points": {
                "label": "Points",
                "description": "Chemin du fichier vectoriel de points ou de multipoints en entrée."
              },
              "min_scale": {
                "label": "Échelle minimale",
                "description": "Rayon minimal de demi-fenêtre en cellules (par défaut 4)."
              },
              "step": {
                "label": "Pas",
                "description": "Pas de base en cellules utilisé par la progression d'échelles non linéaire (par défaut 1)."
              },
              "num_steps": {
                "label": "Nombre de pas",
                "description": "Nombre d'échelles échantillonnées (par défaut 10)."
              },
              "step_nonlinearity": {
                "label": "Non-linéarité des pas",
                "description": "Exposant de non-linéarité de la progression d'échelles (par défaut 1.0)."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Facteur de conversion Z lorsque les unités verticales et horizontales diffèrent (par défaut 1.0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du rapport HTML de signature."
              }
            }
          },
          "multiscale_topographic_position_image": {
            "name": "Image de position topographique multi-échelle",
            "description": "Crée une image RVB compactée de position topographique multi-échelle à partir de rasters DEVmax local, méso et large.",
            "params": {
              "local": {
                "label": "Local",
                "description": "Chemin du raster DEVmax d'échelle locale en entrée."
              },
              "meso": {
                "label": "Méso",
                "description": "Chemin du raster DEVmax d'échelle méso en entrée."
              },
              "broad": {
                "label": "Large",
                "description": "Chemin du raster DEVmax d'échelle large en entrée."
              },
              "hillshade": {
                "label": "Ombrage du relief",
                "description": "Chemin optionnel du raster d'ombrage utilisé pour la modulation de l'illumination."
              },
              "lightness": {
                "label": "Clarté",
                "description": "Facteur d'échelle de clarté de l'image (par défaut 1.2)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du raster RGB compacté."
              }
            }
          },
          "topographic_position_animation": {
            "name": "Animation de position topographique",
            "description": "Crée une visionneuse HTML interactive et un GIF animé du DEV ou du DEVmax sur des échelles échantillonnées de façon non linéaire.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du raster MNT en entrée ou objet raster typé."
              },
              "delay": {
                "label": "Délai",
                "description": "Délai GIF par image en millisecondes."
              },
              "image_height": {
                "label": "Hauteur de l'image",
                "description": "Hauteur de l'image affichée en pixels."
              },
              "label": {
                "label": "Étiquette",
                "description": "Étiquette optionnelle affichée dans la visionneuse."
              },
              "min_scale": {
                "label": "Échelle minimale",
                "description": "Rayon minimal de demi-fenêtre en cellules (par défaut 1)."
              },
              "num_steps": {
                "label": "Nombre de pas",
                "description": "Nombre d'étapes d'animation (par défaut 10)."
              },
              "palette": {
                "label": "Palette",
                "description": "Nom de la palette utilisée pour colorer les valeurs DEV."
              },
              "step_nonlinearity": {
                "label": "Non-linéarité des pas",
                "description": "Exposant d'échelle non linéaire dans [1, 4] contrôlant l'espacement du grossier vers le fin."
              },
              "use_dev_max": {
                "label": "Utiliser la déviation maximale",
                "description": "Si vrai, les images accumulent la réponse DEV absolue la plus forte rencontrée jusqu'ici."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du HTML en sortie."
              }
            }
          },
          "topo_render": {
            "name": "Rendu topographique",
            "description": "Crée un rendu topographique pseudo-3D à l'aide d'une teinte de palette, d'un ombrage du relief, d'ombres et d'une atténuation.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Chemin du raster MNT en entrée."
              },
              "palette": {
                "label": "Palette",
                "description": "Nom de la palette (soft, atlas, high_relief, turbo, viridis, dem, grey, white)."
              },
              "reverse_palette": {
                "label": "Inverser la palette",
                "description": "Inverse l'ordre de la palette."
              },
              "azimuth": {
                "label": "Azimut",
                "description": "Azimut de la source lumineuse en degrés [0, 360]."
              },
              "altitude": {
                "label": "Altitude",
                "description": "Hauteur de la source lumineuse en degrés [0, 90]."
              },
              "clipping_polygon": {
                "label": "Polygone de découpage",
                "description": "Chemin optionnel du vecteur de polygones ; seules les cellules du MNT situées à l'intérieur des polygones sont rendues."
              },
              "background_hgt_offset": {
                "label": "Décalage de hauteur du fond",
                "description": "Décalage vertical entre l'altitude minimale du MNT et le plan d'arrière-plan."
              },
              "background_clr": {
                "label": "Couleur du fond",
                "description": "Couleur RGBA d'arrière-plan sous forme de tableau [r,g,b,a]."
              },
              "attenuation_parameter": {
                "label": "Paramètre d'atténuation",
                "description": "Exposant d'atténuation avec la distance (>= 0)."
              },
              "ambient_light": {
                "label": "Lumière ambiante",
                "description": "Quantité de lumière ambiante dans [0, 1]."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Multiplicateur d'exagération verticale."
              },
              "max_dist": {
                "label": "Distance maximale",
                "description": "Distance de recherche maximale des ombres en unités carte."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie."
              }
            }
          },
          "add_surface_information": {
            "name": "Ajouter des informations de surface",
            "description": "Ajoute à chaque entité des statistiques de surface issues d'un raster d'élévation — Z, longueur de surface 3D, surface 3D, Z min/max/moyen et pente min/max/moyenne — sous forme de champs attributaires sans modifier la géométrie d'entrée, comme l'outil ArcGIS Add Surface Information.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée (points, lignes ou polygones) partageant le SCR de la surface."
              },
              "surface": {
                "label": "Surface",
                "description": "Raster d'altitude/de surface à échantillonner."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de sortie (pilote déduit de l'extension). Si omis, le résultat est stocké en mémoire."
              },
              "properties": {
                "label": "Propriétés",
                "description": "Liste séparée par des virgules des groupes de propriétés de surface à ajouter : Z, SURFACE_LENGTH, SURFACE_AREA, MIN_MAX_MEAN_Z, MIN_MAX_AVG_SLOPE. Par défaut : tous ceux applicables à la géométrie de la couche."
              },
              "sample_distance": {
                "label": "Distance d'échantillonnage",
                "description": "Intervalle de densification en unités du SCR pour l'échantillonnage des lignes/périmètres ; les longs segments sont découpés afin de suivre la surface. Par défaut : la taille de cellule du raster."
              },
              "method": {
                "label": "Méthode",
                "description": "Échantillonnage de la surface aux sommets : 'bilinear' (par défaut) ou 'nearest'."
              },
              "band": {
                "label": "Bande",
                "description": "Bande de surface à échantillonner, indexée à partir de 1 (par défaut 1)."
              }
            }
          },
          "add_z_information": {
            "name": "Ajouter des informations Z",
            "description": "Ajoute aux entités 3D des statistiques géométriques dérivées de Z — Z ponctuel/min/max/moyen, longueur 3D, surface et volume du maillage, statistiques de pente et nombre de sommets (ArcGIS Add Z Information). vector_summary_statistics et attribute_histogram résument les attributs plutôt que la géométrie, et polygon_volume / surface_volume mesurent un raster par rapport à un plan de référence ; rien n'annotait donc une entité vectorielle 3D à partir de son propre Z.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Entités 3D de type point, ligne, polygone ou multipatch. Notez qu'un Z nul est indiscernable d'un Z absent, si bien que 'features_with_z' est une indication plutôt qu'une garantie."
              },
              "output": {
                "label": "Sortie",
                "description": "Entités d'entrée auxquelles les champs demandés ont été ajoutés. Si omis, le résultat est stocké en mémoire."
              },
              "properties": {
                "label": "Propriétés",
                "description": "Sous-ensemble séparé par des virgules parmi spot_z, min_z, max_z, mean_z, length_3d, surface_area, volume, min_slope, max_slope, mean_slope, point_count, vertex_count. Par défaut : tous (les champs non applicables à une géométrie sont laissés nuls)."
              },
              "noise_filtering": {
                "label": "Filtrage du bruit",
                "description": "Pourcentage (0-50) retranché à chaque extrémité de la distribution des Z avant min_z / max_z, afin qu'un unique sommet aberrant ne définisse pas les extrêmes rapportés. Par défaut 0."
              }
            }
          },
          "adjust_3d_z": {
            "name": "Ajuster le Z en 3D",
            "description": "Applique une conversion d'unité Z, un décalage vertical et/ou un facteur multiplicatif aux ordonnées Z des entités 3D.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée (les entités doivent porter des ordonnées Z)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de sortie optionnel. Si omis, le résultat est stocké en mémoire."
              },
              "factor": {
                "label": "Facteur",
                "description": "Facteur multiplicatif appliqué au Z (par défaut 1.0). Utile pour l'exagération verticale ou une mise à l'échelle de datum."
              },
              "offset": {
                "label": "Décalage",
                "description": "Décalage vertical additif appliqué après le facteur, dans les unités cibles (par défaut 0.0)."
              },
              "from_unit": {
                "label": "Unité source",
                "description": "Préréglage d'unité Z source (meters, feet, us_feet, centimeters, millimeters, kilometers, miles, yards, inches). Nécessite to_unit."
              },
              "to_unit": {
                "label": "Unité cible",
                "description": "Préréglage d'unité Z cible. Nécessite from_unit. Le Z est mis à l'échelle par (mètres-par-from_unit / mètres-par-to_unit)."
              }
            }
          },
          "adjust_stream_to_raster": {
            "name": "Ajuster le cours d'eau au raster",
            "description": "Déplace les sommets des polylignes de cours d'eau sur le chemin d'écoulement impliqué par un MNT afin que l'hydrographie vectorielle et la surface d'élévation concordent, en accrochant les nœuds aux cellules de forte accumulation et en traçant la chaîne de pointeurs D8 entre eux. L'inverse de l'incrustation des cours d'eau. Comme l'outil ArcGIS Adjust Stream To Raster.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Entités polylignes de cours d'eau à ajuster."
              },
              "dem": {
                "label": "MNT",
                "description": "Raster de surface définissant le véritable chemin d'écoulement."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie des cours d'eau ajustés. Si omis, le résultat est stocké en mémoire."
              },
              "snap_distance": {
                "label": "Distance d'accrochage",
                "description": "Rayon de recherche en unités carte pour accrocher les nœuds à une cellule de forte accumulation (par défaut : 5 cellules)."
              },
              "channel_threshold": {
                "label": "Seuil de chenal",
                "description": "Valeur d'accumulation d'écoulement (en cellules) à partir de laquelle une cellule est considérée comme chenalisée pour l'accrochage (par défaut : 1 % de l'accumulation maximale du MNT)."
              },
              "remove_disconnected": {
                "label": "Supprimer les éléments déconnectés",
                "description": "Supprime les lignes qui ne peuvent pas être acheminées du tout (par défaut vrai). Si faux, elles sont transmises inchangées et signalées."
              },
              "output_stream_raster": {
                "label": "Raster de cours d'eau en sortie",
                "description": "Raster optionnel marquant les cellules de cours d'eau ajustées."
              },
              "output_flow_direction": {
                "label": "Direction d'écoulement en sortie",
                "description": "Raster de pointeurs D8 optionnel dérivé du MNT."
              },
              "output_split_points": {
                "label": "Points de division en sortie",
                "description": "Points optionnels où le suivi des pointeurs a échoué et où un repli par moindre coût a été utilisé."
              }
            }
          },
          "aggregate_multidimensional_raster": {
            "name": "Agréger un raster multidimensionnel",
            "description": "Regroupe les tranches d'un cube raster le long de sa dimension et réduit chaque groupe à une bande de sortie — des scènes quotidiennes en composites mensuels, une décennie en moyennes annuelles (ArcGIS Aggregate Multidimensional Raster). cell_statistics de la série 17 ne réduit une pile qu'à une seule couche et n'a aucune notion de dimension, tandis que multidimensional_anomaly de la série 16 effectue l'opération inverse et conserve le nombre de tranches.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Un raster multibande (chaque bande est une tranche) ou une liste de rasters co-enregistrés séparés par des virgules."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster multibande de sortie, une bande par classe. Si omis, le résultat est stocké en mémoire."
              },
              "dimension": {
                "label": "Dimension",
                "description": "Nom de la dimension, utilisé uniquement dans le rapport (par défaut 'slice')."
              },
              "dimension_values": {
                "label": "Valeurs de dimension",
                "description": "Coordonnée de chaque tranche, séparée par des virgules, strictement croissante. Par défaut, l'indice de tranche à partir de 1."
              },
              "aggregation_definition": {
                "label": "Définition d'agrégation",
                "description": "'all' (par défaut), 'interval_value', 'interval_count' ou 'interval_ranges'."
              },
              "interval_value": {
                "label": "Valeur d'intervalle",
                "description": "Largeur de classe en unités de la dimension, pour 'interval_value'."
              },
              "interval_count": {
                "label": "Nombre d'intervalles",
                "description": "Nombre de classes de largeur égale, pour 'interval_count'."
              },
              "interval_ranges": {
                "label": "Plages d'intervalles",
                "description": "Classes explicites sous la forme 'start:end,start:end', pour 'interval_ranges'."
              },
              "aggregation_method": {
                "label": "Méthode d'agrégation",
                "description": "'mean' (par défaut), 'majority', 'maximum', 'median', 'minimum', 'minority', 'percentile', 'range', 'std', 'sum' ou 'variety'."
              },
              "percentile_value": {
                "label": "Valeur de percentile",
                "description": "Percentile dans [0, 100] pour la méthode 'percentile' (par défaut 50)."
              },
              "ignore_nodata": {
                "label": "Ignorer NoData",
                "description": "Ignore les tranches NoData par cellule (par défaut vrai). Si faux, une seule tranche NoData rend toute la classe NoData sur cette cellule."
              }
            }
          },
          "aggregate_points": {
            "name": "Agréger des points",
            "description": "Regroupe les points situés à moins d'une distance d'agrégation les uns des autres en polygones de grappes (enveloppe convexe ou union tamponnée), chacun portant un nombre de points et, en option, des sommes de champs par grappe, comme l'outil ArcGIS Aggregate Points.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points en entrée (Point ou MultiPoint)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de polygones en sortie (pilote déduit de l'extension). Si omis, le résultat est stocké en mémoire."
              },
              "aggregation_distance": {
                "label": "Distance d'agrégation",
                "description": "Distance maximale entre points pour qu'ils rejoignent la même grappe (unités carte)."
              },
              "min_points": {
                "label": "Points minimaux",
                "description": "Nombre minimal de points qu'une grappe doit compter pour être produite (par défaut 2 ; mettre 1 pour conserver les singletons)."
              },
              "method": {
                "label": "Méthode",
                "description": "'convex_hull' (par défaut) ou 'buffer' (union tamponnée puis érodée en retour)."
              },
              "sum_fields": {
                "label": "Champs à sommer",
                "description": "Champs numériques séparés par des virgules à sommer par grappe (colonnes de sortie 'sum_<field>')."
              }
            }
          },
          "aggregate_polygons": {
            "name": "Agréger des polygones",
            "description": "Combine les polygones situés à moins d'une distance d'agrégation en polygones plus grands (fermeture morphologique), avec des filtres de surface minimale et de taille minimale de trou et une couche de barrières optionnelle que l'agrégation ne peut pas franchir.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de polygones en entrée, format détecté automatiquement (ou référence en mémoire)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel (pilote selon son extension). S'il est omis, stocké en mémoire."
              },
              "aggregation_distance": {
                "label": "Distance d'agrégation",
                "description": "Les polygones distants de moins de cette valeur (unités du SCR) les uns des autres sont agrégés. Fixe le rayon de fermeture morphologique à la moitié de cette valeur."
              },
              "min_area": {
                "label": "Surface minimale",
                "description": "Supprime les polygones agrégés dont la surface (unités du SCR au carré) est inférieure à cette valeur. Par défaut : tout conserver."
              },
              "min_hole_size": {
                "label": "Taille minimale de trou",
                "description": "Comble les trous intérieurs dont la surface (unités du SCR au carré) est inférieure à cette valeur. Par défaut : conserver tous les trous."
              },
              "barrier": {
                "label": "Barrière",
                "description": "Couche vectorielle de barrières optionnelle (lignes ou polygones) que l'agrégation ne peut pas franchir ; les ponts traversant une barrière sont sectionnés. Les polygones d'entrée existants ne sont jamais divisés."
              }
            }
          },
          "align_features": {
            "name": "Aligner les entités",
            "description": "Conforme les arêtes de lignes/polygones sources à une couche cible fiable voisine dans une distance de recherche, en tirant des tronçons d'arêtes entiers (pas seulement les extrémités) avec une transition douce et des limites partagées coïncidentes, comme l'outil ArcGIS Align Features.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle source à aligner (lignes ou polygones)."
              },
              "target": {
                "label": "Cible",
                "description": "Couche cible de confiance (lignes ou limites de polygones) vers laquelle les sommets de la source sont attirés."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de sortie optionnel (pilote déduit de l'extension). Si omis, stocké en mémoire."
              },
              "search_distance": {
                "label": "Distance de recherche",
                "description": "Distance maximale (unités du SCR) dont un sommet source peut être déplacé vers la cible. Obligatoire."
              },
              "match_field": {
                "label": "Champ de correspondance",
                "description": "Champ attributaire source optionnel ; seules les arêtes cibles dont la valeur de target_match_field correspond sont candidates pour les sommets de cette entité."
              },
              "target_match_field": {
                "label": "Champ de correspondance cible",
                "description": "Champ attributaire cible comparé à match_field. Par défaut, le nom de match_field s'il est omis ; nécessite match_field."
              }
            }
          },
          "analyze_changes_ccdc": {
            "name": "Analyser les changements avec CCDC",
            "description": "Détection continue de changements CCDC sur une série temporelle d'images dense (comme ArcGIS Analyze Changes Using CCDC) : régression MCO harmonique (saisonnière) par pixel, puis test glissant des résidus (k×RMSE, nombre minimal d'anomalies consécutives) qui déclare les ruptures et réajuste les segments. Produit des rasters de nombre de ruptures, de date de première rupture et de RMSE/pente/amplitude du segment initial — l'historique de changements saisonnier et multi-ruptures que landtrendr (annuel) et change_vector_analysis (deux dates) ne peuvent pas produire.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Un seul raster multibande (chaque bande est une tranche temporelle) OU une liste de chemins de rasters monobande co-enregistrés séparés par des virgules, dans l'ordre chronologique."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster du nombre de ruptures en sortie (ruptures détectées par pixel). Si omis, stocké en mémoire."
              },
              "dates": {
                "label": "Dates",
                "description": "Dates numériques séparées par des virgules (années décimales ou numéros de jour) correspondant aux tranches. Par défaut 0,1,2,..."
              },
              "period": {
                "label": "Période",
                "description": "Longueur d'un cycle saisonnier dans les unités de 'dates' (par défaut 1.0 pour les années décimales ; utiliser 365 pour les numéros de jour)."
              },
              "harmonic_order": {
                "label": "Ordre harmonique",
                "description": "Nombre de paires harmoniques sinus/cosinus à la fréquence annuelle (par défaut 1 = annuel uniquement ; 2 ajoute le terme semi-annuel)."
              },
              "change_threshold": {
                "label": "Seuil de changement",
                "description": "Seuil d'anomalie sous forme de multiple k du RMSE du segment (par défaut 3.0). Un résidu > k×RMSE signale une observation."
              },
              "min_consecutive": {
                "label": "Consécutifs minimaux",
                "description": "Nombre d'observations signalées consécutives requis pour déclarer une rupture (par défaut 3)."
              },
              "min_observations": {
                "label": "Observations minimales",
                "description": "Nombre minimal d'observations valides utilisées pour initialiser le modèle harmonique d'un segment (par défaut 12). Les pixels comportant moins d'observations valides deviennent NoData."
              },
              "band": {
                "label": "Bande",
                "description": "Pour une entrée sous forme de liste séparée par des virgules : bande à lire dans chaque raster, indexée à partir de 1 (par défaut 1). Ignoré pour une entrée multibande unique."
              },
              "break_date_output": {
                "label": "Date de rupture en sortie",
                "description": "Raster optionnel de la date de la première rupture détectée par pixel (NoData en l'absence de rupture)."
              },
              "rmse_output": {
                "label": "RMSE en sortie",
                "description": "Raster optionnel du RMSE du modèle harmonique du segment initial."
              },
              "slope_output": {
                "label": "Pente en sortie",
                "description": "Raster optionnel du coefficient de tendance linéaire (pente) du segment initial."
              },
              "amplitude_output": {
                "label": "Amplitude en sortie",
                "description": "Raster optionnel de l'amplitude de la première harmonique du segment initial sqrt(a²+b²)."
              }
            }
          },
          "apply_radiometric_calibration": {
            "name": "Appliquer un étalonnage radiométrique",
            "description": "Convertit les nombres numériques SAR bruts en rétrodiffusion calibrée — bêta zéro, sigma zéro ou gamma zéro — afin que les acquisitions deviennent physiquement comparables et que les seuils publiés s'appliquent (ArcGIS Apply Radiometric Calibration). Rien dans les deux registres ne fait cela : rescale_value_range est un étirement linéaire sans signification radiométrique, et multilook, sar_coherence, les filtres de chatoiement de Lee et compute_sar_indices consomment les valeurs telles qu'elles leur sont fournies.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster SAR en comptes numériques, amplitude, intensité ou dB (voir 'input_units')."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster de rétrodiffusion calibrée en sortie. Si omis, stocké en mémoire."
              },
              "calibration_type": {
                "label": "Type de calibration",
                "description": "'sigma0' (par défaut), 'beta0' ou 'gamma0'. sigma0 et gamma0 nécessitent 'incidence_angle'."
              },
              "calibration_constant": {
                "label": "Constante de calibration",
                "description": "Constante de calibration du capteur A (par défaut 1.0). Ignorée lorsque 'calibration_lut' est fourni."
              },
              "calibration_lut": {
                "label": "Table de calibration",
                "description": "Raster co-enregistré optionnel des constantes de calibration A par cellule, remplaçant 'calibration_constant'."
              },
              "incidence_angle": {
                "label": "Angle d'incidence",
                "description": "Angle d'incidence local en degrés : une constante ou le chemin d'un raster co-enregistré. Obligatoire pour 'sigma0' et 'gamma0'."
              },
              "input_units": {
                "label": "Unités d'entrée",
                "description": "'dn' (par défaut), 'amplitude', 'intensity' ou 'db'. dn et amplitude sont élevés au carré pour obtenir la puissance ; db est d'abord délinéarisé."
              },
              "output_units": {
                "label": "Unités de sortie",
                "description": "'linear' (par défaut) ou 'db'."
              },
              "band": {
                "label": "Bande",
                "description": "Bande à calibrer, indexée à partir de 1 (par défaut 1)."
              }
            }
          },
          "apportion_polygon": {
            "name": "Répartir un polygone",
            "description": "Transfère des attributs numériques d'une couche de polygones source vers une couche de polygones cible, répartis selon la surface de chevauchement (réagrégation dasymétrique entre systèmes de zones), comme l'outil ArcGIS Apportion Polygon.",
            "params": {
              "target": {
                "label": "Cible",
                "description": "Couche de polygones cible (reçoit les valeurs réparties ; ses entités et ses attributs sont conservés)."
              },
              "source": {
                "label": "Source",
                "description": "Couche de polygones source portant les valeurs à répartir."
              },
              "fields": {
                "label": "Champs",
                "description": "Nom(s) de champ(s) numérique(s) de la source à répartir, séparés par des virgules."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur en sortie (une copie de la cible avec les colonnes réparties). Si omis, stocké en mémoire."
              },
              "method": {
                "label": "Méthode",
                "description": "'area' (par défaut ; répartition selon la surface de recouvrement) ou 'weight' (répartition selon la surface de recouvrement multipliée par le champ 'weight_field' de la cible)."
              },
              "weight_field": {
                "label": "Champ de poids",
                "description": "Champ numérique de la cible utilisé comme poids supplémentaire lorsque method=weight."
              },
              "suffix": {
                "label": "Suffixe",
                "description": "Suffixe des colonnes réparties en sortie. Par défaut '_app'."
              }
            }
          },
          "areal_interpolation": {
            "name": "Interpolation aréale",
            "description": "Prédit des valeurs agrégées pour des polygones cibles à partir de polygones sources de géographie différente, en ajustant une surface sous-jacente lisse puis en la réintégrant plutôt qu'en pondérant par la surface (ArcGIS Areal Interpolation Layer To Polygons). apportion_polygon suppose que la quantité est uniforme dans chaque polygone source — l'échec classique du problème des unités spatiales modifiables — et ne fournit aucune erreur standard ; la suite de krigeage intégrée est entièrement à support ponctuel et ne peut pas accepter d'observations polygonales.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Polygones source portant le champ mesuré."
              },
              "target": {
                "label": "Cible",
                "description": "Polygones cible pour lesquels prédire les valeurs."
              },
              "field": {
                "label": "Champ",
                "description": "Champ de valeurs numériques sur les polygones source."
              },
              "output": {
                "label": "Sortie",
                "description": "Polygones cible auxquels PREDICTED, PRED_STD_ERR et les diagnostics sont ajoutés. Si omis, stocké en mémoire."
              },
              "field_type": {
                "label": "Type de champ",
                "description": "'count' (par défaut) : un total extensif, remis à l'échelle pour préserver la somme source. 'average' : une moyenne intensive, prédite directement sans remise à l'échelle."
              },
              "discretization": {
                "label": "Discrétisation",
                "description": "Nombre approximatif de points intérieurs utilisés pour représenter le support surfacique de chaque polygone (par défaut 25). Une valeur plus élevée est plus précise et beaucoup plus lente."
              },
              "model": {
                "label": "Modèle",
                "description": "Modèle de variogramme : 'exponential' (par défaut), 'spherical' ou 'gaussian'."
              },
              "preserve_total": {
                "label": "Préserver le total",
                "description": "Remet à l'échelle les prédictions de type count afin que le total cible corresponde au total source (par défaut vrai pour 'count', toujours désactivé pour 'average'). Appliqué uniquement lorsque les cibles couvrent les sources — le facteur appliqué est signalé sous 'mass_scale' afin qu'une exécution à couverture partielle soit visible."
              }
            }
          },
          "attribute_uncertainty": {
            "name": "Incertitude attributaire",
            "description": "Propagation d'erreur Monte-Carlo avec graine sur un attribut incertain (comme ArcGIS Attribute Uncertainty) : tire des réalisations NORMALES/UNIFORMES à partir d'un champ d'erreur par entité ou d'une paire de bornes et ajoute les statistiques moyenne/écart-type/p5/p50/p95/CV.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle (ou table) en entrée comportant l'attribut incertain."
              },
              "value_field": {
                "label": "Champ de valeur",
                "description": "Champ numérique contenant l'estimation (moyenne/centre de la distribution) de chaque entité."
              },
              "error_field": {
                "label": "Champ d'erreur",
                "description": "Champ numérique contenant l'incertitude symétrique : une erreur type pour NORMAL, ou une demi-largeur pour UNIFORM. Fournir ce champ OU les deux champs lower_field/upper_field."
              },
              "lower_field": {
                "label": "Champ inférieur",
                "description": "Champ numérique contenant la borne inférieure de la valeur. À utiliser avec upper_field au lieu de error_field."
              },
              "upper_field": {
                "label": "Champ supérieur",
                "description": "Champ numérique contenant la borne supérieure de la valeur. À utiliser avec lower_field au lieu de error_field."
              },
              "distribution": {
                "label": "Distribution",
                "description": "Distribution de l'erreur : NORMAL (par défaut) ou UNIFORM."
              },
              "iterations": {
                "label": "Itérations",
                "description": "Nombre de réalisations de Monte-Carlo par entité (par défaut 1000)."
              },
              "seed": {
                "label": "Graine",
                "description": "Germe du générateur aléatoire déterministe (par défaut 1)."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche vectorielle en sortie avec les statistiques ajoutées. Si omis, stocké en mémoire."
              }
            }
          },
          "band_collection_statistics": {
            "name": "Statistiques de collection de bandes",
            "description": "Min/max/moyenne/écart-type par bande plus les matrices de covariance et de corrélation inter-bandes pour une pile de rasters (comme ArcGIS Band Collection Statistics) — le résumé multivarié (préalable à l'ACP / à la classification) qui manque à la suite intégrée ; distinct de cell_statistics, qui opère par pixel.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Un raster multibande (chaque bande est une couche) ou une liste de rasters co-enregistrés séparés par des virgules."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin CSV optionnel pour le rapport statistique. Les matrices sont toujours renvoyées dans le résultat."
              },
              "detail": {
                "label": "Détail",
                "description": "'detailed' (par défaut) inclut les matrices de covariance/corrélation ; 'brief' ne renvoie que les statistiques par bande."
              }
            }
          },
          "bivariate_spatial_association": {
            "name": "Association spatiale bivariée",
            "description": "Statistique L de Lee globale et locale mesurant où deux variables continues covarient spatialement, avec une valeur p de test par permutation avec graine et une classe Haut-Haut/Haut-Bas/Bas-Haut/Bas-Bas par entité — comme ArcGIS Bivariate Spatial Association. Le pendant en champ continu de colocation_analysis.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée comportant deux champs numériques."
              },
              "x_field": {
                "label": "Champ X",
                "description": "Premier champ de variable numérique."
              },
              "y_field": {
                "label": "Champ Y",
                "description": "Second champ de variable numérique."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche en sortie avec les champs L local, p-value et classe. Si omis, stocké en mémoire."
              },
              "neighbors": {
                "label": "Voisins",
                "description": "Nombre de plus proches voisins pour les poids spatiaux (par défaut 8)."
              },
              "permutations": {
                "label": "Permutations",
                "description": "Nombre de permutations pour le test de significativité (par défaut 199 ; 0 désactive)."
              },
              "seed": {
                "label": "Graine",
                "description": "Germe du générateur aléatoire des permutations (par défaut 1), pour des résultats reproductibles."
              }
            }
          },
          "block_statistics": {
            "name": "Statistiques par bloc",
            "description": "Partitionne un raster en blocs non chevauchants, réduit chacun par une statistique et réécrit cette valeur dans chaque cellule du bloc à la résolution d'entrée (ArcGIS Block Statistics). Complète focal_statistics (fenêtre glissante), zonal_statistics (par couche de zones) et cell_statistics (à travers une pile) ; contrairement à aggregate_raster intégré, il préserve la taille de cellule, de sorte que entrée - moyenne du bloc donne une surface de résidus locaux, et il ajoute les statistiques catégorielles majorité/minorité/médiane/variété.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              },
              "statistic": {
                "label": "Statistique",
                "description": "L'une des valeurs mean (par défaut), majority, maximum, median, minimum, minority, range, std, sum, variety."
              },
              "neighborhood": {
                "label": "Voisinage",
                "description": "Forme du bloc : rectangle (par défaut), circle, annulus ou wedge."
              },
              "size": {
                "label": "Taille",
                "description": "Dimensions du bloc en cellules : 'width,height' pour rectangle (par défaut '3,3'), 'radius' pour circle/wedge, ou 'inner,outer' pour annulus."
              },
              "start_angle": {
                "label": "Angle de début",
                "description": "Angle de départ du secteur en degrés dans le sens antihoraire à partir de l'est (par défaut 0)."
              },
              "end_angle": {
                "label": "Angle de fin",
                "description": "Angle de fin du secteur en degrés dans le sens antihoraire à partir de l'est (par défaut 90)."
              },
              "ignore_nodata": {
                "label": "Ignorer NoData",
                "description": "Si vrai (par défaut), les blocs sont calculés uniquement à partir des cellules valides ; si faux, toute cellule NoData rend l'ensemble du bloc NoData."
              },
              "band": {
                "label": "Bande",
                "description": "Bande à lire, indexée à partir de 1 (par défaut 1)."
              }
            }
          },
          "boundary_clean": {
            "name": "Nettoyage des limites",
            "description": "Lisse les limites des zones d'un raster catégoriel et supprime le chatoiement par filtrage majoritaire ou par nettoyage des limites par expansion/contraction, le nettoyage standard avant polygonisation — comme ArcGIS Boundary Clean / Majority Filter.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster catégoriel (à valeurs entières) en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie. Si omis, stocké en mémoire."
              },
              "method": {
                "label": "Méthode",
                "description": "'majority' (suppression du bruit par majorité des voisins ; par défaut) ou 'expand_shrink' (lissage Boundary Clean)."
              },
              "neighbors": {
                "label": "Voisins",
                "description": "Connectivité du voisinage : 4 (rook) ou 8 (queen ; par défaut)."
              },
              "threshold": {
                "label": "Seuil",
                "description": "Mode majority uniquement : 'majority' (majorité stricte des voisins ; par défaut) ou 'half' (au moins la moitié)."
              },
              "iterations": {
                "label": "Itérations",
                "description": "Nombre de passes à effectuer (par défaut 1)."
              },
              "sort": {
                "label": "Trier",
                "description": "Mode expand_shrink uniquement : priorité des zones selon le nombre de cellules — 'descending' (les grandes zones l'emportent ; par défaut), 'ascending' (les petites zones l'emportent) ou 'none'."
              },
              "band": {
                "label": "Bande",
                "description": "Bande à lire, indexée à partir de 1 (par défaut 1)."
              }
            }
          },
          "buffer_3d": {
            "name": "Zone tampon 3D",
            "description": "Crée des tampons volumétriques (sphères et capsules) autour de points et de lignes 3D, émis sous forme de surface triangulée, comme l'outil ArcGIS Buffer 3D.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de points ou de polylignes 3D en entrée (un Z manquant est traité comme 0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. Si omis, le résultat est stocké en mémoire."
              },
              "distance": {
                "label": "Distance",
                "description": "Rayon de la zone tampon en unités carte."
              },
              "distance_field": {
                "label": "Champ de distance",
                "description": "Champ de rayon par entité optionnel, remplaçant 'distance'."
              },
              "shape": {
                "label": "Forme",
                "description": "round (par défaut ; extrémités hémisphériques) ou flat (cylindre à extrémités plates)."
              },
              "quality": {
                "label": "Qualité",
                "description": "Résolution de la tessellation : nombre de segments sur la circonférence (par défaut 12, min 4, max 64)."
              }
            }
          },
          "buffer_vector": {
            "name": "Zone tampon vectorielle",
            "description": "Étend les géométries d'une distance donnée en créant des polygones tampons avec des styles d'extrémité/jointure personnalisables. La fusion optionnelle combine les tampons qui se chevauchent en polygones unifiés.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "distance": {
                "label": "Distance",
                "description": "Distance de la zone tampon en unités carte."
              },
              "quadrant_segments": {
                "label": "Segments par quadrant",
                "description": "Résolution des arcs en segments par quadrant ; 8 par défaut."
              },
              "cap_style": {
                "label": "Style d'extrémité",
                "description": "Style d'extrémité des lignes : round, flat ou square."
              },
              "join_style": {
                "label": "Style de jointure",
                "description": "Style de jointure des angles : round, bevel ou mitre."
              },
              "mitre_limit": {
                "label": "Limite d'onglet",
                "description": "Limite de la jointure en onglet utilisée lorsque join_style=mitre ; 5.0 par défaut."
              },
              "dissolve": {
                "label": "Dissoudre",
                "description": "Fusionne les zones tampons qui se chevauchent en un seul polygone unifié ; faux par défaut."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie."
              }
            }
          },
          "build_balanced_zones": {
            "name": "Construire des zones équilibrées",
            "description": "Regroupe des polygones contigus en un nombre cible de zones connexes équilibrant le nombre d'entités, la somme d'un attribut ou l'homogénéité d'un attribut, par partitionnement d'arbre couvrant SKATER.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de polygones en entrée, format détecté automatiquement (ou identifiant en mémoire)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel (pilote selon son extension). S'il est omis, stocké en mémoire."
              },
              "zones": {
                "label": "Zones",
                "description": "Nombre de zones à créer."
              },
              "criterion": {
                "label": "Critère",
                "description": "Objectif d'équilibrage : 'homogeneity' (par défaut), 'equal_count' ou 'equal_sum' (du premier champ)."
              },
              "fields": {
                "label": "Champs",
                "description": "Champ(s) d'analyse numérique(s) séparés par des virgules. Obligatoire pour 'homogeneity' et 'equal_sum' ; détermine les poids des arêtes de l'arbre couvrant."
              },
              "contiguity": {
                "label": "Contiguïté",
                "description": "Règle d'adjacence : 'rook' (bord partagé, par défaut) ou 'queen' (bord ou sommet partagé)."
              },
              "tolerance": {
                "label": "Tolérance",
                "description": "Distance maximale pour que deux segments de limite soient considérés comme partagés (rook). Par défaut 1e-6."
              }
            }
          },
          "build_seamlines": {
            "name": "Construire des lignes de raccord",
            "description": "Étant donné un ensemble de rasters qui se chevauchent (et des emprises optionnelles), calcule où chaque image doit être coupée pour que la mosaïque se raccorde le long d'une couture minimalement visible, en produisant un polygone de ligne de couture non chevauchant par image via une affectation de Voronoï, par ordre de priorité, radiométrique ou sensible aux contours. Comme l'outil ArcGIS Build Seamlines.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Chemins des rasters à mosaïquer, séparés par des virgules ou des points-virgules."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin des polygones de lignes de raccord en sortie (une entité par raster en entrée). Si omis, stocké en mémoire."
              },
              "footprints": {
                "label": "Emprises",
                "description": "Couche de polygones optionnelle donnant l'emprise valide de chaque raster, dans l'ordre des entrées. Déduite des données valides si omise."
              },
              "method": {
                "label": "Méthode",
                "description": "'voronoi' (par défaut), 'order', 'radiometry' ou 'edge_detection'."
              },
              "sort_ascending": {
                "label": "Tri croissant",
                "description": "Pour la méthode 'order' : vrai (par défaut) donne la priorité aux premiers rasters, faux la donne aux derniers."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule d'analyse (par défaut : la plus fine des tailles de cellule en entrée)."
              },
              "band": {
                "label": "Bande",
                "description": "Bande utilisée pour les méthodes radiométriques, indexée à partir de 1 (par défaut 1)."
              },
              "min_region_size": {
                "label": "Taille minimale de région",
                "description": "Réaffecte à une image voisine les régions attribuées plus petites que ce nombre de cellules (par défaut 0, c'est-à-dire conserver toutes les régions)."
              },
              "blend_width": {
                "label": "Largeur de fondu",
                "description": "Largeur de fondu en unités carte, écrite comme attribut pour le mosaïquage en aval (par défaut 0)."
              },
              "blend_type": {
                "label": "Type de fondu",
                "description": "'both' (par défaut), 'inside' ou 'outside' ; écrit comme attribut."
              }
            }
          },
          "calculate_adjacent_fields": {
            "name": "Calculer les champs adjacents",
            "description": "Renseigne huit champs de feuilles voisines directionnelles (N, NE, E, SE, S, SO, O, NO) sur chaque tuile d'une grille d'index de série de cartes avec le nom de la page adjacente, pour les étiquettes de marge « suite sur la feuille … » — comme l'outil ArcGIS Calculate Adjacent Fields.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Grille d'index de série de cartes polygonale en entrée (par exemple la sortie de grid_index_features)."
              },
              "page_name_field": {
                "label": "Champ de nom de page",
                "description": "Champ dont la valeur étiquette chaque page (écrite dans les champs directionnels des voisins)."
              },
              "output": {
                "label": "Sortie",
                "description": "Vecteur polygonal en sortie (pilote déduit de l'extension). Si omis, stocké en mémoire."
              },
              "include_diagonal": {
                "label": "Inclure la diagonale",
                "description": "Renseigne également les quatre champs diagonaux (NE, SE, SW, NW) à partir des tuiles se touchant par un coin. Vrai par défaut."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Quantifie les sommets sur une grille de cette taille (unités du SCR) avant la mise en correspondance des bordures. Par défaut 0 (coordonnées exactes)."
              }
            }
          },
          "calculate_central_meridian_and_parallels": {
            "name": "Calculer le méridien central et les parallèles",
            "description": "Calcule pour chaque entité un méridien central et deux parallèles standards à partir de son emprise, pour les pages de séries de cartes et d'atlas, comme l'outil ArcGIS Calculate Central Meridian And Parallels.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Entités en entrée en coordonnées géographiques (longitude/latitude), typiquement une grille de pages issue de grid_index_features."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. Si omis, le résultat est stocké en mémoire."
              },
              "field": {
                "label": "Champ",
                "description": "Nom du champ de méridien central à écrire (par défaut 'central_meridian')."
              },
              "standard_offset": {
                "label": "Décalage standard",
                "description": "Fraction de la plage de latitude utilisée pour décaler chaque parallèle standard depuis le bord de l'entité (par défaut 0.1667, la règle du 1/6 d'Esri). Doit être dans [0, 0.5)."
              }
            }
          },
          "calculate_composite_index": {
            "name": "Calculer un indice composite",
            "description": "Combine plusieurs attributs numériques en un indice composite (comme ArcGIS Calculate Composite Index) : mise à l'échelle par variable (min-max/score z/percentile) avec inversion optionnelle, combinaison pondérée (moyenne/somme/moyenne géométrique) et remise à l'échelle de la sortie — le pendant vectoriel de fuzzy_overlay.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle (ou table) en entrée comportant des champs de variables numériques."
              },
              "fields": {
                "label": "Champs",
                "description": "Champs de variables séparés par des virgules ; ajouter ':reverse' à un champ dont les valeurs élevées doivent abaisser l'indice (par exemple 'income:reverse,unemployment')."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche vectorielle en sortie avec les champs d'indice ajoutés. Si omis, stocké en mémoire."
              },
              "scaling": {
                "label": "Mise à l'échelle",
                "description": "Mise à l'échelle par variable : 'minmax' (par défaut), 'zscore', 'percentile' ou 'none'."
              },
              "weights": {
                "label": "Poids",
                "description": "Poids séparés par des virgules correspondant à 'fields' (par défaut : poids égaux)."
              },
              "combine": {
                "label": "Combiner",
                "description": "Mode de combinaison des variables mises à l'échelle : 'mean' (par défaut), 'sum' ou 'geometric_mean'."
              },
              "output_range": {
                "label": "Plage en sortie",
                "description": "Remise à l'échelle de l'indice combiné : 'minmax' (0–1, par défaut), 'zero_to_100', 'zscore' ou 'none'."
              }
            }
          },
          "calculate_distance_band": {
            "name": "Calculer la bande de distance",
            "description": "Rapporte les distances minimale, moyenne et maximale auxquelles chaque entité possède au moins N voisins (comme ArcGIS Calculate Distance Band from Neighbor Count) — le diagnostic de seuil garantissant qu'aucune entité ne reste sans voisin avant les statistiques spatiales basées sur la distance. generate_spatial_weights_matrix intégré construit la matrice mais ne rapporte jamais cette bande.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points/entités en entrée (SCR projeté ; distances dans ses unités)."
              },
              "neighbors": {
                "label": "Voisins",
                "description": "Nombre de voisins k (>= 1). Par défaut 1."
              },
              "distance_method": {
                "label": "Méthode de distance",
                "description": "'euclidean' (par défaut) ou 'manhattan'."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin CSV optionnel pour une table feature_id,kth_neighbor_distance."
              }
            }
          },
          "calculate_end_time": {
            "name": "Calculer l'heure de fin",
            "description": "Remplit un champ d'heure de fin à partir de l'heure de début de l'enregistrement suivant dans chaque groupe d'entités, transformant des observations instantanées en enregistrements à étendue temporelle (ArcGIS Calculate End Time). transform_fields effectue des transformations par valeur et summary_statistics agrège des groupes, mais rien ne réalisait un remplissage temporel ordonné par ligne.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle ou table en entrée."
              },
              "start_field": {
                "label": "Champ de début",
                "description": "Champ d'horodatage : un epoch numérique ou une chaîne de date/date-heure ISO-8601."
              },
              "end_field": {
                "label": "Champ de fin",
                "description": "Champ recevant l'heure de fin (par défaut 'END_TIME'). Créé s'il est absent, écrasé s'il est présent."
              },
              "id_fields": {
                "label": "Champs d'identifiant",
                "description": "Champs de regroupement séparés par des virgules ou des points-virgules. Les heures de fin sont déduites uniquement au sein d'un groupe, jamais au-delà des limites de groupe."
              },
              "last_record": {
                "label": "Dernier enregistrement",
                "description": "Valeur à écrire pour la dernière ligne de chaque groupe : 'null' (par défaut), 'same_as_start' ou 'duration' (début + default_duration)."
              },
              "default_duration": {
                "label": "Durée par défaut",
                "description": "Secondes ajoutées au début pour last_record 'duration'."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche en sortie. Si omis, stocké en mémoire."
              }
            }
          },
          "calculate_grid_convergence_angle": {
            "name": "Calculer l'angle de convergence des méridiens",
            "description": "Calcule, pour chaque entité, l'angle de convergence des méridiens entre le nord de la grille et le nord vrai à partir de la longitude/latitude du centroïde et d'un méridien central (par défaut le méridien central UTM propre à l'entité), et l'écrit dans un champ pour une rotation correcte des symboles/étiquettes sur les cartes projetées — comme l'outil ArcGIS Calculate Grid Convergence Angle. Convention géographique (horaire depuis le nord) ou arithmétique (antihoraire depuis l'est). Mathématiques pures, sans PROJ ; sans rapport avec la métrique de terrain convergence_index intégrée. La géométrie est lue en degrés lon/lat.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée (tout type de géométrie) en coordonnées géographiques (degrés lon/lat, EPSG:4326)."
              },
              "angle_field": {
                "label": "Champ d'angle",
                "description": "Nom du champ flottant devant contenir l'angle de convergence en degrés. Par défaut 'GRID_CONV'."
              },
              "angle_type": {
                "label": "Type d'angle",
                "description": "Convention d'angle : 'geographic' (degrés dans le sens horaire à partir du nord, positif vers l'est) ou 'arithmetic' (degrés dans le sens antihoraire à partir de l'est, 90 − geographic). Par défaut 'geographic'."
              },
              "central_meridian": {
                "label": "Méridien central",
                "description": "Longitude du méridien central en degrés. Si omise, chaque entité utilise le méridien central de sa propre zone UTM déduit de sa longitude."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de sortie (pilote déduit de l'extension). Si omis, le résultat est stocké en mémoire."
              }
            }
          },
          "calculate_missing_z_values": {
            "name": "Calculer les valeurs Z manquantes",
            "description": "Remplit les valeurs Z absentes ou de substitution le long des entités 3D en interpolant à partir des valeurs Z valides de part et d'autre, comme l'outil ArcGIS Calculate Missing Z Values.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche d'entités en entrée comportant des sommets 3D."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. Si omis, le résultat est stocké en mémoire."
              },
              "placeholder": {
                "label": "Espace réservé",
                "description": "Valeur sentinelle marquant un Z manquant (par exemple -9999). Les sommets totalement dépourvus de Z sont toujours considérés comme manquants."
              },
              "method": {
                "label": "Méthode",
                "description": "Méthode de remplissage : 'linear' (par défaut ; interpolation selon la distance le long de l'entité) ou 'nearest'."
              },
              "extrapolate": {
                "label": "Extrapoler",
                "description": "Comble les lacunes de début/fin en prolongeant le sommet valide le plus proche (faux par défaut ; les sommets non comblés sont comptabilisés à la place)."
              }
            }
          },
          "calculate_motion_statistics": {
            "name": "Calculer les statistiques de mouvement",
            "description": "Annote des points de trace horodatés avec des statistiques de mouvement — vitesse, accélération, relèvement, distance de segment et cumulée, temps écoulé et indicateur d'inactivité — regroupés par trace et ordonnés par temps, comme l'outil ArcGIS Calculate Motion Statistics.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points en entrée comportant des observations horodatées."
              },
              "track_field": {
                "label": "Champ de trace",
                "description": "Champ identifiant chaque trace/mobile."
              },
              "time_field": {
                "label": "Champ de temps",
                "description": "Champ contenant l'heure de chaque point : secondes numériques ou horodatage ISO-8601."
              },
              "output": {
                "label": "Sortie",
                "description": "Vecteur de points en sortie (attributs d'origine + champs de mouvement). Si omis, stocké en mémoire."
              },
              "window": {
                "label": "Fenêtre",
                "description": "Nombre de points précédents pour la vitesse lissée 'avg_speed' (par défaut 1 = instantanée)."
              },
              "idle_distance": {
                "label": "Distance d'inactivité",
                "description": "Rayon d'immobilité : un point est immobile lorsque le mobile ne s'est pas déplacé de plus que cette valeur au cours des dernières idle_duration secondes. Par défaut 0 (détection d'immobilité désactivée)."
              },
              "idle_duration": {
                "label": "Durée d'inactivité",
                "description": "Fenêtre rétrospective (en secondes) pour la détection d'immobilité. Par défaut 60."
              }
            }
          },
          "calculate_polygon_main_angle": {
            "name": "Calculer l'angle principal du polygone",
            "description": "Écrit l'orientation dominante de chaque polygone (direction du grand côté de son rectangle englobant de surface minimale, via les compas tournants) dans un champ d'angle — comme l'outil ArcGIS Calculate Polygon Main Angle. L'orientation vectorielle par polygone qui manque à patch_orientation, limité au raster ; alimente la rotation des symboles/étiquettes.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de polygones en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche de polygones en sortie avec le champ d'angle ajouté. Si omis, stocké en mémoire."
              },
              "angle_field": {
                "label": "Champ d'angle",
                "description": "Nom du champ d'angle à écrire (par défaut 'MainAngle')."
              },
              "convention": {
                "label": "Convention",
                "description": "'arithmetic' (antihoraire à partir de l'est ; par défaut), 'geographic' (horaire à partir du nord) ou 'graphic' (horaire à partir de l'est)."
              }
            }
          },
          "calculate_rates": {
            "name": "Calculer des taux",
            "description": "Calcule des taux lissés à partir de champs de comptage et de population (comme ArcGIS Calculate Rates) : taux brut, Bayes empirique global de Marshall ou Bayes empirique spatial sur les k plus proches voisins — l'étape standard de stabilisation avant l'analyse des points chauds de taux de maladie/criminalité.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de polygones ou de points en entrée comportant des champs d'effectif et de population."
              },
              "count_field": {
                "label": "Champ de comptage",
                "description": "Champ contenant le nombre d'événements (numérateur)."
              },
              "population_field": {
                "label": "Champ de population",
                "description": "Champ contenant la population à risque (dénominateur)."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche en sortie avec les champs de taux ajoutés. Si omis, stocké en mémoire."
              },
              "method": {
                "label": "Méthode",
                "description": "'crude', 'eb_global' (par défaut) ou 'eb_spatial'."
              },
              "per": {
                "label": "Par",
                "description": "Multiplicateur de taux, par exemple 100000 pour un taux pour 100 000 (par défaut 100000)."
              },
              "neighbors": {
                "label": "Voisins",
                "description": "eb_spatial uniquement : nombre de plus proches voisins pour le taux de référence local (par défaut 8)."
              }
            }
          },
          "calculate_transformation_errors": {
            "name": "Calculer les erreurs de transformation",
            "description": "Ajuste une transformation de similitude/affine/projective à partir de liens de déplacement et rapporte l'erreur résiduelle de chaque lien ainsi que la RMSE globale, afin de détecter et supprimer les mauvais points de contrôle avant la transformation. Comme l'outil ArcGIS Calculate Transformation Errors.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Lignes de liaison de déplacement : le premier sommet est le point source (départ), le dernier sommet le point cible (arrivée)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie de la table de liaisons avec les champs de résidus ajoutés. Si omis, stocké en mémoire."
              },
              "method": {
                "label": "Méthode",
                "description": "'affine' (par défaut, 6 paramètres), 'similarity' (4) ou 'projective' (8)."
              },
              "keep_geometry": {
                "label": "Conserver la géométrie",
                "description": "Conserve la géométrie de chaque liaison dans la sortie (vrai par défaut). Définir à faux pour obtenir une table seule."
              }
            }
          },
          "calculate_transit_service_frequency": {
            "name": "Calculer la fréquence de desserte",
            "description": "Fréquence de service de transport en commun GTFS sur une fenêtre : pour une date de service (via calendar/calendar_dates) et une fenêtre horaire, compte les voyages desservant chaque arrêt ou ligne d'itinéraire et rapporte les voyages par heure, comme l'outil ArcGIS Calculate Transit Service Frequency.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin d'un répertoire de flux GTFS extrait."
              },
              "target": {
                "label": "Cible",
                "description": "'stops' (un point par arrêt, par défaut) ou 'lines' (une polyligne par ligne)."
              },
              "date": {
                "label": "Date",
                "description": "Date de service YYYYMMDD, résolue via calendar.txt/calendar_dates.txt. Si omise, tous les services sont comptabilisés."
              },
              "start_time": {
                "label": "Heure de début",
                "description": "Début de la fenêtre HH:MM ou HH:MM:SS (les heures GTFS peuvent dépasser 24:00). Si omis, la journée entière est comptabilisée."
              },
              "duration_minutes": {
                "label": "Durée (minutes)",
                "description": "Longueur de la fenêtre en minutes (utilisée avec start_time ; définit aussi le dénominateur horaire)."
              },
              "count": {
                "label": "Nombre",
                "description": "'departures' (par défaut) ou 'arrivals' — le champ d'horaire d'arrêt à comptabiliser."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de sortie (pilote déduit de l'extension). Si omis, le résultat est stocké en mémoire."
              }
            }
          },
          "calculate_utm_zone": {
            "name": "Calculer la zone UTM",
            "description": "Calcule la zone UTM optimale et le code EPSG WGS84 de chaque entité à partir de la longitude/latitude de son centroïde, en ajoutant un champ de zone (1–60) et un champ EPSG (326##/327##) — pour les séries de cartes à projection adaptative, comme l'outil ArcGIS Calculate UTM Zone. Mathématiques pures avec les exceptions de la Norvège/du Svalbard ; sans PROJ. La géométrie est lue en degrés lon/lat.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée (tout type de géométrie) en coordonnées géographiques (degrés lon/lat, EPSG:4326)."
              },
              "zone_field": {
                "label": "Champ de zone",
                "description": "Nom du champ entier devant contenir le numéro de zone UTM (1–60). Par défaut 'utm_zone'."
              },
              "epsg_field": {
                "label": "Champ EPSG",
                "description": "Nom du champ entier devant contenir le code EPSG UTM WGS84 (326## nord, 327## sud). Par défaut 'utm_epsg'."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de sortie (pilote déduit de l'extension). Si omis, le résultat est stocké en mémoire."
              }
            }
          },
          "cartogram": {
            "name": "Cartogramme",
            "description": "Déforme les polygones pour que leur surface soit proportionnelle à une valeur d'attribut : non contigu (mise à l'échelle de chaque polygone autour de son centroïde) ou Dorling (cercles proportionnels avec suppression des chevauchements).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de polygones en entrée, format détecté automatiquement (ou référence en mémoire)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel (pilote selon son extension). S'il est omis, stocké en mémoire."
              },
              "value_field": {
                "label": "Champ de valeur",
                "description": "Champ numérique auquel la surface de chaque entité doit être proportionnelle."
              },
              "method": {
                "label": "Méthode",
                "description": "'non_contiguous' (par défaut ; met les polygones à l'échelle sur place) ou 'dorling' (cercles proportionnels)."
              },
              "iterations": {
                "label": "Itérations",
                "description": "Nombre d'itérations de suppression des chevauchements Dorling (par défaut 100). Ignoré par non_contiguous."
              }
            }
          },
          "causal_inference_analysis": {
            "name": "Analyse d'inférence causale",
            "description": "Estime l'effet causal d'un traitement binaire sur un résultat par appariement sur score de propension, pondération par probabilité inverse ou ajustement par régression, avec un intervalle de confiance bootstrap avec graine et une table d'équilibre des covariables par facteur de confusion avant/après ajustement (comme ArcGIS Causal Inference Analysis).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche d'entités en entrée."
              },
              "outcome_field": {
                "label": "Champ de résultat",
                "description": "Champ numérique de résultat (variable dépendante)."
              },
              "treatment_field": {
                "label": "Champ de traitement",
                "description": "Champ de traitement binaire (0/1 ou booléen). Les traitements continus ne sont pas pris en charge dans cette version."
              },
              "confounding_fields": {
                "label": "Champs de confusion",
                "description": "Champ(s) numérique(s) de facteurs de confusion à ajuster, séparés par des virgules."
              },
              "method": {
                "label": "Méthode",
                "description": "'ps_matching' (par défaut, appariement par plus proche voisin avec caliper sur le score de propension), 'ipw' (pondération par l'inverse de la probabilité stabilisée) ou 'regression_adjustment' (résultat ~ traitement + facteurs de confusion)."
              },
              "add_spatial_confounders": {
                "label": "Ajouter des facteurs de confusion spatiaux",
                "description": "Si vrai, élargit l'ensemble des facteurs de confusion avec les coordonnées x/y de chaque entité ainsi que la moyenne des k plus proches voisins de chaque facteur de confusion (faux par défaut)."
              },
              "balance_threshold": {
                "label": "Seuil d'équilibre",
                "description": "Seuil de différence moyenne standardisée pour le contrôle d'équilibre après ajustement (par défaut 0.1)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de sortie optionnel (copie de l'entrée + colonnes de score de propension / poids / identifiant d'appariement). Si omis, stocké en mémoire."
              },
              "seed": {
                "label": "Graine",
                "description": "Germe entier pour l'intervalle de confiance bootstrap déterministe (par défaut 42)."
              }
            }
          },
          "cell_position_statistics": {
            "name": "Statistiques de position de cellule",
            "description": "Statistiques de position et de rang par cellule à travers une pile de rasters alignés (ArcGIS Highest Position, Lowest Position, Popularity et Rank) : quelle couche détient la valeur extrême, la valeur apparaissant un nombre donné de fois, ou la n-ième plus petite valeur. cell_statistics réduit une pile à une valeur et ne peut jamais indiquer de quelle couche elle provient, et find_argument_statistics intégré travaille le long de l'axe d'argument d'un seul raster multibande sans la sémantique de sélection popularité/rang.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Un raster multibande (chaque bande est une couche) ou une liste de rasters co-enregistrés séparés par des virgules."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster en sortie. Si omis, stocké en mémoire."
              },
              "statistic": {
                "label": "Statistique",
                "description": "'highest_position' (par défaut), 'lowest_position', 'popularity' ou 'rank'."
              },
              "selector": {
                "label": "Sélecteur",
                "description": "Obligatoire pour 'popularity' et 'rank' : le chemin d'un raster co-enregistré, ou un nombre constant, donnant le nombre d'occurrences par cellule (popularity) ou le rang à sélectionner, indexé à partir de 1 (rank)."
              },
              "ignore_nodata": {
                "label": "Ignorer NoData",
                "description": "Ignore les observations NoData pour chaque cellule (vrai par défaut). Si faux, toute observation NoData rend la cellule NoData."
              },
              "process_as_multiband": {
                "label": "Traiter en multibande",
                "description": "'single_band' (par défaut) : chaque bande de chaque entrée constitue une couche d'une pile unique. 'multi_band' : la bande i de chaque entrée forme sa propre pile, ce qui donne un résultat multibande."
              }
            }
          },
          "cell_records_to_sectors": {
            "name": "Enregistrements de cellules vers secteurs",
            "description": "Construit la géométrie de couverture d'antennes à partir de points de tours cellulaires : polygones en secteur ou lignes bissectrices de secteur à partir de l'azimut, de la largeur de faisceau et du rayon de chaque tour — comme ArcGIS Cell Site Records To Feature Class / Generate Sector Lines.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points en entrée représentant des antennes/pylônes."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de sortie (pilote déduit de l'extension). Si omis, le résultat est stocké en mémoire."
              },
              "output_type": {
                "label": "Type de sortie",
                "description": "Géométrie à produire : 'wedge' (polygones de couverture, par défaut) ou 'line' (lignes bissectrices de secteur)."
              },
              "azimuth_field": {
                "label": "Champ d'azimut",
                "description": "Champ contenant l'azimut de chaque antenne (degrés boussole, 0 = nord, sens horaire). Utilise 'azimuth' par défaut s'il est absent."
              },
              "beamwidth_field": {
                "label": "Champ de largeur de faisceau",
                "description": "Champ contenant l'ouverture de faisceau de chaque antenne en degrés. Utilise 'beamwidth' par défaut s'il est absent."
              },
              "radius_field": {
                "label": "Champ de rayon",
                "description": "Champ contenant le rayon de couverture de chaque antenne en unités du SCR. Utilise 'radius' par défaut s'il est absent."
              },
              "azimuth": {
                "label": "Azimut",
                "description": "Azimut par défaut en degrés boussole lorsqu'aucun champ n'est fourni / qu'une valeur est manquante. Par défaut 0."
              },
              "beamwidth": {
                "label": "Largeur de faisceau",
                "description": "Ouverture de faisceau par défaut en degrés (0 < bw ≤ 360 ; ≥ 360 = omnidirectionnel). Par défaut 65."
              },
              "radius": {
                "label": "Rayon",
                "description": "Rayon de couverture par défaut en unités du SCR (doit être positif). Par défaut 1000."
              },
              "segments": {
                "label": "Segments",
                "description": "Nombre de segments droits utilisés pour approcher chaque arc de secteur (≥ 1). Par défaut 16."
              }
            }
          },
          "cell_statistics": {
            "name": "Statistiques de cellules",
            "description": "Statistique par pixel à travers une pile de rasters alignés (comme ArcGIS Cell Statistics) : moyenne, majorité, maximum, médiane, minimum, minorité, percentile, plage, écart-type, somme ou variété — le réducteur local multi-rasters que sum_overlay/weighted_sum intégrés (somme uniquement) et les outils de voisinage/zonaux ne fournissent pas.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Un raster multibande (chaque bande est une couche) ou une liste de rasters co-enregistrés séparés par des virgules."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster monobande en sortie contenant la valeur réduite. Si omis, stocké en mémoire."
              },
              "statistic": {
                "label": "Statistique",
                "description": "'mean' (par défaut), 'majority', 'maximum', 'median', 'minimum', 'minority', 'percentile', 'range', 'std', 'sum' ou 'variety'."
              },
              "ignore_nodata": {
                "label": "Ignorer NoData",
                "description": "Ignore les observations NoData pour chaque cellule (vrai par défaut). Si faux, toute observation NoData rend la cellule NoData."
              },
              "percentile_value": {
                "label": "Valeur de percentile",
                "description": "Percentile dans [0, 100] pour la statistique 'percentile' (par défaut 50 = médiane)."
              }
            }
          },
          "central_feature": {
            "name": "Entité centrale / moyenne directionnelle linéaire",
            "description": "L'entité centrale (l'entité d'entrée ayant la plus petite distance totale à toutes les autres) ou la moyenne directionnelle linéaire (relèvement moyen, variance circulaire et longueur moyenne des entités linéaires) — les deux membres de Mesure des distributions géographiques qui manquent à directional_distribution (ArcGIS Central Feature / Linear Directional Mean).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée (points pour central_feature ; lignes pour linear_directional_mean)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de sortie (pilote déduit de l'extension). Si omis, le résultat est stocké en mémoire."
              },
              "statistic": {
                "label": "Statistique",
                "description": "'central_feature' (par défaut) ou 'linear_directional_mean'."
              },
              "weight_field": {
                "label": "Champ de poids",
                "description": "Champ numérique optionnel pondérant chaque entité (central_feature uniquement)."
              },
              "case_field": {
                "label": "Champ de cas",
                "description": "Champ optionnel de regroupement des entités ; un résultat par valeur distincte."
              },
              "distance": {
                "label": "Distance",
                "description": "Métrique de distance pour central_feature : 'euclidean' (par défaut) ou 'manhattan'."
              },
              "orientation_only": {
                "label": "Orientation uniquement",
                "description": "Traite les lignes comme non orientées (orientation modulo 180°) pour linear_directional_mean. Faux par défaut."
              }
            }
          },
          "change_point_detection": {
            "name": "Détection de points de rupture",
            "description": "Détecte les changements abrupts de la série temporelle en chaque emplacement d'un cube spatio-temporel H3 (comme ArcGIS Change Point Detection) : segmentation binaire sur un coût de changement de moyenne ou de pente avec une pénalité ajustée par la sensibilité (ou un nombre fixe de points de changement), rapportant par cellule le nombre de changements, l'année du plus grand changement et les moyennes des segments. La segmentation temporelle que change_vector_analysis (deux dates) et les tests monotones de Mann-Kendall ne peuvent pas faire.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de points en entrée d'événements horodatés (lon/lat)."
              },
              "time_field": {
                "label": "Champ de temps",
                "description": "Champ contenant l'heure de chaque point : un nombre ou un horodatage ISO-8601."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche de polygones H3 en sortie avec les attributs de points de rupture. Si omis, stocké en mémoire."
              },
              "value_field": {
                "label": "Champ de valeur",
                "description": "Champ numérique à agréger par cellule (par défaut : nombre de points)."
              },
              "change_type": {
                "label": "Type de changement",
                "description": "'mean' (décalages de niveau ; par défaut) ou 'slope' (changements de tendance)."
              },
              "method": {
                "label": "Méthode",
                "description": "'auto' (basé sur une pénalité, par défaut) ou 'defined' (exactement num_change_points)."
              },
              "num_change_points": {
                "label": "Nombre de points de changement",
                "description": "Méthode defined : nombre de points de rupture à trouver par emplacement (par défaut 1)."
              },
              "sensitivity": {
                "label": "Sensibilité",
                "description": "Méthode auto : échelle de pénalité ; plus elle est élevée, moins il y a de points de rupture (par défaut 1.0)."
              },
              "time_step": {
                "label": "Pas de temps",
                "description": "Largeur d'un pas de temps dans les unités de time_field (par défaut 1)."
              },
              "resolution": {
                "label": "Résolution",
                "description": "Résolution H3 de 0 à 15 (par défaut 7)."
              }
            }
          },
          "classification_accuracy_assessment": {
            "name": "Évaluation de la précision de classification",
            "description": "Évalue un raster classifié (ou des points portant déjà une classe prédite) par rapport à des points de référence étiquetés avec la vérité terrain, en produisant une matrice de confusion, la précision globale, la précision producteur/utilisateur par classe et le kappa de Cohen — comme l'outil ArcGIS Compute Confusion Matrix.",
            "params": {
              "points": {
                "label": "Points",
                "description": "Couche de points de référence (évaluation de la précision) portant le champ de classe de vérité terrain."
              },
              "class_field": {
                "label": "Champ de classe",
                "description": "Attribut des points contenant l'étiquette de classe de vérité terrain (référence)."
              },
              "input": {
                "label": "Entrée",
                "description": "Raster classé à échantillonner à chaque point de référence (cellule la plus proche). Fournir ce paramètre OU 'classified_field'."
              },
              "classified_field": {
                "label": "Champ classifié",
                "description": "Attribut des points contenant déjà la classe prédite (carte), utilisé au lieu de l'échantillonnage d'un raster. Fournir ce paramètre OU 'input'."
              },
              "band": {
                "label": "Bande",
                "description": "Bande du raster classé à échantillonner, indexée à partir de 1 (par défaut 1)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur en sortie pour les points de référence annotés avec REF_CLASS, MAP_CLASS, CORRECT. Si omis, stocké en mémoire."
              }
            }
          },
          "collapse_dual_lines_to_centerline": {
            "name": "Réduire les lignes doubles en axe médian",
            "description": "Détecte les paires de lignes approximativement parallèles dans une tolérance de largeur (chaussées séparées, bordures de routes) et remplace chaque paire par une seule ligne centrale, en reconnectant les jonctions — comme l'outil ArcGIS Collapse Dual Lines To Centerline.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de lignes en entrée (SCR projeté ; largeurs dans ses unités)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de la couche vectorielle de lignes en sortie (pilote déduit de l'extension). Si omis, stocké en mémoire."
              },
              "min_width": {
                "label": "Largeur minimale",
                "description": "Écartement minimal entre lignes appariées, en unités du SCR (par défaut 0)."
              },
              "max_width": {
                "label": "Largeur maximale",
                "description": "Écartement maximal entre lignes appariées, en unités du SCR. Obligatoire (la largeur de fusion)."
              },
              "attribute": {
                "label": "Attribut",
                "description": "Champ optionnel qui doit correspondre pour que deux lignes soient appariées (par exemple le nom ou la classe de la route)."
              },
              "sample_distance": {
                "label": "Distance d'échantillonnage",
                "description": "Intervalle de densification pour le test de parallélisme, en unités du SCR. Par défaut : max_width / 2."
              },
              "min_overlap": {
                "label": "Chevauchement minimal",
                "description": "Fraction minimale d'une ligne devant être parallèle à sa partenaire pour être appariée (0-1, par défaut 0.5)."
              }
            }
          },
          "collapse_hydro_polygon": {
            "name": "Réduire un polygone hydrographique",
            "description": "Réduit les polygones d'eau étroits en lignes centrales tout en conservant les tronçons larges en polygones (comme ArcGIS Collapse Hydro Polygon) : trace la ligne centrale de chaque polygone le long de son axe principal via les milieux de sections transversales perpendiculaires, mesure la largeur locale et réduit là où la largeur médiane est inférieure ou égale à un seuil. La généralisation polygone→ligne seuillée par la largeur que collapse_dual_lines_to_centerline (bordures de lignes) et river_centerlines (raster) ne font pas.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de polygones d'eau en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche d'axes médians en sortie pour les polygones réduits (étroits). Si omis, stocké en mémoire."
              },
              "collapse_width": {
                "label": "Largeur de réduction",
                "description": "Les polygones dont la largeur médiane est inférieure ou égale à cette valeur sont réduits à un axe médian."
              },
              "sample_distance": {
                "label": "Distance d'échantillonnage",
                "description": "Espacement des stations de sections transversales le long de l'axe (par défaut : collapse_width / 2)."
              },
              "min_length": {
                "label": "Longueur minimale",
                "description": "Supprime les axes médians réduits plus courts que cette valeur (par défaut 0)."
              },
              "retained": {
                "label": "Conservés",
                "description": "Couche de polygones en sortie optionnelle pour les tronçons larges (non réduits)."
              }
            }
          },
          "collapse_road_detail": {
            "name": "Réduire le détail routier",
            "description": "Réduit les petites boucles et baïonnettes routières (ronds-points, os de chien, décalages) en dessous d'un seuil de diamètre en connexions traversantes simples pour l'affichage à petite échelle, en préservant la connectivité du réseau — comme l'outil ArcGIS Collapse Road Detail.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de routes (lignes) en entrée, format détecté automatiquement (ou identifiant en mémoire)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel (pilote selon son extension). S'il est omis, stocké en mémoire."
              },
              "collapse_distance": {
                "label": "Distance de réduction",
                "description": "Diamètre maximal des détails à réduire. Les boucles/décrochements dont le diamètre englobant est inférieur à cette valeur (mètres pour un SCR géographique, unités du SCR sinon) sont réduits ; les plus grands sont conservés."
              },
              "road_class_field": {
                "label": "Champ de classe de route",
                "description": "Champ de classe de route optionnel. S'il est défini, seules les boucles dont toutes les routes de bordure partagent la même valeur de classe sont réduites (les jonctions entre classes différentes sont préservées)."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Distance en deçà de laquelle les extrémités de routes sont considérées comme la même jonction. Par défaut 1e-6."
              }
            }
          },
          "collect_events": {
            "name": "Collecter les événements",
            "description": "Réduit les points d'incidents coïncidents en emplacements uniques, chacun portant un comptage ICOUNT des événements qui s'y trouvent, comme l'outil ArcGIS Collect Events.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points en entrée (Point ou MultiPoint)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de points en sortie (pilote déduit de l'extension). Si omis, stocké en mémoire."
              },
              "tolerance": {
                "label": "Tolérance",
                "description": "Tolérance d'accrochage en unités carte ; les points dont les coordonnées sont arrondies à la même cellule sont considérés comme coïncidents (par défaut 1e-8, c'est-à-dire pratiquement exact)."
              }
            }
          },
          "colocation_analysis": {
            "name": "Analyse de colocalisation",
            "description": "Quotient de colocalisation local (Leslie et Kronenfeld) mesurant si les points de catégorie A se trouvent de façon disproportionnée parmi des voisins de catégorie B, avec une valeur p de test par permutation avec graine — comme l'outil ArcGIS Colocation Analysis.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points en entrée comportant un champ de catégorie."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur en sortie (une copie de l'entrée avec les champs de colocalisation). Si omis, stocké en mémoire."
              },
              "category_field": {
                "label": "Champ de catégorie",
                "description": "Champ contenant la catégorie de chaque point."
              },
              "category_a": {
                "label": "Catégorie A",
                "description": "Catégorie focale (A) : les points dont la colocalisation avec B est mesurée."
              },
              "category_b": {
                "label": "Catégorie B",
                "description": "Catégorie voisine (B) : les points auxquels A est comparé."
              },
              "neighbors": {
                "label": "Voisins",
                "description": "Nombre de plus proches voisins k (par défaut 8)."
              },
              "weight": {
                "label": "Poids",
                "description": "Pondération des voisins : 'gaussian' (décroissance avec la distance, par défaut) ou 'uniform'."
              },
              "permutations": {
                "label": "Permutations",
                "description": "Nombre de permutations d'étiquettes pour le test de significativité (par défaut 99 ; 0 désactive)."
              },
              "seed": {
                "label": "Graine",
                "description": "Germe du générateur aléatoire des permutations (par défaut 1), pour des résultats reproductibles."
              }
            }
          },
          "color_polygons": {
            "name": "Colorer les polygones",
            "description": "Affecte à chaque polygone un petit indice de couleur entier de sorte que deux polygones adjacents ne partagent jamais la même valeur (comme ArcGIS Calculate Color Theorem Field) — un style choroplèthe sûr vis-à-vis de l'adjacence par coloration de graphe DSATUR sur la contiguïté par arêtes partagées (ou par coins partagés).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de polygones en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche de polygones en sortie avec le champ de couleur ajouté. Si omis, stocké en mémoire."
              },
              "field": {
                "label": "Champ",
                "description": "Nom du champ d'index de couleur à écrire (par défaut 'color_id')."
              },
              "adjacency": {
                "label": "Adjacence",
                "description": "'edge' (rook, bordure partagée ; par défaut) ou 'edge_or_corner' (queen, bordure ou sommet partagé)."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Taille de la grille sur laquelle accrocher les sommets avant la mise en correspondance des bordures (par défaut 0 = exact)."
              }
            }
          },
          "combine": {
            "name": "Combiner",
            "description": "Affecte un identifiant de zone unique à chaque combinaison unique de valeurs à travers deux rasters catégoriels co-enregistrés ou plus, plus une table d'attributs de valeurs (id, nombre, une colonne par entrée).",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Liste séparée par des virgules d'au moins 2 rasters catégoriels/entiers co-enregistrés à combiner."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du raster de la grille d'identifiants de conditions uniques. Si omis, le résultat est stocké en mémoire."
              },
              "csv_output": {
                "label": "CSV en sortie",
                "description": "Chemin CSV optionnel de la table d'attributs de valeurs (value, count, une colonne par raster d'entrée)."
              },
              "band": {
                "label": "Bande",
                "description": "Bande à lire dans chaque raster d'entrée, indexée à partir de 1. Par défaut 1."
              }
            }
          },
          "compare_spatial_weights": {
            "name": "Comparer les pondérations spatiales",
            "description": "Classe des conceptualisations candidates de poids spatiaux (KNN, bande de distance fixe, contiguïté par arêtes / arêtes+coins, Delaunay) selon la force avec laquelle chacune capture le regroupement spatial d'un ou plusieurs champs d'analyse, au moyen du I de Moran global standardisé par ligne avec son score z et sa valeur p bilatérale — comme l'outil ArcGIS Compare Neighborhood Conceptualizations. Produit une table de comparaison classée et la meilleure méthode.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée (points/lignes/polygones ; la contiguïté nécessite des polygones)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de la table de comparaison en sortie — un CSV (extension .csv) ou une table vectorielle sans géométrie. Si omis, le résultat est stocké en mémoire."
              },
              "input_fields": {
                "label": "Champs d'entrée",
                "description": "Liste séparée par des virgules des noms de champs numériques à analyser pour le regroupement spatial."
              },
              "id_field": {
                "label": "Champ d'identifiant",
                "description": "Champ contenant l'identifiant unique de chaque entité (accepté pour compatibilité ; non requis pour calculer l'I de Moran)."
              },
              "methods": {
                "label": "Méthodes",
                "description": "Conceptualisations candidates séparées par des virgules parmi : knn, fixed_distance_band, contiguity_edges, contiguity_edges_corners, delaunay. Par défaut 'knn,contiguity_edges,contiguity_edges_corners'. Les méthodes qui ne s'appliquent pas à la géométrie (ou qui échouent) sont ignorées."
              },
              "number_of_neighbors": {
                "label": "Nombre de voisins",
                "description": "Nombre k de plus proches voisins pour la méthode knn. Par défaut 8."
              },
              "threshold_distance": {
                "label": "Distance seuil",
                "description": "Seuil de la bande de distance en unités carte. Requis uniquement lorsque fixed_distance_band figure parmi les méthodes."
              }
            }
          },
          "composite_bands": {
            "name": "Composer les bandes",
            "description": "Empile plusieurs rasters monobandes en un seul raster multibande, dans l'ordre donné (ArcGIS Composite Bands). create_colour_composite intégré est limité à trois bandes RVB, il n'existait donc aucun moyen d'assembler l'entrée à N bandes que band_collection_statistics, principal_component_analysis, spectral_index et la suite OBIA exigent tous.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Chemins de rasters séparés par des virgules ou des points-virgules, dans l'ordre des bandes de sortie. Au moins un."
              },
              "band": {
                "label": "Bande",
                "description": "Bande prise dans chaque entrée, indexée à partir de 1, lorsqu'une entrée est elle-même multibande (par défaut 1)."
              },
              "nodata_policy": {
                "label": "Politique NoData",
                "description": "'any' (par défaut) : une cellule est NoData si l'une des bandes est NoData. 'all' : seulement si toutes les bandes le sont."
              },
              "nodata": {
                "label": "NoData",
                "description": "Valeur NoData de la sortie (par défaut : le NoData de la première entrée)."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster multibande de sortie. Si omis, le résultat est stocké en mémoire."
              }
            }
          },
          "compute_accuracy_for_object_detection": {
            "name": "Calculer la précision de détection d'objets",
            "description": "Évalue des entités détectées par rapport à la vérité terrain par appariement IoU, en rapportant la précision, le rappel, la précision moyenne par classe et le mAP global, comme l'outil ArcGIS Compute Accuracy For Object Detection.",
            "params": {
              "detected": {
                "label": "Détectés",
                "description": "Entités détectées (polygones ou emprises rectangulaires)."
              },
              "ground_truth": {
                "label": "Vérité terrain",
                "description": "Entités de référence servant à l'évaluation."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel de la table d'exactitude. Si omis, le résultat est stocké en mémoire."
              },
              "detected_class_field": {
                "label": "Champ de classe détectée",
                "description": "Champ d'étiquette de classe des détections. Omettre pour tout évaluer comme une seule classe."
              },
              "ground_truth_class_field": {
                "label": "Champ de classe de vérité terrain",
                "description": "Champ d'étiquette de classe de la vérité terrain. Omettre pour tout évaluer comme une seule classe."
              },
              "confidence_field": {
                "label": "Champ de confiance",
                "description": "Champ de score de confiance des détections, utilisé pour le classement dans le calcul de la précision moyenne. À défaut, les détections sont évaluées dans l'ordre d'entrée."
              },
              "min_iou": {
                "label": "IoU minimal",
                "description": "Intersection sur union minimale pour qu'une détection compte comme une correspondance (par défaut 0.5)."
              }
            }
          },
          "compute_sar_indices": {
            "name": "Calculer les indices SAR",
            "description": "Dérive des indices SAR polarimétriques — RVI (Radar Vegetation Index), RFDI (Radar Forest Degradation Index), CSI (Canopy Structure Index) et DPSVI (Dual-Pol SAR Vegetation Index) — à partir de la rétrodiffusion multi-polarisation (ArcGIS Compute SAR Indices). spectral_index ne couvre que les calculs de bandes optiques : ses formules et conventions de bandes relèvent du domaine de la réflectance et il n'a aucune notion de canaux de polarisation, de sorte que la chaîne SAR du catalogue (multilook, sar_coherence, filtres de chatoiement) n'a actuellement aucun point d'aboutissement analytique.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster SAR calibré multi-polarisation (une bande par polarisation)."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster d'indice en sortie. Si omis, le résultat est stocké en mémoire."
              },
              "index": {
                "label": "Indice",
                "description": "'rvi' (par défaut), 'rfdi', 'csi' ou 'dpsvi'."
              },
              "polarization_bands": {
                "label": "Bandes de polarisation",
                "description": "Correspondance de bandes indexée à partir de 1, par ex. 'vv=1,vh=2' ou 'hh=1,hv=2,vv=3'. Par défaut selon le nombre de bandes : 2 bandes = 'vv=1,vh=2', 3 bandes ou plus = 'hh=1,hv=2,vv=3'."
              },
              "input_units": {
                "label": "Unités d'entrée",
                "description": "'linear' (par défaut) ou 'db'. Une entrée en dB est convertie en puissance linéaire avant le calcul des rapports, car les rapports de décibels n'ont pas de sens."
              }
            }
          },
          "construct_sight_lines": {
            "name": "Construire des lignes de visée",
            "description": "Construit des entités de lignes de visée entre des points d'observateurs et des entités cibles, avec des décalages de hauteur observateur/cible, un échantillonnage le long des cibles linéaires et surfaciques, des champs optionnels d'azimut et d'angle vertical, et une distance 2D ou 3D. Comme l'outil ArcGIS Construct Sight Lines.",
            "params": {
              "observers": {
                "label": "Observateurs",
                "description": "Entités ponctuelles d'observateurs."
              },
              "targets": {
                "label": "Cibles",
                "description": "Entités cibles de type point, ligne ou polygone."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie des lignes de visée. Si omis, le résultat est stocké en mémoire."
              },
              "observer_height_field": {
                "label": "Champ de hauteur d'observateur",
                "description": "Champ optionnel donnant le décalage de hauteur de chaque observateur (ajouté à son Z)."
              },
              "target_height_field": {
                "label": "Champ de hauteur de cible",
                "description": "Champ optionnel donnant le décalage de hauteur de chaque cible (ajouté à son Z)."
              },
              "join_field": {
                "label": "Champ de jointure",
                "description": "Champ optionnel présent sur les deux entrées ; seuls les observateurs et les cibles partageant une valeur sont appariés. À défaut, chaque observateur est apparié à chaque cible."
              },
              "sample_distance": {
                "label": "Distance d'échantillonnage",
                "description": "Espacement en unités carte des points cibles générés le long des limites de lignes/polygones (par défaut : un point par sommet)."
              },
              "output_direction": {
                "label": "Direction en sortie",
                "description": "Ajoute les champs AZIMUTH et VERT_ANGLE (par défaut faux)."
              },
              "distance_method": {
                "label": "Méthode de distance",
                "description": "'2d' (par défaut) ou '3d' pour le champ DISTANCE."
              }
            }
          },
          "contiguous_cartogram": {
            "name": "Cartogramme contigu",
            "description": "Cartogramme à égalisation de densité (diffusion de Gastner-Newman) : déforme les surfaces des polygones proportionnellement à un attribut tout en conservant une carte d'un seul tenant avec des frontières partagées (ArcGIS Generate Contiguous Cartogram). L'outil cartogram livré n'implémente que les méthodes non contiguë et Dorling, qui détruisent toutes deux l'adjacence, et la documentation de son propre module renvoie la forme contiguë à plus tard.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de polygones contigus."
              },
              "value_field": {
                "label": "Champ de valeur",
                "description": "Attribut numérique positif auquel les surfaces doivent devenir proportionnelles."
              },
              "grid_size": {
                "label": "Taille de grille",
                "description": "Résolution de la grille de densité ; doit être une puissance de deux (par défaut 256). C'est le principal réglage du compromis exactitude/coût."
              },
              "iterations": {
                "label": "Itérations",
                "description": "Nombre d'étapes de diffusion (par défaut 20). Davantage d'étapes égalisent mieux la densité au prix d'une distorsion accrue."
              },
              "blur": {
                "label": "Flou",
                "description": "Pré-lissage gaussien du champ de densité, en cellules de grille (par défaut 0.5). Évite la distorsion extrême que produit une discontinuité brutale de densité."
              },
              "sea_density": {
                "label": "Densité de l'eau de mer",
                "description": "Densité en dehors de la zone d'étude : 'mean' (par défaut) ou 'min'. Ce choix modifie sensiblement le résultat en bordure de carte."
              },
              "densify_spacing": {
                "label": "Espacement de densification",
                "description": "Longueur maximale des segments de bordure en cellules de grille avant insertion de sommets (par défaut 1.0). Sans cela, les longues bordures rectilignes se détachent de leurs voisines."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche de polygones en sortie avec les sommets déplacés et les attributs d'origine. Si omis, le résultat est stocké en mémoire."
              }
            }
          },
          "contour_list": {
            "name": "Liste de courbes de niveau",
            "description": "Génère des courbes de niveau à une liste explicite de valeurs plutôt qu'à un intervalle fixe, sous forme de polylignes chaînées ou de polygones remplis, chacun étiqueté avec son niveau (ArcGIS Contour List). contours_from_raster intégré n'accepte que « interval » et « base », de sorte que les séries irrégulières qu'utilisent les vraies cartes — paliers de profondeur OHI, niveaux de récurrence de crue, seuils de classes publiés — exigent une exécution par valeur et une fusion, sans pouvoir produire une seule couche étiquetée par niveau.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster de surface en entrée."
              },
              "contour_values": {
                "label": "Valeurs de courbes",
                "description": "Liste séparée par des virgules des niveaux à contourer, dans les unités Z propres au raster."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche de courbes de niveau en sortie. Si omis, le résultat est stocké en mémoire."
              },
              "geometry_type": {
                "label": "Type de géométrie",
                "description": "'polyline' (par défaut) pour des courbes de niveau, ou 'polygon' pour la région pleine située à chaque niveau ou au-dessus."
              },
              "min_length": {
                "label": "Longueur minimale",
                "description": "Supprime les courbes de niveau plus courtes que cette valeur, en unités carte, ce qui élimine les mouchetures produites par une surface bruitée."
              },
              "close_rings": {
                "label": "Fermer les anneaux",
                "description": "Répète le premier sommet sur les courbes qui se referment sur elles-mêmes (par défaut vrai)."
              },
              "band": {
                "label": "Bande",
                "description": "Bande à contourer, indexée à partir de 1 (par défaut 1)."
              }
            }
          },
          "contour_with_barriers": {
            "name": "Courbes de niveau avec barrières",
            "description": "Trace les courbes d'iso-valeurs d'une surface en les arrêtant aux entités de barrières au lieu de les traverser.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster de surface continue en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin optionnel du vecteur de lignes en sortie (pilote déduit de son extension). Si omis, le résultat est stocké en mémoire."
              },
              "barriers": {
                "label": "Barrières",
                "description": "Couche vectorielle de barrières optionnelle (lignes ou polygones). Les courbes de niveau ne franchiront pas ces entités."
              },
              "interval": {
                "label": "Intervalle",
                "description": "Équidistance des courbes de niveau en unités de la surface. Les niveaux valent base + k*interval dans la plage des données. Ignoré si 'levels' est fourni."
              },
              "base": {
                "label": "Base",
                "description": "Valeur de base à partir de laquelle l'intervalle est mesuré (par défaut 0)."
              },
              "levels": {
                "label": "Niveaux",
                "description": "Valeurs de courbes de niveau explicites séparées par des virgules (par ex. \"10,20,30\"). Prévalent sur interval/base."
              },
              "band": {
                "label": "Bande",
                "description": "Bande à lire, indexée à partir de 1 (par défaut 1)."
              }
            }
          },
          "convert_coordinate_notation": {
            "name": "Convertir la notation des coordonnées",
            "description": "Convertit les coordonnées de chaque entité entre notations — degrés décimaux (DD), degrés-minutes-secondes (DMS), degrés-minutes décimales (DDM), UTM et MGRS/USNG — en écrivant un nouveau champ dans la notation cible, comme l'outil ArcGIS Convert Coordinate Notation. Mathématiques de grille pures (Mercator transverse de Krüger + lettrage MGRS sur WGS84) ; sans PROJ.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points (ou table) en entrée."
              },
              "input_notation": {
                "label": "Notation d'entrée",
                "description": "Notation de la coordonnée d'entrée : DD, DMS, DDM, UTM ou MGRS."
              },
              "output_notation": {
                "label": "Notation de sortie",
                "description": "Notation cible à écrire : DD, DMS, DDM, UTM ou MGRS."
              },
              "coord_field": {
                "label": "Champ de coordonnées",
                "description": "Champ contenant la chaîne de coordonnée d'entrée. Si omis, la géométrie ponctuelle est utilisée (valable uniquement lorsque input_notation=DD ; géométrie x=lon, y=lat)."
              },
              "output_field": {
                "label": "Champ de sortie",
                "description": "Nom du champ à écrire. Par défaut : la notation de sortie en minuscules (par ex. 'utm')."
              },
              "precision": {
                "label": "Précision",
                "description": "Nombre de chiffres MGRS par axe (1=10 km … 5=1 m, jusqu'à 9). Par défaut 5. Ignoré par les autres notations."
              },
              "update_geometry": {
                "label": "Mettre à jour la géométrie",
                "description": "Si vrai, reconstruit la géométrie de chaque entité sous forme de point lon/lat en EPSG:4326 à partir de la coordonnée analysée. Par défaut faux (conserve la géométrie et le SCR d'entrée)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de sortie (pilote déduit de l'extension). Si omis, le résultat est stocké en mémoire."
              }
            }
          },
          "convert_sar_units": {
            "name": "Convertir les unités SAR",
            "description": "Convertit un raster SAR entre les représentations amplitude, intensité, puissance linéaire, décibel, complexe vers intensité et phase déroulée vers déplacement (ArcGIS Convert SAR Units). raster_calculator peut évaluer l'arithmétique mais ne porte ni la sémantique ni les garde-fous — il renvoie -inf pour les cellules nulles lors d'une conversion logarithmique, et rien dans le catalogue n'enregistre dans quelle unité se trouve un raster SAR, de sorte que les filtres de chatoiement et les indices de rapport sont couramment appliqués à la mauvaise représentation.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster SAR en entrée. Pour 'complex_to_intensity', il s'agit d'un raster I/Q à deux bandes (la convention de multilook / sar_coherence)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie. Si omis, stocké en mémoire."
              },
              "conversion": {
                "label": "Conversion",
                "description": "'linear_to_db', 'db_to_linear', 'amplitude_to_intensity', 'intensity_to_amplitude', 'complex_to_intensity' ou 'phase_to_displacement'."
              },
              "wavelength": {
                "label": "Longueur d'onde",
                "description": "Longueur d'onde radar en mètres pour 'phase_to_displacement' (par défaut 0.05546576, bande C de Sentinel-1)."
              },
              "band": {
                "label": "Bande",
                "description": "Bande à lire, indexée à partir de 1 (par défaut 1). Ignoré pour 'complex_to_intensity', qui lit toujours les bandes 1 et 2 comme I et Q."
              }
            }
          },
          "coregister_rasters": {
            "name": "Recaler des rasters",
            "description": "Aligne automatiquement un raster secondaire sur une référence par corrélation croisée normalisée d'une grille de tuiles, raffinement sous-pixel du pic, ajustement d'une transformation par moindres carrés avec élimination des valeurs aberrantes, puis rééchantillonnage (ArcGIS Apply Coregistration). C'est le préalable manquant à toute la chaîne InSAR du catalogue : sar_coherence, flatten_interferogram et goldstein_phase_filter exigent tous une entrée co-enregistrée et rien ne la produisait. georeference_raster_from_control_points nécessite des points de contrôle choisis à la main, image_correlation ne fait qu'évaluer la similarité, et warp_raster a besoin qu'on lui fournisse une transformation.",
            "params": {
              "reference": {
                "label": "Référence",
                "description": "Raster de référence. La sortie est écrite sur la grille de ce raster."
              },
              "secondary": {
                "label": "Secondaire",
                "description": "Raster à aligner sur la référence. Toutes ses bandes sont rééchantillonnées."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster secondaire rééchantillonné en sortie sur la grille de référence. Si omis, le résultat est stocké en mémoire."
              },
              "tie_points": {
                "label": "Points de liaison",
                "description": "Couche de points en sortie des points d'amer retenus avec leur décalage mesuré et leur corrélation. Toujours produite ; stockée en mémoire si aucun chemin n'est fourni."
              },
              "band": {
                "label": "Bande",
                "description": "Bande utilisée pour l'appariement, indexée à partir de 1 (par défaut 1). Une entrée à deux bandes est appariée sur son module complexe sauf si ce paramètre est fourni."
              },
              "transform": {
                "label": "Transformation",
                "description": "'translation', 'affine' (par défaut) ou 'polynomial2'."
              },
              "tile_size": {
                "label": "Taille de tuile",
                "description": "Côté de chaque tuile d'appariement en cellules (par défaut 32)."
              },
              "grid_size": {
                "label": "Taille de grille",
                "description": "Nombre de tuiles par axe (par défaut 8, soit 64 tuiles)."
              },
              "max_shift": {
                "label": "Décalage maximal",
                "description": "Demi-largeur de la fenêtre de recherche entière en cellules (par défaut 8)."
              },
              "min_correlation": {
                "label": "Corrélation minimale",
                "description": "Rejette les points d'amer dont la corrélation normalisée maximale est inférieure à cette valeur (par défaut 0.3)."
              },
              "outlier_sigma": {
                "label": "Sigma des valeurs aberrantes",
                "description": "Élimine les points d'amer dont le résidu d'ajustement dépasse ce nombre d'écarts-types (par défaut 3.0). Mettre 0 pour désactiver l'élimination."
              },
              "resample": {
                "label": "Rééchantillonner",
                "description": "'bilinear' (par défaut) ou 'nearest'."
              }
            }
          },
          "corridor": {
            "name": "Corridor",
            "description": "Corridor de moindre coût entre deux surfaces de coût accumulé (ArcGIS Corridor) : additionne deux rasters de coût-distance en une surface de corridor dont le minimum est le chemin de moindre coût, puis seuille optionnellement vers la bande quasi optimale. Mode direct (deux rasters de coût) ou mode pratique (un raster de friction + deux rasters de sources).",
            "params": {
              "cost1": {
                "label": "Coût 1",
                "description": "Premier raster de coût cumulé (depuis la source A). Mode direct."
              },
              "cost2": {
                "label": "Coût 2",
                "description": "Second raster de coût cumulé (depuis la source B). Mode direct."
              },
              "cost": {
                "label": "Coût",
                "description": "Raster de friction/coût de passage. Mode simplifié (avec source1/source2)."
              },
              "source1": {
                "label": "Source 1",
                "description": "Premier raster de sources (les cellules positives sont des sources). Mode simplifié."
              },
              "source2": {
                "label": "Source 2",
                "description": "Second raster de sources (les cellules positives sont des sources). Mode simplifié."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de corridor en sortie. Si omis, le résultat est stocké en mémoire."
              },
              "threshold": {
                "label": "Seuil",
                "description": "Ne conserve que les cellules dont le coût de corridor est inférieur ou égal à cette valeur absolue (le reste est masqué en NoData)."
              },
              "percent": {
                "label": "Pourcentage",
                "description": "Ne conserve que les cellules situées à ce pourcentage au-dessus du coût de corridor minimal (par ex. 5 = à moins de 5 %). Ignoré si 'threshold' est défini."
              },
              "band": {
                "label": "Bande",
                "description": "Bande à lire dans le ou les rasters d'entrée, indexée à partir de 1. Par défaut 1."
              }
            }
          },
          "cost_back_link": {
            "name": "Lien de retour de coût",
            "description": "Émet le raster de direction de voisinage 0-8 codant, pour chaque cellule, le prochain pas le long de l'itinéraire de moindre coût vers la source la plus proche, plus la surface de coût accumulé (ArcGIS Cost Back Link et Path Back Link). cost_distance, cost_pathway et cost_allocation calculent tous cela en interne et le rejettent, de sorte que retracer N destinations coûte actuellement N résolutions complètes de coût au lieu d'une passe d'accumulation plus N parcours peu coûteux.",
            "params": {
              "source": {
                "label": "Source",
                "description": "Cellules sources : un raster (toute cellule non nulle et non NoData est une source) ou une couche vectorielle de points/multipoints."
              },
              "cost": {
                "label": "Coût",
                "description": "Raster de coût par unité de distance. Optionnel lorsque 'surface' est fourni (le coût vaut alors 1 partout, donnant une distance de surface pure)."
              },
              "surface": {
                "label": "Surface",
                "description": "Raster d'altitude optionnel activant la variante Path Back Link : l'espacement horizontal est remplacé par la véritable distance de surface sqrt(dxy^2 + dz^2)."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster de rétroliens en sortie (0 = source, 1-8 = direction vers la source, 1 = est, dans le sens antihoraire). Si omis, le résultat est stocké en mémoire."
              },
              "out_distance": {
                "label": "Distance en sortie",
                "description": "Raster de coût cumulé. Toujours produit ; à défaut de chemin, une référence en mémoire est utilisée."
              },
              "max_distance": {
                "label": "Distance maximale",
                "description": "Seuil d'accumulation optionnel : les cellules dont le coût dépasse cette valeur restent inaccessibles."
              }
            }
          },
          "cost_connectivity": {
            "name": "Connectivité de coût",
            "description": "Réseau de moindre coût reliant plusieurs sites sur une surface de coût (comme ArcGIS Cost Connectivity / Optimal Region Connections) : allocation de Dijkstra multi-sources, chemins de moindre coût par paires entre régions adjacentes et leur arbre couvrant minimal — le réseau de moindre coût que cost_distance et path_distance intégrés, à source unique, ne peuvent pas construire.",
            "params": {
              "sources": {
                "label": "Sources",
                "description": "Couche de points des sites/régions à relier."
              },
              "cost": {
                "label": "Coût",
                "description": "Raster de coût/friction (coût de traversée par cellule ; les cellules NoData sont des barrières)."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche de polylignes en sortie des chemins de moindre coût. Si omis, le résultat est stocké en mémoire."
              },
              "connections": {
                "label": "Connexions",
                "description": "'mst' (arbre couvrant minimal reliant tous les sites ; par défaut) ou 'all_neighbors' (tous les chemins entre régions adjacentes)."
              },
              "id_field": {
                "label": "Champ d'identifiant",
                "description": "Champ optionnel pour étiqueter les sources (par défaut : l'indice à partir de 1)."
              },
              "band": {
                "label": "Bande",
                "description": "Bande du raster de coût, indexée à partir de 1 (par défaut 1)."
              }
            }
          },
          "count_overlapping_features": {
            "name": "Compter les entités superposées",
            "description": "Aplatit des polygones qui se chevauchent en régions disjointes, chacune attribuée du nombre (et en option des identifiants) d'entités d'entrée qui la couvrent, comme l'outil ArcGIS Count Overlapping Features.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de polygones en entrée (les entités peuvent se chevaucher)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de polygones en sortie (pilote déduit de l'extension) avec un champ 'count'. Si omis, le résultat est stocké en mémoire."
              },
              "min_count": {
                "label": "Nombre minimal",
                "description": "Ne conserve que les régions couvertes par au moins ce nombre d'entités (par défaut 1 ; utiliser 2 pour ne garder que les chevauchements)."
              },
              "id_field": {
                "label": "Champ d'identifiant",
                "description": "Champ optionnel identifiant chaque entité d'entrée (utilisé dans la colonne d'identifiants et le rapport). Par défaut : l'indice de l'entité."
              },
              "report_ids": {
                "label": "Identifiants du rapport",
                "description": "Chemin CSV optionnel d'une table de jointure region_id,feature_id (une ligne par entité couvrante)."
              }
            }
          },
          "create_accuracy_assessment_points": {
            "name": "Créer des points d'évaluation de précision",
            "description": "Génère des points de référence distribués aléatoirement et stratifiés par les classes d'un raster classifié ou d'une couche de polygones, préremplis avec la classe cartographiée et prêts pour l'étiquetage de vérité terrain (ArcGIS Create Accuracy Assessment Points). classification_accuracy_assessment consomme de tels points mais rien ne les produisait, et create_spatial_sampling_locations stratifie par entité ou champ polygonal plutôt que par classe raster et n'a pas d'allocation égalisée.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster classé, ou couche de polygones classée avec 'class_field'."
              },
              "class_field": {
                "label": "Champ de classe",
                "description": "Attribut de classe, requis lorsque 'input' est une couche vectorielle. Ignoré pour une entrée raster, qui utilise la valeur de cellule."
              },
              "num_points": {
                "label": "Nombre de points",
                "description": "Nombre total de points de référence (par défaut 500)."
              },
              "sampling_strategy": {
                "label": "Stratégie d'échantillonnage",
                "description": "L'un de 'stratified_random' (par défaut, répartition proportionnelle à la surface de chaque classe), 'equalized_stratified' (nombre égal par classe) ou 'random' (sans tenir compte de la classe)."
              },
              "min_points_per_class": {
                "label": "Points minimaux par classe",
                "description": "Plancher appliqué sous 'stratified_random' afin que les classes rares ne soient pas écartées (par défaut 1)."
              },
              "band": {
                "label": "Bande",
                "description": "Bande d'une entrée raster, indexée à partir de 1 (par défaut 1)."
              },
              "seed": {
                "label": "Graine",
                "description": "Germe du générateur aléatoire déterministe (par défaut 1)."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche de points en sortie avec CLASSVALUE (classe cartographiée), GrndTruth (-1 tant que non collecté) et Stratum. Si omis, le résultat est stocké en mémoire."
              }
            }
          },
          "create_cartographic_partitions": {
            "name": "Créer des partitions cartographiques",
            "description": "Produit des polygones de partition adaptatifs et non chevauchants contenant chacun environ un nombre cible d'entités (plus denses là où les données se concentrent) afin que les grands travaux de généralisation/masquage puissent être tuilés sans trou de couverture — l'équivalent en Rust pur de l'outil ArcGIS Create Cartographic Partitions.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée (toute géométrie). Chaque entité est réduite à un point représentatif et affectée à une seule partition."
              },
              "feature_count": {
                "label": "Nombre d'entités",
                "description": "Nombre maximal cible d'entités par partition. Une cellule est divisée tant qu'elle contient plus que ce nombre d'entités. Par défaut 1000."
              },
              "output": {
                "label": "Sortie",
                "description": "Vecteur de polygones de partitions en sortie (pilote déduit de l'extension). Si omis, le résultat est stocké en mémoire."
              }
            }
          },
          "create_overpass": {
            "name": "Créer un passage supérieur",
            "description": "Construit des polygones de masque de découpe (et des lignes de décoration en ailettes optionnelles) là où une ligne « au-dessus » croise une ligne « en dessous », de sorte que la ligne inférieure soit masquée au croisement.",
            "params": {
              "above": {
                "label": "Au-dessus",
                "description": "Vecteur de lignes des entités qui passent AU-DESSUS du croisement (le masque est orienté selon celles-ci). Format détecté automatiquement, ou référence en mémoire."
              },
              "below": {
                "label": "En dessous",
                "description": "Vecteur de lignes des entités masquées EN DESSOUS du croisement (les lignes à interrompre). Format détecté automatiquement, ou référence en mémoire."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel des polygones de masque (pilote déduit de son extension). Si omis, le résultat est stocké en mémoire."
              },
              "output_decoration": {
                "label": "Décoration en sortie",
                "description": "Chemin de sortie optionnel des lignes de décoration en ailettes. Si omis, le résultat est stocké en mémoire (et toujours renvoyé sous 'output_decoration')."
              },
              "margin_along": {
                "label": "Marge longitudinale",
                "description": "Demi-longueur de chaque masque le long de la ligne supérieure, en unités du SCR (la longueur du masque vaut le double). Par défaut 1.0."
              },
              "margin_across": {
                "label": "Marge transversale",
                "description": "Demi-largeur de chaque masque en travers de la ligne supérieure, en unités du SCR (la largeur du masque vaut le double). Par défaut 1.0."
              },
              "wing_type": {
                "label": "Type d'aile",
                "description": "Style de décoration : 'none', 'perpendicular' (par défaut ; un trait en travers de chaque extrémité de masque) ou 'parallel' (lignes de contour le long de chaque côté)."
              }
            }
          },
          "create_routes": {
            "name": "Créer des itinéraires",
            "description": "Fusionne les entités linéaires par un champ d'identifiant d'itinéraire, ordonne leurs segments en une seule polyligne par itinéraire et affecte des mesures linéaires (valeurs M) à partir de la longueur géométrique ou de champs de mesure de début/fin.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier vectoriel de lignes en entrée, format détecté automatiquement (ou référence en mémoire)."
              },
              "route_id_field": {
                "label": "Champ d'identifiant d'itinéraire",
                "description": "Attribut qui identifie chaque itinéraire ; les lignes d'entrée sont regroupées selon cet attribut, avec un itinéraire de sortie par valeur distincte."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin optionnel du vecteur d'itinéraires en sortie (pilote déduit de son extension). Si omis, le résultat est stocké en mémoire."
              },
              "measure_source": {
                "label": "Source de mesure",
                "description": "Mode d'affectation des mesures : LENGTH (de 0 à la longueur géométrique), ONE_FIELD (début tiré d'un champ, fin = début + longueur) ou TWO_FIELDS (début et fin tirés de champs, avec interpolation). Par défaut LENGTH."
              },
              "from_measure_field": {
                "label": "Champ de mesure de début",
                "description": "Champ numérique donnant la mesure de début de chaque itinéraire (utilisé par ONE_FIELD et TWO_FIELDS). Lu sur le premier segment de l'itinéraire."
              },
              "to_measure_field": {
                "label": "Champ de mesure de fin",
                "description": "Champ numérique donnant la mesure de fin de chaque itinéraire (utilisé par TWO_FIELDS). Lu sur le premier segment de l'itinéraire."
              },
              "measure_factor": {
                "label": "Facteur de mesure",
                "description": "Multiplicateur appliqué à la mesure naturelle (fondée sur la longueur), par ex. 0.001 pour convertir des mètres en kilomètres. Par défaut 1.0."
              },
              "measure_offset": {
                "label": "Décalage de mesure",
                "description": "Valeur ajoutée à chaque mesure le long de l'itinéraire (décale toutes les valeurs m de l'itinéraire). Par défaut 0.0."
              },
              "ignore_gaps": {
                "label": "Ignorer les écarts",
                "description": "Pour LENGTH/ONE_FIELD, exclut de la mesure cumulée les sauts rectilignes entre segments disjoints afin que les interruptions ne gonflent pas les distances. Par défaut faux."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Les extrémités situées à moins de cette distance (unités du SCR) sont considérées comme confondues lors du raboutage des segments. Par défaut 1e-6."
              }
            }
          },
          "create_spatial_sampling_locations": {
            "name": "Créer des sites d'échantillonnage spatial",
            "description": "Génère des points d'échantillonnage sur une zone d'étude polygonale selon un plan aléatoire simple, stratifié, systématique (carré/hexagone/triangle) ou en grappes, avec un aléa reproductible par graine.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier vectoriel de polygones de la zone d'étude (ou référence en mémoire)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin optionnel du vecteur de points en sortie (pilote déduit de son extension). Si omis, le résultat est stocké en mémoire."
              },
              "method": {
                "label": "Méthode",
                "description": "'simple_random' (par défaut), 'stratified', 'systematic' ou 'cluster'."
              },
              "num_samples": {
                "label": "Nombre d'échantillons",
                "description": "Nombre total de points d'échantillonnage pour simple_random, stratified et cluster. Par défaut 100."
              },
              "strata_field": {
                "label": "Champ de strate",
                "description": "Pour stratified : regroupe les entités d'entrée en strates selon cet attribut. Si omis, chaque entité d'entrée constitue sa propre strate."
              },
              "allocation": {
                "label": "Allocation",
                "description": "Pour stratified : 'proportional' à la surface de la strate (par défaut), 'equal' par strate, ou 'population_field' proportionnel au total d'un champ."
              },
              "population_field": {
                "label": "Champ de population",
                "description": "Pour allocation=population_field : le champ numérique dont le total par strate détermine la répartition."
              },
              "bin_shape": {
                "label": "Forme des cellules",
                "description": "Pour systematic : trame 'square' (par défaut), 'hexagon' ou 'triangle'."
              },
              "bin_size": {
                "label": "Taille des cellules",
                "description": "Espacement (unités du SCR) pour les trames systématiques et les classes de grappes. Requis pour ces méthodes."
              },
              "num_clusters": {
                "label": "Nombre de grappes",
                "description": "Pour cluster : nombre de classes à sélectionner aléatoirement. Par défaut 10."
              },
              "min_distance": {
                "label": "Distance minimale",
                "description": "Espacement minimal entre les points simple_random / stratified / cluster (unités du SCR). Par défaut 0 (aucune contrainte)."
              },
              "seed": {
                "label": "Graine",
                "description": "Germe du générateur aléatoire déterministe (par défaut 1)."
              }
            }
          },
          "create_spatially_balanced_points": {
            "name": "Créer des points spatialement équilibrés",
            "description": "Génère des points d'échantillonnage bien répartis spatialement (quasi-aléatoire de Halton) dans un polygone de contrainte, éventuellement pondérés par un raster de probabilité d'inclusion, chacun marqué d'un ordre d'échantillonnage équilibré, comme l'outil ArcGIS Create Spatially Balanced Points.",
            "params": {
              "constraint": {
                "label": "Contrainte",
                "description": "Couche de polygones de contrainte ; les points sont générés à l'intérieur de ces polygones."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de points en sortie (pilote déduit de l'extension). Si omis, stocké en mémoire."
              },
              "num_points": {
                "label": "Nombre de points",
                "description": "Nombre de points d'échantillonnage à générer."
              },
              "probability": {
                "label": "Probabilité",
                "description": "Raster de probabilité d'inclusion optionnel ; les cellules de valeur plus élevée ont plus de chances d'être échantillonnées (normalisation par son maximum)."
              },
              "seed": {
                "label": "Graine",
                "description": "Graine aléatoire pour un échantillonnage reproductible (par défaut 1)."
              }
            }
          },
          "create_underpass": {
            "name": "Créer un passage inférieur",
            "description": "Aux croisements de lignes, construit des polygones de masque orientés selon l'entité supérieure et découpe une coupure correspondante dans l'entité inférieure afin qu'elle se lise comme passant dessous (ArcGIS Create Underpass). Pendant de create_overpass livré, qui masque la ligne inférieure pour que la supérieure se lise en continu ; un passage inférieur nécessite au contraire la rupture décorative, ce qui distingue un portail de tunnel d'un pont. Émet à la fois les masques et les lignes inférieures coupées.",
            "params": {
              "above": {
                "label": "Au-dessus",
                "description": "Vecteur de lignes des entités qui passent AU-DESSUS du croisement (les masques sont orientés selon celles-ci). Format détecté automatiquement, ou référence en mémoire."
              },
              "below": {
                "label": "En dessous",
                "description": "Vecteur de lignes des entités qui passent EN DESSOUS du croisement (les lignes qui reçoivent l'interruption). Format détecté automatiquement, ou référence en mémoire."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel des polygones de masque de passage inférieur. Si omis, le résultat est stocké en mémoire."
              },
              "output_lines": {
                "label": "Lignes en sortie",
                "description": "Chemin de sortie optionnel de la couche inférieure dont les interruptions de passage inférieur ont été découpées. Si omis, le résultat est stocké en mémoire (et toujours renvoyé sous 'output_lines')."
              },
              "margin_along": {
                "label": "Marge longitudinale",
                "description": "Demi-longueur de chaque masque mesurée LE LONG de la ligne supérieure, en unités du SCR ; le masque s'étend sur le double dans cette direction. Par défaut 1.0."
              },
              "margin_across": {
                "label": "Marge transversale",
                "description": "Demi-largeur de chaque masque EN TRAVERS de la ligne supérieure, en unités du SCR. Pour un croisement perpendiculaire, c'est cette valeur qui borne l'interruption découpée dans la ligne inférieure : la longueur retirée vaut donc le double. Par défaut 1.0."
              },
              "min_angle": {
                "label": "Angle minimal",
                "description": "Ignore les croisements où les deux lignes se rencontrent sous un angle inférieur à cette valeur en degrés, un masque quasi parallèle étant instable. Par défaut 15."
              }
            }
          },
          "cul_de_sac_masks": {
            "name": "Masques d'impasses",
            "description": "Génère des polygones de masque de découpe adaptés à l'échelle aux bulbes des impasses d'un réseau routier, comme l'outil ArcGIS Cul-De-Sac Masks.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche d'axes médians de routes."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin optionnel des polygones de masque en sortie. Si omis, le résultat est stocké en mémoire."
              },
              "reference_scale": {
                "label": "Échelle de référence",
                "description": "Dénominateur de l'échelle cartographique pour laquelle le masque est dimensionné (par ex. 24000 pour le 1:24 000)."
              },
              "symbol_width": {
                "label": "Largeur de symbole",
                "description": "Largeur du contour de route en unités de page (voir 'page_unit') à l'échelle de référence."
              },
              "margin": {
                "label": "Marge",
                "description": "Marge supplémentaire autour du symbole, en unités de page (par défaut 0)."
              },
              "page_unit": {
                "label": "Unité de page",
                "description": "Unité de 'symbol_width' et 'margin' : points (par défaut, 1/72 de pouce), mm ou pouces."
              },
              "map_units_per_meter": {
                "label": "Unités de carte par mètre",
                "description": "Unités du SCR par mètre (par défaut 1, valeur correcte pour les SCR projetés en mètres). Pour une couche en degrés, utiliser environ 0.000008983."
              },
              "tolerance": {
                "label": "Tolérance",
                "description": "Tolérance d'accrochage des coordonnées pour joindre les extrémités de lignes en nœuds de réseau (par défaut 0.001 unité carte)."
              },
              "attributes": {
                "label": "Attributs",
                "description": "ids_only (par défaut) | all — indique s'il faut reporter les attributs de l'entité source sur le masque."
              }
            }
          },
          "cut_fill": {
            "name": "Déblai-remblai",
            "description": "Changement volumétrique entre deux surfaces MNT (avant/après) ou entre une surface et un plan de référence : raster signé de changement d'élévation plus volumes de déblai, de remblai et net, avec étiquetage optionnel du volume par région.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster 'before' (ou de la surface unique en mode plan)."
              },
              "after": {
                "label": "Après",
                "description": "Le raster 'after' (mode à deux surfaces). Doit partager la grille de 'input'. Fournir ce paramètre ou 'plane'."
              },
              "plane": {
                "label": "Plan",
                "description": "Altitude du plan de référence (mode surface-volume) : la variation est mesurée comme l'entrée moins cette valeur. Fournir ce paramètre ou 'after'."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du raster de variation d'altitude signée (Δz). Si omis, le résultat est stocké en mémoire."
              },
              "band": {
                "label": "Bande",
                "description": "Bande à lire dans le ou les rasters d'entrée, indexée à partir de 1. Par défaut 1."
              },
              "tolerance": {
                "label": "Tolérance",
                "description": "Les cellules dont |Δz| est inférieur ou égal à cette valeur (unités Z du SCR) sont considérées comme inchangées. Par défaut 0."
              },
              "region_output": {
                "label": "Région en sortie",
                "description": "Chemin raster optionnel des étiquettes de régions contiguës de déblai/remblai (identifiants de région >= 1 ; les cellules inchangées sont NoData)."
              },
              "csv_output": {
                "label": "CSV en sortie",
                "description": "Chemin CSV optionnel de la table des volumes par région (region_id, type, cell_count, volume)."
              }
            }
          },
          "darcy_flow": {
            "name": "Écoulement de Darcy",
            "description": "Champ de vitesse de Darcy des eaux souterraines en régime permanent à partir de rasters de charge, de transmissivité et de porosité — un raster de magnitude d'écoulement (vitesse de Darcy) et un raster de direction d'écoulement vers l'aval du gradient (v = -(T/n)·∇charge), avec suivi advectif optionnel de particules (RK2) depuis des points de départ vers des polylignes de lignes de courant — comme ArcGIS Darcy Flow / Particle Track.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster de charge hydraulique souterraine (altitude de la nappe). La taille de cellule est reprise de ce raster."
              },
              "transmissivity": {
                "label": "Transmissivité",
                "description": "Raster de transmissivité (co-enregistré avec le raster de charge)."
              },
              "porosity": {
                "label": "Porosité",
                "description": "Raster de porosité efficace (co-enregistré avec le raster de charge ; les valeurs doivent être > 0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de magnitude de la vitesse de Darcy en sortie. Si omis, le résultat est stocké en mémoire."
              },
              "direction": {
                "label": "Direction",
                "description": "Chemin de sortie optionnel du raster de direction d'écoulement (azimut en degrés, depuis le nord dans le sens horaire, dans le sens du gradient descendant). Si omis, le résultat est stocké en mémoire."
              },
              "band": {
                "label": "Bande",
                "description": "Bande à lire dans chaque raster d'entrée, indexée à partir de 1 (par défaut 1)."
              },
              "seeds": {
                "label": "Graines",
                "description": "Vecteur de points optionnel des germes de particules. S'il est fourni, des lignes de courant sont tracées depuis chaque germe."
              },
              "streamlines": {
                "label": "Lignes de courant",
                "description": "Chemin optionnel du vecteur de lignes en sortie pour les lignes de courant de particules tracées (nécessite 'seeds')."
              },
              "step": {
                "label": "Pas",
                "description": "Longueur de pas du suivi de particules en unités du SCR (par défaut : la taille de cellule du raster de charge)."
              },
              "max_steps": {
                "label": "Pas maximaux",
                "description": "Nombre maximal de pas d'intégration par particule (par défaut 1000)."
              }
            }
          },
          "delineate_built_up_areas": {
            "name": "Délimiter les zones bâties",
            "description": "Généralise des emprises de bâtiments denses en polygones lisses d'agglomération / d'étendue urbaine en regroupant les bâtiments voisins (fermeture morphologique), avec des filtres de nombre minimal de bâtiments et de surface.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de polygones d'emprises de bâtiments en entrée, format détecté automatiquement (ou référence en mémoire)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel (pilote selon son extension). S'il est omis, stocké en mémoire."
              },
              "grouping_distance": {
                "label": "Distance de regroupement",
                "description": "Les bâtiments dont les emprises sont distantes de moins de cette valeur (unités du SCR) sont regroupés en une seule zone bâtie. Fixe le rayon de fermeture morphologique à la moitié de cette valeur."
              },
              "min_building_count": {
                "label": "Nombre minimal de bâtiments",
                "description": "Supprime les zones bâties contenant moins que ce nombre de bâtiments (par défaut 1 — conserver tous les groupes)."
              },
              "min_area": {
                "label": "Surface minimale",
                "description": "Supprime les zones bâties dont la surface (unités du SCR au carré) est inférieure à cette valeur, et comble les trous intérieurs plus petits qu'elle. Par défaut : tout conserver."
              },
              "simplify_tolerance": {
                "label": "Tolérance de simplification",
                "description": "Tolérance de Douglas–Peucker (unités du SCR) appliquée à la limite de la zone bâtie pour alléger la zone tampon arrondie riche en sommets. Par défaut 0 (aucune simplification)."
              }
            }
          },
          "delineate_depressions": {
            "name": "Délimiter les dépressions",
            "description": "Délimite des dépressions emboîtées à partir d'un raster de dépressions par la méthode des ensembles de niveaux (lidar slicing.py).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster de cuvettes en entrée (par ex. la sortie de extract_sinks)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin optionnel du raster d'identifiants de dépressions. Si omis, le résultat est stocké en mémoire."
              },
              "level_output": {
                "label": "Niveau en sortie",
                "description": "Chemin de sortie optionnel du raster de niveaux de dépression."
              },
              "csv_output": {
                "label": "CSV en sortie",
                "description": "Chemin de sortie optionnel du CSV d'attributs des dépressions."
              },
              "vector_output": {
                "label": "Vecteur en sortie",
                "description": "Chemin de sortie optionnel des polygones de dépressions au format GeoJSON (attributs joints)."
              },
              "min_size": {
                "label": "Taille minimale",
                "description": "Nombre minimal de pixels pour une dépression (par défaut 10)."
              },
              "min_depth": {
                "label": "Profondeur minimale",
                "description": "Profondeur minimale de dépression (acceptée pour compatibilité ; inutilisée, par parité avec lidar)."
              },
              "interval": {
                "label": "Intervalle",
                "description": "Intervalle de découpe pour la méthode des ensembles de niveaux (par défaut 0.3)."
              }
            }
          },
          "delineate_mounts": {
            "name": "Délimiter les buttes",
            "description": "Délimite la hiérarchie emboîtée des formes surélevées (monts) d'un MNT (lidar mounts.py).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster MNT en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin optionnel du raster d'identifiants de monts. Si omis, le résultat est stocké en mémoire."
              },
              "level_output": {
                "label": "Niveau en sortie",
                "description": "Chemin de sortie optionnel du raster de niveaux de monts."
              },
              "csv_output": {
                "label": "CSV en sortie",
                "description": "Chemin de sortie optionnel du CSV d'attributs des monts."
              },
              "vector_output": {
                "label": "Vecteur en sortie",
                "description": "Chemin de sortie optionnel des polygones de monts au format GeoJSON (attributs joints)."
              },
              "min_size": {
                "label": "Taille minimale",
                "description": "Nombre minimal de pixels pour un mont (par défaut 10)."
              },
              "min_height": {
                "label": "Hauteur minimale",
                "description": "Hauteur minimale de mont (acceptée pour compatibilité ; inutilisée, par parité avec lidar)."
              },
              "interval": {
                "label": "Intervalle",
                "description": "Intervalle de découpe pour la méthode des ensembles de niveaux (par défaut 0.3)."
              },
              "delta": {
                "label": "Delta",
                "description": "Valeur de base ajoutée lors de l'inversion du MNT (par défaut 100)."
              }
            }
          },
          "dem_filter": {
            "name": "Filtre de MNT",
            "description": "Lisse un MNT avec un filtre moyen, médian ou gaussien (lidar filtering.py).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster MNT en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              },
              "filter": {
                "label": "Filtre",
                "description": "Type de filtre : 'mean', 'median' ou 'gaussian' (par défaut 'mean')."
              },
              "kernel_size": {
                "label": "Taille du noyau",
                "description": "Taille de fenêtre en pixels pour les filtres mean/median (par défaut 3)."
              },
              "sigma": {
                "label": "Sigma",
                "description": "Écart-type du filtre gaussien (par défaut 1.0)."
              },
              "band": {
                "label": "Bande",
                "description": "Bande à filtrer, indexée à partir de 1 (par défaut 1)."
              }
            }
          },
          "dendrogram": {
            "name": "Dendrogramme",
            "description": "Construit un arbre de fusion hiérarchique sur les signatures de classes pour montrer à quel point les classes sont séparables, comme l'outil ArcGIS Dendrogram.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche d'entités regroupées portant un champ de classe et les champs numériques définissant l'espace des caractéristiques."
              },
              "class_field": {
                "label": "Champ de classe",
                "description": "Champ contenant l'identifiant de classe ou de grappe."
              },
              "fields": {
                "label": "Champs",
                "description": "Champs numériques séparés par des virgules définissant l'espace des caractéristiques."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel de la table de fusion. Si omis, le résultat est stocké en mémoire."
              },
              "distance": {
                "label": "Distance",
                "description": "Distance entre signatures : 'variance' (par défaut ; normalisée par la dispersion intra-classe) ou 'mean_only'."
              },
              "standardize": {
                "label": "Standardiser",
                "description": "Standardise chaque champ en scores z avant le calcul des distances afin que les champs de grande amplitude ne dominent pas (par défaut vrai)."
              },
              "output_text": {
                "label": "Texte en sortie",
                "description": "Chemin optionnel d'un rendu texte indenté de l'arbre."
              }
            }
          },
          "densify_sampling_network": {
            "name": "Densifier le réseau d'échantillonnage",
            "description": "Propose de nouveaux emplacements d'échantillonnage aux cellules où la surface d'erreur standard de prédiction par krigeage est la plus élevée, en respectant une distance d'inhibition d'espacement minimal, comme l'outil ArcGIS Densify Sampling Network.",
            "params": {
              "prediction_error": {
                "label": "Erreur de prédiction",
                "description": "Raster d'erreur type de prédiction en entrée (par ex. une surface de variance ou d'erreur de krigeage). Les nouveaux échantillons visent ses cellules de plus forte erreur."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de points en sortie (pilote déduit de l'extension). Si omis, stocké en mémoire."
              },
              "count": {
                "label": "Nombre",
                "description": "Nombre de nouveaux emplacements d'échantillonnage à proposer."
              },
              "inhibition_distance": {
                "label": "Distance d'inhibition",
                "description": "Espacement minimal entre les échantillons proposés en unités carte (par défaut 0 = aucune inhibition ; uniquement les cellules de plus forte erreur)."
              },
              "mask": {
                "label": "Masque",
                "description": "Couche de polygones optionnelle ; seules les cellules dont le centre s'y trouve sont des candidates éligibles."
              },
              "band": {
                "label": "Bande",
                "description": "Bande du raster d'erreur de prédiction à lire, indexée à partir de 1 (par défaut 1)."
              }
            }
          },
          "detect_bright_ocean_objects": {
            "name": "Détecter les objets brillants en mer",
            "description": "Détecte les navires et autres cibles ponctuelles brillantes sur l'eau dans l'imagerie SAR avec un détecteur CFAR à deux paramètres, et les émet sous forme de rectangles englobants orientés avec longueur, largeur, cap et rétrodiffusion maximale (ArcGIS Detect Bright Ocean Objects). Aucun registre ne dispose d'un détecteur de fouillis local : un seuil global ne peut pas fonctionner car le fouillis de mer s'éclaircit avec le vent et l'angle d'incidence, matched_filter_target_detection est un détecteur optique spectral et detect_image_anomalies utilise un modèle global plutôt qu'une fenêtre glissante.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster de rétrodiffusion SAR."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche de polygones en sortie des objets détectés. Si omis, le résultat est stocké en mémoire."
              },
              "geometry_type": {
                "label": "Type de géométrie",
                "description": "'bounding_box' (par défaut) pour le rectangle minimal orienté, ou 'perimeter' pour le contour tracé de la détection."
              },
              "threshold": {
                "label": "Seuil",
                "description": "Seuil de détection CFAR exprimé en écarts-types du fond (par défaut 5.0)."
              },
              "guard_size": {
                "label": "Taille de garde",
                "description": "Demi-largeur en cellules de la bande de garde exclue de l'estimation du fond (par défaut 3). Doit être inférieure à background_size."
              },
              "background_size": {
                "label": "Taille de fond",
                "description": "Demi-largeur en cellules de l'anneau de fond (par défaut 12)."
              },
              "mask_features": {
                "label": "Entités de masque",
                "description": "Couche de polygones masquant la terre ou l'eau. Les cellules exclues par le masque ne sont ni testées ni utilisées comme fond."
              },
              "mask_type": {
                "label": "Type de masque",
                "description": "'land_polygon' (par défaut ; analyse à l'extérieur des polygones) ou 'water_polygon' (analyse à l'intérieur)."
              },
              "min_object_length": {
                "label": "Longueur minimale d'objet",
                "description": "Écarte les objets plus courts que cette valeur, en unités carte."
              },
              "max_object_length": {
                "label": "Longueur maximale d'objet",
                "description": "Écarte les objets plus longs que cette valeur, en unités carte."
              },
              "min_object_width": {
                "label": "Largeur minimale d'objet",
                "description": "Écarte les objets plus étroits que cette valeur, en unités carte."
              },
              "max_object_width": {
                "label": "Largeur maximale d'objet",
                "description": "Écarte les objets plus larges que cette valeur, en unités carte."
              },
              "min_cells": {
                "label": "Cellules minimales",
                "description": "Écarte les détections plus petites que ce nombre de cellules (par défaut 2), ce qui supprime les pics de chatoiement isolés."
              },
              "input_units": {
                "label": "Unités d'entrée",
                "description": "'intensity' (par défaut), 'dn', 'amplitude' ou 'db'. La détection s'exécute sur la puissance linéaire, où les statistiques de fouillis ont un sens."
              },
              "band": {
                "label": "Bande",
                "description": "Bande à explorer, indexée à partir de 1 (par défaut 1)."
              }
            }
          },
          "detect_dark_ocean_areas": {
            "name": "Détecter les zones sombres en mer",
            "description": "Détecte les zones anormalement sombres sur l'eau dans l'imagerie SAR — nappes d'hydrocarbures, suintements naturels, films d'algues, zones de vent faible — comme des régions situées un nombre donné d'écarts-types sous le fond marin local, rapportées avec leur contraste en dB (ArcGIS Detect Dark Ocean Areas). Le complément de detect_bright_ocean_objects, et distinct de extract_water_sar : une scène entièrement en eau est unimodale, de sorte qu'une séparation d'Otsu couperait simplement le fouillis de mer en deux et déclarerait la moitié de l'océan comme une nappe.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster de rétrodiffusion SAR sur l'eau."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche de polygones en sortie des zones sombres. Si omis, le résultat est stocké en mémoire."
              },
              "output_raster": {
                "label": "Raster en sortie",
                "description": "Masque binaire en sortie (1 sombre, 0 arrière-plan). Toujours produit ; stocké en mémoire si aucun chemin n'est fourni."
              },
              "method": {
                "label": "Méthode",
                "description": "'statistical' (par défaut ; un nombre défini d'écarts-types sous la moyenne du fond), 'otsu' ou 'fixed'."
              },
              "threshold": {
                "label": "Seuil",
                "description": "Pour 'statistical', nombre d'écarts-types sous la moyenne à partir duquel une cellule est considérée comme sombre (par défaut 2.0). Pour 'fixed', le niveau en dB au-dessous ou à hauteur duquel une cellule est sombre."
              },
              "min_area": {
                "label": "Surface minimale",
                "description": "Écarte les zones sombres dont la surface est inférieure à cette valeur, en unités carte au carré. Les nappes sont vastes et continues ; le chatoiement ne l'est pas."
              },
              "min_contrast_db": {
                "label": "Contraste minimal (dB)",
                "description": "Écarte les régions situées à moins de ce nombre de dB sous le fond. Une nappe d'hydrocarbures se situe typiquement à plus de 5 dB en dessous."
              },
              "mask_features": {
                "label": "Entités de masque",
                "description": "Couche de polygones restreignant l'analyse à l'eau. La terre est brillante et gonflerait l'estimation du fond."
              },
              "mask_type": {
                "label": "Type de masque",
                "description": "'land_polygon' (par défaut ; analyse à l'extérieur des polygones) ou 'water_polygon' (analyse à l'intérieur)."
              },
              "histogram_bins": {
                "label": "Classes d'histogramme",
                "description": "Nombre de classes de l'histogramme d'Otsu (par défaut 256)."
              },
              "input_units": {
                "label": "Unités d'entrée",
                "description": "'intensity' (par défaut), 'dn', 'amplitude' ou 'db'."
              },
              "band": {
                "label": "Bande",
                "description": "Bande à explorer, indexée à partir de 1 (par défaut 1)."
              }
            }
          },
          "detect_feature_changes": {
            "name": "Détecter les changements d'entités",
            "description": "Apparie deux jeux de données linéaires par distance de Hausdorff et classe chacun comme inchangé / spatial / attributaire / spatial_attributaire / nouveau, plus les entités de base supprimées — le point d'entrée de la détection de changements et de la conflation vectorielles, comme l'outil ArcGIS Detect Feature Changes.",
            "params": {
              "update": {
                "label": "Mettre à jour",
                "description": "Couche vectorielle de lignes mise à jour (le nouvel état)."
              },
              "base": {
                "label": "Base",
                "description": "Couche vectorielle de lignes de base (l'état antérieur) servant de comparaison."
              },
              "output": {
                "label": "Sortie",
                "description": "Vecteur de lignes en sortie (entités mises à jour classées, plus les entités de base supprimées). Si omis, le résultat est stocké en mémoire."
              },
              "search_distance": {
                "label": "Distance de recherche",
                "description": "Distance maximale (unités du SCR) pour apparier une ligne mise à jour à une ligne de base. Requis."
              },
              "spatial_tolerance": {
                "label": "Tolérance spatiale",
                "description": "Distance de Hausdorff en dessous de laquelle une géométrie appariée est considérée comme inchangée (unités du SCR). Par défaut : search_distance / 5."
              },
              "compare_fields": {
                "label": "Champs à comparer",
                "description": "Champs séparés par des virgules, présents sur les deux couches, à comparer pour détecter les changements d'attributs."
              }
            }
          },
          "detect_graphic_conflict": {
            "name": "Détecter les conflits graphiques",
            "description": "Trouve où les emprises symbolisées (largeur dessinée) de deux couches d'entités — ou d'une couche contre elle-même — se chevauchent ou s'entassent en deçà d'une séparation minimale, en émettant un polygone de conflit par paire conflictuelle marqué des deux identifiants d'entités sources et de la surface de chevauchement, comme l'outil ArcGIS Detect Graphic Conflict.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée (points, lignes ou polygones)."
              },
              "conflict": {
                "label": "Conflit",
                "description": "Seconde couche vectorielle avec laquelle confronter 'input'. Omettre pour confronter 'input' à elle-même."
              },
              "symbol_width": {
                "label": "Largeur de symbole",
                "description": "Largeur/diamètre symbolisé des entités de 'input', en unités carte."
              },
              "conflict_symbol_width": {
                "label": "Largeur de symbole de conflit",
                "description": "Largeur/diamètre symbolisé des entités de 'conflict', en unités carte. Par défaut : identique à 'symbol_width'. Ignoré lorsque 'conflict' est omis."
              },
              "conflict_distance": {
                "label": "Distance de conflit",
                "description": "Séparation supplémentaire exigée au-delà du simple contact, en unités carte. Par défaut 0."
              },
              "line_connection_allowance": {
                "label": "Tolérance de connexion de lignes",
                "description": "Rayon autour d'une extrémité commune à deux entités linéaires de la même couche, à l'intérieur duquel leur recouvrement est traité comme une connectivité bout à bout normale et non comme un conflit. Par défaut 0 (aucune tolérance)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de polygones en sortie avec les champs 'input_fid', 'conflict_fid' et 'overlap_area'. Si omis, le résultat est stocké en mémoire."
              }
            }
          },
          "detect_image_anomalies": {
            "name": "Détecter les anomalies d'image",
            "description": "Évalue chaque pixel d'une image multibande par sa distance de Mahalanobis aux statistiques de bandes de la scène (ou d'une fenêtre glissante) — le détecteur d'anomalies de Reed–Xiaoli (RX) — avec un masque de seuil par percentile optionnel, comme l'outil ArcGIS Detect Image Anomalies.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster multibande en entrée (2 bandes ou plus)."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster de scores d'anomalie en sortie (F32). Si omis, le résultat est stocké en mémoire."
              },
              "mode": {
                "label": "Mode",
                "description": "'global' (statistiques sur la scène entière, par défaut) ou 'local' (statistiques sur fenêtre glissante)."
              },
              "window": {
                "label": "Fenêtre",
                "description": "Taille impaire de fenêtre (en pixels) pour le mode local (par défaut 15)."
              },
              "threshold": {
                "label": "Seuil",
                "description": "Percentile optionnel (0-100) de la distribution des scores au-delà duquel un masque binaire d'anomalies est écrit."
              },
              "mask_output": {
                "label": "Masque en sortie",
                "description": "Chemin de sortie du masque binaire d'anomalies (nécessite 'threshold'). Si omis alors qu'un seuil est fourni, le résultat est stocké en mémoire."
              }
            }
          },
          "detect_incidents": {
            "name": "Détecter les incidents",
            "description": "Signale où une condition commence et se termine le long de chaque trace : regroupe les points horodatés par trace, trie par temps, évalue une comparaison de début (et de fin optionnelle) sur un attribut numérique et émet des épisodes d'incident sous forme de points signalés ou de segments de ligne par épisode avec identifiants et durées — comme l'outil ArcGIS Detect Incidents.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points en entrée comportant des observations horodatées."
              },
              "track_field": {
                "label": "Champ de trace",
                "description": "Champ identifiant chaque trajectoire ou mobile (par ex. l'identifiant d'un véhicule ou d'un animal)."
              },
              "time_field": {
                "label": "Champ de temps",
                "description": "Champ contenant l'heure de chaque point : secondes numériques ou horodatage ISO-8601."
              },
              "start_condition": {
                "label": "Condition de début",
                "description": "Condition qui ouvre un incident, par ex. 'speed > 30'. Grammaire : '<field> <op> <number>' où op vaut > >= < <= == != , avec éventuellement deux clauses reliées par AND."
              },
              "end_condition": {
                "label": "Condition de fin",
                "description": "Condition optionnelle qui clôt un incident (même grammaire). Si omise, un incident se termine lorsque la condition de départ cesse d'être vérifiée."
              },
              "mode": {
                "label": "Mode",
                "description": "Mode de sortie : 'points' (par défaut, chaque point est repris avec les champs d'incident) ou 'segments' (une polyligne par incident)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de sortie (pilote déduit de l'extension). Si omis, le résultat est stocké en mémoire."
              }
            }
          },
          "dice": {
            "name": "Découper en dés",
            "description": "Divise les polygones ou polylignes dépassant une limite de sommets en une grille de morceaux plus petits (comme ArcGIS Dice), afin que la superposition et le tuilage en aval restent rapides — un quadtree adaptatif intersecte la géométrie avec chaque quadrant jusqu'à ce que chaque morceau soit sous la limite.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de polygones ou de polylignes en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche en sortie des morceaux découpés. Si omis, le résultat est stocké en mémoire."
              },
              "vertex_limit": {
                "label": "Limite de sommets",
                "description": "Nombre maximal de sommets par entité de sortie (par défaut 10000). Les entités qui n'excèdent pas ce nombre sont transmises inchangées."
              }
            }
          },
          "difference_3d": {
            "name": "Différence 3D",
            "description": "Soustrait un ensemble de solides 3D d'un autre ensemble, en rapportant le volume retiré et le volume restant de chaque entité diminuende (ArcGIS Difference 3D). union_3d était la seule superposition 3D des deux registres et erase est limité aux polygones 2D, il n'y avait donc aucun moyen de calculer le volume excavé restant après un corps de coupe ou le volume d'un panache hors d'une enveloppe d'exclusion. Les volumes des diminuendes sont exacts ; le volume retiré est estimé par occupation de voxels à une résolution rapportée.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Solides 3D fermés servant de diminuende (MultiPolygones en maillage triangulaire avec Z)."
              },
              "subtract": {
                "label": "Soustraire",
                "description": "Solides 3D fermés servant de diminuteur, à retirer de chaque diminuende."
              },
              "output": {
                "label": "Sortie",
                "description": "Table de sortie, une ligne par diminuende. Si omis, le résultat est stocké en mémoire."
              },
              "resolution": {
                "label": "Résolution",
                "description": "Nombre de voxels le long du plus grand axe de l'emprise de chaque diminuende (par défaut 64). Une valeur plus élevée est plus exacte et plus lente."
              },
              "keep_geometry": {
                "label": "Conserver la géométrie",
                "description": "Reporte la géométrie d'origine de chaque diminuende sur sa ligne de sortie (par défaut faux : une table d'attributs seuls). La géométrie est le diminuende NON DÉCOUPÉ — aucun maillage fusionné exact n'est produit."
              }
            }
          },
          "diffusion_interpolation_with_barriers": {
            "name": "Interpolation par diffusion avec barrières",
            "description": "Interpole des mesures ponctuelles dispersées en un raster en simulant une diffusion de chaleur qui contourne les barrières absolues (sans flux) plutôt que de les traverser (comme ArcGIS Diffusion Interpolation With Barriers). Les échantillons sont fixés comme cellules immobiles ; chaque autre cellule relaxe vers la moyenne de ses voisines non barrières au cours de `number_iterations` balayages de Jacobi de l'équation de Laplace/de la chaleur, de sorte que l'influence décroît avec la distance de diffusion. Distinct du noyau de plus court chemin hors barrière de interpolate_with_barriers et du lisseur raster anisotropic_diffusion_filter.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points en entrée des mesures d'échantillonnage (Point / MultiPoint)."
              },
              "z_field": {
                "label": "Champ Z",
                "description": "Champ numérique des points contenant la valeur à interpoler."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster interpolé en sortie (GeoTIFF). Si omis, le résultat est stocké en mémoire."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule / résolution de sortie en unités carte (mètres pour un SCR géographique, unités du SCR sinon). Requis."
              },
              "barriers": {
                "label": "Barrières",
                "description": "Couche vectorielle de barrières optionnelle (polylignes ou polygones) qui bloque la diffusion. Les polylignes bloquent les cellules que leurs segments traversent ; les polygones bloquent les cellules dont le centre s'y trouve. Omettre pour un traitement témoin sans barrière."
              },
              "bandwidth": {
                "label": "Largeur de bande",
                "description": "Poids de relaxation lambda par itération dans (0, 0.25] (par défaut 0.2) : à chaque balayage, chaque cellule libre se rapproche de cette fraction de la moyenne de ses voisines."
              },
              "number_iterations": {
                "label": "Nombre d'itérations",
                "description": "Nombre de balayages de relaxation de Jacobi de l'équation de la chaleur (par défaut 100). Davantage d'itérations propagent l'influence plus loin."
              },
              "weight_field": {
                "label": "Champ de poids",
                "description": "Champ numérique optionnel donnant un poids par point (par défaut 1), utilisé uniquement pour moyenner les échantillons confondus qui tombent dans la même cellule de sortie."
              },
              "epsg": {
                "label": "EPSG",
                "description": "Remplace le code EPSG du SCR d'entrée (par ex. lorsque la couche n'est pas renseignée). La valeur 4326 déclenche la projection métrique locale."
              }
            }
          },
          "dimension_reduction": {
            "name": "Réduction de dimension",
            "description": "Analyse en composantes principales sur des attributs numériques d'entités (comme ArcGIS Dimension Reduction) : standardise les champs sélectionnés, décompose en valeurs propres la matrice de corrélation/covariance par une rotation de Jacobi maison et réécrit les scores des composantes PC1..PCk dans les entités, avec un rapport de valeurs propres/variance/saturations — le pendant attributaire vectoriel de principal_component_analysis intégré, limité aux bandes.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle (ou table) en entrée comportant des champs attributaires numériques."
              },
              "fields": {
                "label": "Champs",
                "description": "Liste séparée par des virgules d'au moins deux champs numériques à réduire."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche vectorielle de sortie avec les champs de scores des composantes principales ajoutés. Si omis, le résultat est stocké en mémoire."
              },
              "table": {
                "label": "Table",
                "description": "Chemin CSV optionnel du rapport sur les composantes (valeur propre, variance expliquée, cumul, saturations par variable). Toujours renvoyé dans le résultat."
              },
              "num_components": {
                "label": "Nombre de composantes",
                "description": "Nombre de premières composantes à conserver. Par défaut : le nombre nécessaire pour atteindre 'min_variance', sinon tous les champs."
              },
              "min_variance": {
                "label": "Variance minimale",
                "description": "Conserve le plus petit nombre de composantes dont la variance expliquée cumulée atteint cette fraction (0-1). Ignoré si 'num_components' est défini."
              },
              "standardize": {
                "label": "Standardiser",
                "description": "Standardise chaque champ (score z) avant l'ACP afin que les échelles soient comparables — analyse la matrice de corrélation. Par défaut vrai ; faux analyse la matrice de covariance."
              }
            }
          },
          "dimensional_moving_statistics": {
            "name": "Statistiques mobiles dimensionnelles",
            "description": "Fait glisser une fenêtre le long de la dimension d'un cube raster, en écrivant une tranche lissée par tranche d'entrée — la moyenne ou médiane glissante en place qui transforme une série temporelle satellitaire bruitée en une série exploitable (ArcGIS Dimensional Moving Statistics). time_series_smoothing de la série 17 est limité aux vecteurs, les filtres focaux intégrés déplacent une fenêtre spatialement dans une seule tranche, et aggregate_multidimensional_raster raccourcit le cube en groupes. Inclut une moyenne circulaire, sans laquelle moyenner l'exposition ou la phase à travers le point de bouclage n'a pas de sens.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Un raster multibande (chaque bande est une tranche) ou une liste de rasters co-enregistrés séparés par des virgules."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster multibande de sortie avec une bande par tranche d'entrée. Si omis, le résultat est stocké en mémoire."
              },
              "dimension": {
                "label": "Dimension",
                "description": "Nom de la dimension, utilisé uniquement dans le rapport (par défaut 'slice')."
              },
              "backward_window": {
                "label": "Fenêtre arrière",
                "description": "Nombre de tranches précédant la tranche courante à inclure (par défaut 1)."
              },
              "forward_window": {
                "label": "Fenêtre avant",
                "description": "Nombre de tranches suivant la tranche courante à inclure (par défaut 1)."
              },
              "statistic": {
                "label": "Statistique",
                "description": "'mean' (par défaut), 'circular_mean', 'majority', 'maximum', 'median', 'minimum', 'minority', 'percentile', 'std' ou 'sum'."
              },
              "percentile_value": {
                "label": "Valeur de percentile",
                "description": "Percentile dans [0, 100] pour la statistique 'percentile' (par défaut 50)."
              },
              "period": {
                "label": "Période",
                "description": "Période de bouclage pour 'circular_mean' (par défaut 360, c'est-à-dire des degrés ; utiliser 6.283185307179586 pour des radians)."
              },
              "min_valid": {
                "label": "Valides minimaux",
                "description": "Nombre minimal d'observations non NoData dans la fenêtre avant qu'une valeur soit écrite (par défaut 1)."
              },
              "nodata_handling": {
                "label": "Gestion de NoData",
                "description": "'data' (par défaut ; ignore les NoData et calcule à partir du reste), 'nodata' (tout NoData dans la fenêtre rend la sortie NoData) ou 'fill_nodata' (écrit également une valeur là où la tranche centrale est elle-même NoData)."
              }
            }
          },
          "directional_distribution": {
            "name": "Distribution directionnelle",
            "description": "Statistiques descriptives de distribution géographique : centre moyen, centre médian, entité centrale, distance standard (cercle) et ellipse d'écart-type — avec pondération et regroupement optionnels.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée (points de préférence ; les autres géométries utilisent leur point représentatif, moyenne de leurs sommets)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel (pilote selon son extension). S'il est omis, stocké en mémoire."
              },
              "statistic": {
                "label": "Statistique",
                "description": "Mesure à calculer : 'mean_center', 'median_center', 'central_feature', 'standard_distance' ou 'standard_deviational_ellipse'."
              },
              "weight_field": {
                "label": "Champ de poids",
                "description": "Champ numérique optionnel pour pondérer chaque entité (par ex. la population). Par défaut : chaque entité reçoit un poids de 1."
              },
              "case_field": {
                "label": "Champ de cas",
                "description": "Champ optionnel de regroupement des entités ; une entité de sortie est produite par valeur distincte."
              },
              "n_std": {
                "label": "N écarts-types",
                "description": "Multiplicateur d'écart-type (1, 2 ou 3) pour le cercle de distance standard et l'ellipse de déviation standard. Par défaut 1."
              }
            }
          },
          "directional_trend": {
            "name": "Tendance directionnelle",
            "description": "Projette des points d'échantillonnage sur un azimut choisi et ajuste un polynôme d'ordre 1 à 3 de la valeur en fonction de la distance pour détecter une tendance globale/anisotrope avant la variographie (comme l'outil Directional Trend d'ArcGIS). « determine » balaie les azimuts à la recherche de la direction de variance expliquée maximale.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée (points de préférence ; les autres géométries utilisent leur point représentatif, moyenne de leurs sommets)."
              },
              "field": {
                "label": "Champ",
                "description": "Champ attributaire numérique dont la tendance est analysée."
              },
              "azimuth": {
                "label": "Azimut",
                "description": "Azimut en degrés (0 = nord, sens horaire) sur lequel projeter, ou 'determine' (par défaut) pour balayer 0-179° et retenir l'azimut de variance expliquée maximale."
              },
              "order": {
                "label": "Ordre",
                "description": "Ordre polynomial 1, 2 ou 3 (par défaut 2)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin optionnel du vecteur de sortie (pilote déduit de son extension). Si omis, le résultat est stocké en mémoire. Les points portent proj_dist, value, fitted et residual."
              }
            }
          },
          "directional_variogram": {
            "name": "Analyse de variogramme directionnel",
            "description": "Calcule des variogrammes dans plusieurs directions pour détecter l'anisotropie spatiale. Révèle les motifs de continuité directionnelle essentiels à un krigeage réaliste.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de points avec des valeurs de mesure"
              },
              "field": {
                "label": "Champ",
                "description": "Champ contenant les valeurs de mesure"
              },
              "directions": {
                "label": "Directions",
                "description": "Liste séparée par des virgules des azimuts (0-180°) à analyser"
              },
              "tolerance": {
                "label": "Tolérance",
                "description": "Tolérance de direction en degrés (par défaut 22.5)"
              },
              "max_distance": {
                "label": "Distance maximale",
                "description": "Distance de décalage maximale à calculer (par défaut 1000)"
              },
              "bin_size": {
                "label": "Taille des cellules",
                "description": "Taille des classes de décalage (par défaut 50)"
              },
              "output_json": {
                "label": "JSON de sortie",
                "description": "Chemin du fichier de sortie des résultats du variogramme directionnel"
              },
              "output_html": {
                "label": "HTML de sortie",
                "description": "Chemin de sortie optionnel de la visualisation en rose des directions au format HTML"
              }
            }
          },
          "disperse_markers": {
            "name": "Disperser les symboles",
            "description": "Écarte les symboles ponctuels coïncidents ou superposés jusqu'à un espacement minimal centre à centre (motifs étendu/anneau/croix/carré) afin que les points empilés restent individuellement visibles, comme l'outil ArcGIS Disperse Markers.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de points en sortie (pilote déduit de l'extension). Si omis, stocké en mémoire."
              },
              "min_spacing": {
                "label": "Espacement minimal",
                "description": "Espacement minimal de centre à centre à imposer entre les points regroupés, en unités carte."
              },
              "pattern": {
                "label": "Motif",
                "description": "'expanded' (par défaut, anneaux concentriques et répulsion locale), 'ring' (cercle unique), 'cross' (quatre branches) ou 'square' (grille)."
              },
              "seed": {
                "label": "Graine",
                "description": "Graine entière pour départager de façon déterministe lorsque des membres sont initialement exactement confondus (par défaut 0)."
              }
            }
          },
          "dissolve_route_events": {
            "name": "Dissoudre les événements de route",
            "description": "Fusionne les événements d'itinéraire qui se touchent ou se chevauchent le long du même itinéraire en intervalles de mesure uniques, soit uniquement lorsque les champs de fusion correspondent (« dissolve »), soit en concaténant les valeurs différentes (« concatenate »). Comme l'outil ArcGIS Dissolve Route Events.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Table d'événements en entrée (événements linéaires avec mesures de début et de fin)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de la table d'événements en sortie. Si omis, le résultat est stocké en mémoire."
              },
              "route_id_field": {
                "label": "Champ d'identifiant d'itinéraire",
                "description": "Champ contenant l'identifiant de l'itinéraire."
              },
              "from_measure_field": {
                "label": "Champ de mesure de début",
                "description": "Champ contenant la mesure de début de chaque événement."
              },
              "to_measure_field": {
                "label": "Champ de mesure de fin",
                "description": "Champ contenant la mesure de fin de chaque événement. Pour des événements ponctuels, utiliser le même champ que 'from_measure_field'."
              },
              "dissolve_fields": {
                "label": "Champs de fusion",
                "description": "Noms de champs séparés par des virgules ou des points-virgules qui doivent concorder pour que deux tronçons fusionnent (ou dont les valeurs sont concaténées)."
              },
              "mode": {
                "label": "Mode",
                "description": "'dissolve' (par défaut) ou 'concatenate'."
              },
              "tolerance": {
                "label": "Tolérance",
                "description": "Écart de mesure en dessous duquel deux tronçons sont considérés comme adjacents (par défaut 0)."
              },
              "separator": {
                "label": "Séparateur",
                "description": "Séparateur utilisé pour joindre les valeurs en mode 'concatenate' (par défaut ', ')."
              }
            }
          },
          "edgematch_features": {
            "name": "Raccorder les entités aux bords",
            "description": "Connecte des jeux de données linéaires à travers une limite de tuile/feuille (comme ArcGIS Generate Edgematch Links + Edgematch Features) : apparie un à un les extrémités pendantes dans une tolérance et les réconcilie (point médian ou accrochage), avec une couche optionnelle de liens d'appariement. L'appariement un à un entre entités qui manque à snap_endnodes, qui opère à l'aveugle.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de lignes en entrée (par ex. deux tuiles adjacentes fusionnées) à raccorder en bordure."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche de lignes ajustée en sortie. Si omis, le résultat est stocké en mémoire."
              },
              "tolerance": {
                "label": "Tolérance",
                "description": "Distance maximale entre extrémités libres pour les apparier."
              },
              "method": {
                "label": "Méthode",
                "description": "'midpoint' (déplace les deux extrémités vers leur point milieu ; par défaut) ou 'move_endpoint' (accroche la seconde sur la première)."
              },
              "match_fields": {
                "label": "Champs de correspondance",
                "description": "Champs optionnels séparés par des virgules ; une paire appariée doit concorder sur ces champs, ce qui départage les candidats."
              },
              "links": {
                "label": "Liens",
                "description": "Couche de lignes optionnelle en sortie des liens d'appariement (pour le contrôle qualité)."
              }
            }
          },
          "eighty_twenty_analysis": {
            "name": "Analyse quatre-vingt / vingt",
            "description": "Accroche les points d'incidents en emplacements pondérés et calcule la concentration de Pareto (« X % des incidents se produisent à Y % des emplacements »), en marquant chaque emplacement de son rang, de son pourcentage cumulé d'incidents et de sa bande tête/queue, comme l'outil ArcGIS Eighty Twenty Analysis.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points d'incidents en entrée (Point ou MultiPoint)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de points en sortie (pilote déduit de l'extension). Si omis, stocké en mémoire."
              },
              "cluster_tolerance": {
                "label": "Tolérance de regroupement",
                "description": "Distance à l'intérieur de laquelle les incidents sont regroupés en un seul emplacement (unités carte, par défaut 0 = uniquement les points exactement confondus)."
              },
              "weight_field": {
                "label": "Champ de poids",
                "description": "Champ numérique optionnel donnant le poids de chaque incident (par défaut : chaque incident compte pour 1)."
              },
              "threshold": {
                "label": "Seuil",
                "description": "Seuil de concentration en pourcentage qui définit la « tête » de Pareto (par défaut 80)."
              }
            }
          },
          "eliminate_polygon_part": {
            "name": "Éliminer une partie de polygone",
            "description": "Supprime les trous intérieurs (et en option les petites parties extérieures) des polygones dont la surface est inférieure à un seuil de surface absolue ou de pourcentage, en préservant les attributs.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier vectoriel de polygones en entrée, format détecté automatiquement (ou référence en mémoire)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel (pilote selon son extension). S'il est omis, stocké en mémoire."
              },
              "condition": {
                "label": "Condition",
                "description": "Test de taille : 'AREA' (par défaut) compare à 'min_area' ; 'PERCENT' compare la surface de la partie ou du trou, exprimée en pourcentage de la surface externe totale de l'entité, à 'percentage'."
              },
              "min_area": {
                "label": "Surface minimale",
                "description": "Condition AREA : supprime les parties et les trous dont la surface (en unités du SCR au carré) est inférieure à cette valeur. Requis lorsque condition = AREA."
              },
              "percentage": {
                "label": "Pourcentage",
                "description": "Condition PERCENT : supprime les parties et les trous dont la surface, exprimée en pourcentage (0-100) de la surface externe totale de l'entité, est inférieure à cette valeur. Requis lorsque condition = PERCENT."
              },
              "part_option": {
                "label": "Option de parties",
                "description": "Ce qui peut être supprimé : 'CONTAINED_ONLY' (par défaut) ne supprime que les anneaux intérieurs (les trous) ; 'ANY' supprime également les petites parties extérieures, à l'exception de la plus grande."
              }
            }
          },
          "eliminate_polygons": {
            "name": "Éliminer des polygones",
            "description": "Fusionne les polygones résiduels (selon une surface maximale et/ou une requête attributaire) dans un polygone voisin, choisi selon la plus longue frontière partagée ou la plus grande surface.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier vectoriel de polygones en entrée, format détecté automatiquement (ou référence en mémoire)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel (pilote selon son extension). S'il est omis, stocké en mémoire."
              },
              "max_area": {
                "label": "Surface maximale",
                "description": "Sélectionne les polygones dont la surface (en unités du SCR au carré) est inférieure ou égale à cette valeur. Peut être combiné avec 'where' (les deux conditions doivent être vérifiées)."
              },
              "where": {
                "label": "Où",
                "description": "Sélectionne les polygones vérifiant une condition attributaire simple 'FIELD OP VALUE', où OP vaut = != < <= > >= (par ex. \"class = 0\"). Peut être combiné avec 'max_area'."
              },
              "exclude": {
                "label": "Exclure",
                "description": "Protège de l'élimination les entités vérifiant cette condition (même syntaxe 'FIELD OP VALUE') ; elles sont conservées et peuvent recevoir des fusions."
              },
              "strategy": {
                "label": "Stratégie",
                "description": "Voisin dans lequel une esquille est fusionnée : 'longest_border' (par défaut) ou 'largest_area'."
              },
              "tolerance": {
                "label": "Tolérance",
                "description": "Distance perpendiculaire maximale (en unités du SCR) pour que deux segments de limite comptent comme une arête commune. Par défaut 1e-6."
              }
            }
          },
          "emerging_hot_spot_analysis": {
            "name": "Analyse des points chauds émergents",
            "description": "Tendances de points chauds spatio-temporels sur un cube spatio-temporel H3 : regroupe les points horodatés en cellules H3 x pas de temps, calcule le Gi* de Getis-Ord par groupe et classe chaque cellule (point chaud ou froid nouveau/en intensification/persistant/en diminution/...) via un test de tendance de Mann-Kendall, comme l'outil ArcGIS Emerging Hot Spot Analysis.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points en entrée (lon/lat géographiques, EPSG:4326). Les autres géométries utilisent leur point représentatif, moyenne de leurs sommets."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de sortie (pilote déduit de l'extension). Un polygone H3 par cellule. Si omis, le résultat est stocké en mémoire."
              },
              "time_field": {
                "label": "Champ de temps",
                "description": "Champ contenant l'instant de chaque point : un champ numérique (dans ses propres unités) ou une chaîne de date/heure ISO-8601."
              },
              "time_step": {
                "label": "Pas de temps",
                "description": "Largeur d'un pas de temps : un nombre simple (pour un time_field numérique) ou une durée comme '1w', '7d', '12h', '1M' pour un champ de date. Par défaut '1w'."
              },
              "value_field": {
                "label": "Champ de valeur",
                "description": "Champ numérique optionnel sommé dans chaque classe. Par défaut : le nombre de points par classe."
              },
              "resolution": {
                "label": "Résolution",
                "description": "Résolution H3 de 0 (la plus grossière) à 15 (la plus fine) ; par défaut 7 (cellules d'environ 5 km²)."
              },
              "neighborhood": {
                "label": "Voisinage",
                "description": "Rayon de voisinage spatial en k-anneaux H3 (par défaut 1)."
              },
              "time_window": {
                "label": "Fenêtre temporelle",
                "description": "Rayon de voisinage temporel en pas de temps (par défaut 1)."
              }
            }
          },
          "empirical_bayesian_kriging": {
            "name": "Krigeage bayésien empirique",
            "description": "Interpole un champ ponctuel via de nombreux sous-ensembles locaux chevauchants, chacun ajustant son propre semi-variogramme dont l'incertitude est capturée en simulant des semi-variogrammes perturbés à partir d'un générateur aléatoire avec graine, puis mélange les prédictions/variances de krigeage des sous-ensembles selon la distance (comme l'outil Empirical Bayesian Kriging d'ArcGIS) — distinct des krigeages ordinaire/universel/simple/co-krigeage intégrés, qui ajustent tous un seul semi-variogramme global (ou à fenêtre glissante unique) accepté manuellement.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de points en entrée."
              },
              "field": {
                "label": "Champ",
                "description": "Champ numérique de la couche d'entrée à interpoler."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster de prédiction en sortie. Si omis, le résultat est stocké en mémoire."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule de sortie en unités du SCR. Par défaut : dimensionnée pour que le plus grand axe de la grille compte environ 150 cellules."
              },
              "subset_size": {
                "label": "Taille du sous-ensemble",
                "description": "Nombre cible de points par sous-ensemble local (par défaut 40, minimum 4)."
              },
              "overlap": {
                "label": "Chevauchement",
                "description": "Fraction de la largeur/hauteur d'une tuile de sous-ensemble sur laquelle les tuiles voisines se chevauchent (par défaut 0.25)."
              },
              "simulations": {
                "label": "Simulations",
                "description": "Nombre de semi-variogrammes simulés tirés par sous-ensemble pour représenter l'incertitude du modèle (par défaut 5, maximum 50)."
              },
              "semivariogram": {
                "label": "Semi-variogramme",
                "description": "Famille de modèles de semi-variogramme : 'power' (par défaut), 'linear' ou 'exponential'."
              },
              "transform": {
                "label": "Transformation",
                "description": "Transformation des données avant krigeage : 'none' (par défaut) ou 'log_empirical' (logarithme népérien ; exige un champ > 0 partout)."
              },
              "error_output": {
                "label": "Erreur en sortie",
                "description": "Raster d'erreur type de prédiction en sortie optionnel."
              },
              "seed": {
                "label": "Graine",
                "description": "Graine du générateur aléatoire déterministe de simulation de semi-variogrammes (par défaut 42)."
              }
            }
          },
          "enclose_multipatch": {
            "name": "Fermer un multipatch",
            "description": "Convertit des surfaces ouvertes de maillage triangulaire 3D en solides fermés et étanches en obturant leurs boucles de bordure, afin qu'elles deviennent une entrée valide pour l'analyse volumétrique (ArcGIS Enclose Multipatch). is_closed_3d peut diagnostiquer un maillage ouvert mais rien ne pouvait le réparer, et union_3d / intersect_3d / difference_3d / inside_3d rejettent ou rapportent mal les maillages ouverts — qui sont l'état normal des emprises extrudées, des coques de terrain et des surfaces de bâtiments importées.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Entités surfaciques 3D (MultiPolygones en maillage triangulaire avec Z)."
              },
              "output": {
                "label": "Sortie",
                "description": "Entités solides fermées en sortie. Si omis, le résultat est stocké en mémoire."
              },
              "drop_failed": {
                "label": "Abandonner les échecs",
                "description": "Omet les entités qui n'ont pas pu être rendues étanches (par défaut faux : elles sont émises avec CAP_FAILED = true afin que l'échec soit visible plutôt que silencieux)."
              }
            }
          },
          "enforce_river_monotonicity": {
            "name": "Imposer la monotonie de la rivière",
            "description": "Creuse un MNT pour que les élévations décroissent de façon monotone vers l'aval le long de polylignes de rivières cartographiées — une étape de mise en conformité hydrologique pour la modélisation hydraulique et des inondations, comme l'outil ArcGIS Enforce River Monotonicity. Contrairement à fill_depressions/fill_burn (qui suppriment les cuvettes fermées), il impose un profil monotone le long d'un vecteur de rivière connu.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de polylignes de cours d'eau en entrée (LineString / MultiLineString) partageant le SCR du MNT."
              },
              "surface": {
                "label": "Surface",
                "description": "Raster d'altitude (MNT) à corriger."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du MNT corrigé en sortie (format déduit de l'extension). Si omis, le résultat est stocké en mémoire."
              },
              "tolerance": {
                "label": "Tolérance",
                "description": "Dénivelé minimal imposé à chaque pas densifié, en unités Z (par défaut 0 = profil non croissant). Des valeurs positives imposent un profil strictement décroissant."
              },
              "sample_distance": {
                "label": "Distance d'échantillonnage",
                "description": "Intervalle de densification en unités du SCR le long de chaque ligne de cours d'eau. Par défaut : la taille de cellule du raster (environ un échantillon par cellule)."
              },
              "band": {
                "label": "Bande",
                "description": "Bande du MNT à corriger, indexée à partir de 1 (par défaut 1)."
              }
            }
          },
          "estimate_time_to_event": {
            "name": "Estimer le délai avant événement",
            "description": "Estime le temps jusqu'à un événement via une courbe de survie de Kaplan-Meier (comme ArcGIS Estimate Time To Event) : à partir d'un champ de durée et d'un champ d'événement/censure, calcule la probabilité de survie de chaque entité et le temps médian jusqu'à l'événement de sa strate, éventuellement stratifié par un champ catégoriel.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de points ou de polygones en entrée comportant un champ de durée et un champ d'événement ou de censure."
              },
              "age_field": {
                "label": "Champ d'âge",
                "description": "Champ contenant la durée observée de chaque entité (délai jusqu'à l'événement ou jusqu'à la censure), un nombre positif ou nul."
              },
              "event_field": {
                "label": "Champ d'événement",
                "description": "Champ indiquant si l'événement s'est produit (valeur vraie : 1/true) ou si l'observation a été censurée (valeur fausse : 0/false)."
              },
              "stratify_field": {
                "label": "Champ de stratification",
                "description": "Champ catégoriel optionnel permettant d'ajuster une courbe de survie distincte par groupe."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche de sortie avec les champs km_survival, km_median et km_stratum ajoutés. Si omis, le résultat est stocké en mémoire."
              }
            }
          },
          "estimate_variogram": {
            "name": "Estimer le variogramme",
            "description": "Calcule un semi-variogramme empirique à partir d'observations ponctuelles pour caractériser la structure de corrélation spatiale. Première étape essentielle du processus géostatistique.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points en entrée avec des valeurs"
              },
              "field": {
                "label": "Champ",
                "description": "Champ contenant les valeurs de mesure"
              },
              "lag_distance": {
                "label": "Distance de pas",
                "description": "Taille des classes de décalage en unités carte (par défaut : 100.0)"
              },
              "lag_tolerance": {
                "label": "Tolérance de pas",
                "description": "Tolérance de regroupement des décalages en classes (par défaut : 50.0)"
              },
              "max_lag_count": {
                "label": "Nombre maximal de pas",
                "description": "Nombre maximal de décalages à conserver (par défaut : 20)"
              }
            }
          },
          "euclidean_direction": {
            "name": "Direction euclidienne",
            "description": "Calcule l'azimut boussole de chaque cellule vers sa cellule source la plus proche, plus des rasters optionnels de distance et de direction de retour (ArcGIS Euclidean Direction). Complète la famille euclidienne intégrée, qui fournit euclidean_distance (à quelle distance) et euclidean_allocation (quelle source) mais pas le relèvement. Utilise une transformée de distance exacte qui transporte les coordonnées de la source la plus proche ; avec un raster de barrières, il contourne les obstacles.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster de sources : les cellules qui ne sont ni NoData ni nulles sont des sources."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel du raster de directions (degrés dans le sens horaire depuis le nord). Si omis, le résultat est stocké en mémoire."
              },
              "output_distance": {
                "label": "Distance en sortie",
                "description": "Chemin optionnel du raster de distances associé."
              },
              "output_back_direction": {
                "label": "Direction de retour en sortie",
                "description": "Chemin optionnel du raster de direction de retour : l'azimut à suivre depuis cette cellule pour revenir vers la source la plus proche. Identique au raster de directions lorsqu'aucune barrière n'est fournie ; avec des barrières, il correspond au premier pas du chemin de retour."
              },
              "barriers": {
                "label": "Barrières",
                "description": "Raster de barrières optionnel ; les cellules non nulles et non NoData bloquent les trajets rectilignes et obligent à les contourner."
              },
              "max_distance": {
                "label": "Distance maximale",
                "description": "Les cellules situées au-delà de cette distance de toute source sont écrites en NoData."
              },
              "band": {
                "label": "Bande",
                "description": "Bande du raster de sources à lire, indexée à partir de 1 (par défaut 1)."
              }
            }
          },
          "evaluate_bin_sizes": {
            "name": "Évaluer les tailles de classes",
            "description": "Balaie des tailles de cellules d'agrégation candidates et rapporte des diagnostics identifiant la taille qui révèle le mieux la structure, comme l'outil ArcGIS Evaluate Bin Sizes.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Entités ponctuelles à agréger."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel de la table de diagnostics. Si omis, le résultat est stocké en mémoire."
              },
              "bin_shape": {
                "label": "Forme des cellules",
                "description": "hexagon (par défaut ; approximation par décalage de rangées, voir la documentation) | square."
              },
              "sizes": {
                "label": "Tailles",
                "description": "Tailles de classes candidates séparées par des virgules (unités carte). Si omis, un balayage géométrique est généré à partir de la distance moyenne au plus proche voisin."
              },
              "steps": {
                "label": "Étapes",
                "description": "Nombre de candidats dans le balayage généré (par défaut 8, maximum 64)."
              },
              "analysis_field": {
                "label": "Champ d'analyse",
                "description": "Champ numérique optionnel à sommer par classe au lieu de compter les points."
              }
            }
          },
          "evaluate_variable_influence": {
            "name": "Évaluer l'influence des variables",
            "description": "Rapporte l'importance par permutation et les courbes de dépendance partielle d'un modèle de forêt ajusté à partir d'une table, répondant à la question de savoir quelles variables explicatives un modèle utilise réellement et quelle forme a chaque effet (ArcGIS Evaluate Variable Influence). Le catalogue peut ajuster des modèles — generalized_linear_regression, exploratory_regression, geographically_weighted_regression, forest_based_forecast, les forêts aléatoires de Whitebox — mais aucun ne rapporte l'une ou l'autre mesure. ArcGIS lit un fichier de modèle .ssm entraîné ; cette pile n'a pas de format de modèle portable, l'outil ajuste donc sa propre forêt puis l'explique. Entièrement déterministe : bagging par pas et permutation fixe, sans générateur aléatoire.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche ou table contenant les observations d'entraînement."
              },
              "dependent_field": {
                "label": "Champ dépendant",
                "description": "Champ à prédire."
              },
              "explanatory_fields": {
                "label": "Champs explicatifs",
                "description": "Champs numériques séparés par des virgules à évaluer."
              },
              "output": {
                "label": "Sortie",
                "description": "Table de sortie de l'importance par variable. Si omis, le résultat est stocké en mémoire."
              },
              "output_partial_dependence": {
                "label": "Dépendance partielle en sortie",
                "description": "Table de sortie des courbes de dépendance partielle, une ligne par variable et par point de la grille. Toujours produite ; stockée en mémoire si aucun chemin n'est fourni."
              },
              "model_type": {
                "label": "Type de modèle",
                "description": "'regression' (par défaut) pour une cible continue, ou 'classification' pour une cible catégorielle."
              },
              "number_of_trees": {
                "label": "Nombre d'arbres",
                "description": "Nombre d'arbres dans l'ensemble (par défaut 50)."
              },
              "max_depth": {
                "label": "Profondeur maximale",
                "description": "Profondeur maximale des arbres (par défaut 8)."
              },
              "min_samples_leaf": {
                "label": "Échantillons minimaux par feuille",
                "description": "Nombre minimal d'observations qu'une feuille peut contenir (par défaut 3)."
              },
              "grid_points": {
                "label": "Points de grille",
                "description": "Nombre de points par courbe de dépendance partielle (par défaut 12)."
              },
              "permutation_repeats": {
                "label": "Répétitions de permutation",
                "description": "Nombre de permutations distinctes moyennées par variable (par défaut 3). Davantage donne un résultat plus stable mais plus lent."
              }
            }
          },
          "excel_to_table": {
            "name": "Excel vers table",
            "description": "Lit une feuille d'un classeur .xlsx/.xls/.xlsb/.ods dans une table attributaire, en inférant les colonnes numériques et textuelles.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du classeur Excel/OpenDocument en entrée (.xlsx, .xls, .xlsb ou .ods)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin optionnel de la table de sortie (pilote déduit de son extension ; GeoParquet .parquet recommandé). Si omis, le résultat est stocké en mémoire."
              },
              "sheet": {
                "label": "Feuille",
                "description": "Feuille de calcul à lire, par nom ou par indice à partir de 0. Par défaut : la première feuille."
              },
              "cell_range": {
                "label": "Plage de cellules",
                "description": "Plage optionnelle en notation A1 à importer, par ex. 'B2:E40'. Par défaut : toute la plage utilisée de la feuille."
              },
              "field_names_row": {
                "label": "Ligne des noms de champs",
                "description": "Ligne de la plage sélectionnée contenant les noms de colonnes, indexée à partir de 1 (par défaut 1). Les lignes situées au-dessus sont ignorées ; 0 signifie qu'il n'y a pas de ligne d'en-tête (génération automatique de Field1, Field2, ...)."
              }
            }
          },
          "expand_shrink": {
            "name": "Dilater / éroder",
            "description": "Étend (dilate) ou contracte les classes sélectionnées d'un raster catégoriel d'un nombre de cellules, en laissant les autres classes intactes — le nettoyage standard d'une occupation du sol classifiée avant polygonisation, comme ArcGIS Expand / Shrink.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster catégoriel (à valeurs entières) en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie. Si omis, stocké en mémoire."
              },
              "classes": {
                "label": "Classes",
                "description": "Valeurs de classes séparées par des virgules à dilater ou à éroder."
              },
              "cells": {
                "label": "Cellules",
                "description": "Nombre de cellules de dilatation ou d'érosion (>= 1)."
              },
              "mode": {
                "label": "Mode",
                "description": "'expand' (dilate les classes sélectionnées ; par défaut) ou 'shrink' (les érode)."
              },
              "band": {
                "label": "Bande",
                "description": "Bande à lire, indexée à partir de 1 (par défaut 1)."
              }
            }
          },
          "exploratory_interpolation": {
            "name": "Interpolation exploratoire",
            "description": "Exécute plusieurs méthodes d'interpolation (IDW, plus proche voisin, surfaces de tendance de premier/second ordre), valide chacune par validation croisée « leave-one-out » et les classe par précision de prédiction (RMSE/MAE) ou biais (ME) — comme l'outil ArcGIS Exploratory Interpolation. Rapporte une table de comparaison classée par méthode et peut émettre le raster de prédiction de la meilleure méthode. Englobe une demande de validation croisée autonome.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points de mesures en entrée."
              },
              "field": {
                "label": "Champ",
                "description": "Champ numérique des points contenant la valeur à interpoler."
              },
              "output": {
                "label": "Sortie",
                "description": "Table de comparaison classée en sortie — un CSV (extension .csv) ou une table vectorielle sans géométrie. Si omis, le résultat est stocké en mémoire."
              },
              "methods": {
                "label": "Méthodes",
                "description": "Sous-ensemble de méthodes à comparer, séparées par des virgules ou des barres verticales : 'idw', 'nearest', 'trend1', 'trend2'. Par défaut : les quatre."
              },
              "criterion": {
                "label": "Critère",
                "description": "Critère de classement : 'rmse' (par défaut, erreur la plus faible), 'mae' (erreur absolue la plus faible) ou 'me' (biais le plus faible, plus petite |erreur moyenne|)."
              },
              "power": {
                "label": "Puissance",
                "description": "Exposant de décroissance avec la distance de l'IDW (par défaut 2)."
              },
              "output_raster": {
                "label": "Raster en sortie",
                "description": "GeoTIFF de sortie optionnel : la méthode la mieux classée, ajustée sur tous les échantillons et évaluée sur une grille couvrant l'emprise des échantillons."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule du raster gagnant en unités du SCR (degrés pour un SCR géographique). Par défaut : dimensionnée pour que le plus grand axe couvre environ 256 cellules."
              }
            }
          },
          "exploratory_regression": {
            "name": "Régression exploratoire",
            "description": "Énumère des modèles MCO sur toutes les combinaisons de champs explicatifs candidats et filtre chacun selon le R² ajusté, la significativité des coefficients, la multicolinéarité VIF, la normalité des résidus de Jarque-Bera et l'autocorrélation spatiale des résidus par le I de Moran, en rapportant chaque modèle plus l'ensemble classé des modèles retenus et un résumé de significativité par variable — comme l'outil ArcGIS Exploratory Regression.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche d'entités en entrée avec géométrie (utilisée pour le voisinage de l'I de Moran des résidus)."
              },
              "dependent_field": {
                "label": "Champ dépendant",
                "description": "Champ numérique dépendant (réponse)."
              },
              "explanatory_fields": {
                "label": "Champs explicatifs",
                "description": "Champs numériques explicatifs candidats séparés par des virgules parmi lesquels effectuer la recherche."
              },
              "min_vars": {
                "label": "Variables minimales",
                "description": "Nombre minimal de variables explicatives par modèle candidat (par défaut 1)."
              },
              "max_vars": {
                "label": "Variables maximales",
                "description": "Nombre maximal de variables explicatives par modèle candidat (par défaut : le minimum entre le nombre de candidates et 6)."
              },
              "max_coef_p": {
                "label": "P maximal des coefficients",
                "description": "Valeur p maximale autorisée pour chaque coefficient explicatif (par défaut 0.05)."
              },
              "min_adj_r2": {
                "label": "R² ajusté minimal",
                "description": "R² ajusté minimal (par défaut 0.5)."
              },
              "max_vif": {
                "label": "VIF maximal",
                "description": "Facteur d'inflation de la variance maximal autorisé par terme (par défaut 7.5)."
              },
              "min_jb_p": {
                "label": "P minimal de Jarque-Bera",
                "description": "Valeur p de Jarque-Bera minimale pour la normalité des résidus (par défaut 0.1)."
              },
              "min_moran_p": {
                "label": "P minimal de Moran",
                "description": "Valeur p minimale pour l'autocorrélation spatiale des résidus (I de Moran) ; au-delà, les résidus ne sont pas significativement agrégés (par défaut 0.1)."
              },
              "neighbors": {
                "label": "Voisins",
                "description": "Nombre de plus proches voisins définissant les pondérations spatiales du test de l'I de Moran sur les résidus (par défaut 8)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de la table de rapport en sortie — un CSV (extension .csv) ou une table vectorielle sans géométrie."
              }
            }
          },
          "extract_locations_from_text": {
            "name": "Extraire des localisations depuis du texte",
            "description": "Analyse un texte libre à la recherche de coordonnées intégrées — degrés décimaux (DD), degrés-minutes décimales (DDM), degrés-minutes-secondes (DMS) et références de grille MGRS/USNG — et émet un point WGS84 par occurrence, comme l'outil ArcGIS Extract Locations From Text (branche coordonnées). Pure analyse de motifs ; sans service de géocodage.",
            "params": {
              "input_text": {
                "label": "Texte d'entrée",
                "description": "Le texte libre à analyser. Soit le texte littéral, soit le chemin d'un fichier texte UTF-8 (lu lorsque la valeur correspond à un fichier existant)."
              },
              "notations": {
                "label": "Notations",
                "description": "Sous-ensemble de notations à rechercher, séparées par des virgules ou des espaces : DD, DDM, DMS, MGRS (USNG est un alias de MGRS). Par défaut : les quatre."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de sortie (pilote déduit de l'extension). Si omis, le résultat est stocké en mémoire."
              }
            }
          },
          "extract_ocean_winds": {
            "name": "Extraire les vents océaniques",
            "description": "Récupère la vitesse du vent océanique à 10 m en condition de neutralité équivalente à partir de la rétrodiffusion SAR calibrée en inversant la fonction de modèle géophysique CMOD5.N (ArcGIS Extract Ocean Winds). Toute la chaîne SAR livrée reste dans le domaine radiométrique et rien ne convertissait la rétrodiffusion en une grandeur géophysique, ce qui est aussi ce qui distingue une zone de vent faible d'une nappe d'hydrocarbures.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster de rétrodiffusion calibrée (sigma0)."
              },
              "units": {
                "label": "Unités",
                "description": "Unités de 'input' : 'dn', 'amplitude', 'intensity' ou 'db' (par défaut 'db')."
              },
              "incidence_angle": {
                "label": "Angle d'incidence",
                "description": "Angle d'incidence par cellule en degrés : un chemin de raster ou une constante numérique."
              },
              "wind_direction": {
                "label": "Direction du vent",
                "description": "Direction météorologique du vent en degrés (la direction D'OÙ souffle le vent), sous forme de chemin de raster ou de constante. Information a priori indispensable : CMOD compte deux inconnues et une seule observation."
              },
              "look_direction": {
                "label": "Direction de visée",
                "description": "Azimut de visée du radar en degrés, sous forme de chemin de raster ou de constante. Sert à convertir la direction du vent en l'angle relatif attendu par CMOD."
              },
              "polarization": {
                "label": "Polarisation",
                "description": "'vv' (par défaut, CMOD5.N natif) ou 'hh' (applique un rapport de polarisation approché)."
              },
              "polarization_ratio_alpha": {
                "label": "Alpha du rapport de polarisation",
                "description": "Alpha du rapport de polarisation HH vers VV (par défaut 0.6). Utilisé uniquement lorsque la polarisation est 'hh'."
              },
              "water_mask": {
                "label": "Masque d'eau",
                "description": "Couche de polygones ou raster optionnel restreignant la sortie à l'eau ; les retours sur la terre n'ont ici aucun sens."
              },
              "max_wind": {
                "label": "Vent maximal",
                "description": "Borne supérieure de l'intervalle d'inversion, en m/s (par défaut 50)."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster de vitesse du vent en sortie, en m/s. Si omis, le résultat est stocké en mémoire."
              }
            }
          },
          "extract_scanned_features": {
            "name": "Extraire les entités numérisées",
            "description": "Vectorise un raster binaire (numérisé/seuillé) en lignes propres (traçage du squelette) ou en polygones, avec suppression du bruit, remplissage des trous, fermeture des interruptions et simplification.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster binaire/classé en entrée à vectoriser."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel (pilote selon son extension). S'il est omis, stocké en mémoire."
              },
              "feature_type": {
                "label": "Type d'entité",
                "description": "'lines' (par défaut) : squelettise et trace les axes médians. 'polygons' : vectorise les régions pleines."
              },
              "foreground_value": {
                "label": "Valeur de premier plan",
                "description": "Valeur de cellule qui marque le premier plan. Si omise, les cellules >= 'threshold' (ou, à défaut, toute cellule valide non nulle) constituent le premier plan."
              },
              "threshold": {
                "label": "Seuil",
                "description": "Le premier plan correspond aux cellules dont la valeur est supérieure ou égale à celle-ci (utilisé lorsque 'foreground_value' n'est pas fourni)."
              },
              "noise_size": {
                "label": "Taille du bruit",
                "description": "Supprime les composantes de premier plan plus petites que ce nombre de cellules (par défaut 4)."
              },
              "hole_size": {
                "label": "Taille des trous",
                "description": "Comble les trous d'arrière-plan plus petits que ce nombre de cellules (par défaut 4)."
              },
              "gap_distance": {
                "label": "Distance d'écart",
                "description": "Pour les lignes : comble les interruptions jusqu'à cette distance (unités du SCR) entre des extrémités de lignes quasi colinéaires. Par défaut 0 (désactivé)."
              },
              "simplify_tolerance": {
                "label": "Tolérance de simplification",
                "description": "Tolérance de Douglas-Peucker (unités du SCR) pour la géométrie de sortie. Par défaut, environ 1 cellule."
              },
              "band": {
                "label": "Bande",
                "description": "Bande à lire, indexée à partir de 1 (par défaut 1)."
              }
            }
          },
          "extract_sinks": {
            "name": "Extraire les cuvettes",
            "description": "Extrait les dépressions (étendue maximale des cuvettes) d'un MNT (lidar filling.py).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster MNT en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin optionnel du raster de cuvettes. Si omis, le résultat est stocké en mémoire."
              },
              "min_size": {
                "label": "Taille minimale",
                "description": "Nombre minimal de pixels pour une cuvette (conservée si strictement supérieur ; par défaut 10)."
              },
              "region_output": {
                "label": "Région en sortie",
                "description": "Chemin de sortie optionnel du raster de régions étiquetées."
              },
              "depth_output": {
                "label": "Profondeur en sortie",
                "description": "Chemin de sortie optionnel du raster de profondeur de remplissage."
              },
              "filled_output": {
                "label": "Remplissage en sortie",
                "description": "Chemin de sortie optionnel du MNT à dépressions comblées."
              },
              "csv_output": {
                "label": "CSV en sortie",
                "description": "Chemin de sortie optionnel du CSV d'attributs par région."
              },
              "vector_output": {
                "label": "Vecteur en sortie",
                "description": "Chemin de sortie optionnel des polygones de régions au format GeoJSON (attributs joints)."
              },
              "flat_increment": {
                "label": "Incrément des zones plates",
                "description": "Incrément constant ajouté lors du remplissage pour garantir le drainage (par défaut 0)."
              }
            }
          },
          "extract_spectra_from_image": {
            "name": "Extraire les spectres de l'image",
            "description": "Dérive une bibliothèque spectrale à partir d'une image multibande et de régions d'entraînement, un spectre par classe, dans la disposition CSV que lit spectral_library_matching (ArcGIS Extract Spectra From Image). spectral_library_matching, spectral_angle_mapper et matched_filter_target_detection consomment tous une bibliothèque et rien n'en créait, de sorte que la suite spectrale ne pouvait être utilisée qu'avec des bibliothèques publiées préexistantes.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Image multibande."
              },
              "training_features": {
                "label": "Entités d'entraînement",
                "description": "Couche de polygones ou de points délimitant chaque classe ou cible."
              },
              "class_field": {
                "label": "Champ de classe",
                "description": "Attribut contenant l'étiquette de classe. Les entités partageant une étiquette sont regroupées en un seul spectre."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du CSV de bibliothèque spectrale en sortie ('name,b1,b2,...' par classe), prêt pour le paramètre 'library_csv' de spectral_library_matching."
              },
              "statistic": {
                "label": "Statistique",
                "description": "Réduction sur les cellules couvertes : 'mean' (par défaut), 'median', 'max', 'min'."
              },
              "trim_percent": {
                "label": "Pourcentage de troncature",
                "description": "Pourcentage écarté à chaque extrémité de la distribution par bande avant la réduction, afin de supprimer les pixels de bordure mixtes (par défaut 0, maximum 49)."
              },
              "min_cells": {
                "label": "Cellules minimales",
                "description": "Les classes couvrant moins de cellules que cette valeur sont signalées et ignorées plutôt que de produire un « spectre » d'un seul pixel (par défaut 1)."
              },
              "wavelengths": {
                "label": "Longueurs d'onde",
                "description": "Longueurs d'onde par bande optionnelles séparées par des virgules, consignées sous forme d'en-tête de commentaire dans la bibliothèque et dans output_stats."
              },
              "output_stats": {
                "label": "Statistiques en sortie",
                "description": "CSV optionnel recevant l'écart-type et le nombre de cellules par classe et par bande. Conservé à part afin que la bibliothèque reste analysable."
              }
            }
          },
          "extract_water_sar": {
            "name": "Extraire l'eau (SAR)",
            "description": "Délimite les eaux libres et l'étendue d'inondation à partir de la rétrodiffusion SAR avec un seuil d'Otsu par scène sur les décibels, plus des filtres optionnels de pente du MNT et de hauteur au-dessus du minimum qui rejettent l'ombre radar et les surfaces sèches sombres (ArcGIS Extract Water). Aucun registre ne peut le faire à partir du radar : les NDWI/MNDWI de spectral_index exigent des bandes de réflectance vert/PIR/SWIR qu'un SAR n'a pas, depth_to_water modélise où l'eau devrait être à partir du terrain plutôt que de l'observer, et un seuil raster_calculator réglé à la main ne se transfère pas entre scènes car la séparation eau/terre varie avec le vent et l'angle d'incidence.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster de rétrodiffusion SAR."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche de polygones d'eau en sortie. Si omis, le résultat est stocké en mémoire."
              },
              "output_raster": {
                "label": "Raster en sortie",
                "description": "Masque binaire d'eau en sortie (1 eau, 0 terre). Toujours produit ; stocké en mémoire si aucun chemin n'est fourni."
              },
              "dem": {
                "label": "MNT",
                "description": "MNT optionnel, co-enregistré avec l'entrée, activant les filtres de pente et de hauteur."
              },
              "threshold_db": {
                "label": "Seuil (dB)",
                "description": "Seuil fixe en dB ; les cellules situées à ce niveau ou en dessous sont de l'eau. Prévaut sur le seuil d'Otsu automatique."
              },
              "min_area": {
                "label": "Surface minimale",
                "description": "Écarte les plans d'eau dont la surface est inférieure à cette valeur, en unités carte au carré."
              },
              "max_slope": {
                "label": "Pente maximale",
                "description": "Avec un MNT, rejette l'eau sur un terrain dont la pente dépasse ce nombre de degrés (par défaut 5). L'eau stagnante ne peut pas occuper une forte pente, alors que l'ombre radar y est tout aussi sombre."
              },
              "max_height_above_min": {
                "label": "Hauteur maximale au-dessus du minimum",
                "description": "Avec un MNT, rejette les cellules candidates situées à plus de ce nombre d'unités Z au-dessus de la cellule de MNT la plus basse de leur propre région connexe."
              },
              "mask_features": {
                "label": "Entités de masque",
                "description": "Couche de polygones restreignant la zone d'analyse."
              },
              "mask_type": {
                "label": "Type de masque",
                "description": "'land_polygon' (par défaut ; analyse à l'extérieur des polygones) ou 'water_polygon' (analyse à l'intérieur)."
              },
              "histogram_bins": {
                "label": "Classes d'histogramme",
                "description": "Nombre de classes de l'histogramme d'Otsu (par défaut 256)."
              },
              "input_units": {
                "label": "Unités d'entrée",
                "description": "'intensity' (par défaut), 'dn', 'amplitude' ou 'db'."
              },
              "band": {
                "label": "Bande",
                "description": "Bande à seuiller, indexée à partir de 1 (par défaut 1)."
              }
            }
          },
          "extrude_between": {
            "name": "Extruder entre",
            "description": "Construit des solides fermés étanches couvrant l'espace entre deux surfaces à l'intérieur de chaque polygone d'entrée, avec des volumes exacts par entité (ArcGIS Extrude Between). cut_fill donne le changement de volume par cellule entre deux rasters mais émet un raster, ne peut pas être restreint à des emprises et ne porte aucun attribut ; buffer_3d et minimum_bounding_volume construisent des solides à partir d'entités plutôt que d'une paire de surfaces. La sortie alimente directement union_3d, intersect_3d, difference_3d et inside_3d.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Emprises polygonales définissant l'étendue latérale de chaque solide. Seul le PREMIER anneau de la première partie est utilisé : les trous intérieurs et les parties supplémentaires d'un MultiPolygone sont ignorés ; il faut donc scinder au préalable les emprises multiparties et combler les trous avant l'extrusion."
              },
              "surface_upper": {
                "label": "Surface supérieure",
                "description": "Raster de la surface limite supérieure."
              },
              "surface_lower": {
                "label": "Surface inférieure",
                "description": "Raster de la surface limite inférieure, co-enregistré avec la surface supérieure."
              },
              "output": {
                "label": "Sortie",
                "description": "Entités solides fermées (MultiPolygones en maillage triangulaire avec Z). Si omis, le résultat est stocké en mémoire."
              },
              "sample_distance": {
                "label": "Distance d'échantillonnage",
                "description": "Pas d'échantillonnage des emprises et de densification des limites en unités du SCR. Par défaut : la plus fine des tailles de cellule des surfaces."
              },
              "band": {
                "label": "Bande",
                "description": "Bande à lire dans chaque raster de surface, indexée à partir de 1 (par défaut 1)."
              }
            }
          },
          "feature_outline_masks": {
            "name": "Masques de contour d'entités",
            "description": "Génère des polygones de masque cartographique à une marge autour des entités (contour exact, enveloppe convexe ou rectangle englobant), éventuellement découpés selon une seconde couche (masques des couches intersectées).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée (toute géométrie), format détecté automatiquement (ou référence en mémoire)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel (pilote selon son extension). S'il est omis, stocké en mémoire."
              },
              "margin": {
                "label": "Marge",
                "description": "Distance de marge du masque. En mètres pour un SCR géographique (EPSG:4326 ou inconnu, convertie en degrés), sinon dans les unités du SCR de la couche. Doit être positive."
              },
              "mask_kind": {
                "label": "Type de masque",
                "description": "Forme du masque : 'exact' (par défaut, contour de l'entité avec zone tampon), 'convex_hull' (enveloppe convexe dilatée) ou 'box' (enveloppe englobante plus la marge)."
              },
              "masked_layer": {
                "label": "Couche masquée",
                "description": "Seconde couche de polygones optionnelle. Si elle est fournie, les masques sont découpés selon leur intersection avec elle (masques des couches sécantes) ; les masques sans recouvrement sont supprimés."
              },
              "id_field": {
                "label": "Champ d'identifiant",
                "description": "Champ source optionnel dont la valeur est recopiée sur chaque masque sous 'source_id'. Par défaut, l'indice de l'entité source."
              }
            }
          },
          "feature_to_line": {
            "name": "Entité vers ligne",
            "description": "Planarise des entités linéaires/de limites de polygones en segments de lignes nodés et non chevauchants, divisés à chaque intersection mutuelle et auto-intersection, comme l'outil ArcGIS Feature To Line — le préalable à la construction de topologie que polygons_to_lines et split_vector_lines intégrés ne fournissent pas.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de lignes ou de polygones en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de la couche vectorielle de lignes en sortie (pilote déduit de l'extension). Si omis, stocké en mémoire."
              },
              "cluster_tolerance": {
                "label": "Tolérance de regroupement",
                "description": "Accroche les points de découpe sur une grille de ce pas en unités carte afin de fusionner les nœuds quasi confondus (par défaut 1e-9)."
              },
              "attributes": {
                "label": "Attributs",
                "description": "Si vrai (par défaut), marque chaque segment de sortie avec 'src_fid', l'identifiant de l'entité source."
              }
            }
          },
          "feature_vertices_to_points": {
            "name": "Sommets d'entités vers points",
            "description": "Crée une couche de points à partir de sommets d'entités sélectionnés — ALL, START, END, BOTH_ENDS, MID (milieu en longueur d'arc) ou DANGLE (extrémités de lignes non partagées) — avec un champ de FID parent, comme l'outil ArcGIS Feature Vertices To Points.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de lignes, de polygones ou de points en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de points en sortie (pilote déduit de l'extension). Si omis, stocké en mémoire."
              },
              "point_location": {
                "label": "Emplacement du point",
                "description": "Sommets à extraire : ALL | START | END | BOTH_ENDS | MID | DANGLE. Par défaut ALL."
              }
            }
          },
          "features_to_gpx": {
            "name": "Entités vers GPX",
            "description": "Écrit les entités ponctuelles en points de cheminement GPX et les entités linéaires en traces GPX, en associant les champs attributaires au nom/à la description/à l'élévation/au temps.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points ou de lignes à exporter (supposée en WGS84 / EPSG:4326)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier .gpx en sortie."
              },
              "name_field": {
                "label": "Champ de nom",
                "description": "Champ attributaire associé à l'élément GPX <name> (optionnel)."
              },
              "description_field": {
                "label": "Champ de description",
                "description": "Champ attributaire associé à l'élément GPX <desc> (optionnel)."
              },
              "z_field": {
                "label": "Champ Z",
                "description": "Champ attributaire associé à l'altitude GPX <ele> (optionnel ; à défaut, le Z de la géométrie est utilisé s'il existe)."
              },
              "date_field": {
                "label": "Champ de date",
                "description": "Champ attributaire associé à l'horodatage GPX <time>, une chaîne ISO-8601 (optionnel)."
              }
            }
          },
          "features_to_gtfs": {
            "name": "Entités vers GTFS",
            "description": "Exporte les entités ponctuelles vers stops.txt GTFS et les entités linéaires vers shapes.txt GTFS, bouclant l'aller-retour GTFS.",
            "params": {
              "stops_input": {
                "label": "Arrêts en entrée",
                "description": "Couche vectorielle de points à écrire dans stops.txt (utilise les champs attributaires stop_id/stop_name s'ils sont présents)."
              },
              "shapes_input": {
                "label": "Tracés en entrée",
                "description": "Couche vectorielle de lignes à écrire dans shapes.txt (utilise un champ attributaire shape_id s'il est présent)."
              },
              "output_dir": {
                "label": "Répertoire de sortie",
                "description": "Répertoire dans lequel les fichiers texte GTFS (stops.txt / shapes.txt) sont écrits. Créé s'il n'existe pas."
              }
            }
          },
          "features_to_kml": {
            "name": "Entités vers KML",
            "description": "Écrit une couche vectorielle dans un document KML 2.2 (ou un KMZ compressé), avec les attributs en ExtendedData et un style partagé optionnel (ArcGIS Layer To KML / Map To KML). kml_to_features pouvait déjà lire le KML mais rien ne l'écrivait, contrairement aux paires symétriques GPX, GTFS et GeoParquet.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée. Doit être en lon/lat EPSG:4326, le seul SCR défini par KML."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier .kml ou .kmz en sortie."
              },
              "name_field": {
                "label": "Champ de nom",
                "description": "Attribut utilisé pour l'élément <name> de chaque Placemark."
              },
              "description_field": {
                "label": "Champ de description",
                "description": "Attribut utilisé pour <description>. Si omis, tous les attributs sont écrits sous forme d'<ExtendedData>."
              },
              "z_field": {
                "label": "Champ Z",
                "description": "Attribut fournissant une altitude, écrite comme troisième coordonnée."
              },
              "altitude_mode": {
                "label": "Mode d'altitude",
                "description": "'clampToGround' (par défaut), 'relativeToGround' ou 'absolute'."
              },
              "color": {
                "label": "Couleur",
                "description": "Couleur des lignes et des contours en hexadécimal KML aabbggrr (par ex. 'ff0000ff' pour un rouge opaque)."
              },
              "line_width": {
                "label": "Largeur de ligne",
                "description": "Largeur de ligne en pixels (par défaut 1.0)."
              },
              "fill_color": {
                "label": "Couleur de remplissage",
                "description": "Couleur de remplissage des polygones en hexadécimal KML aabbggrr. Omettre pour ne pas remplir."
              }
            }
          },
          "fence_diagram": {
            "name": "Diagramme en clôture",
            "description": "Génère des panneaux de coupes verticales 3D là où une ligne de tracé traverse une pile de surfaces — la façon standard de visualiser la stratigraphie du sous-sol ou la stratification atmosphérique (ArcGIS Fence Diagram). profile, long_profile et stack_profile échantillonnent des surfaces le long d'une ligne mais renvoient des lignes de profil 2D ou des tables, sans géométrie pour l'espace ENTRE surfaces consécutives, et voxel_isosurface extrait une surface de niveau d'un volume plutôt qu'une coupe.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Entités linéaires définissant le tracé de la coupe."
              },
              "surfaces": {
                "label": "Surfaces",
                "description": "Liste séparée par des virgules de rasters de surface co-enregistrés, ordonnés du HAUT vers le BAS."
              },
              "output": {
                "label": "Sortie",
                "description": "Panneaux de coupe 3D, un par tracé et par paire de surfaces. Si omis, le résultat est stocké en mémoire."
              },
              "sample_distance": {
                "label": "Distance d'échantillonnage",
                "description": "Pas d'échantillonnage le long du tracé en unités du SCR. Par défaut : la plus fine des tailles de cellule des surfaces."
              },
              "floor_height": {
                "label": "Hauteur de plancher",
                "description": "Borne inférieure constante optionnelle : une surface de fond synthétique à cette altitude, fermant le panneau le plus profond."
              },
              "ceiling_height": {
                "label": "Hauteur de plafond",
                "description": "Borne supérieure constante optionnelle : une surface de toit synthétique à cette altitude."
              },
              "band": {
                "label": "Bande",
                "description": "Bande à lire dans chaque raster de surface, indexée à partir de 1 (par défaut 1)."
              }
            }
          },
          "fill_missing_values": {
            "name": "Combler les valeurs manquantes",
            "description": "Estime et remplit les valeurs nulles d'un champ attributaire numérique à l'aide des voisins spatiaux (k plus proches ou bande de distance), éventuellement restreints à une fenêtre temporelle, avec un estimateur sélectionnable (mean/median/min/max/temporal_trend). Les lignes imputées sont marquées par un champ d'indicateur (ArcGIS Fill Missing Values).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée contenant le champ à compléter."
              },
              "fill_field": {
                "label": "Champ de remplissage",
                "description": "Champ numérique dont les valeurs nulles doivent être estimées et complétées."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de sortie (pilote déduit de l'extension). Si omis, le résultat est stocké en mémoire."
              },
              "estimator": {
                "label": "Estimateur",
                "description": "Mode de combinaison des valeurs voisines : 'mean' (par défaut), 'median', 'min', 'max' ou 'temporal_trend' (moindres carrés dans le temps ; nécessite time_field)."
              },
              "neighbourhood": {
                "label": "Voisinage",
                "description": "Sélection spatiale : 'knn' (par défaut, les k plus proches) ou 'distance_band' (toutes celles situées dans search_radius)."
              },
              "k": {
                "label": "K",
                "description": "Nombre de plus proches voisins pour 'knn' (par défaut 8)."
              },
              "search_radius": {
                "label": "Rayon de recherche",
                "description": "Rayon (unités du SCR) pour la sélection 'distance_band'."
              },
              "time_field": {
                "label": "Champ de temps",
                "description": "Champ numérique optionnel donnant l'instant ou l'ordre de chaque entité (requis pour 'temporal_trend')."
              },
              "time_window": {
                "label": "Fenêtre temporelle",
                "description": "Optionnel : restreint les voisins à ceux situés à moins de cet écart temporel de la cible (nécessite time_field)."
              },
              "flag_field": {
                "label": "Champ d'indicateur",
                "description": "Nom du champ booléen signalant les lignes imputées (par défaut 'imputed')."
              }
            }
          },
          "fill_spill_merge": {
            "name": "Fill-Spill-Merge",
            "description": "Achemine un volume fini d'eau de surface sur un MNT pour produire des étendues réalistes de lacs/d'inondation (remplissage partiel des dépressions avec débordement et fusion), en réimplémentant le Fill-Spill-Merge de RichDEM.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée (altitudes)."
              },
              "water_level": {
                "label": "Niveau d'eau",
                "description": "Hauteur d'eau de surface uniforme appliquée à chaque cellule. Fournir ce paramètre ou 'surface_water'."
              },
              "surface_water": {
                "label": "Eaux de surface",
                "description": "Raster de hauteur d'eau de surface par cellule (aligné sur le MNT). Prévaut sur 'water_level' lorsque les deux sont fournis."
              },
              "ocean_level": {
                "label": "Niveau de l'océan",
                "description": "Niveau de la mer optionnel : les cellules situées à cette altitude ou en dessous et connectées au bord de la grille deviennent de l'océan (référence de submersion côtière)."
              },
              "edge_outlet": {
                "label": "Exutoire de bordure",
                "description": "Traite chaque cellule de bordure de la grille comme un exutoire libre (par défaut vrai). L'eau qui atteint la bordure quitte le MNT."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin optionnel du raster de hauteur d'eau stagnante. Si omis, le résultat est stocké en mémoire."
              },
              "water_surface": {
                "label": "Surface de l'eau",
                "description": "Chemin de sortie optionnel de la surface hydraulique (MNT plus hauteur d'eau)."
              },
              "flood_extent": {
                "label": "Étendue d'inondation",
                "description": "Chemin de sortie optionnel d'un masque d'emprise d'inondation (1 en présence d'eau stagnante, 0 sinon)."
              }
            }
          },
          "find_argument_statistics": {
            "name": "Trouver les statistiques d'argument",
            "description": "Statistiques d'argument par pixel sur une pile de rasters (comme ArcGIS Find Argument Statistics) : l'indice de tranche (ou la date) du max/min, la position de la médiane, le nombre de tranches dépassant un seuil (durée) ou la plus longue série consécutive — les réponses de position d'argument que les agrégats de valeurs de cell_statistics et image_stack_profile intégrés ne peuvent pas donner.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Un raster multibande (chaque bande est une tranche) ou une liste de rasters co-enregistrés séparés par des virgules, dans l'ordre chronologique."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster monobande de sortie des indices de tranche, des dates ou des effectifs. Si omis, le résultat est stocké en mémoire."
              },
              "statistic": {
                "label": "Statistique",
                "description": "'argmax' (par défaut), 'argmin', 'median_position', 'duration' ou 'longest_run'."
              },
              "threshold": {
                "label": "Seuil",
                "description": "Seuil numérique pour 'duration'/'longest_run' (requis pour ces méthodes)."
              },
              "comparison": {
                "label": "Comparaison",
                "description": "Comparaison pour 'duration'/'longest_run' : '>' (par défaut), '>=', '<' ou '<='."
              },
              "dates": {
                "label": "Dates",
                "description": "Dates numériques optionnelles séparées par des virgules (par ex. le jour de l'année) pour chaque tranche ; argmax/argmin/median produisent alors la date correspondante au lieu de l'indice de tranche."
              },
              "min_valid": {
                "label": "Valides minimaux",
                "description": "Nombre minimal d'observations non NoData par pixel (par défaut 1)."
              }
            }
          },
          "find_dwell_locations": {
            "name": "Trouver les lieux de séjour",
            "description": "Détecte où une entité mobile est restée immobile : séries de positions de trace dans une tolérance de distance pendant au moins une tolérance de temps, émises sous forme de positions, de centres moyens ou d'enveloppes convexes, comme l'outil ArcGIS Find Dwell Locations.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Entités ponctuelles horodatées (points de trajectoire)."
              },
              "track_field": {
                "label": "Champ de trace",
                "description": "Champ identifiant la trajectoire à laquelle appartient chaque point."
              },
              "time_field": {
                "label": "Champ de temps",
                "description": "Champ d'horodatage (secondes numériques ou texte ISO-8601)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. Si omis, le résultat est stocké en mémoire."
              },
              "distance_tolerance": {
                "label": "Tolérance de distance",
                "description": "Distance maximale (unités carte) à laquelle un point peut se trouver du centroïde courant de la halte."
              },
              "time_tolerance": {
                "label": "Tolérance de temps",
                "description": "Durée minimale (dans les mêmes unités que time_field) pour qu'une phase stationnaire compte comme une halte."
              },
              "output_type": {
                "label": "Type de sortie",
                "description": "dwell_features (par défaut) | mean_centers | convex_hulls | all_features."
              }
            }
          },
          "find_identical": {
            "name": "Trouver les identiques",
            "description": "Trouve les entités identiques en géométrie et/ou sur des champs choisis, en regroupant les doublons ; « report » ajoute des colonnes dup_group/dup_seq, « delete » ne conserve que le premier de chaque groupe, comme ArcGIS Find Identical / Delete Identical.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée à dédoublonner."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de sortie (pilote déduit de l'extension). Si omis, le résultat est stocké en mémoire."
              },
              "fields": {
                "label": "Champs",
                "description": "Champs séparés par des virgules à comparer. Omettre pour ne comparer que la géométrie ; à combiner avec 'compare_geometry'."
              },
              "compare_geometry": {
                "label": "Comparer la géométrie",
                "description": "Indique si la géométrie fait partie du test d'identité (par défaut vrai ; mettre faux pour ne comparer que les champs)."
              },
              "xy_tolerance": {
                "label": "Tolérance XY",
                "description": "Tolérance d'accrochage pour la comparaison des géométries (les sommets sont arrondis sur une grille de ce pas avant hachage). Par défaut 0 (comparaison exacte)."
              },
              "mode": {
                "label": "Mode",
                "description": "'report' (par défaut ; ajoute dup_group/dup_seq) ou 'delete' (conserve la première entité de chaque groupe)."
              }
            }
          },
          "find_meeting_locations": {
            "name": "Trouver les lieux de rencontre",
            "description": "Détecte les rassemblements où plusieurs traces distinctes sont ensemble à moins d'une distance pendant au moins une durée minimale (comme ArcGIS Find Meeting Locations) — la co-occurrence à N traces que trace_proximity_events (par paires) et reconstruct_tracks (stationnement d'une seule trace) ne couvrent pas. Émet des enveloppes de zone et des points représentatifs avec le nombre de participants, les heures de début/fin et la durée.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de points de trajectoire horodatés (SCR projeté ; distances en unités carte)."
              },
              "track_field": {
                "label": "Champ de trace",
                "description": "Champ identifiant chaque trajectoire ou entité."
              },
              "time_field": {
                "label": "Champ de temps",
                "description": "Champ contenant l'heure de chaque point : secondes numériques ou horodatage ISO-8601."
              },
              "search_distance": {
                "label": "Distance de recherche",
                "description": "Distance maximale (unités carte) pour que des trajectoires soient considérées comme réunies."
              },
              "min_meeting_duration": {
                "label": "Durée minimale de rencontre",
                "description": "Durée minimale (en unités de temps) pendant laquelle un rassemblement doit se maintenir pour être signalé."
              },
              "max_meeting_duration": {
                "label": "Durée maximale de rencontre",
                "description": "Durée maximale optionnelle ; les rassemblements plus longs sont écartés."
              },
              "min_participants": {
                "label": "Participants minimaux",
                "description": "Nombre minimal de trajectoires distinctes dans un rassemblement (par défaut 2)."
              },
              "time_step": {
                "label": "Pas de temps",
                "description": "Largeur d'une tranche temporelle (en unités de temps). Par défaut : min_meeting_duration."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche de points représentatifs en sortie (un point par rencontre). Si omis, le résultat est stocké en mémoire."
              },
              "output_area": {
                "label": "Surface en sortie",
                "description": "Couche de zones en sortie optionnelle (un polygone d'enveloppe convexe par rencontre). Si omis, le résultat est stocké en mémoire."
              }
            }
          },
          "find_space_time_matches": {
            "name": "Trouver les correspondances spatio-temporelles",
            "description": "Apparie les entités de deux couches de points horodatées qui se trouvent à moins d'une distance de recherche spatiale ET dans une fenêtre temporelle l'une de l'autre (avant/après/indifférent), en émettant des paires appariées avec la distance et le décalage temporel, comme l'outil ArcGIS Find Space Time Matches.",
            "params": {
              "primary": {
                "label": "Primaire",
                "description": "Couche de points principale (chaque entité est appariée à la couche secondaire)."
              },
              "secondary": {
                "label": "Secondaire",
                "description": "Couche de points secondaire servant à l'appariement."
              },
              "time_field": {
                "label": "Champ de temps",
                "description": "Champ d'horodatage présent dans LES DEUX couches (numérique ou ISO-8601)."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche d'appariements en sortie (une ligne de liaison par paire appariée). Si omis, le résultat est stocké en mémoire."
              },
              "search_distance": {
                "label": "Distance de recherche",
                "description": "Distance spatiale maximale entre une entité principale et une entité secondaire (unités carte)."
              },
              "time_window": {
                "label": "Fenêtre temporelle",
                "description": "Écart temporel maximal : un nombre de secondes ou une durée comme '2h', '30m', '7d'."
              },
              "temporal_relationship": {
                "label": "Relation temporelle",
                "description": "'either' (par défaut), 'before' (secondaire avant principale) ou 'after' (secondaire après principale)."
              },
              "primary_id_field": {
                "label": "Champ d'identifiant primaire",
                "description": "Champ nommant chaque entité principale dans la sortie (par défaut : l'indice de l'entité)."
              },
              "secondary_id_field": {
                "label": "Champ d'identifiant secondaire",
                "description": "Champ nommant chaque entité secondaire dans la sortie (par défaut : l'indice de l'entité)."
              }
            }
          },
          "fit_variogram": {
            "name": "Ajuster un modèle de variogramme",
            "description": "Ajuste un modèle de variogramme théorique (sphérique, exponentiel, gaussien) aux données d'un semi-variogramme empirique pour utilisation en krigeage.",
            "params": {
              "lags_json": {
                "label": "JSON des décalages",
                "description": "Tableau JSON des classes de décalage issues de estimate_variogram"
              },
              "model_family": {
                "label": "Famille de modèle",
                "description": "Modèle : spherical, exponential ou gaussian"
              }
            }
          },
          "flatten_interferogram": {
            "name": "Aplanir l'interférogramme",
            "description": "Supprime la composante de phase topographique d'un interférogramme enroulé à l'aide d'un MNT et de la ligne de base interférométrique, ne laissant que le signal de déformation et d'atmosphère (le mode d'aplatissement TOPO de l'outil ArcGIS Generate Interferogram). sar_coherence émet déjà l'interférogramme lui-même via output_phase, mais rien dans les deux registres ne peut simuler et soustraire la phase topographique — et sur tout relief cette composante domine, de sorte qu'un interférogramme non aplati est inutilisable pour l'étude des déformations.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster de phase interférométrique enroulée en radians (tel que produit par output_phase de sar_coherence), ou interférogramme I/Q à deux bandes."
              },
              "dem": {
                "label": "MNT",
                "description": "Raster d'altitude co-enregistré."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster de phase enroulée aplanie, ré-enroulée dans (-pi, pi]. Si omis, le résultat est stocké en mémoire."
              },
              "perpendicular_baseline": {
                "label": "Ligne de base perpendiculaire",
                "description": "Base perpendiculaire B_perp en mètres. Requise : elle fixe la sensibilité hauteur-phase et aucune valeur par défaut ne serait défendable."
              },
              "wavelength": {
                "label": "Longueur d'onde",
                "description": "Longueur d'onde radar en mètres (par défaut 0.05546576, bande C de Sentinel-1)."
              },
              "incidence_angle": {
                "label": "Angle d'incidence",
                "description": "Angle d'incidence en degrés : une constante (par défaut 39.0, valeur typique au milieu de fauchée Sentinel-1 IW) ou le chemin d'un raster co-enregistré."
              },
              "slant_range": {
                "label": "Distance oblique",
                "description": "Distance oblique capteur-sol R en mètres (par défaut 800000)."
              },
              "reference_elevation": {
                "label": "Élévation de référence",
                "description": "Altitude considérée comme correspondant à une phase topographique nulle. Par défaut : la moyenne du MNT, afin que la sortie ne comporte aucun décalage global arbitraire."
              },
              "out_topographic_phase": {
                "label": "Phase topographique en sortie",
                "description": "Raster de phase topographique simulée, ENROULÉE dans (-pi, pi] comme la sortie aplanie — et non la phase simulée absolue. Toujours produit ; à défaut de chemin, une référence en mémoire est utilisée."
              },
              "band": {
                "label": "Bande",
                "description": "Bande contenant la phase, indexée à partir de 1. À omettre pour un raster de phase monobande ou un interférogramme I/Q à deux bandes (alors détecté automatiquement) ; à fournir pour lire la phase réelle dans une bande précise d'une pile multibande. Un raster de plus de deux bandes EXIGE ce paramètre, car trois bandes ou plus ne constituent pas une paire I/Q et une supposition renverrait une phase plausible mais fausse."
              }
            }
          },
          "flip_line": {
            "name": "Inverser la ligne",
            "description": "Inverse l'ordre des sommets (début↔fin) des entités polylignes pour retourner leur sens de numérisation.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier vectoriel de lignes en entrée, format détecté automatiquement (ou référence en mémoire)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel (pilote selon son extension). S'il est omis, stocké en mémoire."
              }
            }
          },
          "focal_flow": {
            "name": "Écoulement focal",
            "description": "Encode sous forme de masque 8 bits lesquels des huit voisins d'une cellule s'écoulent vers elle (ArcGIS Focal Flow). Contrairement aux outils d'accumulation D8/D-infini intégrés, qui acheminent chaque cellule vers l'aval selon une seule direction, il enregistre chaque voisin entrant — capturant la convergence vers les cuvettes, les dépressions et les cols. Les poids des bits tournent dans le sens antihoraire depuis l'est (1, 2, 4, 8, 16, 32, 64, 128) ; 0 est un sommet local, 255 une cuvette.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster de surface en entrée (altitude ou toute surface continue)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              },
              "threshold": {
                "label": "Seuil",
                "description": "Une cellule voisine n'est comptée comme afférente que si elle dépasse la cellule centrale de plus que cette valeur (par défaut 0)."
              },
              "band": {
                "label": "Bande",
                "description": "Bande à lire, indexée à partir de 1 (par défaut 1)."
              }
            }
          },
          "focal_statistics": {
            "name": "Statistiques focales",
            "description": "Statistiques de voisinage par fenêtre glissante (rectangle/cercle/anneau/secteur ; numériques et catégorielles).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              },
              "statistics": {
                "label": "Statistiques",
                "description": "Statistique : mean, majority, maximum, median, minimum, minority, percentile, range, std, sum ou variety (par défaut mean)."
              },
              "neighborhood": {
                "label": "Voisinage",
                "description": "Forme du voisinage : rectangle, circle, annulus ou wedge (par défaut rectangle)."
              },
              "width": {
                "label": "Largeur",
                "description": "Largeur du rectangle en cellules (par défaut 3)."
              },
              "height": {
                "label": "Hauteur",
                "description": "Hauteur du rectangle en cellules (par défaut 3)."
              },
              "radius": {
                "label": "Rayon",
                "description": "Rayon en cellules pour circle et wedge, et rayon extérieur pour annulus (par défaut 1)."
              },
              "inner_radius": {
                "label": "Rayon intérieur",
                "description": "Rayon intérieur en cellules pour le voisinage annulus (par défaut 0)."
              },
              "start_angle": {
                "label": "Angle de début",
                "description": "Angle de départ du secteur en degrés (0 = est, sens antihoraire ; par défaut 0)."
              },
              "end_angle": {
                "label": "Angle de fin",
                "description": "Angle de fin du secteur en degrés (0 = est, sens antihoraire ; par défaut 90)."
              },
              "percentile_value": {
                "label": "Valeur de percentile",
                "description": "Percentile dans [0, 100] pour la statistique percentile (par défaut 90)."
              },
              "ignore_nodata": {
                "label": "Ignorer NoData",
                "description": "Si vrai (par défaut), la réduction ne porte que sur les cellules valides ; si faux, toute cellule NoData dans la fenêtre produit un NoData."
              },
              "band": {
                "label": "Bande",
                "description": "Bande à traiter, indexée à partir de 1 (par défaut 1)."
              }
            }
          },
          "forest_based_forecast": {
            "name": "Prévision par forêts",
            "description": "Prévoit une valeur en avant à chaque emplacement avec une forêt aléatoire entraînée sur des fenêtres glissantes de décalages de l'historique propre à cet emplacement, comme l'outil ArcGIS Forest-based Forecast.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Entités horodatées portant un identifiant de lieu, un champ temporel et un champ de valeur."
              },
              "location_field": {
                "label": "Champ d'emplacement",
                "description": "Champ identifiant le lieu auquel appartient chaque observation."
              },
              "time_field": {
                "label": "Champ de temps",
                "description": "Champ temporel numérique utilisé pour ordonner la série de chaque lieu."
              },
              "value_field": {
                "label": "Champ de valeur",
                "description": "Champ numérique à prévoir."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel de la table de prévisions. Si omis, le résultat est stocké en mémoire."
              },
              "forecast_steps": {
                "label": "Pas de prévision",
                "description": "Nombre de pas à prévoir vers l'avant (par défaut 3)."
              },
              "time_window": {
                "label": "Fenêtre temporelle",
                "description": "Nombre de valeurs antérieures utilisées comme prédicteurs (par défaut : le quart de la longueur de la série, au minimum 2)."
              },
              "validation_steps": {
                "label": "Pas de validation",
                "description": "Nombre de pas finaux réservés pour évaluer le RMSE (par défaut 0, aucune validation)."
              },
              "n_trees": {
                "label": "Nombre d'arbres",
                "description": "Nombre d'arbres de la forêt (par défaut 50, maximum 500)."
              },
              "min_leaf_size": {
                "label": "Taille minimale de feuille",
                "description": "Nombre minimal de lignes d'entraînement dans une feuille (par défaut 2)."
              },
              "max_depth": {
                "label": "Profondeur maximale",
                "description": "Profondeur maximale des arbres (par défaut 8)."
              },
              "seed": {
                "label": "Graine",
                "description": "Graine du générateur aléatoire déterministe pilotant le bootstrap et le tirage de sous-ensembles de variables (par défaut 42)."
              }
            }
          },
          "frequency_comparison": {
            "name": "Comparaison de fréquences",
            "description": "Compte, par cellule, combien de rasters d'une pile sont égaux / supérieurs / inférieurs à la cellule correspondante d'un raster de valeurs de référence (ArcGIS Equal To Frequency, Greater Than Frequency et Less Than Frequency, plus les opérateurs inclusifs et négatifs). Aucun registre ne peut agréger une comparaison à travers une pile : cell_statistics n'a pas d'entrée de référence, raster_calculator exprime une comparaison mais ne peut pas compter à travers une pile de longueur arbitraire, et conditional_evaluation est un sélecteur à condition unique.",
            "params": {
              "value_raster": {
                "label": "Raster de valeurs",
                "description": "Raster de référence auquel chaque couche de la pile est comparée, co-enregistré avec les entrées. Une référence monobande est diffusée à tous les groupes de bandes ; une référence multibande doit comporter une bande par groupe et progresse avec lui."
              },
              "inputs": {
                "label": "Entrées",
                "description": "Un raster multibande (chaque bande est une couche) ou une liste de rasters co-enregistrés séparés par des virgules."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster de comptage en sortie (0..n). Si omis, le résultat est stocké en mémoire."
              },
              "comparison": {
                "label": "Comparaison",
                "description": "'equal' (par défaut), 'greater', 'less', 'greater_equal', 'less_equal' ou 'not_equal'."
              },
              "tolerance": {
                "label": "Tolérance",
                "description": "Tolérance absolue pour 'equal'/'not_equal' sur des données à virgule flottante (par défaut 0 = comparaison exacte)."
              },
              "ignore_nodata": {
                "label": "Ignorer NoData",
                "description": "Ignore les observations NoData pour chaque cellule (vrai par défaut). Si faux, toute observation NoData rend la cellule NoData."
              },
              "process_as_multiband": {
                "label": "Traiter en multibande",
                "description": "'single_band' (par défaut) : chaque bande de chaque entrée constitue une couche d'une pile unique. 'multi_band' : la bande i de chaque entrée forme sa propre pile, ce qui donne un résultat multibande."
              }
            }
          },
          "fuzzy_overlay": {
            "name": "Superposition floue",
            "description": "Remet à l'échelle un raster en une surface d'appartenance floue de 0 à 1 (linear/gaussian/small/large/ms_small/ms_large), ou combine plusieurs rasters d'appartenance par des opérateurs flous AND/OR/PRODUCT/SUM/GAMMA, comme ArcGIS Fuzzy Membership + Fuzzy Overlay.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Mode appartenance : raster d'entrée à transformer en une surface comprise entre 0 et 1."
              },
              "inputs": {
                "label": "Entrées",
                "description": "Mode superposition : liste séparée par des virgules d'au moins 2 rasters d'appartenance à combiner. Prévaut sur 'input'."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie. Si omis, le résultat est stocké en mémoire."
              },
              "function": {
                "label": "Fonction",
                "description": "Fonction d'appartenance : 'linear' (par défaut), 'gaussian', 'small', 'large', 'ms_small', 'ms_large'."
              },
              "overlay": {
                "label": "Superposition",
                "description": "Opérateur de superposition : 'and' (minimum, par défaut), 'or' (maximum), 'product', 'sum', 'gamma'."
              },
              "midpoint": {
                "label": "Point médian",
                "description": "linear : la valeur correspondant à 0.5 est ignorée (utiliser min/max) ; gaussian/small/large : le point milieu de la fonction ; ms_small/ms_large : le multiplicateur de la moyenne (par défaut issu des statistiques de bande)."
              },
              "spread": {
                "label": "Étalement",
                "description": "gaussian/small/large : l'étalement (par défaut 0.1 pour gaussian, 5 pour small/large) ; ms_small/ms_large : le multiplicateur de l'écart-type (par défaut 1)."
              },
              "min": {
                "label": "Minimum",
                "description": "linear : la valeur correspondant à une appartenance de 0 (par défaut le minimum de la bande). Si min>max, la rampe est décroissante."
              },
              "max": {
                "label": "Maximum",
                "description": "linear : la valeur correspondant à une appartenance de 1 (par défaut le maximum de la bande)."
              },
              "gamma": {
                "label": "Gamma",
                "description": "Exposant de la superposition gamma dans [0,1] (par défaut 0.9)."
              },
              "band": {
                "label": "Bande",
                "description": "Bande à transformer en mode appartenance, indexée à partir de 1 (par défaut 1)."
              }
            }
          },
          "gaussian_geostatistical_simulations": {
            "name": "Simulations géostatistiques gaussiennes",
            "description": "Simulation gaussienne séquentielle : N réalisations conditionnelles équiprobables d'un champ qui respectent les données d'échantillonnage (comme ArcGIS Gaussian Geostatistical Simulations) — la sortie conditionnelle multi-réalisations que empirical_bayesian_kriging / le krigeage ordinaire (surface unique) et turning_bands_simulation (non conditionnel) ne fournissent pas. Avec graine et déterministe.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de points en entrée avec les valeurs de conditionnement (SCR projeté)."
              },
              "value_field": {
                "label": "Champ de valeur",
                "description": "Champ numérique contenant la valeur à simuler."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster multibande de sortie (une bande par réalisation). Si omis, le résultat est stocké en mémoire."
              },
              "num_realizations": {
                "label": "Nombre de réalisations",
                "description": "Nombre de réalisations, c'est-à-dire de bandes de sortie (par défaut 10)."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule de sortie en unités du SCR. Par défaut : le plus grand côté de l'emprise divisé par 100."
              },
              "variogram_model": {
                "label": "Modèle de variogramme",
                "description": "'exponential' (par défaut), 'spherical' ou 'gaussian'."
              },
              "nugget": {
                "label": "Pépite",
                "description": "Pépite manuelle ; omettre pour l'ajuster à partir des données."
              },
              "sill": {
                "label": "Palier",
                "description": "Palier partiel manuel ; omettre pour l'ajuster à partir des données."
              },
              "range": {
                "label": "Plage",
                "description": "Portée manuelle ; omettre pour l'ajuster à partir des données."
              },
              "max_neighbors": {
                "label": "Voisins maximaux",
                "description": "Nombre maximal de points connus utilisés pour le krigeage de chaque cellule (par défaut 16)."
              },
              "seed": {
                "label": "Graine",
                "description": "Germe du générateur aléatoire déterministe (par défaut 1)."
              },
              "output_mean": {
                "label": "Moyenne en sortie",
                "description": "Chemin raster optionnel de la moyenne d'ensemble."
              },
              "output_std": {
                "label": "Écart-type en sortie",
                "description": "Chemin raster optionnel de l'écart-type d'ensemble."
              }
            }
          },
          "generalized_linear_regression": {
            "name": "Régression linéaire généralisée",
            "description": "Régression globale (gaussienne/MCO, Poisson ou logistique) d'un champ dépendant sur des champs explicatifs par IRLS, avec des champs de sortie ajustés + résidus et des diagnostics complets : coefficient, erreur standard, t/z, probabilité et VIF par terme, plus AICc, R²/déviance et le test d'hétéroscédasticité studentisé de Koenker (Breusch–Pagan) — comme l'outil ArcGIS Generalized Linear Regression.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche d'entités en entrée (points ou autres géométries — la géométrie est transmise inchangée)."
              },
              "dependent_field": {
                "label": "Champ dépendant",
                "description": "Champ numérique dépendant (réponse). Pour 'logistic', il doit valoir 0 ou 1."
              },
              "explanatory_fields": {
                "label": "Champs explicatifs",
                "description": "Champ(s) numérique(s) explicatif(s) séparés par des virgules."
              },
              "family": {
                "label": "Famille",
                "description": "Famille du modèle : 'gaussian' (MCO, par défaut), 'poisson' (lien log, effectifs) ou 'logistic' (lien logit, 0/1)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel (pilote selon son extension). S'il est omis, stocké en mémoire."
              },
              "report": {
                "label": "Rapport",
                "description": "Chemin CSV optionnel du rapport de diagnostics des coefficients et du modèle."
              }
            }
          },
          "generate_breach_lines": {
            "name": "Générer des lignes de brèche",
            "description": "Étant donné des polygones de dépressions et un MNT, émet la polyligne le long de laquelle chaque dépression serait percée pour se drainer, selon un critère de coût de percement minimal, de plus court chemin ou de changement d'élévation minimal, avec la profondeur de coupe et le volume excavé par percement. Comme l'outil ArcGIS Generate Breach Lines.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Polygones de dépressions (par ex. la sortie de delineate_depressions)."
              },
              "dem": {
                "label": "MNT",
                "description": "Raster de surface dans lequel la percée est creusée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin des lignes de percée en sortie. Si omis, le résultat est stocké en mémoire."
              },
              "connection_points": {
                "label": "Points de connexion",
                "description": "Entités ponctuelles optionnelles limitant les emplacements où une percée peut se terminer."
              },
              "method": {
                "label": "Méthode",
                "description": "'minimum_breaching_cost' (par défaut), 'shortest_path' ou 'minimum_elevation_change'."
              },
              "max_length": {
                "label": "Longueur maximale",
                "description": "Écarte les percées plus longues que cette valeur (unités carte) ; les dépressions concernées restent non percées."
              }
            }
          },
          "generate_near_table": {
            "name": "Générer une table de proximité",
            "description": "Pour chaque entité d'entrée, liste les k entités les plus proches (ou toutes celles dans un rayon de recherche) de la couche de proximité avec la distance, le rang, un angle de relèvement optionnel et les XY du point proche — une table de proximité multi-voisins, comme l'outil ArcGIS Generate Near Table.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée (points, lignes ou polygones) dont la proximité est mesurée."
              },
              "near_features": {
                "label": "Entités proches",
                "description": "Couche vectorielle de proximité dans laquelle effectuer la recherche (points, lignes ou polygones)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de points en sortie (un Point par correspondance de proximité). Si omis, le résultat est stocké en mémoire."
              },
              "search_radius": {
                "label": "Rayon de recherche",
                "description": "Ne conserve que les entités de proximité situées à moins de cette distance (unités carte). Requis lorsque closest_count = 0 (toutes celles comprises dans le rayon)."
              },
              "closest_count": {
                "label": "Nombre de plus proches",
                "description": "Nombre d'entités de proximité les plus proches par entité d'entrée (k, par défaut 1). Utiliser 0 pour renvoyer toutes les entités de proximité comprises dans search_radius."
              },
              "angle": {
                "label": "Angle",
                "description": "Ajoute NEAR_ANGLE (azimut arithmétique en degrés, est = 0, sens antihoraire). Par défaut faux."
              },
              "location": {
                "label": "Emplacement",
                "description": "Ajoute les colonnes NEAR_X / NEAR_Y pour l'emplacement de proximité. Par défaut faux."
              }
            }
          },
          "generate_network_swm": {
            "name": "Générer la matrice SWM du réseau",
            "description": "Construit une matrice de poids spatiaux dans laquelle les voisins et les poids proviennent de la distance de déplacement le long d'un réseau linéaire plutôt que de la géométrie à vol d'oiseau (ArcGIS Generate Network Spatial Weights). generate_spatial_weights_matrix n'offre que des conceptualisations euclidiennes et topologiques (knn, bande de distance fixe, inverse de la distance, contiguïté, Delaunay), de sorte que pour les phénomènes contraints par un réseau il relie des entités qui ne peuvent pas s'atteindre et biaise toutes les statistiques en aval. La sortie utilise le même schéma de table, de sorte que global_morans_i, local_morans_i_lisa, getis_ord_gi_star et compare_spatial_weights la consomment sans modification.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Entités ponctuelles à pondérer."
              },
              "network": {
                "label": "Réseau",
                "description": "Réseau de lignes le long duquel les distances de parcours sont mesurées."
              },
              "output": {
                "label": "Sortie",
                "description": "Table de pondérations (CSV selon l'extension, ou table vectorielle sans géométrie), suivant le même schéma origin/neighbor/weight que celui produit par generate_spatial_weights_matrix. Si omis, le résultat est stocké en mémoire."
              },
              "id_field": {
                "label": "Champ d'identifiant",
                "description": "Champ contenant l'identifiant unique de chaque entité. Par défaut : l'indice de l'entité à partir de 0, comme dans generate_spatial_weights_matrix."
              },
              "impedance_field": {
                "label": "Champ d'impédance",
                "description": "Champ de coût du réseau. Par défaut : la longueur géométrique de chaque segment."
              },
              "distance_cutoff": {
                "label": "Distance de coupure",
                "description": "Impédance de réseau maximale à laquelle un voisin peut se situer. Par défaut : illimitée."
              },
              "max_neighbors": {
                "label": "Voisins maximaux",
                "description": "Limite du nombre de voisins par origine, en conservant les plus proches. Par défaut : illimité."
              },
              "conceptualization": {
                "label": "Conceptualisation",
                "description": "'fixed' (par défaut, poids binaire de 1 en deçà du seuil) ou 'inverse' (poids = 1 / impédance^exposant)."
              },
              "exponent": {
                "label": "Exposant",
                "description": "Exposant de décroissance pour 'inverse' (par défaut 1)."
              },
              "row_standardization": {
                "label": "Standardisation par ligne",
                "description": "Divise les poids de chaque origine par la somme de sa ligne afin que chaque origine totalise 1. Par défaut faux, comme dans generate_spatial_weights_matrix."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Distance en deçà de laquelle deux sommets du réseau sont soudés en un seul nœud, en unités du SCR (par défaut 1e-6). Sans cela, un réseau dont les segments se rejoignent presque se déconnecterait silencieusement et chaque origine concernée ne produirait aucune ligne."
              },
              "search_tolerance": {
                "label": "Tolérance de recherche",
                "description": "Distance d'accrochage maximale d'un point au réseau. Les points plus éloignés sont signalés comme non accrochés plutôt que rattachés silencieusement à un nœud lointain."
              }
            }
          },
          "generate_od_links": {
            "name": "Générer des liens origine-destination",
            "description": "Trace des lignes de désir droites des points d'origine vers les points de destination — appariés par un identifiant partagé, dans une distance et/ou vers les k plus proches — chacune portant les identifiants d'origine/destination et la longueur, comme l'outil ArcGIS Generate Origin-Destination Links.",
            "params": {
              "origins": {
                "label": "Origines",
                "description": "Couche de points d'origine (Point ou MultiPoint)."
              },
              "destinations": {
                "label": "Destinations",
                "description": "Couche de points de destination (Point ou MultiPoint)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de la couche vectorielle de lignes en sortie (pilote déduit de l'extension). Si omis, stocké en mémoire."
              },
              "num_nearest": {
                "label": "Nombre de plus proches",
                "description": "Ne conserve que les k destinations les plus proches par origine (après tout filtre d'identifiant ou de distance)."
              },
              "search_distance": {
                "label": "Distance de recherche",
                "description": "Ne conserve que les destinations situées à moins de cette distance de l'origine (unités carte)."
              },
              "id_field": {
                "label": "Champ d'identifiant",
                "description": "Champ présent dans LES DEUX couches ; ne relie que les paires dont les valeurs concordent. Également écrit sous 'link_id'."
              },
              "origin_id_field": {
                "label": "Champ d'identifiant d'origine",
                "description": "Champ des origines à écrire sous 'origin_id' (par défaut : l'indice de l'entité)."
              },
              "dest_id_field": {
                "label": "Champ d'identifiant de destination",
                "description": "Champ des destinations à écrire sous 'dest_id' (par défaut : l'indice de l'entité)."
              }
            }
          },
          "generate_points_along_3d_lines": {
            "name": "Générer des points le long de lignes 3D",
            "description": "Génère des points régulièrement espacés le long de lignes 3D mesurés en vraie distance 3D (et non la longueur en plan 2D qu'utilise points_along_lines intégré), avec Z interpolé, des points d'extrémité optionnels et un champ de chaînage 3D cumulé. Comme l'outil ArcGIS Generate Points Along 3D Lines.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Entités polylignes 3D en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin des points en sortie. Si omis, le résultat est stocké en mémoire."
              },
              "method": {
                "label": "Méthode",
                "description": "'distance' (par défaut), 'percentage' ou 'distance_field'."
              },
              "distance": {
                "label": "Distance",
                "description": "Espacement en unités carte pour la méthode 'distance'."
              },
              "percentage": {
                "label": "Pourcentage",
                "description": "Espacement exprimé en pourcentage (0-100) de la longueur 3D de chaque ligne pour la méthode 'percentage'."
              },
              "distance_field": {
                "label": "Champ de distance",
                "description": "Champ donnant un espacement par entité pour la méthode 'distance_field'."
              },
              "include_end_points": {
                "label": "Inclure les extrémités",
                "description": "Produit également les sommets de début et de fin de chaque ligne (par défaut faux)."
              },
              "add_chainage": {
                "label": "Ajouter le chaînage",
                "description": "Écrit un champ CHAINAGE contenant la distance 3D cumulée depuis le début de la ligne (par défaut faux)."
              }
            }
          },
          "generate_spatial_weights_matrix": {
            "name": "Générer une matrice de pondération spatiale",
            "description": "Émet une table de voisins/poids réutilisable au format long (origin_id, neighbor_id, weight) à partir d'une conceptualisation choisie — KNN, bande de distance fixe, inverse de la distance, contiguïté (arêtes / arêtes+coins) ou Delaunay — avec standardisation par ligne optionnelle, comme l'outil ArcGIS Generate Spatial Weights Matrix.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée (points/lignes/polygones ; la contiguïté nécessite des polygones)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de la table de sortie — un CSV (extension .csv) ou une table vectorielle sans géométrie. Si omis, le résultat est stocké en mémoire."
              },
              "id_field": {
                "label": "Champ d'identifiant",
                "description": "Champ contenant l'identifiant unique de chaque entité. Par défaut : l'indice de l'entité à partir de 0."
              },
              "method": {
                "label": "Méthode",
                "description": "Conceptualisation des relations spatiales : 'knn', 'fixed_distance_band', 'inverse_distance', 'contiguity_edges', 'contiguity_edges_corners' ou 'delaunay'. Par défaut 'knn'."
              },
              "number_of_neighbors": {
                "label": "Nombre de voisins",
                "description": "Nombre k de plus proches voisins (method = knn). Par défaut 8."
              },
              "threshold_distance": {
                "label": "Distance seuil",
                "description": "Seuil de la bande de distance en unités carte. Requis pour fixed_distance_band ; seuil optionnel pour inverse_distance (non défini = toutes les autres entités)."
              },
              "exponent": {
                "label": "Exposant",
                "description": "Exposant p de décroissance avec la distance pour inverse_distance (poids = 1/d^p). Par défaut 1."
              },
              "row_standardization": {
                "label": "Standardisation par ligne",
                "description": "Divise les poids de chaque origine par la somme de sa ligne afin que les poids de chaque origine totalisent 1. Par défaut faux."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Quantifie les sommets sur une grille de ce pas (unités du SCR) avant d'apparier les limites pour la contiguïté. Par défaut 0 (coordonnées exactes)."
              }
            }
          },
          "generate_subset_polygons": {
            "name": "Générer des polygones de sous-ensemble",
            "description": "Partitionne une couche de points dense en polygones compacts et non chevauchants qui pavent l'emprise des points, chacun contenant entre un nombre minimal et maximal de points (ArcGIS Generate Subset Polygons). L'étape de prétraitement standard pour interpoler de très grands ensembles de points. Contrairement aux grilles fixes intégrées, il s'adapte à la densité (division k-d médiane) ; contrairement à voronoi_diagram il regroupe les points au lieu de créer une cellule par point ; et contrairement à group_by_proximity il émet des polygones et respecte des bornes de taille.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de points en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin optionnel des polygones en sortie. Si omis, le résultat est stocké en mémoire."
              },
              "output_points": {
                "label": "Points en sortie",
                "description": "Chemin optionnel des points d'entrée marqués de leur identifiant de sous-ensemble. Si omis, le résultat est stocké en mémoire (et toujours renvoyé)."
              },
              "min_points_per_subset": {
                "label": "Points minimaux par sous-ensemble",
                "description": "Borne inférieure du nombre de points par sous-ensemble (par défaut 50)."
              },
              "max_points_per_subset": {
                "label": "Points maximaux par sous-ensemble",
                "description": "Borne supérieure du nombre de points par sous-ensemble (par défaut 200)."
              },
              "coincident_points": {
                "label": "Points coïncidents",
                "description": "'single' (par défaut ; les points exactement confondus ne comptent qu'une fois lors du dimensionnement) ou 'all' (chacun compte individuellement)."
              },
              "clip_to_hull": {
                "label": "Découper selon l'enveloppe",
                "description": "Découpe les polygones de sous-ensembles selon l'enveloppe convexe des points afin que le résultat épouse les données plutôt que leur emprise rectangulaire (par défaut vrai)."
              }
            }
          },
          "generate_transects_along_lines": {
            "name": "Générer des transects le long de lignes",
            "description": "Parcourt chaque ligne à un intervalle fixe et émet des lignes de transects perpendiculaires d'une longueur donnée (centrées ou décalées), pour l'échantillonnage du changement de trait de côte, des zones riveraines et des sections transversales — comme l'outil ArcGIS Generate Transects Along Lines.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de lignes en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de la couche vectorielle de lignes en sortie (pilote déduit de l'extension). Si omis, stocké en mémoire."
              },
              "interval": {
                "label": "Intervalle",
                "description": "Espacement entre les transects le long de chaque ligne, en unités du SCR. Requis."
              },
              "length": {
                "label": "Longueur",
                "description": "Longueur totale du transect, en unités du SCR. Requis."
              },
              "offset": {
                "label": "Décalage",
                "description": "Décalage signé du centre du transect par rapport à la ligne, en unités du SCR (0 = centré ; une valeur positive ou négative le décale à gauche ou à droite). Par défaut 0."
              },
              "include_ends": {
                "label": "Inclure les extrémités",
                "description": "Place également un transect exactement au début et à la fin de chaque ligne. Par défaut faux."
              }
            }
          },
          "generate_trend_raster": {
            "name": "Générer un raster de tendance",
            "description": "Ajuste une tendance temporelle par pixel sur une série temporelle de rasters co-enregistrés (comme ArcGIS Generate Trend Raster) : pente/ordonnée à l'origine/R² MCO ou Mann-Kendall non paramétrique + pente de Sen avec une valeur p — la tendance temporelle par pixel que trend_surface (spatial) et change_vector_analysis (deux dates) intégrés ne peuvent pas produire.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Liste séparée par des virgules de chemins de rasters monobandes co-enregistrés, dans l'ordre chronologique (>= 3)."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster de pente en sortie (pente de Sen pour mann_kendall). Si omis, le résultat est stocké en mémoire."
              },
              "times": {
                "label": "Temps",
                "description": "Instants numériques séparés par des virgules (par ex. des années) correspondant à 'inputs'. Par défaut 0,1,2,..."
              },
              "method": {
                "label": "Méthode",
                "description": "'linear' (MCO ; par défaut) ou 'mann_kendall' (non paramétrique, avec la pente de Sen)."
              },
              "intercept_output": {
                "label": "Ordonnée à l'origine en sortie",
                "description": "linear uniquement : raster de sortie optionnel de l'ordonnée à l'origine des MCO."
              },
              "significance_output": {
                "label": "Significativité en sortie",
                "description": "Raster de sortie optionnel : R² (linear) ou la valeur p bilatérale de Mann-Kendall (mann_kendall)."
              },
              "min_valid": {
                "label": "Valides minimaux",
                "description": "Nombre minimal d'observations non NoData par pixel (par défaut 3)."
              },
              "band": {
                "label": "Bande",
                "description": "Bande à lire dans chaque entrée, indexée à partir de 1 (par défaut 1)."
              }
            }
          },
          "geodetic_densify": {
            "name": "Densifier géodésiquement",
            "description": "Insère des sommets le long du véritable chemin géodésique ou loxodromique (relèvement constant) entre les sommets existants d'une couche de lignes ou de polygones géographiques (lon/lat), comme l'outil Geodetic Densify d'ArcGIS — afin que les longs segments suivent la courbure de la Terre au lieu d'une corde plane.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de lignes ou de polygones en entrée, supposée géographique (lon/lat, de type EPSG:4326)."
              },
              "geodetic_type": {
                "label": "Type géodésique",
                "description": "Type de trajet entre les sommets : 'geodesic' (par défaut ; chemin le plus court sur l'ellipsoïde WGS84) ou 'rhumb'/'loxodrome' (azimut vrai constant)."
              },
              "max_segment_length": {
                "label": "Longueur maximale de segment",
                "description": "Espacement maximal cible, en mètres, entre sommets consécutifs après densification. Exactement l'un des paramètres max_segment_length / vertices_per_segment doit être fourni."
              },
              "vertices_per_segment": {
                "label": "Sommets par segment",
                "description": "Alternative à max_segment_length : insère exactement ce nombre de sommets régulièrement espacés dans chaque segment d'origine, quelle que soit sa longueur. Exactement l'un des paramètres max_segment_length / vertices_per_segment doit être fourni."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel ; si omis, le résultat est stocké en mémoire."
              }
            }
          },
          "geotagged_photos_to_points": {
            "name": "Photos géolocalisées vers points",
            "description": "Lit un dossier de photos géolocalisées et construit une couche de points WGS-84 avec le chemin de chaque photo, la date et l'heure de prise de vue, l'altitude, le relèvement de l'appareil (direction d'image GPS) et la marque/le modèle — analysés uniquement à partir des métadonnées EXIF (aucun pixel décodé), comme l'outil ArcGIS GeoTagged Photos To Points.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du dossier contenant les photos (JPEG/TIFF) dont lire les métadonnées GPS EXIF."
              },
              "output": {
                "label": "Sortie",
                "description": "Vecteur de points en sortie (pilote déduit de l'extension). Si omis, le résultat est stocké en mémoire."
              },
              "recursive": {
                "label": "Récursif",
                "description": "Explore les sous-dossiers lors de la recherche de photos. Par défaut faux."
              },
              "only_geotagged": {
                "label": "Géolocalisées uniquement",
                "description": "Ignore les images dépourvues de position GPS (par défaut vrai). Si faux, les images non géolocalisées sont émises avec une géométrie nulle."
              }
            }
          },
          "getis_ord_general_g": {
            "name": "Regroupement haut/bas (G général de Getis-Ord)",
            "description": "Calcule la statistique G générale globale de Getis-Ord — un seul score z et une valeur p indiquant si les valeurs ÉLEVÉES ou FAIBLES sont globalement regroupées, comme l'outil ArcGIS High/Low Clustering (Getis-Ord General G).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée. Les points utilisent leurs coordonnées ; les autres géométries utilisent leur point représentatif moyen des sommets (les poids de contiguïté nécessitent des polygones)."
              },
              "field": {
                "label": "Champ",
                "description": "Champ numérique non négatif à tester pour la détection d'agrégats hauts/bas."
              },
              "weights": {
                "label": "Poids",
                "description": "Schéma de pondération spatiale : 'distance_band' (par défaut), 'k_nearest', 'queen' ou 'rook'."
              },
              "distance_band": {
                "label": "Bande de distance",
                "description": "Distance seuil (unités du SCR) pour le schéma 'distance_band'. Par défaut : la distance maximale au plus proche voisin (chaque entité a au moins 1 voisin)."
              },
              "k": {
                "label": "K",
                "description": "Nombre de voisins pour le schéma 'k_nearest' (par défaut 8)."
              },
              "row_standardize": {
                "label": "Standardisation par ligne",
                "description": "Normaliser la matrice de poids par ligne afin que chaque ligne somme à 1 (par défaut faux)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin CSV optionnel pour le rapport d'une seule ligne. Toujours renvoyé dans le résultat."
              }
            }
          },
          "goldstein_phase_filter": {
            "name": "Filtre de phase de Goldstein",
            "description": "Filtrage spectral adaptatif (Goldstein) de la phase SAR interférométrique, l'étape qui rend le déroulement de phase viable (ArcGIS Apply Complex Data Filter). unwrap_phase de la série 17 échoue sur un interférogramme brut parce que les résidus de bruit forcent des coupures de branches ; toute la famille de filtres lee/frost/kuan/wiener/gaussian intégrée travaille sur une intensité à valeurs réelles et ne peut pas être utilisée ici, car moyenner une phase enroulée à travers la discontinuité +/-pi la détruit. Filtre le signal complexe patch par patch dans le domaine fréquentiel et rapporte le nombre de résidus avant et après.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Interférogramme : un raster I/Q à deux bandes, ou un raster à une bande de phase repliée en radians (l'amplitude est supposée unitaire)."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster complexe filtré à deux bandes (I, Q) en sortie. Si omis, stocké en mémoire."
              },
              "output_phase": {
                "label": "Phase en sortie",
                "description": "Phase repliée filtrée à une bande en sortie, en radians, dans (-pi, pi]. Toujours produite ; stockée en mémoire si aucun chemin n'est fourni."
              },
              "alpha": {
                "label": "Alpha",
                "description": "Intensité du filtre dans [0, 1] (par défaut 0.5). 0 laisse la phase intacte ; 1 est le réglage le plus agressif."
              },
              "outer_window_size": {
                "label": "Taille de fenêtre extérieure",
                "description": "Taille des imagettes FFT en cellules (par défaut 32). Arrondie à la puissance de deux supérieure."
              },
              "inner_window_size": {
                "label": "Taille de fenêtre intérieure",
                "description": "Pas entre les imagettes en cellules (par défaut = outer/4). Une valeur plus faible signifie plus de recouvrement et un fondu plus doux ; ne doit pas dépasser la fenêtre externe."
              },
              "spectrum_smoothing": {
                "label": "Lissage du spectre",
                "description": "Largeur en classes de la moyenne mobile appliquée au spectre de l'imagette avant exponentiation (par défaut 3, doit être impaire)."
              }
            }
          },
          "gpx_to_features": {
            "name": "GPX vers entités",
            "description": "Analyse un fichier GPX en points de cheminement et/ou en polylignes de traces/itinéraires, en conservant ele/time/name.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin vers un fichier .gpx (XML GPS Exchange Format)."
              },
              "points_output": {
                "label": "Points en sortie",
                "description": "Chemin optionnel du vecteur de points en sortie pour les waypoints (pilote déduit de son extension). Si aucune sortie n'est fournie, les waypoints sont stockés en mémoire."
              },
              "lines_output": {
                "label": "Lignes en sortie",
                "description": "Chemin optionnel du vecteur de lignes en sortie pour les traces et les itinéraires (pilote déduit de son extension)."
              }
            }
          },
          "graphic_buffer": {
            "name": "Zone tampon graphique",
            "description": "Crée des tampons autour des entités avec un choix de styles d'extrémité (round/square/butt) et de jointure d'angle (round/miter/bevel), avec une limite d'onglet — la géométrie de tampon carrée/à onglets que les tampons uniquement arrondis ne peuvent pas produire.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier vectoriel en entrée, format détecté automatiquement (ou référence en mémoire)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel (pilote selon son extension). S'il est omis, stocké en mémoire."
              },
              "distance": {
                "label": "Distance",
                "description": "Distance de la zone tampon dans les unités du SCR de la couche. Doit être positive."
              },
              "cap": {
                "label": "Extrémité",
                "description": "Style d'extrémité pour les fins de ligne/point : 'round' (par défaut), 'square' ou 'butt' (alias 'flat')."
              },
              "join": {
                "label": "Jointure",
                "description": "Style de jointure des angles : 'round' (par défaut), 'miter' ou 'bevel'."
              },
              "miter_limit": {
                "label": "Limite d'onglet",
                "description": "Rapport entre la longueur d'onglet et la distance de tampon au-delà duquel un angle en onglet est biseauté (par défaut 10 dans ArcGIS/JTS). Doit être >= 1. Utilisé uniquement lorsque join='miter'."
              },
              "dissolve": {
                "label": "Dissoudre",
                "description": "Si vrai, fusionne toutes les zones tampons en une seule entité (multi)polygone dissoute. Par défaut faux (une zone tampon par entité en entrée, attributs conservés)."
              }
            }
          },
          "greater_than_or_equal_to": {
            "name": "SupérieurOuÉgalÀ",
            "description": "Teste, cellule par cellule, si le premier raster est supérieur ou égal au second.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Premier raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Second raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, la sortie reste en mémoire et est renvoyée sous forme de référence raster memory://."
              }
            }
          },
          "grid_index_features": {
            "name": "Entités de grille d'index",
            "description": "Construit une grille d'index de série de cartes composée de rectangles de la taille d'une page avec des noms de pages (A1, B3, ... ou séquentiels), un dimensionnement dérivé de l'échelle et un filtre optionnel d'intersection avec les données — comme l'outil ArcGIS Grid Index Features, plus un mode bande qui suit un itinéraire avec des pages tournées comme l'outil ArcGIS Strip Map Index Features.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée. Fournit l'emprise lorsqu'aucune emprise explicite n'est donnée, l'itinéraire pour le mode bande, et les entités testées par intersect_only."
              },
              "output": {
                "label": "Sortie",
                "description": "Vecteur de polygones en sortie des pages d'index (pilote déduit de l'extension). Si omis, stocké en mémoire."
              },
              "mode": {
                "label": "Mode",
                "description": "grid (par défaut) : découpe une emprise rectangulaire en tuiles. strip : suit une ligne d'itinéraire avec des pages pivotées et chevauchantes."
              },
              "x_min": {
                "label": "X min",
                "description": "X minimal de l'emprise explicite (unités du SCR). Fournissez les quatre valeurs x_min/y_min/x_max/y_max pour remplacer l'emprise en entrée."
              },
              "y_min": {
                "label": "Y min",
                "description": "Y minimal de l'emprise explicite (unités du SCR)."
              },
              "x_max": {
                "label": "X max",
                "description": "X maximal de l'emprise explicite (unités du SCR)."
              },
              "y_max": {
                "label": "Y max",
                "description": "Y maximal de l'emprise explicite (unités du SCR)."
              },
              "tile_width": {
                "label": "Largeur de tuile",
                "description": "Largeur de page dans les unités du SCR. Fournissez à la fois tile_width et tile_height, ou utilisez page_size + map_scale."
              },
              "tile_height": {
                "label": "Hauteur de tuile",
                "description": "Hauteur de page dans les unités du SCR (longueur de la page le long de l'itinéraire en mode bande)."
              },
              "page_size": {
                "label": "Taille de page",
                "description": "Format de page prédéfini (a0..a4, letter, legal, tabloid) dont les dimensions métriques sont multipliées par map_scale pour dimensionner chaque page. Nécessite map_scale."
              },
              "map_scale": {
                "label": "Échelle de carte",
                "description": "Dénominateur de l'échelle de la carte (p. ex. 24000 pour 1:24 000). Avec page_size, la taille de tuile = mètres du papier × map_scale (SCR métrique supposé)."
              },
              "origin_x": {
                "label": "Origine X",
                "description": "X de l'origine de la grille sur laquelle s'alignent les limites des tuiles. Par défaut : X minimal de l'emprise."
              },
              "origin_y": {
                "label": "Origine Y",
                "description": "Y de l'origine de la grille sur laquelle s'alignent les limites des tuiles. Par défaut : Y minimal de l'emprise."
              },
              "naming": {
                "label": "Nommage",
                "description": "Schéma de nommage des pages : alphanumeric (par défaut ; lettre de colonne + numéro de ligne, p. ex. A1) ou sequential (numéro dans l'ordre de lecture)."
              },
              "intersect_only": {
                "label": "Intersection uniquement",
                "description": "Si vrai, supprime les pages qui n'intersectent aucune entité en entrée. Nécessite input. Par défaut faux."
              },
              "route": {
                "label": "Itinéraire",
                "description": "Mode bande : couche vectorielle de lignes à suivre. Par défaut, la première entité linéaire de input."
              },
              "overlap": {
                "label": "Chevauchement",
                "description": "Mode bande : fraction [0,1) de recouvrement des pages consécutives le long de l'itinéraire. Par défaut 0.05."
              },
              "epsg": {
                "label": "EPSG",
                "description": "Code EPSG de sortie lorsque l'emprise est fournie explicitement et qu'aucune couche en entrée ne permet d'hériter d'un SCR."
              }
            }
          },
          "group_by_proximity": {
            "name": "Grouper par proximité",
            "description": "Marque les entités avec un GROUP_ID pour les composantes connexes spatiales à liaison simple — entités à moins d'une distance (« near ») ou se touchant (« intersects »), partageant éventuellement une valeur d'attribut — comme l'outil ArcGIS Group By Proximity.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée (tout type de géométrie)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de sortie (pilote déduit de l'extension). Si omis, le résultat est stocké en mémoire."
              },
              "relationship": {
                "label": "Relation",
                "description": "'near' (dans la limite de 'spatial_near_distance', par défaut) ou 'intersects' (contact, distance 0)."
              },
              "spatial_near_distance": {
                "label": "Distance de proximité spatiale",
                "description": "Distance de recherche en unités carte pour 'near' (par défaut 0)."
              },
              "attribute_field": {
                "label": "Champ d'attribut",
                "description": "Champ optionnel ; les entités ne sont regroupées que si elles partagent cette valeur d'attribut."
              },
              "group_field": {
                "label": "Champ de regroupement",
                "description": "Nom du champ d'identifiant de groupe en sortie (par défaut 'GROUP_ID')."
              }
            }
          },
          "gtfs_to_features": {
            "name": "GTFS vers entités",
            "description": "Analyse un flux de transport en commun GTFS en points d'arrêts et en lignes d'itinéraires, éventuellement avec des comptages de fréquence de service par arrêt.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin vers un répertoire de flux GTFS extrait (dossier de fichiers *.txt : stops.txt, shapes.txt, trips.txt, ...)."
              },
              "stops_output": {
                "label": "Arrêts en sortie",
                "description": "Chemin optionnel du vecteur de points en sortie pour les arrêts (pilote déduit de son extension). Si aucune sortie n'est fournie, les arrêts sont stockés en mémoire."
              },
              "shapes_output": {
                "label": "Tracés en sortie",
                "description": "Chemin optionnel du vecteur de lignes en sortie pour les tracés des itinéraires (pilote déduit de son extension)."
              },
              "frequency": {
                "label": "Fréquence",
                "description": "Si vrai, comptabilise les départs programmés de chaque arrêt à partir de stop_times.txt dans un champ n_departures. Par défaut faux."
              },
              "start_time": {
                "label": "Heure de début",
                "description": "Borne inférieure optionnelle HH:MM:SS de la fenêtre de fréquence (les heures GTFS peuvent dépasser 24:00:00)."
              },
              "end_time": {
                "label": "Heure de fin",
                "description": "Borne supérieure optionnelle HH:MM:SS de la fenêtre de fréquence."
              }
            }
          },
          "h3_polyfill": {
            "name": "Remplissage de polygones H3",
            "description": "Couvre les polygones d'entrée de cellules de grille globale discrète H3 à une résolution choisie.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier vectoriel de polygones en entrée (doit être géographique lon/lat, EPSG:4326) ou identifiant en mémoire."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur en sortie ; le pilote est déduit de son extension (.geojson, .fgb, .parquet, ...). Si omis, la couche est stockée en mémoire."
              },
              "resolution": {
                "label": "Résolution",
                "description": "Résolution H3 de 0 (la plus grossière) à 15 (la plus fine) ; par défaut 8 (cellules d'environ 0,7 km²)."
              }
            }
          },
          "h3_to_vector": {
            "name": "Cellules H3 vers polygones",
            "description": "Transforme une colonne d'identifiants de cellules H3 en polygones de limites de cellules, en recopiant les autres attributs.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier vectoriel en entrée (ou identifiant en mémoire) comportant un champ d'identifiants de cellules H3."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur en sortie ; le pilote est déduit de son extension (.geojson, .fgb, .parquet, ...). Si omis, la couche est stockée en mémoire."
              },
              "field": {
                "label": "Champ",
                "description": "Nom du champ texte contenant l'identifiant de cellule H3 ; par défaut 'h3'."
              }
            }
          },
          "hdbscan": {
            "name": "Classification HDBSCAN",
            "description": "Regroupement hiérarchique basé sur la densité (HDBSCAN*) : arbre couvrant minimal d'accessibilité mutuelle, arbre de grappes condensé et sélection par excès de masse, avec une probabilité d'appartenance et un score de valeur aberrante par point — gère les densités variables sans epsilon, comme l'option HDBSCAN de l'outil ArcGIS Density-based Clustering.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points en entrée (SCR projeté ; distances dans ses unités)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur en sortie (une copie de l'entrée avec les champs de cluster). Si omis, stocké en mémoire."
              },
              "min_cluster_size": {
                "label": "Taille minimale de grappe",
                "description": "Plus petit regroupement considéré comme un cluster (>= 2). Par défaut 5."
              },
              "min_samples": {
                "label": "Échantillons minimaux",
                "description": "Taille du voisinage pour l'estimation de densité par distance au cœur (plus la valeur est élevée, plus de points sont considérés comme du bruit). Par défaut : min_cluster_size."
              }
            }
          },
          "hot_spot_analysis_comparison": {
            "name": "Comparaison d'analyses de points chauds",
            "description": "Compare deux couches de résultats de points chauds de Getis-Ord : apparie leurs emplacements, classe chaque transition (hot_to_hot, hot_to_cold, none_to_hot, ...) et exécute un test par permutation avec graine de la concordance globale — comme l'outil ArcGIS Hot Spot Analysis Comparison.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Première couche de résultats de points chauds (points ou polygones)."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Deuxième couche de résultats de points chauds."
              },
              "bin_field": {
                "label": "Champ de classe",
                "description": "Champ de significativité présent dans les deux entrées (positif = chaud, négatif = froid)."
              },
              "significance": {
                "label": "Significativité",
                "description": "Seuil en valeur absolue en dessous duquel un emplacement est 'none' (par défaut 0)."
              },
              "match_field": {
                "label": "Champ de correspondance",
                "description": "Champ d'identifiant optionnel présent dans les deux entrées, utilisé pour joindre les emplacements ; sinon, le centroïde le plus proche est utilisé."
              },
              "tolerance": {
                "label": "Tolérance",
                "description": "Distance maximale entre centroïdes pour l'appariement au plus proche emplacement (unités carte). Illimitée si omise."
              },
              "permutations": {
                "label": "Permutations",
                "description": "Nombre de permutations pour le test d'accord global (par défaut 499)."
              },
              "seed": {
                "label": "Graine",
                "description": "Germe du générateur aléatoire déterministe des permutations (par défaut 1)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de sortie (pilote déduit de l'extension). Si omis, le résultat est stocké en mémoire."
              }
            }
          },
          "identify_narrow_polygons": {
            "name": "Identifier les polygones étroits",
            "description": "Signale les polygones plus étroits qu'une tolérance de largeur à un endroit quelconque (résidus et cols étroits), en annotant chacun d'un indicateur is_narrow et d'une largeur minimale estimée.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier vectoriel de polygones en entrée, format détecté automatiquement (ou référence en mémoire)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel (pilote selon son extension). S'il est omis, stocké en mémoire."
              },
              "width_tolerance": {
                "label": "Tolérance de largeur",
                "description": "Seuil de largeur dans les unités du SCR. Un polygone est étroit là où il est plus mince que cette valeur. Obligatoire."
              },
              "min_narrow_area": {
                "label": "Surface étroite minimale",
                "description": "Surface minimale de la portion étroite (unités du SCR au carré) requise pour signaler un polygone ; les surfaces étroites plus petites sont ignorées comme du bruit. Par défaut width_tolerance au carré, ce qui absorbe également le léger arrondi des angles produit par l'ouverture."
              },
              "narrow_only": {
                "label": "Parties étroites uniquement",
                "description": "Si vrai, supprime les entités non étroites et ne produit que les polygones étroits signalés. Par défaut faux (annote et conserve toutes les entités)."
              }
            }
          },
          "idw_3d": {
            "name": "IDW 3D",
            "description": "Interpolation volumétrique par inverse de la distance d'observations ponctuelles 3D en une pile de niveaux d'élévation (une bande raster par niveau), avec un facteur d'inflation d'élévation gérant l'anisotropie verticale/horizontale et des points optionnels de validation croisée « leave-one-out ». Comme l'outil ArcGIS IDW3D.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Entités ponctuelles 3D en entrée."
              },
              "value_field": {
                "label": "Champ de valeur",
                "description": "Champ numérique contenant la valeur à interpoler."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster multibande en sortie (une bande par niveau d'altitude). Si omis, stocké en mémoire."
              },
              "z_field": {
                "label": "Champ Z",
                "description": "Champ fournissant l'altitude ; par défaut, le Z de la géométrie."
              },
              "power": {
                "label": "Puissance",
                "description": "Exposant de l'inverse de la distance (par défaut 2)."
              },
              "elev_inflation_factor": {
                "label": "Facteur d'inflation d'élévation",
                "description": "Multiplicateur appliqué à la séparation verticale avant le calcul de la distance 3D (par défaut 1). Des valeurs > 1 donnent plus de poids à la distance verticale, en accord avec la plus courte échelle de corrélation verticale de la plupart des données volumétriques."
              },
              "x_spacing": {
                "label": "Espacement X",
                "description": "Taille de cellule en sortie selon X (par défaut : emprise / 100)."
              },
              "y_spacing": {
                "label": "Espacement Y",
                "description": "Taille de cellule en sortie selon Y (par défaut : identique à x_spacing)."
              },
              "z_spacing": {
                "label": "Espacement Z",
                "description": "Espacement vertical entre les niveaux en sortie (par défaut : étendue des Z / 10)."
              },
              "z_min": {
                "label": "Z min",
                "description": "Niveau le plus bas en sortie (par défaut : le minimum des données)."
              },
              "z_max": {
                "label": "Z max",
                "description": "Niveau le plus haut en sortie (par défaut : le maximum des données)."
              },
              "neighbors": {
                "label": "Voisins",
                "description": "Nombre maximal d'échantillons par prédiction (par défaut 12)."
              },
              "search_radius": {
                "label": "Rayon de recherche",
                "description": "Distance de recherche 3D maximale optionnelle (dilatée) ; les échantillons au-delà sont ignorés."
              },
              "output_cv_features": {
                "label": "Entités de validation croisée en sortie",
                "description": "Chemin optionnel pour les points de validation croisée leave-one-out portant les valeurs observées, prédites et résiduelles."
              },
              "epsg": {
                "label": "EPSG",
                "description": "Code EPSG apposé sur le raster en sortie (par défaut : le SCR de la couche en entrée)."
              }
            }
          },
          "incremental_spatial_autocorrelation": {
            "name": "Autocorrélation spatiale incrémentale",
            "description": "Calcule le I de Moran global sur une série de bandes de distance croissantes et rapporte la courbe des scores z avec ses premier et maximal pics — la façon défendable de choisir une distance de regroupement, comme l'outil ArcGIS Incremental Spatial Autocorrelation.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points en entrée (les autres géométries utilisent leur point représentatif moyen des sommets). Utilisez un SCR projeté."
              },
              "field": {
                "label": "Champ",
                "description": "Champ numérique à tester pour l'autocorrélation spatiale."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin CSV optionnel pour le tableau par bande. Toujours renvoyé dans le résultat."
              },
              "begin_distance": {
                "label": "Distance de début",
                "description": "Distance de la première bande, dans les unités du SCR. Par défaut : la distance maximale au plus proche voisin (chaque entité a au moins 1 voisin)."
              },
              "increment": {
                "label": "Incrément",
                "description": "Distance ajoutée à chaque bande, dans les unités du SCR. Par défaut : la distance initiale."
              },
              "num_bands": {
                "label": "Nombre de bandes",
                "description": "Nombre de bandes de distance à évaluer (par défaut 10)."
              }
            }
          },
          "inside_3d": {
            "name": "Intérieur en 3D",
            "description": "Détermine quelles entités 3D (points, polylignes ou solides) se trouvent à l'intérieur de conteneurs volumétriques fermés, en rapportant éventuellement la longueur contenue ou la fraction de sommets (ArcGIS Inside 3D). Chaque prédicat de contenance des deux registres projette sur le plan XY, de sorte qu'un capteur au-dessus d'une emprise ou une canalisation sous une parcelle est actuellement considéré comme à l'intérieur. Les conteneurs suivent la convention de maillage triangulaire de buffer_3d et minimum_bounding_volume livrés.",
            "params": {
              "target": {
                "label": "Cible",
                "description": "Entités 3D à tester : points, polylignes ou solides à maillage triangulaire."
              },
              "container": {
                "label": "Conteneur",
                "description": "Entités 3D fermées (solides à maillage triangulaire) servant de conteneurs."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin optionnel du tableau en sortie des paires cible/conteneur. Si omis, stocké en mémoire."
              },
              "mode": {
                "label": "Mode",
                "description": "'simple' (par défaut) indique si la cible est à l'intérieur ; 'complex' ajoute la longueur contenue et la fraction intérieure."
              },
              "output_features": {
                "label": "Entités en sortie",
                "description": "Chemin optionnel pour les portions intérieures découpées des cibles linéaires (mode complex). Si omis, stocké en mémoire (toujours renvoyé)."
              }
            }
          },
          "integrate": {
            "name": "Intégrer",
            "description": "Accroche tous les sommets de toutes les entités situés dans une tolérance de regroupement à un emplacement partagé afin que les limites partagées presque coïncidentes deviennent exactement coïncidentes, en insérant éventuellement des sommets de jonction en T sur les arêtes voisines — comme l'outil ArcGIS Integrate.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée (tout type de géométrie)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de sortie optionnel (pilote déduit de l'extension). Si omis, stocké en mémoire."
              },
              "tolerance": {
                "label": "Tolérance",
                "description": "Distance de regroupement dans les unités du SCR : les sommets situés à moins de cette distance sont accrochés à un emplacement commun. Obligatoire."
              },
              "snap_to_edges": {
                "label": "Accrocher aux arêtes",
                "description": "Insère également un sommet là où le sommet d'une entité tombe, dans la tolérance, sur le segment d'une autre entité (jonctions en T). Par défaut vrai."
              }
            }
          },
          "interpolate_from_spatiotemporal_points": {
            "name": "Interpoler depuis des points spatio-temporels",
            "description": "Regroupe des observations ponctuelles horodatées en tranches de temps régulières et interpole chacune sur une grille partagée, produisant un raster multidimensionnel co-enregistré, comme l'outil ArcGIS Interpolate From Spatiotemporal Points.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Entités ponctuelles horodatées."
              },
              "value_field": {
                "label": "Champ de valeur",
                "description": "Champ numérique à interpoler."
              },
              "time_field": {
                "label": "Champ de temps",
                "description": "Champ d'horodatage : nombre de secondes depuis l'epoch, ou texte ISO-8601."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie pour la première tranche. Les tranches suivantes sont écrites à côté avec un suffixe _t<index>. Si omis, toutes les tranches sont stockées en mémoire."
              },
              "time_step": {
                "label": "Pas de temps",
                "description": "daily | weekly | monthly (par défaut) | quarterly | yearly."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule en sortie en unités carte. Par défaut, 1/50e de la plus grande dimension de l'emprise."
              },
              "method": {
                "label": "Méthode",
                "description": "idw (par défaut) | nearest | mean | median."
              },
              "power": {
                "label": "Puissance",
                "description": "Exposant de distance IDW (par défaut 2)."
              },
              "neighbors": {
                "label": "Voisins",
                "description": "Nombre d'observations les plus proches utilisées par cellule (par défaut 8)."
              },
              "min_points": {
                "label": "Points minimaux",
                "description": "Nombre minimal d'observations requis pour qu'une tranche soit interpolée ; les tranches plus clairsemées produisent uniquement du NoData plutôt qu'une surface trompeuse (par défaut 3)."
              }
            }
          },
          "interpolate_shape": {
            "name": "Interpoler la forme",
            "description": "Drape des points/lignes/polygones sur un raster de surface : densifie, échantillonne Z par sommet (bilinéaire ou plus proche voisin), écrit une géométrie 3D et ajoute des métriques de surface (z_min/z_max/z_mean, longueur de surface 3D, pente moyenne), comme ArcGIS Interpolate Shape / Add Surface Information.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée (points, lignes ou polygones) partageant le SCR de la surface."
              },
              "surface": {
                "label": "Surface",
                "description": "Raster d'altitude/de surface à échantillonner."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de sortie (pilote déduit de l'extension). Si omis, le résultat est stocké en mémoire."
              },
              "sample_distance": {
                "label": "Distance d'échantillonnage",
                "description": "Intervalle de densification dans les unités du SCR ; les segments longs sont découpés afin de suivre la surface. Par défaut : la taille de cellule du raster."
              },
              "method": {
                "label": "Méthode",
                "description": "Échantillonnage de la surface : 'bilinear' (par défaut) ou 'nearest'."
              },
              "attributes": {
                "label": "Attributs",
                "description": "Liste séparée par des virgules des colonnes de métriques à ajouter : z_min,z_max,z_mean,surf_len,avg_slope. Par défaut : toutes."
              },
              "band": {
                "label": "Bande",
                "description": "Bande de surface à échantillonner, indexée à partir de 1 (par défaut 1)."
              }
            }
          },
          "interpolate_with_barriers": {
            "name": "Interpoler avec barrières",
            "description": "Interpole des mesures ponctuelles en un raster en respectant des barrières absolues (traits de côte, crêtes, failles, murs) : l'influence contourne les barrières via une distance de coût/géodésique au lieu de les traverser — IDW ou un noyau polynomial local de premier ordre, comme ArcGIS Kernel Interpolation With Barriers / Spline With Barriers. Les outils idw/krigeage/voisin naturel/spline intégrés ignorent tous les barrières.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points de mesures en entrée."
              },
              "field": {
                "label": "Champ",
                "description": "Champ numérique des points contenant la valeur à interpoler."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster interpolé en sortie (GeoTIFF). Si omis, le résultat est stocké en mémoire."
              },
              "barriers": {
                "label": "Barrières",
                "description": "Couche vectorielle de barrières optionnelle (polylignes ou polygones). Rastérisée en cellules infranchissables afin que l'influence doive les contourner. À omettre pour un traitement témoin sans barrière."
              },
              "method": {
                "label": "Méthode",
                "description": "'idw' (par défaut) ou 'local_polynomial' (ajustement planaire pondéré du premier ordre avec un noyau gaussien de distance géodésique)."
              },
              "power": {
                "label": "Puissance",
                "description": "Exposant de décroissance avec la distance de l'IDW (par défaut 2)."
              },
              "bandwidth": {
                "label": "Largeur de bande",
                "description": "Largeur de bande du noyau gaussien pour local_polynomial (unités de distance). Par défaut : le rayon de recherche, ou sinon l'emprise de la grille."
              },
              "radius": {
                "label": "Rayon",
                "description": "Rayon de recherche exprimé en distance géodésique (de coût) : les échantillons au-delà n'influencent pas une cellule, et les cellules inaccessibles dans ce rayon deviennent NoData. Mètres pour un SCR géographique, unités du SCR sinon. Par défaut : illimité."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule en sortie dans les unités du SCR (degrés pour un SCR géographique). Par défaut : dimensionnée pour que le plus grand axe couvre environ 256 cellules."
              }
            }
          },
          "intersect_3d": {
            "name": "Intersecter en 3D",
            "description": "Calcule le volume partagé par des solides 3D fermés qui se chevauchent, paire par paire, avec un solide englobant optionnel pour chaque intersection (ArcGIS Intersect 3D). union_3d est la seule superposition 3D des deux registres et ne répond qu'à la question du volume combiné ; inside_3d est un prédicat de contenance pour les points et les lignes, et polygon_volume / surface_volume mesurent par rapport à un plan de référence. Les volumes par solide sont exacts ; l'intersection est estimée par occupation de voxels à une résolution rapportée.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Entités solides 3D fermées (MultiPolygones à maillage triangulaire avec Z, tels que produits par buffer_3d et minimum_bounding_volume)."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Deuxième couche de solides optionnelle. Si omise, toutes les paires au sein de 'input' sont intersectées (mode à entrée unique d'ArcGIS)."
              },
              "output": {
                "label": "Sortie",
                "description": "Tableau en sortie des paires en intersection, une ligne par intersection non vide. Si omis, stocké en mémoire."
              },
              "mode": {
                "label": "Mode",
                "description": "'table' (par défaut) : attributs uniquement. 'solid' : produit également le solide englobant de chaque intersection sous forme de géométrie. Le volume mesuré est toujours un attribut — aucun maillage fusionné exact n'est prétendu."
              },
              "resolution": {
                "label": "Résolution",
                "description": "Nombre de voxels le long du plus grand axe de la boîte englobante commune à chaque paire (par défaut 64). Une valeur plus élevée est plus précise et plus lente."
              }
            }
          },
          "intersect_3d_line_with_surface": {
            "name": "Intersecter une ligne 3D avec une surface",
            "description": "Divise les lignes 3D en chaque point où elles traversent une surface d'élévation ou un multipatch, en marquant chaque morceau au-dessus ou en dessous et en émettant les points de croisement (ArcGIS Intersect 3D Line With Surface / Intersect 3D Line With Multi Patch). intersect_3d de la série 17 prend des solides fermés plutôt que des lignes, inside_3d est un prédicat de contenance qui ne coupe pas la géométrie ni ne localise les croisements, et interpolate_shape drape une ligne sur une surface en rejetant le z de la ligne dont dépend la comparaison.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de lignes 3D, avec des sommets porteurs de Z."
              },
              "surface": {
                "label": "Surface",
                "description": "Raster d'altitude servant de surface de découpe. Obligatoire sauf si 'multipatch' est fourni."
              },
              "multipatch": {
                "label": "Multipatch",
                "description": "Couche multipatch (multipolygones triangulaires) servant de surface de découpe, à la place d'une surface raster."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche de lignes en sortie découpée à chaque croisement. Si omise, stockée en mémoire."
              },
              "output_points": {
                "label": "Points en sortie",
                "description": "Couche de points en sortie des croisements eux-mêmes. Toujours produite ; stockée en mémoire si aucun chemin n'est fourni."
              },
              "spacing": {
                "label": "Espacement",
                "description": "Pas de densification en vue en plan, en unités carte (par défaut : une cellule de la surface). Une valeur plus faible résout les croisements plus finement mais coûte plus cher."
              },
              "keep_above": {
                "label": "Conserver au-dessus",
                "description": "Conserve les portions situées au-dessus de la surface (par défaut vrai)."
              },
              "keep_below": {
                "label": "Conserver en dessous",
                "description": "Conserve les portions situées en dessous de la surface (par défaut vrai)."
              },
              "band": {
                "label": "Bande",
                "description": "Bande du raster de surface, indexée à partir de 1 (par défaut 1)."
              }
            }
          },
          "intersecting_layers_masks": {
            "name": "Masques des couches sécantes",
            "description": "Génère des polygones de masque cartographique à une marge autour des entités d'une couche masquée, mais uniquement là où elles intersectent une seconde couche de masquage (contour exact, enveloppe convexe ou rectangle englobant).",
            "params": {
              "masked_layer": {
                "label": "Couche masquée",
                "description": "Couche vectorielle à masquer (toute géométrie) : chaque entité qui intersecte la couche de masquage reçoit un masque. Format détecté automatiquement (ou identifiant en mémoire)."
              },
              "masking_layer": {
                "label": "Couche de masquage",
                "description": "Couche vectorielle de masquage (toute géométrie) : une entité masquée n'est masquée que là où elle intersecte une entité de cette couche."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel (pilote selon son extension). S'il est omis, stocké en mémoire."
              },
              "margin": {
                "label": "Marge",
                "description": "Distance de marge du masque. En mètres pour un SCR géographique (EPSG:4326 ou inconnu, convertie en degrés), sinon dans les unités du SCR de la couche. Doit être positive."
              },
              "mask_kind": {
                "label": "Type de masque",
                "description": "Forme du masque : 'exact' (par défaut, contour de l'entité avec zone tampon), 'convex_hull' (enveloppe convexe dilatée) ou 'box' (enveloppe englobante plus la marge)."
              },
              "id_field": {
                "label": "Champ d'identifiant",
                "description": "Champ optionnel de la couche masquée dont la valeur est copiée sur chaque masque sous le nom 'source_id'. Par défaut, l'index de l'entité source."
              }
            }
          },
          "intervisibility": {
            "name": "Intervisibilité",
            "description": "Teste chaque ligne de visée contre des obstructions vectorielles 3D et la marque visible ou bloquée, en rapportant quelle obstruction l'a bloquée et où (ArcGIS Intervisibility). line_of_sight, visibility_index, viewshed et skyline_analysis travaillent tous contre un raster de surface ; aucun ne peut tester contre des obstructions multipatch 3D telles que des bâtiments, dont les surplombs et les arcades sont perdus lorsqu'ils sont incrustés dans un MNT.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Lignes de visée : polylignes 3D dont le premier sommet est l'observateur et le dernier la cible."
              },
              "obstructions": {
                "label": "Obstructions",
                "description": "Une ou plusieurs couches d'obstacles 3D séparées par des virgules (MultiPolygones à maillage triangulaire avec Z)."
              },
              "output": {
                "label": "Sortie",
                "description": "Lignes de visée en sortie avec les champs de visibilité ajoutés. Si omises, stockées en mémoire."
              },
              "visible_field": {
                "label": "Champ de visibilité",
                "description": "Nom du champ booléen de visibilité (par défaut 'VISIBLE'), correspondant au paramètre ArcGIS."
              },
              "observer_offset": {
                "label": "Décalage de l'observateur",
                "description": "Hauteur ajoutée à l'extrémité observateur avant le test, dans les unités du SCR (par défaut 0). Modélise la hauteur de l'œil ou de l'instrument."
              },
              "target_offset": {
                "label": "Décalage de la cible",
                "description": "Hauteur ajoutée à l'extrémité cible avant le test, dans les unités du SCR (par défaut 0)."
              },
              "visible_only": {
                "label": "Visibles uniquement",
                "description": "Ne produit que les lignes de visée non obstruées (par défaut faux)."
              }
            }
          },
          "is_closed_3d": {
            "name": "Est fermé en 3D",
            "description": "Signale quelles entités multipatch 3D sont des solides fermés étanches et lesquelles sont des surfaces ouvertes, avec des comptages de diagnostic d'arêtes de bordure non appariées, d'arêtes non-variétés et de cohérence d'orientation (ArcGIS Is Closed 3D). Chaque outil volumétrique du catalogue — union_3d, inside_3d, minimum_bounding_volume, buffer_3d — suppose une entrée fermée et renvoie un nombre sans signification pour un maillage ouvert, et rien ne permet de vérifier ce préalable au préalable.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Entités 3D (MultiPolygones à maillage triangulaire avec Z, tels que produits par buffer_3d, minimum_bounding_volume et voxel_isosurface)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur en sortie : les entités en entrée avec les champs de diagnostic ajoutés. Si omis, stocké en mémoire."
              },
              "closed_only": {
                "label": "Fermés uniquement",
                "description": "Ne produit que les entités qui sont des solides fermés (par défaut faux : chaque entité est produite avec son verdict)."
              }
            }
          },
          "kernel_density_ratio": {
            "name": "Rapport de densité par noyau",
            "description": "Rapport de risque relatif de deux surfaces de densité par noyau : évalue une couche de points numérateur (cas) et une couche de points dénominateur (population à risque) avec le même noyau quartique et une largeur de bande partagée, puis divise cellule par cellule — comme l'outil ArcGIS Calculate Kernel Density Ratio. Un plancher de dénominateur écrit NoData là où la population est trop faible (aucune fuite d'inf/NaN), et une transformation logarithmique naturelle optionnelle rend la sur/sous-représentation symétrique. Le rapport de densité que heat_map, à couche unique, ne peut pas exprimer.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de points du numérateur (p. ex. cas / incidents)."
              },
              "denominator": {
                "label": "Dénominateur",
                "description": "Couche de points du dénominateur (p. ex. population / exposition au risque)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de rapport en sortie. Si omis, stocké en mémoire."
              },
              "weight_field": {
                "label": "Champ de poids",
                "description": "Champ numérique pondérant les points du numérateur (par défaut : chaque point compte pour 1)."
              },
              "denominator_weight_field": {
                "label": "Champ de poids du dénominateur",
                "description": "Champ numérique pondérant les points du dénominateur (par défaut : chaque point compte pour 1)."
              },
              "bandwidth": {
                "label": "Largeur de bande",
                "description": "Largeur de bande du noyau / rayon de recherche commun (mètres pour un SCR géographique, unités du SCR sinon). Par défaut : règle de Silverman calculée sur la dispersion combinée des points."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule en sortie dans les unités du SCR (par défaut : plus grand côté de l'emprise / 200)."
              },
              "log_ratio": {
                "label": "Rapport logarithmique",
                "description": "Si vrai, produit le logarithme népérien du rapport (symétrique autour de 0). Par défaut faux."
              },
              "denominator_floor": {
                "label": "Plancher du dénominateur",
                "description": "Les cellules dont la densité du dénominateur est inférieure à cette valeur (ou nulle) deviennent NoData, évitant les divisions explosives. Par défaut 0 (seul un dénominateur exactement nul est masqué)."
              },
              "epsg": {
                "label": "EPSG",
                "description": "Code EPSG à apposer sur la sortie (par défaut : celui de la couche du numérateur)."
              }
            }
          },
          "kernel_interpolation_with_barriers": {
            "name": "Interpolation par noyau avec barrières",
            "description": "Interpole des observations ponctuelles par un ajustement polynomial pondéré par noyau à fenêtre glissante dans lequel la distance est mesurée comme le plus court chemin CONTOURNANT les barrières absolues plutôt qu'en ligne droite à travers elles (ArcGIS Kernel Interpolation With Barriers). Complète diffusion_interpolation_with_barriers livré, qui résout une équation de la chaleur au lieu d'appliquer un noyau explicite. Tous les autres interpolateurs des deux registres utilisent la distance euclidienne, de sorte qu'ils interpolent tous tout droit à travers les promontoires et les failles.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de points en entrée portant les observations."
              },
              "z_field": {
                "label": "Champ Z",
                "description": "Champ numérique à interpoler."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin optionnel du raster en sortie pour les valeurs prédites. Si omis, stocké en mémoire."
              },
              "output_error": {
                "label": "Erreur en sortie",
                "description": "Chemin optionnel pour le raster de la moyenne quadratique pondérée des résidus locaux — la dispersion pondérée des résidus des voisins autour de l'ajustement local. Il s'agit d'une mesure de qualité d'ajustement, et NON d'une erreur type de prédiction au sens d'ArcGIS (elle ne tient compte ni des degrés de liberté effectifs ni du levier). Si omis, stocké en mémoire (toujours renvoyé)."
              },
              "barriers": {
                "label": "Barrières",
                "description": "Couche de polylignes optionnelle de barrières absolues. Si aucune n'est fournie, l'outil se réduit à une simple interpolation par noyau."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule en sortie dans les unités du SCR. Par défaut, environ 1/100 du plus grand côté de l'emprise."
              },
              "kernel": {
                "label": "Noyau",
                "description": "exponential, gaussian, quartic, epanechnikov, polynomial5 (par défaut) ou constant."
              },
              "bandwidth": {
                "label": "Largeur de bande",
                "description": "Largeur de bande du noyau dans les unités du SCR. Par défaut, une valeur déduite des données à partir de l'espacement moyen entre plus proches voisins."
              },
              "power": {
                "label": "Puissance",
                "description": "Ordre du polynôme local : 0 (moyenne pondérée) ou 1 (par défaut, ajustement planaire)."
              },
              "ridge": {
                "label": "Crête",
                "description": "Paramètre de régularisation ridge stabilisant l'ajustement local par moindres carrés lorsque le voisinage est dégénéré (par défaut 1e-6)."
              },
              "max_neighbors": {
                "label": "Voisins maximaux",
                "description": "Plafond du nombre d'observations contribuant à chaque ajustement local (par défaut 32)."
              }
            }
          },
          "kml_to_features": {
            "name": "KML vers entités",
            "description": "Lit les Placemarks .kml/.kmz en couches de points, de lignes et de polygones avec des attributs de nom/description.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin vers un fichier .kml ou une archive .kmz (un KML compressé)."
              },
              "points_output": {
                "label": "Points en sortie",
                "description": "Chemin optionnel du vecteur de points en sortie (pilote déduit de son extension). Écrit uniquement si le KML contient des repères ponctuels."
              },
              "lines_output": {
                "label": "Lignes en sortie",
                "description": "Chemin optionnel du vecteur de lignes en sortie (pilote déduit de son extension). Écrit uniquement si le KML contient des repères linéaires."
              },
              "polygons_output": {
                "label": "Polygones en sortie",
                "description": "Chemin optionnel du vecteur de polygones en sortie (pilote déduit de son extension). Écrit uniquement si le KML contient des repères surfaciques."
              }
            }
          },
          "landtrendr": {
            "name": "LandTrendr",
            "description": "Segmentation temporelle LandTrendr d'une série d'images annuelle (comme ArcGIS Analyze Changes Using LandTrendr) : suppression des pics, ajustement linéaire par morceaux glouton basé sur les sommets et extraction de la plus grande perturbation (année, magnitude, durée) par pixel. La segmentation de l'historique de changements par pixel que change_vector_analysis (deux dates) et generate_trend_raster (tendance unique) ne peuvent pas faire.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Chemins des rasters annuels séparés par des virgules, dans l'ordre chronologique (p. ex. les sorties NBR de spectral_index ; >= 4)."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster en sortie : année de la plus forte perturbation par pixel. Si omis, stocké en mémoire."
              },
              "years": {
                "label": "Années",
                "description": "Années séparées par des virgules correspondant à 'inputs' (par défaut 0,1,2,...)."
              },
              "magnitude_output": {
                "label": "Sortie de magnitude",
                "description": "Raster optionnel de l'amplitude de la perturbation (variation de l'indice)."
              },
              "duration_output": {
                "label": "Durée en sortie",
                "description": "Raster optionnel de la durée de la perturbation (en années)."
              },
              "direction": {
                "label": "Direction",
                "description": "Sens de la perturbation dans l'indice : 'loss' (une baisse ; par défaut) ou 'gain' (une hausse)."
              },
              "max_segments": {
                "label": "Segments maximaux",
                "description": "Nombre maximal de segments (par défaut 6)."
              },
              "spike_threshold": {
                "label": "Seuil de pic",
                "description": "Intensité du dépiquage 0..1 (fraction de l'étendue de la série ; par défaut 0.75 ; 1 désactive)."
              },
              "min_valid": {
                "label": "Valides minimaux",
                "description": "Nombre minimal d'observations valides par pixel (par défaut 4)."
              },
              "band": {
                "label": "Bande",
                "description": "Bande à lire dans chaque entrée, indexée à partir de 1 (par défaut 1)."
              }
            }
          },
          "las_height_metrics": {
            "name": "Métriques de hauteur LAS",
            "description": "Rasterise des métriques de hauteur de canopée par cellule à partir de hauteurs lidar (comme ArcGIS LAS Height Metrics) : moyenne, écart-type, asymétrie, aplatissement, MAD et percentiles de hauteur sous forme de grille multibande — la suite forestière de moments/percentiles que height_above_ground et lidar_point_stats intégrés n'émettent pas en une seule passe.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Nuage de points LAS/LAZ en entrée de hauteurs au-dessus du sol (normalisez-le au préalable avec height_above_ground)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster multibande en sortie. Si omis, stocké en mémoire."
              },
              "metrics": {
                "label": "Métriques",
                "description": "Sous-ensemble séparé par des virgules parmi mean,std,skewness,kurtosis,mad (par défaut 'mean,std,skewness,kurtosis,mad')."
              },
              "height_percentiles": {
                "label": "Percentiles de hauteur",
                "description": "Percentiles séparés par des virgules dans [0,100], p. ex. '50,95,99' (par défaut '50,95,99' ; vide pour aucun)."
              },
              "min_height": {
                "label": "Hauteur minimale",
                "description": "Exclut les points dont la hauteur est inférieure à cette valeur (seuil sol/bruit). Par défaut 0."
              },
              "min_points": {
                "label": "Points minimaux",
                "description": "Les cellules comptant moins de points valides deviennent NoData. Par défaut 4."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule en sortie dans les unités du SCR. Par défaut 10."
              }
            }
          },
          "less_than_or_equal_to": {
            "name": "InférieurOuÉgalÀ",
            "description": "Teste, cellule par cellule, si le premier raster est inférieur ou égal au second.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Premier raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Second raster en entrée (chaîne de chemin ou objet raster typé)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier raster de sortie optionnel. S'il est omis, la sortie reste en mémoire et est renvoyée sous forme de référence raster memory://."
              }
            }
          },
          "line_density": {
            "name": "Densité de lignes",
            "description": "Densité d'entités linéaires (longueur par unité de surface) dans un voisinage circulaire autour de chaque cellule raster — densité de routes, de cours d'eau ou de failles — en découpant chaque segment de ligne selon le cercle de rayon de recherche (forme fermée) et en divisant la longueur pondérée totale par pi*r^2. Comme l'outil ArcGIS Line Density ; le pendant pour les lignes vectorielles qui manque à heat_map (points uniquement) et edge_density (catégoriel) intégrés.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de polylignes en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de densité en sortie (pilote déduit de l'extension). Si omis, stocké en mémoire."
              },
              "weight_field": {
                "label": "Champ de poids",
                "description": "Champ numérique pondérant chaque ligne (p. ex. voies, trafic, population). Par défaut : chaque ligne a un poids de 1."
              },
              "search_radius": {
                "label": "Rayon de recherche",
                "description": "Rayon du voisinage (mètres pour un SCR géographique, unités du SCR sinon). Par défaut : plus petit côté de l'emprise / 25."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule en sortie (mêmes unités que search_radius). Par défaut : search_radius / 10."
              },
              "area_units": {
                "label": "Unités de surface",
                "description": "Unité de surface des valeurs de densité : 'square_map_units' (par défaut), 'square_meters', 'square_kilometers', 'square_miles' ou 'square_feet'."
              }
            }
          },
          "line_of_sight": {
            "name": "Ligne de visée",
            "description": "Visibilité point à point sur un MNT : pour chaque paire observateur-cible, émet la ligne de visée divisée en segments visibles et obstrués plus un indicateur de cible visible, comme l'outil ArcGIS Line Of Sight.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster d'altitude en entrée (SCR projeté ; distances/hauteurs dans ses unités)."
              },
              "observers": {
                "label": "Observateurs",
                "description": "Couche vectorielle de points d'observation."
              },
              "targets": {
                "label": "Cibles",
                "description": "Couche vectorielle de points cibles."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de la couche vectorielle de lignes en sortie (pilote déduit de l'extension). Si omis, stocké en mémoire."
              },
              "observer_offset": {
                "label": "Décalage de l'observateur",
                "description": "Hauteur de l'observateur au-dessus du sol, dans les unités du MNT (par défaut 1.75)."
              },
              "target_offset": {
                "label": "Décalage de la cible",
                "description": "Hauteur de la cible au-dessus du sol, dans les unités du MNT (par défaut 0)."
              },
              "pair_field": {
                "label": "Champ de paire",
                "description": "Champ optionnel présent sur les deux couches ; les observateurs et les cibles sont appariés lorsque ce champ correspond (au lieu d'un appariement de tous à tous)."
              },
              "band": {
                "label": "Bande",
                "description": "Bande du MNT à échantillonner (par défaut 1)."
              }
            }
          },
          "line_statistics": {
            "name": "Statistiques de lignes",
            "description": "Rasterise une statistique de voisinage d'un attribut linéaire (moyenne, majorité, médiane, min/max, plage, variété ou longueur totale) en découpant chaque segment selon le cercle de rayon de recherche et en pondérant les valeurs par la longueur — comme l'outil ArcGIS Line Statistics ; le complément de surface attributaire de line_density qui manque à la suite intégrée.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de polylignes en entrée."
              },
              "field": {
                "label": "Champ",
                "description": "Champ numérique à synthétiser. Obligatoire pour toutes les statistiques sauf 'length'."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie (pilote déduit de l'extension). Si omis, stocké en mémoire."
              },
              "statistic": {
                "label": "Statistique",
                "description": "'mean' (par défaut), 'majority', 'maximum', 'median', 'minimum', 'minority', 'range', 'variety' ou 'length'."
              },
              "search_radius": {
                "label": "Rayon de recherche",
                "description": "Rayon du voisinage dans les unités du SCR. Par défaut : plus petit côté de l'emprise / 25."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule en sortie dans les unités du SCR. Par défaut : search_radius / 10."
              }
            }
          },
          "local_bivariate_relationships": {
            "name": "Relations bivariées locales",
            "description": "Pour chaque entité, classe la relation entre deux variables dans son voisinage local (non significative, linéaire positive/négative, concave, convexe, indéfinie) à partir d'ajustements locaux linéaires et quadratiques, d'une statistique de dépendance par réduction d'entropie et d'une valeur p de test par permutation avec graine — comme l'outil ArcGIS Local Bivariate Relationships.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points en entrée contenant les deux champs de variables."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur en sortie (une copie de l'entrée avec les champs de relation). Si omis, stocké en mémoire."
              },
              "field1": {
                "label": "Champ 1",
                "description": "Nom du champ de la première variable (explicative)."
              },
              "field2": {
                "label": "Champ 2",
                "description": "Nom du champ de la seconde variable (dépendante)."
              },
              "neighbors": {
                "label": "Voisins",
                "description": "Nombre k de plus proches voisins définissant chaque échantillon local (par défaut 12 ; doit être >= 5)."
              },
              "permutations": {
                "label": "Permutations",
                "description": "Nombre de permutations pour le test de significativité (par défaut 199 ; 0 désactive)."
              },
              "significance": {
                "label": "Significativité",
                "description": "Seuil de pseudo p-valeur pour déclarer une relation significative (par défaut 0.05)."
              },
              "seed": {
                "label": "Graine",
                "description": "Germe du générateur aléatoire des permutations (par défaut 1), pour des résultats reproductibles."
              }
            }
          },
          "local_outlier_analysis": {
            "name": "Analyse locale des valeurs aberrantes",
            "description": "Analyse spatio-temporelle des valeurs aberrantes locales (I de Moran local d'Anselin sur un cube spatio-temporel H3) : classe chaque cellule x intervalle de temps comme grappe Haut-Haut/Bas-Bas ou valeur aberrante Haut-Bas/Bas-Haut avec une valeur p de permutation avec graine, puis résume par cellule dans le temps — comme l'outil ArcGIS Local Outlier Analysis. L'extension spatio-temporelle de local_morans_i_lisa intégré, purement spatial.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de points en entrée d'événements horodatés (lon/lat)."
              },
              "time_field": {
                "label": "Champ de temps",
                "description": "Champ contenant l'heure de chaque point : un nombre ou un horodatage ISO-8601."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche de synthèse en sortie de polygones H3. Si omise, stockée en mémoire."
              },
              "value_field": {
                "label": "Champ de valeur",
                "description": "Champ numérique à agréger par cellule (par défaut : nombre de points)."
              },
              "time_step": {
                "label": "Pas de temps",
                "description": "Largeur d'un pas de temps dans les unités de time_field (par défaut 1)."
              },
              "resolution": {
                "label": "Résolution",
                "description": "Résolution H3 de 0 à 15 (par défaut 7)."
              },
              "kring": {
                "label": "Anneau K",
                "description": "Rayon du voisinage spatial en anneaux k (par défaut 1)."
              },
              "time_window": {
                "label": "Fenêtre temporelle",
                "description": "Demi-largeur du voisinage temporel en pas (par défaut 1)."
              },
              "permutations": {
                "label": "Permutations",
                "description": "Nombre de permutations pour le test de significativité (par défaut 99 ; 0 désactive)."
              },
              "seed": {
                "label": "Graine",
                "description": "Germe du générateur aléatoire des permutations (par défaut 1)."
              }
            }
          },
          "local_polynomial_interpolation": {
            "name": "Interpolation polynomiale locale",
            "description": "Ajuste un polynôme d'ordre 1/2/3 dans un voisinage glissant pondéré par noyau en chaque cellule, produisant une surface de prédiction, une surface d'erreur standard de prédiction ou une surface de nombre de conditionnement. Contrairement à trend_surface intégré, global, le polynôme est réajusté localement. Comme l'outil ArcGIS Local Polynomial Interpolation.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Entités ponctuelles en entrée portant la valeur à interpoler."
              },
              "z_field": {
                "label": "Champ Z",
                "description": "Champ numérique contenant la valeur à interpoler."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie. Si omis, stocké en mémoire."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule en sortie en unités carte (par défaut : emprise en entrée / 200)."
              },
              "order": {
                "label": "Ordre",
                "description": "Ordre du polynôme : 1 (par défaut), 2 ou 3."
              },
              "kernel": {
                "label": "Noyau",
                "description": "'exponential' (par défaut), 'gaussian', 'quartic', 'epanechnikov', 'fifth_order' ou 'constant'."
              },
              "bandwidth": {
                "label": "Largeur de bande",
                "description": "Largeur de bande fixe du noyau en unités carte. Si omise, une largeur de bande adaptative est utilisée : la distance au 'neighbors'-ième échantillon le plus proche."
              },
              "neighbors": {
                "label": "Voisins",
                "description": "Nombre d'échantillons par ajustement local pour la largeur de bande adaptative (par défaut : 3 fois le nombre de termes du polynôme)."
              },
              "weight_field": {
                "label": "Champ de poids",
                "description": "Champ optionnel de poids de mesure par observation."
              },
              "condition_number": {
                "label": "Nombre de conditionnement",
                "description": "Refuse de prédire là où le conditionnement de la matrice de conception locale dépasse ce seuil (par défaut : aucune limite)."
              },
              "output_type": {
                "label": "Type de sortie",
                "description": "'prediction' (par défaut), 'standard_error' ou 'condition_number'."
              },
              "epsg": {
                "label": "EPSG",
                "description": "Code EPSG apposé sur le raster en sortie (par défaut : le SCR de la couche en entrée)."
              }
            }
          },
          "locate_lines_along_routes": {
            "name": "Localiser des lignes le long des routes",
            "description": "Superpose des entités linéaires ou polygonales sur des itinéraires mesurés pour produire des événements linéaires de mesure de début/fin (RID, FMEAS, TMEAS), comme l'outil ArcGIS Locate Features Along Routes (événements linéaires/polygonaux).",
            "params": {
              "input_features": {
                "label": "Entités d'entrée",
                "description": "Couche vectorielle de lignes ou de polygones en entrée à localiser le long des itinéraires."
              },
              "routes": {
                "label": "Itinéraires",
                "description": "Couche vectorielle d'itinéraires (lignes) fournissant les mesures de référencement linéaire."
              },
              "route_id_field": {
                "label": "Champ d'identifiant d'itinéraire",
                "description": "Champ de la couche d'itinéraires contenant l'identifiant de chaque itinéraire (RID). Si omis, l'index de l'entité de l'itinéraire, à partir de 0, est utilisé."
              },
              "tolerance": {
                "label": "Tolérance",
                "description": "Rayon de recherche dans les unités du SCR. Un sommet d'entité situé à moins de cette distance d'un itinéraire est considéré comme coïncident. Obligatoire (> 0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur d'événements linéaires en sortie (pilote déduit de l'extension). Si omis, le résultat est stocké en mémoire."
              }
            }
          },
          "locate_regions": {
            "name": "Localiser des régions",
            "description": "Trouve la ou les meilleures régions contiguës d'une surface cible à partir d'un raster d'aptitude (comme ArcGIS Locate Regions) : croissance de région « meilleur d'abord » à partir des pics d'aptitude avec un contrôle de forme/compacité et un espacement inter-régions — l'étape de localisation qui transforme une surface fuzzy_overlay/weighted_overlay en régions réelles, ce que clump et le seuillage ne peuvent pas faire.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster d'aptitude (valeur plus élevée = plus apte)."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster en sortie des identifiants de régions, indexés à partir de 1 (NoData ailleurs). Si omis, stocké en mémoire."
              },
              "total_area": {
                "label": "Surface totale",
                "description": "Surface cible totale sur l'ensemble des régions, en unités de surface du SCR (par défaut : 5 % de la surface valide)."
              },
              "num_regions": {
                "label": "Nombre de régions",
                "description": "Nombre de régions à localiser (par défaut 1). Chacune vise total_area / num_regions."
              },
              "shape": {
                "label": "Forme",
                "description": "Poids de compacité 0..1 : 0 = aptitude pure, 1 = favorise fortement les régions arrondies (par défaut 0.3)."
              },
              "min_distance": {
                "label": "Distance minimale",
                "description": "Distance minimale entre les régions, dans les unités du SCR (par défaut 0)."
              },
              "band": {
                "label": "Bande",
                "description": "Bande à lire, indexée à partir de 1 (par défaut 1)."
              }
            }
          },
          "matched_filter_target_detection": {
            "name": "Détection de cibles par filtrage adapté (CEM/ACE)",
            "description": "Évalue chaque pixel d'une image multibande par rapport à un spectre cible connu en utilisant les statistiques de la scène pour supprimer le fond — Constrained Energy Minimization (CEM) ou Adaptive Coherence Estimator (ACE) — avec un masque de seuil par percentile optionnel, comme l'outil ArcGIS Detect Target Using Spectra.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster multibande en entrée (2 bandes ou plus)."
              },
              "target_spectrum": {
                "label": "Spectre cible",
                "description": "Spectre cible : une valeur par bande, sous forme de tableau JSON ou de liste séparée par des virgules ou des espaces (la longueur doit être égale au nombre de bandes)."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster en sortie des scores de détection (F32). Si omis, stocké en mémoire."
              },
              "method": {
                "label": "Méthode",
                "description": "'cem' (Constrained Energy Minimization, par défaut) ou 'ace' (Adaptive Coherence Estimator, scores dans 0..1)."
              },
              "threshold": {
                "label": "Seuil",
                "description": "Percentile optionnel (0-100) de la distribution des scores au-delà duquel un masque de détection binaire est écrit."
              },
              "mask_output": {
                "label": "Masque en sortie",
                "description": "Chemin de sortie du masque de détection binaire (nécessite 'threshold'). S'il est omis alors qu'un seuil est fourni, le résultat est stocké en mémoire."
              }
            }
          },
          "maximum_likelihood_classification": {
            "name": "Classification par maximum de vraisemblance",
            "description": "Classificateur supervisé gaussien par maximum de vraisemblance : modélise chaque classe d'entraînement comme une normale multivariée (moyenne + covariance par classe), classe chaque pixel d'une image multibande selon la plus grande log-vraisemblance gaussienne avec des poids a priori optionnels égaux/par échantillon, et peut émettre un raster de probabilité/confiance par pixel et rejeter les cellules les moins confiantes, comme l'outil ArcGIS Maximum Likelihood Classification.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster multibande à classer en entrée (au moins 1 bande ; chaque bande est une caractéristique)."
              },
              "training": {
                "label": "Entraînement",
                "description": "Raster d'apprentissage à étiquettes entières sur la même grille que 'input' : chaque entier positif distinct est une classe ; les cellules NoData, non positives ou non finies ne sont pas étiquetées."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster classé en sortie portant les identifiants de classe d'apprentissage. S'il est omis, stocké en mémoire."
              },
              "prob_output": {
                "label": "Probabilité en sortie",
                "description": "Raster F32 optionnel en sortie de la probabilité a posteriori (confiance) de la classe gagnante, dans [0,1]."
              },
              "a_priori": {
                "label": "A priori",
                "description": "Poids a priori des classes : 'equal' (par défaut, 1/K) ou 'sample' (proportionnel au nombre de pixels d'apprentissage de chaque classe)."
              },
              "reject_fraction": {
                "label": "Fraction de rejet",
                "description": "Fraction dans [0,1) des cellules classées les moins fiables à laisser non classées (NoData). Par défaut 0."
              }
            }
          },
          "median_center": {
            "name": "Centre médian",
            "description": "La médiane géométrique (point de Weiszfeld qui minimise la somme, éventuellement pondérée, des distances euclidiennes à tous les points d'entrée) — un point central robuste par groupe de cas, avec des attributs de médiane par champ optionnels (ArcGIS Median Center).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de sortie (pilote déduit de l'extension). Si omis, le résultat est stocké en mémoire."
              },
              "weight_field": {
                "label": "Champ de poids",
                "description": "Champ numérique optionnel pondérant l'influence de chaque point sur la médiane."
              },
              "case_field": {
                "label": "Champ de cas",
                "description": "Champ optionnel de regroupement des points ; une médiane par valeur distincte."
              },
              "attribute_fields": {
                "label": "Champs d'attribut",
                "description": "Champs numériques optionnels séparés par des virgules ; la médiane par groupe de chacun est ajoutée sous '<field>_med'."
              }
            }
          },
          "merge_divided_roads": {
            "name": "Fusionner les routes séparées",
            "description": "Remplace les paires appariées de voies de routes séparées par des lignes centrales uniques en préservant la connectivité des intersections, en n'appariant que les voies qui partagent un champ de fusion et sont antiparallèles à moins d'une distance de séparation, et en émettant des polygones de déplacement pour propagate_displacement. Comme l'outil ArcGIS Merge Divided Roads.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Entités d'axe médian de routes."
              },
              "merge_field": {
                "label": "Champ de fusion",
                "description": "Champ dont la concordance des valeurs fait de deux lignes une paire candidate de chaussées (par exemple le nom ou la classe de la route)."
              },
              "merge_distance": {
                "label": "Distance de fusion",
                "description": "Écart maximal entre chaussées appariées, en unités carte."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de l'axe fusionné en sortie. S'il est omis, stocké en mémoire."
              },
              "output_displacement_features": {
                "label": "Entités de déplacement en sortie",
                "description": "Polygones optionnels indiquant où la géométrie s'est déplacée, pour propagate_displacement."
              },
              "character_field": {
                "label": "Champ de caractère",
                "description": "Champ optionnel ; les entités dont la valeur est non nulle ou non vide sont exclues de la fusion."
              },
              "output_table": {
                "label": "Table en sortie",
                "description": "Table de traçabilité optionnelle reliant les entités en sortie à leurs entités sources."
              }
            }
          },
          "merge_lines_by_pseudo_node": {
            "name": "Fusionner les lignes par pseudo-nœud",
            "description": "Fusionne les chaînes de segments de lignes qui se rejoignent en pseudo-nœuds de degré 2 en polylignes uniques, en préservant les vraies intersections et (en option) les ruptures d'attributs.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier vectoriel de lignes en entrée, format détecté automatiquement (ou référence en mémoire)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel (pilote selon son extension). S'il est omis, stocké en mémoire."
              },
              "dissolve_fields": {
                "label": "Champs de fusion",
                "description": "Noms de champs attributaires séparés par des virgules ; deux segments ne sont fusionnés que s'ils concordent sur tous ces champs. S'ils sont omis, les segments sont fusionnés à chaque nœud de degré 2, quels que soient les attributs."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Les extrémités situées à moins de cette distance (unités du SCR) sont considérées comme le même nœud. Par défaut 1e-6."
              }
            }
          },
          "merge_multidimensional_rasters": {
            "name": "Fusionner des rasters multidimensionnels",
            "description": "Joint plusieurs cubes raster co-enregistrés en un seul, ordonnés par coordonnée de dimension, en résolvant les coordonnées dupliquées par cellule (ArcGIS Merge Multidimensional Rasters). aggregate_multidimensional_raster réduit un cube et composite_bands empile des rasters monobandes en bandes, mais rien ne joignait des cubes le long de leur dimension partagée.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Chemins des cubes (rasters multibandes) séparés par des virgules ou des points-virgules. Au moins deux."
              },
              "dimension_values": {
                "label": "Valeurs de dimension",
                "description": "Coordonnées optionnelles par tranche couvrant chaque tranche de chaque entrée, dans l'ordre des entrées. Elles n'ont besoin d'être ni triées ni uniques — c'est précisément ce que cet outil résout. Sans elles, les entrées sont concaténées dans l'ordre indiqué."
              },
              "dimension": {
                "label": "Dimension",
                "description": "Nom de la dimension, utilisé uniquement dans le rapport (par défaut 'slice')."
              },
              "resolve_overlap": {
                "label": "Résoudre les chevauchements",
                "description": "Règle en cas de coordonnées dupliquées : 'first' (par défaut), 'last', 'mean', 'min', 'max' ou 'error'."
              },
              "tolerance": {
                "label": "Tolérance",
                "description": "Tolérance relative pour considérer deux coordonnées comme égales (par défaut 1e-9)."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster cube en sortie, une bande par tranche fusionnée, dans l'ordre de la dimension. S'il est omis, stocké en mémoire."
              }
            }
          },
          "mgwr": {
            "name": "Régression géographiquement pondérée multi-échelle",
            "description": "GWR où chaque terme explicatif reçoit sa propre largeur de bande par rétro-ajustement AICc (MGWR) : coefficients par entité, R² local, résidus, nombre de conditionnement, plus la largeur de bande optimale de chaque terme avec une interprétation locale/régionale/globale et des diagnostics globaux AICc / R².",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche d'entités en entrée (points, ou autres géométries via leur point représentatif)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel (pilote selon son extension). S'il est omis, stocké en mémoire."
              },
              "dependent_field": {
                "label": "Champ dépendant",
                "description": "Champ numérique dépendant (réponse)."
              },
              "explanatory_fields": {
                "label": "Champs explicatifs",
                "description": "Champ(s) numérique(s) explicatif(s) séparés par des virgules, chacun ajusté avec sa propre largeur de bande."
              },
              "kernel": {
                "label": "Noyau",
                "description": "Noyau de décroissance avec la distance : 'gaussian' (par défaut) ou 'bisquare'."
              },
              "bandwidth_type": {
                "label": "Type de largeur de bande",
                "description": "'adaptive' (par défaut ; largeur de bande = k plus proches voisins) ou 'fixed' (largeur de bande = une distance). S'applique à la recherche de largeur de bande propre à chaque terme."
              },
              "tolerance": {
                "label": "Tolérance",
                "description": "Tolérance de convergence du rétro-ajustement : arrêt lorsque la variation relative de la somme des carrés des résidus entre deux passes descend sous cette valeur (par défaut 0.001)."
              },
              "max_iterations": {
                "label": "Itérations maximales",
                "description": "Nombre maximal de passes de rétro-ajustement sur l'ensemble des termes (par défaut 30)."
              }
            }
          },
          "minimum_bounding_volume": {
            "name": "Volume englobant minimal",
            "description": "Calcule le volume englobant minimal (enveloppe convexe, sphère ou enveloppe) autour d'entités 3D, par entité, par groupe ou sur toute l'entrée, en émettant le solide sous forme de faces triangulaires à valeurs Z avec des attributs de volume et de surface. Comme l'outil ArcGIS Minimum Bounding Volume.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Entités 3D de type point, multipoint ou ligne en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie des faces du volume. S'il est omis, stocké en mémoire."
              },
              "z_value": {
                "label": "Valeur Z",
                "description": "'geometry' (par défaut) pour prendre le Z de la géométrie, ou le nom d'un champ numérique fournissant le Z."
              },
              "geometry_type": {
                "label": "Type de géométrie",
                "description": "'convex_hull' (par défaut), 'sphere' ou 'envelope'. ('concave_hull' n'est pas implémenté dans cette version.)"
              },
              "group_option": {
                "label": "Option de regroupement",
                "description": "'none' (un volume par entité, par défaut), 'all' (un seul volume couvrant toute l'entrée) ou 'list' (un par valeur de 'group_field')."
              },
              "group_field": {
                "label": "Champ de regroupement",
                "description": "Champ définissant les groupes lorsque 'group_option' vaut 'list'."
              },
              "mbv_fields": {
                "label": "Champs MBV",
                "description": "Ajouter les champs MBV_VOLUME et MBV_AREA (par défaut false)."
              }
            }
          },
          "multicriteria_overlay": {
            "name": "Superposition multicritère",
            "description": "Combine une pile de rasters de critères en une seule surface d'aptitude par AMCD basée sur les rangs : weighted_sum, weighted_geometric_mean, OWA (moyenne pondérée ordonnée) ou TOPSIS (proximité au point idéal), avec des poids par raster et une remise à l'échelle from_scale/to_scale, comme l'outil ArcGIS Multicriteria Overlay.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Liste, séparée par des virgules, d'au moins 2 rasters de critères co-enregistrés (valeur plus élevée = plus apte ; chacun est remis à l'échelle min-max sur 0..1 avant combinaison)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie. Si omis, le résultat est stocké en mémoire."
              },
              "method": {
                "label": "Méthode",
                "description": "Méthode de combinaison : 'weighted_sum' (par défaut), 'weighted_geometric_mean', 'owa', 'topsis'."
              },
              "weights": {
                "label": "Poids",
                "description": "Poids d'importance par raster séparés par des virgules, un par entrée (par défaut égaux). Normalisés pour que leur somme soit 1."
              },
              "order_weights": {
                "label": "Poids d'ordre",
                "description": "OWA uniquement : poids d'ordre séparés par des virgules, un par entrée, appliqués aux critères triés du plus élevé au plus faible dans chaque cellule (par défaut égaux, ce qui rend OWA identique à la moyenne pondérée). Normalisés pour que leur somme soit 1."
              },
              "from_scale": {
                "label": "Échelle de départ",
                "description": "Borne inférieure de l'échelle d'évaluation en sortie (par défaut 0)."
              },
              "to_scale": {
                "label": "Échelle d'arrivée",
                "description": "Borne supérieure de l'échelle d'évaluation en sortie (par défaut 1)."
              }
            }
          },
          "multidimensional_anomaly": {
            "name": "Générer une anomalie multidimensionnelle",
            "description": "Cube d'anomalies temporelles par tranche à partir d'une pile temporelle de rasters (comme ArcGIS Generate Multidimensional Anomaly) : pour chaque pixel, calcule une référence temporelle (moyenne/écart-type ou médiane le long de la dimension des tranches) et réécrit chaque tranche temporelle comme son écart à cette référence — différence à la moyenne, pourcentage de la moyenne, score z ou différence à la médiane — en émettant une pile d'anomalies avec une tranche par tranche d'entrée.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Un raster multibande (chaque bande est une tranche temporelle) ou une liste, séparée par des virgules, de rasters co-enregistrés, dans l'ordre chronologique."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster d'anomalies multibande en sortie (une bande par tranche en entrée). S'il est omis, stocké en mémoire."
              },
              "method": {
                "label": "Méthode",
                "description": "Calcul de l'anomalie : 'difference_from_mean' (par défaut), 'percent_of_mean', 'z_score' ou 'difference_from_median'."
              },
              "reference_range": {
                "label": "Plage de référence",
                "description": "Plage de tranches optionnelle 'start-end', inclusive et indexée à partir de 1, utilisée pour calculer la référence par pixel (par défaut : toutes les tranches)."
              },
              "min_valid": {
                "label": "Valides minimaux",
                "description": "Nombre minimal d'observations non NoData par pixel à l'intérieur de la plage de référence (par défaut 1) ; en dessous, le pixel est NoData."
              }
            }
          },
          "multidimensional_principal_components": {
            "name": "Composantes principales multidimensionnelles",
            "description": "Décompose un cube raster en les quelques modes réels sous-jacents à une longue série temporelle, en émettant des rasters de composantes, des saturations et des valeurs propres, sous forme de réduction de dimension ou de réduction spatiale (ArcGIS Multidimensional Principal Components). principal_component_analysis intégré décompose l'espace des bandes au sein d'une scène, ses composantes mélangent donc les bandes spectrales plutôt que le temps ; dimension_reduction travaille sur des tables attributaires vectorielles. Les deux réductions proviennent d'une seule covariance dans l'espace des tranches, puisque l'équivalent dans l'espace des pixels serait une matrice carrée de millions de lignes.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Un raster multibande (chaque bande est une tranche) ou une liste de rasters co-enregistrés séparés par des virgules."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster multibande en sortie : scores des composantes pour 'dimension_reduction', saturations des composantes pour 'spatial_reduction'. S'il est omis, stocké en mémoire."
              },
              "output_loadings": {
                "label": "Saturations en sortie",
                "description": "Table en sortie des saturations par tranche (ou des séries de composantes par tranche en mode 'spatial_reduction'). Toujours produite ; stockée en mémoire si aucun chemin n'est fourni."
              },
              "output_eigenvalues": {
                "label": "Valeurs propres en sortie",
                "description": "Table en sortie des valeurs propres et de la variance expliquée par chacune. Toujours produite ; stockée en mémoire si aucun chemin n'est fourni."
              },
              "mode": {
                "label": "Mode",
                "description": "'dimension_reduction' (par défaut ; les composantes sont des motifs spatiaux) ou 'spatial_reduction' (les composantes sont des séries le long de la dimension)."
              },
              "dimension": {
                "label": "Dimension",
                "description": "Nom de la dimension, utilisé uniquement dans le rapport (par défaut 'slice')."
              },
              "dimension_values": {
                "label": "Valeurs de dimension",
                "description": "Coordonnée de chaque tranche, séparée par des virgules, strictement croissante. Par défaut, l'indice de tranche à partir de 1."
              },
              "number_of_pc": {
                "label": "Nombre de composantes principales",
                "description": "Nombre de composantes à conserver (par défaut : toutes les tranches)."
              },
              "correlation": {
                "label": "Corrélation",
                "description": "Décomposer la matrice de corrélation au lieu de la covariance (par défaut false). À utiliser lorsque les tranches sont à des échelles différentes."
              }
            }
          },
          "multidimensional_raster_correlation": {
            "name": "Corrélation de rasters multidimensionnels",
            "description": "Corrèle deux cubes raster cellule par cellule le long de leur dimension partagée, produisant une carte de coefficients de Pearson, Spearman ou Kendall et — en mode corrélation croisée — le décalage auquel l'association de chaque cellule culmine (ArcGIS Multidimensional Raster Correlation). Rien dans les deux registres ne cartographie cela : image_correlation réduit une paire d'images à un seul scalaire, time_series_cross_correlation de la série 17 est limité aux vecteurs, attribute_correlation est une opération sur table, et bivariate_spatial_association compare deux rasters monobandes sans axe temporel.",
            "params": {
              "input1": {
                "label": "Entrée 1",
                "description": "Premier cube : un raster multibande (chaque bande est une tranche) ou une liste, séparée par des virgules, de rasters co-enregistrés."
              },
              "input2": {
                "label": "Entrée 2",
                "description": "Second cube, co-enregistré avec le premier et comportant le même nombre de tranches."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster de corrélation en sortie, dans [-1, 1]. S'il est omis, stocké en mémoire."
              },
              "output_lag": {
                "label": "Décalage en sortie",
                "description": "Raster en sortie du meilleur décalage par cellule (mode corrélation croisée) ; le décalage fixe partout sinon. Toujours produit ; stocké en mémoire si aucun chemin n'est fourni."
              },
              "output_count": {
                "label": "Comptage en sortie",
                "description": "Raster en sortie du nombre d'échantillons appariés à l'origine de chaque coefficient. Toujours produit ; stocké en mémoire si aucun chemin n'est fourni."
              },
              "method": {
                "label": "Méthode",
                "description": "'pearson' (par défaut), 'spearman' ou 'kendall'."
              },
              "lag": {
                "label": "Décalage",
                "description": "Nombre fixe de tranches dont décaler le second cube vers l'avant avant appariement (par défaut 0). Ignoré en mode corrélation croisée."
              },
              "cross_correlation": {
                "label": "Corrélation croisée",
                "description": "Rechercher tous les décalages dans -max_lag..=max_lag et conserver le coefficient le plus fort (par défaut false)."
              },
              "max_lag": {
                "label": "Décalage maximal",
                "description": "Demi-largeur de la recherche de décalage, en tranches (par défaut 3). Mode corrélation croisée uniquement."
              },
              "use_absolute": {
                "label": "Utiliser la valeur absolue",
                "description": "En mode corrélation croisée, classer les décalages par corrélation absolue afin qu'une forte association négative l'emporte (par défaut true)."
              },
              "min_valid": {
                "label": "Valides minimaux",
                "description": "Nombre minimal d'échantillons appariés avant l'écriture d'un coefficient (par défaut 3)."
              }
            }
          },
          "multilook": {
            "name": "Multi-visée",
            "description": "Réduit le chatoiement SAR en moyennant de façon incohérente les vues adjacentes en distance et en azimut, produisant une imagerie d'intensité à pixels carrés (ArcGIS Multilook). Aucun registre ne livre d'outil SAR ; la famille lee_filter intégrée opère sur une intensité déjà détectée, celui-ci fournit donc l'étape amont qui transforme des données complexes à vue unique en l'imagerie détectée attendue par ces filtres. L'entrée complexe est lue comme une paire I/Q à deux bandes ; la détection a lieu avant le moyennage, et le nombre équivalent de vues est rapporté pour le filtrage de chatoiement en aval.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster SAR en entrée : une paire I/Q à deux bandes pour des données complexes (SLC), ou une bande unique de données déjà détectées (voir 'input_domain')."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              },
              "input_domain": {
                "label": "Domaine d'entrée",
                "description": "Pour une entrée non complexe, ce que contient déjà la bande 1 : 'intensity' (par défaut) ou 'amplitude'. L'amplitude est élevée au carré pour donner l'intensité avant moyennage, car le moyennage incohérent n'est correct que dans le domaine de l'intensité."
              },
              "complex": {
                "label": "Complexe",
                "description": "Traiter l'entrée comme une paire I/Q complexe (par défaut : true lorsque le raster comporte 2 bandes ou plus, false sinon)."
              },
              "range_looks": {
                "label": "Vues en distance",
                "description": "Nombre de vues en distance (x). Par défaut 1, ou dérivé lorsque auto_looks est activé."
              },
              "azimuth_looks": {
                "label": "Vues en azimut",
                "description": "Nombre de vues en azimut (y). Par défaut 1, ou dérivé lorsque auto_looks est activé."
              },
              "auto_looks": {
                "label": "Vues automatiques",
                "description": "Si vrai (par défaut) et que les vues ne sont pas indiquées explicitement, les dériver du rapport des pas de pixel afin que les pixels au sol en sortie soient approximativement carrés."
              },
              "output_units": {
                "label": "Unités de sortie",
                "description": "amplitude, intensity (par défaut) ou db."
              },
              "statistic": {
                "label": "Statistique",
                "description": "mean (par défaut) ou median ; la médiane est plus robuste là où de forts diffuseurs dominent la fenêtre de vue."
              }
            }
          },
          "multipatch_footprint": {
            "name": "Emprise de multipatch",
            "description": "Projette des entités multipatch 3D sur le plan XY et les fusionne en polygones d'emprise 2D, un par entité ou par champ de regroupement (ArcGIS Multipatch Footprint). layer_footprint_vector renvoie un seul rectangle d'emprise pour toute une couche, pas des contours par entité, il n'y a donc actuellement aucun moyen d'alimenter la chaîne regularize_building_footprints avec buffer_3d / voxel_isosurface / des solides de bâtiments importés.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Entités multipatch 3D (MultiPolygones à maillage triangulaire avec Z)."
              },
              "output": {
                "label": "Sortie",
                "description": "Emprises au sol polygonales 2D en sortie. S'il est omis, stocké en mémoire."
              },
              "group_field": {
                "label": "Champ de regroupement",
                "description": "Champ optionnel dont les valeurs fusionnent les emprises entre elles (un polygone en sortie par valeur distincte). Par défaut : une sortie par entité en entrée."
              },
              "simplify_tolerance": {
                "label": "Tolérance de simplification",
                "description": "Tolérance de Douglas-Peucker optionnelle (unités du SCR) appliquée à l'emprise fusionnée. Omise par défaut afin de préserver le contour brut pour regularize_building_footprints."
              }
            }
          },
          "multipatch_to_mesh": {
            "name": "Multipatch vers maillage",
            "description": "Exporte la géométrie multipatch et des solides 3D vers OBJ ou glTF 2.0 / GLB pour tout visualiseur 3D ou web (ArcGIS Multipatch To Collada). La suite union_3d / difference_3d / enclose_multipatch / voxel_isosurface n'avait aucune voie d'export — aucun format de maillage n'existait dans le registre — de sorte que les résultats 3D ne pouvaient être relus que par ce catalogue.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de polygones multipatch / 3D."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier .glb, .gltf ou .obj en sortie. L'extension détermine le format sauf si 'format' est indiqué."
              },
              "format": {
                "label": "Format",
                "description": "'glb' (par défaut pour .glb), 'gltf' (JSON avec un tampon base64 intégré) ou 'obj'. Déduit par défaut de l'extension de sortie."
              },
              "origin": {
                "label": "Origine",
                "description": "Translation vers une origine locale : 'centroid' (par défaut), 'min_corner' ou 'none'. Nécessaire à la précision — les positions glTF sont des flottants 32 bits."
              },
              "y_up": {
                "label": "Y vers le haut",
                "description": "Passer à la convention Y vers le haut du glTF depuis la convention géospatiale Z vers le haut (par défaut true pour glTF/GLB, false pour OBJ)."
              },
              "name_field": {
                "label": "Champ de nom",
                "description": "Attribut nommant le maillage de chaque entité dans la sortie."
              }
            }
          },
          "multiple_ring_buffer": {
            "name": "Zones tampons multiples",
            "description": "Crée des tampons autour des entités à une liste de distances en bandes concentriques — disques emboîtés ou anneaux non chevauchants — éventuellement fusionnés par distance, avec la distance de bande stockée en attribut.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée (points, lignes ou polygones), format détecté automatiquement (ou référence en mémoire)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel (pilote selon son extension). S'il est omis, stocké en mémoire."
              },
              "distances": {
                "label": "Distances",
                "description": "Liste, séparée par des virgules, de distances de tampon en unités du SCR, par exemple \"100,250,500\". Triées par ordre croissant ; les doublons et les valeurs non positives sont supprimés."
              },
              "ring_type": {
                "label": "Type d'anneau",
                "description": "'rings' (par défaut) pour des anneaux disjoints en couronne, ou 'disks' pour des tampons cumulés emboîtés."
              },
              "dissolve": {
                "label": "Dissoudre",
                "description": "'none' (par défaut) conserve un anneau par entité source ; 'per_ring' fusionne les anneaux de toutes les entités à chaque distance en un seul polygone."
              },
              "distance_field": {
                "label": "Champ de distance",
                "description": "Nom de l'attribut de sortie contenant la distance de chaque anneau. Par défaut 'distance'."
              }
            }
          },
          "multitemporal_coherence": {
            "name": "Cohérence multitemporelle",
            "description": "Calcule la cohérence interférométrique sur une pile d'acquisitions SAR co-enregistrées et la réduit en moyenne/min/max/écart-type et en pente de décorrélation temporelle, en émettant éventuellement le cube de cohérence par paire (ArcGIS Generate Multitemporal Coherence). sar_coherence gère exactement deux scènes, de sorte que la sélection de diffuseurs persistants et la datation des changements de cohérence étaient hors de portée.",
            "params": {
              "inputs": {
                "label": "Entrées",
                "description": "Rasters SLC complexes co-enregistrés, séparés par des virgules ou des points-virgules (deux bandes chacun : I puis Q). Au moins deux."
              },
              "dates": {
                "label": "Dates",
                "description": "Dates d'acquisition optionnelles, une par entrée, sous forme de nombres dans des unités cohérentes (par exemple des jours). Requises par la statistique 'decorrelation_slope'."
              },
              "pairs": {
                "label": "Paires",
                "description": "'consecutive' (par défaut, i avec i+1), 'all' (toutes les paires non ordonnées) ou 'reference' (chaque scène par rapport à reference_index)."
              },
              "reference_index": {
                "label": "Indice de référence",
                "description": "Indice (à partir de 0) de la scène de référence pour pairs='reference' (par défaut 0)."
              },
              "window_size": {
                "label": "Taille de fenêtre",
                "description": "Fenêtre d'estimation en cellules ; une valeur unique ou 'range,azimuth' (par défaut 5). Les valeurs paires sont arrondies à l'impair supérieur."
              },
              "bias_correction": {
                "label": "Correction de biais",
                "description": "Appliquer la correction du biais de cohérence pour petits échantillons (par défaut true)."
              },
              "statistics": {
                "label": "Statistiques",
                "description": "Séparées par des virgules : 'mean' (par défaut), 'min', 'max', 'std', 'decorrelation_slope'. Une bande de sortie par statistique, dans cet ordre."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster en sortie, une bande par statistique demandée. S'il est omis, stocké en mémoire."
              },
              "output_pairs": {
                "label": "Paires en sortie",
                "description": "Raster optionnel recevant le cube de cohérence par paire, une bande par paire."
              }
            }
          },
          "multivariate_clustering": {
            "name": "Classification multivariée",
            "description": "Regroupe des entités vectorielles selon la similarité de leurs valeurs d'attributs standardisées (k-moyennes ou k-médoïdes avec graine), en choisissant automatiquement le nombre de grappes par le pseudo-F de Calinski-Harabasz s'il n'est pas fourni, comme l'outil ArcGIS Multivariate Clustering.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée, format détecté automatiquement (ou référence en mémoire)."
              },
              "fields": {
                "label": "Champs",
                "description": "Champs numériques d'analyse séparés par des virgules (espace attributaire sur lequel effectuer le regroupement)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie (une copie de l'entrée avec cluster_id/silhouette). S'il est omis, stocké en mémoire."
              },
              "num_clusters": {
                "label": "Nombre de grappes",
                "description": "Nombre de grappes k. Omettre ou indiquer 0 pour évaluer automatiquement k = 2..15 par le pseudo-F de Calinski-Harabasz."
              },
              "method": {
                "label": "Méthode",
                "description": "Méthode de regroupement : 'kmeans' (par défaut) ou 'kmedoids' (PAM ; adapté à de plus faibles nombres d'entités)."
              },
              "seed": {
                "label": "Graine",
                "description": "Graine aléatoire pour une initialisation déterministe k-means++ / des médoïdes (par défaut 1)."
              }
            }
          },
          "near_3d": {
            "name": "Proximité 3D",
            "description": "Trouve l'entité la plus proche en vraie distance 3D, en rapportant la distance, l'emplacement le plus proche, les angles et les écarts par axe, comme l'outil ArcGIS Near 3D.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche d'entités en entrée (sommets 3D ; un Z manquant est traité comme 0)."
              },
              "near_features": {
                "label": "Entités proches",
                "description": "Liste, séparée par des virgules, des couches dans lesquelles rechercher. Omettre pour joindre la couche d'entrée avec elle-même."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. Si omis, le résultat est stocké en mémoire."
              },
              "search_radius": {
                "label": "Rayon de recherche",
                "description": "Ne considérer que les entités proches situées dans cette distance 3D (unités carte). Illimitée si omise."
              },
              "location": {
                "label": "Emplacement",
                "description": "Ajouter les coordonnées du point le plus proche sous la forme near_x / near_y / near_z (par défaut false)."
              },
              "angle": {
                "label": "Angle",
                "description": "Ajouter le gisement horizontal (near_bearing, degrés depuis le nord) et l'angle vertical (near_vert_angle, degrés depuis l'horizontale) vers le point le plus proche (par défaut false)."
              },
              "delta": {
                "label": "Delta",
                "description": "Ajouter les décalages par axe near_dx / near_dy / near_dz (par défaut false)."
              }
            }
          },
          "neighborhood_summary_statistics": {
            "name": "Statistiques résumées de voisinage",
            "description": "Pour chaque entité, résume les champs numériques choisis sur ses voisins (k plus proches, dans une distance ou contiguïté par arête partagée), en ajoutant <champ>_nbr_mean/median/std/min/max/sum et un nombre de voisins, comme l'outil ArcGIS Neighborhood Summary Statistics.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée (points, lignes ou polygones)."
              },
              "fields": {
                "label": "Champs",
                "description": "Champs numériques à résumer sur les voisins, séparés par des virgules."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie (copie de l'entrée + colonnes de statistiques de voisinage). S'il est omis, stocké en mémoire."
              },
              "neighborhood": {
                "label": "Voisinage",
                "description": "'knn' (par défaut), 'distance_band' ou 'contiguity' (polygones partageant une arête)."
              },
              "neighbors": {
                "label": "Voisins",
                "description": "k pour knn (par défaut 8)."
              },
              "distance": {
                "label": "Distance",
                "description": "Distance de bande pour distance_band (unités carte)."
              },
              "weights": {
                "label": "Poids",
                "description": "'uniform' (par défaut) ou 'inverse_distance' (pondère la moyenne et l'écart-type)."
              }
            }
          },
          "non_maximum_suppression": {
            "name": "Suppression des non-maxima",
            "description": "Conserve la détection de plus haute confiance dans chaque grappe de chevauchement et rejette les polygones de score inférieur dont l'intersection sur union dépasse un seuil (comme ArcGIS Non Maximum Suppression) — le dédoublonneur basé sur le score pour les sorties de détection d'objets/OBIA que count_overlapping_features (compte, conserve tout), resolve_building_conflicts (déplace) et find_identical (exact uniquement) ne fournissent pas.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Détections polygonales en entrée (elles peuvent se chevaucher)."
              },
              "confidence_score_field": {
                "label": "Champ de score de confiance",
                "description": "Champ numérique contenant le score de confiance de chaque détection ; la valeur la plus élevée l'emporte."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin des polygones en sortie contenant les détections retenues. S'il est omis, stocké en mémoire."
              },
              "max_overlap_ratio": {
                "label": "Rapport de chevauchement maximal",
                "description": "IoU au-delà duquel une détection de score inférieur est supprimée (0-1, par défaut 0.5)."
              },
              "class_value_field": {
                "label": "Champ de valeur de classe",
                "description": "Champ optionnel ; seules les détections de même classe se suppriment mutuellement."
              }
            }
          },
          "observer_points": {
            "name": "Points d'observation",
            "description": "Identifie lesquels de 32 observateurs au maximum peuvent voir chaque cellule, sous forme de masque de bits par observateur, et écrit le raster de hauteur au-dessus du sol donnant la hauteur à laquelle une cible devrait être élevée pour devenir visible (ArcGIS Observer Points / Viewshed 2 en mode OBSERVERS). viewshed intégré ne renvoie qu'un nombre de stations visibles, dont aucune de ces réponses ne peut être récupérée : un compte de 1 ne dit pas quelle tour couvre une parcelle, et un compte de 0 ne distingue pas deux mètres manquants d'une position derrière une montagne.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster d'altitude en entrée (MNT ou MNS)."
              },
              "observers": {
                "label": "Observateurs",
                "description": "Couche de points des positions d'observateurs, 32 au maximum."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster de visibilité en sortie : un masque de bits par observateur, ou un décompte avec analysis_type 'frequency'. S'il est omis, stocké en mémoire."
              },
              "output_agl": {
                "label": "AGL en sortie",
                "description": "Raster de hauteur au-dessus du sol en sortie : la hauteur à laquelle une cible doit être élevée pour devenir visible. Toujours produit ; stocké en mémoire si aucun chemin n'est fourni."
              },
              "output_table": {
                "label": "Table en sortie",
                "description": "Table en sortie comportant une ligne par observateur avec les cellules et la surface qu'il voit. Toujours produite ; stockée en mémoire si aucun chemin n'est fourni."
              },
              "analysis_type": {
                "label": "Type d'analyse",
                "description": "'observers' (par défaut ; un masque de bits) ou 'frequency' (un décompte, correspondant au bassin de visibilité de la suite intégrée)."
              },
              "observer_offset": {
                "label": "Décalage de l'observateur",
                "description": "Hauteur de chaque observateur au-dessus de la surface, en unités z (par défaut 2.0)."
              },
              "observer_offset_field": {
                "label": "Champ de décalage de l'observateur",
                "description": "Attribut contenant une hauteur par observateur, prioritaire sur 'observer_offset'."
              },
              "target_offset": {
                "label": "Décalage de la cible",
                "description": "Hauteur de la cible au-dessus de la surface, en unités z (par défaut 0.0)."
              },
              "max_distance": {
                "label": "Distance maximale",
                "description": "Ignorer les cellules plus éloignées que cette distance d'un observateur, en unités carte. Illimitée par défaut."
              },
              "curvature": {
                "label": "Courbure",
                "description": "Appliquer la correction de courbure terrestre et de réfraction (par défaut false, c'est-à-dire une terre plate)."
              },
              "refractivity_coefficient": {
                "label": "Coefficient de réfractivité",
                "description": "Coefficient de réfraction atmosphérique utilisé avec 'curvature' (par défaut 0.13)."
              },
              "band": {
                "label": "Bande",
                "description": "Bande du raster d'altitude, indexée à partir de 1 (par défaut 1)."
              }
            }
          },
          "optics_clustering": {
            "name": "Classification OPTICS",
            "description": "Regroupement multi-échelle basé sur la densité via OPTICS (comme l'option OPTICS de l'outil ArcGIS Density-based Clustering) : construit un ordre d'accessibilité et extrait des grappes de densité variable par la méthode ξ-steep — le membre multi-échelle du trio DBSCAN/HDBSCAN/OPTICS que dbscan et hdbscan ne couvrent pas.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points en entrée (SCR projeté ; distances dans ses unités)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur en sortie (une copie de l'entrée avec les champs de cluster). Si omis, stocké en mémoire."
              },
              "min_features_cluster": {
                "label": "Entités minimales par grappe",
                "description": "Nombre minimal de points pour l'estimation de densité par distance au cœur et pour la plus petite grappe (>= 2). Par défaut 5."
              },
              "search_distance": {
                "label": "Distance de recherche",
                "description": "Distance d'accessibilité maximale optionnelle (epsilon maximal). Par défaut : non bornée (toutes les échelles)."
              },
              "cluster_sensitivity": {
                "label": "Sensibilité de regroupement",
                "description": "0-100 ; une valeur plus élevée détecte des grappes plus nombreuses et plus resserrées. Correspond à xi = 1 - sensitivity/100. Par défaut 95 (xi = 0.05)."
              }
            }
          },
          "optimal_corridor_connections": {
            "name": "Connexions optimales de corridor",
            "description": "Calcule le réseau de polygones de corridors de moindre coût à largeur fixe qui relie de façon optimale chaque région d'entrée à travers une surface de coût, plus les lignes centrales des corridors. Contrairement à cost_connectivity (lignes de largeur nulle) ou corridor (surface de coût pour une seule paire), il émet des polygones de corridors prêts à l'emploi pour tout le réseau de régions. Comme l'outil ArcGIS Optimal Corridor Connections.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Entités polygonales de régions à relier."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du polygone de corridor en sortie. S'il est omis, stocké en mémoire."
              },
              "cost_raster": {
                "label": "Raster de coût",
                "description": "Surface de coût optionnelle. À défaut, le coût est uniforme (euclidien)."
              },
              "barriers": {
                "label": "Barrières",
                "description": "Entités polygonales optionnelles traitées comme infranchissables."
              },
              "corridor_width": {
                "label": "Largeur de corridor",
                "description": "Largeur du corridor en unités carte (par défaut : 10 cellules)."
              },
              "output_lines": {
                "label": "Lignes en sortie",
                "description": "Chemin optionnel pour les lignes centrales des corridors."
              },
              "neighbor_option": {
                "label": "Option de voisinage",
                "description": "'spanning_tree' (par défaut) ne conserve que les corridors nécessaires pour relier toutes les régions ; 'all_pairs' produit un corridor pour chaque paire de régions."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule d'analyse lorsqu'aucun raster de coût n'est fourni (par défaut : emprise des régions / 200)."
              }
            }
          },
          "optimal_interpolation": {
            "name": "Interpolation optimale",
            "description": "Corrige un champ raster de fond avec des observations ponctuelles via l'étape d'analyse d'interpolation optimale / d'assimilation de données x_a = x_b + B Hᵀ (H B Hᵀ + R)⁻¹ (y − H x_b), en utilisant une corrélation spatiale gaussienne de la longueur de corrélation donnée et des variances d'erreur par observation/du fond (comme l'outil Optimal Interpolation d'ArcGIS). Contrairement à IDW/krigeage/EBK, qui interpolent à partir des points seuls, il mélange un champ maillé a priori avec des observations et peut émettre un raster de variance d'erreur d'analyse.",
            "params": {
              "background": {
                "label": "Fond",
                "description": "Champ raster de fond (a priori) à corriger."
              },
              "observations": {
                "label": "Observations",
                "description": "Couche des points d'observation."
              },
              "field": {
                "label": "Champ",
                "description": "Champ numérique de la couche d'observations contenant la valeur observée."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster corrigé (d'analyse) en sortie. S'il est omis, stocké en mémoire."
              },
              "correlation_length": {
                "label": "Longueur de corrélation",
                "description": "Longueur de corrélation spatiale L en unités du SCR (gaussienne). Par défaut : 5 % du plus grand côté du raster de fond."
              },
              "background_error_variance": {
                "label": "Variance d'erreur du fond",
                "description": "Variance d'erreur du fond σ_b² (par défaut 1.0). Plus elle est grande, plus les observations sont privilégiées."
              },
              "obs_error_variance": {
                "label": "Variance d'erreur des observations",
                "description": "Variance d'erreur d'observation σ_o² (par défaut 1.0), utilisée lorsqu'aucun champ d'erreur par point n'est fourni. Plus elle est grande, plus le fond est privilégié."
              },
              "error_field": {
                "label": "Champ d'erreur",
                "description": "Champ optionnel de la couche d'observations donnant la variance d'erreur de chaque point (prioritaire sur obs_error_variance lorsqu'il est présent et > 0)."
              },
              "band": {
                "label": "Bande",
                "description": "Bande du fond à corriger, indexée à partir de 1 (par défaut 1)."
              },
              "max_obs": {
                "label": "Observations maximales",
                "description": "Nombre maximal d'observations les plus proches utilisées dans la résolution locale de chaque cellule (par défaut 50, plage 1..=200)."
              },
              "analysis_error": {
                "label": "Erreur d'analyse",
                "description": "Raster optionnel en sortie de la variance d'erreur d'analyse σ_a² (≤ σ_b²)."
              }
            }
          },
          "optimal_path_as_line": {
            "name": "Chemin optimal en ligne",
            "description": "Trace un raster de liens arrière de coût depuis chaque destination jusqu'à sa source et émet les itinéraires de moindre coût sous forme de polylignes (ArcGIS Optimal Path As Line / Cost Path As Polyline). cost_pathway ne marque l'itinéraire que comme cellules raster et cost_connectivity ne couvre que le cas du réseau à N sites, de sorte que le chemin ordinaire source-destination n'avait pas de forme vectorielle.",
            "params": {
              "destination": {
                "label": "Destination",
                "description": "Destinations à partir desquelles tracer : un raster (toute cellule non nulle et non NoData) ou une couche vectorielle de points/multipoints."
              },
              "backlink": {
                "label": "Lien arrière",
                "description": "Raster de direction des liens arrière issu de cost_back_link (0 = source, 1-8 = direction vers la source, 1 = est, en sens antihoraire)."
              },
              "accumulation": {
                "label": "Accumulation",
                "description": "Raster de coût cumulé optionnel (out_distance de cost_back_link). Fournit le coût total de chaque chemin et est requis par path_type 'each_zone' et 'best_single'."
              },
              "path_type": {
                "label": "Type de chemin",
                "description": "Une valeur parmi 'each_cell' (par défaut, un chemin par cellule de destination), 'each_zone' (un chemin par zone de destination, depuis sa cellule la moins coûteuse) et 'best_single' (l'unique chemin le moins coûteux)."
              },
              "zone_field": {
                "label": "Champ de zone",
                "description": "Attribut contenant l'identifiant de zone pour une destination vectorielle avec path_type 'each_zone'. Les destinations raster utilisent la valeur de la cellule comme zone."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche de polylignes en sortie. S'il est omis, stocké en mémoire."
              }
            }
          },
          "optimized_hot_spot_analysis": {
            "name": "Analyse optimisée des points chauds",
            "description": "Agrège automatiquement les incidents, sélectionne automatiquement la bande de distance d'analyse, exécute le Gi* de Getis-Ord et rapporte une classe de point chaud/froid corrigée par FDR (comme ArcGIS Optimized Hot Spot Analysis) — l'enveloppe de traitement qui manque à getis_ord_gi_star intégré, brut.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche d'entités en entrée (points d'incidents, ou entités dotées d'un champ d'analyse)."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche de points en sortie avec les résultats Gi*. S'il est omis, stockée en mémoire."
              },
              "analysis_field": {
                "label": "Champ d'analyse",
                "description": "Champ numérique à analyser (pondéré, sans agrégation). Omettre pour compter les incidents."
              },
              "aggregation": {
                "label": "Agrégation",
                "description": "Agrégation des incidents en l'absence d'analysis_field : 'fishnet' (comptage par grille ; par défaut) ou 'snap' (fusion des points coïncidents)."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule d'agrégation / d'accrochage en unités du SCR. Par défaut : plus grand côté de l'emprise / 30."
              },
              "distance_band": {
                "label": "Bande de distance",
                "description": "Bande de distance d'analyse en unités du SCR. Par défaut : sélectionnée automatiquement selon le pic d'intensité de regroupement."
              }
            }
          },
          "optimized_outlier_analysis": {
            "name": "Analyse optimisée des valeurs aberrantes",
            "description": "Agrège automatiquement les incidents, sélectionne automatiquement la bande de distance d'analyse, exécute le I de Moran local d'Anselin et rapporte les types de grappes/valeurs aberrantes corrigés par FDR (HH/LL/HL/LH) — comme l'outil ArcGIS Optimized Outlier Analysis ; l'enveloppe de Moran local non temporelle que local_morans_i_lisa intégré, brut, et local_outlier_analysis, spatio-temporel, ne fournissent pas.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche d'entités en entrée (points d'incidents, ou entités dotées d'un champ d'analyse)."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche de points en sortie avec les résultats du I de Moran local. S'il est omis, stockée en mémoire."
              },
              "analysis_field": {
                "label": "Champ d'analyse",
                "description": "Champ numérique à analyser (pondéré, sans agrégation). Omettre pour compter les incidents."
              },
              "aggregation": {
                "label": "Agrégation",
                "description": "Agrégation des incidents en l'absence d'analysis_field : 'fishnet' (comptage par grille ; par défaut) ou 'snap' (fusion des points coïncidents)."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule d'agrégation / d'accrochage en unités du SCR. Par défaut : plus grand côté de l'emprise / 30."
              },
              "distance_band": {
                "label": "Bande de distance",
                "description": "Bande de distance d'analyse en unités du SCR. Par défaut : sélectionnée automatiquement selon le pic d'intensité de regroupement."
              },
              "fdr_alpha": {
                "label": "Alpha FDR",
                "description": "Niveau de taux de fausses découvertes (FDR) pour la significativité du COType (par défaut 0.05)."
              }
            }
          },
          "ordinary_cokriging": {
            "name": "Interpolation par cokrigeage ordinaire",
            "description": "Effectue une interpolation spatiale multivariée utilisant des variables auxiliaires pour améliorer les prédictions de la variable principale. Idéal lorsque les données principales sont rares mais que des données secondaires corrélées sont abondantes.",
            "params": {
              "primary_points": {
                "label": "Points primaires",
                "description": "Couche vectorielle avec les points d'apprentissage de la variable principale"
              },
              "primary_field": {
                "label": "Champ primaire",
                "description": "Champ contenant les valeurs de la variable principale"
              },
              "auxiliary_inputs": {
                "label": "Entrées auxiliaires",
                "description": "Liste, séparée par des virgules, des chemins de fichiers des variables auxiliaires"
              },
              "auxiliary_fields": {
                "label": "Champs auxiliaires",
                "description": "Noms de champs des variables auxiliaires, séparés par des virgules (vide pour les rasters)"
              },
              "template_raster": {
                "label": "Raster modèle",
                "description": "Modèle raster définissant la grille et le SCR de sortie"
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster krigé en sortie"
              },
              "output_variance": {
                "label": "Variance en sortie",
                "description": "Chemin optionnel du raster de variance de krigeage en sortie"
              },
              "neighborhood_size": {
                "label": "Taille de voisinage",
                "description": "Nombre de voisins les plus proches pour le cokrigeage local (par défaut : tous)"
              }
            }
          },
          "pairwise_comparison_weights": {
            "name": "Pondérations par comparaison par paires",
            "description": "Dérive les poids des critères d'une matrice de comparaison par paires AHP (échelle de Saaty 1-9) comme vecteur propre principal normalisé, avec une vérification de cohérence (lambda_max, indice de cohérence, ratio de cohérence) — comme l'outil ArcGIS Assign Weights By Pairwise Comparison.",
            "params": {
              "matrix": {
                "label": "Matrice",
                "description": "La matrice de comparaison réciproque n x n sous forme de tableau JSON à 2 dimensions, par exemple [[1,3,5],[0.333,1,2],[0.2,0.5,1]]. Fournir ceci ou `input`."
              },
              "input": {
                "label": "Entrée",
                "description": "Fichier CSV contenant la matrice de comparaison (lignes purement numériques, ou étiquetées avec une ligne d'en-tête et une première colonne de noms). Fournir ceci ou `matrix`."
              },
              "criteria": {
                "label": "Critères",
                "description": "Noms des critères séparés par des virgules (ils doivent respecter l'ordre de la matrice). Prioritaires sur les étiquettes du CSV ; par défaut C1..Cn."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de la table en sortie — un CSV (extension .csv) ou une table vectorielle sans géométrie (critère, poids, rang). S'il est omis, stockée en mémoire."
              }
            }
          },
          "path_distance": {
            "name": "Distance de chemin",
            "description": "Distance de moindre coût accumulée où chaque pas paie la vraie distance de surface 3D (à partir d'un MNT) multipliée par un facteur vertical dépendant de la pente (randonnée de Tobler, linéaire, binaire) et par la friction, comme l'outil ArcGIS Path Distance.",
            "params": {
              "source": {
                "label": "Source",
                "description": "Raster source ; les cellules à valeurs positives et non NoData sont des origines (coût cumulé 0)."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster de coût cumulé en sortie. S'il est omis, stocké en mémoire."
              },
              "cost": {
                "label": "Coût",
                "description": "Raster de friction/coût de passage optionnel (par défaut uniforme à 1)."
              },
              "surface": {
                "label": "Surface",
                "description": "Raster d'altitude (MNT) optionnel ; active la distance de surface 3D et les facteurs verticaux dépendant de la pente."
              },
              "vertical_factor": {
                "label": "Facteur vertical",
                "description": "'tobler' (par défaut), 'linear', 'sym_linear', 'inverse_linear' ou 'binary'."
              },
              "slope_factor": {
                "label": "Facteur de pente",
                "description": "Coefficient de pénalité de pente pour les facteurs linéaires (par défaut 1)."
              },
              "zero_factor": {
                "label": "Facteur zéro",
                "description": "Plancher du facteur vertical minimal (en descente) pour linear/inverse_linear (par défaut 0.1)."
              },
              "max_slope": {
                "label": "Pente maximale",
                "description": "Pour 'binary' : les pentes plus raides que ce nombre de degrés sont infranchissables (par défaut 30)."
              },
              "band": {
                "label": "Bande",
                "description": "Bande utilisée pour tous les rasters, indexée à partir de 1 (par défaut 1)."
              }
            }
          },
          "percentile_contours": {
            "name": "Courbes de niveau par percentiles",
            "description": "Émet des polygones emboîtés englobant les cellules les plus extrêmes d'une surface, seuillées par percentile de valeur ou par percentile de masse cumulée (volume).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster de surface continue en entrée (densité, aptitude, altitude)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de polygones de sortie optionnel (pilote selon son extension). S'il est omis, stocké en mémoire."
              },
              "percentiles": {
                "label": "Percentiles",
                "description": "Percentiles dans [0,100] séparés par des virgules (par exemple \"50,90,95\"). Par défaut \"90\"."
              },
              "mode": {
                "label": "Mode",
                "description": "'value' (par défaut) : les cellules supérieures ou égales à la valeur du p-ième percentile. 'volume' : les cellules les plus élevées portant les (100-p) % supérieurs de la valeur cumulée."
              },
              "ignore_negative": {
                "label": "Ignorer les négatifs",
                "description": "Exclure les valeurs de cellule négatives du classement et de la sortie. Par défaut false."
              },
              "smooth": {
                "label": "Lisser",
                "description": "Simplifier les polygones suivant les bords des cellules avec Douglas-Peucker (tolérance d'environ 1,5 cellule) afin d'atténuer l'effet d'escalier. Par défaut false."
              },
              "band": {
                "label": "Bande",
                "description": "Bande à lire, indexée à partir de 1 (par défaut 1)."
              }
            }
          },
          "pivot_table": {
            "name": "Tableau croisé dynamique",
            "description": "Remodèle une table attributaire au format long en format large : une ligne de sortie par combinaison unique des champs d'identité, et une colonne par valeur distincte du champ pivot, remplie à partir du champ de valeur. Comme l'outil ArcGIS Pivot Table.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle ou table attributaire en entrée, au format long."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de la table en sortie (pilote selon l'extension). S'il est omis, stockée en mémoire."
              },
              "fields": {
                "label": "Champs",
                "description": "Nom(s) de champ(s) séparés par des virgules ou des points-virgules identifiant une ligne de sortie ; repris tels quels."
              },
              "pivot_field": {
                "label": "Champ pivot",
                "description": "Champ dont les valeurs distinctes deviennent de nouvelles colonnes."
              },
              "value_field": {
                "label": "Champ de valeur",
                "description": "Champ fournissant les valeurs des cellules."
              },
              "aggregate": {
                "label": "Agréger",
                "description": "Appliqué lorsqu'une cellule ligne/colonne comporte plusieurs enregistrements sources : 'first' (par défaut), 'sum', 'mean', 'min', 'max', 'count'."
              }
            }
          },
          "pmtiles_extract": {
            "name": "Extraire des PMTiles",
            "description": "Extrait un sous-ensemble d'emprise/zoom d'une archive PMTiles dans une nouvelle archive (par exemple un fond de carte hors ligne à partir d'une construction planétaire Protomaps).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier .pmtiles en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier .pmtiles en sortie."
              },
              "bbox": {
                "label": "Emprise",
                "description": "Emprise WGS84 sous la forme 'min_lon,min_lat,max_lon,max_lat'."
              },
              "min_zoom": {
                "label": "Zoom minimal",
                "description": "Niveau de zoom minimal à inclure (par défaut 0, afin que la carte reste utilisable en vue dézoomée)."
              },
              "max_zoom": {
                "label": "Zoom maximal",
                "description": "Niveau de zoom maximal à inclure (par défaut : le zoom maximal de l'archive source)."
              },
              "max_tiles": {
                "label": "Tuiles maximales",
                "description": "Interrompre si la sélection concerne plus de tuiles que cette valeur (par défaut 2000000)."
              },
              "url": {
                "label": "URL",
                "description": "URL PMTiles HTTP(S). Fournir soit url, soit input ; les sources HTTP utilisent des requêtes par plage d'octets (l'hôte doit autoriser les lectures Range multi-origines)."
              },
              "bbox_crs": {
                "label": "SCR de l'emprise",
                "description": "Code EPSG des coordonnées de l'emprise. Par défaut 4326 (WGS84 lon/lat) ; les autres SCR sont reprojetés vers 4326."
              }
            }
          },
          "point_statistics": {
            "name": "Statistiques de points",
            "description": "Rasterise une statistique à fenêtre glissante d'un attribut d'entités ponctuelles : pour chaque cellule de sortie, un voisinage (cercle ou rectangle) collecte les valeurs du champ numérique choisi des points qu'il contient et les réduit en moyenne/majorité/maximum/médiane/minimum/minorité/plage/écart-type/somme/variété. Comme l'outil ArcGIS Point Statistics ; complète line_density/heat_map (densité uniquement) et neighborhood_summary_statistics (vecteur uniquement).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points en entrée (Point / MultiPoint)."
              },
              "field": {
                "label": "Champ",
                "description": "Champ attributaire numérique à résumer."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie (pilote déduit de l'extension). Si omis, stocké en mémoire."
              },
              "statistic": {
                "label": "Statistique",
                "description": "Statistique par voisinage : mean (par défaut), majority, maximum, median, minimum, minority, range, std, sum ou variety."
              },
              "neighborhood": {
                "label": "Voisinage",
                "description": "Forme du voisinage : 'circle' (par défaut, utilise 'radius') ou 'rectangle' (un carré de côté 2*radius)."
              },
              "radius": {
                "label": "Rayon",
                "description": "Rayon du voisinage / demi-côté du rectangle (mètres pour un SCR géographique, unités du SCR sinon). Par défaut : plus petit côté de l'emprise / 20."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule en sortie (mêmes unités que radius). Par défaut : radius / 5."
              },
              "epsg": {
                "label": "EPSG",
                "description": "Remplace le code EPSG du SCR d'entrée (par exemple lorsque la couche n'est pas étiquetée). La valeur 4326 déclenche la projection en mètres."
              }
            }
          },
          "points_to_line": {
            "name": "Points vers ligne",
            "description": "Construit des entités polylignes à partir de points : une ligne par valeur distincte de line_field, sommets ordonnés par sort_field, avec un indicateur optionnel de fermeture de ligne.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier vectoriel de points en entrée (ou référence en mémoire)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin optionnel du vecteur de lignes en sortie (pilote déduit de son extension). Si omis, le résultat est stocké en mémoire."
              },
              "line_field": {
                "label": "Champ de ligne",
                "description": "Attribut dont les valeurs distinctes répartissent les points en lignes séparées (une polyligne par valeur). S'il est omis, tous les points forment une seule ligne."
              },
              "sort_field": {
                "label": "Champ de tri",
                "description": "Attribut définissant l'ordre des sommets au sein de chaque ligne. Les valeurs numériques sont triées numériquement, le texte lexicographiquement. S'il est omis, l'ordre des entités en entrée est utilisé."
              },
              "close_line": {
                "label": "Fermer la ligne",
                "description": "Ajouter le premier sommet à la fin de chaque ligne pour la fermer en anneau. Par défaut false."
              }
            }
          },
          "points_to_path": {
            "name": "Points vers trajet",
            "description": "Relie des points en entités polylignes, ordonnées par un champ et (en option) regroupées en un chemin par valeur, avec un tri naturel et une fermeture de chemin optionnels.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier vectoriel de points en entrée (ou référence en mémoire)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin optionnel du vecteur de lignes en sortie (pilote déduit de son extension). Si omis, le résultat est stocké en mémoire."
              },
              "order_field": {
                "label": "Champ d'ordre",
                "description": "Attribut définissant l'ordre de connexion des points au sein de chaque chemin. Les valeurs numériques sont triées numériquement, le texte lexicographiquement. S'il est omis, l'ordre des entités en entrée est utilisé."
              },
              "group_field": {
                "label": "Champ de regroupement",
                "description": "Attribut répartissant les points en chemins séparés (une ligne par valeur distincte). S'il est omis, tous les points forment un seul chemin."
              },
              "natural_sort": {
                "label": "Tri naturel",
                "description": "Trier les valeurs d'ordre textuelles de façon naturelle afin que 'a9' précède 'a10'. Par défaut false."
              },
              "close_path": {
                "label": "Fermer le chemin",
                "description": "Ajouter le premier sommet à la fin de chaque chemin pour le fermer en anneau. Par défaut false."
              }
            }
          },
          "polygon_neighbors": {
            "name": "Voisins de polygone",
            "description": "Construit une table d'adjacence (contiguïté) de polygones : paires voisines avec la longueur de leur frontière partagée et un nombre de contacts ponctuels, comme l'outil ArcGIS Polygon Neighbors.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de polygones en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de la table de sortie — un CSV (extension .csv) ou une table vectorielle sans géométrie. Si omis, le résultat est stocké en mémoire."
              },
              "id_field": {
                "label": "Champ d'identifiant",
                "description": "Champ identifiant chaque polygone dans la table. Par défaut : l'indice de l'entité."
              },
              "both_sides": {
                "label": "Des deux côtés",
                "description": "Émettre chaque paire de voisins deux fois (src→nbr et nbr→src). Par défaut false (une fois par paire)."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Quantifie les sommets sur une grille de cette taille (unités du SCR) avant la mise en correspondance des bordures. Par défaut 0 (coordonnées exactes)."
              }
            }
          },
          "polygon_volume": {
            "name": "Volume de polygone",
            "description": "Volume et surface 3D par polygone d'un raster de surface au-dessus/en dessous de la hauteur du plan de référence de chaque entité, comme l'outil ArcGIS Polygon Volume — le pendant zonal de surface_volume.",
            "params": {
              "surface": {
                "label": "Surface",
                "description": "Raster de surface d'altitude en entrée."
              },
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de polygones (zones)."
              },
              "height_field": {
                "label": "Champ de hauteur",
                "description": "Champ attributaire donnant l'altitude du plan de référence de chaque polygone."
              },
              "direction": {
                "label": "Direction",
                "description": "Côté de chaque plan à intégrer : 'above' (par défaut), 'below' ou 'both'."
              },
              "band": {
                "label": "Bande",
                "description": "Bande (indexée à partir de 1) à lire dans la surface (par défaut 1)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de polygones en sortie (pilote déduit de l'extension). Si omis, le résultat est stocké en mémoire."
              }
            }
          },
          "porous_puff": {
            "name": "Panache poreux",
            "description": "Advection-dispersion analytique d'une injection instantanée de contaminant à travers les eaux souterraines (comme ArcGIS Porous Puff) : fait avancer le centre de la bouffée depuis un point de rejet le long d'un champ de vitesse de Darcy (magnitude+direction, tel que produit par darcy_flow), puis évalue la concentration gaussienne 2D en forme fermée de la bouffée en coordonnées alignées sur le chemin, mise à l'échelle par la porosité, l'épaisseur, la retardation et la décroissance de premier ordre.",
            "params": {
              "magnitude": {
                "label": "Magnitude",
                "description": "Raster de magnitude de la vitesse de Darcy, tel que produit par la sortie 'output' de darcy_flow. La taille de cellule et l'emprise sont reprises de ce raster."
              },
              "direction": {
                "label": "Direction",
                "description": "Raster de direction de l'écoulement de Darcy (azimut en degrés depuis le nord, dans le sens horaire, vers l'aval du gradient), tel que produit par la sortie 'direction' de darcy_flow. Doit être recalé sur 'magnitude'."
              },
              "x": {
                "label": "X",
                "description": "Coordonnée X du point de rejet (unités carte, même SCR que les rasters de vitesse)."
              },
              "y": {
                "label": "Y",
                "description": "Coordonnée Y du point de rejet (unités carte)."
              },
              "mass": {
                "label": "Masse",
                "description": "Masse de contaminant rejetée (doit être positive)."
              },
              "porosity": {
                "label": "Porosité",
                "description": "Porosité efficace : soit une constante numérique dans (0, 1], soit le chemin d'un raster recalé sur 'magnitude'."
              },
              "thickness": {
                "label": "Épaisseur",
                "description": "Épaisseur de l'aquifère : soit une constante numérique positive, soit le chemin d'un raster recalé sur 'magnitude'."
              },
              "dispersivity_long": {
                "label": "Dispersivité longitudinale",
                "description": "Dispersivité longitudinale (unités de longueur ; doit être positive)."
              },
              "dispersivity_trans": {
                "label": "Dispersivité transversale",
                "description": "Dispersivité transversale (unités de longueur ; doit être positive)."
              },
              "retardation": {
                "label": "Retardation",
                "description": "Facteur de retard (par défaut 1, doit être >= 1)."
              },
              "decay": {
                "label": "Décroissance",
                "description": "Constante de décroissance du premier ordre (par défaut 0, doit être >= 0 ; mêmes unités de temps que 'time')."
              },
              "time": {
                "label": "Heure",
                "description": "Liste, séparée par des virgules, d'un ou plusieurs temps écoulés positifs. Le dernier temps est écrit dans 'output' ; tous les temps (y compris le dernier) sont consignés dans la sortie 'time_series'."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de concentration en sortie pour le dernier temps de 'time'. Si omis, le résultat est stocké en mémoire."
              },
              "band": {
                "label": "Bande",
                "description": "Bande (indexée à partir de 1) à lire dans les rasters de magnitude et de direction (par défaut 1)."
              },
              "step": {
                "label": "Pas",
                "description": "Longueur du pas de progression du centre de la bouffée en unités du SCR (par défaut : la taille de cellule du raster de magnitude)."
              },
              "max_steps": {
                "label": "Pas maximaux",
                "description": "Nombre maximal de pas de progression par temps demandé (par défaut 1000)."
              }
            }
          },
          "predict_using_trend_raster": {
            "name": "Prédire avec un raster de tendance",
            "description": "Évalue les rasters de pente/ordonnée à l'origine ajustés par generate_trend_raster à un ou plusieurs instants, produisant des surfaces prédites, comme l'outil ArcGIS Predict Using Trend Raster.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster de pente (tendance) produit par generate_trend_raster."
              },
              "intercept": {
                "label": "Ordonnée à l'origine",
                "description": "Raster d'ordonnée à l'origine produit par generate_trend_raster (sa sortie 'intercept_output'), recalé sur le raster de pente."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster en sortie pour le premier temps prédit. Si omis, les résultats sont stockés en mémoire."
              },
              "times": {
                "label": "Temps",
                "description": "Temps de prédiction séparés par des virgules, sur la même échelle que celle utilisée pour l'ajustement (par ex. '12,18,24'). Remplace start/end/interval."
              },
              "start": {
                "label": "Début",
                "description": "Premier temps d'une plage générée (utilisé lorsque 'times' est absent)."
              },
              "end": {
                "label": "Fin",
                "description": "Dernier temps d'une plage générée (inclus ; utilisé lorsque 'times' est absent)."
              },
              "interval": {
                "label": "Intervalle",
                "description": "Pas entre les temps générés (par défaut 1 ; utilisé lorsque 'times' est absent)."
              },
              "band": {
                "label": "Bande",
                "description": "Bande (indexée à partir de 1) à lire dans chaque raster de coefficients (par défaut 1)."
              }
            }
          },
          "presence_only_prediction": {
            "name": "Prédiction à partir des seules présences",
            "description": "Modélisation d'aptitude d'espèces/d'habitats de type MaxEnt : ajuste un modèle logistique régularisé L1 opposant des points de présence à un échantillon de fond avec graine de rasters explicatifs (expansion de base linéaire/quadratique/charnière), puis prédit une surface de probabilité de présence plus un rapport d'importance des variables — comme l'outil ArcGIS Presence-only Prediction (MaxEnt).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points de présence en entrée (occurrences observées)."
              },
              "explanatory": {
                "label": "Explicatives",
                "description": "Liste, séparée par des virgules, des chemins des rasters explicatifs (la pile de covariables). Échantillonnés aux emplacements de présence et de fond ; le premier raster définit la grille de sortie."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de probabilité de présence en sortie. Si omis, stocké en mémoire."
              },
              "report": {
                "label": "Rapport",
                "description": "Chemin de sortie optionnel pour un tableau CSV des coefficients / de l'importance des variables."
              },
              "features": {
                "label": "Entités",
                "description": "Classes de caractéristiques d'expansion de base, séparées par des virgules : parmi 'linear', 'quadratic', 'hinge'. Par défaut 'linear,quadratic'."
              },
              "background": {
                "label": "Fond",
                "description": "Nombre d'échantillons de fond tirés dans la pile de rasters. Par défaut 1000 (plafonné au nombre de cellules valides)."
              },
              "regularization": {
                "label": "Régularisation",
                "description": "Force de la régularisation L1 (lasso) sur les caractéristiques standardisées. Plus grande = modèle plus simple. Par défaut 0.01."
              },
              "hinge_knots": {
                "label": "Nœuds de charnière",
                "description": "Nombre de nœuds intérieurs par covariable pour les caractéristiques 'hinge' (utilisé uniquement lorsque 'hinge' est activé). Par défaut 10."
              },
              "seed": {
                "label": "Graine",
                "description": "Germe aléatoire pour l'échantillon de fond déterministe (par défaut 1)."
              }
            }
          },
          "propagate_displacement": {
            "name": "Propager le déplacement",
            "description": "Propage le déplacement introduit par resolve_road_conflicts (ou toute couche de liens de déplacement à deux points) sur les entités voisines en interpolant les liens épars en un champ IDW lisse : les entités rigides (bâtiments, parcelles) reçoivent une seule translation moyennée, les lignes flexibles une courbure par sommet lissée en longueur d'arc, comme l'outil ArcGIS Propagate Displacement.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée à ajuster (tout type de géométrie)."
              },
              "links": {
                "label": "Liens",
                "description": "Liens de déplacement : une couche de lignes à 2 sommets par lien, le premier sommet = position d'origine, le dernier sommet = position déplacée (le schéma qu'utilisent à la fois la sortie 'links' de resolve_road_conflicts et l'entrée 'links' de rubbersheet_features)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de sortie optionnel (pilote déduit de l'extension). Si omis, stocké en mémoire."
              },
              "adjustment_style": {
                "label": "Style d'ajustement",
                "description": "'auto' (par défaut : translation rigide pour les points et les polygones, courbure par sommet pour les lignes), 'preserve_orientation' (translation rigide selon le champ moyenné sur l'emprise de l'entité) ou 'solid' (translation rigide selon le champ échantillonné une seule fois au point représentatif de l'entité)."
              },
              "search_distance": {
                "label": "Distance de recherche",
                "description": "Distance maximale (unités du SCR) sur laquelle un lien peut influencer un point d'échantillonnage ; les liens plus éloignés sont ignorés. Par défaut : illimitée (chaque lien contribue partout)."
              }
            }
          },
          "pycnophylactic_interpolation": {
            "name": "Interpolation pycnophylactique",
            "description": "Interpolation surfacique de Tobler préservant la masse : transforme des comptages agrégés par zone en une surface de densité lisse dont les sommes par zone correspondent exactement à l'entrée (comme ArcGIS Areal Interpolation) — l'alternative lisse à l'hypothèse de densité uniforme de apportion_polygon.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de polygones en entrée comportant un champ d'effectifs (variable extensive)."
              },
              "count_field": {
                "label": "Champ de comptage",
                "description": "Champ contenant l'effectif total de chaque zone (population, etc.)."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster de densité en sortie (valeur par cellule ; les sommes par zone égalent celles de l'entrée). Si omis, stocké en mémoire."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule en sortie en unités du SCR (par défaut : emprise / 200)."
              },
              "iterations": {
                "label": "Itérations",
                "description": "Nombre maximal d'itérations de lissage (par défaut 100)."
              },
              "tolerance": {
                "label": "Tolérance",
                "description": "Arrêt lorsque la variation maximale par cellule passe sous cette fraction de la densité moyenne (par défaut 0.001)."
              },
              "non_negative": {
                "label": "Non négatif",
                "description": "Ramène les valeurs négatives à 0 et les redistribue afin de conserver la masse (par défaut vrai)."
              }
            }
          },
          "radiometric_terrain_flattening": {
            "name": "Aplanissement radiométrique du relief",
            "description": "Supprime le signal de luminosité topographique de la rétrodiffusion SAR calibrée en remplaçant la surface de référence de Terre plate par la surface locale illuminée dérivée du MNT, et signale le repliement et l'ombre radar (ArcGIS Apply Radiometric Terrain Flattening). apply_radiometric_calibration de la série 17 normalise avec l'angle d'incidence ellipsoïdal, de sorte que sur un terrain en pente son sigma0/gamma0 suit la topographie plutôt que l'occupation du sol — couramment de plus de 6 dB, ce qui dépasse la différence forêt/sol nu qu'il est censé mesurer.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster de rétrodiffusion SAR calibré (beta nought par défaut ; voir 'input_calibration')."
              },
              "dem": {
                "label": "MNT",
                "description": "Modèle numérique de terrain, recalé sur le raster d'entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster de rétrodiffusion aplani par le terrain en sortie. Si omis, stocké en mémoire."
              },
              "output_scattering_area": {
                "label": "Surface de diffusion en sortie",
                "description": "Rapport en sortie entre la surface réellement illuminée et la surface en terre plate. Toujours produit ; stocké en mémoire si aucun chemin n'est fourni."
              },
              "output_geometry_mask": {
                "label": "Masque de géométrie en sortie",
                "description": "Masque en sortie : 0 normal, 1 basculement (layover), 2 ombre radar. Toujours produit ; stocké en mémoire si aucun chemin n'est fourni."
              },
              "incidence_angle": {
                "label": "Angle d'incidence",
                "description": "Angle d'incidence ellipsoïdal en degrés : une constante, ou le chemin d'un raster par cellule. Obligatoire."
              },
              "look_azimuth": {
                "label": "Azimut de visée",
                "description": "Azimut de la boussole en degrés depuis la cible vers le capteur (par défaut 270, c'est-à-dire une passe ascendante à visée droite). Une passe descendante Sentinel-1 à visée droite est d'environ 283."
              },
              "input_calibration": {
                "label": "Calibration d'entrée",
                "description": "Ce qu'est déjà l'entrée : 'beta0' (par défaut), 'sigma0_ellipsoid' ou 'gamma0_ellipsoid'. Les deux derniers sont reconvertis en beta nought à l'aide de l'angle ellipsoïdal avant l'aplanissement."
              },
              "calibration_type": {
                "label": "Type de calibration",
                "description": "Convention de sortie : 'gamma0' (par défaut) ou 'sigma0'."
              },
              "input_units": {
                "label": "Unités d'entrée",
                "description": "'intensity' (par défaut), 'dn', 'amplitude' ou 'db'."
              },
              "output_units": {
                "label": "Unités de sortie",
                "description": "'linear' (par défaut) ou 'db'."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Multiplicateur convertissant les unités z du MNT en unités XY du raster (par défaut 1.0)."
              },
              "band": {
                "label": "Bande",
                "description": "Bande (indexée à partir de 1) du raster d'entrée à aplanir (par défaut 1)."
              }
            }
          },
          "raster_domain": {
            "name": "Domaine du raster",
            "description": "Trace la limite de la région de données valides d'un raster sous forme de polygones (ou de polylignes fermées), en préservant les trous NoData intérieurs (ArcGIS Raster Domain). layer_footprint_raster intégré renvoie l'emprise rectangulaire complète, qui pour une scène tournée, un bassin versant découpé ou une tuile de mosaïque irrégulière peut représenter plusieurs fois la couverture réelle ; polygonize pourrait le faire mais seulement à partir d'un masque de validité 0/1 que l'appelant doit d'abord construire, ce qui est toute la tâche.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster d'entrée dont on souhaite l'emprise des données valides."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche de polygones ou de lignes en sortie. Si omise, stockée en mémoire."
              },
              "geometry_type": {
                "label": "Type de géométrie",
                "description": "'polygon' (par défaut) ou 'line' pour restituer la limite sous forme de polylignes fermées."
              },
              "ignore_value": {
                "label": "Valeur à ignorer",
                "description": "Traite également cette valeur comme invalide, en plus du NoData propre au raster (souvent 0 pour les images à bordure noire)."
              },
              "min_value": {
                "label": "Valeur minimale",
                "description": "Traite les valeurs inférieures à ce seuil comme invalides."
              },
              "max_value": {
                "label": "Valeur maximale",
                "description": "Traite les valeurs supérieures à ce seuil comme invalides."
              },
              "min_area": {
                "label": "Surface minimale",
                "description": "Écarte les parties d'emprise plus petites que cette surface en unités carte au carré, ce qui supprime les mouchetures le long d'une marge irrégulière."
              },
              "fill_holes": {
                "label": "Remplir les trous",
                "description": "Supprime les trous intérieurs et renvoie l'emprise pleine (par défaut faux)."
              },
              "all_bands": {
                "label": "Toutes les bandes",
                "description": "Exige qu'une cellule soit valide dans toutes les bandes plutôt que dans la seule bande sélectionnée (par défaut faux)."
              },
              "band": {
                "label": "Bande",
                "description": "Bande (indexée à partir de 1) à tester (par défaut 1). Ignorée lorsque 'all_bands' est défini."
              }
            }
          },
          "raster_normalize": {
            "name": "Normaliser le raster",
            "description": "Normalise min-max une bande raster dans l'intervalle [0, 1].",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              },
              "band": {
                "label": "Bande",
                "description": "Bande (indexée à partir de 1) à normaliser (par défaut 1)."
              }
            }
          },
          "raster_to_h3": {
            "name": "Raster vers cellules H3",
            "description": "Agrège les valeurs d'une bande raster dans des cellules de grille globale discrète H3 (moyenne, somme, min, max, nombre, médiane).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée (doit être en coordonnées géographiques lon/lat, EPSG:4326)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur en sortie ; le pilote est déduit de son extension (.geojson, .fgb, .parquet, ...). Si omis, la couche est stockée en mémoire."
              },
              "resolution": {
                "label": "Résolution",
                "description": "Résolution H3 de 0 (la plus grossière) à 15 (la plus fine) ; par défaut 8 (cellules d'environ 0,7 km²)."
              },
              "band": {
                "label": "Bande",
                "description": "Bande raster (indexée à partir de 1) à agréger (par défaut 1)."
              },
              "aggregate": {
                "label": "Agréger",
                "description": "Mode de combinaison des valeurs de pixels par cellule : mean, sum, min, max, count ou median (par défaut mean)."
              }
            }
          },
          "raster_to_tiles": {
            "name": "Raster vers tuiles XYZ",
            "description": "Découpe un raster en une pyramide de tuiles PNG XYZ en Web Mercator (EPSG:3857) pour les cartes web.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée. Doit comporter un SCR source (EPSG ou WKT)."
              },
              "output_dir": {
                "label": "Répertoire de sortie",
                "description": "Répertoire de sortie pour l'arborescence de tuiles {z}/{x}/{y}.png (par ex. /work/tiles)."
              },
              "min_zoom": {
                "label": "Zoom minimal",
                "description": "Niveau de zoom minimal (par défaut : un unique zoom natif correspondant à la résolution du raster)."
              },
              "max_zoom": {
                "label": "Zoom maximal",
                "description": "Niveau de zoom maximal (par défaut : identique à min_zoom)."
              },
              "band": {
                "label": "Bande",
                "description": "Bande (indexée à partir de 1) à rendre (par défaut 1)."
              },
              "colormap": {
                "label": "Palette de couleurs",
                "description": "Palette de couleurs : viridis (par défaut), magma, turbo, terrain ou grayscale."
              },
              "method": {
                "label": "Méthode",
                "description": "Méthode de rééchantillonnage pour la reprojection et l'échantillonnage : bilinear (par défaut), nearest, cubic."
              },
              "min": {
                "label": "Minimum",
                "description": "Valeur associée à l'extrémité basse de la palette de couleurs (par défaut : minimum de la bande)."
              },
              "max": {
                "label": "Maximum",
                "description": "Valeur associée à l'extrémité haute de la palette de couleurs (par défaut : maximum de la bande)."
              }
            }
          },
          "raster_to_weighted_points": {
            "name": "Raster vers points pondérés",
            "description": "Distribue un nombre fixe de points sur un raster de sorte que leur densité soit proportionnelle à la valeur de la cellule, en les plaçant selon un réseau de Fibonacci déterministe, une spirale, un motif circulaire ou un centroïde (ArcGIS Raster To Weighted Points). Rien dans les deux registres ne pondère par une surface : random_sample et random_points_in_polygon sont uniformes, create_spatially_balanced_points répartit délibérément les points uniformément, et raster_to_vector_points en émet un par cellule sans amincissement ni pondération. L'allocation utilise la méthode du plus fort reste et ne nécessite aucun générateur aléatoire, les résultats sont donc reproductibles en WASM.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster de surface en entrée ; les valeurs des cellules constituent les poids."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche de points en sortie. Si omise, stockée en mémoire."
              },
              "max_number_of_points": {
                "label": "Nombre maximal de points",
                "description": "Nombre total de points à répartir (par défaut 1000)."
              },
              "method": {
                "label": "Méthode",
                "description": "Placement dans la cellule : 'fibonacci_lattice' (par défaut), 'fibonacci_spiral', 'circular' ou 'centroid'."
              },
              "min_value": {
                "label": "Valeur minimale",
                "description": "Les cellules dont le poids est inférieur ou égal à cette valeur ne reçoivent aucun point (par défaut 0). Les poids négatifs sont toujours exclus."
              },
              "max_points_per_cell": {
                "label": "Points maximaux par cellule",
                "description": "Plafonne le nombre de points qu'une même cellule peut recevoir, afin qu'une seule cellule à forte valeur n'absorbe pas tout le budget."
              },
              "include_weight": {
                "label": "Inclure le poids",
                "description": "Inscrit la valeur de la cellule source sur chaque point (par défaut vrai)."
              },
              "band": {
                "label": "Bande",
                "description": "Bande (indexée à partir de 1) fournissant les poids (par défaut 1)."
              }
            }
          },
          "read_geoparquet": {
            "name": "Lire un GeoParquet",
            "description": "Lit un fichier GeoParquet et le convertit vers un autre format vectoriel (ou le stocke en mémoire).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier GeoParquet en entrée (par ex. /work/data.parquet)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel ; le format est déduit de son extension (.geojson, .fgb, .shp, .gpkg, ...). Si omis, la couche est stockée en mémoire."
              }
            }
          },
          "reclassify_field": {
            "name": "Reclassifier un champ",
            "description": "Classe un attribut vectoriel numérique en classes (comme ArcGIS Reclassify Field) : equal_interval, defined_interval, quantile, natural_breaks (Jenks), std_dev ou geometric_interval, en écrivant un champ de classe entier plus un champ optionnel de valeur de seuil.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle (ou table) en entrée contenant le champ numérique à classer."
              },
              "field": {
                "label": "Champ",
                "description": "Nom du champ numérique à classer."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche vectorielle en sortie avec le champ de classe ajouté. Si omise, stockée en mémoire."
              },
              "method": {
                "label": "Méthode",
                "description": "Méthode de classification : equal_interval, defined_interval, quantile, natural_breaks, std_dev ou geometric_interval (par défaut natural_breaks)."
              },
              "classes": {
                "label": "Classes",
                "description": "Nombre de classes pour equal_interval/quantile/natural_breaks/geometric_interval (par défaut 5). Ignoré par defined_interval et std_dev, dont le nombre de classes découle des données."
              },
              "interval": {
                "label": "Intervalle",
                "description": "Largeur de classe fixe pour defined_interval (obligatoire pour cette méthode)."
              },
              "std_dev_interval": {
                "label": "Intervalle d'écart-type",
                "description": "Taille de l'intervalle pour std_dev, en unités d'écart-type (par défaut 1.0 ; par ex. 0.5 pour des bandes d'un demi-sigma)."
              },
              "class_field": {
                "label": "Champ de classe",
                "description": "Nom du champ de classe entier à ajouter (par défaut 'class')."
              },
              "break_field": {
                "label": "Champ de rupture",
                "description": "Si fourni, ajoute également un champ flottant contenant la limite supérieure de classe dont relève chaque entité."
              }
            }
          },
          "reconstruct_tracks": {
            "name": "Reconstruire les trajets",
            "description": "Transforme des points horodatés en polylignes de traces de déplacement (regroupées par identifiant, triées par temps, divisées aux écarts de temps/distance) avec des statistiques par trace, et trouve éventuellement les emplacements de stationnement où le mobile s'est arrêté — comme ArcGIS Reconstruct Tracks / Find Dwell Locations.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points en entrée comportant des observations horodatées."
              },
              "track_field": {
                "label": "Champ de trace",
                "description": "Champ identifiant chaque trajectoire ou mobile (par ex. l'identifiant d'un véhicule ou d'un animal)."
              },
              "time_field": {
                "label": "Champ de temps",
                "description": "Champ contenant l'heure de chaque point : secondes numériques ou horodatage ISO-8601."
              },
              "output": {
                "label": "Sortie",
                "description": "Vecteur de lignes des trajets en sortie (pilote déduit de l'extension). Si omis, stocké en mémoire."
              },
              "time_gap": {
                "label": "Écart de temps",
                "description": "Commence un nouveau segment de trajet lorsque l'écart de temps entre deux points dépasse ce nombre de secondes. Par défaut : aucun découpage temporel."
              },
              "distance_gap": {
                "label": "Écart de distance",
                "description": "Commence un nouveau segment de trajet lorsque la distance entre deux points dépasse cette valeur (mètres pour un SCR géographique, unités du SCR sinon). Par défaut : aucun découpage par distance."
              },
              "dwells": {
                "label": "Stationnements",
                "description": "Chemin de sortie optionnel des points de stationnement (là où le mobile s'est arrêté)."
              },
              "dwell_distance": {
                "label": "Distance de stationnement",
                "description": "Rayon maximal d'un stationnement, dans les unités de distance ci-dessus. Par défaut 50."
              },
              "dwell_min_duration": {
                "label": "Durée minimale de stationnement",
                "description": "Temps minimal (en secondes) pendant lequel un mobile doit rester dans dwell_distance pour être compté comme un stationnement. Par défaut 300."
              }
            }
          },
          "reduce_point_density": {
            "name": "Réduire la densité de points",
            "description": "Amincit une couche de points vectoriels de sorte que deux points conservés ne soient jamais plus proches qu'un espacement minimal, ou conserve un point par cellule de grille (ArcGIS Reduce Point Density). lidar_thin est limité au LAS et find_identical ne capture que les doublons exacts, de sorte que les couches denses de sondages, GPS et capteurs ne pouvaient pas être décimées avant interpolation.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de points (ou multipoints) en entrée."
              },
              "method": {
                "label": "Méthode",
                "description": "'spacing' (par défaut) : éclaircissage glouton à séparation minimale. 'bin' : conserve un point par cellule de grille."
              },
              "min_distance": {
                "label": "Distance minimale",
                "description": "Séparation minimale entre les points conservés, en unités de la couche. Obligatoire pour la méthode 'spacing'."
              },
              "bin_size": {
                "label": "Taille des cellules",
                "description": "Taille de cellule de la grille en unités de la couche. Obligatoire pour la méthode 'bin'."
              },
              "sort_field": {
                "label": "Champ de tri",
                "description": "Attribut numérique déterminant quel point l'emporte en cas de conflit. À défaut, c'est l'ordre d'entrée qui décide."
              },
              "sort_order": {
                "label": "Ordre de tri",
                "description": "'descending' (par défaut, le sort_field le plus élevé l'emporte) ou 'ascending'."
              },
              "keep_field": {
                "label": "Champ à conserver",
                "description": "Attribut signalant les points qui doivent toujours être conservés (non nul / vrai / non vide). À utiliser pour les dangers tels que les sondes de hauts-fonds."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche en sortie des points conservés. Si omise, stockée en mémoire."
              },
              "output_removed": {
                "label": "Éléments supprimés en sortie",
                "description": "Couche optionnelle recevant les points écartés, pour vérification."
              }
            }
          },
          "regression_kriging": {
            "name": "Krigeage de régression",
            "description": "Krigeage avec dérive externe : régresse les valeurs d'échantillons sur des rasters de covariables exhaustifs, ajuste un variogramme aux résidus et rajoute le champ de résidus krigé à la surface de régression (ArcGIS EBK Regression Prediction). Chaque variante de krigeage livrée modélise la tendance dans les coordonnées ou nécessite des échantillons ponctuels secondaires ; aucune n'accepte de rasters de covariables, ce dont la plupart des applications géostatistiques ont réellement besoin.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de points d'échantillonnage."
              },
              "value_field": {
                "label": "Champ de valeur",
                "description": "Attribut numérique à prédire."
              },
              "covariates": {
                "label": "Covariables",
                "description": "Chemins des rasters de covariables, séparés par des virgules ou des points-virgules, couvrant l'intégralité de la grille de prédiction. Le premier définit la grille de sortie."
              },
              "variogram_model": {
                "label": "Modèle de variogramme",
                "description": "Modèle de variogramme des résidus : 'spherical' (par défaut), 'exponential' ou 'gaussian'."
              },
              "lag_count": {
                "label": "Nombre de décalages",
                "description": "Nombre de classes de distance utilisées pour ajuster le variogramme des résidus (par défaut 12)."
              },
              "max_neighbors": {
                "label": "Voisins maximaux",
                "description": "Nombre d'échantillons les plus proches utilisés dans le système de krigeage de chaque cellule (par défaut 16)."
              },
              "bilinear": {
                "label": "Bilinéaire",
                "description": "Échantillonne les covariables par interpolation bilinéaire aux emplacements des points plutôt que par plus proche cellule (par défaut faux)."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster de prédiction en sortie. Si omis, le résultat est stocké en mémoire."
              },
              "output_error": {
                "label": "Erreur en sortie",
                "description": "Raster de l'erreur type de prédiction (erreur type de krigeage du champ de résidus). Toujours produit."
              }
            }
          },
          "regularize_adjacent_building_footprint": {
            "name": "Régulariser les emprises de bâtiments adjacents",
            "description": "Régularise un groupe d'emprises de bâtiments adjacentes selon une orientation partagée afin que les murs communs restent parallèles et colinéaires (comme ArcGIS Regularize Adjacent Building Footprint) — le pendant cohérent par groupe de regularize_building_footprints, par bâtiment, qui laisse les emprises voisines se désaligner.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de polygones d'emprises de bâtiments en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin des polygones en sortie. Si omis, stocké en mémoire."
              },
              "group": {
                "label": "Groupe",
                "description": "Champ optionnel regroupant les emprises à régulariser ensemble. À défaut, les groupes sont formés par adjacence des limites."
              },
              "method": {
                "label": "Méthode",
                "description": "'right_angles' (par défaut) ou 'right_angles_and_diagonals'."
              },
              "tolerance": {
                "label": "Tolérance",
                "description": "Longueur minimale de mur ; les bords plus courts sont élagués comme du bruit (unités du SCR). Par défaut 1.0."
              },
              "precision": {
                "label": "Précision",
                "description": "Pas de grille pour l'accrochage des décalages de murs, afin que des murs parallèles proches deviennent colinéaires (unités du SCR). Par défaut : tolerance."
              },
              "adjacency_distance": {
                "label": "Distance d'adjacence",
                "description": "Lorsqu'aucun champ 'group' n'est fourni, les emprises dont les sommets se trouvent à moins de cette distance forment un même groupe (unités du SCR). Par défaut : 2 x tolerance."
              }
            }
          },
          "regularize_building_footprints": {
            "name": "Régulariser les emprises de bâtiments",
            "description": "Normalise des polygones d'emprises de bâtiments bruités en formes régulières (murs à angle droit, en diagonale, à angle quelconque ou circulaires).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier vectoriel de polygones en entrée, format détecté automatiquement (ou référence en mémoire)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel (pilote selon son extension). S'il est omis, stocké en mémoire."
              },
              "method": {
                "label": "Méthode",
                "description": "Méthode de régularisation : 'right_angles' (par défaut), 'right_angles_and_diagonals', 'any_angle' ou 'circle'."
              },
              "tolerance": {
                "label": "Tolérance",
                "description": "Distance maximale (en unités du SCR) dont l'emprise régularisée peut s'écarter de la limite d'origine. Par défaut 1.0."
              },
              "diagonal_penalty": {
                "label": "Pénalité diagonale",
                "description": "Pour 'right_angles_and_diagonals' : intensité de la préférence donnée aux angles droits par rapport aux murs à 45 degrés (un mur ne devient diagonal que lorsque son écart angulaire à une diagonale, multiplié par ce facteur, est inférieur à son écart à un axe). Par défaut 1.5 ; des valeurs plus grandes donnent moins de diagonales."
              },
              "min_radius": {
                "label": "Rayon minimal",
                "description": "Pour 'circle' : plus petit rayon ajusté autorisé ; les ajustements plus petits conservent l'emprise d'origine. Par défaut 0.1."
              },
              "max_radius": {
                "label": "Rayon maximal",
                "description": "Pour 'circle' : plus grand rayon ajusté autorisé ; les ajustements plus grands conservent l'emprise d'origine. Illimité si omis."
              }
            }
          },
          "remove_overlap_multiple": {
            "name": "Supprimer le recouvrement (multiple)",
            "description": "Réaffecte chaque chevauchement d'un ensemble de polygones à exactement une entité, produisant une partition de leur union sans trou ni chevauchement (division par ligne centrale ou Thiessen), comme l'outil ArcGIS Remove Overlap (Multiple).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de polygones en entrée (les entités peuvent se chevaucher)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de polygones en sortie (pilote déduit de l'extension). Si omis, le résultat est stocké en mémoire."
              },
              "method": {
                "label": "Méthode",
                "description": "'center_line' (affecte chaque point de recouvrement à l'entité dans laquelle il se trouve le plus profondément, par défaut) ou 'thiessen' (centroïde générateur le plus proche)."
              },
              "grid_resolution": {
                "label": "Résolution de grille",
                "description": "Nombre de cellules sur le côté le plus long de chaque zone de recouvrement lors de la division (par défaut 40 ; plus élevé = lignes de partage plus lisses, mais plus lent)."
              }
            }
          },
          "remove_thermal_noise": {
            "name": "Supprimer le bruit thermique",
            "description": "Soustrait le plancher de bruit thermique additif du récepteur de la rétrodiffusion SAR, supprimant le banding transversal à la fauchée qui domine les surfaces sombres telles que l'eau calme, les terrains inondés et l'ombre radar (ArcGIS Remove Thermal Noise). Rien dans les deux registres ne fait cela : les filtres lee/frost/kuan/refined-lee intégrés suppriment le chatoiement multiplicatif, une grandeur différente. Sans lui, un seuil d'eau d'Otsu s'accroche à une limite de sous-fauchée plutôt qu'à un trait de côte, et les rapports de polarisation croisée sont calculés à partir d'un numérateur qui est en grande partie du bruit.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster de rétrodiffusion SAR calibré."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster débruité en sortie. Si omis, stocké en mémoire."
              },
              "output_snr": {
                "label": "SNR en sortie",
                "description": "Rapport signal sur bruit en sortie, en dB. Toujours produit ; stocké en mémoire si aucun chemin n'est fourni."
              },
              "noise_raster": {
                "label": "Raster de bruit",
                "description": "Raster de puissance de bruit par cellule, recalé sur l'entrée. Prioritaire sur les deux autres formes."
              },
              "noise_profile": {
                "label": "Profil de bruit",
                "description": "Puissances de bruit en travers de la portée, séparées par des virgules, interpolées linéairement sur les colonnes du raster. Au moins deux valeurs."
              },
              "noise_constant": {
                "label": "Constante de bruit",
                "description": "Sigma nought équivalent au bruit, unique, appliqué à chaque cellule."
              },
              "noise_units": {
                "label": "Unités de bruit",
                "description": "Unités dans lesquelles sont exprimées les valeurs de bruit : 'intensity' (par défaut), 'dn', 'amplitude' ou 'db'."
              },
              "input_units": {
                "label": "Unités d'entrée",
                "description": "'intensity' (par défaut), 'dn', 'amplitude' ou 'db'."
              },
              "output_units": {
                "label": "Unités de sortie",
                "description": "'linear' (par défaut) ou 'db'."
              },
              "floor_fraction": {
                "label": "Fraction de plancher",
                "description": "Les cellules ramenées à zéro ou en dessous sont bornées à cette fraction de la puissance de bruit locale (par défaut 0.01). Cela garde une conversion en dB finie."
              },
              "band": {
                "label": "Bande",
                "description": "Bande (indexée à partir de 1) à débruiter (par défaut 1)."
              }
            }
          },
          "render_raster_png": {
            "name": "Rendre le raster en PNG",
            "description": "Rend une seule bande raster en image PNG via une palette de couleurs (NoData devient transparent).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier PNG en sortie (par ex. /work/preview.png)."
              },
              "band": {
                "label": "Bande",
                "description": "Bande (indexée à partir de 1) à rendre (par défaut 1)."
              },
              "colormap": {
                "label": "Palette de couleurs",
                "description": "Palette de couleurs : viridis (par défaut), magma, turbo, terrain ou grayscale."
              },
              "min": {
                "label": "Minimum",
                "description": "Valeur associée à l'extrémité basse de la palette de couleurs (par défaut : minimum de la bande)."
              },
              "max": {
                "label": "Maximum",
                "description": "Valeur associée à l'extrémité haute de la palette de couleurs (par défaut : maximum de la bande)."
              }
            }
          },
          "render_vector_png": {
            "name": "Rendre le vecteur en PNG",
            "description": "Dessine une couche vectorielle (points/lignes/polygones) en image cartographique PNG.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier vectoriel en entrée ou identifiant d'un objet en mémoire."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier PNG en sortie (par ex. /work/map.png)."
              },
              "width": {
                "label": "Largeur",
                "description": "Largeur de l'image en pixels (par défaut 800)."
              },
              "height": {
                "label": "Hauteur",
                "description": "Hauteur de l'image en pixels (par défaut : déduite du rapport d'aspect des données)."
              },
              "fill": {
                "label": "Remplir",
                "description": "Couleur de remplissage des polygones et des points au format #rrggbb ou #rrggbbaa (par défaut bleu semi-transparent)."
              },
              "stroke": {
                "label": "Contour",
                "description": "Couleur du contour ou de la ligne au format #rrggbb ou #rrggbbaa (par défaut bleu foncé)."
              },
              "stroke_width": {
                "label": "Largeur de contour",
                "description": "Épaisseur du contour ou de la ligne en pixels (par défaut 1)."
              },
              "background": {
                "label": "Fond",
                "description": "Couleur d'arrière-plan au format #rrggbb[aa] ou 'transparent' (par défaut transparent)."
              }
            }
          },
          "repair_geometry": {
            "name": "Réparer la géométrie",
            "description": "Détecte et corrige les géométries polygonales invalides — auto-intersections (via auto-union), orientation des anneaux, sommets dupliqués et parties nulles/vides — ou, avec check_only, rapporte un code de problème par entité. Comme ArcGIS Repair Geometry / Check Geometry.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier vectoriel de polygones en entrée, format détecté automatiquement (ou identifiant d'un objet en mémoire)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel (pilote selon son extension). S'il est omis, stocké en mémoire."
              },
              "check_only": {
                "label": "Vérifier uniquement",
                "description": "Lorsque vrai, ne modifie pas la géométrie : renvoie l'entrée avec les colonnes 'problem_code' et 'problem_desc' (comme l'outil Check Geometry d'ArcGIS). Par défaut faux."
              }
            }
          },
          "rescale_by_function": {
            "name": "Redimensionner par fonction",
            "description": "Remet à l'échelle un raster continu sur une échelle d'aptitude commune via une fonction de transfert (linear, inverse_linear, power, exponential, logarithmic, logistic, gaussian, near, small, large, symmetric_linear), comme l'outil ArcGIS Rescale By Function.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster continu en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              },
              "function": {
                "label": "Fonction",
                "description": "Fonction de transfert : linear (par défaut), inverse_linear, power, exponential, logarithmic, logistic, gaussian, near, small, large, symmetric_linear."
              },
              "from_scale": {
                "label": "Échelle de départ",
                "description": "Extrémité basse de l'échelle de sortie (par défaut 0)."
              },
              "to_scale": {
                "label": "Échelle d'arrivée",
                "description": "Extrémité haute de l'échelle de sortie (par défaut 1)."
              },
              "param1": {
                "label": "Paramètre 1",
                "description": "Premier paramètre de forme (exposant pour power ; raideur pour exponential/logarithmic/logistic/small/large ; centre pour gaussian/near). Valeur par défaut propre à chaque fonction."
              },
              "param2": {
                "label": "Paramètre 2",
                "description": "Second paramètre de forme (étalement pour gaussian/near). Valeur par défaut propre à chaque fonction."
              },
              "low_threshold": {
                "label": "Seuil bas",
                "description": "Seuil bas optionnel : les valeurs inférieures sont converties en 'value_below'."
              },
              "high_threshold": {
                "label": "Seuil haut",
                "description": "Seuil haut optionnel : les valeurs supérieures sont converties en 'value_above'."
              },
              "value_below": {
                "label": "Valeur en dessous",
                "description": "Valeur de sortie pour les cellules inférieures à 'low_threshold' (par défaut = from_scale)."
              },
              "value_above": {
                "label": "Valeur au-dessus",
                "description": "Valeur de sortie pour les cellules supérieures à 'high_threshold' (par défaut = to_scale)."
              },
              "band": {
                "label": "Bande",
                "description": "Bande (indexée à partir de 1) à remettre à l'échelle (par défaut 1)."
              }
            }
          },
          "resolve_building_conflicts": {
            "name": "Résoudre les conflits de bâtiments",
            "description": "Déplace, réduit ou masque les emprises de bâtiments en conflit graphique avec des barrières routières symbolisées (et entre elles) pour la cartographie à petite échelle, en marquant chacune d'un statut, comme l'outil ArcGIS Resolve Building Conflicts.",
            "params": {
              "buildings": {
                "label": "Bâtiments",
                "description": "Couche de polygones de bâtiments en entrée."
              },
              "barriers": {
                "label": "Barrières",
                "description": "Couche de lignes barrières (par ex. des routes) que les bâtiments doivent dégager."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche de bâtiments en sortie avec un champ 'status'. Si omise, stockée en mémoire."
              },
              "barrier_width": {
                "label": "Largeur de barrière",
                "description": "Largeur symbolisée de la barrière en unités carte (une zone tampon de la moitié de cette valeur est appliquée de chaque côté). Par défaut 0."
              },
              "gap": {
                "label": "Écart",
                "description": "Espacement minimal à conserver entre un bâtiment et une barrière (unités carte). Par défaut 0."
              },
              "min_size": {
                "label": "Taille minimale",
                "description": "Surface minimale de bâtiment (unités carte²) en deçà de laquelle un bâtiment en conflit est masqué plutôt que réduit. Par défaut 0 (ne jamais masquer)."
              },
              "hide": {
                "label": "Masquer",
                "description": "Indique s'il faut supprimer les bâtiments masqués de la sortie (par défaut faux : ils sont conservés avec status='hidden')."
              }
            }
          },
          "resolve_road_conflicts": {
            "name": "Résoudre les conflits routiers",
            "description": "Déplace les routes dont les représentations symbolisées (largeur dessinée) se chevauchent ou s'entassent à une échelle cible : les routes de hiérarchie inférieure sont écartées des routes de hiérarchie supérieure par des décalages de sommets lissés à extrémités épinglées, en émettant éventuellement des liens de déplacement, comme ArcGIS Resolve Road Conflicts / Propagate Displacement.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de lignes de routes en entrée (LineString / MultiLineString)."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche de routes déplacées en sortie avec les champs 'status' et 'shift'. Si omise, stockée en mémoire."
              },
              "symbol_width": {
                "label": "Largeur de symbole",
                "description": "Largeur symbolisée fixe pour toutes les routes, en unités carte (ou en mm page lorsque 'scale' est défini). Utilisée lorsque 'symbol_width_field' est absent."
              },
              "symbol_width_field": {
                "label": "Champ de largeur de symbole",
                "description": "Champ numérique donnant la largeur symbolisée de chaque route (unités carte, ou mm page lorsque 'scale' est défini). Retombe sur 'symbol_width' lorsqu'une valeur est manquante."
              },
              "hierarchy_field": {
                "label": "Champ de hiérarchie",
                "description": "Champ numérique classant l'importance des routes (valeur plus faible = plus importante, maintenue fixe). Absent : toutes les routes se partagent le déplacement à parts égales."
              },
              "scale": {
                "label": "Échelle",
                "description": "Dénominateur de l'échelle de la carte cible. Lorsqu'il est défini, les largeurs de symboles sont des millimètres page convertis en unités terrain (mm * échelle / 1000). Par défaut : les largeurs sont prises directement comme unités carte."
              },
              "gap": {
                "label": "Écart",
                "description": "Espacement libre supplémentaire à conserver entre les bandes de symboles, en unités carte. Par défaut 0."
              },
              "max_iter": {
                "label": "Itérations maximales",
                "description": "Nombre maximal d'itérations de déplacement. Par défaut 50."
              },
              "pin_endpoints": {
                "label": "Épingler les extrémités",
                "description": "Maintient fixes le premier et le dernier sommet de chaque route afin de préserver les jonctions et la connectivité (par défaut vrai)."
              },
              "links": {
                "label": "Liens",
                "description": "Chemin de sortie optionnel pour les liens de déplacement (lignes de→vers) exploitables par rubbersheet_features."
              }
            }
          },
          "ripleys_k": {
            "name": "K de Ripley",
            "description": "Analyse de semis de points multi-distances (fonction K / L de Ripley) avec des enveloppes Monte-Carlo d'aléa spatial complet, pour détecter le regroupement ou la dispersion sur une gamme de distances.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points en entrée (les autres géométries utilisent leur point représentatif, moyenne de leurs sommets)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin CSV optionnel pour le tableau K/L. Le tableau est également renvoyé dans le résultat de l'outil."
              },
              "distance_bands": {
                "label": "Bandes de distance",
                "description": "Nombre de bandes de distance à évaluer (par défaut 10)."
              },
              "max_distance": {
                "label": "Distance maximale",
                "description": "Plus grande distance à évaluer, en unités du SCR. Par défaut : un quart du plus petit côté de la boîte englobante des points."
              },
              "permutations": {
                "label": "Permutations",
                "description": "Nombre de simulations CSR pour l'enveloppe de significativité (par défaut 99 ; 0 désactive l'enveloppe)."
              },
              "weight_field": {
                "label": "Champ de poids",
                "description": "Champ numérique optionnel pondérant chaque point."
              },
              "seed": {
                "label": "Graine",
                "description": "Germe du générateur aléatoire CSR (par défaut 1), pour des enveloppes reproductibles."
              }
            }
          },
          "rubbersheet_features": {
            "name": "Ajuster les entités par rubbersheeting",
            "description": "Déforme une couche vectorielle pour l'aligner sur une cible à l'aide de liens de déplacement : une transformation affine par morceaux sur TIN de Delaunay (ou IDW) qui place les points de contrôle sur leurs cibles et déforme tout ce qui est entre eux de façon lisse — la transformation de conflation, comme l'outil ArcGIS Rubbersheet Features.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée à ajuster (tout type de géométrie)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de sortie optionnel (pilote déduit de l'extension). Si omis, stocké en mémoire."
              },
              "links": {
                "label": "Liens",
                "description": "Couche de lignes optionnelle des liens de déplacement (pour chaque ligne : premier sommet = origine, dernier sommet = destination)."
              },
              "target": {
                "label": "Cible",
                "description": "Couche vectorielle cible optionnelle ; les liens sont générés en associant le point représentatif de chaque entité d'entrée à la cible la plus proche dans search_distance."
              },
              "search_distance": {
                "label": "Distance de recherche",
                "description": "Distance maximale pour associer l'entrée à la cible lors de la génération des liens (unités du SCR). Obligatoire avec 'target'."
              },
              "method": {
                "label": "Méthode",
                "description": "'linear' (TIN de Delaunay affine par morceaux, par défaut) ou 'idw' (pondération par l'inverse de la distance)."
              },
              "power": {
                "label": "Puissance",
                "description": "Puissance IDW pour la décroissance en dehors du TIN / pour method=idw. Par défaut 2."
              }
            }
          },
          "sar_coherence": {
            "name": "Cohérence SAR",
            "description": "Calcule la magnitude de cohérence interférométrique normalisée (et en option la phase interférométrique) entre deux acquisitions SAR complexes co-enregistrées sur une fenêtre glissante (ArcGIS Compute Coherence / Generate Interferogram). La cohérence mesure la stabilité de phase plutôt que la luminosité, elle détecte donc des changements que la différence d'intensité ne peut pas voir — effondrement, inondation sous végétation, récolte, mouvement de glace — par tous les temps. Aucun outil des deux registres n'utilise la phase SAR. Les entrées sont des paires I/Q à deux bandes et doivent déjà être co-enregistrées.",
            "params": {
              "reference": {
                "label": "Référence",
                "description": "Raster SAR complexe (deux bandes : I et Q) de la première acquisition."
              },
              "secondary": {
                "label": "Secondaire",
                "description": "Raster SAR complexe recalé (deux bandes : I et Q) de la seconde acquisition."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin optionnel du raster de cohérence en sortie (magnitude, 0..1). Si omis, stocké en mémoire."
              },
              "output_phase": {
                "label": "Phase en sortie",
                "description": "Chemin de sortie optionnel pour le raster de phase interférométrique en radians, replié dans (-pi, pi]."
              },
              "window_size": {
                "label": "Taille de fenêtre",
                "description": "Fenêtre d'estimation exprimée en cellules sous la forme 'range,azimuth' (par défaut '5,5'). L'estimateur est centré, donc une valeur paire est arrondie AU-DESSUS à la taille impaire suivante ; la fenêtre effective est renvoyée dans window_range/window_azimuth."
              },
              "bias_correction": {
                "label": "Correction de biais",
                "description": "Corrige le biais positif de l'estimateur de cohérence pour les petites tailles de fenêtre (par défaut vrai)."
              }
            }
          },
          "semivariogram_sensitivity": {
            "name": "Sensibilité du semi-variogramme",
            "description": "Perturbe la pépite, le palier partiel et la portée d'un variogramme ajusté, re-krige aux emplacements d'évaluation et rapporte de combien les prédictions et les erreurs standards varient — le contrôle standard de robustesse d'un modèle de krigeage (ArcGIS GA Semivariogram Sensitivity). La suite de krigeage intégrée est large et kriging_cross_validation mesure l'ajustement, mais rien ne mesure la sensibilité, et les deux sont indépendants : un modèle bien validé par validation croisée peut rester très fragile vis-à-vis des paramètres choisis par l'analyste.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de points contenant les valeurs mesurées."
              },
              "field": {
                "label": "Champ",
                "description": "Champ numérique à kriger."
              },
              "locations": {
                "label": "Emplacements",
                "description": "Couche de points des emplacements de prédiction où évaluer la sensibilité."
              },
              "output": {
                "label": "Sortie",
                "description": "Table comportant une ligne par modèle perturbé. Si omise, stockée en mémoire."
              },
              "model": {
                "label": "Modèle",
                "description": "Modèle de variogramme : 'exponential' (par défaut), 'spherical' ou 'gaussian'."
              },
              "nugget_span_percent": {
                "label": "Plage de pépite (%)",
                "description": "Demi-amplitude de perturbation de la pépite, en pourcentage (par défaut 10)."
              },
              "partial_sill_span_percent": {
                "label": "Plage de palier partiel (%)",
                "description": "Demi-amplitude de perturbation du palier partiel, en pourcentage (par défaut 10)."
              },
              "range_span_percent": {
                "label": "Plage de portée (%)",
                "description": "Demi-amplitude de perturbation de la portée, en pourcentage (par défaut 10)."
              },
              "nugget_steps": {
                "label": "Pas de pépite",
                "description": "Nombre d'échantillons sur la plage de la pépite (par défaut 3 ; 1 la fixe à la valeur ajustée)."
              },
              "partial_sill_steps": {
                "label": "Pas de palier partiel",
                "description": "Nombre d'échantillons sur la plage du palier partiel (par défaut 3)."
              },
              "range_steps": {
                "label": "Pas de portée",
                "description": "Nombre d'échantillons sur la plage de la portée (par défaut 3)."
              },
              "lag_count": {
                "label": "Nombre de décalages",
                "description": "Nombre de classes de distance du variogramme empirique utilisées pour l'ajustement de référence (par défaut 12)."
              }
            }
          },
          "similarity_search": {
            "name": "Recherche par similarité",
            "description": "Classe des entités candidates par similarité attributaire avec une ou plusieurs entités de référence sur des champs numériques standardisés en z (euclidienne ou cosinus), les plus/moins/les deux — comme l'outil ArcGIS Similarity Search.",
            "params": {
              "reference": {
                "label": "Référence",
                "description": "Couche vectorielle de référence (une ou plusieurs entités définissant le profil à retrouver)."
              },
              "candidates": {
                "label": "Candidats",
                "description": "Couche vectorielle des candidats à classer selon leur similarité avec la référence."
              },
              "fields": {
                "label": "Champs",
                "description": "Champ(s) numérique(s) à comparer, séparés par des virgules (doivent exister dans les deux couches)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel en sortie (candidats classés). Si omis, stocké en mémoire."
              },
              "match_method": {
                "label": "Méthode d'appariement",
                "description": "'euclidean' (distance sur variables standardisées ; par défaut) ou 'cosine' (similarité angulaire)."
              },
              "most_or_least": {
                "label": "Le plus ou le moins",
                "description": "Conserve les plus similaires ('most', par défaut), les moins similaires ('least') ou les deux extrémités ('both')."
              },
              "num_results": {
                "label": "Nombre de résultats",
                "description": "Nombre de résultats à conserver par extrémité (0 = tous les candidats). Par défaut 10."
              }
            }
          },
          "simplify_3d_line": {
            "name": "Simplifier une ligne 3D",
            "description": "Réduit le nombre de sommets de polylignes 3D par une division de Douglas-Peucker qui mesure l'écart en trois dimensions, en préservant le profil vertical, comme l'outil ArcGIS Simplify 3D Line.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de polylignes en entrée (sommets 3D ; les sommets 2D sont traités comme un cas particulier planaire)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. Si omis, le résultat est stocké en mémoire."
              },
              "tolerance": {
                "label": "Tolérance",
                "description": "Écart 3D maximal en unités carte. Les sommets situés plus près que cette distance de la corde sont supprimés."
              },
              "z_factor": {
                "label": "Facteur Z",
                "description": "Multiplicateur appliqué à Z avant le test de distance, pour les données dont l'unité Z diffère de celle de XY (par défaut 1)."
              }
            }
          },
          "simplify_building": {
            "name": "Simplifier un bâtiment",
            "description": "Réduit les sommets des emprises de bâtiments en protégeant les angles droits, avec un seuil de suppression par surface minimale, comme l'outil ArcGIS Simplify Building.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Polygones d'emprises de bâtiments."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. Si omis, le résultat est stocké en mémoire."
              },
              "tolerance": {
                "label": "Tolérance",
                "description": "Tolérance de simplification en unités carte : distance maximale dont la limite peut se déplacer."
              },
              "minimum_area": {
                "label": "Surface minimale",
                "description": "Les emprises dont la surface est inférieure à cette valeur sont supprimées (par défaut 0, tout conserver)."
              },
              "keep_collapsed_points": {
                "label": "Conserver les points réduits",
                "description": "Émet un point au centroïde de chaque emprise supprimée par minimum_area (par défaut faux)."
              },
              "corner_tolerance": {
                "label": "Tolérance d'angle",
                "description": "Nombre de degrés en deçà duquel un angle intérieur est considéré comme un angle droit protégé (par défaut 20)."
              }
            }
          },
          "simplify_by_circular_arcs": {
            "name": "Simplifier par arcs de cercle",
            "description": "Simplifie les lignes et les polygones en remplaçant des séries de sommets par des segments droits et de vrais arcs de cercle, en préservant les courbes d'ingénierie au lieu de les approximer par des cordes (ArcGIS Simplify By Straight Lines And Circular Arcs ; le mode « tangent » couvre Simplify By Tangent Segments). Tous les simplificateurs des deux registres ne font que supprimer des sommets, ce qui force un choix entre une courbe à facettes et un nombre de sommets inacceptable sur les bulbes d'impasses, les ronds-points et les emprises de réservoirs. Les cercles sont ajustés par moindres carrés algébriques mais acceptés selon le véritable écart orthogonal, de sorte que la garantie de tolérance tient.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de lignes ou de polygones en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel. Si omis, le résultat est stocké en mémoire."
              },
              "tolerance": {
                "label": "Tolérance",
                "description": "Écart maximal autorisé entre une primitive ajustée et les sommets d'origine, en unités du SCR."
              },
              "mode": {
                "label": "Mode",
                "description": "'arcs' (par défaut ; ajuste des segments droits et des arcs de cercle) ou 'tangent' (segments droits uniquement, le comportement de Simplify By Tangent Segments)."
              },
              "min_arc_angle": {
                "label": "Angle d'arc minimal",
                "description": "Les arcs sous-tendant moins de ce nombre de degrés sont émis sous forme de segments droits (par défaut 10)."
              },
              "max_radius": {
                "label": "Rayon maximal",
                "description": "Les arcs dont le rayon dépasse cette valeur sont émis sous forme de segments droits (par défaut : 1e6)."
              },
              "densify_output": {
                "label": "Densification en sortie",
                "description": "Redensifie les arcs ajustés selon une tolérance de corde à l'écriture (par défaut vrai). Lorsque cette option est fausse, seules les extrémités des arcs sont émises, de sorte que la géométrie seule perd la courbe — lisez 'output_arcs' pour la récupérer."
              },
              "output_arcs": {
                "label": "Arcs en sortie",
                "description": "Chemin optionnel pour la table des arcs ajustés (identifiant d'entité, extrémités, centre, rayon, balayage signé en degrés). Si omis, stockée en mémoire (et toujours renvoyée)."
              }
            }
          },
          "simplify_by_tangent_segments": {
            "name": "Simplifier par segments tangents",
            "description": "Remplace une géométrie de courbe densifiée par la chaîne minimale de segments droits restant dans un décalage perpendiculaire maximal, en joignant les segments consécutifs à leur intersection pour que le résultat reste tangent à l'original (ArcGIS Simplify By Tangent Segments). Le compagnon linéaire de simplify_by_circular_arcs : simplify_features (Douglas-Peucker) ne peut que conserver des sommets existants et ne garantit aucune tangence, laissant des cassures sur les géométries d'ingénierie, tandis que smooth_line et smooth_natural_features déplacent les sommets au lieu de les réduire.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Entités linéaires ou surfaciques à simplifier."
              },
              "output": {
                "label": "Sortie",
                "description": "Entités simplifiées avec les champs de nombre de sommets ajoutés. Si omises, stockées en mémoire."
              },
              "max_offset": {
                "label": "Décalage maximal",
                "description": "Écart perpendiculaire maximal par rapport à l'original, en UNITÉS DU SCR. En EPSG:4326 il s'agit de degrés, un travail à l'échelle métrique nécessite donc environ 2e-5, et non 2.0. La borne est appliquée à chaque ligne ajustée, si bien que la chaîne émise peut la dépasser légèrement près d'une jointure où se rencontrent des segments consécutifs."
              },
              "anchor_points": {
                "label": "Points d'ancrage",
                "description": "Couche de points optionnelle dont les emplacements doivent subsister comme sommets (anchor_points d'ArcGIS). Les suites ne sont jamais étendues au-delà d'une ancre."
              },
              "anchor_tolerance": {
                "label": "Tolérance d'ancrage",
                "description": "Distance en deçà de laquelle un sommet d'entrée est considéré comme correspondant à un point d'ancrage (unités du SCR). Par défaut : max_offset."
              },
              "min_run": {
                "label": "Série minimale",
                "description": "Nombre minimal de sommets d'entrée qu'une série doit couvrir avant d'être réduite à un segment (par défaut 3). Les séries plus courtes sont produites telles quelles."
              },
              "preserve_endpoints": {
                "label": "Préserver les extrémités",
                "description": "Conserver exactement le premier et le dernier sommet de chaque partie (par défaut vrai)."
              }
            }
          },
          "simplify_shared_edges": {
            "name": "Simplifier les bords partagés",
            "description": "Simplifie une couverture polygonale en gardant coïncidentes les limites partagées entre polygones adjacents (sans trous ni résidus), comme l'outil ArcGIS Simplify Shared Edges.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier vectoriel de polygones en entrée, format détecté automatiquement (ou référence en mémoire)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel (pilote selon son extension). S'il est omis, stocké en mémoire."
              },
              "tolerance": {
                "label": "Tolérance",
                "description": "Tolérance de simplification Douglas-Peucker : distance maximale (en unités du SCR) dont un arc simplifié peut s'écarter de l'original. Par défaut 1.0."
              },
              "simplify_boundary": {
                "label": "Simplifier la limite",
                "description": "Simplifier aussi les arcs de la limite extérieure de la couverture (bords appartenant à un seul polygone). Par défaut vrai ; définir à faux pour conserver la limite extérieure inchangée."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Quantifier les sommets sur une grille de cette taille (unités du SCR) avant de construire la topologie, afin que les sommets partagés quasi coïncidents soient traités comme un seul. Par défaut 0 (utiliser les coordonnées telles quelles)."
              }
            }
          },
          "slice_raster": {
            "name": "Découper le raster en classes",
            "description": "Classe un raster continu en N zones ordinales (intervalle égal, surface égale, seuils naturels, intervalle géométrique ou écart-type).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster continu en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de zones en sortie optionnel. Si omis, stocké en mémoire."
              },
              "band": {
                "label": "Bande",
                "description": "Bande à classer, numérotée à partir de 1 (par défaut 1)."
              },
              "number_zones": {
                "label": "Nombre de zones",
                "description": "Nombre de zones en sortie (par défaut 10). Ignoré pour std_dev."
              },
              "slice_type": {
                "label": "Type de tranche",
                "description": "Méthode de classification : equal_interval, equal_area, natural_breaks, geometric_interval ou std_dev (par défaut equal_interval)."
              },
              "base_output_zone": {
                "label": "Zone de base en sortie",
                "description": "Identifiant attribué à la zone la plus basse (par défaut 1)."
              },
              "class_interval_size": {
                "label": "Taille d'intervalle de classe",
                "description": "Taille de l'intervalle d'écart-type en unités σ (par défaut 1.0). Utilisée uniquement par std_dev."
              }
            }
          },
          "smooth_natural_features": {
            "name": "Lisser les entités naturelles",
            "description": "Lisse les polygones pixelisés et les lignes dentelées (sorties raster vers vecteur) en courbes d'aspect naturel par coupe de coins de Chaikin, en préservant la surface des polygones.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier vecteur en entrée contenant des entités polygonales ou linéaires, format détecté automatiquement (ou référence en mémoire)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel (pilote selon son extension). S'il est omis, stocké en mémoire."
              },
              "segment_length": {
                "label": "Longueur de segment",
                "description": "Échelle du bruit en escalier à supprimer, en unités du SCR — idéalement la taille de cellule du raster source. Détectée automatiquement à partir de la longueur médiane des bords de la couche si omise."
              },
              "iterations": {
                "label": "Itérations",
                "description": "Itérations de lissage Chaikin (1-8) ; davantage d'itérations donnent une sortie plus lisse comportant plus de sommets. Par défaut 3."
              },
              "preserve_area": {
                "label": "Préserver la surface",
                "description": "Rétablir la surface d'origine de chaque polygone après le lissage (le rognage des angles rétrécit les formes convexes). Par défaut vrai."
              }
            }
          },
          "smooth_shared_edges": {
            "name": "Lisser les bords partagés",
            "description": "Lisse une couverture polygonale en gardant coïncidentes les limites partagées entre polygones adjacents (sans trous ni résidus), comme l'outil ArcGIS Smooth Shared Edges.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier vectoriel de polygones en entrée, format détecté automatiquement (ou référence en mémoire)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel (pilote selon son extension). S'il est omis, stocké en mémoire."
              },
              "algorithm": {
                "label": "Algorithme",
                "description": "Algorithme de lissage : 'paek' (noyau gaussien, contrôlé par la tolérance ; par défaut) ou 'bezier' (rognage des angles de Chaikin, ignore la tolérance)."
              },
              "tolerance": {
                "label": "Tolérance",
                "description": "Longueur de lissage PAEK en unités du SCR : la fenêtre de longueur d'arc sur laquelle les sommets sont moyennés. Des valeurs plus élevées donnent des courbes plus lisses. Par défaut 1.0. Ignorée par l'algorithme 'bezier'."
              },
              "smooth_boundary": {
                "label": "Lisser la limite",
                "description": "Lisser aussi les arcs de la limite extérieure de la couverture (bords appartenant à un seul polygone). Par défaut vrai ; définir à faux pour conserver la limite extérieure inchangée."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Quantifier les sommets sur une grille de cette taille (unités du SCR) avant de construire la topologie, afin que les sommets partagés quasi coïncidents soient traités comme un seul. Par défaut 0 (utiliser les coordonnées telles quelles)."
              }
            }
          },
          "snap_tracks": {
            "name": "Accrocher les trajets",
            "description": "Apparie des traces GPS horodatées sur un réseau routier par programmation dynamique de Viterbi (émission = distance d'accrochage, transition = continuité de l'itinéraire), afin que les traces appariées suivent un chemin plausible au lieu de zigzaguer entre rues parallèles — comme l'outil ArcGIS Snap Tracks.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de points GPS horodatés en entrée."
              },
              "network": {
                "label": "Réseau",
                "description": "Couche linéaire du réseau routier sur laquelle effectuer l'appariement."
              },
              "track_field": {
                "label": "Champ de trace",
                "description": "Champ identifiant chaque trace/mobile."
              },
              "time_field": {
                "label": "Champ de temps",
                "description": "Champ contenant l'heure de chaque point (secondes numériques ou ISO-8601)."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche de points accrochés en sortie (pilote déduit de l'extension). Si omise, stockée en mémoire."
              },
              "search_distance": {
                "label": "Distance de recherche",
                "description": "Rayon de candidature : seuls les arcs du réseau situés à cette distance d'un point de localisation sont pris en compte. Obligatoire."
              },
              "max_candidates": {
                "label": "Candidats maximaux",
                "description": "Nombre maximal d'arcs candidats conservés par point de localisation (par défaut 5)."
              }
            }
          },
          "solar_radiation": {
            "name": "Rayonnement solaire",
            "description": "Rayonnement solaire incident (Wh/m²) sur un MNT pour une plage de dates : direct + diffus, en tenant compte de la pente/exposition, de l'ombrage par l'horizon et de la position du soleil au fil du temps — comme l'outil ArcGIS Raster Solar Radiation.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster d'altitude en entrée (projeté, en mètres — la pente et l'horizon nécessitent des distances réelles)."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster de rayonnement total en sortie (Wh/m²). Si omis, stocké en mémoire."
              },
              "direct_output": {
                "label": "Sortie directe",
                "description": "Raster de sortie optionnel pour la composante de rayonnement direct (Wh/m²)."
              },
              "diffuse_output": {
                "label": "Sortie diffuse",
                "description": "Raster de sortie optionnel pour la composante de rayonnement diffus (Wh/m²)."
              },
              "start_day": {
                "label": "Jour de début",
                "description": "Premier jour de l'année (1-365) ou date ISO (YYYY-MM-DD). Par défaut 1."
              },
              "end_day": {
                "label": "Jour de fin",
                "description": "Dernier jour de l'année (1-365) ou date ISO. Par défaut 365."
              },
              "day_interval": {
                "label": "Intervalle en jours",
                "description": "Échantillonner tous les N jours sur la plage (chaque échantillon représente ce nombre de jours). Par défaut : étendue/12 (environ 12 échantillons)."
              },
              "time_step": {
                "label": "Pas de temps",
                "description": "Nombre d'heures entre les échantillons de position du soleil au cours de chaque journée. Par défaut 0.5."
              },
              "latitude": {
                "label": "Latitude",
                "description": "Latitude en degrés. Par défaut : déduite du centre du MNT pour EPSG:4326 / 3857."
              },
              "transmittivity": {
                "label": "Transmittivité",
                "description": "Transmissivité atmosphérique (0-1) pour une masse d'air unitaire. Par défaut 0.6."
              },
              "diffuse_proportion": {
                "label": "Proportion diffuse",
                "description": "Fraction de l'irradiance horizontale extraterrestre traitée comme rayonnement diffus du ciel (0-1). Par défaut 0.3."
              },
              "horizon_distance": {
                "label": "Distance d'horizon",
                "description": "Longueur maximale du rayon d'horizon en cellules (limite le calcul des ombres). Par défaut 100."
              },
              "band": {
                "label": "Bande",
                "description": "Bande du MNT, numérotée à partir de 1 (par défaut 1)."
              }
            }
          },
          "sort_features": {
            "name": "Trier les entités",
            "description": "Réordonne une couche vectorielle par champs attributaires ou le long d'une courbe de remplissage de Hilbert (tri spatial), comme l'outil ArcGIS Sort — l'ordre de Hilbert regroupe les enregistrements spatialement proches pour améliorer l'élagage GeoParquet et la localité PMTiles.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche vectorielle en sortie dans le nouvel ordre. Si omise, stockée en mémoire."
              },
              "method": {
                "label": "Méthode",
                "description": "'hilbert' (ordre selon la courbe spatiale ; par défaut) ou 'attribute' (selon la liste 'fields')."
              },
              "fields": {
                "label": "Champs",
                "description": "Mode attribute : champs séparés par des virgules avec direction optionnelle, par exemple 'pop:desc,name:asc'."
              },
              "index_field": {
                "label": "Champ d'indice",
                "description": "Nom de champ optionnel pour stocker la distance sur la courbe de Hilbert de chaque entité."
              }
            }
          },
          "space_time_kernel_density": {
            "name": "Densité par noyau spatio-temporelle",
            "description": "Densité par noyau spatio-temporelle de points horodatés : une bande de densité par tranche de temps (un raster multibande) à partir d'un noyau séparable spatial (Epanechnikov/quartique) x temporel (triangulaire/Epanechnikov), de sorte que chaque bande agrège les points proches à la fois dans l'espace et dans le temps, comme l'outil ArcGIS Space Time Kernel Density. Le compagnon temporel de heat_map 2D intégré.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points en entrée. Les données géographiques (EPSG:4326 / lon-lat non étiqueté) utilisent des mètres haversine ; les données projetées utilisent les unités du SCR. Les géométries non ponctuelles utilisent leur premier sommet, ou un sommet représentatif."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster multibande en sortie (une bande par tranche temporelle ; pilote déduit de l'extension). Si omis, stocké en mémoire."
              },
              "time_field": {
                "label": "Champ de temps",
                "description": "Champ contenant l'instant de chaque point : un champ numérique (dans ses propres unités) ou une chaîne de date/heure ISO-8601."
              },
              "time_step": {
                "label": "Pas de temps",
                "description": "Intervalle des tranches : un nombre simple (time_field numérique) ou une durée telle que '1w', '7d', '12h', '1M'. Par défaut '1w'."
              },
              "temporal_bandwidth": {
                "label": "Largeur de bande temporelle",
                "description": "Demi-largeur du noyau temporel, avec les mêmes unités et la même syntaxe de durée que time_step. Par défaut : égale à time_step."
              },
              "spatial_bandwidth": {
                "label": "Largeur de bande spatiale",
                "description": "Rayon du noyau spatial, en mètres pour une entrée géographique ou en unités du SCR pour une entrée projetée. Par défaut : emprise maximale / 20."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule en sortie en unités du SCR (degrés pour les données géographiques). Par défaut : emprise maximale / 200."
              },
              "weight_field": {
                "label": "Champ de poids",
                "description": "Champ numérique optionnel pondérant chaque point. Par défaut : chaque point compte pour 1."
              },
              "spatial_kernel": {
                "label": "Noyau spatial",
                "description": "Forme du noyau spatial : 'epanechnikov' (par défaut) ou 'quartic'."
              },
              "temporal_kernel": {
                "label": "Noyau temporel",
                "description": "Forme du noyau temporel : 'triangular' (par défaut) ou 'epanechnikov'."
              },
              "epsg": {
                "label": "EPSG",
                "description": "Code EPSG à attribuer au raster de sortie (par défaut : celui de la couche d'entrée)."
              }
            }
          },
          "spatial_association_between_zones": {
            "name": "Association spatiale entre zones",
            "description": "Mesure la force de correspondance entre deux rasters de zones catégoriels via la V-mesure (homogénéité/complétude) plus des scores d'association par zone.",
            "params": {
              "zones1": {
                "label": "Zones 1",
                "description": "Premier raster de zones catégorielles (par exemple l'occupation du sol). Même grille que zones2."
              },
              "zones2": {
                "label": "Zones 2",
                "description": "Second raster de zones catégorielles (par exemple les écorégions) sur la même grille que zones1."
              },
              "output": {
                "label": "Sortie",
                "description": "Table CSV optionnelle par classe de zones1 (classe, effectif, association, classe dominante de zones2 et part). Les métriques globales sont toujours renvoyées dans le résultat."
              },
              "band1": {
                "label": "Bande 1",
                "description": "Bande de zones1 à lire, numérotée à partir de 1 (par défaut 1)."
              },
              "band2": {
                "label": "Bande 2",
                "description": "Bande de zones2 à lire, numérotée à partir de 1 (par défaut 1)."
              }
            }
          },
          "spatial_eigenvector_filtering": {
            "name": "Filtrage par vecteurs propres spatiaux (MESF)",
            "description": "Génère des vecteurs propres de Moran (filtres spatiaux) à partir d'une matrice de poids spatiaux et ajoute les composantes autocorrélées comme champs de variables explicatives (MEV1, MEV2, …), comme ArcGIS Decompose Spatial Structure / Create Spatial Component Explanatory Variables. Construit une matrice de connectivité symétrique (contiguïté ou KNN symétrisé), la double-centre (M C M) et la décompose en valeurs propres avec un solveur de Jacobi cyclique en Rust pur ; conserve les vecteurs propres dont le I de Moran ≥ min_autocorrelation, classés par ordre décroissant et plafonnés à max_components.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée (points/lignes/polygones ; les méthodes de contiguïté nécessitent des polygones)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur en sortie — les entités d'entrée auxquelles sont ajoutés les vecteurs propres conservés sous les noms MEV1, MEV2, …. Si omis, stocké en mémoire."
              },
              "method": {
                "label": "Méthode",
                "description": "Conceptualisation des relations spatiales : 'contiguity_edges' (tour), 'contiguity_edges_corners' (reine) ou 'knn' (symétrisé). Par défaut 'contiguity_edges_corners'."
              },
              "number_of_neighbors": {
                "label": "Nombre de voisins",
                "description": "Nombre k de plus proches voisins pour method = knn. Par défaut 8."
              },
              "min_autocorrelation": {
                "label": "Autocorrélation minimale",
                "description": "Indice I de Moran minimal qu'un vecteur propre doit atteindre pour être conservé (autocorrélation spatiale positive). Par défaut 0.25."
              },
              "max_components": {
                "label": "Composantes maximales",
                "description": "Nombre maximal de vecteurs propres à produire, pris par ordre décroissant de l'indice I de Moran. Par défaut 15."
              }
            }
          },
          "spatial_outlier_detection": {
            "name": "Détection des valeurs aberrantes spatiales",
            "description": "Évalue les points par leur facteur local de valeur aberrante (LOF) — à quel point chaque point est isolé par rapport à la densité locale de ses k plus proches voisins — et signale les principales valeurs aberrantes, comme l'outil ArcGIS Spatial Outlier Detection. Comble la lacune laissée par l'étiquette de bruit binaire de DBSCAN.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de points en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Points en sortie avec le score LOF et l'indicateur de valeur aberrante. Si omis, stockés en mémoire."
              },
              "neighbors": {
                "label": "Voisins",
                "description": "Nombre k de plus proches voisins (par défaut 20)."
              },
              "percent_outlier": {
                "label": "Pourcentage de valeurs aberrantes",
                "description": "Marquer comme aberrants ce pourcentage des points ayant les LOF les plus élevés (par défaut 5). Ignoré si 'threshold' est défini."
              },
              "threshold": {
                "label": "Seuil",
                "description": "Seuil LOF explicite : les points dont le LOF dépasse cette valeur sont considérés comme aberrants (prioritaire sur percent_outlier)."
              }
            }
          },
          "spatially_constrained_multivariate_clustering": {
            "name": "Classification multivariée sous contrainte spatiale",
            "description": "Partitionne les entités en régions spatialement contiguës et homogènes en attributs avec l'algorithme SKATER (arbre couvrant minimal sur un graphe de contiguïté, coupé pour maximiser la variance inter-grappes), avec des contraintes optionnelles de taille/équilibre. Chaque grappe est connexe par construction, contrairement à multivariate_clustering. Comme l'outil ArcGIS Spatially Constrained Multivariate Clustering.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Entités polygonales (ou ponctuelles) en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie pour les entités d'entrée accompagnées d'un champ CLUSTER_ID. Si omis, stocké en mémoire."
              },
              "analysis_fields": {
                "label": "Champs d'analyse",
                "description": "Noms des champs numériques, séparés par des virgules ou des points-virgules, sur lesquels effectuer le regroupement."
              },
              "number_of_clusters": {
                "label": "Nombre de grappes",
                "description": "Nombre de groupes visé (par défaut 5)."
              },
              "neighborhood": {
                "label": "Voisinage",
                "description": "'contiguity_edges' (tour, par défaut), 'contiguity_edges_corners' (reine) ou 'knn'."
              },
              "number_of_neighbors": {
                "label": "Nombre de voisins",
                "description": "Nombre de voisins pour le voisinage 'knn' (par défaut 8)."
              },
              "constraint": {
                "label": "Contrainte",
                "description": "'none' (par défaut), 'feature_count' ou 'attribute_value'."
              },
              "constraint_field": {
                "label": "Champ de contrainte",
                "description": "Champ sommé par groupe lorsque 'constraint' vaut 'attribute_value'."
              },
              "min_constraint": {
                "label": "Contrainte minimale",
                "description": "Nombre d'entités ou total d'attribut minimal par groupe ; les coupures qui l'enfreignent sont ignorées."
              },
              "max_constraint": {
                "label": "Contrainte maximale",
                "description": "Nombre d'entités ou total d'attribut maximal par groupe ; les groupes qui le dépassent sont subdivisés davantage, même au-delà de 'number_of_clusters'."
              },
              "scale_data": {
                "label": "Mettre à l'échelle les données",
                "description": "Standardiser (score Z) les champs d'analyse avant le regroupement (par défaut vrai)."
              },
              "output_table": {
                "label": "Table en sortie",
                "description": "Chemin optionnel pour le résumé par groupe (moyennes, R² par variable, pseudo-F)."
              }
            }
          },
          "spectral_index": {
            "name": "Indice spectral",
            "description": "Calcule un indice spectral (NDVI, NDWI, NDBI, NBR, EVI, SAVI) à partir d'un raster multibande.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster multibande en entrée."
              },
              "index": {
                "label": "Indice",
                "description": "Indice à calculer : ndvi, ndwi, ndbi, nbr, evi ou savi."
              },
              "red": {
                "label": "Rouge",
                "description": "Numéro de bande, à partir de 1, pour la bande rouge."
              },
              "nir": {
                "label": "PIR",
                "description": "Numéro de bande, à partir de 1, pour la bande proche infrarouge."
              },
              "green": {
                "label": "Vert",
                "description": "Numéro de bande, à partir de 1, pour la bande verte."
              },
              "blue": {
                "label": "Bleu",
                "description": "Numéro de bande, à partir de 1, pour la bande bleue."
              },
              "swir": {
                "label": "SWIR",
                "description": "Numéro de bande, à partir de 1, pour la bande infrarouge à ondes courtes."
              },
              "soil_factor": {
                "label": "Facteur de sol",
                "description": "Facteur d'ajustement du sol L pour SAVI (par défaut 0.5)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel. S'il est omis, le résultat est stocké en mémoire."
              }
            }
          },
          "split_by_attributes": {
            "name": "Scinder par attributs",
            "description": "Divise une couche vectorielle en un fichier de sortie par valeur unique (ou combinaison) du ou des champs donnés, comme l'outil ArcGIS Split By Attributes.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée."
              },
              "output_dir": {
                "label": "Répertoire de sortie",
                "description": "Répertoire de sortie ; un fichier par groupe y est écrit (créé si nécessaire)."
              },
              "fields": {
                "label": "Champs",
                "description": "Nom(s) de champ, séparés par des virgules, servant à la scission (une clé multichamp joint les valeurs avec '__')."
              },
              "format": {
                "label": "Format",
                "description": "Extension du format de sortie : geojson (par défaut), fgb, parquet, shp."
              }
            }
          },
          "split_by_features": {
            "name": "Scinder par entités",
            "description": "Découpe une couche d'entrée selon chaque zone d'une couche polygonale de division, en écrivant un fichier de sortie par valeur distincte du champ de division. Les zones partageant une valeur sont d'abord fusionnées, et les zones vides sont ignorées. Comme l'outil ArcGIS Split (Analysis).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Entités à scinder (points, lignes ou polygones)."
              },
              "split_features": {
                "label": "Entités de division",
                "description": "Couche polygonale dont les entités définissent les zones de scission."
              },
              "split_field": {
                "label": "Champ de division",
                "description": "Champ de 'split_features' fournissant le nom de chaque sortie."
              },
              "output_dir": {
                "label": "Répertoire de sortie",
                "description": "Répertoire recevant un fichier de sortie par valeur de scission distincte."
              },
              "output_format": {
                "label": "Format de sortie",
                "description": "Extension ou pilote du fichier de sortie : 'geojson' (par défaut), 'shp', 'gpkg', 'parquet', 'csv'."
              }
            }
          },
          "split_line_at_point": {
            "name": "Scinder une ligne en un point",
            "description": "Divise les entités polylignes aux emplacements des entités ponctuelles situées dans un rayon de recherche, en insérant un nœud à chaque point accroché et en émettant une entité par sous-segment résultant (attributs parents préservés) — comme l'outil ArcGIS Split Line At Point.",
            "params": {
              "input_lines": {
                "label": "Lignes d'entrée",
                "description": "Couche vectorielle de polylignes en entrée à scinder."
              },
              "point_features": {
                "label": "Entités ponctuelles",
                "description": "Couche vectorielle de points (ou multipoints) dont les positions définissent les nœuds de scission."
              },
              "search_radius": {
                "label": "Rayon de recherche",
                "description": "Distance maximale, dans les unités du SCR des lignes, entre un point et une ligne pour que le point scinde cette ligne. Obligatoire, positive."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de la couche vectorielle de lignes en sortie (pilote déduit de l'extension). Si omis, stocké en mémoire."
              }
            }
          },
          "split_raster": {
            "name": "Découper le raster",
            "description": "Divise un raster en tuiles autonomes par nombre de tuiles, taille fixe en pixels ou entités polygonales, avec un chevauchement optionnel en pixels — comme l'outil ArcGIS Split Raster. Chaque tuile préserve le SCR et le géoréférencement.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster en entrée."
              },
              "output_dir": {
                "label": "Répertoire de sortie",
                "description": "Répertoire de sortie pour les fichiers de tuiles (créé si nécessaire)."
              },
              "base_name": {
                "label": "Nom de base",
                "description": "Préfixe des noms de fichiers en sortie (par défaut 'tile')."
              },
              "split_method": {
                "label": "Méthode de division",
                "description": "'count' (grille N×M, par défaut), 'size' (tuiles à nombre de pixels fixe) ou 'polygons' (un découpage par entité)."
              },
              "num_x": {
                "label": "Nombre en X",
                "description": "Nombre de colonnes de tuiles pour 'count' (par défaut 2)."
              },
              "num_y": {
                "label": "Nombre en Y",
                "description": "Nombre de lignes de tuiles pour 'count' (par défaut 2)."
              },
              "tile_size_x": {
                "label": "Taille de tuile X",
                "description": "Largeur des tuiles en pixels pour 'size' (par défaut 256)."
              },
              "tile_size_y": {
                "label": "Taille de tuile Y",
                "description": "Hauteur des tuiles en pixels pour 'size' (par défaut 256)."
              },
              "polygons": {
                "label": "Polygones",
                "description": "Couche vectorielle polygonale pour le mode 'polygons' (une tuile par entité)."
              },
              "overlap": {
                "label": "Chevauchement",
                "description": "Recouvrement en pixels ajouté à chaque tuile sur tous les côtés (par défaut 0)."
              },
              "format": {
                "label": "Format",
                "description": "Extension ou pilote du fichier de sortie : 'tif' (par défaut) ou 'png'."
              }
            }
          },
          "stack_profile": {
            "name": "Profil de pile",
            "description": "Échantillonne plusieurs rasters de surface le long de la même polyligne et émet une table au format long (LINE_ID, FIRST_DIST, FIRST_Z, SRC_ID, SRC_NAME) afin que les surfaces puissent être comparées en coupe transversale sur un axe de distance partagé. Comme l'outil ArcGIS Stack Profile.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Entités linéaires en entrée à profiler."
              },
              "surfaces": {
                "label": "Surfaces",
                "description": "Liste des chemins des rasters de surface, séparés par des virgules ou des points-virgules, échantillonnés dans l'ordre indiqué."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de la table de profil en sortie. Si omis, stockée en mémoire."
              },
              "sample_distance": {
                "label": "Distance d'échantillonnage",
                "description": "Espacement des stations en unités de la carte (par défaut : la plus fine taille de cellule en entrée)."
              },
              "line_id_field": {
                "label": "Champ d'identifiant de ligne",
                "description": "Champ optionnel fournissant LINE_ID ; par défaut l'index de l'entité."
              },
              "method": {
                "label": "Méthode",
                "description": "Échantillonnage de la surface : 'bilinear' (par défaut) ou 'nearest'."
              }
            }
          },
          "storage_capacity": {
            "name": "Capacité de stockage",
            "description": "Balaie des élévations de surface d'eau sur un MNT et rapporte la surface inondée et le volume stocké à chaque niveau (la courbe hauteur-surface-volume) par zone d'analyse ou sur tout le MNT, comme l'outil ArcGIS Storage Capacity.",
            "params": {
              "dem": {
                "label": "MNT",
                "description": "Raster MNT en entrée (altitudes)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du CSV en sortie (zone_id, level, elevation, area, volume)."
              },
              "zones": {
                "label": "Zones",
                "description": "Couche polygonale optionnelle ; une courbe hauteur-surface-volume par polygone. Si omise, l'ensemble du MNT constitue une seule zone."
              },
              "zone_id_field": {
                "label": "Champ d'identifiant de zone",
                "description": "Champ nommant chaque zone dans la sortie (par défaut : l'index de l'entité)."
              },
              "num_levels": {
                "label": "Nombre de niveaux",
                "description": "Nombre de pas d'altitude entre le minimum et le maximum de chaque zone (par défaut 20). Ignoré si 'increment' est fourni."
              },
              "increment": {
                "label": "Incrément",
                "description": "Pas d'altitude fixe entre les niveaux (unités de la carte). Prioritaire sur 'num_levels'."
              },
              "min_elevation": {
                "label": "Élévation minimale",
                "description": "Borne d'altitude inférieure optionnelle pour le balayage (par défaut : le terrain minimal de chaque zone)."
              },
              "max_elevation": {
                "label": "Élévation maximale",
                "description": "Borne d'altitude supérieure optionnelle pour le balayage (par défaut : le terrain maximal de chaque zone)."
              },
              "band": {
                "label": "Bande",
                "description": "Bande du MNT, numérotée à partir de 1 (par défaut 1)."
              }
            }
          },
          "strip_map_index_features": {
            "name": "Entités d'index en bandes",
            "description": "Parcourt chaque ligne d'entrée et émet une séquence numérotée de rectangles de pages tournés et chevauchants orientés selon le relèvement local de l'itinéraire, pour les atlas en bande le long d'une autoroute, d'une rivière, d'un pipeline ou d'un sentier — comme l'outil ArcGIS Strip Map Index Features.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle linéaire en entrée à indexer."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur polygonal en sortie contenant les pages de l'index (pilote déduit de l'extension). Si omis, stocké en mémoire."
              },
              "page_length": {
                "label": "Longueur de page",
                "description": "Longueur de chaque page le long de l'itinéraire, en unités du SCR. Obligatoire."
              },
              "page_width": {
                "label": "Largeur de page",
                "description": "Largeur de chaque page perpendiculairement à l'itinéraire, en unités du SCR. Obligatoire."
              },
              "overlap": {
                "label": "Chevauchement",
                "description": "Fraction [0, 1) de page_length sur laquelle des pages consécutives se recouvrent le long de l'itinéraire. Par défaut 0."
              },
              "orientation": {
                "label": "Orientation",
                "description": "along_line (par défaut) : oriente chaque page selon l'azimut de sa corde locale. horizontal/vertical : aligne la rotation sur l'axe est-ouest ou nord-sud le plus proche."
              },
              "start_page": {
                "label": "Page de début",
                "description": "Premier numéro de page à attribuer. Par défaut 1."
              }
            }
          },
          "subdivide_polygon": {
            "name": "Subdiviser un polygone",
            "description": "Divise chaque polygone en parties de surface égale (un nombre fixe de parties, ou une surface cible chacune) par des coupes parallèles droites à un angle donné, comme l'outil ArcGIS Subdivide Polygon.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle polygonale en entrée (utiliser un SCR projeté ou équivalent pour obtenir de véritables surfaces égales)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de polygones en sortie (pilote déduit de l'extension). Si omis, le résultat est stocké en mémoire."
              },
              "method": {
                "label": "Méthode",
                "description": "'equal_parts' (num_parts bandes de surface égale, par défaut) ou 'equal_areas' (bandes de target_area, le reste dans la dernière)."
              },
              "num_parts": {
                "label": "Nombre de parties",
                "description": "Nombre de parties de surface égale (pour method=equal_parts). Par défaut 2."
              },
              "target_area": {
                "label": "Surface cible",
                "description": "Surface de chaque partie en unités du SCR (obligatoire pour method=equal_areas)."
              },
              "angle": {
                "label": "Angle",
                "description": "Orientation des coupures en degrés (0 = coupures verticales / bandes horizontales). Par défaut 0."
              }
            }
          },
          "subset_features": {
            "name": "Sous-ensemble d'entités",
            "description": "Divise aléatoirement une couche d'entités en un sous-ensemble d'entraînement et son complément (sous-ensemble de test), par pourcentage ou nombre absolu, à l'aide d'un générateur aléatoire déterministe avec graine. Éventuellement stratifié par un champ de regroupement. Comme l'outil ArcGIS Subset Features.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée (tout type de géométrie)."
              },
              "output_training": {
                "label": "Entraînement en sortie",
                "description": "Chemin de sortie pour le sous-ensemble d'apprentissage. Si omis, stocké en mémoire."
              },
              "output_test": {
                "label": "Test en sortie",
                "description": "Chemin de sortie optionnel pour le sous-ensemble complémentaire (de test). Si omis, le sous-ensemble de test est stocké en mémoire."
              },
              "size": {
                "label": "Taille",
                "description": "Taille du sous-ensemble d'apprentissage : un pourcentage (0-100) ou un nombre absolu d'entités, selon 'size_method' (par défaut 50)."
              },
              "size_method": {
                "label": "Méthode de taille",
                "description": "'percentage' (par défaut) ou 'absolute'."
              },
              "seed": {
                "label": "Graine",
                "description": "Germe du générateur aléatoire pour un partitionnement reproductible (par défaut une constante fixe)."
              },
              "group_field": {
                "label": "Champ de regroupement",
                "description": "Champ optionnel de stratification : chaque groupe contribue à sa part proportionnelle du sous-ensemble d'apprentissage."
              }
            }
          },
          "subset_multidimensional_raster": {
            "name": "Sous-ensemble de raster multidimensionnel",
            "description": "Restreint un cube raster multidimensionnel à un sous-ensemble de ses tranches, par plage de coordonnées de dimension, indices explicites ou pas (ArcGIS Subset Multidimensional Raster / Select By Dimension). Les outils de cube de la série 18 consomment tous un cube entier, il n'y avait donc aucun moyen d'analyser une fenêtre d'étude sans régénérer l'entrée hors du catalogue.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster multidimensionnel, ou liste de rasters superposables séparés par des virgules dont les bandes sont concaténées en un seul cube."
              },
              "dimension_values": {
                "label": "Valeurs de dimension",
                "description": "Coordonnées par tranche, optionnelles et strictement croissantes (dates, profondeurs, longueurs d'onde), une par tranche. Requises par 'dimension_range'."
              },
              "dimension": {
                "label": "Dimension",
                "description": "Nom de la dimension, utilisé uniquement dans le rapport (par défaut 'slice')."
              },
              "dimension_range": {
                "label": "Plage de dimension",
                "description": "Plage de coordonnées inclusive sous la forme 'min,max'. Nécessite 'dimension_values'. Mutuellement exclusive avec 'indices'."
              },
              "indices": {
                "label": "Indices",
                "description": "Indices de tranches explicites, numérotés à partir de 0, par exemple '0,2,5'. Mutuellement exclusifs avec 'dimension_range'."
              },
              "step": {
                "label": "Pas",
                "description": "Conserver une tranche sur N après application des autres filtres (par défaut 1)."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster cube en sortie, une bande par tranche conservée. Si omis, stocké en mémoire."
              }
            }
          },
          "summarize_categorical_raster": {
            "name": "Résumer un raster catégoriel",
            "description": "Tabule le nombre de cellules, la surface et la part de chaque classe d'un raster catégoriel, une ligne par tranche pour les piles multibandes/multidimensionnelles, éventuellement restreint à une zone d'intérêt (ArcGIS Summarize Categorical Raster). raster_area intégré réécrit les totaux de classes dans les cellules raster plutôt que dans une table et est limité à une seule bande, il ne peut donc pas produire la série de surfaces par classe et par date dont l'analyse des changements d'occupation du sol a besoin. La surface des cellules est intégrée par ligne pour les rasters géographiques.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster catégoriel en entrée (monobande ou multibande)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de la table de sortie optionnel. Si omis, le résultat est stocké en mémoire."
              },
              "aoi": {
                "label": "Zone d'intérêt",
                "description": "Couche polygonale optionnelle restreignant le résumé à une zone d'intérêt."
              },
              "aoi_id_field": {
                "label": "Champ d'identifiant de zone d'intérêt",
                "description": "Champ de 'aoi' identifiant chaque zone ; s'il est fourni, le résumé est produit par entité de la zone d'intérêt."
              },
              "area_units": {
                "label": "Unités de surface",
                "description": "Unités de surface : map_units (par défaut), hectares ou square_kilometers."
              },
              "include_nodata": {
                "label": "Inclure NoData",
                "description": "Si vrai, les valeurs NoData sont signalées dans leur propre ligne de classe (par défaut faux)."
              },
              "bands": {
                "label": "Bandes",
                "description": "Liste des bandes à résumer, numérotées à partir de 1 et séparées par des virgules (par défaut : toutes les bandes)."
              }
            }
          },
          "summarize_nearby": {
            "name": "Résumer à proximité",
            "description": "Crée des tampons autour des entités d'entrée à une ou plusieurs distances à vol d'oiseau et résume une seconde couche dans chaque tampon : nombre d'entités, surface intersectée (polygones), longueur découpée (lignes) et somme/moyenne pondérées par la mesure des champs numériques.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle en entrée dont les entités sont mises en tampon (points, lignes ou polygones), format détecté automatiquement (ou référence en mémoire)."
              },
              "summary_features": {
                "label": "Entités de synthèse",
                "description": "Couche vectorielle à résumer dans chaque zone tampon (les polygones sont résumés par surface intersectée, les lignes par longueur découpée et les points par effectif)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel (pilote selon son extension). S'il est omis, stocké en mémoire."
              },
              "distances": {
                "label": "Distances",
                "description": "Liste des distances de tampon en unités du SCR, séparées par des virgules, par exemple \"1000,2000,5000\". Triées par ordre croissant ; les doublons et les valeurs non positives sont supprimés."
              },
              "sum_fields": {
                "label": "Champs à sommer",
                "description": "Champs numériques optionnels de la couche à résumer, séparés par des virgules, à agréger. Chacun produit une colonne sum_<field> et une colonne mean_<field> (pondérées par la surface pour les polygones, par la longueur pour les lignes, simples pour les points)."
              },
              "id_field": {
                "label": "Champ d'identifiant",
                "description": "Champ optionnel de la couche d'entrée identifiant chaque entité source dans la sortie. Par défaut, l'index de l'entité d'entrée."
              }
            }
          },
          "summarize_percent_change": {
            "name": "Résumer la variation en pourcentage",
            "description": "Compte les incidents d'une période actuelle et d'une période précédente dans chaque entité surfacique et rapporte la différence de comptage, le pourcentage de changement et une classe de changement. Le pourcentage de changement est nul (classe « new ») là où le comptage précédent est zéro. Comme l'outil ArcGIS Summarize Percent Change.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Entités surfaciques (secteurs, îlots, cellules de grille) dans lesquelles effectuer le résumé."
              },
              "current_features": {
                "label": "Entités actuelles",
                "description": "Entités ponctuelles d'incidents pour la période courante."
              },
              "previous_features": {
                "label": "Entités précédentes",
                "description": "Entités ponctuelles d'incidents pour la période précédente."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie pour les zones accompagnées des champs de changement. Si omis, stocké en mémoire."
              },
              "search_radius": {
                "label": "Rayon de recherche",
                "description": "Distance optionnelle en unités de la carte ; les incidents situés à cette distance d'une zone sont également comptabilisés, et non uniquement ceux qui s'y trouvent. Notez qu'un rayon positif fait se chevaucher les aires de captage, si bien qu'un incident peut être compté par plusieurs zones (les totaux d'ensemble rapportés restent dédoublonnés)."
              }
            }
          },
          "summarize_within": {
            "name": "Résumer à l'intérieur",
            "description": "Résume les attributs d'une couche à l'intérieur d'une couche polygonale existante, en pondérant les entités partiellement chevauchantes par la surface ou la longueur intersectée, comme l'outil ArcGIS Summarize Within.",
            "params": {
              "polygons": {
                "label": "Polygones",
                "description": "Couche polygonale dans laquelle effectuer le résumé. Ses entités et ses attributs sont préservés."
              },
              "input": {
                "label": "Entrée",
                "description": "Couche à résumer (points, lignes ou polygones)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin optionnel des polygones en sortie. Si omis, le résultat est stocké en mémoire."
              },
              "fields": {
                "label": "Champs",
                "description": "Paires 'field:statistic' séparées par des virgules, par exemple 'pop:sum,income:mean'. Statistiques : sum, mean, min, max, stddev, count."
              },
              "keep_all": {
                "label": "Tout conserver",
                "description": "Conserver les polygones ne recoupant aucune entité (par défaut vrai). Si faux, les polygones vides sont supprimés."
              },
              "shape_sum": {
                "label": "Somme des formes",
                "description": "Ajouter la somme de l'effectif, de la longueur ou de la surface de la géométrie d'entrée intersectée (par défaut vrai)."
              },
              "group_field": {
                "label": "Champ de regroupement",
                "description": "Champ optionnel de la couche résumée ; produit une ligne de résumé groupé par valeur distincte."
              }
            }
          },
          "summary_statistics": {
            "name": "Statistiques résumées",
            "description": "GROUP BY de type SQL sur un ou plusieurs champs de cas : pour chaque combinaison unique de champs de cas, calcule une liste d'agrégats (champ, statistique) (count/sum/mean/min/max/std/first/last) plus un nombre d'enregistrements par groupe. La sortie est une pure table attributaire. Sans champ de cas, produit une seule ligne de total général (comme l'outil Summary Statistics d'ArcGIS ; count seul reproduit Frequency).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle ou table attributaire en entrée à agréger."
              },
              "statistics": {
                "label": "Statistiques",
                "description": "Liste de paires 'field statistic' séparées par des points-virgules ou des virgules (la forme 'field:statistic' est également acceptée), par exemple 'population sum; population mean; elev max'. Statistiques : count, sum, mean, min, max, std, first, last."
              },
              "case_fields": {
                "label": "Champs de cas",
                "description": "Nom(s) de champ de regroupement (GROUP BY) optionnels, séparés par des virgules ou des points-virgules. Si omis, une seule ligne de résumé est produite pour l'ensemble de la table."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de la table de sortie optionnel (pilote déduit de son extension ; GeoParquet ou CSV). Si omis, la table est stockée en mémoire. Colonnes : les champs de regroupement, un 'count' d'enregistrements, puis une colonne '<field>_<statistic>' par paire demandée."
              }
            }
          },
          "sun_shadow_volume": {
            "name": "Volume d'ombre solaire",
            "description": "Extrude des solides 3D le long du vecteur solaire jusqu'au sol pour produire des solides fermés de volume d'ombre pour une date et une heure données (ArcGIS Sun Shadow Volume). shadow_image, shadow_animation et time_in_daylight travaillent tous sur un MNS raster et émettent des rasters, et solar_radiation calcule l'irradiance — aucun ne produit de géométrie d'ombre, de sorte que des questions comme « cette fenêtre est-elle à l'ombre » ou « quelle part de l'espace aérien de cette parcelle est à l'ombre » ne peuvent pas recevoir de réponse. La sortie se compose avec inside_3d, intersect_3d et union_3d.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Solides de bâtiments 3D ou emprises extrudées (MultiPolygones en maillage triangulaire avec Z)."
              },
              "output": {
                "label": "Sortie",
                "description": "Solides fermés de volumes d'ombre. Si omis, stockés en mémoire."
              },
              "datetime": {
                "label": "Date et heure",
                "description": "Date et heure locales de la position du soleil, au format 'YYYY-MM-DDTHH:MM' ou 'YYYY-MM-DD HH:MM'. Fournie en paramètre, jamais lue depuis une horloge, afin que les résultats soient reproductibles."
              },
              "latitude": {
                "label": "Latitude",
                "description": "Latitude en degrés, utilisée pour la géométrie solaire. Obligatoire : elle ne peut pas être déduite sans moteur de projection."
              },
              "utc_offset": {
                "label": "Décalage UTC",
                "description": "Décalage en heures par rapport à UTC de l'heure locale fournie (par défaut 0)."
              },
              "adjusted_for_dst": {
                "label": "Ajusté pour l'heure d'été",
                "description": "Considérer l'heure fournie comme ajustée à l'heure d'été, en soustrayant une heure avant le calcul solaire (par défaut faux), conformément à ArcGIS."
              },
              "ground_elevation": {
                "label": "Élévation du sol",
                "description": "Altitude Z constante du sol sur laquelle l'ombre est projetée. Par défaut : le Z minimal propre à chaque entité."
              },
              "max_length": {
                "label": "Longueur maximale",
                "description": "Limite de la distance de balayage en unités du SCR, afin qu'un soleil bas ne produise pas un prisme long de plusieurs kilomètres. Par défaut : illimitée."
              }
            }
          },
          "surface_difference": {
            "name": "Différence de surfaces",
            "description": "Délimite où une surface se trouve au-dessus, en dessous ou au niveau d'une autre sous forme de polygones, chacun portant sa classe, sa surface, son volume et ses statistiques de différence (ArcGIS Surface Difference). cut_fill mesure les mêmes grandeurs mais n'émet qu'un raster d'étiquettes de régions et un CSV, ses régions n'ont donc aucune géométrie à superposer, découper ou joindre ; surface_volume et polygon_volume mesurent par rapport à un plan ou dans des polygones que vous avez déjà plutôt que de les découvrir.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster de surface à classer."
              },
              "reference": {
                "label": "Référence",
                "description": "Surface de référence : le chemin d'un raster superposable, ou une altitude constante pour comparer à un plan de référence horizontal."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche polygonale en sortie des régions classées. Si omise, stockée en mémoire."
              },
              "output_raster": {
                "label": "Raster en sortie",
                "description": "Raster de différence signée en sortie (entrée moins référence). Toujours produit ; stocké en mémoire si aucun chemin n'est fourni."
              },
              "tolerance": {
                "label": "Tolérance",
                "description": "Les différences comprises dans cet écart autour de zéro sont considérées comme coïncidentes (par défaut 0.0)."
              },
              "min_area": {
                "label": "Surface minimale",
                "description": "Écarter les régions dont la surface est inférieure à cette valeur, en unités carte au carré."
              },
              "include_coincident": {
                "label": "Inclure les coïncidents",
                "description": "Produire également des polygones pour la classe inchangée (par défaut faux). Désactivé par défaut car, sur la plupart des scènes, il s'agit d'un unique polygone d'arrière-plan gigantesque."
              },
              "band": {
                "label": "Bande",
                "description": "Bande de la surface d'entrée, numérotée à partir de 1 (par défaut 1)."
              },
              "reference_band": {
                "label": "Bande de référence",
                "description": "Bande de la surface de référence, numérotée à partir de 1 (par défaut 1)."
              }
            }
          },
          "surface_parameters": {
            "name": "Paramètres de surface",
            "description": "Pente, exposition ou courbure (mean/profile/tangential/plan/gaussian/casorati/contour_geodesic_torsion) à partir d'un MNT via un ajustement local de surface quadratique/biquadratique par moindres carrés sur une distance de voisinage choisie, comme l'outil ArcGIS Surface Parameters — le pendant adaptatif à l'échelle des outils de terrain intégrés à fenêtre fixe 3×3.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster d'élévation (MNT) en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du raster de sortie optionnel. Si omis, stocké en mémoire."
              },
              "parameter": {
                "label": "Paramètre",
                "description": "Paramètre à calculer : slope (par défaut), aspect, mean_curvature, profile_curvature, tangential_curvature, plan_curvature, gaussian_curvature, casorati_curvature, contour_geodesic_torsion."
              },
              "fit": {
                "label": "Ajustement",
                "description": "Modèle de surface : 'quadratic' (6 termes, par défaut) ou 'biquadratic' (9 termes)."
              },
              "neighborhood_distance": {
                "label": "Distance de voisinage",
                "description": "Rayon du voisinage en unités de la carte (par défaut = une taille de cellule, soit une fenêtre 3×3)."
              },
              "neighborhood_type": {
                "label": "Type de voisinage",
                "description": "'fixed' (par défaut) utilise le rayon complet partout ; 'adaptive' réduit la fenêtre à 1 cellule à proximité des lacunes de données et des bordures."
              },
              "band": {
                "label": "Bande",
                "description": "Bande à lire, indexée à partir de 1 (par défaut 1)."
              }
            }
          },
          "surface_volume": {
            "name": "Volume de surface",
            "description": "Intègre un raster de surface par rapport à un plan de référence horizontal, en rapportant la surface 2D, la surface 3D et le volume de la portion au-dessus et/ou en dessous du plan (comme l'outil Surface Volume d'ArcGIS). Déblais/remblais de terrassement et analyse de capacité de réservoir.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster de surface d'altitude en entrée."
              },
              "reference_plane": {
                "label": "Plan de référence",
                "description": "Altitude du plan de référence par rapport auquel l'intégration est effectuée (par défaut 0)."
              },
              "direction": {
                "label": "Direction",
                "description": "Côté du plan à intégrer : 'above', 'below' ou 'both' (par défaut 'above')."
              },
              "band": {
                "label": "Bande",
                "description": "Bande à lire, indexée à partir de 1 (par défaut 1)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du CSV de sortie optionnel pour la table des résultats. Si omis, les résultats ne sont renvoyés que dans le résultat de l'exécution."
              }
            }
          },
          "table_to_geometry": {
            "name": "Table vers géométrie",
            "description": "Construit des entités linéaires ou elliptiques à partir de champs tabulaires : paires de coordonnées de début/fin (XY To Line), origine + relèvement + distance (Bearing Distance To Line) ou centre + axes majeur/mineur + azimut (Table To Ellipse) — avec construction planaire, géodésique et loxodromique.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Table attributaire ou couche vectorielle de points en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel (pilote selon son extension). S'il est omis, stocké en mémoire."
              },
              "mode": {
                "label": "Mode",
                "description": "'xy_to_line', 'bearing_distance' ou 'ellipse'."
              },
              "line_type": {
                "label": "Type de ligne",
                "description": "'geodesic' (par défaut, chemin le plus court sur l'ellipsoïde WGS84), 'rhumb' (azimut constant) ou 'planar' (segments cartésiens rectilignes dans les unités propres à l'entrée)."
              },
              "vertex_spacing": {
                "label": "Espacement des sommets",
                "description": "Espacement de densification des lignes courbes (geodesic/rhumb) et espacement d'échantillonnage du contour de l'ellipse, en mètres pour geodesic/rhumb ou en unités du SCR pour planar. Par défaut : un nombre fixe de segments."
              },
              "polygon_output": {
                "label": "Polygones en sortie",
                "description": "mode=ellipse uniquement : produire un polygone plein au lieu d'un contour linéaire fermé. Par défaut faux."
              },
              "start_x": {
                "label": "X de départ",
                "description": "mode=xy_to_line : champ contenant le X / la longitude de départ."
              },
              "start_y": {
                "label": "Y de départ",
                "description": "mode=xy_to_line : champ contenant le Y / la latitude de départ."
              },
              "end_x": {
                "label": "X d'arrivée",
                "description": "mode=xy_to_line : champ contenant le X / la longitude d'arrivée."
              },
              "end_y": {
                "label": "Y d'arrivée",
                "description": "mode=xy_to_line : champ contenant le Y / la latitude d'arrivée."
              },
              "x": {
                "label": "X",
                "description": "mode=bearing_distance/ellipse : champ contenant le X / la longitude de l'origine ou du centre."
              },
              "y": {
                "label": "Y",
                "description": "mode=bearing_distance/ellipse : champ contenant le Y / la latitude de l'origine ou du centre."
              },
              "bearing": {
                "label": "Relèvement",
                "description": "mode=bearing_distance : champ contenant l'azimut en degrés dans le sens horaire à partir du nord."
              },
              "distance": {
                "label": "Distance",
                "description": "mode=bearing_distance : champ contenant la distance de parcours (mètres pour geodesic/rhumb, unités du SCR pour planar)."
              },
              "major": {
                "label": "Majeur",
                "description": "mode=ellipse : champ contenant la longueur du demi-grand axe (mètres pour geodesic/rhumb, unités du SCR pour planar)."
              },
              "minor": {
                "label": "Mineur",
                "description": "mode=ellipse : champ contenant la longueur du demi-petit axe (mêmes unités que le grand axe)."
              },
              "azimuth": {
                "label": "Azimut",
                "description": "mode=ellipse : champ contenant la direction du grand axe en degrés dans le sens horaire à partir du nord."
              }
            }
          },
          "tabulate_intersection": {
            "name": "Tabuler l'intersection",
            "description": "Résumé zonal vecteur sur vecteur : répartit une couche de classes (polygones par surface, lignes par longueur intersectée ou points par comptage) sur des polygones de zones, en rapportant la mesure intersectée, le pourcentage de la zone et des champs de somme pondérés par la mesure.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche polygonale des zones, format détecté automatiquement (ou référence en mémoire)."
              },
              "class_features": {
                "label": "Entités de classe",
                "description": "Couche vectorielle de classes à répartir entre les zones (les polygones sont résumés par surface, les lignes par longueur intersectée et les points par effectif)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel (pilote selon son extension). S'il est omis, stocké en mémoire."
              },
              "class_field": {
                "label": "Champ de classe",
                "description": "Champ catégoriel optionnel de la couche de classes ; les résultats sont groupés par zone x cette valeur. Omettre pour traiter toutes les entités de classe comme une seule classe."
              },
              "sum_fields": {
                "label": "Champs à sommer",
                "description": "Champs numériques optionnels de la couche de classes, séparés par des virgules, à répartir dans chaque zone (pondérés par la surface pour les polygones, par la longueur pour les lignes, sommés pour les points)."
              },
              "zone_field": {
                "label": "Champ de zone",
                "description": "Champ optionnel identifiant chaque zone dans la sortie. Par défaut, l'index de l'entité de zone."
              }
            }
          },
          "thin_road_network": {
            "name": "Amincir le réseau routier",
            "description": "Généralise un réseau routier pour l'affichage à petite échelle : masque les routes courtes de faible hiérarchie tout en préservant la connectivité, en marquant chaque route visible/amincie (non destructif) comme l'outil ArcGIS Thin Road Network.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle de routes (lignes) en entrée, format détecté automatiquement (ou identifiant en mémoire)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel (pilote selon son extension). S'il est omis, stocké en mémoire."
              },
              "min_length": {
                "label": "Longueur minimale",
                "description": "Les routes plus courtes que cette valeur (unités du SCR) sont candidates à l'élagage. Les routes plus longues sont toujours conservées."
              },
              "hierarchy_field": {
                "label": "Champ de hiérarchie",
                "description": "Champ numérique optionnel de classe de route ; une valeur plus faible = plus importante (conservée plus longtemps). Les candidates sont élaguées en commençant par les numéros de classe les plus élevés."
              },
              "visibility_field": {
                "label": "Champ de visibilité",
                "description": "Nom du champ indicateur de visibilité en sortie (1 = conservée, 0 = élaguée). Par défaut 'visible'."
              },
              "keep_only": {
                "label": "Conserver uniquement",
                "description": "Si vrai, ne produire que les routes visibles au lieu de toutes les marquer. Par défaut faux (non destructif)."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Distance en deçà de laquelle les extrémités de routes sont considérées comme la même jonction. Par défaut 1e-6."
              }
            }
          },
          "tile_grid_polygons": {
            "name": "Polygones de grille de tuiles",
            "description": "Émet les limites des tuiles de carte web sous forme de polygones pour un niveau de zoom (ou une plage) et une emprise, chacun portant z/x/y et sa quadkey (ArcGIS Map Server Cache Tiling Scheme To Polygons, Create Vector Tile Index, Generate Tile Cache Tiling Scheme). Les outils de grille rectangulaire/hexagonale intégrés construisent des grilles arbitraires dans le SCR d'entrée et ne peuvent pas coïncider avec le quadtree Web Mercator qu'utilisent les outils PMTiles et raster_to_tiles.",
            "params": {
              "zoom": {
                "label": "Zoom",
                "description": "Niveau de zoom. À utiliser avec 'max_zoom' pour produire une pyramide de niveaux."
              },
              "max_zoom": {
                "label": "Zoom maximal",
                "description": "Zoom maximal optionnel ; s'il est fourni, tous les niveaux de 'zoom' à 'max_zoom' sont produits."
              },
              "extent": {
                "label": "Emprise",
                "description": "Couche raster ou vectorielle optionnelle dont l'emprise découpe la grille. Sans elle, le monde entier à ce niveau de zoom (sous réserve de 'max_tiles')."
              },
              "bbox": {
                "label": "Emprise",
                "description": "Emprise explicite optionnelle sous la forme 'min_lon,min_lat,max_lon,max_lat' en degrés. Prioritaire sur 'extent'."
              },
              "scheme": {
                "label": "Schéma",
                "description": "'xyz' (par défaut, Google/OSM, y est compté vers le bas depuis le nord) ou 'tms' (y est compté vers le haut depuis le sud)."
              },
              "output_crs": {
                "label": "SCR de sortie",
                "description": "'EPSG:3857' (par défaut, tuiles carrées) ou 'EPSG:4326' (quadrilatères lon/lat)."
              },
              "max_tiles": {
                "label": "Tuiles maximales",
                "description": "Plafond strict du nombre de tuiles (par défaut 1000000) ; le dépasser provoque une erreur indiquant le nombre calculé."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche polygonale en sortie. Si omise, stockée en mémoire."
              }
            }
          },
          "time_series_clustering": {
            "name": "Classification de séries temporelles",
            "description": "Regroupe les cellules d'un cube spatio-temporel H3 selon la similarité de leurs séries temporelles (valeur, profil normalisé en z ou corrélation) par k-médoïdes déterministes, afin que les lieux qui évoluent de façon semblable se regroupent, comme l'outil ArcGIS Time Series Clustering.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de points en entrée en EPSG:4326 (lon/lat) comportant un champ d'horodatage."
              },
              "time_field": {
                "label": "Champ de temps",
                "description": "Champ d'horodatage (numérique ou date/date-heure ISO-8601)."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche polygonale H3 en sortie avec cluster_id/is_medoid. Si omise, stockée en mémoire."
              },
              "num_clusters": {
                "label": "Nombre de grappes",
                "description": "Nombre k de groupes (par défaut 4)."
              },
              "characteristic": {
                "label": "Caractéristique",
                "description": "Distance entre séries temporelles : 'value' (brute), 'profile' (normalisée en score Z, par défaut) ou 'correlation' (1 − r)."
              },
              "time_step": {
                "label": "Pas de temps",
                "description": "Largeur d'un pas de temps : un nombre simple (time_field numérique) ou une durée telle que '1w', '7d', '12h'. Par défaut '1w'."
              },
              "value_field": {
                "label": "Champ de valeur",
                "description": "Champ numérique optionnel sommé dans chaque classe. Par défaut : le nombre de points par classe."
              },
              "resolution": {
                "label": "Résolution",
                "description": "Résolution H3 de 0 (la plus grossière) à 15 (la plus fine) ; par défaut 7 (cellules d'environ 5 km²)."
              },
              "seed": {
                "label": "Graine",
                "description": "Germe aléatoire pour une initialisation reproductible des médoïdes (par défaut 1)."
              }
            }
          },
          "time_series_cross_correlation": {
            "name": "Corrélation croisée de séries temporelles",
            "description": "Corrélation croisée décalée par cellule entre deux piles raster spatio-temporelles alignées (comme l'outil Time Series Cross Correlation / Multidimensional Raster Correlation d'ArcGIS) : pour chaque cellule, supprime éventuellement la tendance/la saisonnalité, puis corrèle la série A à la série B sur min_lag..=max_lag et rapporte le meilleur décalage et sa corrélation de Pearson, plus une corrélation optionnelle au décalage 0 et une pseudo valeur p de taille d'échantillon effective de Pyper-Peterman. Le complément à deux variables et sensible au décalage des outils de cube monosérie generate_trend_raster / change_point_detection — rien d'intégré ne relie deux variables dans le temps.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Pile A : un raster multibande (une bande par pas de temps) OU une liste de chemins de rasters monobandes superposables, séparés par des virgules, dans l'ordre chronologique."
              },
              "secondary": {
                "label": "Secondaire",
                "description": "Pile B : mêmes dimensions et même longueur que 'input' (raster multibande ou liste de rasters monobandes séparés par des virgules)."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster du meilleur décalage en sortie (décalage entier maximisant |corrélation|). Si omis, le résultat est stocké en mémoire."
              },
              "corr_output": {
                "label": "Corrélation en sortie",
                "description": "Raster de sortie optionnel de la corrélation de Pearson (signée) au meilleur décalage."
              },
              "corr0_output": {
                "label": "Corrélation 0 en sortie",
                "description": "Raster de sortie optionnel de la corrélation au décalage 0 (contemporaine)."
              },
              "pvalue_output": {
                "label": "Valeur p en sortie",
                "description": "Raster de sortie optionnel d'une pseudo-valeur p bilatérale au meilleur décalage (taille d'échantillon efficace de Pyper-Peterman et transformation z de Fisher)."
              },
              "min_lag": {
                "label": "Décalage minimal",
                "description": "Décalage minimal en pas de temps (par défaut -6). A[t] est apparié à B[t+lag]."
              },
              "max_lag": {
                "label": "Décalage maximal",
                "description": "Décalage maximal en pas de temps (par défaut 6). Doit être >= min_lag."
              },
              "detrend": {
                "label": "Supprimer la tendance",
                "description": "Si vrai, retranche une tendance linéaire MCO propre à chaque série avant de corréler (par défaut faux)."
              },
              "deseasonalize": {
                "label": "Désaisonnaliser",
                "description": "Si vrai, retranche un cycle saisonnier additif de période 'season_length' propre à chaque série avant de corréler (par défaut faux)."
              },
              "season_length": {
                "label": "Longueur de saison",
                "description": "Période saisonnière (en pas de temps) utilisée lorsque 'deseasonalize' est vrai (par défaut 12)."
              },
              "min_valid": {
                "label": "Valides minimaux",
                "description": "Nombre minimal de paires valides recouvrantes requis pour corréler à un décalage donné (par défaut 5)."
              },
              "band": {
                "label": "Bande",
                "description": "Bande à lire, indexée à partir de 1, lorsqu'une pile est fournie sous forme de liste de rasters monobandes séparés par des virgules (par défaut 1). Ignoré pour les piles multibandes."
              }
            }
          },
          "time_series_forecast": {
            "name": "Prévision de séries temporelles",
            "description": "Prévision par emplacement sur un cube spatio-temporel H3 (comme ArcGIS Exponential Smoothing / Curve Fit Forecast) : prévoit la série de chaque cellule par lissage exponentiel de Holt ou ajustements de courbes polynomiales, en choisissant par cellule le modèle de plus faible RMSE de validation, avec des prévisions au pas suivant/final et une demi-largeur de confiance à 90 %. La prévision temporelle que trend_surface intégré, spatial, ne peut pas faire.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de points en entrée d'événements horodatés (lon/lat)."
              },
              "time_field": {
                "label": "Champ de temps",
                "description": "Champ contenant l'heure de chaque point : un nombre ou un horodatage ISO-8601."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche de polygones H3 en sortie avec les attributs de prévision. Si omis, le résultat est stocké en mémoire."
              },
              "value_field": {
                "label": "Champ de valeur",
                "description": "Champ numérique à agréger par cellule (par défaut : nombre de points)."
              },
              "steps": {
                "label": "Étapes",
                "description": "Nombre de pas de temps à prévoir vers l'avant (par défaut 3)."
              },
              "model": {
                "label": "Modèle",
                "description": "'auto' (RMSE de validation le plus faible ; par défaut), 'exp_smoothing', 'linear' ou 'parabolic'."
              },
              "holdout": {
                "label": "Échantillon de validation",
                "description": "Nombre de pas de temps réservés pour valider et sélectionner le modèle (par défaut 3)."
              },
              "time_step": {
                "label": "Pas de temps",
                "description": "Largeur d'un pas de temps dans les unités de time_field (par défaut 1)."
              },
              "resolution": {
                "label": "Résolution",
                "description": "Résolution H3 de 0 à 15 (par défaut 7)."
              }
            }
          },
          "time_series_smoothing": {
            "name": "Lissage de séries temporelles",
            "description": "Lisse une série temporelle observée par emplacement (comme ArcGIS Time Series Smoothing) : regroupe les entités par id_field, ordonne chaque groupe par time_field et ajoute une valeur lissée via une moyenne mobile arrière/centrée/avant ou une passe locale-linéaire à largeur de bande adaptative (LOESS). La géométrie et tous les attributs d'origine sont préservés. Complète time_series_forecast, qui projette en avant au lieu de lisser la série observée.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche d'entités en entrée constituée d'observations horodatées."
              },
              "value_field": {
                "label": "Champ de valeur",
                "description": "Champ numérique dont la série est lissée."
              },
              "time_field": {
                "label": "Champ de temps",
                "description": "Champ qui ordonne chaque série : un nombre ou un horodatage ISO-8601."
              },
              "id_field": {
                "label": "Champ d'identifiant",
                "description": "Champ identifiant chaque lieu ou série. Si omis, toutes les entités forment une seule série."
              },
              "method": {
                "label": "Méthode",
                "description": "'moving_average' (par défaut) ou 'local_linear' (LOESS à largeur de bande adaptative)."
              },
              "window": {
                "label": "Fenêtre",
                "description": "moving_average : nombre de points dans la fenêtre de moyennage (par défaut 3)."
              },
              "bandwidth": {
                "label": "Largeur de bande",
                "description": "local_linear : nombre de points les plus proches dans le temps utilisés pour chaque ajustement local (par défaut 5)."
              },
              "alignment": {
                "label": "Alignement",
                "description": "Placement de la fenêtre pour moving_average : 'backward', 'centered' (par défaut) ou 'forward'."
              },
              "output_field": {
                "label": "Champ de sortie",
                "description": "Nom du champ lissé ajouté (par défaut 'smoothed')."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de la couche en sortie. Si omis, le résultat est stocké en mémoire."
              }
            }
          },
          "topo_to_raster": {
            "name": "Topo vers raster",
            "description": "Interpole un MNT hydrologiquement correct à partir de courbes de niveau, de points cotés et de lignes de cours d'eau optionnelles par une relaxation à courbure minimale (plaque mince) avec imposition du drainage — comme l'outil ArcGIS Topo To Raster (ANUDEM). Contrairement aux interpolateurs IDW/TIN/spline intégrés, il ne crée pas de terrasses sur les courbes de niveau et supprime les dépressions fermées parasites.",
            "params": {
              "contours": {
                "label": "Courbes de niveau",
                "description": "Couche vectorielle de courbes de niveau en entrée (altitude lue dans elevation_field). Au moins l'un des paramètres contours/points est requis."
              },
              "points": {
                "label": "Points",
                "description": "Couche vectorielle de points cotés en entrée (altitude lue dans elevation_field)."
              },
              "streams": {
                "label": "Cours d'eau",
                "description": "Couche vectorielle de cours d'eau optionnelle utilisée pour forcer le drainage (incrustée dans la surface avant la suppression des cuvettes)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin optionnel du raster MNT en sortie (pilote déduit de l'extension). Si omis, le résultat est stocké en mémoire."
              },
              "elevation_field": {
                "label": "Champ d'élévation",
                "description": "Nom du champ numérique d'altitude sur les couches de courbes de niveau et de points. Par défaut : détection automatique (HEIGHT/ELEV/ELEVATION/Z, sinon le premier champ numérique)."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule de sortie en unités du SCR. Par défaut : dimensionnée pour que le plus grand axe de la grille compte environ 400 cellules."
              },
              "tension": {
                "label": "Tension",
                "description": "Rigidité de la surface dans [0,1] : 0 = plaque mince pure (la plus lisse), 1 = membrane tendue. Par défaut 0.35."
              },
              "iterations": {
                "label": "Itérations",
                "description": "Nombre maximal d'itérations SOR (par défaut 2000). L'itération s'arrête plus tôt dès que la variation maximale par cellule passe sous la tolérance."
              },
              "tolerance": {
                "label": "Tolérance",
                "description": "Tolérance de convergence : arrêt lorsque la plus grande variation par cellule au cours d'une itération est inférieure à cette valeur (unités d'altitude du SCR). Par défaut 0.01."
              },
              "enforce_drainage": {
                "label": "Forcer le drainage",
                "description": "Supprime les cuvettes intérieures parasites après interpolation afin que le MNT s'écoule vers ses bords (par défaut vrai)."
              },
              "stream_burn": {
                "label": "Incrustation des cours d'eau",
                "description": "Profondeur (en unités d'altitude) dont abaisser les cellules de cours d'eau avant la suppression des cuvettes, afin d'y acheminer l'écoulement. Par défaut 0 (automatique = 1 % du relief lorsque des cours d'eau sont fournis)."
              }
            }
          },
          "trace_proximity_events": {
            "name": "Tracer les événements de proximité",
            "description": "Trouve les intervalles pendant lesquels deux traces mobiles se sont trouvées à moins d'une distance l'une de l'autre pendant au moins une durée minimale (événements de proximité), et trace éventuellement les contacts transitifs en aval à partir d'entités de départ, comme l'outil ArcGIS Trace Proximity Events.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de points horodatés (utiliser un SCR projeté ; les distances sont en unités carte)."
              },
              "track_field": {
                "label": "Champ de trace",
                "description": "Champ identifiant chaque entité mobile ou trajectoire."
              },
              "time_field": {
                "label": "Champ de temps",
                "description": "Champ d'horodatage (secondes numériques ou ISO-8601)."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche de lignes en sortie des événements de proximité. Si omis, le résultat est stocké en mémoire."
              },
              "search_distance": {
                "label": "Distance de recherche",
                "description": "Écartement maximal pour que deux trajectoires soient considérées « à proximité » (unités carte)."
              },
              "min_duration": {
                "label": "Durée minimale",
                "description": "Durée minimale de proximité pour constituer un événement : en secondes ou sous forme de durée comme '5m', '1h' (par défaut 0)."
              },
              "entities": {
                "label": "Entités",
                "description": "Identifiants de trajectoires initiales optionnels, séparés par des virgules, à partir desquels remonter les contacts en aval (traçage des contacts)."
              },
              "depth": {
                "label": "Profondeur",
                "description": "Nombre maximal de générations de traçage depuis les trajectoires initiales (par défaut illimité)."
              }
            }
          },
          "transform_features": {
            "name": "Transformer les entités",
            "description": "Applique une transformation affine (translation, rotation autour d'une ancre, échelle par axe, symétrie) à chaque géométrie d'une couche vectorielle.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier vectoriel en entrée, format détecté automatiquement (ou référence en mémoire)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel (pilote selon son extension). S'il est omis, stocké en mémoire."
              },
              "dx": {
                "label": "Dx",
                "description": "Décalage appliqué à X après la mise à l'échelle, la symétrie et la rotation, en unités du SCR. Par défaut 0."
              },
              "dy": {
                "label": "Dy",
                "description": "Décalage appliqué à Y après la mise à l'échelle, la symétrie et la rotation, en unités du SCR. Par défaut 0."
              },
              "angle": {
                "label": "Angle",
                "description": "Rotation antihoraire autour du point d'ancrage, en degrés. Par défaut 0."
              },
              "scale_x": {
                "label": "Échelle X",
                "description": "Facteur d'échelle autour du point d'ancrage selon X. Par défaut 1."
              },
              "scale_y": {
                "label": "Échelle Y",
                "description": "Facteur d'échelle autour du point d'ancrage selon Y. Par défaut 1."
              },
              "mirror_axis": {
                "label": "Axe de symétrie",
                "description": "Symétrie par rapport au point d'ancrage : NONE (par défaut), X (retourne Y autour de l'axe horizontal) ou Y (retourne X autour de l'axe vertical)."
              },
              "anchor": {
                "label": "Ancre",
                "description": "Pivot de la mise à l'échelle, de la symétrie et de la rotation : CENTROID (centre de l'emprise, par défaut), ORIGIN (0,0) ou XY (utilise anchor_x/anchor_y)."
              },
              "anchor_x": {
                "label": "Ancre X",
                "description": "Coordonnée X du point d'ancrage ; requise lorsque anchor=XY."
              },
              "anchor_y": {
                "label": "Ancre Y",
                "description": "Coordonnée Y du point d'ancrage ; requise lorsque anchor=XY."
              }
            }
          },
          "transform_fields": {
            "name": "Transformer les champs",
            "description": "Standardise, transforme et encode des champs attributaires (comme ArcGIS Standardize/Transform/Encode Field) : score z, min-max, robuste, log/log1p/sqrt/boxcox/inverse, classement par intervalle égal/quantile/écart-type et encodage one-hot.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle (ou table) en entrée contenant les champs à transformer."
              },
              "fields": {
                "label": "Champs",
                "description": "Noms de champs à transformer séparés par des virgules ; la même transformation est appliquée à chacun."
              },
              "transform": {
                "label": "Transformation",
                "description": "Transformation à appliquer : zscore, minmax, robust, log, log1p, sqrt, boxcox, inverse, bin, onehot."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche vectorielle de sortie avec les champs transformés ajoutés. Si omis, le résultat est stocké en mémoire."
              },
              "bins": {
                "label": "Classes d'histogramme",
                "description": "Nombre de classes pour 'bin' (par défaut 5)."
              },
              "bin_method": {
                "label": "Méthode de classes",
                "description": "Méthode de classification pour 'bin' : equal_interval (par défaut), quantile ou std_dev."
              },
              "boxcox_lambda": {
                "label": "Lambda de Box-Cox",
                "description": "Lambda fixe pour 'boxcox' ; si omis, il est ajusté par maximum de vraisemblance (recherche par section dorée)."
              },
              "suffix": {
                "label": "Suffixe",
                "description": "Suffixe du nom des champs de sortie (la valeur par défaut dépend de la transformation, par ex. '_z' pour zscore)."
              },
              "drop_input": {
                "label": "Supprimer l'entrée",
                "description": "Si vrai, supprime les champs d'origine de la sortie après transformation (par défaut faux)."
              }
            }
          },
          "transform_route_events": {
            "name": "Transformer les événements de route",
            "description": "Re-référence des événements ponctuels mesurés par rapport à un système d'itinéraires source sur un système d'itinéraires cible : récupère les XY de chaque événement à partir de son itinéraire source et de sa mesure, puis le relocalise sur l'itinéraire cible le plus proche dans une tolérance de regroupement, en émettant l'identifiant et la mesure de l'itinéraire cible — comme l'outil ArcGIS Transform Route Events.",
            "params": {
              "source_events": {
                "label": "Événements sources",
                "description": "Couche d'événements ponctuels en entrée. Chaque entité porte un identifiant d'itinéraire (route_id_field) et une mesure (measure_field)."
              },
              "source_routes": {
                "label": "Itinéraires sources",
                "description": "Système d'itinéraires source : couche de lignes dont les entités sont indexées par route_id_field. Les mesures correspondent à la distance depuis le premier sommet de chaque itinéraire."
              },
              "target_routes": {
                "label": "Itinéraires cibles",
                "description": "Système d'itinéraires cible : couche de lignes sur laquelle les événements sont replacés. Les identifiants d'itinéraires proviennent de target_id_field."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de points en sortie (pilote déduit de l'extension). Si omis, le résultat est stocké en mémoire."
              },
              "route_id_field": {
                "label": "Champ d'identifiant d'itinéraire",
                "description": "Champ portant l'identifiant d'itinéraire dans source_events et source_routes (par défaut 'route_id'). Si le champ est absent, l'indice de l'entité d'itinéraire source est utilisé."
              },
              "measure_field": {
                "label": "Champ de mesure",
                "description": "Champ numérique de source_events contenant la mesure dans le système source (par défaut 'measure')."
              },
              "target_id_field": {
                "label": "Champ d'identifiant cible",
                "description": "Champ portant l'identifiant d'itinéraire dans target_routes (par défaut : le même que route_id_field). Si le champ est absent, l'indice de l'entité d'itinéraire cible est utilisé."
              },
              "cluster_tolerance": {
                "label": "Tolérance de regroupement",
                "description": "Distance XY maximale (unités du SCR) entre l'emplacement d'événement reconstitué et un itinéraire cible pour que l'événement soit transféré. La valeur 0 ou l'omission signifie qu'il n'y a pas de limite (accrochage systématique à l'itinéraire cible le plus proche)."
              }
            }
          },
          "transpose_fields": {
            "name": "Transposer les champs",
            "description": "Remodèle une table attributaire au format large en format long : chaque colonne de valeurs listée devient sa propre ligne, marquée de la colonne dont elle provient (ArcGIS Transpose Fields). pivot_table ne va que du long vers le large, de sorte que les tables arrivant avec une colonne par période ne pouvaient pas alimenter les outils de séries temporelles qui exigent une ligne par observation.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche vectorielle ou table en entrée."
              },
              "transpose_fields": {
                "label": "Transposer les champs",
                "description": "Colonnes de valeurs à dépivoter, séparées par des virgules ou des points-virgules."
              },
              "value_field": {
                "label": "Champ de valeur",
                "description": "Nom de la colonne de sortie contenant la valeur de la cellule (par défaut 'VALUE')."
              },
              "transposed_field": {
                "label": "Champ transposé",
                "description": "Nom de la colonne de sortie contenant le nom de la colonne source (par défaut 'FIELD')."
              },
              "field_labels": {
                "label": "Étiquettes de champs",
                "description": "Étiquettes optionnelles écrites dans 'transposed_field' à la place des noms de colonnes bruts, par ex. '2000,2010,2020'. Doivent être en même nombre que 'transpose_fields'."
              },
              "retain_fields": {
                "label": "Champs à conserver",
                "description": "Attributs recopiés sur chaque ligne de sortie. Par défaut, tous les champs non dépivotés."
              },
              "drop_nulls": {
                "label": "Supprimer les valeurs nulles",
                "description": "Ignore les lignes de sortie dont la valeur est nulle (par défaut faux)."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche en sortie. Si omis, stocké en mémoire."
              }
            }
          },
          "trim_line": {
            "name": "Rogner la ligne",
            "description": "Supprime les courts segments de lignes pendants (dépassements et excroissances) plus courts qu'une tolérance de longueur, en conservant les vraies intersections et les lignes longues.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier vectoriel de lignes en entrée, format détecté automatiquement (ou référence en mémoire)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin vectoriel de sortie optionnel (pilote selon son extension). S'il est omis, stocké en mémoire."
              },
              "dangle_length": {
                "label": "Longueur de pendant",
                "description": "Tolérance de longueur en unités du SCR. Un segment pendant plus court que cette valeur est supprimé ; les pendants plus longs sont conservés. Doit être positive."
              },
              "keep_short": {
                "label": "Conserver les courts",
                "description": "Si vrai (par défaut), les segments courts non connectés à leurs deux extrémités (isolés) sont conservés ; si faux, ils sont également supprimés. Les segments pendants par exactement une extrémité sont toujours supprimés lorsqu'ils sont courts."
              },
              "snap_tolerance": {
                "label": "Tolérance d'accrochage",
                "description": "Les extrémités situées à moins de cette distance (unités du SCR) sont considérées comme le même nœud. Par défaut 1e-6."
              }
            }
          },
          "union_3d": {
            "name": "Union 3D",
            "description": "Calcule le volume combiné de solides 3D fermés qui se chevauchent sans compter deux fois leurs intersections, plus les volumes de chevauchement par paire (ArcGIS Union 3D). Aucun registre ne dispose de superposition 3D, de sorte qu'additionner les capsules de buffer_3d ou les enveloppes de minimum_bounding_volume compte aujourd'hui deux fois chaque chevauchement ; polygon_volume et surface_volume ne mesurent que par rapport à un plan de référence. Les volumes par solide sont exacts (sommation de tétraèdres signés) ; l'union est estimée par occupation de voxels à une résolution rapportée.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Entités solides 3D fermées (MultiPolygones à maillage triangulaire avec Z, tels que produits par buffer_3d et minimum_bounding_volume)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel de la table des volumes par groupe. Si omis, le résultat est stocké en mémoire."
              },
              "group_field": {
                "label": "Champ de regroupement",
                "description": "Champ optionnel ; les solides sont réunis au sein de chaque valeur de groupe plutôt que sur l'ensemble de la couche."
              },
              "output_overlap_table": {
                "label": "Table de chevauchement en sortie",
                "description": "Chemin optionnel des volumes de recouvrement par paire. Si omis, le résultat est stocké en mémoire (et toujours renvoyé)."
              },
              "resolution": {
                "label": "Résolution",
                "description": "Nombre d'échantillons de voxels par axe utilisés pour estimer le volume de l'union, de 4 à 512 (par défaut 96). Une valeur plus élevée est plus exacte et plus lente."
              }
            }
          },
          "unwrap_phase": {
            "name": "Dérouler la phase",
            "description": "Convertit une phase interférométrique enroulée dans (-pi, pi] en un champ absolu continu par moindres carrés pondérés, résolus par gradient conjugué préconditionné, avec pondération par la cohérence et masquage optionnels (ArcGIS Unwrap Phase). Rien dans les deux registres ne déroule la phase — raster_calculator ne peut pas exprimer la résolution globale et les filtres de chatoiement intégrés lissent au lieu de dérouler — de sorte que la sortie de phase de sar_coherence et flatten_interferogram n'ont actuellement aucun aboutissement continu.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster de phase enroulée en radians, ou interférogramme I/Q à deux bandes."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster de phase continue déroulée. Si omis, le résultat est stocké en mémoire."
              },
              "method": {
                "label": "Méthode",
                "description": "'least_squares_pcg' (par défaut), correspondant à la méthode prise en charge par ArcGIS."
              },
              "coherence": {
                "label": "Cohérence",
                "description": "Raster de cohérence co-enregistré optionnel utilisé comme pondération par arête lors de la résolution, afin que les pixels de faible cohérence influencent moins la solution."
              },
              "coherence_threshold": {
                "label": "Seuil de cohérence",
                "description": "Masque les pixels dont la cohérence est inférieure à cette valeur (par défaut 0.3). Ignoré lorsqu'aucun raster de cohérence n'est fourni. Un masquage qui scinde les pixels valides en composantes disjointes laisse chaque composante autre que celle du pixel de référence avec sa propre constante additive arbitraire."
              },
              "max_iterations": {
                "label": "Itérations maximales",
                "description": "Nombre maximal d'itérations PCG (par défaut 500)."
              },
              "tolerance": {
                "label": "Tolérance",
                "description": "Résidu relatif auquel la résolution s'arrête (par défaut 1e-8)."
              },
              "reference_row": {
                "label": "Ligne de référence",
                "description": "Ligne du pixel fixé à zéro, qui détermine la constante additive de la solution. Par défaut : le premier pixel valide."
              },
              "reference_col": {
                "label": "Colonne de référence",
                "description": "Colonne du pixel fixé. Par défaut : le premier pixel valide."
              },
              "band": {
                "label": "Bande",
                "description": "Bande contenant la phase, indexée à partir de 1. À omettre pour un raster de phase monobande ou un interférogramme I/Q à deux bandes (alors détecté automatiquement) ; à fournir pour lire la phase réelle dans une bande précise d'une pile multibande. Un raster de plus de deux bandes EXIGE ce paramètre, car trois bandes ou plus ne constituent pas une paire I/Q et une supposition renverrait une phase plausible mais fausse."
              }
            }
          },
          "validate_flow_direction": {
            "name": "Valider la direction d'écoulement",
            "description": "Rapporte les cellules qui rendent un raster de direction d'écoulement inutilisable — codes qui ne sont pas des directions D8, cellules intérieures sans exutoire, écoulement vers NoData, écoulement hors du bord et cellules sur un chemin d'écoulement circulaire — sous forme de couche de points de problèmes (ArcGIS Validate Flow Direction). La suite hydrologique intégrée consomme des rasters de pointeurs partout (d8_flow_accumulation, watershed, basins, trace_downslope_flowpaths) mais rien n'en valide un, de sorte qu'un raster cassé par rééchantillonnage, reclassification ou découpage produit une réponse fausse mais plausible plutôt qu'une erreur, et une boucle de routage peut bloquer.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster de direction d'écoulement (pointeurs) à vérifier."
              },
              "output": {
                "label": "Sortie",
                "description": "Couche de points en sortie, un point par cellule problématique. Si omis, le résultat est stocké en mémoire."
              },
              "flow_direction_type": {
                "label": "Type de direction d'écoulement",
                "description": "'d8' (par défaut) pour des codes uniques en puissance de deux, ou 'mfd' où une valeur peut être la somme de plusieurs directions."
              },
              "report_edge_outflow": {
                "label": "Signaler les sorties en bordure",
                "description": "Signale les cellules dont l'écoulement quitte le raster (par défaut faux). Normal sur une véritable limite, mais c'est un réel défaut à l'intérieur d'une zone découpée."
              },
              "check_circular": {
                "label": "Vérifier la circularité",
                "description": "Détecte les chemins d'écoulement circulaires (par défaut vrai)."
              },
              "band": {
                "label": "Bande",
                "description": "Bande contenant les directions, indexée à partir de 1 (par défaut 1)."
              }
            }
          },
          "vector_convert": {
            "name": "Convertir le vecteur",
            "description": "Convertit un jeu de données vectoriel vers un autre format (l'extension de sortie détermine le pilote).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier vectoriel en entrée (format détecté automatiquement) ou référence en mémoire."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur de sortie ; le pilote est déduit de son extension (.geojson, .fgb, .shp, .gpkg, .parquet, ...). Si omis, la couche est stockée en mémoire."
              }
            }
          },
          "vector_to_h3": {
            "name": "Vecteur vers cellules H3",
            "description": "Regroupe une couche vectorielle en cellules de grille globale discrète H3, en comptant les entités par cellule.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier vectoriel en entrée (doit être en lon/lat géographiques, EPSG:4326) ou référence en mémoire."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du vecteur en sortie ; le pilote est déduit de son extension (.geojson, .fgb, .parquet, ...). Si omis, la couche est stockée en mémoire."
              },
              "resolution": {
                "label": "Résolution",
                "description": "Résolution H3 de 0 (la plus grossière) à 15 (la plus fine) ; par défaut 8 (cellules d'environ 0,7 km²)."
              }
            }
          },
          "vector_to_pmtiles": {
            "name": "Vecteur vers PMTiles",
            "description": "Empaquette une couche vectorielle dans une seule archive PMTiles (pyramide de tuiles vectorielles Mapbox).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier vectoriel en entrée (GeoJSON, Shapefile, GeoPackage, FlatGeobuf, GeoParquet, ...)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier PMTiles en sortie (par ex. /work/roads.pmtiles)."
              },
              "min_zoom": {
                "label": "Zoom minimal",
                "description": "Niveau de zoom minimal (par défaut 0)."
              },
              "max_zoom": {
                "label": "Zoom maximal",
                "description": "Niveau de zoom maximal (par défaut 14, maximum 18)."
              },
              "layer_name": {
                "label": "Nom de la couche",
                "description": "Nom de la couche à l'intérieur des tuiles, utilisé lors de la symbolisation (par défaut : le nom de la couche d'entrée)."
              },
              "simplify": {
                "label": "Simplifier",
                "description": "Simplifie les géométries à chaque niveau de zoom (par défaut vrai)."
              },
              "drop_rate": {
                "label": "Taux d'abandon",
                "description": "Taux d'élimination des entités aux faibles niveaux de zoom, comme dans tippecanoe (par défaut : aucune élimination)."
              }
            }
          },
          "voxel_isosurface": {
            "name": "Isosurface de voxels",
            "description": "Extrait une isosurface triangulée à une ou plusieurs valeurs seuils d'un champ de voxels 3D par marching tetrahedra (ArcGIS Export Voxel Isosurface). Toute la suite de tracé de courbes des deux registres est 2D — des lignes à partir d'un plan ; ceci est l'analogue volumétrique, transformant la sortie de idw_3d ou d'un raster multidimensionnel en géométrie affichable. Émet la convention de maillage triangulaire utilisée par buffer_3d et minimum_bounding_volume, de sorte que les résultats alimentent directement inside_3d.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Champ de voxels sous forme de raster multibande : la bande k est la tranche Z à z_min + k * z_spacing."
              },
              "values": {
                "label": "Valeurs",
                "description": "Valeur ou valeurs de seuil : un nombre, un tableau JSON de nombres ou une chaîne séparée par des virgules. Une surface par valeur."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel des surfaces en maillage triangulaire. Si omis, le résultat est stocké en mémoire."
              },
              "z_min": {
                "label": "Z min",
                "description": "Coordonnée Z de la première tranche (par défaut 0)."
              },
              "z_spacing": {
                "label": "Espacement Z",
                "description": "Espacement vertical entre les tranches (par défaut 1)."
              },
              "close_boundaries": {
                "label": "Fermer les limites",
                "description": "Ferme les surfaces là où elles rencontrent le bord du volume afin que le résultat délimite un solide fermé (par défaut vrai). La mise en œuvre parcourt une enveloppe supplémentaire sous l'isovaleur, si bien que l'obturation est soudée à la surface ; elle se situe entre le plan de limite et une cellule au-delà. Cela ne scelle que les faces EXTÉRIEURES : les cellules touchant un NoData intérieur sont ignorées, si bien qu'une poche de NoData qui coupe la surface extraite laisse encore un bord ouvert (une poche entièrement à l'intérieur ou à l'extérieur du contour ne rencontre jamais le maillage)."
              },
              "smooth": {
                "label": "Lisser",
                "description": "Nombre d'itérations de lissage laplacien appliquées au maillage extrait (par défaut 0)."
              }
            }
          },
          "warp_raster": {
            "name": "Déformer le raster",
            "description": "Géoréférence un raster à partir de points de contrôle au sol (comme ArcGIS Warp) : ajuste un polynôme d'ordre 1/2/3 à partir de paires GCP pixel source → coordonnée monde et rééchantillonne dans une nouvelle grille géoréférencée (plus proche voisin/bilinéaire), en rapportant les résidus par GCP et l'erreur RMS. La moitié raster de la conflation que rubbersheet_features, vectoriel, couvre déjà.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Raster en entrée (sa grille de pixels constitue l'espace de coordonnées source)."
              },
              "gcps": {
                "label": "Points de contrôle",
                "description": "Points de contrôle au sol sous forme de quadruplets 'col,row,x,y' séparés par ';' (>= 3 pour l'ordre 1, 6 pour l'ordre 2, 10 pour l'ordre 3)."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster géoréférencé en sortie. Si omis, le résultat est stocké en mémoire."
              },
              "transform": {
                "label": "Transformation",
                "description": "Ordre polynomial : 'poly1' (affine ; par défaut), 'poly2' ou 'poly3'."
              },
              "resampling": {
                "label": "Rééchantillonnage",
                "description": "'nearest' (par défaut) ou 'bilinear'."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule de sortie en unités terrain (par défaut : la largeur de l'entrée reportée sur l'emprise cible)."
              },
              "epsg": {
                "label": "EPSG",
                "description": "Code EPSG dont marquer le SCR de sortie (optionnel)."
              },
              "band": {
                "label": "Bande",
                "description": "Bande à rééchantillonner géométriquement, indexée à partir de 1 (par défaut 1)."
              }
            }
          },
          "weighted_voronoi": {
            "name": "Voronoï pondéré",
            "description": "Raster d'allocation de Voronoï pondérée (zones de marché/de dominance) : affecte chaque cellule au site ayant la plus petite distance pondérée — multiplicative (d/w, Apollonius), additive (d-w) ou en puissance (d²-w²) — comme l'outil ArcGIS Generate Weighted Voronoi. La version à sites inégaux de voronoi_diagram intégré, non pondéré.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Couche de points des sites en entrée."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster d'affectation en sortie (indice du site par cellule, à partir de 1). Si omis, le résultat est stocké en mémoire."
              },
              "weight_field": {
                "label": "Champ de poids",
                "description": "Champ numérique donnant le poids ou l'attractivité de chaque site (par défaut : tous les sites ont un poids de 1)."
              },
              "weight_type": {
                "label": "Type de poids",
                "description": "'multiplicative' (d/w ; par défaut), 'additive' (d-w) ou 'power' (d²-w²)."
              },
              "cell_size": {
                "label": "Taille de cellule",
                "description": "Taille de cellule de sortie en unités du SCR (par défaut : l'emprise divisée par 400)."
              },
              "margin": {
                "label": "Marge",
                "description": "Fraction de l'emprise des sites servant de marge autour du raster (par défaut 0.1)."
              },
              "epsg": {
                "label": "EPSG",
                "description": "Code EPSG dont marquer la sortie (par défaut : celui de la couche d'entrée)."
              }
            }
          },
          "write_geoparquet": {
            "name": "Écrire un GeoParquet",
            "description": "Convertit un jeu de données vectoriel (GeoJSON, Shapefile, FlatGeobuf, GeoPackage, ...) en GeoParquet, trié selon Hilbert et compressé en ZSTD par défaut.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier vectoriel en entrée (format détecté automatiquement) ou référence en mémoire."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier GeoParquet en sortie (par ex. /work/data.parquet)."
              },
              "compression": {
                "label": "Compression",
                "description": "Compression des colonnes : zstd (par défaut), snappy, gzip ou uncompressed."
              },
              "hilbert_sort": {
                "label": "Tri de Hilbert",
                "description": "Trie les entités le long d'une courbe de Hilbert pour préserver la localité spatiale (par défaut vrai)."
              }
            }
          },
          "write_pmtiles": {
            "name": "Raster vers PMTiles",
            "description": "Rend un raster dans une seule archive PMTiles (pyramide de tuiles PNG en Web Mercator).",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Chemin du fichier raster en entrée. Doit comporter un SCR source (EPSG ou WKT)."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du fichier PMTiles en sortie (par ex. /work/dem.pmtiles)."
              },
              "min_zoom": {
                "label": "Zoom minimal",
                "description": "Niveau de zoom minimal (par défaut : un unique zoom natif correspondant à la résolution du raster)."
              },
              "max_zoom": {
                "label": "Zoom maximal",
                "description": "Niveau de zoom maximal (par défaut : identique à min_zoom)."
              },
              "band": {
                "label": "Bande",
                "description": "Bande (indexée à partir de 1) à rendre (par défaut 1)."
              },
              "colormap": {
                "label": "Palette de couleurs",
                "description": "Palette de couleurs : viridis (par défaut), magma, turbo, terrain ou grayscale."
              },
              "method": {
                "label": "Méthode",
                "description": "Méthode de rééchantillonnage : bilinear (par défaut), nearest, cubic."
              },
              "min": {
                "label": "Minimum",
                "description": "Valeur associée à l'extrémité basse de la palette de couleurs (par défaut : minimum de la bande)."
              },
              "max": {
                "label": "Maximum",
                "description": "Valeur associée à l'extrémité haute de la palette de couleurs (par défaut : maximum de la bande)."
              }
            }
          },
          "zonal_characterization": {
            "name": "Caractérisation zonale",
            "description": "Calcule des statistiques pour plusieurs rasters de valeurs sur un raster de zones en une seule passe, avec une statistique par raster et des percentiles arbitraires, comme l'outil ArcGIS Zonal Characterization.",
            "params": {
              "zones": {
                "label": "Zones",
                "description": "Raster de zones ; chaque valeur distincte définit une zone."
              },
              "rasters": {
                "label": "Rasters",
                "description": "Entrées 'path:statistic[:name]' séparées par des virgules, par ex. 'dem.tif:mean,ndvi.tif:median'. Les rasters de valeurs utilisent la bande 1. Statistiques : mean, sum, min, max, range, stddev, median, majority, minority, variety, count, percentile."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin de sortie optionnel de la table de statistiques. Si omis, le résultat est stocké en mémoire."
              },
              "percentile": {
                "label": "Percentile",
                "description": "Percentile (0-100) appliqué à tout raster dont la statistique est 'percentile' (par défaut 50)."
              },
              "zone_band": {
                "label": "Bande de zone",
                "description": "Bande à lire dans le raster de zones, indexée à partir de 1 (par défaut 1)."
              },
              "ignore_nodata": {
                "label": "Ignorer NoData",
                "description": "Ignore les cellules NoData dans les rasters de valeurs (par défaut vrai). Si faux, tout NoData dans une zone rend nulle la statistique de cette zone."
              }
            }
          },
          "zonal_fill": {
            "name": "Remplissage zonal",
            "description": "Remplit chaque zone d'un raster catégoriel avec la valeur minimale d'un raster de poids trouvée le long de la limite de cette zone (comme ArcGIS Zonal Fill) — une brique de construction de surface contrainte absente de la suite intégrée (fill est basé sur l'écoulement, zonal_statistics ne fait que résumer).",
            "params": {
              "zones": {
                "label": "Zones",
                "description": "Raster de zones catégoriel (chaque valeur entière distincte constitue une zone)."
              },
              "weight": {
                "label": "Poids",
                "description": "Raster de poids co-enregistré dont le minimum sur la limite remplit chaque zone."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster en sortie. Si omis, stocké en mémoire."
              }
            }
          },
          "zonal_geometry": {
            "name": "Géométrie zonale",
            "description": "Mesures géométriques par zone à partir d'un raster de zones catégoriel (comme ArcGIS Zonal Geometry) : surface, périmètre, épaisseur, centroïde et axes majeur/mineur + orientation de l'ellipse d'écart-type — le pendant de forme des zones que zonal_statistics et zonal_histogram intégrés, basés sur les valeurs, ne fournissent pas.",
            "params": {
              "zones": {
                "label": "Zones",
                "description": "Raster de zones catégoriel (chaque valeur entière distincte constitue une zone)."
              },
              "output": {
                "label": "Sortie",
                "description": "Raster de sortie (mode raster) ou chemin CSV (mode as_table). Si omis, le résultat est stocké en mémoire ou uniquement renvoyé dans le résultat."
              },
              "measure": {
                "label": "Mesure",
                "description": "Mesure en mode raster : 'area' (par défaut), 'perimeter', 'thickness', 'centroid_x', 'centroid_y', 'major_axis', 'minor_axis' ou 'orientation'."
              },
              "as_table": {
                "label": "En table",
                "description": "Si vrai, produit une ligne par zone comportant toutes les mesures au lieu d'un raster par cellule (par défaut faux)."
              }
            }
          },
          "zonal_histogram": {
            "name": "Histogramme zonal",
            "description": "Tabule la distribution des cellules d'un raster de valeurs dans chaque zone : comptages de classes (catégoriel) ou fréquences par classes (continu), sous forme de table croisée zones x classes.",
            "params": {
              "zones": {
                "label": "Zones",
                "description": "Chemin du fichier raster de zones (identifiants de zones entiers ou catégoriels)."
              },
              "value": {
                "label": "Valeur",
                "description": "Chemin du fichier raster de valeurs ; doit partager la grille de 'zones'."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du CSV en sortie : une ligne par zone, une colonne par classe ou par intervalle."
              },
              "mode": {
                "label": "Mode",
                "description": "'classes' (par défaut) traite chaque valeur arrondie comme une classe à part entière, pour des rasters de valeurs entiers ou catégoriels. 'bins' regroupe les valeurs continues en classes de largeur égale."
              },
              "bins": {
                "label": "Classes d'histogramme",
                "description": "Nombre de classes de largeur égale pour le mode 'bins'. Par défaut 10."
              },
              "percent": {
                "label": "Pourcentage",
                "description": "Produit le pourcentage de cellules valides de la zone occupé par chaque classe au lieu du nombre brut de cellules. Par défaut faux."
              },
              "zone_band": {
                "label": "Bande de zone",
                "description": "Bande à lire dans 'zones', indexée à partir de 1. Par défaut 1."
              },
              "value_band": {
                "label": "Bande de valeurs",
                "description": "Bande à lire dans 'value', indexée à partir de 1. Par défaut 1."
              },
              "long_output": {
                "label": "Sortie longue",
                "description": "Chemin CSV optionnel de la variante au format long (zone,class,count,percent)."
              }
            }
          },
          "extract_cog_subset": {
            "name": "Extraire un sous-ensemble COG",
            "description": "Extrait un sous-ensemble par emprise d'un GeoTIFF optimisé pour le cloud (COG) local ou HTTP.",
            "params": {
              "input": {
                "label": "Entrée",
                "description": "Fichier COG local. Fournir soit input, soit url."
              },
              "url": {
                "label": "URL",
                "description": "URL HTTP(S) d'un COG. Fournir soit url, soit input ; les sources HTTP utilisent des requêtes par plage d'octets."
              },
              "bbox": {
                "label": "Emprise",
                "description": "Emprise rectangulaire sous la forme minX,minY,maxX,maxY dans bbox_crs."
              },
              "bbox_crs": {
                "label": "SCR de l'emprise",
                "description": "Code EPSG des coordonnées de l'emprise."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du COG en sortie."
              },
              "level": {
                "label": "Niveau",
                "description": "Niveau d'aperçu du COG à lire ; 0 correspond à la pleine résolution."
              },
              "resolution": {
                "label": "Résolution",
                "description": "Taille de pixel cible en sortie. Exprimée dans les unités de output_crs lorsque output_crs est défini, sinon dans celles de bbox_crs. Sélectionne l'aperçu du COG le plus proche lorsque level est omis."
              },
              "output_crs": {
                "label": "SCR de sortie",
                "description": "Code EPSG de sortie optionnel. S'il est défini, le sous-ensemble est reprojeté dans ce SCR. Pour les SCR sources qui ne peuvent pas être écrits sous forme de métadonnées EPSG, la valeur par défaut est bbox_crs."
              },
              "nodata": {
                "label": "NoData",
                "description": "Valeur NoData de sortie optionnelle. Utilisée comme valeur de remplissage lors de la reprojection et écrite dans les métadonnées NoData de la sortie."
              }
            }
          },
          "extract_wms_subset": {
            "name": "Extraire un sous-ensemble WMS",
            "description": "Demande un sous-ensemble par emprise à un point d'accès WMS GetMap et l'écrit en COG Deflate.",
            "params": {
              "url": {
                "label": "URL",
                "description": "URL du point d'accès WMS."
              },
              "layers": {
                "label": "Couches",
                "description": "Nom ou noms de couches WMS, séparés par des virgules."
              },
              "styles": {
                "label": "Styles",
                "description": "Nom ou noms de styles WMS, séparés par des virgules. Vide par défaut."
              },
              "bbox": {
                "label": "Emprise",
                "description": "Emprise rectangulaire sous la forme minX,minY,maxX,maxY dans bbox_crs."
              },
              "bbox_crs": {
                "label": "SCR de l'emprise",
                "description": "Code EPSG des coordonnées de l'emprise."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du COG en sortie."
              },
              "resolution": {
                "label": "Résolution",
                "description": "Taille de pixel cible en sortie, dans les unités de output_crs lorsque output_crs est défini, sinon dans celles de bbox_crs."
              },
              "width": {
                "label": "Largeur",
                "description": "Largeur demandée en sortie, en pixels. Utilisée lorsque resolution est omis."
              },
              "height": {
                "label": "Hauteur",
                "description": "Hauteur demandée en sortie, en pixels. Utilisée lorsque resolution est omis."
              },
              "output_crs": {
                "label": "SCR de sortie",
                "description": "Code EPSG optionnel de sortie et de requête. Par défaut bbox_crs."
              },
              "format": {
                "label": "Format",
                "description": "Format d'image WMS. Par défaut image/geotiff."
              },
              "version": {
                "label": "Version",
                "description": "Version du WMS. Par défaut 1.1.1."
              },
              "nodata": {
                "label": "NoData",
                "description": "Valeur NoData de sortie optionnelle."
              }
            }
          },
          "extract_xyz_tile_subset": {
            "name": "Extraire un sous-ensemble de tuiles XYZ",
            "description": "Récupère des tuiles raster XYZ pour une emprise, les mosaïque et écrit un COG RVB Deflate.",
            "params": {
              "url": {
                "label": "URL",
                "description": "Modèle d'URL de tuiles XYZ, par ex. https://.../{z}/{x}/{y}.png."
              },
              "zoom": {
                "label": "Zoom",
                "description": "Niveau de zoom XYZ."
              },
              "bbox": {
                "label": "Emprise",
                "description": "Emprise rectangulaire sous la forme minX,minY,maxX,maxY dans bbox_crs."
              },
              "bbox_crs": {
                "label": "SCR de l'emprise",
                "description": "Code EPSG des coordonnées de l'emprise."
              },
              "output": {
                "label": "Sortie",
                "description": "Chemin du COG en sortie."
              },
              "resolution": {
                "label": "Résolution",
                "description": "Taille de pixel cible en sortie, dans les unités de output_crs. Par défaut, la résolution native des tuiles."
              },
              "width": {
                "label": "Largeur",
                "description": "Largeur de sortie en pixels. Utilisée lorsque resolution est omis."
              },
              "height": {
                "label": "Hauteur",
                "description": "Hauteur de sortie en pixels. Utilisée lorsque resolution est omis."
              },
              "output_crs": {
                "label": "SCR de sortie",
                "description": "Code EPSG de sortie optionnel. Par défaut bbox_crs."
              },
              "tile_size": {
                "label": "Taille de tuile",
                "description": "Taille des tuiles en pixels. Par défaut 256."
              },
              "subdomains": {
                "label": "Sous-domaines",
                "description": "Lettres de sous-domaine optionnelles pour {s}, par ex. abc."
              },
              "nodata": {
                "label": "NoData",
                "description": "Valeur NoData de sortie optionnelle utilisée pour les pixels manquants ou transparents."
              }
            }
          }
        }
      },
      "whitebox": {
        "categories": {
          "conversion": "Conversion",
          "conversionGeometryTopology": "Conversion - Géométrie et topologie",
          "conversionRasterVectorConversion": "Conversion - Conversion raster/vecteur",
          "conversionVectorTableIO": "Conversion - E/S vecteur et tables",
          "hydrology": "Hydrologie",
          "hydrologyDepressionsStorage": "Hydrologie - Dépressions et stockage",
          "hydrologyFlowRouting": "Hydrologie - Routage des écoulements",
          "hydrologyHydrologicIndices": "Hydrologie - Indices hydrologiques",
          "hydrologyStreamsLongitudinalAnalysis": "Hydrologie - Cours d'eau - Analyse longitudinale",
          "hydrologyStreamsNetworkExtraction": "Hydrologie - Cours d'eau - Extraction du réseau",
          "hydrologyStreamsOrderingMetrics": "Hydrologie - Cours d'eau - Métriques d'ordination",
          "hydrologyWatershedsBasins": "Hydrologie - Bassins versants",
          "lidarAnalysisMetrics": "LiDAR - Métriques d'analyse",
          "lidarFilteringClassification": "LiDAR - Filtrage et classification",
          "lidarIOManagement": "LiDAR - E/S et gestion",
          "lidarInterpolationGridding": "LiDAR - Interpolation et maillage",
          "projectionAndGeoreferencing": "Projection et géoréférencement",
          "raster": "Raster",
          "rasterDistanceCost": "Raster - Distance et coût",
          "rasterLocalNeighborhood": "Raster - Voisinage local",
          "rasterOverlayMath": "Raster - Algèbre de superposition",
          "rasterReclassifyMask": "Raster - Reclassification et masquage",
          "rasterSpatialStatistics": "Raster - Statistiques spatiales",
          "remoteSensingChangeDetection": "Télédétection - Détection de changements",
          "remoteSensingClassification": "Télédétection - Classification",
          "remoteSensingEdgeFeatureDetection": "Télédétection - Détection de contours et d'objets",
          "remoteSensingEnhancementContrast": "Télédétection - Rehaussement et contraste",
          "remoteSensingFilters": "Télédétection - Filtres",
          "remoteSensingObia": "Télédétection - OBIA",
          "remoteSensingRadiometricCorrection": "Télédétection - Correction radiométrique",
          "remoteSensingSar": "Télédétection - SAR",
          "remoteSensingSpectralAnalytics": "Télédétection - Analyses spectrales",
          "remoteSensingThermalEmissivity": "Télédétection - Thermique et émissivité",
          "terrain": "Terrain",
          "terrainDerivatives": "Terrain - Dérivées",
          "terrainLandformIndices": "Terrain - Indices de formes du relief",
          "terrainMultiscaleSignatures": "Terrain - Signatures multi-échelles",
          "terrainRoughnessTexture": "Terrain - Rugosité et texture",
          "terrainVisibility": "Terrain - Visibilité",
          "terrainWorkflowProducts": "Terrain - Produits de traitement",
          "vector": "Vecteur",
          "vectorAttributeAnalysis": "Vecteur - Analyse attributaire",
          "vectorGeometryProcessing": "Vecteur - Traitement géométrique",
          "vectorLinearReferencing": "Vecteur - Référencement linéaire",
          "vectorNetworkAnalysis": "Vecteur - Analyse de réseau",
          "vectorOnlineData": "Vecteur - Données en ligne",
          "vectorOverlayAnalysis": "Vecteur - Analyse de superposition",
          "vectorSamplingGridding": "Vecteur - Échantillonnage et maillage",
          "vectorShapeMetrics": "Vecteur - Métriques de forme",
          "vectorSpatialStatistics": "Vecteur - Statistiques spatiales"
        },
        "menuTool": {
          "calculate_transit_service_frequency": "Calculer la fréquence de desserte",
          "excel_to_table": "Excel vers table",
          "extract_scanned_features": "Extraire les entités numérisées",
          "features_to_gpx": "Entités vers GPX",
          "features_to_gtfs": "Entités vers GTFS",
          "gpx_to_features": "GPX vers entités",
          "gtfs_to_features": "GTFS vers entités",
          "h3_to_vector": "Cellules H3 vers polygones",
          "h3_polyfill": "Remplissage de polygones H3",
          "kml_to_features": "KML vers entités",
          "pmtiles_extract": "Extraire des PMTiles",
          "raster_to_h3": "Raster vers cellules H3",
          "write_pmtiles": "Raster vers PMTiles",
          "raster_to_tiles": "Raster vers tuiles XYZ",
          "read_geoparquet": "Lire un GeoParquet",
          "vector_convert": "Convertir le vecteur",
          "vector_to_h3": "Vecteur vers cellules H3",
          "vector_to_pmtiles": "Vecteur vers PMTiles",
          "write_geoparquet": "Écrire un GeoParquet",
          "fix_dangling_arcs": "Corriger les arcs pendants",
          "lines_to_polygons": "Lignes vers polygones",
          "multipart_to_singlepart": "Multi-parties vers parties simples",
          "polygons_to_lines": "Polygones vers lignes",
          "remove_polygon_holes": "Supprimer les trous des polygones",
          "singlepart_to_multipart": "Parties simples vers multi-parties",
          "topology_rule_autofix": "Correction automatique des règles topologiques",
          "topology_rule_validate": "Valider les règles topologiques",
          "topology_validation_report": "Rapport de validation topologique",
          "convert_nodata_to_zero": "Convertir NoData en zéro",
          "modify_nodata_value": "Modifier la valeur NoData",
          "new_raster_from_base_raster": "Nouveau raster à partir d'un raster de base",
          "new_raster_from_base_vector": "Nouveau raster à partir d'un vecteur de base",
          "raster_to_vector_lines": "Raster vers lignes vectorielles",
          "raster_to_vector_points": "Raster vers points vectoriels",
          "raster_to_vector_polygons": "Raster vers polygones vectoriels",
          "remove_raster_polygon_holes": "Supprimer les trous des polygones raster",
          "set_nodata_value": "Définir la valeur NoData",
          "vector_lines_to_raster": "Lignes vectorielles vers raster",
          "vector_points_to_raster": "Points vectoriels vers raster",
          "vector_polygons_to_raster": "Polygones vectoriels vers raster",
          "add_point_coordinates_to_table": "Ajouter les coordonnées des points à la table",
          "clean_vector": "Nettoyer le vecteur",
          "csv_points_to_vector": "Points CSV vers vecteur",
          "export_table_to_csv": "Exporter la table en CSV",
          "join_tables": "Joindre des tables",
          "merge_table_with_csv": "Fusionner une table avec un CSV",
          "merge_vectors": "Fusionner des vecteurs",
          "reinitialize_attribute_table": "Réinitialiser la table attributaire",
          "vector_summary_statistics": "Statistiques résumées vectorielles",
          "delineate_depressions": "Délimiter les dépressions",
          "delineate_mounts": "Délimiter les buttes",
          "enforce_river_monotonicity": "Imposer la monotonie de la rivière",
          "extract_sinks": "Extraire les cuvettes",
          "fill_spill_merge": "Fill-Spill-Merge",
          "topo_to_raster": "Topo vers raster",
          "breach_depressions_least_cost": "Percer les dépressions au moindre coût",
          "breach_single_cell_pits": "Percer les cuvettes d'une cellule",
          "burn_streams": "Graver les cours d'eau",
          "burn_streams_at_roads": "Graver les cours d'eau aux routes",
          "depth_in_sink": "Profondeur dans la cuvette",
          "fill_burn": "Remplir et graver",
          "fill_depressions": "Remplir les dépressions",
          "fill_depressions_planchon_and_darboux": "Remplir les dépressions (Planchon et Darboux)",
          "fill_depressions_wang_and_liu": "Remplir les dépressions (Wang et Liu)",
          "fill_pits": "Remplir les cuvettes",
          "flatten_lakes": "Aplanir les lacs",
          "impoundment_size_index": "Indice de taille de retenue",
          "insert_dams": "Insérer des barrages",
          "raise_walls": "Élever des murs",
          "sink": "Cuvette",
          "stochastic_depression_analysis": "Analyse stochastique des dépressions",
          "topological_breach_burn": "Gravure topologique des brèches",
          "upslope_depression_storage": "Stockage dans les dépressions amont",
          "average_flowpath_slope": "Pente moyenne du chemin d'écoulement",
          "average_upslope_flowpath_length": "Longueur moyenne du chemin d'écoulement amont",
          "d8_flow_accum": "Accumulation de flux D8",
          "d8_mass_flux": "Flux de masse D8",
          "d8_pointer": "Pointeur D8",
          "dinf_flow_accum": "Accumulation de flux D-infini",
          "dinf_mass_flux": "Flux de masse D-infini",
          "dinf_pointer": "Pointeur D-infini",
          "downslope_flowpath_length": "Longueur du chemin d'écoulement aval",
          "fd8_flow_accum": "Accumulation de flux FD8",
          "fd8_pointer": "Pointeur FD8",
          "flow_accum_full_workflow": "Chaîne complète d'accumulation de flux",
          "flow_length_diff": "Différence de longueur d'écoulement",
          "max_upslope_flowpath_length": "Longueur maximale du chemin d'écoulement amont",
          "max_upslope_value": "Valeur maximale en amont",
          "mdinf_flow_accum": "Accumulation de flux MD-infini",
          "minimal_dispersion_flow_algorithm": "Algorithme d'écoulement à dispersion minimale",
          "num_inflowing_neighbours": "Nombre de voisins entrants",
          "qin_flow_accumulation": "Accumulation de flux de Qin",
          "quinn_flow_accumulation": "Accumulation de flux de Quinn",
          "rho8_flow_accum": "Accumulation de flux Rho8",
          "rho8_pointer": "Pointeur Rho8",
          "trace_downslope_flowpaths": "Tracer les chemins d'écoulement aval",
          "depth_to_water": "Profondeur jusqu'à l'eau",
          "distance_to_outlet": "Distance à l'exutoire",
          "downslope_distance_to_stream": "Distance aval jusqu'au cours d'eau",
          "downslope_index": "Indice aval",
          "edge_contamination": "Contamination des bords",
          "elev_relative_to_watershed_min_max": "Altitude relative au min-max du bassin",
          "elevation_above_stream": "Hauteur au-dessus du cours d'eau",
          "elevation_above_stream_euclidean": "Hauteur au-dessus du cours d'eau (euclidienne)",
          "find_noflow_cells": "Trouver les cellules sans écoulement",
          "find_parallel_flow": "Trouver les écoulements parallèles",
          "hydrologic_connectivity": "Connectivité hydrologique",
          "relative_stream_power_index": "Indice de puissance relative du cours d'eau",
          "sediment_transport_index": "Indice de transport sédimentaire",
          "wetness_index": "Indice d'humidité",
          "farthest_channel_head": "Tête de chenal la plus éloignée",
          "find_main_stem": "Trouver le cours principal",
          "length_of_upstream_channels": "Longueur des chenaux amont",
          "long_profile": "Profil en long",
          "long_profile_from_points": "Profil en long depuis des points",
          "extract_streams": "Extraire les cours d'eau",
          "extract_valleys": "Extraire les vallées",
          "prune_vector_streams": "Élaguer les cours d'eau vectoriels",
          "raster_streams_to_vector": "Cours d'eau raster vers vecteur",
          "rasterize_streams": "Rastériser les cours d'eau",
          "remove_short_streams": "Supprimer les cours d'eau courts",
          "repair_stream_vector_topology": "Réparer la topologie vectorielle des cours d'eau",
          "river_centerlines": "Axes de rivière",
          "hack_stream_order": "Ordre de Hack",
          "horton_ratios": "Rapports de Horton",
          "horton_stream_order": "Ordre de Horton",
          "shreve_stream_magnitude": "Magnitude de Shreve",
          "strahler_order_basins": "Bassins par ordre de Strahler",
          "strahler_stream_order": "Ordre de Strahler",
          "stream_link_class": "Classe de tronçon",
          "stream_link_identifier": "Identifiant de tronçon",
          "stream_link_length": "Longueur de tronçon",
          "stream_link_slope": "Pente de tronçon",
          "stream_slope_continuous": "Pente continue du cours d'eau",
          "topological_stream_order": "Ordre topologique des cours d'eau",
          "tributary_identifier": "Identifiant d'affluent",
          "vector_stream_network_analysis": "Analyse du réseau hydrographique vectoriel",
          "basins": "Bassins",
          "flood_order": "Ordre d'inondation",
          "hillslopes": "Versants",
          "isobasins": "Isobassins",
          "jenson_snap_pour_points": "Accrocher les exutoires (Jenson)",
          "longest_flowpath": "Chemin d'écoulement le plus long",
          "max_branch_length": "Longueur maximale de branche",
          "snap_pour_points": "Accrocher les exutoires",
          "subbasins": "Sous-bassins",
          "unnest_basins": "Désimbriquer les bassins",
          "watershed": "Bassin versant",
          "watershed_from_raster_pour_points": "Bassin versant depuis des exutoires raster",
          "assign_projection_lidar": "Affecter une projection au LiDAR",
          "colourize_based_on_class": "Coloriser selon la classe",
          "colourize_based_on_point_returns": "Coloriser selon les retours du point",
          "find_flightline_edge_points": "Trouver les points de bord de ligne de vol",
          "individual_tree_detection": "Détection d'arbres individuels",
          "lidar_eigenvalue_features": "Attributs de valeurs propres LiDAR",
          "lidar_histogram": "Histogramme LiDAR",
          "lidar_info": "Informations LiDAR",
          "lidar_kappa": "Kappa LiDAR",
          "lidar_point_density": "Densité de points LiDAR",
          "lidar_point_return_analysis": "Analyse des retours de points LiDAR",
          "lidar_point_stats": "Statistiques de points LiDAR",
          "lidar_ransac_planes": "Plans RANSAC LiDAR",
          "lidar_rooftop_analysis": "Analyse de toitures LiDAR",
          "normal_vectors": "Vecteurs normaux",
          "classify_buildings_in_lidar": "Classer les bâtiments dans le LiDAR",
          "classify_lidar": "Classer le LiDAR",
          "classify_overlap_points": "Classer les points de recouvrement",
          "clip_lidar_to_polygon": "Découper le LiDAR selon un polygone",
          "erase_polygon_from_lidar": "Effacer un polygone du LiDAR",
          "filter_lidar": "Filtrer le LiDAR",
          "filter_lidar_by_percentile": "Filtrer le LiDAR par percentile",
          "filter_lidar_by_reference_surface": "Filtrer le LiDAR par surface de référence",
          "filter_lidar_classes": "Filtrer les classes LiDAR",
          "filter_lidar_noise": "Filtrer le bruit LiDAR",
          "filter_lidar_scan_angles": "Filtrer les angles de balayage LiDAR",
          "height_above_ground": "Hauteur au-dessus du sol",
          "improved_ground_point_filter": "Filtre de points sol amélioré",
          "individual_tree_segmentation": "Segmentation d'arbres individuels",
          "lidar_classify_subset": "Classer un sous-ensemble LiDAR",
          "lidar_elevation_slice": "Tranche d'altitude LiDAR",
          "lidar_remove_outliers": "Supprimer les points aberrants LiDAR",
          "lidar_segmentation": "Segmentation LiDAR",
          "lidar_segmentation_based_filter": "Filtre fondé sur la segmentation LiDAR",
          "modify_lidar": "Modifier le LiDAR",
          "normalize_lidar": "Normaliser le LiDAR",
          "remove_duplicates": "Supprimer les doublons",
          "ascii_to_las": "ASCII vers LAS",
          "las_to_ascii": "LAS vers ASCII",
          "las_to_shapefile": "LAS vers shapefile",
          "lidar_colourize": "Coloriser le LiDAR",
          "lidar_join": "Joindre des LiDAR",
          "lidar_shift": "Décaler le LiDAR",
          "lidar_tile": "Découper le LiDAR en tuiles",
          "lidar_tophat_transform": "Transformée chapeau haut-de-forme LiDAR",
          "recover_flightline_info": "Récupérer les informations de ligne de vol",
          "select_tiles_by_polygon": "Sélectionner des tuiles par polygone",
          "sort_lidar": "Trier le LiDAR",
          "split_lidar": "Scinder le LiDAR",
          "flightline_overlap": "Recouvrement des lignes de vol",
          "lidar_block_maximum": "Maximum par bloc LiDAR",
          "lidar_block_minimum": "Minimum par bloc LiDAR",
          "lidar_construct_vector_tin": "Construire un TIN vectoriel LiDAR",
          "lidar_contour": "Courbes de niveau LiDAR",
          "lidar_digital_surface_model": "Modèle numérique de surface LiDAR",
          "lidar_hex_bin": "Regroupement hexagonal LiDAR",
          "lidar_hillshade": "Ombrage du relief LiDAR",
          "lidar_idw_interpolation": "Interpolation IDW LiDAR",
          "lidar_nearest_neighbour_gridding": "Maillage au plus proche voisin LiDAR",
          "lidar_radial_basis_function_interpolation": "Interpolation par fonctions de base radiale LiDAR",
          "lidar_sibson_interpolation": "Interpolation de Sibson LiDAR",
          "lidar_thin": "Éclaircir le LiDAR",
          "lidar_thin_high_density": "Éclaircir le LiDAR haute densité",
          "lidar_tile_footprint": "Emprise des tuiles LiDAR",
          "lidar_tin_gridding": "Maillage TIN LiDAR",
          "build_network_topology": "Construire la topologie du réseau",
          "closest_facility_network": "Ressource la plus proche sur le réseau",
          "generate_network_nodes": "Générer les nœuds du réseau",
          "k_shortest_paths_network": "K plus courts chemins sur le réseau",
          "location_allocation_network": "Localisation-affectation sur le réseau",
          "map_matching_v1": "Appariement cartographique v1",
          "multimodal_od_cost_matrix": "Matrice de coûts OD multimodale",
          "multimodal_routes_from_od": "Itinéraires multimodaux depuis une OD",
          "multimodal_shortest_path": "Plus court chemin multimodal",
          "network_accessibility_metrics": "Métriques d'accessibilité du réseau",
          "network_centrality_metrics": "Métriques de centralité du réseau",
          "network_connected_components": "Composantes connexes du réseau",
          "network_node_degree": "Degré des nœuds du réseau",
          "network_od_cost_matrix": "Matrice de coûts OD du réseau",
          "network_routes_from_od": "Itinéraires du réseau depuis une OD",
          "network_service_area": "Zone de service du réseau",
          "network_topology_audit": "Audit de topologie du réseau",
          "od_sensitivity_analysis": "Analyse de sensibilité OD",
          "shortest_path_network": "Plus court chemin sur le réseau",
          "snap_points_to_network": "Accrocher les points au réseau",
          "split_lines_at_intersections": "Scinder les lignes aux intersections",
          "transfer_attributes": "Transférer les attributs",
          "travelling_salesman_problem": "Problème du voyageur de commerce",
          "vehicle_routing_cvrp": "Tournées de véhicules CVRP",
          "vehicle_routing_pickup_delivery": "Tournées de véhicules avec collecte et livraison",
          "vehicle_routing_vrptw": "Tournées de véhicules VRPTW",
          "georeference_raster_from_control_points": "Géoréférencer un raster à partir de points d'appui",
          "orthorectification": "Orthorectification",
          "reproject_lidar": "Reprojeter le LiDAR",
          "reproject_vector": "Reprojeter le vecteur",
          "aggregate_multidimensional_raster": "Agréger un raster multidimensionnel",
          "analyze_changes_ccdc": "Analyser les changements avec CCDC",
          "apply_radiometric_calibration": "Appliquer un étalonnage radiométrique",
          "assign_projection_raster": "Affecter une projection au raster",
          "band_collection_statistics": "Statistiques de collection de bandes",
          "block_statistics": "Statistiques par bloc",
          "boundary_clean": "Nettoyage des limites",
          "cell_position_statistics": "Statistiques de position de cellule",
          "cell_statistics": "Statistiques de cellules",
          "classification_accuracy_assessment": "Évaluation de la précision de classification",
          "combine": "Combiner",
          "composite_bands": "Composer les bandes",
          "compute_sar_indices": "Calculer les indices SAR",
          "contour_with_barriers": "Courbes de niveau avec barrières",
          "convert_sar_units": "Convertir les unités SAR",
          "coregister_rasters": "Recaler des rasters",
          "corridor": "Corridor",
          "cost_back_link": "Lien de retour de coût",
          "cut_fill": "Déblai-remblai",
          "darcy_flow": "Écoulement de Darcy",
          "dem_filter": "Filtre de MNT",
          "detect_image_anomalies": "Détecter les anomalies d'image",
          "diffusion_interpolation_with_barriers": "Interpolation par diffusion avec barrières",
          "dimensional_moving_statistics": "Statistiques mobiles dimensionnelles",
          "empirical_bayesian_kriging": "Krigeage bayésien empirique",
          "euclidean_direction": "Direction euclidienne",
          "expand_shrink": "Dilater / éroder",
          "extract_cog_subset": "Extraire un sous-ensemble COG",
          "extract_ocean_winds": "Extraire les vents océaniques",
          "extract_spectra_from_image": "Extraire les spectres de l'image",
          "extract_wms_subset": "Extraire un sous-ensemble WMS",
          "extract_xyz_tile_subset": "Extraire un sous-ensemble de tuiles XYZ",
          "find_argument_statistics": "Trouver les statistiques d'argument",
          "flatten_interferogram": "Aplanir l'interférogramme",
          "focal_flow": "Écoulement focal",
          "focal_statistics": "Statistiques focales",
          "frequency_comparison": "Comparaison de fréquences",
          "fuzzy_overlay": "Superposition floue",
          "gaussian_geostatistical_simulations": "Simulations géostatistiques gaussiennes",
          "multidimensional_anomaly": "Générer une anomalie multidimensionnelle",
          "generate_trend_raster": "Générer un raster de tendance",
          "goldstein_phase_filter": "Filtre de phase de Goldstein",
          "idw_3d": "IDW 3D",
          "interpolate_from_spatiotemporal_points": "Interpoler depuis des points spatio-temporels",
          "interpolate_with_barriers": "Interpoler avec barrières",
          "kernel_density_ratio": "Rapport de densité par noyau",
          "kernel_interpolation_with_barriers": "Interpolation par noyau avec barrières",
          "landtrendr": "LandTrendr",
          "las_height_metrics": "Métriques de hauteur LAS",
          "line_density": "Densité de lignes",
          "line_statistics": "Statistiques de lignes",
          "local_polynomial_interpolation": "Interpolation polynomiale locale",
          "locate_regions": "Localiser des régions",
          "matched_filter_target_detection": "Détection de cibles par filtrage adapté (CEM/ACE)",
          "maximum_likelihood_classification": "Classification par maximum de vraisemblance",
          "merge_multidimensional_rasters": "Fusionner des rasters multidimensionnels",
          "multicriteria_overlay": "Superposition multicritère",
          "multidimensional_principal_components": "Composantes principales multidimensionnelles",
          "multidimensional_raster_correlation": "Corrélation de rasters multidimensionnels",
          "multilook": "Multi-visée",
          "multitemporal_coherence": "Cohérence multitemporelle",
          "observer_points": "Points d'observation",
          "optimal_interpolation": "Interpolation optimale",
          "path_distance": "Distance de chemin",
          "percentile_contours": "Courbes de niveau par percentiles",
          "point_statistics": "Statistiques de points",
          "porous_puff": "Panache poreux",
          "predict_using_trend_raster": "Prédire avec un raster de tendance",
          "presence_only_prediction": "Prédiction à partir des seules présences",
          "pycnophylactic_interpolation": "Interpolation pycnophylactique",
          "radiometric_terrain_flattening": "Aplanissement radiométrique du relief",
          "raster_normalize": "Normaliser le raster",
          "regression_kriging": "Krigeage de régression",
          "remove_thermal_noise": "Supprimer le bruit thermique",
          "render_raster_png": "Rendre le raster en PNG",
          "reproject_raster": "Reprojeter le raster",
          "rescale_by_function": "Redimensionner par fonction",
          "sar_coherence": "Cohérence SAR",
          "slice_raster": "Découper le raster en classes",
          "solar_radiation": "Rayonnement solaire",
          "space_time_kernel_density": "Densité par noyau spatio-temporelle",
          "spatial_association_between_zones": "Association spatiale entre zones",
          "spectral_index": "Indice spectral",
          "split_raster": "Découper le raster",
          "storage_capacity": "Capacité de stockage",
          "subset_multidimensional_raster": "Sous-ensemble de raster multidimensionnel",
          "summarize_categorical_raster": "Résumer un raster catégoriel",
          "surface_parameters": "Paramètres de surface",
          "surface_volume": "Volume de surface",
          "time_series_cross_correlation": "Corrélation croisée de séries temporelles",
          "unwrap_phase": "Dérouler la phase",
          "warp_raster": "Déformer le raster",
          "weighted_voronoi": "Voronoï pondéré",
          "zonal_characterization": "Caractérisation zonale",
          "zonal_fill": "Remplissage zonal",
          "zonal_geometry": "Géométrie zonale",
          "zonal_histogram": "Histogramme zonal",
          "abs": "Valeur absolue",
          "aggregate_raster": "Agréger le raster",
          "anova": "ANOVA",
          "arccos": "Arc cosinus",
          "arcosh": "Arc cosinus hyperbolique",
          "arcsin": "Arc sinus",
          "arctan": "Arc tangente",
          "arsinh": "Arc sinus hyperbolique",
          "artanh": "Arc tangente hyperbolique",
          "atan2": "Atan2",
          "block_maximum": "Maximum par bloc",
          "block_minimum": "Minimum par bloc",
          "boundary_shape_complexity": "Complexité de forme de la limite",
          "ceil": "Plafond",
          "centroid_raster": "Centroïde raster",
          "clip_raster_to_polygon": "Découper le raster selon un polygone",
          "clump": "Regrouper",
          "cos": "Cosinus",
          "cosh": "Cosinus hyperbolique",
          "create_plane": "Créer un plan",
          "crispness_index": "Indice de netteté",
          "cross_tabulation": "Tabulation croisée",
          "cumulative_distribution": "Distribution cumulée",
          "dbscan": "DBSCAN",
          "decrement": "Décrément",
          "edge_proportion": "Proportion de bordure",
          "equal_to": "Égal à",
          "erase_polygon_from_raster": "Effacer un polygone du raster",
          "exp": "Exponentielle",
          "exp2": "Exponentielle base 2",
          "fft_random_field": "Champ aléatoire FFT",
          "filter_raster_features_by_area": "Filtrer les entités raster par superficie",
          "find_patch_edge_cells": "Trouver les cellules de bordure de tache",
          "floor": "Plancher",
          "greater_than": "Supérieur à",
          "greater_than_or_equal_to": "SupérieurOuÉgalÀ",
          "heat_map": "Carte de chaleur",
          "idw_interpolation": "Interpolation IDW",
          "image_autocorrelation": "Autocorrélation d'image",
          "image_correlation": "Corrélation d'images",
          "image_regression": "Régression d'images",
          "increment": "Incrément",
          "inplace_add": "Addition sur place",
          "inplace_divide": "Division sur place",
          "inplace_multiply": "Multiplication sur place",
          "inplace_subtract": "Soustraction sur place",
          "integer_division": "Division entière",
          "inverse_pca": "ACP inverse",
          "is_nodata": "Est NoData",
          "kappa_index": "Indice kappa",
          "ks_normality_test": "Test de normalité KS",
          "less_than": "Inférieur à",
          "less_than_or_equal_to": "InférieurOuÉgalÀ",
          "list_unique_values_raster": "Lister les valeurs uniques (raster)",
          "ln": "Logarithme népérien",
          "log10": "Logarithme base 10",
          "log2": "Logarithme base 2",
          "map_features": "Cartographier les entités",
          "max": "Maximum",
          "min": "Minimum",
          "modified_shepard_interpolation": "Interpolation de Shepard modifiée",
          "narrowness_index": "Indice d'étroitesse",
          "negate": "Négation",
          "nibble": "Nibble",
          "not_equal_to": "Différent de",
          "ordinary_cokriging": "Interpolation par cokrigeage ordinaire",
          "paired_sample_t_test": "Test t pour échantillons appariés",
          "phi_coefficient": "Coefficient phi",
          "principal_component_analysis": "Analyse en composantes principales",
          "print_geotiff_tags": "Afficher les balises GeoTIFF",
          "quantiles": "Quantiles",
          "radial_basis_function_interpolation": "Interpolation par fonctions de base radiale",
          "radius_of_gyration": "Rayon de giration",
          "random_field": "Champ aléatoire",
          "random_forest_classification_fit": "Ajuster la classification par forêt aléatoire",
          "random_forest_classification_predict": "Prédire la classification par forêt aléatoire",
          "random_forest_regression_fit": "Ajuster la régression par forêt aléatoire",
          "random_forest_regression_predict": "Prédire la régression par forêt aléatoire",
          "random_sample": "Échantillon aléatoire",
          "raster_area": "Superficie du raster",
          "raster_calculator": "Calculatrice raster",
          "raster_cell_assignment": "Affectation des cellules raster",
          "raster_histogram": "Histogramme raster",
          "raster_perimeter": "Périmètre du raster",
          "raster_summary_stats": "Statistiques résumées du raster",
          "reciprocal": "Inverse",
          "rescale_value_range": "Redimensionner la plage de valeurs",
          "root_mean_square_error": "Erreur quadratique moyenne",
          "round": "Arrondir",
          "shape_complexity_index_raster": "Indice de complexité de forme raster",
          "sieve": "Tamiser",
          "sin": "Sinus",
          "sinh": "Sinus hyperbolique",
          "sqrt": "Racine carrée",
          "square": "Carré",
          "tan": "Tangente",
          "tanh": "Tangente hyperbolique",
          "tin_interpolation": "Interpolation TIN",
          "to_degrees": "Vers degrés",
          "to_radians": "Vers radians",
          "trend_surface": "Surface de tendance",
          "trend_surface_vector_points": "Surface de tendance depuis des points vectoriels",
          "truncate": "Tronquer",
          "turning_bands_simulation": "Simulation par bandes tournantes",
          "two_sample_ks_test": "Test KS à deux échantillons",
          "wilcoxon_signed_rank_test": "Test des rangs signés de Wilcoxon",
          "z_scores": "Scores Z",
          "zonal_statistics": "Statistiques zonales",
          "buffer_raster": "Zone tampon raster",
          "cost_allocation": "Affectation de coût",
          "cost_distance": "Distance de coût",
          "cost_pathway": "Chemin de coût",
          "euclidean_allocation": "Affectation euclidienne",
          "euclidean_distance": "Distance euclidienne",
          "image_correlation_neighbourhood_analysis": "Analyse de voisinage par corrélation d'images",
          "natural_neighbour_interpolation": "Interpolation par voisins naturels",
          "nearest_neighbour_interpolation": "Interpolation au plus proche voisin",
          "add": "Additionner",
          "average_overlay": "Superposition par moyenne",
          "bool_and": "ET logique",
          "bool_not": "NON logique",
          "bool_or": "OU logique",
          "bool_xor": "OU exclusif logique",
          "count_if": "Compter si",
          "divide": "Diviser",
          "highest_position": "Position la plus haute",
          "lowest_position": "Position la plus basse",
          "max_absolute_overlay": "Superposition par maximum absolu",
          "max_overlay": "Superposition par maximum",
          "min_absolute_overlay": "Superposition par minimum absolu",
          "min_overlay": "Superposition par minimum",
          "modulo": "Modulo",
          "multiply": "Multiplier",
          "multiply_overlay": "Superposition par produit",
          "percent_equal_to": "Pourcentage égal à",
          "percent_greater_than": "Pourcentage supérieur à",
          "percent_less_than": "Pourcentage inférieur à",
          "pick_from_list": "Choisir dans une liste",
          "power": "Puissance",
          "standard_deviation_overlay": "Superposition par écart-type",
          "subtract": "Soustraire",
          "sum_overlay": "Superposition par somme",
          "update_nodata_cells": "Mettre à jour les cellules NoData",
          "weighted_overlay": "Superposition pondérée",
          "weighted_sum": "Somme pondérée",
          "conditional_evaluation": "Évaluation conditionnelle",
          "reclass": "Reclassifier",
          "reclass_equal_interval": "Reclassifier par intervalles égaux",
          "geographically_weighted_regression_raster": "Régression géographiquement pondérée (raster)",
          "getis_ord_gi_star_raster": "Gi* de Getis-Ord raster",
          "inhomogeneous_intensity_raster": "Intensité inhomogène (raster)",
          "local_kriging": "Krigeage local",
          "local_morans_i_lisa_raster": "I de Moran local (LISA) raster",
          "ordinary_kriging": "Krigeage ordinaire",
          "simple_kriging": "Krigeage simple",
          "spacetime_kriging": "Krigeage spatio-temporel",
          "spatial_error_regression_raster": "Régression à erreur spatiale (raster)",
          "spatial_lag_regression_raster": "Régression à décalage spatial (raster)",
          "universal_kriging": "Krigeage universel",
          "change_vector_analysis": "Analyse du vecteur de changement",
          "image_difference_change_detection": "Détection de changement par différence d'images",
          "pca_based_change_detection": "Détection de changement par ACP",
          "post_classification_change": "Changement post-classification",
          "write_function_memory_insertion": "Insertion en mémoire de fonction d'écriture",
          "evaluate_training_sites": "Évaluer les sites d'entraînement",
          "fuzzy_knn_classification": "Classification KNN floue",
          "generalize_classified_raster": "Généraliser un raster classé",
          "generalize_with_similarity": "Généraliser par similarité",
          "k_means_clustering": "Classification par K-moyennes",
          "knn_classification": "Classification KNN",
          "knn_regression": "Régression KNN",
          "logistic_regression": "Régression logistique",
          "min_dist_classification": "Classification par distance minimale",
          "modified_k_means_clustering": "K-moyennes modifiées",
          "nnd_classification": "Classification NND",
          "otsu_thresholding": "Seuillage d'Otsu",
          "parallelepiped_classification": "Classification par parallélépipèdes",
          "random_forest_classification": "Classification par forêt aléatoire",
          "random_forest_regression": "Régression par forêt aléatoire",
          "svm_classification": "Classification SVM",
          "svm_regression": "Régression SVM",
          "canny_edge_detection": "Détection de contours de Canny",
          "corner_detection": "Détection de coins",
          "laplacian_filter": "Filtre laplacien",
          "laplacian_of_gaussians_filter": "Filtre laplacien de gaussiennes",
          "prewitt_filter": "Filtre de Prewitt",
          "roberts_cross_filter": "Filtre croix de Roberts",
          "sobel_filter": "Filtre de Sobel",
          "balance_contrast_enhancement": "Rehaussement de contraste équilibré",
          "create_colour_composite": "Créer une composition colorée",
          "direct_decorrelation_stretch": "Étirement par décorrélation directe",
          "false_colour_composite": "Composition en fausses couleurs",
          "gamma_correction": "Correction gamma",
          "gaussian_contrast_stretch": "Étirement de contraste gaussien",
          "histogram_equalization": "Égalisation d'histogramme",
          "histogram_matching": "Appariement d'histogrammes",
          "histogram_matching_two_images": "Appariement d'histogrammes de deux images",
          "ihs_to_rgb": "IHS vers RVB",
          "min_max_contrast_stretch": "Étirement de contraste min-max",
          "mosaic": "Mosaïque",
          "mosaic_with_feathering": "Mosaïque avec fondu",
          "normalized_difference_index": "Indice de différence normalisée",
          "panchromatic_sharpening": "Pansharpening",
          "percentage_contrast_stretch": "Étirement de contraste en pourcentage",
          "piecewise_contrast_stretch": "Étirement de contraste par morceaux",
          "resample": "Rééchantillonner",
          "rgb_to_ihs": "RVB vers IHS",
          "sigmoidal_contrast_stretch": "Étirement de contraste sigmoïdal",
          "split_colour_composite": "Séparer une composition colorée",
          "standard_deviation_contrast_stretch": "Étirement de contraste par écart-type",
          "true_colour_composite": "Composition en vraies couleurs",
          "adaptive_filter": "Filtre adaptatif",
          "anisotropic_diffusion_filter": "Filtre de diffusion anisotrope",
          "bilateral_filter": "Filtre bilatéral",
          "closing": "Fermeture",
          "conservative_smoothing_filter": "Filtre de lissage conservatif",
          "diff_of_gaussians_filter": "Filtre différence de gaussiennes",
          "diversity_filter": "Filtre de diversité",
          "edge_preserving_mean_filter": "Filtre moyen préservant les contours",
          "emboss_filter": "Filtre de repoussage",
          "fast_almost_gaussian_filter": "Filtre gaussien rapide approché",
          "flip_image": "Retourner l'image",
          "frangi_filter": "Filtre de Frangi",
          "gabor_filter_bank": "Banc de filtres de Gabor",
          "gaussian_filter": "Filtre gaussien",
          "glcm_texture": "Texture GLCM",
          "guided_filter": "Filtre guidé",
          "high_pass_bilateral_filter": "Filtre bilatéral passe-haut",
          "high_pass_filter": "Filtre passe-haut",
          "high_pass_median_filter": "Filtre médian passe-haut",
          "integral_image_transform": "Transformée en image intégrale",
          "k_nearest_mean_filter": "Filtre de moyenne des K plus proches",
          "kuwahara_filter": "Filtre de Kuwahara",
          "lee_filter": "Filtre de Lee",
          "lidar_ground_point_filter": "Filtre de points sol LiDAR",
          "line_detection_filter": "Filtre de détection de lignes",
          "line_thinning": "Amincissement de lignes",
          "majority_filter": "Filtre majoritaire",
          "maximum_filter": "Filtre maximum",
          "mean_filter": "Filtre moyen",
          "median_filter": "Filtre médian",
          "minimum_filter": "Filtre minimum",
          "non_local_means_filter": "Filtre de moyennes non locales",
          "olympic_filter": "Filtre olympique",
          "opening": "Ouverture",
          "percentile_filter": "Filtre de percentile",
          "range_filter": "Filtre d'étendue",
          "remove_spurs": "Supprimer les barbules",
          "savitzky_golay_2d_filter": "Filtre Savitzky-Golay 2D",
          "scharr_filter": "Filtre de Scharr",
          "standard_deviation_filter": "Filtre d'écart-type",
          "thicken_raster_line": "Épaissir les lignes raster",
          "tophat_transform": "Transformée chapeau haut-de-forme",
          "total_filter": "Filtre total",
          "unsharp_masking": "Masque flou",
          "user_defined_weights_filter": "Filtre à pondérations définies par l'utilisateur",
          "wiener_filter": "Filtre de Wiener",
          "build_object_hierarchy_multiscale": "Construire une hiérarchie d'objets multi-échelle",
          "classify_objects_ensemble_pro": "Classer les objets par ensemble (Pro)",
          "classify_objects_random_forest": "Classer les objets par forêt aléatoire",
          "classify_objects_rules_basic": "Classer les objets par règles (base)",
          "classify_objects_rules_hierarchical": "Classer les objets par règles hiérarchiques",
          "classify_objects_svm": "Classer les objets par SVM",
          "evaluate_object_classification_accuracy": "Évaluer la précision de classification des objets",
          "evaluate_segmentation_quality_pro": "Évaluer la qualité de segmentation (Pro)",
          "image_segmentation": "Segmentation d'image",
          "image_slider": "Curseur d'images",
          "image_stack_profile": "Profil de pile d'images",
          "obia_audit_report_pro": "Rapport d'audit OBIA (Pro)",
          "obia_batch_orchestrator_pro": "Orchestrateur de lots OBIA (Pro)",
          "obia_pipeline_basic": "Chaîne OBIA (base)",
          "object_class_probability_maps": "Cartes de probabilité de classe d'objet",
          "object_features_context_neighbors": "Attributs d'objet : voisins de contexte",
          "object_features_shape_basic": "Attributs d'objet : forme (base)",
          "object_features_spectral_basic": "Attributs d'objet : spectral (base)",
          "object_features_texture_glcm_basic": "Attributs d'objet : texture GLCM (base)",
          "object_features_topology_relations": "Attributs d'objet : relations topologiques",
          "object_uncertainty_diagnostics_pro": "Diagnostic d'incertitude des objets (Pro)",
          "objects_boundary_refinement_pro": "Affinement des limites d'objets (Pro)",
          "objects_enforce_min_mapping_unit": "Appliquer l'unité minimale de cartographie aux objets",
          "polygons_to_segments": "Polygones vers segments",
          "propagate_labels_across_hierarchy": "Propager les étiquettes dans la hiérarchie",
          "segment_graph_felzenszwalb": "Segmentation par graphe de Felzenszwalb",
          "segment_multiresolution_hierarchical": "Segmentation multirésolution hiérarchique",
          "segment_scale_parameter_optimizer": "Optimiseur du paramètre d'échelle de segmentation",
          "segment_slic_superpixels": "Segmentation en superpixels SLIC",
          "segment_watershed_markers": "Segmentation par marqueurs de ligne de partage",
          "segments_merge_small_regions": "Fusionner les petites régions des segments",
          "segments_split_low_cohesion": "Scinder les segments à faible cohésion",
          "segments_to_polygons": "Segments vers polygones",
          "brdf_normalization": "Normalisation BRDF",
          "correct_vignetting": "Corriger le vignettage",
          "dark_object_subtraction": "Soustraction de l'objet sombre",
          "dn_to_toa_reflectance": "CN vers réflectance TOA",
          "terrain_corrected_optical_analytics": "Analyses optiques corrigées du relief",
          "cloude_pottier_decomposition": "Décomposition de Cloude-Pottier",
          "enhanced_lee_filter": "Filtre de Lee amélioré",
          "freeman_durden_decomposition": "Décomposition de Freeman-Durden",
          "frost_filter": "Filtre de Frost",
          "gamma_map_filter": "Filtre Gamma MAP",
          "h_alpha_wisart_classification": "Classification H-Alpha Wisart",
          "kuan_filter": "Filtre de Kuan",
          "refined_lee_filter": "Filtre de Lee raffiné",
          "wisart_iterative_clustering": "Classification itérative Wisart",
          "yamaguchi_4component_decomposition": "Décomposition de Yamaguchi à 4 composantes",
          "continuum_removal": "Suppression du continuum",
          "linear_spectral_unmixing": "Démixage spectral linéaire",
          "minimum_noise_fraction": "Fraction de bruit minimale",
          "spectral_angle_mapper": "Mesure d'angle spectral (SAM)",
          "spectral_library_matching": "Appariement à une bibliothèque spectrale",
          "land_surface_temperature_single_channel": "Température de surface par canal unique",
          "land_surface_temperature_split_window": "Température de surface par fenêtre partagée",
          "ndvi_based_emissivity": "Émissivité fondée sur le NDVI",
          "assess_route": "Évaluer un itinéraire",
          "breakline_mapping": "Cartographie des lignes de rupture",
          "convergence_index": "Indice de convergence",
          "dem_void_filling": "Comblement des vides du MNT",
          "deviation_from_mean_elevation": "Écart à l'altitude moyenne",
          "difference_from_mean_elevation": "Différence par rapport à l'altitude moyenne",
          "directional_relief": "Relief directionnel",
          "elev_above_pit": "Hauteur au-dessus de la cuvette",
          "elev_above_pit_dist": "Distance de la hauteur au-dessus de la cuvette",
          "elevation_percentile": "Percentile d'altitude",
          "embankment_mapping": "Cartographie des remblais",
          "exposure_towards_wind_flux": "Exposition au flux du vent",
          "feature_preserving_smoothing": "Lissage préservant les formes",
          "feature_preserving_smoothing_multiscale": "Lissage multi-échelle préservant les formes",
          "fetch_analysis": "Analyse de fetch",
          "fill_missing_data": "Combler les données manquantes",
          "find_ridges": "Trouver les crêtes",
          "hillshade": "Ombrage du relief",
          "hypsometrically_tinted_hillshade": "Ombrage du relief teinté hypsométriquement",
          "local_hypsometric_analysis": "Analyse hypsométrique locale",
          "low_points_on_headwater_divides": "Points bas sur les lignes de partage de tête de bassin",
          "map_off_terrain_objects": "Cartographier les objets sur-terrain",
          "max_downslope_elev_change": "Changement d'altitude aval maximal",
          "max_upslope_elev_change": "Changement d'altitude amont maximal",
          "min_downslope_elev_change": "Changement d'altitude aval minimal",
          "multidirectional_hillshade": "Ombrage multidirectionnel",
          "num_downslope_neighbours": "Nombre de voisins aval",
          "num_upslope_neighbours": "Nombre de voisins amont",
          "profile": "Profil",
          "remove_off_terrain_objects": "Supprimer les objets sur-terrain",
          "ridge_and_valley_vectors": "Vecteurs de crêtes et de vallées",
          "slope_vs_aspect_plot": "Graphique pente / exposition",
          "slope_vs_elev_plot": "Graphique pente / altitude",
          "smooth_vegetation_residual": "Lisser le résidu de végétation",
          "surface_area_ratio": "Rapport de surface",
          "topographic_hachures": "Hachures topographiques",
          "accumulation_curvature": "Courbure d'accumulation",
          "aspect": "Exposition",
          "casorati_curvature": "Courbure de Casorati",
          "curvedness": "Courbure globale",
          "difference_curvature": "Courbure de différence",
          "gaussian_curvature": "Courbure gaussienne",
          "generating_function": "Fonction génératrice",
          "horizontal_excess_curvature": "Courbure d'excès horizontal",
          "maximal_curvature": "Courbure maximale",
          "mean_curvature": "Courbure moyenne",
          "minimal_curvature": "Courbure minimale",
          "plan_curvature": "Courbure planaire",
          "principal_curvature_direction": "Direction de la courbure principale",
          "profile_curvature": "Courbure de profil",
          "relative_aspect": "Exposition relative",
          "ring_curvature": "Courbure annulaire",
          "rotor": "Rotor",
          "shape_index": "Indice de forme",
          "slope": "Pente",
          "tangential_curvature": "Courbure tangentielle",
          "total_curvature": "Courbure totale",
          "unsphericity": "Non-sphéricité",
          "vertical_excess_curvature": "Courbure d'excès vertical",
          "elev_relative_to_min_max": "Altitude relative au min-max",
          "geomorphons": "Géomorphons",
          "hypsometric_analysis": "Analyse hypsométrique",
          "multiscale_topographic_position_class": "Classe de position topographique multi-échelle",
          "pennock_landform_classification": "Classification des formes de relief de Pennock",
          "percent_elev_range": "Pourcentage de l'amplitude altimétrique",
          "relative_topographic_position": "Position topographique relative",
          "max_anisotropy_dev": "Écart d'anisotropie maximal",
          "max_anisotropy_dev_signature": "Signature de l'écart d'anisotropie maximal",
          "max_difference_from_mean": "Différence maximale à la moyenne",
          "max_elev_dev_signature": "Signature de l'écart altimétrique maximal",
          "max_elevation_deviation": "Écart altimétrique maximal",
          "multiscale_curvatures": "Courbures multi-échelles",
          "multiscale_elevated_index": "Indice multi-échelle de surélévation",
          "multiscale_elevation_percentile": "Percentile d'altitude multi-échelle",
          "multiscale_low_lying_index": "Indice multi-échelle de zones basses",
          "multiscale_roughness": "Rugosité multi-échelle",
          "multiscale_roughness_signature": "Signature de rugosité multi-échelle",
          "multiscale_std_dev_normals": "Écart-type multi-échelle des normales",
          "multiscale_std_dev_normals_signature": "Signature de l'écart-type multi-échelle des normales",
          "multiscale_topographic_position_image": "Image de position topographique multi-échelle",
          "topographic_position_animation": "Animation de position topographique",
          "average_normal_vector_angular_deviation": "Écart angulaire moyen du vecteur normal",
          "circular_variance_of_aspect": "Variance circulaire de l'exposition",
          "edge_density": "Densité de bordures",
          "ruggedness_index": "Indice de rugosité",
          "spherical_std_dev_of_normals": "Écart-type sphérique des normales",
          "standard_deviation_of_slope": "Écart-type de la pente",
          "average_horizon_distance": "Distance moyenne à l'horizon",
          "horizon_angle": "Angle d'horizon",
          "horizon_area": "Aire d'horizon",
          "openness": "Ouverture",
          "shadow_animation": "Animation d'ombres",
          "shadow_image": "Image d'ombres",
          "sky_view_factor": "Facteur de vue du ciel",
          "skyline_analysis": "Analyse de la ligne d'horizon",
          "time_in_daylight": "Durée d'ensoleillement",
          "viewshed": "Bassin de visibilité",
          "visibility_index": "Indice de visibilité",
          "topo_render": "Rendu topographique",
          "add_surface_information": "Ajouter des informations de surface",
          "add_z_information": "Ajouter des informations Z",
          "adjust_3d_z": "Ajuster le Z en 3D",
          "adjust_stream_to_raster": "Ajuster le cours d'eau au raster",
          "aggregate_points": "Agréger des points",
          "aggregate_polygons": "Agréger des polygones",
          "align_features": "Aligner les entités",
          "apportion_polygon": "Répartir un polygone",
          "areal_interpolation": "Interpolation aréale",
          "assign_projection_vector": "Affecter une projection au vecteur",
          "attribute_uncertainty": "Incertitude attributaire",
          "bivariate_spatial_association": "Association spatiale bivariée",
          "buffer_3d": "Zone tampon 3D",
          "build_balanced_zones": "Construire des zones équilibrées",
          "build_seamlines": "Construire des lignes de raccord",
          "calculate_adjacent_fields": "Calculer les champs adjacents",
          "calculate_central_meridian_and_parallels": "Calculer le méridien central et les parallèles",
          "calculate_composite_index": "Calculer un indice composite",
          "calculate_distance_band": "Calculer la bande de distance",
          "calculate_end_time": "Calculer l'heure de fin",
          "calculate_grid_convergence_angle": "Calculer l'angle de convergence des méridiens",
          "calculate_missing_z_values": "Calculer les valeurs Z manquantes",
          "calculate_motion_statistics": "Calculer les statistiques de mouvement",
          "calculate_polygon_main_angle": "Calculer l'angle principal du polygone",
          "calculate_rates": "Calculer des taux",
          "calculate_transformation_errors": "Calculer les erreurs de transformation",
          "calculate_utm_zone": "Calculer la zone UTM",
          "cartogram": "Cartogramme",
          "causal_inference_analysis": "Analyse d'inférence causale",
          "cell_records_to_sectors": "Enregistrements de cellules vers secteurs",
          "central_feature": "Entité centrale / moyenne directionnelle linéaire",
          "change_point_detection": "Détection de points de rupture",
          "collapse_dual_lines_to_centerline": "Réduire les lignes doubles en axe médian",
          "collapse_hydro_polygon": "Réduire un polygone hydrographique",
          "collapse_road_detail": "Réduire le détail routier",
          "collect_events": "Collecter les événements",
          "colocation_analysis": "Analyse de colocalisation",
          "color_polygons": "Colorer les polygones",
          "compare_spatial_weights": "Comparer les pondérations spatiales",
          "compute_accuracy_for_object_detection": "Calculer la précision de détection d'objets",
          "construct_sight_lines": "Construire des lignes de visée",
          "contiguous_cartogram": "Cartogramme contigu",
          "contour_list": "Liste de courbes de niveau",
          "convert_coordinate_notation": "Convertir la notation des coordonnées",
          "cost_connectivity": "Connectivité de coût",
          "count_overlapping_features": "Compter les entités superposées",
          "create_accuracy_assessment_points": "Créer des points d'évaluation de précision",
          "create_cartographic_partitions": "Créer des partitions cartographiques",
          "create_overpass": "Créer un passage supérieur",
          "create_routes": "Créer des itinéraires",
          "create_spatial_sampling_locations": "Créer des sites d'échantillonnage spatial",
          "create_spatially_balanced_points": "Créer des points spatialement équilibrés",
          "create_underpass": "Créer un passage inférieur",
          "cul_de_sac_masks": "Masques d'impasses",
          "delineate_built_up_areas": "Délimiter les zones bâties",
          "dendrogram": "Dendrogramme",
          "densify_sampling_network": "Densifier le réseau d'échantillonnage",
          "detect_bright_ocean_objects": "Détecter les objets brillants en mer",
          "detect_dark_ocean_areas": "Détecter les zones sombres en mer",
          "detect_feature_changes": "Détecter les changements d'entités",
          "detect_graphic_conflict": "Détecter les conflits graphiques",
          "detect_incidents": "Détecter les incidents",
          "dice": "Découper en dés",
          "difference_3d": "Différence 3D",
          "dimension_reduction": "Réduction de dimension",
          "directional_distribution": "Distribution directionnelle",
          "directional_trend": "Tendance directionnelle",
          "disperse_markers": "Disperser les symboles",
          "dissolve_route_events": "Dissoudre les événements de route",
          "edgematch_features": "Raccorder les entités aux bords",
          "eighty_twenty_analysis": "Analyse quatre-vingt / vingt",
          "eliminate_polygon_part": "Éliminer une partie de polygone",
          "eliminate_polygons": "Éliminer des polygones",
          "emerging_hot_spot_analysis": "Analyse des points chauds émergents",
          "enclose_multipatch": "Fermer un multipatch",
          "estimate_time_to_event": "Estimer le délai avant événement",
          "evaluate_bin_sizes": "Évaluer les tailles de classes",
          "evaluate_variable_influence": "Évaluer l'influence des variables",
          "exploratory_interpolation": "Interpolation exploratoire",
          "exploratory_regression": "Régression exploratoire",
          "extract_locations_from_text": "Extraire des localisations depuis du texte",
          "extract_water_sar": "Extraire l'eau (SAR)",
          "extrude_between": "Extruder entre",
          "feature_outline_masks": "Masques de contour d'entités",
          "feature_to_line": "Entité vers ligne",
          "feature_vertices_to_points": "Sommets d'entités vers points",
          "features_to_kml": "Entités vers KML",
          "fence_diagram": "Diagramme en clôture",
          "fill_missing_values": "Combler les valeurs manquantes",
          "find_dwell_locations": "Trouver les lieux de séjour",
          "find_identical": "Trouver les identiques",
          "find_meeting_locations": "Trouver les lieux de rencontre",
          "find_space_time_matches": "Trouver les correspondances spatio-temporelles",
          "flip_line": "Inverser la ligne",
          "forest_based_forecast": "Prévision par forêts",
          "generalized_linear_regression": "Régression linéaire généralisée",
          "generate_breach_lines": "Générer des lignes de brèche",
          "generate_near_table": "Générer une table de proximité",
          "generate_network_swm": "Générer la matrice SWM du réseau",
          "generate_od_links": "Générer des liens origine-destination",
          "generate_points_along_3d_lines": "Générer des points le long de lignes 3D",
          "generate_spatial_weights_matrix": "Générer une matrice de pondération spatiale",
          "generate_subset_polygons": "Générer des polygones de sous-ensemble",
          "generate_transects_along_lines": "Générer des transects le long de lignes",
          "geodetic_densify": "Densifier géodésiquement",
          "geographically_weighted_regression": "Régression géographiquement pondérée",
          "geotagged_photos_to_points": "Photos géolocalisées vers points",
          "graphic_buffer": "Zone tampon graphique",
          "grid_index_features": "Entités de grille d'index",
          "group_by_proximity": "Grouper par proximité",
          "hdbscan": "Classification HDBSCAN",
          "getis_ord_general_g": "Regroupement haut/bas (G général de Getis-Ord)",
          "hot_spot_analysis_comparison": "Comparaison d'analyses de points chauds",
          "identify_narrow_polygons": "Identifier les polygones étroits",
          "incremental_spatial_autocorrelation": "Autocorrélation spatiale incrémentale",
          "inside_3d": "Intérieur en 3D",
          "integrate": "Intégrer",
          "interpolate_shape": "Interpoler la forme",
          "intersect_3d": "Intersecter en 3D",
          "intersect_3d_line_with_surface": "Intersecter une ligne 3D avec une surface",
          "intersecting_layers_masks": "Masques des couches sécantes",
          "intervisibility": "Intervisibilité",
          "is_closed_3d": "Est fermé en 3D",
          "line_of_sight": "Ligne de visée",
          "local_bivariate_relationships": "Relations bivariées locales",
          "local_outlier_analysis": "Analyse locale des valeurs aberrantes",
          "locate_lines_along_routes": "Localiser des lignes le long des routes",
          "median_center": "Centre médian",
          "merge_divided_roads": "Fusionner les routes séparées",
          "merge_lines_by_pseudo_node": "Fusionner les lignes par pseudo-nœud",
          "minimum_bounding_volume": "Volume englobant minimal",
          "multipatch_footprint": "Emprise de multipatch",
          "multipatch_to_mesh": "Multipatch vers maillage",
          "multiple_ring_buffer": "Zones tampons multiples",
          "mgwr": "Régression géographiquement pondérée multi-échelle",
          "multivariate_clustering": "Classification multivariée",
          "near_3d": "Proximité 3D",
          "neighborhood_summary_statistics": "Statistiques résumées de voisinage",
          "non_maximum_suppression": "Suppression des non-maxima",
          "optics_clustering": "Classification OPTICS",
          "optimal_corridor_connections": "Connexions optimales de corridor",
          "optimal_path_as_line": "Chemin optimal en ligne",
          "optimized_hot_spot_analysis": "Analyse optimisée des points chauds",
          "optimized_outlier_analysis": "Analyse optimisée des valeurs aberrantes",
          "pairwise_comparison_weights": "Pondérations par comparaison par paires",
          "pivot_table": "Tableau croisé dynamique",
          "points_to_line": "Points vers ligne",
          "points_to_path": "Points vers trajet",
          "polygon_neighbors": "Voisins de polygone",
          "polygon_volume": "Volume de polygone",
          "propagate_displacement": "Propager le déplacement",
          "raster_domain": "Domaine du raster",
          "raster_to_weighted_points": "Raster vers points pondérés",
          "reclassify_field": "Reclassifier un champ",
          "reconstruct_tracks": "Reconstruire les trajets",
          "reduce_point_density": "Réduire la densité de points",
          "regularize_adjacent_building_footprint": "Régulariser les emprises de bâtiments adjacents",
          "regularize_building_footprints": "Régulariser les emprises de bâtiments",
          "remove_overlap_multiple": "Supprimer le recouvrement (multiple)",
          "render_vector_png": "Rendre le vecteur en PNG",
          "repair_geometry": "Réparer la géométrie",
          "resolve_building_conflicts": "Résoudre les conflits de bâtiments",
          "resolve_road_conflicts": "Résoudre les conflits routiers",
          "ripleys_k": "K de Ripley",
          "rubbersheet_features": "Ajuster les entités par rubbersheeting",
          "semivariogram_sensitivity": "Sensibilité du semi-variogramme",
          "similarity_search": "Recherche par similarité",
          "simplify_3d_line": "Simplifier une ligne 3D",
          "simplify_building": "Simplifier un bâtiment",
          "simplify_by_circular_arcs": "Simplifier par arcs de cercle",
          "simplify_by_tangent_segments": "Simplifier par segments tangents",
          "simplify_shared_edges": "Simplifier les bords partagés",
          "smooth_natural_features": "Lisser les entités naturelles",
          "smooth_shared_edges": "Lisser les bords partagés",
          "snap_tracks": "Accrocher les trajets",
          "sort_features": "Trier les entités",
          "spatial_eigenvector_filtering": "Filtrage par vecteurs propres spatiaux (MESF)",
          "spatial_outlier_detection": "Détection des valeurs aberrantes spatiales",
          "spatially_constrained_multivariate_clustering": "Classification multivariée sous contrainte spatiale",
          "split_by_attributes": "Scinder par attributs",
          "split_by_features": "Scinder par entités",
          "split_line_at_point": "Scinder une ligne en un point",
          "stack_profile": "Profil de pile",
          "strip_map_index_features": "Entités d'index en bandes",
          "subdivide_polygon": "Subdiviser un polygone",
          "subset_features": "Sous-ensemble d'entités",
          "summarize_nearby": "Résumer à proximité",
          "summarize_percent_change": "Résumer la variation en pourcentage",
          "summarize_within": "Résumer à l'intérieur",
          "summary_statistics": "Statistiques résumées",
          "sun_shadow_volume": "Volume d'ombre solaire",
          "surface_difference": "Différence de surfaces",
          "table_to_geometry": "Table vers géométrie",
          "tabulate_intersection": "Tabuler l'intersection",
          "thin_road_network": "Amincir le réseau routier",
          "tile_grid_polygons": "Polygones de grille de tuiles",
          "time_series_clustering": "Classification de séries temporelles",
          "time_series_forecast": "Prévision de séries temporelles",
          "time_series_smoothing": "Lissage de séries temporelles",
          "trace_proximity_events": "Tracer les événements de proximité",
          "transform_features": "Transformer les entités",
          "transform_fields": "Transformer les champs",
          "transform_route_events": "Transformer les événements de route",
          "transpose_fields": "Transposer les champs",
          "trim_line": "Rogner la ligne",
          "union_3d": "Union 3D",
          "validate_flow_direction": "Valider la direction d'écoulement",
          "voxel_isosurface": "Isosurface de voxels",
          "buffer_vector": "Zone tampon vectorielle",
          "directional_variogram": "Analyse de variogramme directionnel",
          "estimate_variogram": "Estimer le variogramme",
          "fit_variogram": "Ajuster un modèle de variogramme",
          "add_field": "Ajouter un champ",
          "add_geometry_attributes": "Ajouter des attributs de géométrie",
          "attribute_correlation": "Corrélation d'attributs",
          "attribute_histogram": "Histogramme d'attributs",
          "attribute_scattergram": "Nuage de points d'attributs",
          "delete_field": "Supprimer un champ",
          "extract_by_attribute": "Extraire par attribut",
          "field_calculator": "Calculatrice de champs",
          "filter_vector_features_by_area": "Filtrer les entités vectorielles par superficie",
          "list_unique_values": "Lister les valeurs uniques",
          "rename_field": "Renommer un champ",
          "centroid_vector": "Centroïde vectoriel",
          "concave_hull": "Enveloppe concave",
          "densify_features": "Densifier les entités",
          "eliminate_coincident_points": "Éliminer les points coïncidents",
          "extend_vector_lines": "Prolonger les lignes vectorielles",
          "merge_line_segments": "Fusionner les segments de ligne",
          "minimum_bounding_box": "Rectangle englobant minimal",
          "minimum_bounding_circle": "Cercle englobant minimal",
          "minimum_bounding_envelope": "Enveloppe englobante minimale",
          "minimum_convex_hull": "Enveloppe convexe minimale",
          "polygonize": "Polygoniser",
          "representative_point_vector": "Point représentatif vectoriel",
          "simplify_features": "Simplifier les entités",
          "smooth_vectors": "Lisser les vecteurs",
          "snap_endnodes": "Accrocher les nœuds terminaux",
          "split_vector_lines": "Scinder les lignes vectorielles",
          "split_with_lines": "Scinder avec des lignes",
          "locate_points_along_routes": "Localiser des points le long des routes",
          "points_along_lines": "Points le long des lignes",
          "route_calibrate": "Calibrer une route",
          "route_event_lines_from_layer": "Lignes d'événements de route depuis une couche",
          "route_event_lines_from_table": "Lignes d'événements de route depuis une table",
          "route_event_merge": "Fusionner les événements de route",
          "route_event_overlay": "Superposer les événements de route",
          "route_event_points_from_layer": "Points d'événements de route depuis une couche",
          "route_event_points_from_table": "Points d'événements de route depuis une table",
          "route_event_split": "Scinder les événements de route",
          "route_measure_qa": "Contrôle qualité des mesures de route",
          "route_recalibrate": "Recalibrer une route",
          "snap_events_to_routes": "Accrocher les événements aux routes",
          "download_osm_vector": "Télécharger des vecteurs OSM",
          "clip": "Découper",
          "difference": "Différence",
          "dissolve": "Dissoudre",
          "erase": "Effacer",
          "identity": "Identité",
          "intersect": "Intersecter",
          "line_intersections": "Intersections de lignes",
          "line_polygon_clip": "Découpage de lignes par polygone",
          "near": "Proximité",
          "select_by_location": "Sélectionner par localisation",
          "spatial_join": "Jointure spatiale",
          "symmetrical_difference": "Différence symétrique",
          "union": "Union",
          "update": "Mettre à jour",
          "construct_vector_tin": "Construire un TIN vectoriel",
          "contours_from_points": "Courbes de niveau depuis des points",
          "contours_from_raster": "Courbes de niveau depuis un raster",
          "extract_nodes": "Extraire les nœuds",
          "extract_raster_values_at_points": "Extraire les valeurs raster aux points",
          "find_lowest_or_highest_points": "Trouver les points les plus bas ou les plus hauts",
          "hexagonal_grid_from_raster_base": "Grille hexagonale sur base raster",
          "hexagonal_grid_from_vector_base": "Grille hexagonale sur base vectorielle",
          "layer_footprint_raster": "Emprise de couche raster",
          "layer_footprint_vector": "Emprise de couche vectorielle",
          "medoid": "Médoïde",
          "random_points_in_polygon": "Points aléatoires dans un polygone",
          "rectangular_grid_from_raster_base": "Grille rectangulaire sur base raster",
          "rectangular_grid_from_vector_base": "Grille rectangulaire sur base vectorielle",
          "vector_hex_binning": "Regroupement hexagonal vectoriel",
          "voronoi_diagram": "Diagramme de Voronoï",
          "compactness_ratio": "Rapport de compacité",
          "deviation_from_regional_direction": "Écart à la direction régionale",
          "elongation_ratio": "Rapport d'élongation",
          "hole_proportion": "Proportion de trous",
          "linearity_index": "Indice de linéarité",
          "narrowness_index_vector": "Indice d'étroitesse vectoriel",
          "patch_orientation": "Orientation de la tache",
          "perimeter_area_ratio": "Rapport périmètre-aire",
          "polygon_area": "Aire du polygone",
          "polygon_long_axis": "Grand axe du polygone",
          "polygon_perimeter": "Périmètre du polygone",
          "polygon_short_axis": "Petit axe du polygone",
          "related_circumscribing_circle": "Cercle circonscrit associé",
          "shape_complexity_index_vector": "Indice de complexité de forme vectoriel",
          "envelope_test": "Test d'enveloppe",
          "getis_ord_gi_star": "Gi* de Getis-Ord",
          "global_morans_i": "I de Moran global",
          "hotspot_vs_process": "Point chaud contre processus",
          "inhomogeneous_baseline": "Référence inhomogène",
          "local_morans_i_lisa": "I de Moran local (LISA)",
          "nearest_neighbour_index": "Indice du plus proche voisin",
          "point_pattern_envelope": "Enveloppe du semis de points",
          "point_process_residuals": "Résidus du processus ponctuel",
          "point_process_residuals_comparison": "Comparaison des résidus de processus ponctuels",
          "quadrat_count_test": "Test de comptage par quadrats",
          "ripleys_k_function": "Fonction K de Ripley",
          "ripleys_k_test": "Test K de Ripley",
          "spatial_error_regression": "Régression à erreur spatiale",
          "spatial_lag_regression": "Régression à décalage spatial"
        },
        "menuSubcategory": {
          "geolibre_wasm": "GeoLibre (WASM)",
          "geometry_topology": "Géométrie et topologie",
          "raster_vector_conversion": "Conversion raster/vecteur",
          "vector_table_i_o": "E/S vecteur et tables",
          "depressions_storage": "Dépressions et stockage",
          "flow_routing": "Routage des écoulements",
          "hydrologic_indices": "Indices hydrologiques",
          "streams_longitudinal_analysis": "Cours d'eau - Analyse longitudinale",
          "streams_network_extraction": "Cours d'eau - Extraction du réseau",
          "streams_ordering_metrics": "Cours d'eau - Métriques d'ordination",
          "watersheds_basins": "Bassins versants",
          "analysis_metrics": "Métriques d'analyse",
          "filtering_classification": "Filtrage et classification",
          "i_o_management": "E/S et gestion",
          "interpolation_gridding": "Interpolation et maillage",
          "network_analysis": "Analyse de réseau",
          "general": "Général",
          "distance_cost": "Distance et coût",
          "local_neighborhood": "Voisinage local",
          "overlay_math": "Algèbre de superposition",
          "reclassify_mask": "Reclassification et masquage",
          "spatial_statistics": "Statistiques spatiales",
          "change_detection": "Détection de changements",
          "classification": "Classification",
          "edge_feature_detection": "Détection de contours et d'objets",
          "enhancement_contrast": "Rehaussement et contraste",
          "filters": "Filtres",
          "obia": "OBIA",
          "radiometric_correction": "Correction radiométrique",
          "sar": "SAR",
          "spectral_analytics": "Analyses spectrales",
          "thermal_emissivity": "Thermique et émissivité",
          "derivatives": "Dérivées",
          "landform_indices": "Indices de formes du relief",
          "multiscale_signatures": "Signatures multi-échelles",
          "roughness_texture": "Rugosité et texture",
          "visibility": "Visibilité",
          "workflow_products": "Produits de traitement",
          "attribute_analysis": "Analyse attributaire",
          "geometry_processing": "Traitement géométrique",
          "linear_referencing": "Référencement linéaire",
          "online_data": "Données en ligne",
          "overlay_analysis": "Analyse de superposition",
          "sampling_gridding": "Échantillonnage et maillage",
          "shape_metrics": "Métriques de forme"
        }
      }
    }
  }
}
