{
  "format": "geolibre-language-pack",
  "formatVersion": 1,
  "scope": "whitebox",
  "locale": "es",
  "name": "Paquete de idioma español para Whitebox",
  "updatedAt": "2026-09-25T16:57:55.303Z",
  "translations": {
    "processing": {
      "toolMeta": {
        "whitebox": {
          "build_object_hierarchy_multiscale": {
            "name": "Construir jerarquía de objetos multiescala",
            "description": "Red jerárquica de objetos construida mediante agregación iterativa a través de múltiples escalas de segmentación, fusionando progresivamente los segmentos más finos en función de la similitud espectral y la adyacencia espacial. Construye una estructura de árbol en la que los nodos hoja representan segmentos de escala fina y la raíz representa la imagen completa. Las relaciones de contención codifican jerarquías de objetos padre-hijo (parte-todo), lo que permite el análisis multirresolución y consultas de objetos adaptadas a la escala en todos los niveles de la jerarquía. Características clave: jerarquía de segmentación multiescala; seguimiento de las relaciones parte-todo; admite consultas de objetos anidados; permite el análisis adaptado a la escala; representación jerárquica eficiente en memoria; facilita la clasificación en cascada. Casos de uso: cartografía jerárquica de la cobertura del suelo; extracción de edificios complejos a partir de sus componentes; detección de parcelas agrícolas; análisis de estratos de vegetación; delimitación de distritos urbanos; cartografía de humedales con clasificación de subcomponentes. Interpretación de la salida: la salida es una base de datos jerárquica de objetos que codifica la estructura dependiente de la escala. Consulte los objetos a escalas específicas; las escalas intermedias revelan escalas de objetos de transición que equilibran detalle y generalización. Las relaciones padre-hijo revelan la estructura compositiva. Las distribuciones estadísticas por nivel de escala caracterizan las propiedades de tamaño/forma de los objetos en cada nivel de la jerarquía, lo que permite seleccionar la estrategia de clasificación óptima para cada escala.",
            "params": {
              "coarse_segments": {
                "label": "Segmentos gruesos",
                "description": "Ráster de segmentos gruesos."
              },
              "fine_segments": {
                "label": "Segmentos finos",
                "description": "Ráster de segmentos finos."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del CSV de jerarquía de salida."
              }
            }
          },
          "classify_objects_ensemble_pro": {
            "name": "Clasificar objetos con conjunto (Pro)",
            "description": "Ejecuta una configuración de clasificación de objetos de tipo conjunto (ensemble) ajustada para lograr una mayor estabilidad en escenas heterogéneas.",
            "params": {
              "features": {
                "label": "Entidades",
                "description": "CSV de rasgos de objetos de entrada (debe incluir segment_id y columnas de rasgos numéricos)."
              },
              "training": {
                "label": "Entrenamiento",
                "description": "CSV de entrenamiento con columnas segment_id y de etiqueta de clase."
              },
              "segment_id_field": {
                "label": "Campo de ID de segmento",
                "description": "Nombre del campo de ID de segmento (predeterminado segment_id)."
              },
              "class_field": {
                "label": "Campo de clase",
                "description": "Campo de etiqueta de clase en el CSV de entrenamiento (predeterminado class)."
              },
              "n_trees": {
                "label": "Número de árboles",
                "description": "Número de árboles (predeterminado 200)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del CSV de predicciones de salida."
              }
            }
          },
          "classify_objects_random_forest": {
            "name": "Clasificar objetos con bosque aleatorio",
            "description": "Entrena un clasificador de conjunto Random Forest con muestras de entrenamiento de segmentos etiquetados, usando características espectrales, morfológicas y de textura como predictores. Construye múltiples árboles de decisión mediante muestreo bootstrap y aleatorización de características, y luego agrega las predicciones por votación mayoritaria. La clasificación opera sobre vectores de características por segmento, asignando etiquetas de clase de objeto de forma probabilística según el consenso del conjunto, lo que permite una categorización robusta de objetos multiclase a partir de características OBIA. Entre sus características clave se incluyen el aprendizaje de conjunto que combina múltiples árboles de decisión para una clasificación robusta, el manejo de espacios de características de alta dimensión típicos del OBIA multiespectral, estimaciones de confianza y probabilidad de la clasificación, la clasificación de la importancia de las características que identifica las propiedades discriminantes, el manejo natural de interacciones no lineales entre características y la robustez frente al ruido y la redundancia de las características. Los casos de uso abarcan la clasificación multiclase de la cobertura del suelo a partir de segmentos OBIA (urbano, agrícola, forestal, agua), la clasificación supervisada a nivel de objeto refinada mediante la selección de muestras de entrenamiento, la clasificación de detección de cambios a lo largo de secuencias temporales de segmentación, la clasificación jerárquica (tipos de hábitat generales refinados en categorías finas) y la integración con muestras de entrenamiento manuales procedentes de la interpretación visual. La etiqueta de clase predicha en la salida identifica el tipo principal de objeto; la probabilidad de confianza indica la certeza de la clasificación; una confianza baja sugiere objetos intermedios ambiguos; la importancia de las características identifica qué propiedades espectrales/morfológicas determinan las decisiones de clasificación; el mapa de clasificación representa directamente la distribución de los tipos de objetos; la confusión entre clases similares orienta el refinamiento del entrenamiento; la salida probabilística permite cuantificar la incertidumbre.",
            "params": {
              "features": {
                "label": "Entidades",
                "description": "CSV de rasgos de objetos de entrada (debe incluir segment_id y columnas de rasgos numéricos)."
              },
              "training": {
                "label": "Entrenamiento",
                "description": "CSV de entrenamiento con columnas segment_id y de etiqueta de clase."
              },
              "segment_id_field": {
                "label": "Campo de ID de segmento",
                "description": "Nombre del campo de ID de segmento (predeterminado segment_id)."
              },
              "class_field": {
                "label": "Campo de clase",
                "description": "Campo de etiqueta de clase en el CSV de entrenamiento (predeterminado class)."
              },
              "n_trees": {
                "label": "Número de árboles",
                "description": "Número de árboles (predeterminado 200)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del CSV de predicciones de salida."
              }
            }
          },
          "classify_objects_rules_basic": {
            "name": "Clasificar objetos por reglas (básico)",
            "description": "Aplica una clasificación de objetos transparente basada en reglas a partir de un CSV de reglas característica-operador-umbral. Lógica de decisión totalmente interpretable para flujos de trabajo de expertos del dominio y cumplimiento normativo.",
            "params": {
              "features": {
                "label": "Entidades",
                "description": "CSV de rasgos de objetos de entrada."
              },
              "rules": {
                "label": "Reglas",
                "description": "CSV de reglas con columnas: feature, op, value, class, [priority]."
              },
              "default_class": {
                "label": "Clase predeterminada",
                "description": "Clase de reserva cuando ninguna regla coincide."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del CSV de predicciones de salida."
              }
            }
          },
          "classify_objects_rules_hierarchical": {
            "name": "Clasificar objetos por reglas jerárquicas",
            "description": "Aplica una clasificación jerárquica de objetos basada en reglas; actualmente utiliza reglas ordenadas con un valor de respaldo determinista.",
            "params": {
              "features": {
                "label": "Entidades",
                "description": "CSV de rasgos de objetos de entrada."
              },
              "rules": {
                "label": "Reglas",
                "description": "CSV de reglas con columnas: feature, op, value, class, [priority]."
              },
              "default_class": {
                "label": "Clase predeterminada",
                "description": "Clase de reserva cuando ninguna regla coincide."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del CSV de predicciones de salida."
              }
            }
          },
          "classify_objects_svm": {
            "name": "Clasificar objetos con SVM",
            "description": "Clasifica objetos mediante un flujo de trabajo de tipo SVM (implementado con los valores predeterminados de un backend robusto de clasificación de objetos).",
            "params": {
              "features": {
                "label": "Entidades",
                "description": "CSV de rasgos de objetos de entrada (debe incluir segment_id y columnas de rasgos numéricos)."
              },
              "training": {
                "label": "Entrenamiento",
                "description": "CSV de entrenamiento con columnas segment_id y de etiqueta de clase."
              },
              "segment_id_field": {
                "label": "Campo de ID de segmento",
                "description": "Nombre del campo de ID de segmento (predeterminado segment_id)."
              },
              "class_field": {
                "label": "Campo de clase",
                "description": "Campo de etiqueta de clase en el CSV de entrenamiento (predeterminado class)."
              },
              "n_trees": {
                "label": "Número de árboles",
                "description": "Número de árboles (predeterminado 200)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del CSV de predicciones de salida."
              }
            }
          },
          "evaluate_object_classification_accuracy": {
            "name": "Evaluar la precisión de clasificación de objetos",
            "description": "Calcula métricas de exactitud de la clasificación comparando las etiquetas de objeto predichas con etiquetas de referencia (verdad de campo) o de validación. Genera una matriz de confusión que documenta los patrones de concordancia/discordancia de la clasificación por clase, y calcula la exactitud global (total de predicciones correctas), la exactitud del productor por clase (tasa de detección), la exactitud del usuario (fiabilidad), la puntuación F1 (media armónica), el estadístico kappa (concordancia corregida por azar) y un análisis de errores específico por clase que identifica patrones sistemáticos de clasificación errónea. Entre sus características clave se incluyen la evaluación exhaustiva de la exactitud en todas las clases, métricas de rendimiento por clase que permiten diagnósticos específicos, una matriz de confusión que revela patrones sistemáticos de clasificación errónea, pruebas de significación estadística mediante el coeficiente kappa, el manejo natural de distribuciones de clases desequilibradas y la identificación de problemas de suficiencia de los datos de entrenamiento. Los casos de uso incluyen la validación de modelos de clasificación y la cuantificación de su rendimiento, la comparación de enfoques y parámetros de clasificación alternativos, la identificación de clases de objetos problemáticas que requieren entrenamiento adicional, la evaluación de la idoneidad de la clasificación para aplicaciones operativas, la selección de modelos y el ajuste de hiperparámetros basados en la exactitud, el control de calidad en flujos de trabajo de cartografía automatizada y la presentación de métricas de exactitud estandarizadas para la revisión por pares. En la salida, la exactitud global representa la fiabilidad de la clasificación en todos los objetos; la exactitud del productor indica la completitud de la detección por clase; la exactitud del usuario indica la fiabilidad de la predicción; un kappa alto (>0.8) indica una fuerte concordancia más allá del azar; la matriz de confusión revela qué clases se confunden entre sí; el predominio de la diagonal indica una buena separación entre clases; las entradas fuera de la diagonal señalan las fuentes de clasificación errónea; las métricas por clase orientan la mejora dirigida del entrenamiento.",
            "params": {
              "predictions": {
                "label": "Predicciones",
                "description": "CSV de predicciones que contiene segment_id y predicted_class."
              },
              "reference": {
                "label": "Referencia",
                "description": "CSV de referencia que contiene segment_id y class."
              },
              "segment_id_field": {
                "label": "Campo de ID de segmento",
                "description": "Nombre del campo de ID de segmento (predeterminado segment_id)."
              },
              "predicted_field": {
                "label": "Campo predicho",
                "description": "Campo de clase predicha (predeterminado predicted_class)."
              },
              "reference_field": {
                "label": "Campo de referencia",
                "description": "Campo de clase de referencia (predeterminado class)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del informe JSON de salida."
              }
            }
          },
          "evaluate_segmentation_quality_pro": {
            "name": "Evaluar la calidad de la segmentación (Pro)",
            "description": "Calcula diagnósticos de calidad de la segmentación, incluidas estadísticas de número de objetos y de solape de la etiqueta dominante.",
            "params": {
              "segments": {
                "label": "Segmentos",
                "description": "Ráster de etiquetas de segmentos de entrada."
              },
              "reference": {
                "label": "Referencia",
                "description": "Ráster opcional de etiquetas de referencia para diagnósticos basados en solape."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del informe JSON de salida."
              }
            }
          },
          "image_segmentation": {
            "name": "Segmentación de imagen",
            "description": "Segmenta pilas ráster multibanda en regiones homogéneas contiguas mediante crecimiento de regiones a partir de semillas.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Matriz de rásteres de entrada monobanda (uno por banda)."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "threshold": {
                "label": "Umbral",
                "description": "Umbral de distancia para el crecimiento de regiones en el espacio de rasgos estandarizado (predeterminado 0.5)."
              },
              "steps": {
                "label": "Pasos",
                "description": "Número de bandas de prioridad de semillas (predeterminado 10)."
              },
              "min_area": {
                "label": "Área mínima",
                "description": "Área mínima de región opcional para la limpieza posterior a la fusión (predeterminado 4)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "image_slider": {
            "name": "Deslizador de imágenes",
            "description": "Image Slider es una herramienta de visualización interactiva que permite la comparación directa a nivel de píxel entre conjuntos de datos ráster corregistrados mediante divisores de superposición horizontales o verticales que se pueden arrastrar. Algoritmo: mantiene en memoria dos conjuntos de datos ráster alineados, representa una vista combinada con una posición de divisor ajustable que controla la visibilidad de las capas, y la interacción del usuario ajusta dinámicamente el divisor creando un efecto de pantalla dividida. Admite orientaciones de división tanto horizontales como verticales. Características clave: comparación interactiva en tiempo real, mantiene la visualización a resolución completa, interfaz de usuario intuitiva que no requiere conocimientos analíticos, funciona con rásteres multiespectrales e indexados, y admite grandes conjuntos de datos gracias a una representación eficiente. Capacidades: visualización de la detección de cambios, comparación antes/después, análisis multitemporal, evaluación de la normalización radiométrica, inspección visual de la exactitud de la clasificación. Casos de uso: detección de cambios en imágenes entre fechas, comparación de resultados de clasificación con datos de referencia, evaluación de la eficacia del preprocesamiento, detección visual de cambios en el análisis de series temporales. Aplicaciones: evaluación de daños en la respuesta ante desastres, seguimiento de la expansión urbana, detección de perturbaciones forestales, seguimiento de cambios agrícolas, control de calidad de los resultados del procesamiento de imágenes. Interpretación de la salida: las diferencias visuales revelan la magnitud y la ubicación del cambio; los bordes nítidos indican cambios significativos; las transiciones graduales sugieren imprecisiones de registro o una gradación temporal; las diferencias sistemáticas en toda la imagen revelan artefactos sistemáticos de procesamiento.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Ruta del ráster de la imagen izquierda u objeto ráster tipado."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Ruta del ráster de la imagen derecha u objeto ráster tipado."
              },
              "label1": {
                "label": "Etiqueta 1",
                "description": "Etiqueta opcional mostrada para la imagen izquierda."
              },
              "left_palette": {
                "label": "Paleta izquierda",
                "description": "Paleta para la imagen izquierda no RGB (predeterminado grey)."
              },
              "left_reverse_palette": {
                "label": "Invertir paleta izquierda",
                "description": "Invertir la paleta izquierda."
              },
              "label2": {
                "label": "Etiqueta 2",
                "description": "Etiqueta opcional mostrada para la imagen derecha."
              },
              "right_palette": {
                "label": "Paleta derecha",
                "description": "Paleta para la imagen derecha no RGB (predeterminado grey)."
              },
              "right_reverse_palette": {
                "label": "Invertir paleta derecha",
                "description": "Invertir la paleta derecha."
              },
              "height": {
                "label": "Altura",
                "description": "Altura de visualización en píxeles (predeterminado 600)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del HTML de salida."
              }
            }
          },
          "image_stack_profile": {
            "name": "Perfil de pila de imágenes",
            "description": "Extrae perfiles por punto a lo largo de una pila ráster ordenada y, opcionalmente, escribe un informe HTML.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Lista de rásteres de entrada como matriz de rutas o cadena delimitada por comas/punto y coma."
              },
              "points": {
                "label": "Puntos",
                "description": "Ruta del vectorial de puntos (u objeto vectorial tipado) que contiene las ubicaciones de muestreo."
              },
              "output_html": {
                "label": "Salida HTML",
                "description": "Ruta opcional de salida del informe HTML."
              }
            }
          },
          "obia_audit_report_pro": {
            "name": "Informe de auditoría OBIA (Pro)",
            "description": "Genera un informe de auditoría de los artefactos del flujo de trabajo OBIA que incluye metadatos de existencia, tamaño y marca de tiempo de los archivos.",
            "params": {
              "artifacts": {
                "label": "Artefactos",
                "description": "Matriz de rutas de artefactos a auditar."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del JSON del informe de auditoría de salida."
              }
            }
          },
          "obia_batch_orchestrator_pro": {
            "name": "Orquestador de lotes OBIA (Pro)",
            "description": "Ejecuta varios trabajos de la cadena de procesamiento OBIA en una sola solicitud y devuelve un informe consolidado de los trabajos.",
            "params": {
              "jobs": {
                "label": "Trabajos",
                "description": "Matriz de objetos de trabajo con inputs, training, output_prefix y segment_method opcional."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del informe JSON de salida."
              }
            }
          },
          "obia_pipeline_basic": {
            "name": "Flujo OBIA (básico)",
            "description": "Ejecuta un flujo de trabajo OBIA completo de principio a fin: segmentación (SLIC/Graph), fusión de regiones pequeñas, extracción de características espectrales/de forma y clasificación Random Forest en una sola operación.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Matriz de rásteres de entrada monobanda para segmentación/rasgos."
              },
              "training": {
                "label": "Entrenamiento",
                "description": "CSV de entrenamiento con columnas segment_id y class."
              },
              "output_prefix": {
                "label": "Prefijo de salida",
                "description": "Prefijo de ruta de salida para los artefactos generados."
              },
              "segment_method": {
                "label": "Método de segmentación",
                "description": "Método de segmentación: slic o graph (predeterminado slic)."
              },
              "min_size": {
                "label": "Tamaño mínimo",
                "description": "Tamaño mínimo de segmento para la limpieza por fusión (predeterminado 10)."
              },
              "class_field": {
                "label": "Campo de clase",
                "description": "Nombre del campo de clase de entrenamiento (predeterminado class)."
              }
            }
          },
          "object_class_probability_maps": {
            "name": "Mapas de probabilidad de clase de objeto",
            "description": "Convierte las predicciones en mapas de probabilidad por clase, lo que permite la visualización de la incertidumbre basada en ráster y el filtrado basado en la confianza. Admite la aplicación posterior de umbrales de confianza y escenarios multietiqueta.",
            "params": {
              "predictions": {
                "label": "Predicciones",
                "description": "CSV de predicciones con segment_id y predicted_class."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del CSV de probabilidades de salida."
              }
            }
          },
          "object_features_context_neighbors": {
            "name": "Rasgos de objeto: vecinos de contexto",
            "description": "Calcula características de contexto espacial: número de objetos adyacentes, longitudes de los límites compartidos y métricas de aislamiento. Permite una clasificación consciente de los vecinos que capta las relaciones entre objetos en el paisaje.",
            "params": {
              "segments": {
                "label": "Segmentos",
                "description": "Ráster de etiquetas de segmentos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del CSV de salida."
              }
            }
          },
          "object_features_shape_basic": {
            "name": "Rasgos de objeto: forma (básico)",
            "description": "Calcula descriptores de forma geométricos y morfológicos para cada segmento, incluidos el área (número de píxeles), el perímetro (longitud del límite), la compacidad (circularidad normalizada por el perímetro), el alargamiento (relación longitud/anchura), el factor de forma (regularidad de forma normalizada) y la solidez (eficiencia respecto a la envolvente convexa). Los descriptores de forma captan características estructurales independientes del contenido espectral, lo que permite clasificar la geometría de los objetos y reconocer patrones morfológicos. Entre sus características clave se incluyen conjuntos completos de métricas de forma que abarcan el área, el perímetro, la regularidad y el alargamiento, algoritmos de trazado de límites computacionalmente eficientes, métricas invariantes a la rotación y la traslación, aplicabilidad en distintos rangos de escala y capacidad de clasificación morfológica de objetos (p. ej., carreteras alargadas frente a edificios compactos). Los casos de uso abarcan la clasificación de huellas de edificios y el análisis de la estructura urbana, la extracción de elementos lineales (carreteras, ríos, límites), la caracterización de parches de vegetación y el análisis de la fragmentación, el control de calidad mediante filtrado basado en la forma, el reconocimiento jerárquico de objetos que combina propiedades de forma y espectrales, y la cuantificación de la estructura del paisaje en el seguimiento ecológico. En la salida, el área cuantifica el tamaño del segmento en píxeles; el perímetro define la complejidad del límite; una compacidad cercana a 1.0 indica formas circulares/regulares, mientras que valores más bajos indican elementos irregulares/alargados; un alargamiento >1 indica elementos lineales y cercano a 1 indica objetos compactos; el factor de forma combina múltiples propiedades de forma para una clasificación integrada de la forma; las métricas de forma permiten un filtrado morfológico para aislar los tipos de objetos de interés.",
            "params": {
              "segments": {
                "label": "Segmentos",
                "description": "Ráster de etiquetas de segmentos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del CSV de salida."
              }
            }
          },
          "object_features_spectral_basic": {
            "name": "Rasgos de objeto: espectral (básico)",
            "description": "Calcula resúmenes estadísticos univariantes completos de los valores de reflectancia espectral dentro de cada segmento en todas las bandas de la imagen. Los cálculos por segmento incluyen la reflectancia media, la desviación estándar (homogeneidad), los límites mínimo y máximo de reflectancia, valores de cuantiles para una estimación robusta y estadísticas por banda que permiten la cuantificación de la textura multiespectral y la caracterización del perfil espectral, fundamentales en los flujos de trabajo de clasificación OBIA. Entre sus características clave se incluyen la generación de estadísticas espectrales por banda para imágenes multiespectrales e hiperespectrales, medidas estadísticas robustas que captan la tendencia central y la dispersión, la identificación de anomalías espectrales y valores atípicos dentro de los segmentos, un resumen eficiente de ráster a vectorial y una salida que alimenta directamente las cadenas de clasificación por aprendizaje automático. Los casos de uso abarcan la extracción de características para la clasificación basada en objetos mediante métricas espectrales, la identificación de tipos de cobertura del suelo mediante el análisis de firmas espectrales, la detección de cambios mediante la comparación de estadísticas espectrales a lo largo de secuencias temporales, la evaluación de la calidad de los datos y la detección de valores atípicos, el seguimiento ambiental mediante el análisis de series temporales espectrales y las aplicaciones de agricultura de precisión que requieren una caracterización normalizada de la respuesta espectral. En la salida, los valores medios representan la respuesta espectral típica del material del segmento; la desviación estándar cuantifica la heterogeneidad interna (baja = superficie homogénea, alta = materiales mixtos o sombras); los límites mín./máx. identifican los extremos espectrales dentro de los segmentos; los perfiles espectrales permiten la comparación con firmas de referencia; las estadísticas constituyen la base de los vectores de características para la clasificación; el análisis por banda revela índices espectrales y la capacidad de discriminación de materiales.",
            "params": {
              "segments": {
                "label": "Segmentos",
                "description": "Ráster de etiquetas de segmentos de entrada."
              },
              "inputs": {
                "label": "Entradas",
                "description": "Matriz de rásteres de entrada monobanda usados para rasgos espectrales."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del CSV de salida."
              }
            }
          },
          "object_features_texture_glcm_basic": {
            "name": "Rasgos de objeto: textura GLCM (básico)",
            "description": "Extrae características de textura mediante el análisis de la matriz de coocurrencia de niveles de gris (GLCM) calculada a partir de las distribuciones de intensidad por banda dentro de cada segmento. La GLCM cuantifica la coocurrencia espacial de los niveles de tono y genera descriptores que incluyen el contraste (variación local), la homogeneidad (regularidad espacial), la energía (orden), la entropía (desorden) y métricas de disimilitud que captan patrones de textura independientes del brillo espectral global. Entre sus características clave se incluyen métricas de textura basadas en la GLCM que captan patrones espaciales locales dentro de los segmentos, el análisis multidireccional (horizontal, vertical, diagonal) para una caracterización de la textura independiente de la orientación, la aplicabilidad a todas las bandas de la imagen, lo que permite obtener huellas de textura, la discriminación entre superficies texturizadas y lisas, y un análisis computacionalmente abordable a nivel de segmento. Los casos de uso incluyen la clasificación de materiales basada en la rugosidad y la textura de la superficie (asfalto frente a hormigón, distinción de tipos de cultivo), la caracterización de la estructura y la densidad forestal mediante la textura del dosel, la interpretación de imágenes SAR y el análisis de la textura del tejido urbano, la discriminación entre superficies en buen estado y degradadas, la evaluación de la salud de los cultivos mediante métricas de textura del dosel y la detección de nubes y sombras mediante anomalías de textura. En la salida, un contraste alto indica una textura rugosa/variable y uno bajo indica superficies lisas; una homogeneidad alta indica patrones espaciales regulares y una baja indica una textura caótica; una energía alta indica una textura organizada y una baja indica ruido aleatorio; la entropía cuantifica el desorden de la textura; la disimilitud capta la irregularidad del patrón espacial; los perfiles de textura permiten una clasificación específica por material; su combinación con características espectrales mejora la discriminación de tipos de objetos.",
            "params": {
              "segments": {
                "label": "Segmentos",
                "description": "Ráster de etiquetas de segmentos de entrada."
              },
              "input": {
                "label": "Entrada",
                "description": "Ráster de intensidad monobanda para el análisis de textura."
              },
              "levels": {
                "label": "Niveles",
                "description": "Niveles de cuantización para GLCM (predeterminado 16)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del CSV de salida."
              }
            }
          },
          "object_features_topology_relations": {
            "name": "Rasgos de objeto: relaciones topológicas",
            "description": "Calcula características de topología de grafo: grado del objeto (número de vecinos), intensidad del vecino dominante e indicadores de articulación. Capta la posición estructural en la red de objetos para la clasificación jerárquica.",
            "params": {
              "segments": {
                "label": "Segmentos",
                "description": "Ráster de etiquetas de segmentos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del CSV de salida."
              }
            }
          },
          "object_uncertainty_diagnostics_pro": {
            "name": "Diagnóstico de incertidumbre de objetos (Pro)",
            "description": "Calcula diagnósticos agregados de incertidumbre a partir de las salidas de probabilidad de los objetos.",
            "params": {
              "probabilities": {
                "label": "Probabilidades",
                "description": "CSV de probabilidades de entrada con columnas probability y uncertainty."
              },
              "low_conf_threshold": {
                "label": "Umbral de confianza baja",
                "description": "Umbral de confianza baja sobre la probabilidad (predeterminado 0.7)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del JSON de diagnósticos de salida."
              }
            }
          },
          "objects_boundary_refinement_pro": {
            "name": "Refinamiento de límites de objetos (Pro)",
            "description": "Refina los límites de los objetos mediante una limpieza iterativa de regiones pequeñas con fusión consciente de los vecinos.",
            "params": {
              "segments": {
                "label": "Segmentos",
                "description": "Ráster de etiquetas de segmentos de entrada."
              },
              "iterations": {
                "label": "Iteraciones",
                "description": "Iteraciones de refinamiento (predeterminado 2)."
              },
              "min_size": {
                "label": "Tamaño mínimo",
                "description": "Umbral de tamaño mínimo de objeto (predeterminado 6)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster refinado de salida."
              }
            }
          },
          "objects_enforce_min_mapping_unit": {
            "name": "Aplicar unidad mínima cartografiable a objetos",
            "description": "Impone una unidad mínima cartografiable fusionando los segmentos de objetos de tamaño insuficiente.",
            "params": {
              "segments": {
                "label": "Segmentos",
                "description": "Ráster de etiquetas de segmentos de entrada."
              },
              "min_size": {
                "label": "Tamaño mínimo",
                "description": "Tamaño mínimo de segmento en celdas (predeterminado 5)."
              },
              "method": {
                "label": "Método",
                "description": "Método de fusión: longest, largest, nearest (predeterminado longest)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "polygons_to_segments": {
            "name": "Polígonos a segmentos",
            "description": "Rasteriza de nuevo los polígonos editados en un ráster de etiquetas de segmentos, conservando los ID de objeto o los valores de atributos. Permite flujos de trabajo OBIA iterativos que combinan la segmentación automatizada con el refinamiento manual.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del vectorial de polígonos de entrada."
              },
              "base": {
                "label": "Base",
                "description": "Ráster base que define la malla de salida."
              },
              "field": {
                "label": "Campo",
                "description": "Campo numérico opcional a grabar (predeterminado FID)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de segmentos de salida."
              }
            }
          },
          "propagate_labels_across_hierarchy": {
            "name": "Propagar etiquetas por la jerarquía",
            "description": "Propaga las etiquetas de clase de nivel general a los objetos hijo de nivel fino mediante las correspondencias de la jerarquía. Permite un etiquetado eficiente de jerarquías anidadas y flujos de trabajo de refinamiento basados en la herencia.",
            "params": {
              "hierarchy": {
                "label": "Jerarquía",
                "description": "CSV de jerarquía con fine_segment_id y coarse_segment_id."
              },
              "parent_labels": {
                "label": "Etiquetas padre",
                "description": "CSV de etiquetas padre con coarse_segment_id y class."
              },
              "child_labels": {
                "label": "Etiquetas hijo",
                "description": "CSV opcional de etiquetas hijo con fine_segment_id y class."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del CSV de etiquetas propagadas de salida."
              }
            }
          },
          "segment_graph_felzenszwalb": {
            "name": "Segmentación por grafo de Felzenszwalb",
            "description": "La segmentación basada en grafos de Felzenszwalb trata la imagen como un grafo no dirigido ponderado en el que los píxeles son nodos y las aristas conectan píxeles adyacentes con pesos que representan la disimilitud espectral. Los segmentos se fusionan iterativamente comparando los pesos de las aristas dentro de los componentes con umbrales dinámicos; las aristas con pesos inferiores al umbral se fusionan, lo que produce segmentos de características espectrales localmente homogéneas. Este enfoque jerárquico produce segmentaciones perceptualmente significativas, sensibles a las variaciones locales de contraste y a las discontinuidades naturales de color/textura. Características clave: segmentación jerárquica basada en grafos; complejidad computacional eficiente O(n log n); sensible a las variaciones locales de contraste; produce segmentos perceptualmente significativos; admite datos multiespectrales/hiperespectrales; genera regiones de tamaño variable que conservan los límites naturales. Casos de uso: segmentación de imágenes multiespectrales; cartografía de hábitats naturales; extracción de elementos urbanos; delimitación del dosel forestal; preprocesamiento para la detección de cambios; segmentación de datos hiperespectrales. Interpretación de la salida: la salida es un ráster etiquetado; a cada píxel se le asigna un ID de segmento. El tamaño de los segmentos varía de forma inversa al contraste espectral local; los límites de alto contraste producen segmentos más pequeños y numerosos; las regiones uniformes se fusionan en segmentos más grandes. La sensibilidad al parámetro k (escala del umbral) permite producir segmentaciones más gruesas o más finas. Los límites de los segmentos corresponden a discontinuidades espectrales naturales.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Matriz de rásteres de entrada monobanda."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "k": {
                "label": "K",
                "description": "Parámetro de escala de segmentación (predeterminado 500.0)."
              },
              "sigma": {
                "label": "Sigma",
                "description": "Indicación de suavizado opcional (predeterminado 0.8)."
              },
              "min_area": {
                "label": "Área mínima",
                "description": "Área mínima para la limpieza posterior a la fusión (predeterminado 20)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de segmentos de salida."
              }
            }
          },
          "segment_multiresolution_hierarchical": {
            "name": "Segmentación multirresolución jerárquica",
            "description": "Genera segmentaciones jerárquicas multiescala (gruesa y fina) con correspondencias explícitas padre-hijo. Permite la extracción de características dependiente de la escala y flujos de trabajo de clasificación multinivel.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Matriz de rásteres de entrada monobanda."
              },
              "coarse_k": {
                "label": "K grueso",
                "description": "Parámetro de escala gruesa (predeterminado 800)."
              },
              "fine_k": {
                "label": "K fino",
                "description": "Parámetro de escala fina (predeterminado 250)."
              },
              "output_prefix": {
                "label": "Prefijo de salida",
                "description": "Prefijo de salida para los productos generados."
              }
            }
          },
          "segment_scale_parameter_optimizer": {
            "name": "Optimizador del parámetro de escala de segmentación",
            "description": "Busca entre parámetros de escala de segmentación candidatos para identificar la escala óptima que se ajusta a un número objetivo de objetos. La selección automatizada de la escala elimina el ajuste manual para obtener una calidad de segmentación coherente.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Matriz de rásteres de entrada monobanda."
              },
              "candidate_scales": {
                "label": "Escalas candidatas",
                "description": "Lista de valores de escala (k) candidatos."
              },
              "target_objects": {
                "label": "Objetos objetivo",
                "description": "Número de objetos deseado. Por defecto sqrt(total_cells)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del JSON del informe del optimizador."
              }
            }
          },
          "segment_slic_superpixels": {
            "name": "Segmentación en superpíxeles SLIC",
            "description": "SLIC (Simple Linear Iterative Clustering) realiza un agrupamiento iterativo de píxeles en el espacio de características 5D que combina las coordenadas espaciales y los valores de color/espectrales, haciendo converger los superpíxeles hacia la homogeneidad local. El algoritmo inicializa una malla regular de centros de clúster y asigna los píxeles a los centros más cercanos, actualizando iterativamente los centros y reduciendo las regiones de búsqueda. Esto produce superpíxeles compactos y de forma regular con una mínima violación de los límites en comparación con alternativas como watershed o mean-shift, ofreciendo una adherencia superior a los bordes naturales. Características clave: produce superpíxeles uniformes y compactos; computacionalmente eficiente, con complejidad temporal lineal; un parámetro de compacidad configurable por el usuario equilibra la regularidad espacial con la coherencia espectral; mínimo desbordamiento de los límites; admite imágenes multiespectrales. Casos de uso: preprocesamiento para la clasificación basada en objetos; análisis jerárquico de regiones; segmentación de imágenes SAR y ópticas; cartografía urbana; delimitación de la vegetación; identificación de límites de usos del suelo. Interpretación de la salida: la salida es un ráster etiquetado cuyos valores de píxel representan los ID de superpíxel asignados. Los límites de los superpíxeles se alinean con los bordes dominantes y las transiciones de color. Los superpíxeles más pequeños (mayor granularidad) captan detalles más finos pero aumentan la carga computacional; los superpíxeles más grandes (menor granularidad) fusionan regiones similares, mejorando la eficiencia. La exactitud de los límites depende del ajuste del parámetro de compacidad y de la separación de las bandas multiespectrales.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Matriz de rásteres de entrada monobanda."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "region_size": {
                "label": "Tamaño de región",
                "description": "Tamaño objetivo de superpíxel en píxeles (predeterminado 20)."
              },
              "compactness": {
                "label": "Compacidad",
                "description": "Control de compacidad (predeterminado 10.0)."
              },
              "min_area": {
                "label": "Área mínima",
                "description": "Área mínima para la fusión de limpieza (por defecto derivada de region_size)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de segmentos de salida."
              }
            }
          },
          "segment_watershed_markers": {
            "name": "Segmentación por marcadores de cuencas",
            "description": "Segmentación de tipo watershed guiada por marcadores que separa los objetos alrededor de regiones semilla de marcadores identificadas. Prioriza la conservación de los límites a la vez que controla el tamaño de los segmentos para flujos de trabajo OBIA jerárquicos.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Matriz de rásteres de entrada monobanda."
              },
              "gradient_weight": {
                "label": "Peso del gradiente",
                "description": "Control de énfasis de límites (predeterminado 1.0)."
              },
              "min_area": {
                "label": "Área mínima",
                "description": "Tamaño mínimo de segmento (predeterminado 12)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de segmentos de salida."
              }
            }
          },
          "segments_merge_small_regions": {
            "name": "Fusionar regiones pequeñas de segmentos",
            "description": "La fusión de segmentos implementa una consolidación jerárquica mediante el análisis de adyacencia espacial y criterios de fusión definidos por el usuario. Evalúa cada segmento de tamaño insuficiente frente a las regiones vecinas usando umbrales de tamaño, medidas de similitud espectral o criterios morfológicos personalizados; fusiona progresivamente los segmentos candidatos en vecinos absorbentes siguiendo colas de prioridad basadas en el coste de fusión, conservando la conectividad de los segmentos y evitando violaciones de topología. Entre sus características clave se incluyen la regularización en posprocesamiento de imágenes sobresegmentadas, criterios de fusión configurables por el usuario (tamaño mínimo, umbral de similitud espectral, propiedades morfológicas), la conservación de la integridad de los límites de los segmentos durante la fusión, la producción de mapas de segmentos compactos y simplificados y el refinamiento jerárquico sin una resegmentación completa. Los casos de uso incluyen la limpieza de resultados OBIA sobresegmentados reduciendo la fragmentación y el ruido, la simplificación de segmentos para mejorar la estabilidad de la clasificación, la eliminación de segmentos pequeños espurios de la segmentación inicial, la estandarización de las propiedades de los segmentos para una extracción de características posterior uniforme y el refinamiento de control de calidad de jerarquías de segmentación multiescala. La salida presenta un menor número de segmentos, reflejo de la consolidación; los segmentos fusionados heredan las estadísticas espectrales de los componentes absorbidos; los límites se vuelven más suaves y menos complejos; las regiones fusionadas mantienen su integridad espacial pero presentan una heterogeneidad espectral interna ligeramente mayor; la salida está optimizada para la clasificación posterior y la estabilidad de las características.",
            "params": {
              "segments": {
                "label": "Segmentos",
                "description": "Ráster de etiquetas de segmentos de entrada."
              },
              "min_size": {
                "label": "Tamaño mínimo",
                "description": "Tamaño mínimo de segmento en celdas (predeterminado 5)."
              },
              "method": {
                "label": "Método",
                "description": "Método de fusión: longest, largest, nearest (predeterminado longest)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "segments_split_low_cohesion": {
            "name": "Dividir segmentos de baja cohesión",
            "description": "Vuelve a segmentar los objetos existentes de baja cohesión usando parámetros de escala más finos para mejorar la homogeneidad espectral. Refinamiento adaptativo de zonas problemáticas sin afectar a los objetos bien formados.",
            "params": {
              "segments": {
                "label": "Segmentos",
                "description": "Ráster de segmentos existente."
              },
              "inputs": {
                "label": "Entradas",
                "description": "Matriz de rásteres de entrada usados para la resegmentación."
              },
              "split_scale": {
                "label": "Escala de división",
                "description": "Parámetro de escala de división más fina (predeterminado 120)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "segments_to_polygons": {
            "name": "Segmentos a polígonos",
            "description": "Convierte las etiquetas de segmentos ráster en polígonos vectoriales para la edición interactiva, el control de calidad y la integración SIG. Permite una transición fluida entre las representaciones OBIA ráster y vectoriales.",
            "params": {
              "segments": {
                "label": "Segmentos",
                "description": "Ráster de segmentos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de polígonos de salida."
              }
            }
          },
          "evaluate_training_sites": {
            "name": "Evaluar áreas de entrenamiento",
            "description": "Evalúa la separabilidad de clases en polígonos de entrenamiento multibanda y escribe un informe HTML con estadísticas de distribución por banda.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Matriz de rásteres de entrada monobanda (uno por banda espectral), como rutas o una cadena delimitada."
              },
              "training_data": {
                "label": "Datos de entrenamiento",
                "description": "Ruta a los datos de entrenamiento poligonales."
              },
              "class_field": {
                "label": "Campo de clase",
                "description": "Nombre del campo de clase en los atributos de training_data."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del archivo HTML de salida."
              }
            }
          },
          "fuzzy_knn_classification": {
            "name": "Clasificación KNN difusa",
            "description": "Realiza una clasificación difusa por k vecinos más cercanos y genera la confianza de pertenencia a cada clase.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Matriz de rásteres de entrada monobanda."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "training_data": {
                "label": "Datos de entrenamiento",
                "description": "Ruta de los datos de entrenamiento vectoriales de puntos/polígonos."
              },
              "class_field": {
                "label": "Campo de clase",
                "description": "Campo de clase en los atributos de training_data."
              },
              "scaling": {
                "label": "Escalado",
                "description": "Modo de escalado de rasgos: none (predeterminado), normalize, standardize."
              },
              "k": {
                "label": "K",
                "description": "Número de vecinos (predeterminado 5)."
              },
              "m": {
                "label": "M",
                "description": "Parámetro de exponente difuso (> 1; predeterminado 2.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster clasificado de salida."
              },
              "probability_output": {
                "label": "Salida de probabilidad",
                "description": "Ruta opcional del ráster de probabilidad de pertenencia."
              }
            }
          },
          "generalize_classified_raster": {
            "name": "Generalizar ráster clasificado",
            "description": "Generalize Classified Raster simplifica los mapas de clasificación eliminando pequeños parches aislados mediante un filtrado de moda iterativo, fusionando componentes fragmentados de uno o varios píxeles en las clases vecinas espacialmente dominantes. Algoritmo: aplica un filtro morfológico de moda que conserva la clase dominante dentro de ventanas móviles, elimina o consolida los píxeles aislados de su contexto espacial, refina iterativamente la clasificación mediante un análisis de componentes conectados y absorbe las clases menores en las clases dominantes vecinas. El tamaño de ventana configurable y el tamaño mínimo de parche controlan la intensidad de la generalización. Características clave: reduce la fragmentación de la clasificación, mejora la coherencia espacial, elimina los parches aislados inducidos por el ruido, mantiene los límites entre clases mediante un filtrado selectivo y un procesamiento de componentes conectados computacionalmente eficiente. Capacidades: intensidad de generalización variable, conservación de los parches contiguos grandes, aplicación a datos indexados o categóricos. Casos de uso: refinamiento posterior a la clasificación que elimina el efecto sal y pimienta, consolidación de resultados de clasificación fragmentados, preparación de productos de clasificación finales, generalización a una unidad mínima cartografiable específica. Aplicaciones: finalización de mapas de cobertura del suelo, eliminación de clasificaciones espurias de un solo píxel, mejora de la continuidad espacial de la clasificación. Interpretación de la salida: una menor fragmentación de las clases indica una eliminación eficaz del moteado; los límites conservados revelan parámetros de generalización adecuados; una generalización excesiva indica parámetros de ventana sobredimensionados; la mejora de la coherencia espacial sugiere que el ruido de la clasificación consistía principalmente en artefactos de un solo píxel.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster clasificado de entrada u objeto ráster tipado."
              },
              "min_size": {
                "label": "Tamaño mínimo",
                "description": "Tamaño mínimo de rasgo en celdas; los parches más pequeños se reasignan (predeterminado 5)."
              },
              "method": {
                "label": "Método",
                "description": "Método de generalización: 'longest' (predeterminado), 'largest' o 'nearest'."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "generalize_with_similarity": {
            "name": "Generalizar por similitud",
            "description": "Generaliza los parches pequeños de un ráster clasificado fusionándolos con el parche vecino espectralmente más similar.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster clasificado de entrada."
              },
              "similarity": {
                "label": "Similitud",
                "description": "Matriz de rásteres de similitud usados para calcular la similitud con el centro del rasgo."
              },
              "min_size": {
                "label": "Tamaño mínimo",
                "description": "Tamaño mínimo de rasgo en píxeles; los rasgos más pequeños se fusionan (predeterminado 5)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "k_means_clustering": {
            "name": "Agrupamiento K-medias",
            "description": "El agrupamiento K-means realiza una clasificación espectral no supervisada dividiendo iterativamente los píxeles en K clústeres espectrales, minimizando la varianza intraclúster y descubriendo agrupaciones espectrales naturales en imágenes multiespectrales sin muestras de entrenamiento ni definiciones de clase a priori. El algoritmo inicializa K centros de clúster aleatorios, asigna iterativamente los píxeles a los centros más cercanos y recalcula los centros como medias de los clústeres hasta la convergencia, y genera las asignaciones y los centros de clúster finales. K-means es computacionalmente eficiente, escalable a grandes pilas multiespectrales y descubre patrones espectrales basados en los datos, útiles para el análisis exploratorio y la identificación de clases naturales. Entre sus características clave se incluyen un número de clústeres K especificado por el usuario, que permite equilibrar con flexibilidad el detalle espectral y la interpretabilidad de la salida, criterios de convergencia con límites de iteraciones y umbrales de desplazamiento de los centros configurables, control opcional de la semilla aleatoria que garantiza un agrupamiento reproducible para pruebas y validación, y una paralelización eficiente para manejar imágenes grandes. Las aplicaciones abarcan la clasificación no supervisada de la cobertura del suelo que descubre clases espectrales naturales, la detección de anomalías que identifica píxeles espectralmente inusuales, la segmentación de imágenes para una clasificación supervisada posterior y el análisis espectral exploratorio que revela los patrones espectrales dominantes. La salida de K-means identifica agrupaciones espectrales naturales. Genera un ráster de pertenencia a clústeres con enteros de 0 a K-1, un archivo de centros de clúster con el espectro medio de cada clúster y, opcionalmente, la varianza intraclúster que cuantifica la compacidad; la superposición de las clases de clúster sobre composiciones en color verdadero revela los patrones espaciales y la continuidad de los clústeres.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Lista de rásteres de entrada como matriz de rutas o cadena delimitada por comas/punto y coma."
              },
              "classes": {
                "label": "Clases",
                "description": "Número de clases objetivo (k)."
              },
              "max_iterations": {
                "label": "Iteraciones máximas",
                "description": "Número máximo de iteraciones (predeterminado 10)."
              },
              "class_change": {
                "label": "Cambio de clase",
                "description": "Detenerse cuando el porcentaje de celdas válidas cambiadas cae por debajo de este umbral (predeterminado 2.0)."
              },
              "initialize": {
                "label": "Inicializar",
                "description": "Estrategia de inicialización de centroides: 'diagonal' (predeterminado) o 'random'."
              },
              "min_class_size": {
                "label": "Tamaño mínimo de clase",
                "description": "Tamaño mínimo de clase usado al actualizar los centroides (predeterminado 10)."
              },
              "out_html": {
                "label": "HTML de salida",
                "description": "Ruta opcional de salida del informe HTML."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional de salida del ráster de clases. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "knn_classification": {
            "name": "Clasificación KNN",
            "description": "La clasificación por k vecinos más cercanos asigna los píxeles a clases según el voto mayoritario entre las K muestras de entrenamiento más cercanas en el espacio espectral, lo que permite una clasificación no lineal flexible sin un entrenamiento explícito del modelo. KNN calcula las distancias (euclidiana, de ángulo espectral o de Mahalanobis) desde cada píxel de la imagen a todas las muestras de entrenamiento, identifica las K muestras de entrenamiento más cercanas, aplica un voto mayoritario ponderado o no ponderado para determinar la clase y devuelve la etiqueta de clase y, opcionalmente, una puntuación de confianza. KNN destaca con datos de entrenamiento limitados, límites entre clases muy no lineales y distribuciones espectrales de clase heterogéneas en las que los modelos paramétricos tienen dificultades. Entre sus características clave se incluyen métricas de distancia seleccionables (euclidiana, de ángulo espectral, de Mahalanobis) que se adaptan a distintas características espectrales y estructuras de correlación, valores de K especificados por el usuario que permiten equilibrar exactitud y complejidad, opciones de voto ponderado que dan más peso a las muestras cercanas y umbrales de confianza opcionales que permiten rechazar clasificaciones ambiguas. Las aplicaciones incluyen la clasificación de teledetección de alta exactitud con muestras de entrenamiento recogidas en campo, la clasificación con muestras pequeñas cuando la verdad de campo es limitada, la clasificación de terrenos difíciles con firmas espectrales muy variables y la clasificación consciente de la confianza que rechaza las decisiones dudosas. La clasificación KNN permite obtener resultados de alta exactitud con datos de entrenamiento flexibles. La salida comprende un ráster de etiquetas de clase con ID de clase enteros que coinciden con las etiquetas de las muestras de entrenamiento, un ráster de confianza opcional que registra los porcentajes de voto o puntuaciones de confianza ponderadas por la distancia, y una exactitud de clasificación que puede superar a la de otros métodos con una selección óptima de K y suficientes muestras de entrenamiento.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Matriz de rásteres de entrada monobanda."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "training_data": {
                "label": "Datos de entrenamiento",
                "description": "Ruta de los datos de entrenamiento vectoriales de puntos/polígonos."
              },
              "class_field": {
                "label": "Campo de clase",
                "description": "Campo de clase en los atributos de training_data."
              },
              "scaling": {
                "label": "Escalado",
                "description": "Modo de escalado de rasgos: none (predeterminado), normalize, standardize."
              },
              "k": {
                "label": "K",
                "description": "Número de vecinos (predeterminado 5)."
              },
              "clip": {
                "label": "Recortar",
                "description": "Si es verdadero, elimina las muestras de entrenamiento mal clasificadas mediante una pasada previa dejando uno fuera."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "knn_regression": {
            "name": "Regresión KNN",
            "description": "Realiza una regresión supervisada por k vecinos más cercanos sobre rásteres de entrada multibanda.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Matriz de rásteres de entrada monobanda."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "training_data": {
                "label": "Datos de entrenamiento",
                "description": "Ruta de los datos de entrenamiento vectoriales de puntos."
              },
              "field": {
                "label": "Campo",
                "description": "Campo objetivo numérico en los atributos de training_data."
              },
              "scaling": {
                "label": "Escalado",
                "description": "Modo de escalado de rasgos: none (predeterminado), normalize, standardize."
              },
              "k": {
                "label": "K",
                "description": "Número de vecinos (predeterminado 5)."
              },
              "distance_weighted": {
                "label": "Ponderado por distancia",
                "description": "Si es verdadero, usa promedio ponderado por distancia inversa."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "logistic_regression": {
            "name": "Regresión logística",
            "description": "Realiza una clasificación supervisada por regresión logística sobre rásteres de entrada multibanda.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Matriz de rásteres de entrada monobanda."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "training_data": {
                "label": "Datos de entrenamiento",
                "description": "Ruta de los datos de entrenamiento vectoriales de puntos/polígonos."
              },
              "class_field": {
                "label": "Campo de clase",
                "description": "Campo de clase en los atributos de training_data."
              },
              "scaling": {
                "label": "Escalado",
                "description": "Modo de escalado de rasgos: none (predeterminado), normalize, standardize."
              },
              "alpha": {
                "label": "Alfa",
                "description": "Peso de regularización L2 (predeterminado 0.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "min_dist_classification": {
            "name": "Clasificación por distancia mínima",
            "description": "Realiza una clasificación supervisada de distancia mínima sobre rásteres multiespectrales usando datos de entrenamiento poligonales.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Matriz de rásteres de entrada monobanda (uno por banda espectral), como rutas o una cadena delimitada."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "training_data": {
                "label": "Datos de entrenamiento",
                "description": "Ruta a un archivo vectorial de polígonos que contiene las áreas de entrenamiento."
              },
              "class_field": {
                "label": "Campo de clase",
                "description": "Nombre del campo de atributo de los datos de entrenamiento que contiene el identificador de clase."
              },
              "dist_threshold": {
                "label": "Umbral de distancia",
                "description": "Umbral opcional de puntuación z; los píxeles más alejados que esto de la media de clase más cercana quedan sin clasificar. Predeterminado: sin umbral (clasificar todos)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida. Si se omite, el resultado se mantiene en memoria."
              }
            }
          },
          "modified_k_means_clustering": {
            "name": "Agrupamiento K-medias modificado",
            "description": "El agrupamiento K-means modificado mejora el K-means estándar con preprocesamiento espectral, selección adaptativa automatizada de K y criterios de convergencia mejorados para una clasificación multiespectral no supervisada más robusta y exacta. El algoritmo aplica un preprocesamiento opcional que incluye la estandarización espectral para eliminar los efectos de escala, una transformación de componentes principales que resalta las direcciones de varianza dominantes y un filtrado del ruido que elimina las variaciones espectrales espurias. La selección adaptativa de K utiliza el método del codo o el análisis de silueta para descubrir automáticamente el número óptimo de clústeres en lugar de requerir su especificación manual. Entre sus características clave se incluyen el preprocesamiento espectral que reduce la sensibilidad a la escala y resalta las direcciones de variación espectral dominantes, la selección automatizada de K que descubre objetivamente el número óptimo de clústeres, criterios de convergencia mejorados que incluyen umbrales de desplazamiento relativo de los centros y métricas de similitud de ángulo espectral, y un posprocesamiento opcional que fusiona clústeres similares o divide clústeres difusos. Las aplicaciones incluyen una clasificación exploratoria mejorada de la cobertura del suelo que maneja automáticamente las escalas espectrales, una detección robusta de anomalías que separa la señal del ruido mediante el preprocesamiento, una segmentación adaptativa de imágenes que descubre automáticamente los niveles de detalle adecuados y la integración multisensor que normaliza las distintas escalas espectrales de los sensores. La salida del K-means modificado revela clases espectrales naturales robustas. Genera un ráster optimizado de pertenencia a clústeres con un número de clases determinado automáticamente, centros de clúster con las transformaciones de preprocesamiento documentadas y estadísticas de diagnóstico que cuantifican la calidad, la separación y la convergencia de los clústeres; las recomendaciones de la selección adaptativa de K orientan el equilibrio entre interpretabilidad y detalle.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Lista de rásteres de entrada como matriz de rutas o cadena delimitada por comas/punto y coma."
              },
              "start_clusters": {
                "label": "Clústeres iniciales",
                "description": "Número inicial de clústeres antes de la fusión (predeterminado 1000)."
              },
              "merge_dist": {
                "label": "Distancia de fusión",
                "description": "Umbral de distancia de fusión de clústeres (euclidiana)."
              },
              "max_iterations": {
                "label": "Iteraciones máximas",
                "description": "Número máximo de iteraciones (predeterminado 10)."
              },
              "class_change": {
                "label": "Cambio de clase",
                "description": "Detenerse cuando el porcentaje de celdas válidas cambiadas cae por debajo de este umbral (predeterminado 2.0)."
              },
              "out_html": {
                "label": "HTML de salida",
                "description": "Ruta opcional de salida del informe HTML."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional de salida del ráster de clases. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "nnd_classification": {
            "name": "Clasificación NND",
            "description": "Realiza una clasificación por la distancia normalizada más cercana con rechazo opcional de valores atípicos.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Matriz de rásteres de entrada monobanda."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "training_data": {
                "label": "Datos de entrenamiento",
                "description": "Ruta de los datos de entrenamiento vectoriales de puntos/polígonos."
              },
              "class_field": {
                "label": "Campo de clase",
                "description": "Campo de clase en los atributos de training_data."
              },
              "scaling": {
                "label": "Escalado",
                "description": "Modo de escalado de rasgos: none (predeterminado), normalize, standardize."
              },
              "z_threshold": {
                "label": "Umbral Z",
                "description": "Máxima puntuación z de distancia normalizada aceptada antes de marcar como valor atípico (predeterminado 1.96)."
              },
              "outlier_is_zero": {
                "label": "Valor atípico es cero",
                "description": "Si es verdadero, a los valores atípicos se les asigna el valor de clase 0; en caso contrario, sin datos."
              },
              "k": {
                "label": "K",
                "description": "Tamaño de vecindad para la estimación de distancia de clase (predeterminado 25)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "otsu_thresholding": {
            "name": "Umbralización de Otsu",
            "description": "La umbralización de Otsu es un método automático de segmentación de imágenes que determina el valor de umbral global óptimo maximizando la varianza entre clases en los histogramas de intensidad de los píxeles. Algoritmo: examina el histograma de una imagen en escala de grises o de una sola banda, prueba iterativamente todos los valores de umbral posibles, calcula la varianza entre clases para cada umbral y selecciona el valor que maximiza la separación de la varianza entre las clases de primer plano y de fondo. Es no paramétrico y no requiere especificar manualmente el umbral. Características clave: determinación totalmente automática del umbral, robustez frente a variaciones de iluminación, un enfoque basado en el histograma que permite un cálculo rápido, sin parámetros externos, y proporciona un único umbral global. Capacidades: segmentación binaria, optimización de histogramas unimodales y bimodales, manejo de imágenes de rango dinámico estrecho o de alto contraste. Casos de uso: segmentación automática de imágenes sin intervención del usuario, binarización de documentos, extracción de masas de agua, detección de nubes en imágenes de satélite, cartografía de hielo/nieve. Aplicaciones: preprocesamiento para la detección de cambios, clasificación sencilla de la cobertura del suelo, generación de máscaras de agua, segmentación preliminar antes de una clasificación avanzada. Interpretación de la salida: los píxeles por debajo del umbral se clasifican en una clase y los que están por encima en otra; la bimodalidad del histograma indica la calidad de la separación; los histogramas mal separados indican que la imagen no es adecuada para la clasificación binaria; medidas estadísticas como la varianza entre clases y la uniformidad indican la calidad de la segmentación.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "parallelepiped_classification": {
            "name": "Clasificación por paralelepípedos",
            "description": "Realiza una clasificación supervisada por paralelepípedos sobre rásteres multiespectrales usando datos de entrenamiento poligonales.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Matriz de rásteres de entrada monobanda (uno por banda espectral), como rutas o una cadena delimitada."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "training_data": {
                "label": "Datos de entrenamiento",
                "description": "Ruta a un archivo vectorial de polígonos que contiene las áreas de entrenamiento."
              },
              "class_field": {
                "label": "Campo de clase",
                "description": "Nombre del campo de atributo de los datos de entrenamiento que contiene el identificador de clase."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida. Si se omite, el resultado se mantiene en memoria."
              }
            }
          },
          "random_forest_classification": {
            "name": "Clasificación por bosque aleatorio",
            "description": "La clasificación Random Forest asigna etiquetas mediante un conjunto de árboles de decisión entrenados con muestras bootstrap y subconjuntos aleatorios de características. Cada árbol crece de forma independiente sin poda, captando relaciones no lineales complejas e interacciones entre las características. La clasificación agrega los votos de, normalmente, 100-1000 árboles; la clase final es la del voto mayoritario. El entrenamiento bootstrap y la selección aleatoria de características reducen el sobreajuste a la vez que captan patrones de alta dimensión. La importancia de las características puede calcularse a partir de los cambios en el error fuera de bolsa (out-of-bag), identificando las bandas espectrales o las características derivadas más relevantes para la clasificación. Entre sus características clave se incluyen la clasificación de la importancia de las variables que identifica las características clave para la clasificación, la confianza de clasificación por píxel a partir del consenso de votos de los árboles del conjunto, el manejo automático de datos hiperespectrales de alta dimensión, la robustez frente a valores espectrales atípicos y al ruido, y un entrenamiento y una predicción paralelizables. La herramienta procesa de forma eficiente problemas multiclase con conjuntos de entrenamiento desequilibrados. Las aplicaciones incluyen la clasificación de la cobertura del suelo a partir de datos multiespectrales e hiperespectrales, la detección de cambios que identifica transiciones espectrales entre mapas, la clasificación de tipos de cultivo a partir de imágenes de satélite multitemporales, la clasificación de materiales urbanos que distingue tipos de edificios y superficies, y la detección de anomalías que identifica valores espectrales atípicos. Los bosques aleatorios logran sistemáticamente una alta exactitud en aplicaciones de teledetección con una cantidad relativamente modesta de datos de entrenamiento. Interpretación de la salida: los recuentos de votos proporcionan la confianza de la clasificación; los votos unánimes o con una mayoría amplia (>80%) indican clasificaciones fiables, mientras que los márgenes estrechos sugieren la ambigüedad de píxeles mixtos. Las clasificaciones de importancia de las características identifican las bandas espectrales o los índices derivados más diagnósticos para la clasificación. El error fuera de bolsa estima el rendimiento de generalización sin validación con datos reservados. Las interacciones entre características son implícitas; una alta exactitud obtenida con combinaciones de bandas concretas sugiere relaciones espectrales no lineales.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Matriz de rásteres de entrada monobanda."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "training_data": {
                "label": "Datos de entrenamiento",
                "description": "Ruta de los datos de entrenamiento vectoriales de puntos/polígonos."
              },
              "class_field": {
                "label": "Campo de clase",
                "description": "Campo de clase en los atributos de training_data."
              },
              "scaling": {
                "label": "Escalado",
                "description": "Modo de escalado de rasgos: none (predeterminado), normalize, standardize."
              },
              "n_trees": {
                "label": "Número de árboles",
                "description": "Número de árboles del bosque (predeterminado 200)."
              },
              "min_samples_leaf": {
                "label": "Muestras mínimas por hoja",
                "description": "Número mínimo de muestras requeridas en un nodo hoja (predeterminado 1)."
              },
              "min_samples_split": {
                "label": "Muestras mínimas por división",
                "description": "Número mínimo de muestras requeridas para dividir un nodo interno (predeterminado 2)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "random_forest_regression": {
            "name": "Regresión por bosque aleatorio",
            "description": "Realiza una regresión supervisada Random Forest sobre rásteres de entrada multibanda.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Matriz de rásteres de entrada monobanda."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "training_data": {
                "label": "Datos de entrenamiento",
                "description": "Ruta de los datos de entrenamiento vectoriales de puntos."
              },
              "field": {
                "label": "Campo",
                "description": "Campo objetivo numérico en los atributos de training_data."
              },
              "scaling": {
                "label": "Escalado",
                "description": "Modo de escalado de rasgos: none (predeterminado), normalize, standardize."
              },
              "n_trees": {
                "label": "Número de árboles",
                "description": "Número de árboles del bosque (predeterminado 200)."
              },
              "min_samples_leaf": {
                "label": "Muestras mínimas por hoja",
                "description": "Número mínimo de muestras requeridas en un nodo hoja (predeterminado 1)."
              },
              "min_samples_split": {
                "label": "Muestras mínimas por división",
                "description": "Número mínimo de muestras requeridas para dividir un nodo interno (predeterminado 2)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "svm_classification": {
            "name": "Clasificación SVM",
            "description": "La clasificación por máquinas de vectores de soporte (SVM) aplica algoritmos de aprendizaje automático SVM a datos de teledetección multiespectrales, separando las clases de entrenamiento mediante la colocación óptima de un hiperplano en el espacio de características espectrales de alta dimensión. Algoritmo: transforma los vectores de características espectrales a un espacio de alta dimensión mediante funciones kernel (lineal, RBF, polinómica), identifica el hiperplano de margen máximo que separa las clases de entrenamiento y clasifica los nuevos píxeles según su posición respecto al hiperplano; los parámetros de tolerancia y la selección del kernel controlan la generalización. Maneja eficazmente la separación no lineal de clases. Características clave: robusta frente a datos espectrales de alta dimensión, excelente generalización con muestras de entrenamiento limitadas, la flexibilidad del kernel se adapta a distribuciones espectrales diversas, y proporciona estimaciones de probabilidad/confianza. Capacidades: clasificación multiclase, tolerancia de margen blando, equilibrado automático de los pesos de clase. Casos de uso: clasificación detallada del terreno con datos de entrenamiento escasos, integración de características espectrales y espaciales, detección de cambios, agricultura de precisión, cartografía urbana. Aplicaciones: clasificación de imágenes hiperespectrales, cartografía de ecosistemas complejos, delimitación de tipos de cultivo, clasificación de infraestructuras. Interpretación de la salida: la pertenencia a una clase indica la categoría predicha, y la coherencia espacial revela la calidad de la clasificación; las estimaciones de probabilidad cuantifican la confianza a nivel de píxel; los patrones de clasificación errónea indican deficiencias en los datos de entrenamiento o problemas de solapamiento espectral.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Matriz de rásteres de entrada monobanda."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "training_data": {
                "label": "Datos de entrenamiento",
                "description": "Ruta de los datos de entrenamiento vectoriales de puntos/polígonos."
              },
              "class_field": {
                "label": "Campo de clase",
                "description": "Campo de clase en los atributos de training_data."
              },
              "scaling": {
                "label": "Escalado",
                "description": "Modo de escalado de rasgos: none (predeterminado), normalize, standardize."
              },
              "kernel": {
                "label": "Kernel",
                "description": "Tipo de kernel: linear (predeterminado) o rbf."
              },
              "c": {
                "label": "C",
                "description": "Parámetro de regularización SVM (predeterminado 1.0)."
              },
              "gamma": {
                "label": "Gamma",
                "description": "Gamma del kernel RBF; por defecto 1 / número_de_rasgos."
              },
              "epoch": {
                "label": "Época",
                "description": "Número de épocas de entrenamiento (predeterminado 2)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "svm_regression": {
            "name": "Regresión SVM",
            "description": "Realiza una regresión supervisada por máquinas de vectores de soporte sobre rásteres de entrada multibanda.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Matriz de rásteres de entrada monobanda."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "training_data": {
                "label": "Datos de entrenamiento",
                "description": "Ruta de los datos de entrenamiento vectoriales de puntos."
              },
              "field": {
                "label": "Campo",
                "description": "Campo objetivo numérico en los atributos de training_data."
              },
              "scaling": {
                "label": "Escalado",
                "description": "Modo de escalado de rasgos: none (predeterminado), normalize, standardize."
              },
              "kernel": {
                "label": "Kernel",
                "description": "Tipo de kernel: linear (predeterminado) o rbf."
              },
              "c": {
                "label": "C",
                "description": "Parámetro de regularización SVM (predeterminado 1.0)."
              },
              "gamma": {
                "label": "Gamma",
                "description": "Gamma del kernel RBF; por defecto 1 / número_de_rasgos."
              },
              "eps": {
                "label": "Eps",
                "description": "Ancho de la pérdida insensible a épsilon (predeterminado 0.1)."
              },
              "tol": {
                "label": "Tol",
                "description": "Tolerancia del optimizador (predeterminado 1e-3)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "change_vector_analysis": {
            "name": "Análisis de vectores de cambio",
            "description": "Realiza un análisis de vectores de cambio sobre conjuntos de datos multiespectrales de dos fechas y devuelve rásteres de magnitud y dirección.",
            "params": {
              "date1": {
                "label": "Fecha 1",
                "description": "Lista de rásteres de la fecha anterior como matriz de rutas o cadena delimitada por comas/punto y coma."
              },
              "date2": {
                "label": "Fecha 2",
                "description": "Lista de rásteres de la fecha posterior como matriz de rutas o cadena delimitada por comas/punto y coma."
              },
              "magnitude_output": {
                "label": "Salida de magnitud",
                "description": "Ruta de salida opcional del ráster de magnitud del vector."
              },
              "direction_output": {
                "label": "Salida de dirección",
                "description": "Ruta de salida opcional del ráster de códigos de dirección."
              }
            }
          },
          "image_difference_change_detection": {
            "name": "Detección de cambios por diferencia de imágenes",
            "description": "La detección de cambios por diferencia de imágenes identifica cambios en la cobertura del suelo calculando diferencias multiespectrales píxel a píxel entre adquisiciones de satélite multitemporales corregistradas, resaltando las zonas en las que las firmas espectrales cambiaron lo suficiente como para superar la variación estadística de fondo. El algoritmo corregistra las imágenes en mallas de píxeles comunes, calcula las diferencias en las bandas o índices de vegetación seleccionados (p. ej., diferencia de NDVI), aplica una umbralización estadística basada en la diferencia absoluta media e intervalos de confianza para distinguir el cambio del ruido, y genera máscaras binarias de cambio o rásteres continuos de magnitud de la diferencia. La diferencia de imágenes es computacionalmente sencilla, interpretable y eficaz para detectar cambios importantes en la vegetación, el desarrollo urbano o las masas de agua. Entre sus características clave se incluyen una selección flexible de bandas que permite una detección de cambios dirigida a dominios espectrales específicos, una umbralización estadística con niveles de confianza automáticos o manuales, un preprocesamiento opcional (normalización, cálculo de índices) que mejora la relación señal-ruido del cambio y un procesamiento rápido que permite la detección de cambios a gran escala. Las aplicaciones incluyen la cartografía de la deforestación y el seguimiento de la pérdida forestal, el seguimiento de la expansión urbana a partir de series temporales de satélite multiespectrales, la cartografía de inundaciones antes/después del evento a partir de datos SAR u ópticos y la detección de cambios agrícolas que sigue las transiciones de los cultivos. La salida de la diferencia de imágenes resalta las zonas de cambio. Comprende un ráster de máscara de cambio (binario cambio/sin cambio) con umbrales configurables, un ráster continuo de magnitud de la diferencia que cuantifica la intensidad del cambio y un ráster opcional de clases de cambio que distingue el tipo de cambio (aumento, disminución); la agregación temporal permite seguir los cambios a lo largo de periodos de varios años.",
            "params": {
              "t1_inputs": {
                "label": "Entradas T1",
                "description": "Matriz de rutas de rásteres de la fecha 1."
              },
              "t2_inputs": {
                "label": "Entradas T2",
                "description": "Matriz de rutas de rásteres de la fecha 2; debe coincidir en longitud y orden con t1_inputs."
              },
              "mode": {
                "label": "Modo",
                "description": "Modo de diferencia: magnitude (predeterminado) o signed."
              },
              "threshold_sigma": {
                "label": "Umbral sigma",
                "description": "Umbral sigma opcional para la generación de la máscara binaria de cambio."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta los rásteres de la pila para que coincidan con t1_inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida para la imagen de diferencia."
              },
              "output_absolute": {
                "label": "Salida absoluta",
                "description": "Ruta opcional del ráster de salida para la diferencia con signo absoluta (|mean(t2-t1)|)."
              },
              "output_signed": {
                "label": "Salida con signo",
                "description": "Ruta opcional del ráster de salida para la diferencia con signo mean(t2-t1)."
              },
              "output_mask": {
                "label": "Máscara de salida",
                "description": "Ruta opcional del ráster de salida para la máscara binaria de cambio umbralizada."
              }
            }
          },
          "pca_based_change_detection": {
            "name": "Detección de cambios basada en PCA",
            "description": "La detección de cambios por análisis de componentes principales identifica cambios en la cobertura del suelo calculando los componentes principales de datos espectrales multitemporales apilados, en los que los primeros componentes captan los patrones comunes a lo largo del tiempo y los componentes posteriores aíslan los cambios temporales. El algoritmo apila datos multiespectrales multitemporales (corregistrados en una malla común), calcula el PCA transformándolos en componentes espectrotemporales ortogonales no correlacionados, interpreta los últimos componentes como sensibles al cambio y aplica una umbralización estadística a las cargas/puntuaciones de los componentes para detectar los cambios. La detección basada en PCA destaca cuando las señales de cambio son espectralmente sutiles, porque el PCA maximiza la varianza y separa los patrones espectrales temporalmente coherentes (primeros componentes) de la variación temporal (componentes posteriores). Entre sus características clave se incluyen la fusión de datos de varias fechas que maneja un número variable de imágenes y los requisitos de corregistro, la maximización automática de la varianza que resalta los patrones espectrotemporales importantes, estadísticas multivariantes que mejoran la discriminación del cambio frente a la diferencia univariante, y un filtrado espacial opcional que reduce el ruido de los píxeles. Las aplicaciones incluyen la detección del estrés sutil de la vegetación antes de que sea reconocible visualmente, la detección de cambios urbanos multiespectrales que sigue el desarrollo a lo largo de décadas, la evaluación del impacto de desastres naturales mediante la cartografía rápida de daños y el seguimiento ambiental que detecta transiciones de estado de los ecosistemas. La salida de la detección basada en PCA distingue los patrones temporales. Comprende imágenes de componentes principales con cargas espectrotemporales interpretables, un ráster de probabilidad de cambio derivado de las puntuaciones de los componentes posteriores y una clasificación opcional del cambio que distingue los tipos de cambio; los patrones espaciales de los componentes permiten un reconocimiento visual de patrones que complementa la detección estadística.",
            "params": {
              "t1_inputs": {
                "label": "Entradas T1",
                "description": "Matriz de rutas de rásteres de la fecha 1."
              },
              "t2_inputs": {
                "label": "Entradas T2",
                "description": "Matriz de rutas de rásteres de la fecha 2; debe coincidir en longitud y orden con t1_inputs."
              },
              "component": {
                "label": "Componente",
                "description": "Índice (base 1) del componente principal a emitir (predeterminado 1)."
              },
              "standardized": {
                "label": "Estandarizado",
                "description": "Si es verdadero, usa PCA con matriz de correlación sobre los vectores de cambio (predeterminado false)."
              },
              "threshold_sigma": {
                "label": "Umbral sigma",
                "description": "Umbral sigma opcional sobre la puntuación absoluta del PC para la salida de máscara binaria."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta los rásteres de la pila para que coincidan con t1_inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida para la puntuación absoluta del PC seleccionado."
              },
              "output_mask": {
                "label": "Máscara de salida",
                "description": "Ruta opcional del ráster de salida para la máscara binaria umbralizada (0/1)."
              },
              "output_report": {
                "label": "Informe de salida",
                "description": "Ruta opcional del informe JSON de salida con autovalores, varianza explicada y cargas de los componentes."
              }
            }
          },
          "post_classification_change": {
            "name": "Cambio posclasificación",
            "description": "La detección de cambios posterior a la clasificación cuantifica las transiciones de uso y cobertura del suelo (LULC) comparando directamente mapas clasificados de forma independiente de distintos periodos. Las comparaciones de clases píxel a píxel identifican las transiciones mostrando las clases de «origen» y de «destino». Las matrices de tabulación cruzada (matrices de confusión) cuantifican las frecuencias de transición, revelando las trayectorias de cambio dominantes. El método requiere esquemas de clasificación coherentes entre fechas; la exactitud depende de la calidad de la clasificación en cada paso temporal. Características clave: cartografía directa de las transiciones de clase a clase; independencia de las clasificaciones individuales; permite combinar sensores heterogéneos; cuantifica las frecuencias de transición; identifica los puntos calientes de cambio. Casos de uso: seguimiento de la deforestación; cartografía del crecimiento urbano; seguimiento del uso agrícola del suelo; detección de la pérdida de humedales; evaluación de la fragmentación de hábitats. Interpretación de la salida: las matrices de transición muestran en la diagonal los valores sin cambio y fuera de la diagonal las frecuencias de transición. Los mapas de cambio resaltan los píxeles alterados; la salida codificada por transición codifica tanto la clase de origen como la de destino, lo que permite su interpretación. Una alta exactitud requiere clasificaciones de calidad; los errores de clasificación en cualquiera de las fechas se propagan como errores de detección de cambios. La agregación de transiciones revela los patrones dominantes (p. ej., bosque→agricultura, pastizal→urbano). Las transiciones a nivel de subpíxel no pueden detectarse con el método posterior a la clasificación; pueden pasarse por alto cambios a escala fina.",
            "params": {
              "t1_classified": {
                "label": "Clasificado T1",
                "description": "Ruta del ráster clasificado de la fecha 1."
              },
              "t2_classified": {
                "label": "Clasificado T2",
                "description": "Ruta del ráster clasificado de la fecha 2."
              },
              "transition_scale": {
                "label": "Escala de transición",
                "description": "Factor de escala de codificación de transiciones (predeterminado 1000): código = clase1 * escala + clase2."
              },
              "t1_class_remap": {
                "label": "Reasignación de clases T1",
                "description": "Tabla de reasignación opcional para las clases de la fecha 1 como objeto {\"old\": new, ...}."
              },
              "t2_class_remap": {
                "label": "Reasignación de clases T2",
                "description": "Tabla de reasignación opcional para las clases de la fecha 2 como objeto {\"old\": new, ...}."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta t2_classified al CRS de t1_classified cuando sea necesario."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida codificado por transiciones."
              }
            }
          },
          "write_function_memory_insertion": {
            "name": "Inserción en memoria de función de escritura",
            "description": "Crea una composición RGB empaquetada de visualización de cambios a partir de dos o tres fechas de una sola banda.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Ráster monobanda de la primera fecha."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Ráster monobanda de la segunda fecha."
              },
              "input3": {
                "label": "Entrada 3",
                "description": "Ráster monobanda opcional de la tercera fecha; si se omite, se usa input2 para el canal azul."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "brdf_normalization": {
            "name": "Normalización BRDF",
            "description": "Normalización BRDF de una sola escena mediante la corrección C o el método de Minnaert, con la geometría de pendiente/orientación del DEM.",
            "params": {
              "input_raster": {
                "label": "Ráster de entrada",
                "description": "Ráster de reflectancia de entrada a normalizar (monobanda o pila multibanda)."
              },
              "input_dem": {
                "label": "DEM de entrada",
                "description": "Ráster DEM corregistrado con la entrada (misma malla o se remuestreará para coincidir)."
              },
              "solar_zenith_deg": {
                "label": "Cénit solar (grados)",
                "description": "Ángulo cenital solar en grados en el momento de la adquisición."
              },
              "solar_azimuth_deg": {
                "label": "Acimut solar (grados)",
                "description": "Ángulo acimutal solar en grados (en sentido horario desde el norte) en el momento de la adquisición."
              },
              "method": {
                "label": "Método",
                "description": "Método de corrección: c_correction (predeterminado) o minnaert."
              },
              "minnaert_k": {
                "label": "K de Minnaert",
                "description": "Coeficiente k de Minnaert en [0,1] (predeterminado 0.5). Solo se usa cuando method=minnaert."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Exageración vertical para el cálculo de pendiente/orientación del DEM (predeterminado 1.0)."
              },
              "output_prefix": {
                "label": "Prefijo de salida",
                "description": "Prefijo para los archivos de salida (predeterminado brdf_normalized)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida del ráster normalizado (tiene prioridad sobre output_prefix en el modo de salida única)."
              }
            }
          },
          "correct_vignetting": {
            "name": "Corregir viñeteado",
            "description": "La corrección del viñeteado de la lente elimina los artefactos radiométricos causados por las propiedades ópticas de la lente fuera del eje, por las que los bordes de la imagen reciben menos luz que el centro, lo que crea gradientes de brillo artificiales independientes de la variación de la reflectancia de la superficie. La corrección del viñeteado aplica factores multiplicativos espacialmente variables calculados a partir de modelos de perfil de viñeteado (formulaciones gaussianas o de la ley del coseno a la cuarta) calibrados según las características del sensor, restaurando una respuesta radiométrica uniforme en todo el campo de visión de la imagen. Este paso de preprocesamiento es fundamental en la teledetección multiespectral e hiperespectral, donde el viñeteado corrompería el análisis espectral e introduciría errores sistemáticos en los flujos de trabajo de clasificación y detección de cambios. Entre sus características clave se incluyen la estimación automática del perfil de viñeteado a partir de estadísticas de la imagen o de parámetros de calibración especificados por el usuario, factores de corrección espacialmente variables aplicados por píxel sin artefactos de interpolación, el enmascaramiento opcional de los píxeles periféricos sobrecorregidos para evitar la amplificación de los bordes ruidosos y una corrección específica por banda que maneja el viñeteado variable entre bandas espectrales. Las aplicaciones incluyen el preprocesamiento para algoritmos de clasificación espectral sensibles a la coherencia radiométrica, la preparación de mosaicos en los que los límites del viñeteado provocan discontinuidades visibles, la comparación radiométrica precisa en todo el fotograma y el análisis hiperespectral que requiere una respuesta de iluminación uniforme. Las imágenes corregidas del viñeteado muestran un brillo uniforme en todo el campo de visión. La salida presenta el oscurecimiento de los bordes eliminado, con una respuesta radiométrica uniforme desde el centro hasta los bordes de la imagen; los píxeles periféricos pueden mostrar un ruido mayor si se han corregido intensamente; las imágenes corregidas se integran sin problemas en los flujos de trabajo de análisis multiespectral sin artefactos radiométricos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Imagen ráster de entrada."
              },
              "pp": {
                "label": "Pp",
                "description": "Ruta del vectorial de puntos (u objeto vectorial tipado) que contiene el punto principal."
              },
              "focal_length": {
                "label": "Distancia focal",
                "description": "Distancia focal de la cámara en mm (predeterminado 304.8)."
              },
              "image_width": {
                "label": "Ancho de imagen",
                "description": "Distancia entre los bordes izquierdo y derecho de la imagen en mm (predeterminado 228.6)."
              },
              "n": {
                "label": "N",
                "description": "Exponente n del modelo de coseno (predeterminado 4.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "dark_object_subtraction": {
            "name": "Sustracción del objeto oscuro",
            "description": "La sustracción de objetos oscuros (DOS) es una heurística sencilla pero eficaz para eliminar la neblina atmosférica sin necesidad de datos meteorológicos auxiliares ni de modelos complejos de transferencia radiativa. La técnica se basa en el principio de que una reflectancia nula debería producir una señal de reflectancia nula (despreciando la dispersión de Rayleigh); cualquier señal observada en superficies ópticamente negras (aguas profundas, sombras de bosques densos, asfalto urbano) se atribuye a la radiancia de trayectoria atmosférica causada por la dispersión de los aerosoles. Esta herramienta identifica el número digital mínimo de cada banda en toda la imagen, lo interpreta como neblina atmosférica y lo resta de todos los píxeles como un desplazamiento constante por banda; las variantes más sofisticadas (DOS2, DOS3, DOS4) tienen en cuenta la dispersión de Rayleigh y el espesor óptico variable de los aerosoles mediante índices de vegetación o el agrupamiento de píxeles oscuros. Entre sus capacidades clave se incluyen el análisis del histograma para aislar los objetos oscuros y distinguir la neblina dependiente de la escena de la reflectancia verdaderamente nula, el enmascaramiento opcional de elementos conocidos de alta reflectancia (zonas urbanas, nieve, nubes) que sesgarían la identificación de objetos oscuros, la corrección de la neblina específica por banda y un cálculo rápido adecuado para el procesamiento en tiempo real o a gran escala. Los casos de uso incluyen estimaciones rápidas de la reflectancia, el seguimiento de la vegetación y de la calidad del agua cuando la calibración absoluta es menos crítica que los cambios relativos, la cartografía rápida de respuesta ante desastres y los datos de archivo históricos para los que no se dispone de información precisa sobre los aerosoles. La entrada comprende la reflectancia en el techo de la atmósfera o la radiancia calibrada, máscaras opcionales de cobertura del suelo para excluir los elementos brillantes y los metadatos de la escena. La salida es la reflectancia corregida de la neblina, estimaciones de la radiancia de trayectoria atmosférica por banda e indicadores de calidad que señalan la confianza en la identificación de los objetos oscuros (p. ej., escasez de píxeles oscuros, escena dominada por zonas urbanas). Aunque es rudimentaria en comparación con los modelos de transferencia radiativa, la DOS sigue siendo práctica para el análisis multitemporal y la cartografía de cobertura global cuando los datos atmosféricos sofisticados no están disponibles.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Pila de rásteres de entrada (uno o más rásteres)."
              },
              "percentile": {
                "label": "Percentil",
                "description": "Percentil de objeto oscuro por banda (predeterminado 1.0)."
              },
              "clamp_non_negative": {
                "label": "Limitar a no negativos",
                "description": "Si es verdadero, limita a cero los valores corregidos por debajo de cero (predeterminado true)."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta las entradas para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              },
              "output_diagnostic_offsets": {
                "label": "Salida de desplazamientos de diagnóstico",
                "description": "Ruta opcional del ráster de salida para los diagnósticos de desplazamiento de objeto oscuro por banda."
              }
            }
          },
          "dn_to_toa_reflectance": {
            "name": "De ND a reflectancia TOA",
            "description": "La conversión de número digital a reflectancia en el techo de la atmósfera transforma los números digitales brutos del sensor en valores de reflectancia espectral físicamente significativos aplicando coeficientes de calibración radiométrica por banda derivados de los metadatos del satélite. La conversión aplica un reescalado radiométrico, la corrección de la irradiancia espectral solar exoatmosférica, la compensación del ángulo cenital solar y, opcionalmente, la normalización de la distancia Tierra-Sol para producir valores de reflectancia directamente comparables entre sensores, momentos de adquisición y ubicaciones geográficas. La reflectancia en el techo de la atmósfera representa la proporción de la energía solar incidente reflejada por los objetivos de la superficie terrestre en el sensor antes de los efectos atmosféricos, y sirve como referencia para el análisis cuantitativo de teledetección. Entre sus características clave se incluyen la aplicación de coeficientes de calibración por banda con el análisis completo de los metadatos de los productos de satélite estándar, el cálculo automático de la geometría solar a partir de la marca de tiempo y la ubicación de la adquisición, la corrección opcional de la distancia Tierra-Sol para la variabilidad estacional y el manejo flexible de múltiples tipos de sensores con formatos de coeficientes estandarizados. Las aplicaciones abarcan la detección cuantitativa de cambios con unidades físicas coherentes, la comparación radiométrica absoluta entre adquisiciones multitemporales y distintos sensores, el cálculo de índices espectrales de vegetación que requieren una reflectancia precisa y la validación entre sensores en el trabajo con constelaciones de satélites. La reflectancia TOA permite flujos de trabajo de análisis rigurosos y resultados científicamente defendibles. Los valores de reflectancia de salida oscilan entre 0 y 1 (a veces expresados como 0-10000 para mantener la precisión con enteros) y representan proporciones adimensionales; los metadatos incorporan los coeficientes de calibración utilizados y los parámetros de geometría del sensor; los valores negativos indican problemas de calidad de los datos que requieren enmascaramiento antes del análisis.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Pila de rásteres de ND de entrada (uno o más rásteres)."
              },
              "reflectance_mult": {
                "label": "Multiplicador de reflectancia",
                "description": "Coeficiente(s) multiplicativo(s) por banda, escalar o matriz del tamaño de inputs."
              },
              "reflectance_add": {
                "label": "Sumando de reflectancia",
                "description": "Coeficiente(s) aditivo(s) por banda, escalar o matriz del tamaño de inputs (predeterminado 0)."
              },
              "sensor_bundle_root": {
                "label": "Raíz del paquete del sensor",
                "description": "Raíz opcional del paquete Landsat/Sentinel-2 usada para derivar automáticamente los coeficientes cuando se omiten los coeficientes explícitos."
              },
              "sun_elevation_deg": {
                "label": "Elevación solar (grados)",
                "description": "Ángulo de elevación solar opcional en grados para la corrección por coseno. Se deriva automáticamente de los metadatos del paquete cuando están disponibles."
              },
              "apply_solar_correction": {
                "label": "Aplicar corrección solar",
                "description": "Si es verdadero (predeterminado), divide por sin(sun_elevation)."
              },
              "clamp_unit_interval": {
                "label": "Limitar al intervalo unitario",
                "description": "Si es verdadero (predeterminado), limita las salidas a [0, 1]."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta las entradas para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "terrain_corrected_optical_analytics": {
            "name": "Analítica óptica corregida por terreno",
            "description": "Corrección topográfica C de bandas ópticas multiespectrales mediante un DEM corregistrado. Genera una pila de reflectancia de superficie, el factor de corrección, una máscara de nubes/sombras y la confianza de calidad.",
            "params": {
              "input_dem": {
                "label": "DEM de entrada",
                "description": "Ráster DEM corregistrado con las bandas ópticas."
              },
              "bundle_root": {
                "label": "Raíz del paquete",
                "description": "Directorio raíz opcional del paquete del sensor óptico (actualmente Sentinel-2 SAFE, Landsat o DIMAP SPOT/Pleiades) usado para resolver automáticamente las bandas requeridas, la QA cuando está disponible y los metadatos solares cuando se omiten las entradas explícitas."
              },
              "input_red": {
                "label": "Entrada roja",
                "description": "Ráster de la banda roja (opcional cuando se proporciona bundle_root)."
              },
              "input_nir": {
                "label": "Entrada NIR",
                "description": "Ráster de la banda NIR (opcional cuando se proporciona bundle_root)."
              },
              "input_green": {
                "label": "Entrada verde",
                "description": "Ráster de la banda verde (opcional)."
              },
              "input_blue": {
                "label": "Entrada azul",
                "description": "Ráster de la banda azul (opcional). Se resuelve automáticamente a partir de los metadatos del paquete cuando se proporciona bundle_root."
              },
              "solar_mode": {
                "label": "Modo solar",
                "description": "Modo de resolución de ángulos solares: auto, manual, metadata, datetime_location."
              },
              "solar_zenith_deg": {
                "label": "Cénit solar (grados)",
                "description": "Ángulo cenital solar en grados (obligatorio en modo manual)."
              },
              "solar_azimuth_deg": {
                "label": "Acimut solar (grados)",
                "description": "Acimut solar en grados (en sentido horario desde el norte, obligatorio en modo manual)."
              },
              "acquisition_datetime_utc": {
                "label": "Fecha y hora de adquisición (UTC)",
                "description": "Marca de tiempo de adquisición en RFC3339 UTC para el modo datetime_location."
              },
              "latitude": {
                "label": "Latitud",
                "description": "Latitud opcional para el modo datetime_location."
              },
              "longitude": {
                "label": "Longitud",
                "description": "Longitud opcional para el modo datetime_location."
              },
              "profile": {
                "label": "Perfil",
                "description": "Perfil de procesamiento: conservative, balanced, fast."
              },
              "cloud_threshold": {
                "label": "Umbral de nubes",
                "description": "Umbral de nubes opcional en unidades de la banda de origen. Se infiere automáticamente cuando se omite."
              },
              "shadow_threshold": {
                "label": "Umbral de sombras",
                "description": "Umbral opcional de sombras de nubes en unidades de la banda de origen. Se infiere automáticamente cuando se omite."
              },
              "qa_mask": {
                "label": "Máscara QA",
                "description": "Ruta opcional del ráster de máscara QA."
              },
              "qa_mask_format": {
                "label": "Formato de máscara QA",
                "description": "Codificación de la máscara QA: auto, landsat_qa_pixel, sentinel2_scl, sentinel2_qa60, binary."
              },
              "mask_strategy": {
                "label": "Estrategia de enmascarado",
                "description": "Estrategia de enmascarado: auto, qa_only, heuristic_only, qa_plus_heuristic."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Exageración vertical para pendiente/orientación."
              },
              "output_prefix": {
                "label": "Prefijo de salida",
                "description": "Prefijo para todos los artefactos de salida."
              }
            }
          },
          "land_surface_temperature_single_channel": {
            "name": "Temperatura de superficie por canal único",
            "description": "La obtención de la temperatura de la superficie terrestre a partir de un único canal infrarrojo térmico estima la temperatura radiativa de la piel mediante la inversión de la ecuación de transferencia radiativa. Los números digitales del sensor se convierten en radiancia espectral usando coeficientes de calibración específicos del sensor; la radiancia se invierte en temperatura de brillo mediante la función de Planck usando constantes térmicas específicas de la banda; la temperatura de brillo se convierte en LST física mediante correcciones empíricas de la emisividad. La emisividad se deriva de índices de vegetación o se proporciona directamente, corrigiendo las variaciones de emisividad térmica dependientes del material. Características clave: requiere una sola banda térmica; procesamiento radiométrico sencillo; cálculo rápido; sin necesidad de múltiples canales; estimación de la emisividad mediante índices de vegetación; salida directa de la temperatura física. Casos de uso: cartografía de islas de calor urbanas; seguimiento del estrés por sequía; detección de elementos geotérmicos; seguimiento de la firma térmica de incendios forestales; gestión del agua en la agricultura. Interpretación de la salida: la salida es la temperatura radiativa de la piel en kelvin (o en grados Celsius si se convierte). La obtención con un solo canal no puede eliminar por completo los efectos del vapor de agua atmosférico; el sesgo atmosférico residual es normalmente de 2-5 K. Los errores de emisividad se propagan directamente: un error de emisividad de ±0.05 ≈ un error de temperatura de ±1-2 K. La emisividad basada en la vegetación varía con el NDVI; el suelo desnudo presenta una emisividad menor que la vegetación. Las series temporales de LST revelan tendencias de calentamiento/enfriamiento; las anomalías de LST > fondo ± 5K indican elementos térmicos.",
            "params": {
              "thermal_input": {
                "label": "Entrada térmica",
                "description": "Ruta del ráster térmico (ND por defecto, o temperatura de brillo si input_is_brightness_temp=true)."
              },
              "input_is_brightness_temp": {
                "label": "La entrada es temperatura de brillo",
                "description": "Si es verdadero, thermal_input ya es temperatura de brillo en kelvin (predeterminado false)."
              },
              "emissivity_input": {
                "label": "Entrada de emisividad",
                "description": "Ruta opcional del ráster de emisividad alineado con thermal_input."
              },
              "emissivity_constant": {
                "label": "Constante de emisividad",
                "description": "Emisividad de reserva cuando no se proporciona emissivity_input (predeterminado 0.98)."
              },
              "sensor_bundle_root": {
                "label": "Raíz del paquete del sensor",
                "description": "Raíz opcional del paquete Landsat usada para derivar la radiancia térmica y las constantes de Planck."
              },
              "thermal_band_number": {
                "label": "Número de banda térmica",
                "description": "Número de banda térmica para la búsqueda de metadatos (predeterminado 10)."
              },
              "radiance_mult": {
                "label": "Multiplicador de radiancia",
                "description": "Factor multiplicativo de radiancia térmica para la conversión ND->radiancia."
              },
              "radiance_add": {
                "label": "Sumando de radiancia",
                "description": "Factor aditivo de radiancia térmica para la conversión ND->radiancia."
              },
              "k1_constant": {
                "label": "Constante K1",
                "description": "Constante térmica K1 de Planck."
              },
              "k2_constant": {
                "label": "Constante K2",
                "description": "Constante térmica K2 de Planck."
              },
              "wavelength_um": {
                "label": "Longitud de onda (µm)",
                "description": "Longitud de onda térmica efectiva en micrómetros (por defecto inferida a partir de thermal_band_number)."
              },
              "output_units": {
                "label": "Unidades de salida",
                "description": "Unidades de salida: celsius (predeterminado) o kelvin."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta emissivity_input al CRS de thermal_input cuando sea necesario."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "land_surface_temperature_split_window": {
            "name": "Temperatura de superficie por ventana dividida",
            "description": "La obtención de la LST por ventana dividida (split-window) utiliza dos bandas del infrarrojo térmico para estimar simultáneamente la temperatura y la emisividad de la superficie mediante la inversión de la ecuación de transferencia radiativa. La absorción atmosférica diferencial entre las dos bandas (normalmente en la región de 10-12 μm) permite corregir el vapor de agua atmosférico, mejorando la exactitud frente a los métodos de un solo canal. Las temperaturas de brillo de ambas bandas se invierten con una parametrización de la emisividad basada en la fracción de vegetación o con mallas de emisividad proporcionadas por el usuario. Características clave: requiere dos bandas térmicas; corrección atmosférica mediante absorción diferencial; obtención simultánea de temperatura y emisividad; algoritmos publicados para sensores estándar; compensación atmosférica superior a la de un solo canal. Casos de uso: cartografía de islas de calor urbanas; detección de la sequía agrícola; detección de elementos geotérmicos; estudios de interacción tierra-atmósfera; detección de anomalías volcánicas/térmicas. Interpretación de la salida: la salida es la temperatura radiativa de la superficie con una corrección atmosférica mejorada. La obtención por ventana dividida reduce el sesgo del vapor de agua atmosférico a <1-2 K, frente a los errores de 2-5 K de un solo canal. Persiste la compensación entre temperatura y emisividad: las zonas con un índice de vegetación alto presentan una emisividad baja que requiere una interpretación cuidadosa. Las superficies heterogéneas (mezcla de vegetación y suelo) muestran valores intermedios. La coherencia temporal mejora la fiabilidad de la detección de cambios; las tendencias de LST > ±3K indican cambios térmicos significativos.",
            "params": {
              "thermal1_input": {
                "label": "Entrada térmica 1",
                "description": "Ruta del primer ráster térmico (p. ej., Landsat B10)."
              },
              "thermal2_input": {
                "label": "Entrada térmica 2",
                "description": "Ruta del segundo ráster térmico (p. ej., Landsat B11)."
              },
              "input_is_brightness_temp": {
                "label": "La entrada es temperatura de brillo",
                "description": "Si es verdadero, las entradas térmicas ya son temperaturas de brillo en kelvin (predeterminado false)."
              },
              "emissivity_mean_input": {
                "label": "Entrada de emisividad media",
                "description": "Ruta opcional del ráster de emisividad media."
              },
              "emissivity_delta_input": {
                "label": "Entrada de diferencia de emisividad",
                "description": "Ruta opcional del ráster de diferencia de emisividad (epsilon1 - epsilon2)."
              },
              "emissivity_mean_constant": {
                "label": "Constante de emisividad media",
                "description": "Constante de emisividad media de reserva cuando falta emissivity_mean_input (predeterminado 0.98)."
              },
              "emissivity_delta_constant": {
                "label": "Constante de diferencia de emisividad",
                "description": "Constante de diferencia de emisividad de reserva cuando falta emissivity_delta_input (predeterminado 0.0)."
              },
              "sensor_bundle_root": {
                "label": "Raíz del paquete del sensor",
                "description": "Raíz opcional del paquete Landsat usada para derivar la radiancia térmica y las constantes de Planck."
              },
              "thermal_band1_number": {
                "label": "Número de banda térmica 1",
                "description": "Número de banda para la búsqueda de metadatos de thermal1_input (predeterminado 10)."
              },
              "thermal_band2_number": {
                "label": "Número de banda térmica 2",
                "description": "Número de banda para la búsqueda de metadatos de thermal2_input (predeterminado 11)."
              },
              "radiance1_mult": {
                "label": "Multiplicador de radiancia 1",
                "description": "Factor multiplicativo de radiancia de la banda 1."
              },
              "radiance1_add": {
                "label": "Sumando de radiancia 1",
                "description": "Factor aditivo de radiancia de la banda 1."
              },
              "k1_1": {
                "label": "K1 1",
                "description": "Constante K1 de Planck de la banda 1."
              },
              "k2_1": {
                "label": "K2 1",
                "description": "Constante K2 de Planck de la banda 1."
              },
              "radiance2_mult": {
                "label": "Multiplicador de radiancia 2",
                "description": "Factor multiplicativo de radiancia de la banda 2."
              },
              "radiance2_add": {
                "label": "Sumando de radiancia 2",
                "description": "Factor aditivo de radiancia de la banda 2."
              },
              "k1_2": {
                "label": "K1 2",
                "description": "Constante K1 de Planck de la banda 2."
              },
              "k2_2": {
                "label": "K2 2",
                "description": "Constante K2 de Planck de la banda 2."
              },
              "coeff_a0": {
                "label": "Coeficiente A0",
                "description": "Coeficiente a0 de ventana dividida (predeterminado 0.0)."
              },
              "coeff_a1": {
                "label": "Coeficiente A1",
                "description": "Coeficiente a1 de ventana dividida para el término T1 (predeterminado 1.0)."
              },
              "coeff_a2": {
                "label": "Coeficiente A2",
                "description": "Coeficiente a2 de ventana dividida para el término (T1-T2) (predeterminado 0.0)."
              },
              "coeff_a3": {
                "label": "Coeficiente A3",
                "description": "Coeficiente a3 de ventana dividida para el término (T1-T2)^2 (predeterminado 0.0)."
              },
              "coeff_a4": {
                "label": "Coeficiente A4",
                "description": "Coeficiente a4 de ventana dividida para el término (1-emissivity_mean) (predeterminado 0.0)."
              },
              "coeff_a5": {
                "label": "Coeficiente A5",
                "description": "Coeficiente a5 de ventana dividida para el término emissivity_delta (predeterminado 0.0)."
              },
              "output_units": {
                "label": "Unidades de salida",
                "description": "Unidades de salida: celsius (predeterminado) o kelvin."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta los rásteres suplementarios para que coincidan con el CRS de thermal1_input cuando sea necesario."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "ndvi_based_emissivity": {
            "name": "Emisividad basada en NDVI",
            "description": "La estimación de la emisividad de la superficie terrestre basada en el NDVI deriva la emisividad térmica de banda ancha a partir de la fracción de vegetación calculada con el NDVI, lo que permite aplicar correcciones de transferencia radiativa térmica en la obtención de la temperatura de la superficie terrestre a partir de datos de satélite del infrarrojo térmico. El algoritmo calcula el NDVI a partir de la reflectancia en el rojo y el infrarrojo cercano, transforma el NDVI en fracción de vegetación y, a continuación, aplica relaciones empíricas entre la fracción de vegetación y la emisividad validadas mediante mediciones de campo y simulaciones de transferencia radiativa. La vegetación afecta significativamente a la emisividad térmica; una mayor vegetación aumenta la emisividad hacia ~0.99, mientras que la emisividad del suelo desnudo oscila entre ~0.90 y 0.98 según la composición y la rugosidad superficial del suelo. Entre sus características clave se incluyen el cálculo automático de la fracción de vegetación a partir del NDVI sin calibración de campo, relaciones empíricas estándar fundamentadas en la teoría física de la transferencia radiativa, un análisis de sensibilidad opcional que explora las variaciones de la emisividad y la compatibilidad directa con datos de satélite del infrarrojo térmico. Las aplicaciones incluyen la obtención de la temperatura de la superficie terrestre a partir de datos de satélite térmicos que requieren correcciones precisas de la emisividad (Landsat, MODIS, Sentinel-3), el análisis de islas de calor urbanas que corrige la vegetación variable, la modelización térmica en aplicaciones de recursos hídricos y agrícolas, y las aplicaciones climáticas que requieren conjuntos de datos térmicos globales coherentes. La emisividad basada en el NDVI permite una corrección térmica precisa. La salida genera un ráster de emisividad (0-1) adecuado para la corrección de transferencia radiativa térmica, un producto intermedio de fracción de vegetación que facilita la interpretación y metadatos que documentan las relaciones empíricas y las propiedades supuestas del suelo/la superficie; los valores de emisividad orientan sobre la incertidumbre de la corrección térmica y su idoneidad para aplicaciones específicas.",
            "params": {
              "red_input": {
                "label": "Entrada roja",
                "description": "Ruta del ráster de la banda roja."
              },
              "nir_input": {
                "label": "Entrada NIR",
                "description": "Ruta del ráster de la banda NIR."
              },
              "ndvi_soil": {
                "label": "NDVI de suelo",
                "description": "Umbral de NDVI para la fracción de suelo desnudo (predeterminado 0.2)."
              },
              "ndvi_vegetation": {
                "label": "NDVI de vegetación",
                "description": "Umbral de NDVI para la fracción de vegetación completa (predeterminado 0.5)."
              },
              "emissivity_soil": {
                "label": "Emisividad del suelo",
                "description": "Emisividad del suelo asumida (predeterminado 0.97)."
              },
              "emissivity_vegetation": {
                "label": "Emisividad de la vegetación",
                "description": "Emisividad de la vegetación asumida (predeterminado 0.99)."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta nir_input al CRS de red_input cuando sea necesario."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "continuum_removal": {
            "name": "Eliminación del continuo",
            "description": "La eliminación del continuo normaliza los espectros multiespectrales estimando la envolvente convexa superior (continuo) que envuelve el espectro y dividiendo cada banda por el valor del continuo correspondiente. Elimina la pendiente espectral general y las variaciones de brillo, lo que permite una mejor visualización de los rasgos de absorción (bandas, profundidades). Las profundidades y posiciones de absorción se estandarizan, lo que permite identificar minerales/materiales mediante bibliotecas espectrales. La línea del continuo se calcula mediante un algoritmo de envolvente convexa que conecta los máximos locales a lo largo del rango espectral. Características clave: elimina el continuo espectral; realza los rasgos de absorción; normaliza las variaciones de brillo; permite la comparación con bibliotecas espectrales; estandariza la forma espectral. Casos de uso: identificación de minerales; clasificación de materiales; análisis espectral de la vegetación; detección de anomalías espectrales; cartografía de rasgos de absorción. Interpretación de la salida: los espectros sin continuo presentan rasgos de absorción (valores <1.0) que indican bandas específicas del material. Las profundidades de absorción indican la intensidad del rasgo; los rasgos poco profundos (<0.2) indican componentes minoritarios; los rasgos profundos (>0.5) indican absorciones dominantes. Las posiciones de los rasgos en el espacio de longitudes de onda permiten identificar materiales mediante bibliotecas de referencia. Los espectros planos sin continuo (cercanos a 1.0) indican materiales espectralmente neutros.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Pila de rásteres de entrada (un ráster por banda)."
              },
              "wavelengths": {
                "label": "Longitudes de onda",
                "description": "Matriz opcional de longitudes de onda estrictamente creciente que coincide con la longitud de inputs."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster multibanda de salida."
              }
            }
          },
          "linear_spectral_unmixing": {
            "name": "Desmezcla espectral lineal",
            "description": "El desmezclado espectral lineal descompone el vector multiespectral de cada píxel como una combinación lineal no negativa de espectros de miembros extremos (endmembers) que representan firmas de materiales puros. La optimización por mínimos cuadrados no negativos resuelve min ||y - Ax||² sujeto a x ≥ 0, donde y es el espectro del píxel, A contiene las firmas de los miembros extremos y x representa las fracciones de abundancia. Se impone la restricción de suma igual a uno para que los valores de abundancia representen proporciones físicas. Los miembros extremos se derivan de datos de entrenamiento, bases de datos de bibliotecas o se extraen mediante algoritmos de extracción de miembros extremos. Características clave: estimación de materiales a nivel de subpíxel; interpretación física de las fracciones de abundancia; admite múltiples miembros extremos; salida restringida a rangos válidos [0,1]; permite la detección de cambios en los materiales. Casos de uso: cartografía de la abundancia de la cobertura del suelo; estimación de la composición mineral; inventario de materiales urbanos; fracciones de vegetación/suelo/superficie impermeable; clasificación basada en bibliotecas espectrales. Interpretación de la salida: los mapas de abundancia de salida muestran las fracciones de material por píxel, que suman 1.0. Las abundancias <0.1 indican componentes minoritarios; las abundancias >0.7 indican materiales dominantes. El error residual indica la calidad del desmezclado; los residuos bajos indican un buen ajuste espectral; los residuos altos indican una falta de correspondencia de los miembros extremos o la complejidad del píxel.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Pila de rásteres de entrada (un ráster por banda)."
              },
              "endmembers": {
                "label": "Miembros finales",
                "description": "Firmas de miembros finales como matriz de objetos {name, values} o matrices numéricas."
              },
              "sum_to_one": {
                "label": "Suma igual a uno",
                "description": "Si es verdadero (predeterminado), normaliza las fracciones no negativas para que sumen uno."
              },
              "iterations": {
                "label": "Iteraciones",
                "description": "Número de iteraciones de gradiente proyectado (predeterminado 80)."
              },
              "step_size": {
                "label": "Tamaño de paso",
                "description": "Tamaño de paso del gradiente proyectado (predeterminado 0.05)."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster multibanda de fracciones de salida."
              },
              "output_residual": {
                "label": "Salida de residuos",
                "description": "Ruta opcional del ráster de RMS de residuos de salida."
              }
            }
          },
          "minimum_noise_fraction": {
            "name": "Fracción de ruido mínima",
            "description": "La fracción de ruido mínimo transforma los datos hiperespectrales mediante un proceso de dos pasos: estimación de la covarianza del ruido seguida del blanqueo del ruido y un análisis de componentes principales. El blanqueo del ruido decorrelaciona el ruido entre bandas; el PCA en el espacio blanqueado identifica las direcciones dominadas por la señal. Los componentes de salida se ordenan por relación señal-ruido, de modo que los primeros componentes representan la señal y los posteriores, el ruido. Permite reducir el ruido mediante el truncamiento de componentes sin los artefactos del suavizado convencional. Características clave: separa la señal del ruido; el ruido se concentra en los últimos componentes; la selección de componentes permite filtrar el ruido; conserva la fidelidad espectral; permite la reducción de la dimensionalidad. Casos de uso: eliminación de ruido en imágenes hiperespectrales; reducción de la dimensión para la clasificación; realce de la señal; caracterización del ruido; evaluación de la calidad de la imagen. Interpretación de la salida: los primeros 1-3 componentes MNF suelen contener el 70-90% de la señal; los componentes posteriores son progresivamente más ruidosos. El truncamiento de componentes (conservando los N primeros) elimina el ruido conservando la información espectral esencial. Las imágenes de los componentes MNF permiten evaluar visualmente el ruido; la desviación estándar de los últimos componentes indica el nivel de ruido.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Pila de rásteres de entrada (un ráster por banda)."
              },
              "num_components": {
                "label": "Número de componentes",
                "description": "Número de componentes MNF de salida (predeterminado: todas las bandas)."
              },
              "noise_mode": {
                "label": "Modo de ruido",
                "description": "Modo del estimador de ruido: 'difference_x' (predeterminado) o 'difference_y'."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster multibanda de componentes MNF de salida."
              },
              "output_inverse": {
                "label": "Salida inversa",
                "description": "Ruta opcional del ráster multibanda reconstruido a partir de los componentes MNF retenidos."
              }
            }
          },
          "spectral_angle_mapper": {
            "name": "Mapeador de ángulo espectral",
            "description": "El mapeo de ángulo espectral (SAM) clasifica los píxeles calculando los ángulos espectrales entre el espectro de cada píxel y los espectros de una biblioteca de referencia, y asigna cada píxel al espectro de la biblioteca con el ángulo mínimo, que representa la máxima similitud espectral con independencia de la intensidad de la iluminación. SAM trata cada píxel y cada espectro de referencia como vectores en un espacio espectral N-dimensional y calcula los ángulos entre vectores mediante operaciones de producto escalar y transformaciones de coseno inverso. Esta clasificación basada en el ángulo espectral es invariante frente a los efectos de iluminación y topográficos que escalan el brillo global pero conservan la forma espectral, lo que la hace robusta en terrenos complejos y condiciones de adquisición variables. Entre sus características clave se incluyen la definición automática del umbral de ángulo espectral, que permite obtener una confianza de clasificación probabilística, la importación de bibliotecas de referencia que admite firmas espectrales proporcionadas por el usuario a partir de muestras de campo o bibliotecas espectrales, la invariancia frente a la iluminación que maneja una iluminación variable conservando la discriminación espectral y un cálculo rápido que permite la clasificación en tiempo real de imágenes grandes. Las aplicaciones habituales incluyen la identificación de materiales y la cartografía geológica con las bibliotecas espectrales del USGS, la clasificación de especies de vegetación combinando datos de satélite multiespectrales con espectros recogidos en campo, la prospección minera en levantamientos hiperespectrales aerotransportados y la evaluación de la exactitud comparando los espectros de la imagen con firmas de referencia recogidas sobre el terreno. La salida de SAM permite identificar materiales con confianza aprovechando las firmas de forma espectral. La salida de la clasificación produce imágenes de una sola banda con etiquetas de clase enteras que corresponden a las entradas de la biblioteca; un ráster de confianza registra opcionalmente los ángulos espectrales mínimos de cada píxel, lo que permite un filtrado basado en umbrales; la salida permite la identificación directa de materiales y el filtrado basado en la confianza.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Pila de rásteres de entrada (un ráster por banda)."
              },
              "endmembers": {
                "label": "Miembros finales",
                "description": "Firmas de miembros finales como matriz de objetos {name, values} o matrices numéricas."
              },
              "threshold_angle_deg": {
                "label": "Ángulo umbral (grados)",
                "description": "Ángulo espectral máximo aceptado opcional en grados; los píxeles sin coincidencia son la clase 0."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de clases de salida."
              },
              "output_angle": {
                "label": "Salida de ángulo",
                "description": "Ruta opcional del ráster de salida para el ángulo espectral mínimo (grados)."
              }
            }
          },
          "spectral_library_matching": {
            "name": "Coincidencia con biblioteca espectral",
            "description": "La comparación con bibliotecas espectrales realiza la clasificación comparando los espectros de los píxeles de la imagen con los espectros de una biblioteca de referencia mediante múltiples métricas de similitud, entre ellas el ángulo espectral (ángulo entre los vectores espectrales), la distancia euclidiana (diferencia de magnitud) y la divergencia de información espectral. El algoritmo acepta una biblioteca espectral de referencia proporcionada por el usuario con espectros de materiales/clases conocidos, calcula las métricas de similitud entre cada píxel de la imagen y las entradas de la biblioteca, identifica el espectro de la biblioteca con la mejor coincidencia (ángulo mínimo, distancia mínima o divergencia mínima) y genera etiquetas de clase con puntuaciones opcionales de confianza/similitud. La comparación con bibliotecas permite identificar materiales sin muestras de entrenamiento de campo aprovechando espectros de referencia del USGS, de levantamientos de campo o de espectroscopia de laboratorio. Entre sus características clave se incluyen múltiples métricas de similitud que permiten seleccionar la métrica según las características espectrales y las distribuciones de clases, la flexibilidad en la importación de bibliotecas que admite diversos formatos de bibliotecas espectrales, la cuantificación opcional de la confianza/incertidumbre y una salida directa de materiales identificables. Las aplicaciones incluyen la cartografía geológica con la biblioteca espectral del USGS para la mineralogía, la clasificación de la vegetación con bibliotecas espectrales de referencia de plantas, la identificación de materiales de construcción en zonas urbanas y el análisis de levantamientos hiperespectrales aerotransportados. La comparación con bibliotecas espectrales permite la identificación automatizada de materiales. La salida comprende un mapa clasificado con los ID de las entradas de la biblioteca como etiquetas de clase, un ráster de similitud/confianza que cuantifica la calidad de la coincidencia y, opcionalmente, una pila completa de ángulos/distancias espectrales para cada entrada de la biblioteca que permite un filtrado basado en umbrales; los metadatos documentan la fuente de la biblioteca de referencia y la métrica de similitud utilizada.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Pila de rásteres de entrada (un ráster por banda)."
              },
              "library": {
                "label": "Biblioteca",
                "description": "Entradas de la biblioteca espectral como matriz de objetos {name, values} o matrices numéricas."
              },
              "library_csv": {
                "label": "CSV de biblioteca",
                "description": "Ruta opcional de la biblioteca espectral CSV (filas name,b1,b2,... o b1,b2,...). Se usa cuando no se proporciona 'library'."
              },
              "metric": {
                "label": "Métrica",
                "description": "Métrica de emparejamiento: 'sam' (predeterminado), 'euclidean' o 'sid'."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de clases de salida."
              },
              "output_score": {
                "label": "Salida de puntuación",
                "description": "Ruta opcional del ráster de puntuación de mejor coincidencia de salida (ángulo o distancia)."
              }
            }
          },
          "canny_edge_detection": {
            "name": "Detección de bordes de Canny",
            "description": "Aplica la detección de bordes multietapa de Canny (desenfoque gaussiano → gradiente de Sobel → supresión de no máximos → doble umbral → histéresis).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada (monobanda o RGB empaquetado)."
              },
              "sigma": {
                "label": "Sigma",
                "description": "Desviación estándar del kernel de suavizado gaussiano en píxeles. Predeterminado: 0.5."
              },
              "low_threshold": {
                "label": "Umbral bajo",
                "description": "Umbral bajo de histéresis (fracción 0–1 del gradiente máximo). Predeterminado: 0.05."
              },
              "high_threshold": {
                "label": "Umbral alto",
                "description": "Umbral alto de histéresis (fracción 0–1 del gradiente máximo). Predeterminado: 0.15."
              },
              "add_back": {
                "label": "Añadir de nuevo",
                "description": "Si es verdadero, los píxeles de borde se ponen a cero en la imagen original en lugar de producir un mapa binario de bordes. Predeterminado: false."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida. Si se omite, el resultado se mantiene en memoria."
              }
            }
          },
          "corner_detection": {
            "name": "Detección de esquinas",
            "description": "Identifica patrones de esquinas en rásteres binarios mediante plantillas de acierto o fallo (hit-and-miss).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "laplacian_filter": {
            "name": "Filtro laplaciano",
            "description": "El filtro laplaciano calcula la segunda derivada espacial de la intensidad de la imagen, proporcionando una potente detección de bordes mediante una medición isótropa (en todas las direcciones) del gradiente. La implementación aplica un kernel fijo que aproxima el operador laplaciano (suma de las segundas derivadas en las direcciones x e y), captando los cambios de intensidad con independencia de la orientación del borde. A diferencia de los filtros direccionales, este enfoque trata todas las direcciones de borde por igual, lo que lo hace ideal para la detección de elementos que requiere independencia de la orientación. El fundamento matemático se basa en la aproximación discreta: ∇²I ≈ I(x+1,y) + I(x-1,y) + I(x,y+1) + I(x,y-1) - 4·I(x,y). Entre sus características clave se incluyen la capacidad de detección de pasos por cero (los bordes verdaderos se encuentran donde la salida cruza el cero), la insensibilidad a la dirección del borde y la capacidad de detectar de forma idéntica tanto las transiciones de claro a oscuro como las de oscuro a claro. El filtrado laplaciano destaca en la cartografía geológica, donde los límites de las estructuras aparecen como pasos por cero, en la delimitación de límites de vegetación, en la extracción de redes viarias a partir de imágenes de alta resolución y en la detección de huellas de edificios. La interpretación de la salida se centra en comprender las transiciones de signo: los valores positivos fuertes indican mínimos oscuros locales, los valores negativos indican máximos brillantes locales y los pasos por cero marcan los bordes verdaderos. La salida típica oscila entre -1000 y +1000 para imágenes de origen de 8 bits, según el contraste local. Una magnitud de salida alta indica bordes nítidos y bien definidos; una magnitud baja sugiere transiciones graduales. La detección de pasos por cero requiere una selección cuidadosa del umbral. Tenga en cuenta que el laplaciano es sensible al ruido (amplifica el ruido de alta frecuencia), por lo que suele recomendarse un filtrado previo con suavizado gaussiano antes de aplicarlo.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "variant": {
                "label": "Variante",
                "description": "Variante del kernel: 3x3(1), 3x3(2), 3x3(3), 3x3(4), 5x5(1), 5x5(2)."
              },
              "clip_amount": {
                "label": "Cantidad de recorte",
                "description": "Porcentaje opcional de recorte simétrico de colas (0-40)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "laplacian_of_gaussians_filter": {
            "name": "Filtro laplaciano de gaussianas",
            "description": "Realiza un realce de bordes laplaciano de gaussiana (LoG) que combina el suavizado gaussiano con la detección de bordes laplaciana. Se aproxima computacionalmente mediante la diferencia de gaussianas (DoG). Primero suaviza la imagen (reduce el ruido) y luego aplica el laplaciano (detecta los bordes). Técnica clásica de detección de bordes multiescala. La detección de pasos por cero sobre la salida LoG identifica ubicaciones precisas de los bordes. LoG es el estándar para la detección de bordes en el espacio de escalas: la gaussiana elimina el ruido y el laplaciano amplifica los bordes. El parámetro sigma controla la escala de los bordes detectados: un sigma pequeño detecta bordes finos y un sigma grande detecta bordes amplios. LoG se aproxima mediante DoG por eficiencia. Múltiples valores de sigma permiten la detección de bordes multiescala (identificar elementos a distintas escalas). Aplicaciones: (1) detección robusta de bordes (resistente al ruido), (2) detección de bordes multiescala (usar varios sigma), (3) localización de bordes por pasos por cero, (4) preprocesamiento para la segmentación, (5) detección de manchas (blobs) mediante los pasos por cero del LoG. Flujo de trabajo: aplicar LoG→identificar pasos por cero→trazar bordes→vectorización o procesamiento posterior.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "sigma": {
                "label": "Sigma",
                "description": "Sigma gaussiano usado por el kernel LoG (0.5-20.0, predeterminado 0.75)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "prewitt_filter": {
            "name": "Filtro de Prewitt",
            "description": "El operador de Prewitt realiza una detección de bordes basada en el gradiente similar a Sobel, usando pesos de kernel alternativos optimizados para distintas características de ruido. La implementación emplea dos kernels de convolución de 3×3 que calculan las derivadas direccionales en x e y con una ponderación uniforme de la fila/columna central y las adyacentes, a diferencia del enfoque de Sobel, que da más peso al centro. La magnitud del gradiente combina los componentes direccionales mediante √(Gx² + Gy²), proporcionando una respuesta direccional uniforme. El fundamento matemático se basa en aproximaciones de diferenciación discreta que ponderan por igual todos los píxeles contribuyentes en lugar de resaltar los centros. Entre sus características clave se incluyen una respuesta al ruido ligeramente distinta de la de Sobel (a veces superior en imágenes extremadamente ruidosas), una descomposición real en magnitud/dirección que permite un análisis sofisticado de los bordes, una eficiencia computacional que solo requiere operaciones de convolución estándar y una eficacia probada en imágenes de radar, ópticas y térmicas. El filtrado de Prewitt destaca en el análisis de imágenes SAR, donde la ponderación uniforme reduce los artefactos de speckle mejor que Sobel, en la detección de anomalías térmicas que resalta los elementos lineales y en la extracción de bordes multiespectrales que requiere un procesamiento independiente de la dirección. La interpretación de la salida es análoga a la de Sobel: la magnitud indica la intensidad del borde (mayor = más nítido) y la dirección, calculada mediante atan2(Gy, Gx), proporciona la orientación del borde en radianes. La magnitud típica oscila entre 0 y 256 para entradas de 8 bits; las magnitudes superiores a 80 suelen indicar bordes significativos. Los valores de dirección oscilan entre -π y +π; 0 radianes indica bordes puramente horizontales y ±π/2 indica bordes puramente verticales. La ponderación uniforme del kernel suele producir respuestas de gradiente ligeramente más suaves que Sobel, lo que puede ser mejor para elementos dispersos o finos de la imagen. Aplique un filtrado de mediana complementario para reducir los falsos positivos inducidos por el ruido. Combine la salida direccional con la selección de umbrales para los flujos de trabajo de enlace de bordes y extracción de límites, fundamentales en las cadenas de segmentación.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "clip_tails": {
                "label": "Recortar colas",
                "description": "Porcentaje opcional de recorte simétrico de colas (0-40)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "roberts_cross_filter": {
            "name": "Filtro de cruz de Roberts",
            "description": "El filtro Roberts Cross es uno de los primeros operadores de detección de bordes y emplea un patrón de kernel en cruz diagonal de 2×2, sencillo pero eficaz, para calcular los gradientes de la imagen con una carga computacional mínima. Este operador utiliza dos matrices ortogonales de 2×2 giradas 45° respecto a la alineación horizontal-vertical, creando máscaras de convolución en forma de cruz que detectan bordes resaltando las esquinas y las transiciones diagonales. El filtro aplica kernels separados para los gradientes en X e Y y calcula la magnitud mediante la suma de los valores absolutos o la norma euclidiana. Entre sus características clave se incluyen una eficiencia computacional excepcional gracias al pequeño tamaño del kernel de 2×2, requisitos de memoria mínimos y un procesamiento rápido de grandes conjuntos de datos ráster. Roberts Cross es especialmente eficaz para detectar elementos a escala fina y transiciones bruscas en imágenes de alta resolución. Los principales casos de uso incluyen la detección rápida de bordes en aplicaciones en las que el tiempo es crítico, el procesamiento de secuencias de vídeo en tiempo real, la detección preliminar de límites antes de aplicar algoritmos avanzados y los entornos con recursos limitados. Las aplicaciones abarcan el preprocesamiento de levantamientos aéreos, la evaluación de la calidad de imágenes de satélite, la extracción de características para cadenas de aprendizaje automático y las implementaciones de SIG móvil. La interpretación de la salida muestra las ubicaciones de los bordes como píxeles de alta magnitud donde se producen cambios espectrales en la vecindad de 2×2. Las regiones de fondo suelen mostrar valores cercanos a cero; los bordes aparecen como elementos lineales brillantes que indican los límites entre clases de cobertura del suelo distintas. La salida es intrínsecamente dispersa y solo contiene bordes donde los gradientes superan los umbrales de precisión computacional. Para imágenes multiespectrales, aplíquelo de forma independiente a cada banda o calcule primero un índice de diferencia normalizada. A la aplicación de Roberts suele seguirle un posprocesamiento de adelgazamiento de bordes para refinar la salida en los flujos de trabajo de conversión a vectorial.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "clip_amount": {
                "label": "Cantidad de recorte",
                "description": "Porcentaje opcional de recorte simétrico de colas (0-50)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "sobel_filter": {
            "name": "Filtro de Sobel",
            "description": "El operador de Sobel detecta bordes mediante la estimación del gradiente direccional tanto en la dirección x (horizontal) como en la y (vertical), combinando kernels de derivadas ortogonales en una representación unificada de la magnitud. La implementación aplica dos kernels de convolución de 3×3 de forma independiente (uno que resalta los bordes horizontales y otro los verticales) y luego combina los resultados mediante la norma euclidiana: magnitud = √(Gx² + Gy²). Este enfoque separable reduce el coste computacional manteniendo la exactitud de la detección de bordes. La base matemática deriva de aproximaciones discretas de los gradientes de la imagen, con pesos del kernel sesgados hacia los píxeles centrales para mejorar la robustez frente al ruido. Entre sus características clave se incluyen la medición del gradiente direccional que permite determinar la orientación de los bordes, una carga computacional relativamente baja, una eficacia probada en imágenes de satélite y aéreas y unos requisitos mínimos de ajuste de parámetros. El filtrado de Sobel tiene amplia aplicación en el cálculo de la pendiente y la orientación del terreno, la extracción de límites de elementos para flujos de trabajo de detección de objetos, la delimitación de redes fluviales a partir de datos DEM y la cartografía de infraestructuras (carreteras, edificios, líneas eléctricas) a partir de imágenes de alta resolución. La interpretación de la salida revela que la magnitud indica la intensidad del borde (valores más altos = transiciones más bruscas), mientras que los componentes direccionales (Gx, Gy) permiten el análisis de la orientación. Las magnitudes de gradiente típicas oscilan entre 0 y 256 para imágenes de 8 bits; los valores superiores a 100 suelen indicar bordes significativos. La relación Gx/Gy proporciona información sobre la orientación del borde: una relación cercana a 1 indica bordes a 45 grados, una relación >>1 indica elementos horizontales y una relación <<1 indica elementos verticales. Los falsos positivos son frecuentes en las regiones ruidosas; el filtrado de mediana o las operaciones morfológicas reducen eficazmente las detecciones espurias. Combínelo con la umbralización para obtener máscaras binarias de bordes adecuadas para las cadenas de segmentación.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "variant": {
                "label": "Variante",
                "description": "Variante de tamaño del kernel: 3x3 (predeterminado) o 5x5."
              },
              "clip_tails": {
                "label": "Recortar colas",
                "description": "Porcentaje opcional de recorte simétrico de colas (0-40)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "balance_contrast_enhancement": {
            "name": "Realce de contraste equilibrado",
            "description": "Reduce la dominante de color en una imagen RGB empaquetada mediante estiramientos parabólicos por canal.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "band_mean": {
                "label": "Media de banda",
                "description": "Brillo medio de salida deseado para cada canal (predeterminado 100.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "create_colour_composite": {
            "name": "Crear composición de color",
            "description": "Crea una composición de color RGB empaquetada a partir de rásteres rojo, verde, azul y, opcionalmente, de opacidad.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "red": {
                "label": "Rojo",
                "description": "Ruta del ráster de la banda roja u objeto ráster tipado."
              },
              "green": {
                "label": "Verde",
                "description": "Ruta del ráster de la banda verde u objeto ráster tipado."
              },
              "blue": {
                "label": "Azul",
                "description": "Ruta del ráster de la banda azul u objeto ráster tipado."
              },
              "opacity": {
                "label": "Opacidad",
                "description": "Ruta opcional del ráster de opacidad u objeto ráster tipado."
              },
              "enhance": {
                "label": "Realzar",
                "description": "Aplicar realce de contraste por balance tras la composición (predeterminado true)."
              },
              "treat_zeros_as_nodata": {
                "label": "Tratar ceros como sin datos",
                "description": "Tratar los valores cero de las entradas RGB como sin datos/fondo (predeterminado false)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "direct_decorrelation_stretch": {
            "name": "Estiramiento por decorrelación directa",
            "description": "Mejora la saturación del color de una imagen RGB empaquetada reduciendo el componente acromático y estirando linealmente los canales.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "achromatic_factor": {
                "label": "Factor acromático",
                "description": "Factor de reducción de la componente gris de 0 a 1 (predeterminado 0.5)."
              },
              "clip_percent": {
                "label": "Porcentaje de recorte",
                "description": "Porcentaje de recorte de colas para el reescalado lineal posterior al estiramiento (predeterminado 1.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "false_colour_composite": {
            "name": "Composición en falso color",
            "description": "Genera un ráster de composición en falso color (NIR/Rojo/Verde) a partir de un paquete de sensor óptico compatible.",
            "params": {
              "wbe": {
                "label": "Wbe",
                "description": "Wbe"
              },
              "output": {
                "label": "Salida",
                "description": "Salida"
              }
            }
          },
          "gamma_correction": {
            "name": "Corrección gamma",
            "description": "La corrección gamma aplica un ajuste no lineal del brillo mediante una transformación de ley de potencia para optimizar el contraste de la imagen, la fidelidad de visualización y la distribución de la luminancia percibida. La transformación matemática es I_corrected = I^(1/γ), donde γ (gamma) es un exponente especificado por el usuario que controla la dirección y la magnitud del ajuste del brillo. Los valores γ > 1 oscurecen las imágenes (compensación de pantallas que aclaran), mientras que γ < 1 las aclaran (compensación de pantallas que oscurecen). La implementación opera de forma independiente sobre cada píxel o banda espectral, conservando las relaciones espaciales y ajustando la escala de intensidad. Entre sus características clave se incluyen la conservación de la estructura de la imagen al redistribuir los valores tonales, una eficiencia computacional que solo requiere tablas de consulta, la aplicabilidad a cualquier dato radiométrico, incluidas imágenes de 16/32 bits, y la reversibilidad que permite la corrección inversa. La corrección gamma tiene una aplicación esencial en la preparación de imágenes de satélite para la interpretación visual compensando las características del sensor, la normalización del brillo de las ortofotos entre pasadas de vuelo o tipos de sensor, el realce de imágenes térmicas para mejorar la visibilidad de los elementos y el preprocesamiento de datos multiespectrales para cadenas de aprendizaje automático en las que la normalización de la entrada mejora la convergencia. La interpretación de la salida muestra que los valores corregidos siguen un escalado de ley de potencia: los tonos medios experimentan el mayor ajuste relativo, mientras que los extremos se comprimen menos. Para una entrada de 8 bits (0-255), un gamma típico de 0.4-0.6 aclara significativamente las imágenes; un gamma de 1.4-1.6 las oscurece de forma notable. Las formas de los histogramas se transforman de manera predecible: los histogramas con sesgo a la izquierda (imágenes oscuras) se benefician de γ < 1, mientras que los histogramas con sesgo a la derecha (imágenes brillantes) se benefician de γ > 1. Verifique la salida corregida mediante la visualización del histograma y la inspección visual. Aplíquela de forma coherente en las colecciones de imágenes que requieren un preprocesamiento uniforme. Un flujo de trabajo habitual encadena la corrección gamma antes de la selección de umbrales o de la clasificación para garantizar una visibilidad equilibrada de los elementos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "gamma": {
                "label": "Gamma",
                "description": "Exponente gamma en [0, 4], predeterminado 0.5."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "gaussian_contrast_stretch": {
            "name": "Estiramiento de contraste gaussiano",
            "description": "Estira el contraste ajustándolo a una distribución de referencia gaussiana.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "num_tones": {
                "label": "Número de tonos",
                "description": "Número de tonos de salida (predeterminado 256)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "histogram_equalization": {
            "name": "Ecualización del histograma",
            "description": "Aplica una ecualización del histograma para mejorar el contraste de la imagen.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "num_tones": {
                "label": "Número de tonos",
                "description": "Número de tonos de salida (predeterminado 256)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "histogram_matching": {
            "name": "Ajuste de histograma",
            "description": "Ajusta el histograma de una imagen a un histograma de referencia proporcionado.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "histogram": {
                "label": "Histograma",
                "description": "Histograma de referencia como [[valor, frecuencia], ...] o [{x, y}, ...]."
              },
              "is_cumulative": {
                "label": "Es acumulativo",
                "description": "Verdadero si los valores del histograma suministrado ya son acumulativos."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "histogram_matching_two_images": {
            "name": "Ajuste de histograma entre dos imágenes",
            "description": "Ajusta el histograma de una imagen de entrada al histograma de una imagen de referencia.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "reference": {
                "label": "Referencia",
                "description": "Ruta del ráster de referencia u objeto ráster tipado."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "ihs_to_rgb": {
            "name": "IHS a RGB",
            "description": "La transformación inversa de IHS a RGB convierte los componentes de intensidad-tono-saturación de nuevo al espacio de color rojo-verde-azul, lo que permite recuperar el color natural a partir de datos de teledetección descompuestos. Las fórmulas inversas operan sobre coordenadas polares cilíndricas, convirtiendo el ángulo de tono y la magnitud de la saturación, junto con la intensidad, de nuevo en coordenadas RGB cartesianas, manteniendo la estabilidad numérica y minimizando los artefactos de cuantificación. Esta transformación es el complemento fundamental de las operaciones de RGB a IHS, en particular en los flujos de trabajo de fusión pancromática (pan-sharpening) en los que la intensidad se ha sustituido por datos pancromáticos de alta resolución. Entre sus características clave se incluyen la inversión matemática exacta de la transformación directa, que garantiza la coherencia en las operaciones de ida y vuelta, el manejo automático de los píxeles acromáticos con tono indefinido, que evita la propagación de artefactos numéricos, la estabilidad numérica en valores de saturación extremos cercanos a cero y una eficiencia computacional que permite una integración fluida en cadenas de procesamiento rápido. La transformación inversa completa los flujos de trabajo de fusión pancromática recuperando imágenes en color natural tras sustituir la intensidad por datos pancromáticos, lo que permite la visualización en color de datos de resolución mejorada, admite la reconstrucción espectral a partir de componentes descompuestos y valida la coherencia de la transformación en los flujos de trabajo de control de calidad. La salida de IHS a RGB produce imágenes en color natural de tres bandas con la resolución espacial heredada de la banda de intensidad de entrada, adecuadas para la visualización directa y el análisis posterior. Las bandas de salida representan los canales rojo, verde y azul en el orden estándar; los colores presentan un mayor detalle espacial si la intensidad se sustituyó por datos pancromáticos de mayor resolución, conservando las características espectrales de los componentes originales de tono y saturación.",
            "params": {
              "intensity": {
                "label": "Intensidad",
                "description": "Ráster de la banda de intensidad (0–1)."
              },
              "hue": {
                "label": "Tono",
                "description": "Ráster de la banda de tono (0–2π radianes)."
              },
              "saturation": {
                "label": "Saturación",
                "description": "Ráster de la banda de saturación (0–1)."
              },
              "red_output": {
                "label": "Salida roja",
                "description": "Ruta de salida opcional para la banda roja."
              },
              "green_output": {
                "label": "Salida verde",
                "description": "Ruta de salida opcional para la banda verde."
              },
              "blue_output": {
                "label": "Salida azul",
                "description": "Ruta de salida opcional para la banda azul."
              }
            }
          },
          "min_max_contrast_stretch": {
            "name": "Estiramiento de contraste mín-máx",
            "description": "Estira linealmente los valores entre un mínimo y un máximo especificados por el usuario.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "min_val": {
                "label": "Valor mínimo",
                "description": "Valor mínimo de entrada para el escalado."
              },
              "max_val": {
                "label": "Valor máximo",
                "description": "Valor máximo de entrada para el escalado."
              },
              "num_tones": {
                "label": "Número de tonos",
                "description": "Número de tonos de salida (predeterminado 256)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "mosaic": {
            "name": "Mosaico",
            "description": "La creación de mosaicos combina múltiples rásteres superpuestos en una salida continua mediante el registro geométrico, el remuestreo a una proyección y una malla de píxeles comunes y la fusión de bordes para minimizar las discontinuidades. El algoritmo registra los rásteres mediante coordenadas geográficas o puntos de control terrestre, los remuestrea a la resolución y la extensión objetivo y aplica una fusión ponderada (difuminado o ponderación exponencial) en las regiones de solape. Los píxeles superpuestos se fusionan mediante un promedio ponderado por la distancia a los bordes del ráster, creando transiciones suaves y conservando la exactitud de los píxeles interiores. Esto produce mosaicos ráster continuos a escala continental o global que eliminan los artefactos de borde y las discontinuidades radiométricas. Entre sus características clave se incluyen la alineación geométrica de múltiples rásteres a una proyección común, la selección del método de remuestreo (bilineal, cúbico, vecino más cercano), la fusión de bordes que elimina las costuras, la normalización radiométrica que compensa las diferencias de sensor o de iluminación y la compatibilidad con miles de rásteres de entrada. La herramienta gestiona automáticamente la prioridad de los rásteres, evitando huecos mediante estrategias de relleno inteligentes. Las aplicaciones incluyen la producción de mosaicos continentales de imágenes de satélite a partir de colecciones de escenas, la generación de modelos digitales de elevación continuos a partir de múltiples pasadas de vuelo, la creación de mosaicos ópticos compuestos a partir de imágenes multitemporales, la construcción de ortomosaicos a partir de levantamientos con vehículos aéreos no tripulados (UAV) y la producción de mapas base para grandes áreas a partir de escenas de satélite superpuestas. La creación de mosaicos es esencial para los flujos de trabajo de análisis continental y global. Interpretación de la salida: los rásteres de salida heredan la proyección y la resolución de entrada; las regiones de fusión muestran valores interpolados que equilibran los rásteres de entrada. Los artefactos de borde indican un solape insuficiente o una normalización radiométrica deficiente; la evaluación examina las costuras y la coherencia del color en los límites del mosaico. El manejo de NoData en los bordes del mosaico requiere atención a los valores de relleno y a la definición de la extensión. La evaluación de la calidad incluye la verificación geométrica mediante puntos de control terrestre y la evaluación radiométrica comparando los valores del mosaico con los rásteres de entrada.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Lista de rásteres de entrada como matriz de rutas o cadena delimitada por comas/punto y coma."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "method": {
                "label": "Método",
                "description": "Método de remuestreo: 'nn' (predeterminado), 'bilinear' o 'cc'."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "mosaic_with_feathering": {
            "name": "Mosaico con difuminado",
            "description": "Crea un mosaico de dos rásteres y difumina las celdas superpuestas usando pesos basados en la distancia al borde.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Primer ráster de entrada."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Segundo ráster de entrada."
              },
              "method": {
                "label": "Método",
                "description": "Método de remuestreo: 'cc' (predeterminado), 'nn' o 'bilinear'."
              },
              "weight": {
                "label": "Peso",
                "description": "Exponente de ponderación por distancia usado para el difuminado del solape (predeterminado 4.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "normalized_difference_index": {
            "name": "Índice de diferencia normalizada",
            "description": "Calcula (band1 - band2) / (band1 + band2) a partir de un ráster multibanda.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "band1": {
                "label": "Banda 1",
                "description": "Índice (base 1) de la primera banda (predeterminado 1)."
              },
              "band2": {
                "label": "Banda 2",
                "description": "Índice (base 1) de la segunda banda (predeterminado 2)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "panchromatic_sharpening": {
            "name": "Afinamiento pancromático",
            "description": "La fusión pancromática combina imágenes pancromáticas de alta resolución con datos multiespectrales de menor resolución mediante el método de Brovey, una técnica de multiplicación espectral que realza el detalle espacial conservando la información espectral. El método funciona remuestreando primero las bandas multiespectrales para que coincidan con la resolución pancromática y calculando después la relación de intensidad entre la imagen pancromática y la intensidad multiespectral calculada para escalar cada banda en consecuencia. Este enfoque mantiene la fidelidad espectral a la vez que mejora drásticamente la resolución espacial. Entre sus características clave se incluyen la conservación de las características espectrales originales, una eficiencia algebraica lineal que permite un procesamiento rápido de imágenes grandes, la compatibilidad del remuestreo automático con entradas registradas por banda y la normalización automática para lograr coherencia radiométrica entre sensores heterogéneos. La técnica se utiliza ampliamente en el realce de imágenes de satélite para aplicaciones cartográficas, como la planificación urbana, el seguimiento agrícola y la exploración de recursos, donde tanto el detalle espectral como el espacial son fundamentales. La fusión pancromática crea una salida multiespectral realzada con una definición espacial superior, adecuada para la interpretación visual y la cartografía detallada. Las bandas de salida mantienen el orden original de las bandas multiespectrales, pero con resolución de nivel pancromático, lo que permite una integración fluida en los flujos de trabajo estándar de análisis de imágenes y en los sistemas SIG. El aumento de la resolución espacial coincide con la resolución pancromática de entrada, lo que permite extraer elementos a escalas más finas que las de los datos multiespectrales originales.",
            "params": {
              "red": {
                "label": "Rojo",
                "description": "Ráster de la banda roja (obligatorio salvo que se proporcione 'composite')."
              },
              "green": {
                "label": "Verde",
                "description": "Ráster de la banda verde (obligatorio salvo que se proporcione 'composite')."
              },
              "blue": {
                "label": "Azul",
                "description": "Ráster de la banda azul (obligatorio salvo que se proporcione 'composite')."
              },
              "composite": {
                "label": "Compuesto",
                "description": "Compuesto multiespectral RGB empaquetado (mutuamente excluyente con red/green/blue)."
              },
              "pan": {
                "label": "Pancromática",
                "description": "Banda ráster pancromática."
              },
              "method": {
                "label": "Método",
                "description": "Método de fusión: 'brovey' (predeterminado) o 'ihs'."
              },
              "output_mode": {
                "label": "Modo de salida",
                "description": "Codificación de salida: 'packed' (predeterminado) o 'bands' (ráster RGB de 3 bandas)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "percentage_contrast_stretch": {
            "name": "Estiramiento de contraste por porcentaje",
            "description": "El estiramiento de contraste por porcentaje realiza un realce lineal del contraste eliminando porcentajes especificados de los valores extremos (colas) del histograma antes de estirar al rango dinámico completo. Algoritmo: elimina los valores de los percentiles inferior y superior de cada banda de forma independiente, asigna linealmente el rango restante al rango de salida (normalmente 0-255 o la profundidad de bits completa) y elimina los extremos radiométricos que causan un contraste deficiente. La selección del percentil (habitualmente 2-3%) equilibra el realce del contraste con la conservación de la integridad de los datos. Características clave: elimina automáticamente los valores radiométricos atípicos, evita la compresión del contraste causada por valores anómalos, se puede aplicar por banda o globalmente, es una transformación lineal computacionalmente eficiente y es una operación invertible. Capacidades: maneja artefactos radiométricos, mejora la visibilidad de elementos sutiles, se adapta a rangos de entrada variables. Casos de uso: preprocesamiento antes de la clasificación o la fusión, aprovechamiento de un rango dinámico infrautilizado, preparación para la visualización multiespectral, normalización radiométrica entre escenas. Aplicaciones: realce de imágenes de satélite para la interpretación visual, preprocesamiento para la detección de deslizamientos de tierra a partir de satélite, normalización previa a la clasificación, recuperación de imágenes de archivo. Interpretación de la salida: las imágenes realzadas muestran un contraste mejorado; los valores extremos quedan recortados; los elementos sutiles antes ocultos se vuelven visibles; los valores de recorte específicos de cada banda revelan la calidad de la distribución radiométrica.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "clip": {
                "label": "Recortar",
                "description": "Porcentaje de recorte por percentil (predeterminado 1.0)."
              },
              "tail": {
                "label": "Cola",
                "description": "Modo de recorte de colas: both (predeterminado), upper o lower."
              },
              "num_tones": {
                "label": "Número de tonos",
                "description": "Número de tonos de salida (predeterminado 256)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "piecewise_contrast_stretch": {
            "name": "Estiramiento de contraste por tramos",
            "description": "Realiza un estiramiento lineal del contraste por tramos usando puntos de ruptura especificados por el usuario.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "function": {
                "label": "Función",
                "description": "Cadena de sentencia de puntos de ruptura, p. ej. '(50,0.1);(120,0.6);(180,0.85)'."
              },
              "greytones": {
                "label": "Tonos de gris",
                "description": "Número de tonos de salida para rásteres no RGB (predeterminado 1024)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "resample": {
            "name": "Remuestrear",
            "description": "El remuestreo de imágenes cambia la resolución de los píxeles mediante métodos de interpolación como el vecino más cercano (el más rápido, con el menor suavizado), el bilineal (interpolación lineal entre píxeles adyacentes), el bicúbico (ajuste de polinomios cúbicos) y el spline cúbico (interpolación continua y suave). El remuestreo es esencial para el registro geométrico, la creación de pilas multiespectrales de resolución uniforme a partir de sensores de resolución mixta y la integración de datos auxiliares a distintas escalas. Cada método consiste en ajustar kernels de interpolación locales a los valores de los píxeles originales, evaluar los kernels en las nuevas ubicaciones de los píxeles y devolver los valores interpolados. El vecino más cercano conserva los valores radiométricos (adecuado para datos categóricos); los métodos de orden superior suavizan los bordes y reducen el aliasing, pero difuminan los límites nítidos. Entre sus características clave se incluyen métodos de interpolación seleccionables que optimizan el equilibrio entre velocidad y exactitud, la especificación de la resolución de salida mediante el tamaño de píxel o las dimensiones objetivo, el manejo automático de los valores de fondo para las zonas fuera de la extensión de entrada y un filtrado antialiasing opcional que reduce los artefactos de remuestreo. Las aplicaciones incluyen el registro de imágenes que alinea los datos con mallas comunes, la armonización de la resolución que unifica pilas multiespectrales con distintas resoluciones nativas, el submuestreo que reduce el volumen de datos conservando los patrones espaciales y el sobremuestreo que mejora el detalle visual para la visualización. La salida del remuestreo integra las imágenes a una resolución coherente. La resolución de salida coincide con la especificación del usuario; el método de interpolación afecta a la definición de los bordes (el vecino más cercano conserva los bordes; los métodos de orden superior los suavizan); las zonas de fondo (fuera de la extensión de entrada) reciben valores de relleno configurables; la salida se integra sin problemas en los flujos de trabajo de análisis multiespectral.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Lista de rásteres de entrada como matriz de rutas o cadena delimitada por comas/punto y coma."
              },
              "base": {
                "label": "Base",
                "description": "Ráster base opcional que define la extensión y la malla de salida. Tiene prioridad sobre cell_size."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida opcional cuando no se proporciona base."
              },
              "method": {
                "label": "Método",
                "description": "Método de remuestreo: 'cc' (predeterminado), 'nn' o 'bilinear'."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "rgb_to_ihs": {
            "name": "RGB a IHS",
            "description": "La transformación de RGB a intensidad-tono-saturación descompone el espacio de color rojo-verde-azul en componentes perceptualmente relevantes: intensidad (brillo), tono (color) y saturación (pureza del color). La descomposición utiliza fórmulas matemáticas estándar que convierten los valores triestímulo RGB en coordenadas polares cilíndricas, donde la intensidad representa la luminancia, el tono codifica el ángulo de color y la saturación mide la concentración del color. Este espacio de color es especialmente útil en teledetección porque la intensidad puede sustituirse por datos de alta resolución conservando las características de color originales mediante la transformación inversa. Entre sus características clave se incluyen una formulación numéricamente estable que maneja de forma robusta los casos límite (píxeles acromáticos), la conservación del rango dinámico completo sin recortes ni pérdida de información, el escalado automático de las bandas para obtener resultados coherentes con distintos rangos de entrada y una eficiencia computacional adecuada para grandes pilas multiespectrales. La técnica tiene múltiples aplicaciones: flujos de trabajo de fusión pancromática en los que la intensidad se sustituye por datos pancromáticos, el realce de la visualización del color, el preprocesamiento espectral para algoritmos de clasificación y las conversiones de color a escala de grises que conservan la información perceptual. La transformación de RGB a IHS es esencial para las técnicas de fusión que combinan la resolución pancromática con la información de color multiespectral. La salida comprende tres archivos de una sola banda que representan los componentes de intensidad, tono y saturación, utilizables de forma independiente en los flujos de trabajo de análisis. La banda de intensidad aproxima la luminancia; el tono oscila entre 0 y 360 grados y codifica la información de color; la saturación oscila entre 0 y 100 por ciento e indica la pureza del color.",
            "params": {
              "red": {
                "label": "Rojo",
                "description": "Ráster de la banda roja (mutuamente excluyente con 'composite')."
              },
              "green": {
                "label": "Verde",
                "description": "Ráster de la banda verde (mutuamente excluyente con 'composite')."
              },
              "blue": {
                "label": "Azul",
                "description": "Ráster de la banda azul (mutuamente excluyente con 'composite')."
              },
              "composite": {
                "label": "Compuesto",
                "description": "Ráster compuesto RGB empaquetado (mutuamente excluyente con red/green/blue)."
              },
              "intensity_output": {
                "label": "Salida de intensidad",
                "description": "Ruta de salida opcional para la banda de intensidad."
              },
              "hue_output": {
                "label": "Salida de tono",
                "description": "Ruta de salida opcional para la banda de tono."
              },
              "saturation_output": {
                "label": "Salida de saturación",
                "description": "Ruta de salida opcional para la banda de saturación."
              }
            }
          },
          "sigmoidal_contrast_stretch": {
            "name": "Estiramiento de contraste sigmoidal",
            "description": "Realiza un estiramiento sigmoidal del contraste usando la ganancia y el punto de corte.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "cutoff": {
                "label": "Corte",
                "description": "Punto medio de la sigmoide en unidades normalizadas (predeterminado 0.0)."
              },
              "gain": {
                "label": "Ganancia",
                "description": "Parámetro de ganancia de la sigmoide (predeterminado 1.0)."
              },
              "num_tones": {
                "label": "Número de tonos",
                "description": "Número de tonos de salida (predeterminado 256)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "split_colour_composite": {
            "name": "Separar composición de color",
            "description": "Divide un ráster de composición de color RGB empaquetada en tres rásteres independientes de una sola banda que representan los canales rojo, verde y azul. Algoritmo: esta herramienta extrae las bandas de color individuales de una imagen compuesta en la que los valores R, G y B están empaquetados en un único ráster (a menudo con la codificación estándar RGB de 24 bits o RGBA de 32 bits). La separación se realiza mediante operaciones a nivel de bits para aislar cada componente de canal de 8 bits. Características clave: conserva los valores radiométricos originales (0–255), maneja composiciones RGB estándar y formatos ampliados, y genera tres rásteres georreferenciados independientes. Casos de uso: análisis espectral en el que las bandas individuales deben procesarse por separado; creación de conjuntos de datos de entrada para el cálculo de índices de vegetación (NDVI, EVI); preparación de datos para operaciones de álgebra de bandas; habilitación de transformaciones de color avanzadas como la conversión de RGB a IHS; extracción de bandas específicas para flujos de trabajo de clasificación supervisada o no supervisada. Aplicaciones: análisis de imágenes de teledetección, preprocesamiento de datos de satélite, preparación del análisis multiespectral, cadenas de realce de imágenes. Interpretación de la salida: se producen tres rásteres de una sola banda con la misma extensión espacial, proyección y georreferencia que la composición de entrada. Cada banda de salida contiene valores radiométricos de 8 bits (0–255) que representan la intensidad de ese componente de color en toda la escena. Las estadísticas de la banda (mín., máx., media) reflejan las características espectrales de ese canal de color; los valores dominantes indican el predominio del color en la imagen. Los rásteres de salida son inmediatamente adecuados para cálculos de bandas, índices espectrales u otros flujos de trabajo de procesamiento multibanda.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster RGB empaquetado de entrada."
              },
              "red_output": {
                "label": "Salida roja",
                "description": "Ruta de salida opcional para la banda roja."
              },
              "green_output": {
                "label": "Salida verde",
                "description": "Ruta de salida opcional para la banda verde."
              },
              "blue_output": {
                "label": "Salida azul",
                "description": "Ruta de salida opcional para la banda azul."
              }
            }
          },
          "standard_deviation_contrast_stretch": {
            "name": "Estiramiento de contraste por desviación estándar",
            "description": "Realiza un estiramiento lineal del contraste usando la media más/menos un multiplicador de la desviación estándar.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "clip": {
                "label": "Recortar",
                "description": "Multiplicador de la desviación estándar usado para derivar los límites de recorte (predeterminado 2.0)."
              },
              "num_tones": {
                "label": "Número de tonos",
                "description": "Número de tonos de salida (predeterminado 256)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "true_colour_composite": {
            "name": "Composición en color verdadero",
            "description": "Genera un ráster de composición en color verdadero (RGB) a partir de un paquete de sensor óptico compatible.",
            "params": {
              "wbe": {
                "label": "Wbe",
                "description": "Wbe"
              },
              "output": {
                "label": "Salida",
                "description": "Salida"
              }
            }
          },
          "adaptive_filter": {
            "name": "Filtro adaptativo",
            "description": "El filtro adaptativo ajusta dinámicamente la intensidad del filtrado según las estadísticas locales de la imagen (media, varianza, curtosis), lo que permite un suavizado consciente del contexto que responde a las características de la escena. La implementación divide las imágenes en ventanas móviles, calcula estadísticas locales (detectando regiones dominadas por el ruido frente a regiones dominadas por elementos) y selecciona los parámetros del filtro en consecuencia. Las regiones planas se suavizan intensamente; las regiones complejas se filtran con suavidad. La base matemática utiliza pruebas estadísticas para identificar el carácter local: las regiones con una varianza inferior al umbral se suavizan mucho; las que superan el umbral conservan el detalle. Entre sus características clave se incluyen la adaptación automática de los parámetros (el usuario especifica rangos y el algoritmo selecciona localmente), la aplicabilidad a cualquier kernel de filtro (gaussiano, de mediana, morfológico) y la eficacia en imágenes ópticas y de radar. El filtrado adaptativo destaca en el preprocesamiento de mosaicos de satélite heterogéneos (distintos sensores y condiciones de adquisición), el suavizado de nubes de puntos LiDAR (conserva los bordes de la vegetación en los bosques y suaviza el suelo en las zonas abiertas), la reducción selectiva del speckle SAR que respeta tanto los objetivos como el fondo y el apilamiento de imágenes multitemporales. La interpretación de la salida revela que las regiones homogéneas experimentan un filtrado intenso (varianza local baja → suavizado fuerte), mientras que las regiones complejas se filtran de forma conservadora (varianza alta → procesamiento mínimo). El radio de suavizado se ajusta dinámicamente por región: las zonas planas reciben un filtrado de radio grande y las zonas texturizadas, un filtrado de radio pequeño o ninguno. Los rangos de salida se mantienen dentro de los de entrada; examine el mapa espacial de intensidad del filtrado para validar la adaptación. Las estadísticas se desplazan hacia las medias locales en las regiones suaves; las regiones complejas permanecen prácticamente sin cambios. Entre los artefactos habituales figuran un posible sobresuavizado en los límites de las regiones (normalmente se aplica una transición suave) y la sensibilidad a las relaciones entre ruido y varianza. Verifique la adaptación analizando los mapas de varianza local. Aplíquelo en cadenas de preprocesamiento automatizadas que manejan datos de múltiples fuentes para los que un filtrado uniforme resulta insuficiente.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "filter_size_x": {
                "label": "Tamaño de filtro X",
                "description": "Ancho de la vecindad en píxeles (entero impar, predeterminado 11)."
              },
              "filter_size_y": {
                "label": "Tamaño de filtro Y",
                "description": "Alto de la vecindad en píxeles (entero impar, predeterminado 11)."
              },
              "threshold": {
                "label": "Umbral",
                "description": "Umbral absoluto de puntuación z para la sustitución por la media (predeterminado 2.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "anisotropic_diffusion_filter": {
            "name": "Filtro de difusión anisotrópica",
            "description": "El filtrado por difusión anisótropa implementa un suavizado iterativo que conserva los bordes mediante procesos de difusión direccional que distinguen entre bordes y regiones planas. El algoritmo actualiza iterativamente cada píxel en función de las diferencias ponderadas con sus vecinos, usando una función de conductancia que reduce la difusión a través de los límites de alto gradiente y permite el suavizado dentro de las regiones homogéneas. La implementación resuelve la ecuación en derivadas parciales ∂I/∂t = div(c(|∇I|)∇I), donde la conductancia c(·) se adapta a la magnitud del gradiente local. Este enfoque basado en los datos conserva las transiciones bruscas a la vez que reduce progresivamente el ruido en las zonas uniformes. Entre sus características clave se incluyen una conservación real de los bordes sin máscaras de bordes explícitas, la selección automática de la escala mediante el número de iteraciones, una reducción eficaz del ruido que mantiene la nitidez de los elementos y la aplicabilidad a datos de una sola banda y multiespectrales. La difusión anisótropa destaca en el suavizado de nubes de puntos LiDAR conservando las rupturas del terreno, la eliminación de ruido en imágenes de satélite para detectar elementos geológicos sutiles, la reducción del speckle SAR manteniendo los bordes de los objetivos de radar y las imágenes médicas/científicas en las que la fidelidad de los bordes es fundamental. La interpretación de la salida requiere comprender que las regiones suaves se homogeneizan progresivamente (los valores convergen hacia la media local), mientras que los bordes se acentúan hasta estabilizarse. Las primeras iteraciones (t<5) producen una reducción leve del ruido; las iteraciones intermedias (t=5-20) proporcionan un suavizado sustancial; un número excesivo de iteraciones (t>50) conlleva el riesgo de sobrerrealzar los límites o crear elementos falsos. Los valores de salida permanecen en los rangos de los datos de origen; las estadísticas se desplazan hacia las medias regionales a medida que avanza el procesamiento. Supervise la varianza de la salida para evaluar la completitud del suavizado. Las métricas habituales incluyen la mejora de la relación señal-ruido y los índices de nitidez de los bordes. Aplíquelo con cuidado en flujos de trabajo multiescala en los que la precisión de la conservación de los bordes influye directamente en la exactitud de la clasificación o de la detección de cambios posteriores.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "iterations": {
                "label": "Iteraciones",
                "description": "Número de iteraciones de difusión (predeterminado 10)."
              },
              "kappa": {
                "label": "Kappa",
                "description": "Parámetro de sensibilidad a bordes (predeterminado 20.0)."
              },
              "lambda": {
                "label": "Lambda",
                "description": "Paso de tiempo en (0, 0.25], predeterminado 0.2."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "bilateral_filter": {
            "name": "Filtro bilateral",
            "description": "Suavizado bilateral que conserva los bordes mediante kernels espacial y de intensidad. Superior al gaussiano para conservar el detalle. Sigma_dist=radio, sigma_int=umbral de conservación de bordes. Compatible con RGB.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "sigma_dist": {
                "label": "Sigma de distancia",
                "description": "Desviación estándar del kernel gaussiano espacial en píxeles (0.5–20.0, predeterminado 0.75)."
              },
              "sigma_int": {
                "label": "Sigma de intensidad",
                "description": "Desviación estándar del kernel gaussiano de intensidad en unidades de valor del ráster (predeterminado 1.0)."
              },
              "treat_as_rgb": {
                "label": "Tratar como RGB",
                "description": "Establecer en verdadero para forzar el procesamiento HSI de RGB empaquetado. Cuando es falso, el RGB empaquetado aún puede detectarse automáticamente a partir de los metadatos del ráster."
              },
              "assume_three_band_rgb": {
                "label": "Asumir RGB de tres bandas",
                "description": "Cuando es verdadero (predeterminado), los rásteres uint8/uint16 de 3 bandas pueden tratarse como RGB en los filtros que admiten procesamiento de intensidad RGB de 3 bandas."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "closing": {
            "name": "Cierre",
            "description": "Realiza una operación morfológica de cierre usando un elemento estructurante rectangular.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "filter_size_x": {
                "label": "Tamaño de filtro X",
                "description": "Ancho impar de la vecindad (predeterminado 11)."
              },
              "filter_size_y": {
                "label": "Tamaño de filtro Y",
                "description": "Alto impar de la vecindad (por defecto igual a filter_size_x)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "conservative_smoothing_filter": {
            "name": "Filtro de suavizado conservador",
            "description": "El suavizado conservador implementa un filtrado no lineal que sustituye cada píxel por el promedio de los vecinos similares (dentro de un rango de intensidad definido), conservando los bordes a la vez que reduce el ruido. La implementación examina las vecindades, identifica los píxeles que están dentro del umbral de intensidad respecto al píxel central y promedia esos píxeles de valor similar. Formulación matemática: F = (1/N) Σ(I_j : |I_j - I_center| < T), donde T es el umbral de similitud y N es el número de píxeles similares. Entre sus características clave se incluyen una definición sencilla de la similitud basada en un umbral, la eficacia en imágenes ópticas y de radar, la interpretabilidad de los parámetros (el umbral controla la nitidez de los bordes) y una carga computacional mínima. El suavizado conservador destaca en el preprocesamiento de imágenes de satélite multiespectrales (reduce el ruido conservando los límites espectrales), el realce de imágenes térmicas (suaviza el ruido radiométrico manteniendo las discontinuidades de temperatura), el suavizado de clasificaciones LiDAR (conserva los límites vegetación/suelo) y el preprocesamiento de datos de levantamiento ruidosos. La interpretación de la salida muestra que las regiones homogéneas se promedian por completo (todos los vecinos son similares), mientras que los bordes se filtran mínimamente (solo hay píxeles similares en el mismo lado). El parámetro de umbral controla la conservación de los bordes: un umbral pequeño (similitud estricta) produce un suavizado leve; un umbral grande (similitud laxa) produce un suavizado agresivo que puede hacer perder bordes. Los valores de salida corresponden exactamente a los valores de los vecinos de entrada (sin interpolación; la salida es el promedio de valores existentes). Las estadísticas se desplazan hacia los grupos locales; las regiones heterogéneas muestran cambios mínimos. Verifique la eficacia del umbral mediante la inspección visual y el análisis de histogramas locales. Entre los artefactos habituales figuran un suavizado insuficiente si los umbrales son demasiado estrictos y el difuminado de los bordes si son demasiado laxos. El número de iteraciones permite un filtrado progresivo: una sola pasada proporciona un suavizado suave; varias pasadas intensifican el efecto. Aplíquelo antes de la clasificación cuando haya que reducir la confusión de categorías causada por el ruido manteniendo nítidos los límites entre clases.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "filter_size_x": {
                "label": "Tamaño de filtro X",
                "description": "Ancho de la vecindad en píxeles (entero impar, predeterminado 3)."
              },
              "filter_size_y": {
                "label": "Tamaño de filtro Y",
                "description": "Alto de la vecindad en píxeles (entero impar, predeterminado 3)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "diff_of_gaussians_filter": {
            "name": "Filtro de diferencia de gaussianas",
            "description": "El filtrado por diferencia de gaussianas (DoG) detecta bordes y elementos finos restando dos versiones desenfocadas con gaussianas de radios distintos, lo que crea un filtro paso banda que resalta las frecuencias espaciales intermedias. La implementación calcula dos desenfoques gaussianos (radio pequeño σ₁ y radio grande σ₂) y luego los resta: DoG = G(σ₁) - G(σ₂). Esta combinación realza los bordes y las crestas a la vez que suprime tanto el ruido fino como las tendencias amplias de iluminación. Entre sus características clave se incluyen una respuesta en frecuencia ajustable (la relación σ₂/σ₁ controla las características del paso banda), una salida centrada en cero (bipolar: valores positivos y negativos), la aplicabilidad a la detección de bordes y la extracción de características, y una eficiencia computacional gracias a la reutilización de las gaussianas. La diferencia de gaussianas destaca en la detección de estructuras geológicas (fallas y lineamientos aparecen como respuestas DoG altas), la extracción de edificios a partir de ortofotos, el realce de texturas finas en mosaicos de teledetección y los modelos de procesamiento inspirados en la neurociencia. La interpretación de la salida muestra que los bordes producen respuestas máximas (positivas en el lado brillante y negativas en el lado oscuro) con un paso por cero justo en las transiciones. La detección de pasos por cero revela los bordes verdaderos con independencia de su dirección. La magnitud del DoG indica la intensidad del borde; el rango típico abarca de -1000 a +1000 para entradas de 8 bits, según el contraste local. La relación σ₂/σ₁ determina el centro del paso banda: una relación de ~2 resalta elementos muy finos; ~5 resalta elementos intermedios; ~10 resalta elementos más gruesos. Las distribuciones de salida bimodales (picos en los extremos positivo y negativo) indican una buena separación de los bordes. Entre los artefactos habituales figuran halos alrededor de los bordes fuertes y una posible respuesta insuficiente si la banda de frecuencias no coincide con la escala de los elementos. Combínelo con una umbralización de la magnitud para extraer los bordes. Aplíquelo antes del posprocesamiento morfológico para una extracción robusta de elementos a partir de imágenes de satélite ruidosas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "filter_size_x": {
                "label": "Tamaño de filtro X",
                "description": "Sigma gaussiano menor (0.25-20.0, predeterminado 2.0)."
              },
              "sigma2": {
                "label": "Sigma 2",
                "description": "Sigma gaussiano mayor (0.5-20.0, predeterminado 4.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "diversity_filter": {
            "name": "Filtro de diversidad",
            "description": "Calcula la diversidad en ventana móvil como el número de valores/clases únicos dentro de la vecindad. Mide la heterogeneidad local: diversidad alta = terreno/clases variados, diversidad baja = homogéneo. Revela la textura, la fragmentación y la diversidad de patrones. Suele aplicarse a imágenes clasificadas o categóricas para identificar zonas de transición/borde.\n\nEl filtro de diversidad crea una métrica de la variación local independiente de los valores específicos. Es útil para la ecología del paisaje (diversidad de hábitats, métricas de fragmentación), la evaluación de la calidad de la clasificación (diversidad alta = zonas mixtas/inciertas) y el análisis de texturas. Aplicado a datos de elevación, la diversidad indica la rugosidad a escala de vecindad. Aplicado a una clasificación, identifica las zonas mixtas, de ecotono o de límite.\n\nAplicaciones: (1) cartografía de la fragmentación del paisaje (diversidad alta = mosaico diverso, diversidad baja = parches uniformes), (2) evaluación de la confianza/incertidumbre de la clasificación (diversidad alta = zona incierta), (3) análisis de texturas (cartografía de la heterogeneidad), (4) detección de bordes/límites mediante los picos de diversidad, (5) diversidad de hábitats para el análisis ecológico (la idoneidad depende de la diversidad local).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "filter_size_x": {
                "label": "Tamaño de filtro X",
                "description": "Ancho de la ventana en píxeles (entero impar, predeterminado 11). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Tamaño de filtro Y",
                "description": "Alto de la ventana en píxeles (entero impar, predeterminado = filter_size_x). Alias: filtery."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "edge_preserving_mean_filter": {
            "name": "Filtro de media con preservación de bordes",
            "description": "El filtro de media con conservación de bordes realiza un promediado selectivo de píxeles calculando medias locales y excluyendo los píxeles atípicos que probablemente representan bordes o ruido. La implementación ordena las vecindades de píxeles, elimina los valores extremos (el más bajo y el más alto, o los valores que superan un umbral estadístico) y promedia los valores restantes. Este enfoque robusto equilibra el suavizado con la conservación de la nitidez. Las variantes incluyen un promediado ponderado que da más peso a los píxeles centrales y una selección adaptativa del umbral basada en las estadísticas locales. Entre sus características clave se incluyen un control sencillo de los parámetros (número de exclusiones o umbral), una eficiencia computacional gracias a la ordenación de vecindades pequeñas, una reducción eficaz del ruido sin difuminar el detalle y la aplicabilidad a datos ópticos, de radar y térmicos. El filtrado de media con conservación de bordes destaca en el preprocesamiento de imágenes de satélite ópticas para el cálculo de índices de vegetación (elimina sombras y nubes sin difuminar los elementos), el suavizado de DEM conservando las rupturas de pendiente, la eliminación de ruido en imágenes térmicas manteniendo la nitidez de los límites y la preparación de ortofotos para la digitalización manual. La interpretación de la salida revela que los valores atípicos eliminados se concentran en los bordes y en las regiones de ruido; los valores restantes se promedian creando un suavizado local. Los parámetros de exclusión controlan la nitidez de los bordes: excluir un único extremo elimina el ruido sal y pimienta; excluir varios extremos produce resultados más suaves con una transición de bordes más gradual. Los rangos de salida se mantienen dentro de los de entrada; las estadísticas se desplazan hacia las medias de los valores no atípicos. Supervise la diferencia entre la salida y la entrada para identificar las regiones filtradas (normalmente zonas de alta varianza). La calidad de la conservación de los bordes depende de la exactitud en la identificación de los valores atípicos; verifique visualmente que los elementos siguen siendo nítidos. Entre los artefactos habituales figuran un suavizado inadecuado si los umbrales son demasiado estrictos y un filtrado excesivo si el número de exclusiones es demasiado alto. El número de iteraciones permite un filtrado progresivo; una sola pasada proporciona un suavizado suave. Aplíquelo antes de una clasificación basada en umbrales para reducir la clasificación errónea causada por el ruido manteniendo los límites de los elementos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "filter_size": {
                "label": "Tamaño de filtro",
                "description": "Tamaño de la vecindad cuadrada en píxeles (entero impar, predeterminado 11)."
              },
              "threshold": {
                "label": "Umbral",
                "description": "Diferencia absoluta máxima con los vecinos para incluir en la media local (predeterminado 15.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "emboss_filter": {
            "name": "Filtro de relieve",
            "description": "El filtro de relieve (emboss) realza los bordes mediante un sombreado direccional, creando una apariencia distintiva de relieve tridimensional en la que los bordes aparecen como superficies elevadas o hundidas según la simulación de la iluminación direccional. Este filtro aplica un kernel de 3×3 que combina la detección de bordes con una iluminación unidireccional, que normalmente simula la luz procedente del cuadrante superior izquierdo, creando un contraste visual marcado en los límites y conservando las regiones suaves. La transformación de relieve resta valores ponderados de los vecinos en direcciones específicas y produce una salida en la que las luces y las sombras acentúan las discontinuidades topográficas y de los elementos. Entre sus características clave se incluyen un control direccional intuitivo que permite ajustar la dirección de la luz simulada (variantes en ocho direcciones), la incorporación natural de la percepción 3D que mejora la interpretación visual y un rendimiento robusto en condiciones de iluminación variadas de las imágenes de origen. El filtro de relieve sirve para aplicaciones de control de calidad, visualización interpretativa y énfasis de los límites de los elementos. Los casos de uso incluyen el realce visual para la interpretación geológica, en la que los límites minerales se hacen visibles como patrones de relieve, la interpretación de fotografías aéreas mejorando la visibilidad de límites sutiles, la producción cartográfica en la que los modelos digitales de elevación con efecto de relieve generan mapas de relieve atractivos y la detección de elementos arqueológicos en la que las estructuras enterradas aparecen como sutiles variaciones topográficas. La interpretación de la salida trata los valores altos como superficies iluminadas y los bajos como sombras, creando una profundidad perceptiva que el ojo humano interpreta de forma natural como relieve. La salida con relieve suele requerir un escalado al rango de visualización 0-255; la salida bruta contiene a menudo valores negativos que representan las zonas de sombra. El efecto es puramente visual: el filtro de relieve no calcula una iluminación real ni crea derivadas de elevación. Para imágenes multiespectrales, aplíquelo a los componentes principales o a bandas seleccionadas según los objetivos del análisis. El posprocesamiento suele incluir un realce del contraste o un mapeo tonal que optimiza el impacto visual.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "direction": {
                "label": "Dirección",
                "description": "Dirección del relieve: n,s,e,w,ne,nw,se,sw."
              },
              "clip_amount": {
                "label": "Cantidad de recorte",
                "description": "Porcentaje opcional de recorte simétrico de colas (0-40)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "fast_almost_gaussian_filter": {
            "name": "Filtro gaussiano rápido aproximado",
            "description": "El filtro casi gaussiano rápido proporciona un suavizado rápido que aproxima el gaussiano mediante un filtrado iterativo de caja (promediado) separable, logrando una respuesta de desenfoque casi gaussiana con una complejidad computacional O(N) independientemente del radio de desenfoque. La implementación aplica convoluciones de caja sucesivas (cada una de las cuales calcula promedios locales de píxeles) para aproximar la distribución gaussiana acumulada; N iteraciones aproximan kernels gaussianos cada vez más grandes. La base matemática utiliza el teorema del límite central: la convolución repetida de funciones de caja se aproxima asintóticamente a la distribución gaussiana. Entre sus características clave se incluyen una velocidad de cálculo que permite el suavizado con kernels grandes en imágenes de gran tamaño, una implementación separable que reduce los requisitos de memoria, el control de parámetros mediante el número de iteraciones (que controla el radio de desenfoque) y la eficacia con cualquier tipo de datos. El filtrado casi gaussiano rápido destaca en la creación rápida de pirámides de imágenes para el análisis multiescala, la exploración de imágenes de satélite en tiempo real, el preprocesamiento de enormes conjuntos de datos de teledetección antes de la clasificación y los visores de imágenes interactivos que requieren un suavizado con buena respuesta. La interpretación de la salida muestra que el número de iteraciones está directamente relacionado con el radio de desenfoque: N=1 produce un suavizado mínimo; N=3-5 proporciona un desenfoque moderado; N>10 crea un suavizado fuerte que aproxima gaussianas de kernel grande. Los valores de salida se desplazan progresivamente hacia la media local a medida que aumentan las iteraciones; la reducción de la varianza sigue patrones predecibles. Los valores restantes se mantienen dentro de los rangos de los datos de entrada. La comparación con el filtrado gaussiano real muestra una aproximación aceptable, con un error del 2-5% en la mayoría de las aplicaciones. La mejora de velocidad respecto al filtrado gaussiano real aumenta drásticamente con radios grandes: 5-20× más rápido para radios >20 píxeles. Entre los artefactos menores figuran una ligera ondulación a lo largo de los bordes (artefactos de caja que se acumulan en las iteraciones) y un manejo de los límites ligeramente distinto del gaussiano. Supervise los histogramas de salida en busca de distribuciones multimodales que indiquen un suavizado suficiente. Aplíquelo en cadenas de preprocesamiento de imágenes en las que la velocidad justifique pequeños errores de aproximación.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "sigma": {
                "label": "Sigma",
                "description": "Sigma gaussiano aproximado (>=1.8 recomendado, predeterminado 1.8)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "flip_image": {
            "name": "Voltear imagen",
            "description": "Voltea una imagen verticalmente, horizontalmente o en ambos sentidos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "direction": {
                "label": "Dirección",
                "description": "Dirección de volteo: vertical (predeterminado), horizontal o both."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "frangi_filter": {
            "name": "Filtro de Frangi",
            "description": "Realiza un realce multiescala de la vascularidad de Frangi para detectar estructuras de tipo vaso (tubulares) a múltiples escalas. Se basa en el análisis de los valores propios de la matriz hessiana. Responde intensamente a los elementos de tipo línea (vasos, carreteras, ríos) y débilmente a las estructuras de tipo mancha (blob). El análisis multiescala (probando varios valores de sigma) detecta automáticamente vasos de distintas anchuras. Se utiliza ampliamente en imagen médica y teledetección para la detección de elementos lineales. La vascularidad de Frangi utiliza las curvaturas principales (valores propios de la hessiana) para clasificar la estructura local: vascularidad alta para los elementos lineales y baja para las mesetas o manchas. La implementación multiescala se aplica con múltiples valores de sigma (anchura) y combina las respuestas. Excelente para detectar carreteras, ríos y redes de vasos. Coste computacional moderado para múltiples escalas. Salida muy interpretable: responde a elementos reconocibles. Aplicaciones: (1) detección de carreteras en imágenes de satélite, (2) extracción de redes fluviales/de cauces, (3) detección de elementos lineales en general, (4) detección de vasos (imagen médica), (5) detección de estructuras multiescala.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "scales": {
                "label": "Escalas",
                "description": "Lista de escalas de tipo gaussiano en píxeles (predeterminado [1.0, 2.0, 3.0])."
              },
              "beta": {
                "label": "Beta",
                "description": "Parámetro beta de Frangi para la supresión de manchas (predeterminado 0.5)."
              },
              "c": {
                "label": "C",
                "description": "Parámetro c de Frangi para la sensibilidad a la estructura (predeterminado 15.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "gabor_filter_bank": {
            "name": "Banco de filtros de Gabor",
            "description": "Realiza un filtrado de respuesta de Gabor multiorientación: análisis de texturas direccional. Aplica un banco de filtros de Gabor con múltiples orientaciones (normalmente 0°, 45°, 90°, 135°) para extraer características de textura direccionales. Las respuestas de Gabor indican la intensidad y la orientación de la textura. Útil para la detección de elementos direccionales, la caracterización de texturas y el análisis de patrones orientados. Cada orientación se genera por separado. El filtrado de Gabor extrae la textura direccional mediante la convolución con ondículas específicas de cada orientación. Cada orientación revela los elementos alineados con esa dirección. Genera múltiples bandas (una por orientación) que revelan la dirección y la intensidad de la textura local. Las respuestas de Gabor son fundamentales para la extracción de características de textura y la detección de objetos en visión por computador. El banco de filtros permite un análisis direccional completo. Aplicaciones: (1) análisis de texturas direccional, (2) detección de elementos orientados (crestas, valles, estructuras lineales), (3) cartografía direccional de erosión/sedimentación, (4) detección de carreteras/cauces (elementos lineales), (5) clasificación basada en texturas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "sigma": {
                "label": "Sigma",
                "description": "Sigma de la envolvente gaussiana en píxeles (predeterminado 2.0)."
              },
              "frequency": {
                "label": "Frecuencia",
                "description": "Frecuencia espacial de la sinusoide en ciclos/píxel (predeterminado 0.2)."
              },
              "orientations": {
                "label": "Orientaciones",
                "description": "Número de orientaciones del banco de filtros (predeterminado 6)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "gaussian_filter": {
            "name": "Filtro gaussiano",
            "description": "Suavizado gaussiano matemáticamente óptimo con un kernel ponderado por la distancia. Fundamental para el análisis multiescala, la detección de bordes y el filtrado paso banda. El parámetro sigma controla la intensidad del suavizado; compatible con RGB.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "sigma": {
                "label": "Sigma",
                "description": "Desviación estándar gaussiana en píxeles (0.5-20.0, predeterminado 0.75)."
              },
              "treat_as_rgb": {
                "label": "Tratar como RGB",
                "description": "Establecer en verdadero para forzar el comportamiento en el espacio de intensidad RGB."
              },
              "assume_three_band_rgb": {
                "label": "Asumir RGB de tres bandas",
                "description": "Cuando es verdadero (predeterminado), los rásteres uint8/uint16 de 3 bandas pueden tratarse como RGB si faltan los metadatos explícitos."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "glcm_texture": {
            "name": "Textura GLCM",
            "description": "El analizador de texturas de la matriz de coocurrencia de niveles de gris (GLCM) extrae medidas estadísticas de textura de segundo orden que cuantifican las relaciones espaciales entre los valores de nivel de gris de los píxeles a distancias y direcciones de desplazamiento especificadas, lo que permite una clasificación de texturas sofisticada que distingue patrones de vegetación agrícola, estructuras del entorno construido y formaciones geológicas. La GLCM calcula matrices de probabilidad que captan la frecuencia con la que aparecen pares de niveles de gris a desplazamientos fijos, y calcula cuatro estadísticos canónicos de Haralick: contraste (mide la variación local), correlación (mide la dependencia lineal), homogeneidad (mide la proximidad a la diagonal) y energía (mide la uniformidad). La herramienta admite ocho desplazamientos direccionales (0°, 45°, 90°, 135° y sus opuestos), lo que permite una sensibilidad direccional de la textura para detectar patrones orientados como hileras de cultivo, alineaciones de edificios o estructuras geológicas. Entre sus características clave se incluyen el análisis multidireccional que revela propiedades de textura anisótropas, el ajuste del parámetro de desplazamiento que optimiza la sensibilidad a la escala, el cálculo simultáneo de múltiples medidas de textura que reduce la carga de procesamiento y una capacidad intrínseca para distinguir propiedades superficiales visualmente sutiles. Los casos de uso abarcan la agricultura de precisión (clasificación de tipos de cultivo, detección de límites de parcelas, evaluación del estrés de los cultivos), el análisis urbano (cartografía de la densidad de edificación, extracción de superficies impermeables) y la teledetección geológica (discriminación de tipos de roca, reconocimiento de patrones estructurales). Las aplicaciones incluyen la clasificación de la cobertura del suelo combinando características espectrales y texturales, el análisis de imágenes basado en objetos que mejora la exactitud de la clasificación, el control de calidad que detecta artefactos instrumentales en imágenes de satélite y la detección de cambios que aísla las alteraciones significativas del ruido del sensor. La interpretación de la salida requiere comprender el significado de cada estadístico: un contraste alto indica texturas rugosas/variadas; una correlación alta indica patrones lineales; una homogeneidad alta indica texturas uniformes; una energía alta indica patrones ordenados y repetitivos. Las bandas de salida pueden combinarse en índices de textura (p. ej., la homogeneidad GLCM dividida por el contraste realza las zonas homogéneas). Los modos de agregación direccional (media/mín./máx./por separado) afectan a la dimensionalidad y la interpretación de la salida. El análisis de texturas típico utiliza varias medidas GLCM simultáneamente para lograr una clasificación robusta.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster monobanda de entrada."
              },
              "window_size": {
                "label": "Tamaño de ventana",
                "description": "Tamaño impar de la ventana móvil en píxeles (predeterminado 7)."
              },
              "distance": {
                "label": "Distancia",
                "description": "Distancia en píxeles para los desplazamientos de pares de co-ocurrencia (predeterminado 1)."
              },
              "angles": {
                "label": "Ángulos",
                "description": "Ángulos separados por comas entre 0,45,90,135 (predeterminado '0,45,90,135')."
              },
              "features": {
                "label": "Entidades",
                "description": "Rasgos separados por comas: contrast,dissimilarity,homogeneity,asm,energy,entropy,mean,variance,correlation."
              },
              "direction_aggregation": {
                "label": "Agregación de direcciones",
                "description": "Modo de agregación de direcciones: mean (predeterminado), min, max, range, separate."
              },
              "levels": {
                "label": "Niveles",
                "description": "Número de niveles de cuantización (predeterminado 32; rango 8-128)."
              },
              "symmetric": {
                "label": "Simétrico",
                "description": "Si es verdadero (predeterminado), construye GLCM simétricas."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida (GeoTIFF multibanda)."
              }
            }
          },
          "guided_filter": {
            "name": "Filtro guiado",
            "description": "El filtro guiado implementa un suavizado que conserva los bordes restringiendo las salidas del filtro a relaciones localmente lineales con una imagen guía, normalmente la original o una capa de referencia relacionada. La implementación divide la imagen en regiones rectangulares superpuestas y calcula parámetros de regresión lineal dentro de cada región para imponer la suavidad de la salida respetando la estructura de la imagen guía. La formulación matemática minimiza ||Fᵢ - a·Gᵢ - b||² + ε||a||², donde Fᵢ es la salida filtrada, Gᵢ es la imagen guía y (a, b) son los parámetros localmente lineales. Entre sus características clave se incluyen la flexibilidad (la imagen guía puede ser independiente de la imagen filtrada), la eficiencia computacional gracias a una implementación separable O(N), el control de parámetros que permite ajustar la intensidad de la conservación de los bordes y la eficacia con guías de una sola banda o multiespectrales. El filtrado guiado destaca en los flujos de trabajo de fusión multisensor en los que los datos ópticos guían la eliminación de ruido SAR, en el refinamiento de clasificaciones LiDAR mediante ortofotos coincidentes, en la eliminación de sombras/nubes en mosaicos de satélite usando imágenes de referencia temporales y en el realce del detalle en tareas de regularización de mapas. La interpretación de la salida revela que las regiones filtradas se mantienen localmente similares a la estructura de la imagen guía, mientras que el promediado de la intensidad se produce dentro de las regiones homogéneas. El radio de suavizado controla la extensión espacial (radio mayor = mayor suavizado); el parámetro de regularización ε equilibra la suavidad y la fidelidad a la estructura (ε mayor = más suave, ε menor = más detalle). Los rangos de salida coinciden con los de entrada; la comparación visual con la imagen guía valida la fidelidad de la conservación de los bordes. Entre los artefactos habituales figuran el sobresuavizado en discontinuidades fuertes (seleccione parámetros adecuados) y un suavizado insuficiente en regiones con una guía pobre (verifique la calidad de la imagen guía). Supervise la correlación cruzada entre la salida filtrada y la imagen guía para evaluar la calidad de la alineación. Aplíquelo estratégicamente en flujos de trabajo de fusión, aumento de nitidez y reconstrucción de imágenes en los que la información de bordes de una fuente guía el filtrado de otra.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "radius": {
                "label": "Radio",
                "description": "Radio de la ventana del filtro guiado en píxeles (predeterminado 4)."
              },
              "epsilon": {
                "label": "Épsilon",
                "description": "Parámetro de regularización para la varianza local (predeterminado 0.01)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "high_pass_bilateral_filter": {
            "name": "Filtro bilateral de paso alto",
            "description": "Calcula un residuo de paso alto restando el suavizado bilateral del ráster de entrada.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "sigma_dist": {
                "label": "Sigma de distancia",
                "description": "Desviación estándar del kernel gaussiano espacial (distancia), en píxeles (0.5–20.0, predeterminado 0.75)."
              },
              "sigma_int": {
                "label": "Sigma de intensidad",
                "description": "Desviación estándar del kernel gaussiano de intensidad, en unidades de valor del ráster (predeterminado 1.0)."
              },
              "treat_as_rgb": {
                "label": "Tratar como RGB",
                "description": "Establecer en verdadero para forzar el filtrado de intensidad HSI en rásteres RGB empaquetados antes de la diferenciación paso alto."
              },
              "assume_three_band_rgb": {
                "label": "Asumir RGB de tres bandas",
                "description": "Cuando es verdadero (predeterminado), y no hay metadatos de color explícitos, permite la interpretación RGB de uint8/uint16 de 3 bandas."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo de salida. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "high_pass_filter": {
            "name": "Filtro de paso alto",
            "description": "El filtro de paso alto aísla los componentes espaciales de alta frecuencia de las imágenes restando de la imagen original una versión de baja frecuencia (suavizada). Matemáticamente, esto se consigue mediante la convolución de la imagen con un kernel diseñado para resaltar los gradientes y suprimir las variaciones tonales amplias. La implementación utiliza la convolución directa o el procesamiento en el dominio de la frecuencia, según el tamaño del kernel y las dimensiones de la imagen. El filtro realza los bordes, los detalles de textura fina y las variaciones a pequeña escala, a la vez que elimina las tendencias de iluminación a gran escala. Entre sus rasgos distintivos se incluyen la conservación del contraste de los bordes sin artefactos en los límites, la atenuación selectiva de frecuencias en función del radio del kernel y la aplicabilidad directa tanto a imágenes en escala de grises como multiespectrales. El filtrado de paso alto es muy valioso en el análisis del terreno, cuando es necesario realzar elementos topográficos sutiles, para aumentar la nitidez de las imágenes de satélite con fines de interpretación visual, para detectar estructuras geológicas a pequeña escala y para preprocesar datos para la clasificación por aprendizaje automático. También es esencial para preparar ortofotos para la detección de cambios y para realzar los productos derivados de LiDAR. La interpretación de la salida requiere comprender que los valores positivos indican máximos locales (bordes brillantes) y los negativos, mínimos locales (bordes oscuros). El rango típico es de ±100 para imágenes de 8 bits; una salida de media cero indica una extracción correcta de las altas frecuencias. Entre los artefactos habituales figuran el efecto de anillo (ringing) en las discontinuidades fuertes y la amplificación del ruido si las imágenes de origen son ruidosas. La interpretación de la escala depende del radio del kernel: los kernels más pequeños realzan la textura fina (píxeles individuales), mientras que los más grandes resaltan elementos de escala moderada (variaciones del terreno a lo largo de decenas de píxeles). Supervise las estadísticas de la salida; un centrado en cero excesivo indica un posible sobreprocesamiento. Aplíquelo junto con resultados complementarios de paso bajo para reconstruir el original o en flujos de trabajo de descomposición multiescala.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "filter_size_x": {
                "label": "Tamaño de filtro X",
                "description": "Ancho de la ventana en píxeles (entero impar, predeterminado 11). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Tamaño de filtro Y",
                "description": "Alto de la ventana en píxeles (entero impar, predeterminado = filter_size_x). Alias: filtery."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "high_pass_median_filter": {
            "name": "Filtro de mediana de paso alto",
            "description": "Realiza un filtrado de paso alto restando la mediana local a los valores centrales: salida = píxel - mediana_vecindad. Combina el filtrado de paso alto (realza el detalle) con la robustez de la mediana (elimina el ruido). Salida centrada en cero (negativa = más oscuro que el entorno, positiva = más brillante). Robusto frente a los valores atípicos en comparación con el paso alto basado en gaussianas. El residuo de paso alto revela las desviaciones locales respecto a la tendencia de la mediana. Especialmente robusto para datos ruidosos: la mediana es más estable que la media frente a los valores atípicos. La salida resalta la variación a escala fina. Suele aplicarse a versiones suavizadas con gaussiana (crea un filtro paso banda). Útil para el realce de texturas y la extracción de elementos a partir de imágenes ruidosas. Aplicaciones: (1) realce de texturas a partir de datos ruidosos, (2) extracción de detalles antes de la clasificación, (3) detección robusta de elementos, (4) preprocesamiento para la segmentación basada en texturas, (5) preprocesamiento SAR.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "filter_size_x": {
                "label": "Tamaño de filtro X",
                "description": "Ancho de la vecindad en píxeles (entero impar, predeterminado 11)."
              },
              "filter_size_y": {
                "label": "Tamaño de filtro Y",
                "description": "Alto de la vecindad en píxeles (entero impar, predeterminado 11)."
              },
              "sig_digits": {
                "label": "Dígitos significativos",
                "description": "Dígitos significativos usados para la agrupación del histograma (predeterminado 2)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "integral_image_transform": {
            "name": "Transformada de imagen integral",
            "description": "Calcula una transformación de área sumada (imagen integral) para cada banda.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "k_nearest_mean_filter": {
            "name": "Filtro de media de K vecinos",
            "description": "Realiza un suavizado de media de k vecinos más cercanos que conserva los bordes: ordena la vecindad según la distancia al valor central y promedia los k valores más próximos. Enfoque híbrido que conserva los bordes mediante una ponderación por similitud. Se promedian el píxel central y los k-1 vecinos más similares. Más sofisticado que el k-NN simple (considera tanto la similitud espacial como la de intensidad). Computacionalmente eficiente en comparación con el bilateral. El enfoque de k más cercanos selecciona los vecinos de forma adaptativa: se promedian los valores de píxel próximos al central y se ignoran los píxeles disímiles. El parámetro k controla el suavizado: k=1 (sin suavizado), k=n (todos los vecinos = filtro de media). Normalmente k=n/2 (la mitad de la vecindad). Alternativa eficiente al filtro bilateral: conservación de bordes similar con un menor coste computacional. Especialmente útil para imágenes con fuertes discontinuidades de intensidad. Aplicaciones: (1) suavizado con conservación de bordes (alternativa al bilateral), (2) preprocesamiento rápido para la clasificación, (3) preprocesamiento en el que la eficiencia es crítica, (4) filtrado de imágenes multibanda. Parámetros típicos: k=neighborhood_size/2 a 3/4.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "filter_size_x": {
                "label": "Tamaño de filtro X",
                "description": "Ancho de la vecindad en píxeles (entero impar, predeterminado 3)."
              },
              "filter_size_y": {
                "label": "Tamaño de filtro Y",
                "description": "Alto de la vecindad en píxeles (entero impar, predeterminado 3)."
              },
              "k": {
                "label": "K",
                "description": "Número de vecinos más cercanos a promediar (predeterminado 5)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "kuwahara_filter": {
            "name": "Filtro de Kuwahara",
            "description": "El filtro de Kuwahara implementa un suavizado no lineal con conservación de bordes dividiendo la vecindad de cada píxel en cuatro cuadrantes, calculando estadísticas dentro de cada cuadrante y seleccionando como valor de salida el del cuadrante con menor varianza. La implementación divide una ventana de (2k+1)×(2k+1) en cuatro subventanas superpuestas de k×k, calcula la media y la varianza de cada cuadrante y genera la media del cuadrante con varianza mínima. Este enfoque basado en rangos suaviza las regiones homogéneas y, al mismo tiempo, aumenta la nitidez de los bordes. Entre sus características clave se incluyen una conservación real de los bordes mediante la selección de cuadrantes (los bordes entre cuadrantes evitan el difuminado de la salida), una simplicidad computacional que solo requiere cálculos de media/varianza, el control de parámetros mediante el tamaño del cuadrante k y la eficacia en imágenes ópticas, de radar y térmicas. El filtrado de Kuwahara destaca en el suavizado de DEM derivados de LiDAR conservando escarpes y terrazas, la extracción de redes viarias a partir de imágenes de alta resolución manteniendo la nitidez de los ejes, la delimitación de huellas de edificios a partir de fotografías aéreas y la detección de los límites de vertidos de petróleo en imágenes SAR. La interpretación de la salida revela que las regiones homogéneas generan el cuadrante que promedia de forma natural (menor varianza); los bordes generan el cuadrante que contiene la estructura uniforme más próxima al borde, anclando eficazmente la salida al lado más limpio. El tamaño del cuadrante k controla la conservación del detalle: k=1 (suavizado mínimo) conserva los bordes finos; k=3-4 proporciona un equilibrio entre suavizado y conservación de bordes; k>5 conlleva el riesgo de perder detalle. Los valores de salida coinciden exactamente con los valores de los píxeles de entrada de los cuadrantes seleccionados (sin interpolación). Supervise los histogramas de salida en busca de distribuciones bimodales (bordes y regiones homogéneas claramente separados); las distribuciones unimodales sugieren difuminado de los bordes. Aplique un aumento de nitidez complementario si se produce un sobresuavizado. Entre los artefactos habituales figuran un sesgo direccional según la alineación de los cuadrantes y un efecto de bloques cerca de los bordes débiles. Utilícelo en el preprocesamiento para la segmentación, donde la conservación de los bordes garantiza una extracción precisa de los límites.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "radius": {
                "label": "Radio",
                "description": "Radio del cuadrante de Kuwahara en píxeles (predeterminado 2)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "lee_filter": {
            "name": "Filtro de Lee",
            "description": "El filtro de Lee realiza la reducción del speckle SAR mediante el modelo multiplicativo de Lee, suponiendo que los retornos de radar siguen un ruido multiplicativo: I = S·N, donde S es la señal y N es el ruido multiplicativo. La implementación calcula las medias y varianzas locales, estima la varianza del speckle y luego filtra mediante: F = μ + (1 - σₙ²/σ_I²)·(I - μ), donde σₙ² es la varianza del speckle y σ_I² es la varianza total. Este enfoque basado en modelos conserva los elementos de alta coherencia a la vez que suprime el speckle. Entre sus características clave se incluyen un modelo de ruido específico para SAR (multiplicativo en lugar de gaussiano), la conservación de los objetivos puntuales y los bordes, una interpretación sencilla de los parámetros (el tamaño de ventana controla la medición de la coherencia) y una eficacia probada en SAR de polarización simple y multipolarización. El filtrado de Lee destaca en el preprocesamiento SAR para el seguimiento agrícola, la clasificación forestal, el seguimiento de la superficie oceánica y los flujos de trabajo de cartografía de inundaciones. La interpretación de la salida muestra que las regiones de alta coherencia (objetivos puntuales, bordes fuertes) se filtran mínimamente, mientras que las regiones de baja coherencia (ruido speckle, límites débiles) se filtran de forma agresiva. La estimación de la varianza del speckle afecta a la salida: una estimación precisa requiere suficientes píxeles homogéneos; una varianza subestimada produce un suavizado insuficiente; una varianza sobreestimada provoca un sobresuavizado. El tamaño de ventana controla la resolución de la medición de la coherencia: las ventanas pequeñas (3×3) conservan el detalle fino; las ventanas grandes (7×7) mejoran la estimación de la varianza pero conllevan el riesgo de perder detalle. El escalado de la salida coincide con el de entrada; la visualización logarítmica mejora la visibilidad. La reducción del ruido típica logra una disminución de la varianza de 5-10 dB, según el número de looks. Supervise el histograma de salida en busca de la firma residual del speckle; las distribuciones suaves sugieren un filtrado adecuado. Entre los artefactos figuran un posible difuminado de los bordes en regiones de coherencia débil y un sesgo direccional en los elementos lineales. Aplíquelo estratégicamente en la clasificación SAR que requiera suprimir el speckle manteniendo la integridad de las características de clasificación.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "filter_size_x": {
                "label": "Tamaño de filtro X",
                "description": "Ancho de la vecindad en píxeles (entero impar, predeterminado 11)."
              },
              "filter_size_y": {
                "label": "Tamaño de filtro Y",
                "description": "Alto de la vecindad en píxeles (entero impar, predeterminado 11)."
              },
              "sigma": {
                "label": "Sigma",
                "description": "Semianchura de inclusión de intensidad alrededor del valor central (predeterminado 10.0)."
              },
              "m_value": {
                "label": "Valor M",
                "description": "Número mínimo de muestras dentro del rango antes del promediado de reserva (predeterminado 5.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "line_detection_filter": {
            "name": "Filtro de detección de líneas",
            "description": "El filtro de detección de líneas es un detector de bordes especializado diseñado para realzar elementos lineales (carreteras, ríos, líneas eléctricas y lineamientos geológicos) en cuatro direcciones principales (horizontal, vertical y ambas diagonales) aplicando kernels de convolución direccionales optimizados para la conectividad y la continuidad de las líneas. Este filtro emplea kernels de 3×3 que resaltan las estructuras lineales alineadas con cada dirección principal y suprimen el ruido perpendicular y las variaciones aleatorias de los elementos. El enfoque direccional separa las detecciones por orientación, lo que permite a las aplicaciones posteriores distinguir las infraestructuras horizontales (conducciones, límites de parcelas) de las estructuras verticales (hileras de árboles, corredores de servicios). Entre sus características clave se incluyen la descomposición multidireccional que genera bandas separadas de magnitud y dirección, el ajuste adaptativo de la sensibilidad a las variaciones de anchura y contraste de las líneas y un rendimiento excepcional con elementos lineales sutiles integrados en terrenos complejos. Los casos de uso abarcan la cartografía de infraestructuras (carreteras, ferrocarriles, líneas eléctricas), la extracción de elementos naturales (cauces, crestas, fallas) y la delimitación de límites de usos del suelo. Las aplicaciones incluyen el preprocesamiento para la conversión a vectorial en la digitalización catastral, la extracción de redes de transporte a partir de ortofotografías, la cartografía de estructuras geológicas a partir de imágenes de satélite y el reconocimiento de patrones en el análisis de teledetección. La interpretación de la salida requiere comprender que cada componente direccional revela la intensidad de las líneas en esa orientación concreta: examine las cuatro salidas direccionales para identificar las direcciones predominantes de los elementos. Los valores de magnitud más altos indican una mayor continuidad de las líneas; los valores bajos sugieren ruido o interrupciones. La salida es naturalmente dispersa y resalta solo los píxeles que representan elementos lineales; las zonas de fondo permanecen cerca de cero. La salida multidireccional permite una posclasificación en la que las carreteras (normalmente horizontales/verticales en las zonas edificadas) se distinguen de los lineamientos naturales (orientación arbitraria). Combine los componentes direccionales para generar un mapa de líneas unificado o analice cada dirección por separado para cartografiar estructuras orientadas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "variant": {
                "label": "Variante",
                "description": "Variante de dirección de línea: v, h, 45 o 135."
              },
              "abs_values": {
                "label": "Valores absolutos",
                "description": "Si es verdadero, emite valores absolutos de respuesta."
              },
              "clip_tails": {
                "label": "Recortar colas",
                "description": "Porcentaje opcional de recorte simétrico de colas (0-40)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "line_thinning": {
            "name": "Adelgazamiento de líneas",
            "description": "Reduce los elementos conectados de un ráster binario a líneas de esqueleto de una celda de ancho.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "lidar_ground_point_filter": {
            "name": "Filtro de puntos de suelo LiDAR",
            "description": "Separa el terreno de los puntos que no son del suelo: clasificación/filtrado basado en la pendiente mediante la geometría de planos locales y umbrales de altura. Segmentación eficiente del suelo.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "search_radius": {
                "label": "Radio de búsqueda",
                "description": "Radio de búsqueda de la vecindad (predeterminado 2.0)."
              },
              "min_neighbours": {
                "label": "Vecinos mínimos",
                "description": "Objetivo mínimo de vecinos (predeterminado 0)."
              },
              "slope_threshold": {
                "label": "Umbral de pendiente",
                "description": "Umbral de pendiente en grados (predeterminado 45.0, máx. 88)."
              },
              "height_threshold": {
                "label": "Umbral de altura",
                "description": "Separación vertical mínima para marcar como fuera del terreno (predeterminado 1.0)."
              },
              "classify": {
                "label": "Clasificar",
                "description": "Si es verdadero, clasifica los puntos (suelo=2, fuera del terreno=1); en caso contrario, filtra los puntos fuera del terreno."
              },
              "slope_norm": {
                "label": "Normalización de pendiente",
                "description": "Si es verdadero, aplica normalización del terreno por sombrero de copa antes de la prueba de pendiente (predeterminado true)."
              },
              "height_above_ground": {
                "label": "Altura sobre el suelo",
                "description": "Si es verdadero, emite los valores z como altura local sobre el vecino inferior más cercano."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida para el modo de entrada única."
              }
            }
          },
          "majority_filter": {
            "name": "Filtro de mayoría",
            "description": "Calcula la moda en ventana móvil (valor/clase más frecuente) para cada píxel. Filtro no lineal que conserva los límites categóricos y los patrones dominantes. Especialmente útil para imágenes clasificadas en las que la salida debe permanecer dentro del conjunto de clases original (a diferencia del filtro de media, que crea valores interpolados). Esencial para la limpieza morfológica de los resultados de clasificación.\n\nEl filtrado de mayoría es el equivalente basado en la moda del filtrado de mediana. Para datos categóricos (imágenes clasificadas, cobertura del suelo), la mayoría conserva las definiciones de clase a la vez que suaviza el ruido. Para datos continuos, la mayoría puede revelar picos locales en la distribución de valores. Suele ir seguido de la eliminación de clases minoritarias (limpieza posterior a la clasificación) para eliminar los artefactos de clasificación de tipo «sal y pimienta».\n\nAplicaciones: (1) suavizado posterior a la clasificación (elimina pequeños parches de clase espurios), (2) mapa de la clase mayoritaria a partir de múltiples resultados clasificados, (3) limpieza de datos vectoriales (desagregación de clases), (4) supresión del ruido en imágenes umbralizadas, (5) suavizado de atributos en resultados de segmentación. Flujo de trabajo típico: clasificar→filtro de mayoría→eliminación de minorías→mapa final depurado.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "filter_size_x": {
                "label": "Tamaño de filtro X",
                "description": "Ancho de la ventana en píxeles (entero impar, predeterminado 11). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Tamaño de filtro Y",
                "description": "Alto de la ventana en píxeles (entero impar, predeterminado = filter_size_x). Alias: filtery."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "maximum_filter": {
            "name": "Filtro de máximo",
            "description": "Calcula el valor máximo en ventana móvil, revelando picos y crestas locales. Operador de dilatación en el procesamiento morfológico de imágenes. Útil para detectar picos, líneas de cresta y elementos de amplitud máxima. Sensible a un único valor atípico (un valor alto en la ventana produce una salida alta).\n\nEl filtro de máximo es el operador morfológico de «dilatación»: expande las regiones claras y reduce las oscuras. Cuando se aplica repetidamente (dilatación en varias pasadas), crea picos suavizados y los elementos aislados crecen hasta llenar sus vecindades. Combinado con el filtro de mínimo, permite el cierre (dilatación y luego erosión) y la apertura (erosión y luego dilatación). Esencial para la detección morfológica de elementos y el análisis multiescala.\n\nAplicaciones: (1) dilatación morfológica para el filtrado basado en el tamaño, (2) cierre mediante dilatación→erosión para rellenar pequeños huecos, (3) identificación de picos/crestas en el terreno y en imágenes, (4) nivel de techo local en batimetría/DEM, (5) análisis de elementos multiescala (comparar la dilatación entre escalas). Flujo de trabajo típico: máximo→comparación con el mínimo→cierre o apertura según el tipo de elemento.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "filter_size_x": {
                "label": "Tamaño de filtro X",
                "description": "Ancho de la ventana en píxeles (entero impar, predeterminado 11). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Tamaño de filtro Y",
                "description": "Alto de la ventana en píxeles (entero impar, predeterminado = filter_size_x). Alias: filtery."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "mean_filter": {
            "name": "Filtro de media",
            "description": "Calcula la media (promedio) en ventana móvil para cada píxel. Operación de suavizado fundamental que reduce el ruido local a la vez que difumina las transiciones bruscas. La salida representa la tendencia central local. Muy utilizado para el preprocesamiento, la reducción del ruido y el análisis multiescala.\n\nEl filtrado de media es la operación de suavizado de paso bajo más habitual. Es muy sensible a los valores atípicos (los valores extremos pueden distorsionar los resultados), por lo que el filtro de mediana es preferible para datos ruidosos. Computacionalmente eficiente. El tamaño del filtro controla el alcance del suavizado: uno pequeño (3×3) conserva el detalle y uno grande (31×31+) crea una superficie muy suavizada. Suele aplicarse de forma iterativa o a múltiples escalas para el análisis multirresolución.\n\nAplicaciones: (1) reducción básica del ruido, (2) preprocesamiento antes de la detección de elementos (suaviza los falsos positivos), (3) análisis multiescala (aplicar a 3×3, 11×11, 31×31), (4) suavizado temporal (combinación de escenas), (5) base para otras operaciones estadísticas. Compárelo con la mediana (no lineal, conserva los bordes) para mejorar la conservación de los bordes.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "filter_size_x": {
                "label": "Tamaño de filtro X",
                "description": "Ancho de la ventana en píxeles (entero impar, predeterminado 11). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Tamaño de filtro Y",
                "description": "Alto de la ventana en píxeles (entero impar, predeterminado = filter_size_x). Alias: filtery."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "median_filter": {
            "name": "Filtro de mediana",
            "description": "Calcula el valor de la mediana en ventana móvil para cada píxel, sustituyéndolo por el percentil 50 de la vecindad. Filtro de ruido robusto que conserva los bordes (no lineal). Especialmente eficaz para eliminar el ruido impulsivo (sal y pimienta) manteniendo límites nítidos. Los valores de salida son valores de píxel reales de la vecindad (no interpolados).\n\nEl filtrado de mediana es no lineal, una ventaja fundamental sobre el filtrado de media para la reducción del ruido, porque no crea valores nuevos ni difumina los bordes. Los tamaños de filtro grandes suavizan mucho a la vez que conservan las transiciones bruscas. Muy utilizado en teledetección, imagen médica y procesamiento de imágenes SAR. El coste computacional aumenta con el tamaño del filtro, pero en general es más rápido que los filtros bilateral o guiado.\n\nAplicaciones: (1) reducción del speckle en imágenes SAR (especialmente eficaz para la coherencia de fase), (2) eliminación del ruido sal y pimienta, (3) preprocesamiento antes de la detección de bordes (reduce los falsos bordes), (4) conservación de los límites en el preprocesamiento para la clasificación, (5) corrección radiométrica de valores atípicos. Flujo de trabajo típico: aplicar la mediana→salida con bordes realzados→umbral para la extracción de elementos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "filter_size_x": {
                "label": "Tamaño de filtro X",
                "description": "Ancho de la ventana en píxeles (entero impar, predeterminado 11). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Tamaño de filtro Y",
                "description": "Alto de la ventana en píxeles (entero impar, predeterminado = filter_size_x). Alias: filtery."
              },
              "sig_digits": {
                "label": "Dígitos significativos",
                "description": "Número de dígitos significativos usados para el filtrado de rango cuantizado (predeterminado 2)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "minimum_filter": {
            "name": "Filtro de mínimo",
            "description": "Calcula el valor mínimo en ventana móvil, revelando mínimos y depresiones locales. Operador de erosión en el procesamiento morfológico de imágenes. Útil para detectar fondos de valle, depresiones y elementos de altitud mínima. Sensible a un único valor atípico (un valor bajo en la ventana produce una salida baja).\n\nEl filtro de mínimo es el operador morfológico de «erosión»: reduce las regiones claras y expande las oscuras. Cuando se aplica repetidamente (erosión en varias pasadas), crea valles suavizados y los elementos aislados desaparecen. Combinado con el filtro de máximo (dilatación), permite las operaciones de apertura (erosión y luego dilatación) y cierre (dilatación y luego erosión). Suele utilizarse en la descomposición multiescala: compare el mínimo a 3×3, 11×11 y 31×31 para identificar las escalas de los elementos.\n\nAplicaciones: (1) erosión morfológica para el filtrado basado en el tamaño, (2) apertura mediante erosión→dilatación para eliminar pequeños objetos de ruido, (3) identificación de depresiones/valles en el terreno, (4) nivel de fondo local en batimetría/DEM, (5) análisis de elementos multiescala (comparar la erosión entre escalas). Flujo de trabajo típico: mínimo→comparación con el máximo→apertura o cierre según el tipo de elemento.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "filter_size_x": {
                "label": "Tamaño de filtro X",
                "description": "Ancho de la ventana en píxeles (entero impar, predeterminado 11). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Tamaño de filtro Y",
                "description": "Alto de la ventana en píxeles (entero impar, predeterminado = filter_size_x). Alias: filtery."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "non_local_means_filter": {
            "name": "Filtro de medias no locales",
            "description": "El filtrado de medias no locales realiza una potente eliminación del ruido promediando parches similares identificados en toda la imagen en lugar de píxeles vecinos, aprovechando la autosimilitud de la imagen para suprimir el ruido conservando las estructuras. La implementación identifica los parches similares a cada parche objetivo mediante la distancia euclidiana en el espacio de parches, pondera exponencialmente los parches similares según su similitud y promedia los parches ponderados. El algoritmo calcula: Fᵢ = (1/Z) Σⱼ exp(-d(Pᵢ, Pⱼ)²/h²) · Iⱼ, donde d mide la distancia entre parches, h controla el ancho de banda y Z normaliza. Entre sus características clave se incluyen una eliminación del ruido superior gracias a la búsqueda por similitud en lugar de basarse solo en la proximidad espacial, la eficacia con texturas complejas y detalles finos, la aplicabilidad a cualquier tipo de datos y un rendimiento probado en imágenes médicas, de satélite y fotográficas. El filtrado de medias no locales destaca en la restauración detallada de imágenes de satélite conservando la textura y la estructura finas, el promediado de pilas multitemporales para preparar la detección de cambios, la eliminación del ruido en datos de levantamiento muy ruidosos (ultrasónicos, hiperespectrales) y el realce de imágenes de levantamientos arqueológicos/aéreos. La interpretación de la salida requiere comprender que las regiones similares de toda la imagen contribuyen a cada píxel de salida; las regiones localmente disímiles contribuyen de forma despreciable. El tamaño del parche controla la conservación de los elementos (parches más grandes = resultados más suaves, parches más finos = más detalle); el ancho de banda h controla la ponderación de la similitud (h mayor = se incluyen más parches, h menor = requisitos de similitud más estrictos). Los rangos de salida coinciden con los de entrada; las estadísticas se desplazan hacia las medias regionales mientras las estructuras finas se mantienen. El coste computacional aumenta con el tamaño de la imagen y el radio del parche; la ejecución típica requiere un tiempo de procesamiento considerable para imágenes grandes. Supervise la progresión del filtrado mediante el PSNR o la inspección visual. Entre los artefactos habituales figuran el sobresuavizado de las texturas finas (aumente el tamaño del parche con cuidado) y un suavizado insuficiente en las regiones de mucho ruido (aumente el ancho de banda). Aplíquelo estratégicamente en flujos de trabajo que requieran la máxima reducción del ruido conservando los elementos a escala fina.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "search_radius": {
                "label": "Radio de búsqueda",
                "description": "Radio de la ventana de búsqueda en píxeles (predeterminado 5)."
              },
              "patch_radius": {
                "label": "Radio de parche",
                "description": "Radio del parche en píxeles (predeterminado 1)."
              },
              "h": {
                "label": "H",
                "description": "Parámetro de intensidad del filtrado (predeterminado 10.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "opening": {
            "name": "Apertura",
            "description": "Realiza una operación morfológica de apertura usando un elemento estructurante rectangular.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "filter_size_x": {
                "label": "Tamaño de filtro X",
                "description": "Ancho impar de la vecindad (predeterminado 11)."
              },
              "filter_size_y": {
                "label": "Tamaño de filtro Y",
                "description": "Alto impar de la vecindad (por defecto igual a filter_size_x)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "olympic_filter": {
            "name": "Filtro olímpico",
            "description": "El filtro olímpico implementa un suavizado basado en rangos que elimina el valor más alto y el más bajo de la vecindad de cada píxel y luego promedia los píxeles restantes. Este enfoque de filtrado robusto elimina los valores atípicos extremos (probablemente ruido o valores espurios) conservando la tendencia central. Formulación matemática: F = (1/(N-2)) Σ(I_sorted[2:N-1]), donde los valores ordenados de la vecindad excluyen el más alto y el más bajo. La implementación requiere ordenar vecindades pequeñas (computacionalmente eficiente), pero produce una reducción eficaz del ruido. Entre sus características clave se incluyen una estrategia sencilla de eliminación de valores atípicos, una reducción eficaz del ruido sal y pimienta, un filtrado consciente de los bordes (los bordes suelen aparecer como extremos) y la aplicabilidad a cualquier tipo de datos. El filtrado olímpico destaca en el preprocesamiento de imágenes de satélite ópticas (elimina píxeles aislados de nubes brillantes y sombras oscuras), el suavizado de DEM reduciendo los artefactos de ruido del levantamiento, la eliminación del ruido en imágenes térmicas (elimina los valores atípicos del sensor) y el preprocesamiento de imágenes de radar. La interpretación de la salida revela que las distribuciones de ruido simétricas (igual número de valores atípicos altos y bajos) se filtran de forma simétrica, mientras que las distribuciones sesgadas (más valores altos o bajos) producen un filtrado direccional. El tamaño de la vecindad controla el alcance del suavizado: una ventana de 3×3 elimina 2 extremos de 9 píxeles (filtrado leve); las ventanas más grandes filtran de forma más agresiva. Los valores de salida permanecen dentro del rango de entrada (la salida es el promedio de valores reales de la vecindad). Las estadísticas muestran una reducción controlada de la varianza dirigida específicamente a los valores atípicos. Las imágenes de diferencia (original - filtrada) resaltan los valores atípicos eliminados; las regiones concentradas de valores altos indican un aislamiento eficaz del ruido. Entre los artefactos habituales figuran un suavizado insuficiente si la frecuencia de valores atípicos es baja y el difuminado de los bordes si los píxeles de borde se clasifican sistemáticamente como extremos. Varias iteraciones permiten un suavizado progresivo: una sola pasada proporciona reducción del ruido; las pasadas repetidas intensifican el suavizado. Aplíquelo en flujos de trabajo rápidos de reducción del ruido que requieran un filtrado sencillo e interpretable; es especialmente eficaz para el ruido sal y pimienta en mosaicos multisensor.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "filter_size_x": {
                "label": "Tamaño de filtro X",
                "description": "Ancho de la vecindad en píxeles (entero impar, predeterminado 11)."
              },
              "filter_size_y": {
                "label": "Tamaño de filtro Y",
                "description": "Alto de la vecindad en píxeles (entero impar, predeterminado 11)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "percentile_filter": {
            "name": "Filtro de percentil",
            "description": "Calcula el rango percentil local de la elevación/el valor de la celda central dentro de una ventana móvil (0-100%). Análogo a Elevation Percentile para datos ráster genéricos. Mide la posición relativa: salida=0 indica un mínimo local, salida=100 indica un máximo local y salida=50 indica la mediana. Revela la posición local dentro de la distribución con independencia de los valores absolutos.\n\nEl filtrado por percentil permite un análisis relativo a la posición. Es útil para el análisis por capas: las celdas con un percentil alto (>80) en todas las bandas indican elementos «brillantes»; las de percentil bajo (<20) indican elementos «oscuros». Especialmente útil en el preprocesamiento para la clasificación, ya que separa la posición del terreno/la textura en lugar de solo la magnitud. Suele combinarse con filtros estadísticos para una caracterización multimétrica.\n\nAplicaciones: (1) clasificación relativa de brillo/oscuridad, (2) caracterización de texturas (varianza del percentil alta = rugoso, varianza baja = liso), (3) realce del contraste local (normalización basada en percentiles), (4) identificación de formas del relieve de forma similar al percentil de elevación, (5) análisis de texturas multibanda (aplicar el percentil a cada banda y comparar los patrones).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "filter_size_x": {
                "label": "Tamaño de filtro X",
                "description": "Ancho de la ventana en píxeles (entero impar, predeterminado 11). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Tamaño de filtro Y",
                "description": "Alto de la ventana en píxeles (entero impar, predeterminado = filter_size_x). Alias: filtery."
              },
              "sig_digits": {
                "label": "Dígitos significativos",
                "description": "Número de dígitos significativos usados para el filtrado de rango cuantizado (predeterminado 2)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "range_filter": {
            "name": "Filtro de rango",
            "description": "Calcula el rango en ventana móvil (máximo - mínimo), revelando la dispersión local de los valores con independencia del nivel medio. Métrica sencilla de heterogeneidad: rango alto = valores diversos, rango bajo = valores uniformes. Más sencilla que la desviación estándar pero igual de informativa para muchas aplicaciones, y más robusta frente a la forma de la distribución.\n\nEl rango es computacionalmente eficiente (solo requiere dos comparaciones). Es especialmente útil para detectar transiciones/límites donde los picos de rango indican zonas de contraste. Es menos sensible a la forma de la distribución que la desviación estándar (la desviación estándar resalta los valores atípicos; el rango solo utiliza los extremos). El rango normalizado (rango/media) permite la comparación entre bandas, del mismo modo que el coeficiente de variación permite la comparación entre escalas.\n\nAplicaciones: (1) cartografía de texturas/contraste (interpretación sencilla: rango alto = rugoso/contrastado), (2) detección de límites mediante los picos de rango, (3) alternativa computacionalmente eficiente a la desviación estándar, (4) control de calidad (fondo uniforme con rango bajo, zonas con elementos con rango alto), (5) rugosidad/variabilidad en datos genéricos. Flujo de trabajo típico: calcular el rango→umbral para identificar las zonas de transición→vectorizar los límites de rango alto.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "filter_size_x": {
                "label": "Tamaño de filtro X",
                "description": "Ancho de la ventana en píxeles (entero impar, predeterminado 11). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Tamaño de filtro Y",
                "description": "Alto de la ventana en píxeles (entero impar, predeterminado = filter_size_x). Alias: filtery."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "remove_spurs": {
            "name": "Eliminar espolones",
            "description": "Elimina los artefactos de ramificaciones cortas (espolones) de los elementos de un ráster binario mediante poda iterativa.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "max_iterations": {
                "label": "Iteraciones máximas",
                "description": "Número máximo de iteraciones de poda (predeterminado 10)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "savitzky_golay_2d_filter": {
            "name": "Filtro Savitzky-Golay 2D",
            "description": "Realiza un suavizado Savitzky-Golay 2D: un filtro basado en el ajuste de polinomios que conserva los elementos polinómicos locales. Ajusta un polinomio local a la vecindad y sustituye el valor central por el valor ajustado. Conserva los picos/valles mejor que el gaussiano. Útil para datos ruidosos en los que es importante conservar los elementos. Menos difuminado que el gaussiano con polinomios de orden bajo; el suavizado aumenta con el orden del polinomio. El filtrado Savitzky-Golay ajusta por mínimos cuadrados un polinomio local (normalmente cuadrático/cúbico) a la vecindad. El valor central se sustituye por el valor del polinomio. A diferencia de la mediana o el gaussiano, conserva los elementos que aparecen como estructuras polinómicas (picos, valles, crestas). Computacionalmente sencillo, pero más lento que una convolución simple. El orden del polinomio controla el equilibrio entre suavizado y conservación. Aplicaciones: (1) suavizar datos ruidosos conservando las estructuras de picos, (2) procesamiento de mallas de elevación (conserva la topografía de crestas/valles), (3) suavizado de datos espectrales (conserva los rasgos de absorción), (4) preprocesamiento con conservación de elementos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "window_size": {
                "label": "Tamaño de ventana",
                "description": "Tamaño impar de ventana (predeterminado 5). Actualmente admite 5 para orden polinómico 2."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "scharr_filter": {
            "name": "Filtro de Scharr",
            "description": "El filtro de Scharr es un operador de detección de bordes que mejora el filtro de Sobel mediante coeficientes de kernel optimizados, diseñados específicamente para reducir el sesgo direccional y proporcionar una invariancia a la rotación superior. El operador de Scharr emplea kernels de convolución de 3×3 con coeficientes enteros (3, 10, 3) optimizados empíricamente para las direcciones de borde de 0°, 45°, 90° y 135°, lo que proporciona una estimación del gradiente más precisa que los filtros de Sobel tradicionales, especialmente para elementos circulares y bordes girados. El filtro calcula simultáneamente el gradiente horizontal y la magnitud del gradiente, lo que permite una localización robusta de los bordes. Entre sus principales ventajas se incluyen una exactitud superior para los gradientes direccionales, un menor sesgo rotacional en comparación con Sobel y un cálculo eficiente con kernel de 3×3 que requiere una carga de memoria mínima. La salida incluye tanto la magnitud como, opcionalmente, los componentes direccionales. El filtro de Scharr destaca en la extracción de elementos, la detección de límites y los flujos de trabajo de control de calidad que requieren una alta exactitud direccional. Los casos de uso incluyen la extracción de huellas de edificios a partir de imágenes aéreas, la detección de redes viarias, la delimitación de límites de agua con una distorsión mínima y la identificación de lineamientos geológicos en datos de satélite. El filtro ofrece un rendimiento excepcional en la cartografía urbana, la detección de límites agrícolas y las aplicaciones de navegación autónoma. La interpretación de la salida requiere comprender que los valores de magnitud representan la intensidad del borde: los valores más altos indican transiciones más bruscas entre clases espectrales distintas. Los componentes direccionales revelan la orientación predominante de los bordes (horizontal, diagonal o vertical), útil para el análisis de lineamientos. Para rásteres multibanda, aplíquelo por separado a cada banda o utilice un índice calculado. Los valores de fondo aparecen oscuros en la salida y los bordes fuertes aparecen brillantes. La comparación del RMSE con bordes de referencia valida el rendimiento del filtro. Escale la salida a 0-255 para una visualización estándar o conserve el formato de coma flotante para el análisis cuantitativo.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "clip_tails": {
                "label": "Recortar colas",
                "description": "Porcentaje opcional de recorte simétrico de colas (0-40)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "standard_deviation_filter": {
            "name": "Filtro de desviación estándar",
            "description": "Calcula la desviación estándar en ventana móvil, midiendo la variación/dispersión local de los valores. Desviación estándar alta = valores diversos (rugoso/heterogéneo), baja = valores uniformes (liso/homogéneo). Revela patrones de textura, rugosidad y variabilidad. Fundamental para la cuantificación de la incertidumbre y la evaluación de la calidad.\n\nLa desviación estándar es más robusta que el rango para caracterizar la variación local (no la sesga un único valor atípico). Permite clasificar las zonas por textura: pendientes pronunciadas (desviación estándar alta), pendientes suaves (baja); bosques (alta), pastizales (baja). Suele normalizarse (coeficiente de variación = desviación estándar/media) para permitir la comparación entre datos con rangos de valores diferentes. Puede calcularse a partir del histograma (varianza = media_de_los_cuadrados - cuadrado_de_la_media).\n\nAplicaciones: (1) cartografía de texturas (análisis de rugosidad/heterogeneidad), (2) cuantificación de la incertidumbre en datos ruidosos, (3) evaluación de la calidad (fondo uniforme = desviación estándar baja, zonas ricas en elementos = alta), (4) confianza de la clasificación (desviación estándar alta = clases mixtas/inciertas), (5) heterogeneidad multibanda (apilar las desviaciones estándar de cada banda). Flujo de trabajo típico: calcular la desviación estándar a múltiples escalas→comparar los cambios de patrón entre escalas→identificar las escalas características.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "filter_size_x": {
                "label": "Tamaño de filtro X",
                "description": "Ancho de la ventana en píxeles (entero impar, predeterminado 11). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Tamaño de filtro Y",
                "description": "Alto de la ventana en píxeles (entero impar, predeterminado = filter_size_x). Alias: filtery."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "thicken_raster_line": {
            "name": "Engrosar líneas ráster",
            "description": "Engrosa los segmentos de línea ráster diagonales para evitar filtraciones en diagonal.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "tophat_transform": {
            "name": "Transformada de sombrero de copa",
            "description": "Realiza una transformación morfológica top-hat blanca o negra.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "filter_size_x": {
                "label": "Tamaño de filtro X",
                "description": "Ancho impar de la vecindad (predeterminado 11)."
              },
              "filter_size_y": {
                "label": "Tamaño de filtro Y",
                "description": "Alto impar de la vecindad (por defecto igual a filter_size_x)."
              },
              "variant": {
                "label": "Variante",
                "description": "Variante de sombrero de copa: white (predeterminado) o black."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "total_filter": {
            "name": "Filtro total",
            "description": "Calcula la suma (total) en ventana móvil de los valores de los píxeles de la vecindad. Integra la intensidad de la señal local. Las aplicaciones dependen de la semántica de los datos: para recuentos/densidades, el total revela patrones de densidad local; para la precipitación, el total revela la acumulación a escala de cuenca; para la reflectancia, el total es proporcional al tamaño local del objetivo.\n\nEl filtrado de total tiene distintas interpretaciones según el dominio. En datos de recuento/población, el total revela agrupamientos y puntos calientes. En datos de elevación, el total rara vez se utiliza (la suma no tiene significado geomorfológico). En el análisis espectral, el total puede revelar la intensidad de la señal multibanda. Suele utilizarse como paso intermedio (p. ej., dividir por el número de celdas de la vecindad para calcular la media, o comparar con los totales vecinos para detectar la heterogeneidad local).\n\nAplicaciones: (1) detección de puntos calientes en datos de recuento (total alto = agrupamientos), (2) modelos de acumulación a escala de cuenca, (3) integración de mediciones distribuidas, (4) cálculo intermedio (total/N = media), (5) agregación de la intensidad de la señal en mosaicos multisensor.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "filter_size_x": {
                "label": "Tamaño de filtro X",
                "description": "Ancho de la ventana en píxeles (entero impar, predeterminado 11). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Tamaño de filtro Y",
                "description": "Alto de la ventana en píxeles (entero impar, predeterminado = filter_size_x). Alias: filtery."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "unsharp_masking": {
            "name": "Máscara de enfoque",
            "description": "La máscara de enfoque (unsharp masking) aumenta la nitidez de la imagen restando a la imagen original una versión suavizada (de paso bajo), lo que realza los bordes y los detalles finos. La transformación matemática es I_sharp = I_original + w·(I_original - I_smooth), donde w es el peso de enfoque que controla la intensidad del realce. El proceso aísla los componentes de alta frecuencia y los amplifica, separando eficazmente el detalle de la variación tonal amplia. Entre sus características clave se incluyen un control flexible de los parámetros (el radio de desenfoque y el peso permiten controlar el detalle), una eficiencia computacional gracias a la reutilización del suavizado gaussiano, un realce interpretable (peso=0 devuelve el original; peso=1 da un paso alto real; peso>1 proporciona un enfoque agresivo) y la eficacia con datos multiespectrales. La máscara de enfoque destaca en la preparación de imágenes de satélite para la interpretación manual (realza el terreno sutil, la vegetación y las infraestructuras), el realce de productos derivados de LiDAR (aumenta la nitidez de DEM y métricas de vegetación), la mejora de la calidad de las ortofotos para la visibilidad de los elementos y el realce de imágenes arqueológicas/de levantamientos. La interpretación de la salida requiere comprender que los valores realzados se concentran en los bordes; las regiones homogéneas permanecen sin cambios. El parámetro de peso controla la magnitud del realce: w=0.5-1.0 proporciona un realce sutil; w=1.0-2.0 proporciona un enfoque moderado; w>2.0 produce resultados agresivos, potencialmente cargados de artefactos. El radio de desenfoque controla la escala de los elementos: un radio menor (3-5 píxeles) realza la textura fina; un radio mayor (10-20 píxeles) realza los elementos moderados. Los valores de salida pueden superar el rango de entrada; normalmente es necesario recortarlos. Entre los artefactos figuran halos alrededor de los bordes fuertes (más pronunciados cuanto mayor es el peso o el radio), ruido amplificado si el origen es ruidoso y posibles colores falsos en el enfoque multiespectral. Verifique el realce mediante imágenes de diferencia. Aplíquelo de forma selectiva en flujos de trabajo de visualización; evítelo antes de análisis automatizados sensibles a los cambios en el rango de salida.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "sigma": {
                "label": "Sigma",
                "description": "Sigma gaussiano usado por la máscara de desenfoque (0.5-20.0, predeterminado 0.75)."
              },
              "amount": {
                "label": "Cantidad",
                "description": "Multiplicador de la cantidad de enfoque aplicado al residuo (predeterminado 100.0)."
              },
              "threshold": {
                "label": "Umbral",
                "description": "Residuo absoluto mínimo a enfocar (predeterminado 0.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "user_defined_weights_filter": {
            "name": "Filtro de pesos definidos por el usuario",
            "description": "El filtro de pesos definidos por el usuario proporciona la máxima flexibilidad para el análisis de convolución personalizado al aceptar coeficientes ponderados arbitrarios para los píxeles de la vecindad, lo que permite implementar operadores especializados, kernels específicos del dominio y algoritmos de nivel de investigación sin necesidad de modificar la herramienta ni de software especializado. Los usuarios especifican las dimensiones del kernel (normalmente 3×3 o 5×5), asignan pesos de coma flotante a cada posición y, opcionalmente, designan métodos de manejo de los bordes (reflexión, envoltura, relleno constante). Este filtro aplica el kernel personalizado a todo el ráster mediante las matemáticas de convolución estándar: cada píxel de salida es igual a la suma de los vecinos ponderados, lo que permite tanto filtros tradicionales de procesamiento de imágenes como kernels analíticos personalizados. Entre sus características clave se incluyen la personalización completa para aplicaciones de investigación, la compatibilidad con operaciones tanto de realce como de análisis, la compatibilidad con kernels normalizados y no normalizados y la conservación de la precisión de coma flotante durante todo el cálculo. Los casos de uso abarcan el filtrado espacial avanzado para índices espectrales especializados, la implementación de operadores experimentales para la validación de algoritmos, kernels personalizados de análisis de texturas, agregaciones ponderadas de vecindad para el análisis multicriterio y la aplicación estandarizada de kernels en conjuntos de datos diversos. Las aplicaciones incluyen la creación de prototipos en la investigación académica, la evaluación de algoritmos en la industria, la personalización regional de las cadenas de procesamiento y los estudios de comparación del rendimiento. La interpretación de la salida depende por completo de los coeficientes definidos por el usuario; kernels distintos producen resultados fundamentalmente diferentes. Los kernels normalizados (la suma de los pesos es 1.0) conservan los rangos de valores, lo que es útil para el suavizado; los kernels no normalizados (que normalmente suman cero) resaltan las diferencias, lo que es útil para la detección de bordes/derivadas. Los usuarios deben validar las propiedades del kernel (signo, magnitud y suma de los coeficientes) antes de aplicarlo en producción. Documentar las especificaciones del kernel es esencial para obtener flujos de trabajo reproducibles. Los rangos de valores de salida dependen del diseño del kernel; la documentación debe especificar las características de salida esperadas y los requisitos de escalado.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "weights": {
                "label": "Pesos",
                "description": "Pesos del kernel 2D como matrices anidadas."
              },
              "kernel_center": {
                "label": "Centro del kernel",
                "description": "Modo de centro del kernel: center, upper-left, upper-right, lower-left, lower-right."
              },
              "normalize_weights": {
                "label": "Normalizar pesos",
                "description": "Si es verdadero, normaliza por la suma local de los pesos activos."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "wiener_filter": {
            "name": "Filtro de Wiener",
            "description": "El filtro de Wiener realiza una reducción adaptativa del ruido minimizando el error cuadrático medio entre la salida filtrada y la señal verdadera, suponiendo que se conocen las propiedades estadísticas de la señal y del ruido. La implementación estima las varianzas locales de la señal y del ruido dentro de ventanas móviles y calcula coeficientes de filtro que equilibran la supresión del ruido con la conservación del detalle: F = μ + (σ² - σₙ²)/σ² · (I - μ), donde μ es la media local, σ² es la varianza de la señal y σₙ² es la varianza del ruido. Esta adaptación basada en los datos garantiza que la intensidad del filtrado responda a las características locales de la imagen. Entre sus características clave se incluyen la adaptación automática a las estadísticas locales (las regiones planas se suavizan intensamente; las regiones detalladas conservan su estructura), una eficacia probada en imágenes ópticas y SAR, parámetros interpretables basados en los supuestos del modelo de ruido y la viabilidad computacional gracias a aproximaciones separables. El filtrado de Wiener destaca en el preprocesamiento de imágenes de satélite en las que el ruido varía espacialmente, la reducción del speckle SAR conservando los objetivos puntuales, los datos multiespectrales sin moteado para la cartografía de la vegetación y la eliminación del ruido en la fusión radar-óptica. La interpretación de la salida muestra que las regiones de alta varianza (detalladas) se filtran mínimamente, mientras que las regiones de baja varianza (ruidosas) se filtran de forma agresiva. La estimación de la varianza del ruido afecta a la salida: una varianza del ruido subestimada produce un suavizado insuficiente; una varianza sobreestimada provoca un sobresuavizado y pérdida de detalle. Los rangos de salida se aproximan a los de entrada; examine las imágenes de diferencia (original - filtrada) para verificar la reducción del ruido. La relación señal-ruido de pico (PSNR) y el índice de similitud estructural (SSIM) cuantifican la eficacia del filtrado. Los umbrales de varianza local indican el impacto del procesamiento: las regiones con una relación de varianza detectada > 5 se filtran sustancialmente; las relaciones < 1 se filtran mínimamente. Entre los errores habituales figuran una estimación inexacta de la varianza del ruido (realice un análisis de fotograma oscuro o de regiones homogéneas para la estimación) y una selección del tamaño de ventana que afecte a la localización. Aplíquelo antes de la clasificación o de la extracción de características para reducir la clasificación errónea causada por el ruido.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "radius": {
                "label": "Radio",
                "description": "Radio de la ventana local de Wiener en píxeles (predeterminado 2)."
              },
              "noise_variance": {
                "label": "Varianza del ruido",
                "description": "Varianza del ruido aditivo opcional. Si se omite, se estima a partir del mapa de varianza local."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "cloude_pottier_decomposition": {
            "name": "Descomposición de Cloude-Pottier",
            "description": "La descomposición de Cloude-Pottier diagonaliza la matriz de coherencia de los datos SAR cuadripolarimétricos, extrayendo los valores y vectores propios que caracterizan los mecanismos de dispersión. La entropía, la anisotropía y el ángulo alfa medio calculados a partir de los vectores propios caracterizan, respectivamente, el desorden de la dispersión, el predominio del mecanismo y el tipo de dispersión. El espacio de parámetros H-alfa permite una clasificación física de los mecanismos de dispersión independiente de las variaciones de amplitud, aprovechando la información de fase polarimétrica. Características clave: descomposición de SAR cuadripolarimétrico; aprovechamiento de la información de fase; parámetros de dispersión físicamente significativos; separa los mecanismos de dispersión; robusta frente al speckle de amplitud; permite la clasificación y la interpretación de objetivos. Casos de uso: reconocimiento de objetivos SAR; estimación de la biomasa forestal; caracterización de humedales; detección de barcos/vehículos; clasificación de la cobertura del suelo; interpretación de datos SAR polarimétricos. Interpretación de la salida: la salida incluye la entropía (grado de desorden; 0=dispersión ordenada, 1=aleatoria), la anisotropía (predominio del mecanismo, 0-1) y el ángulo alfa (tipo de dispersión: ~45°=dipolo, ~30°=superficie, ~60°=volumen). Los diagramas de dispersión H-alfa revelan patrones de agrupamiento que indican los tipos de dispersión. El doble rebote (urbano) presenta un alfa alto; la dispersión superficial (agua) presenta un alfa bajo; la dispersión de volumen (bosque) presenta valores intermedios.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Rásteres de matriz: diag3 [m11,m22,m33], full3x3 compacto [m11,m22,m33,m12,m13,m23] o 9 rásteres completos en orden de filas."
              },
              "matrix_format": {
                "label": "Formato de matriz",
                "description": "Formato de la matriz de entrada: diag3 (predeterminado con 3 rásteres) o full3x3."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de salida opcional de 3 bandas [H, A, alpha_deg]."
              }
            }
          },
          "enhanced_lee_filter": {
            "name": "Filtro de Lee mejorado",
            "description": "El filtro de Lee mejorado combina el modelo multiplicativo de Lee con una estimación refinada de la varianza y un procesamiento multiescala, logrando una reducción del speckle superior a la vez que conserva los detalles finos y los bordes en las imágenes SAR. La implementación emplea estadísticas locales calculadas mediante ventanas de tamaño adaptativo, incorpora una detección de bordes basada en el laplaciano y aplica parámetros de filtro espacialmente variables. La formulación mejorada aplica: F = μ + w·(I - μ), donde w se adapta a la proximidad de los bordes: w→0 cerca de los bordes (filtrado mínimo), w→1 en las regiones homogéneas (filtrado agresivo). Entre sus características clave se incluyen un procesamiento adaptativo a los bordes (conserva los límites), la adaptación multiescala de los parámetros, una mejor conservación de los objetivos que el Lee estándar y la eficacia con SAR de mucho ruido. El filtrado de Lee mejorado destaca en escenas SAR complejas con numerosos elementos, en aplicaciones de cartografía de inundaciones en las que la localización de los bordes es fundamental, en la detección de edificios a partir de SAR urbano y en el análisis de cambios multitemporal. La interpretación de la salida revela la conservación de los bordes mediante un filtrado reducido cerca de las transiciones: los píxeles de los límites conservan una mayor varianza que los píxeles alejados. La adaptación multiescala se hace evidente en el análisis del histograma, que muestra picos pronunciados correspondientes a las clases de la escena. Los rangos de salida coinciden con los de entrada; la comparación con el Lee estándar muestra un menor difuminado de los bordes y el mantenimiento de la nitidez de los objetivos. La calidad de la detección de bordes influye directamente en la salida: los bordes fuertes permiten una buena conservación de los límites; los bordes débiles pueden inducir un sobresuavizado. Las estadísticas muestran una reducción controlada de la varianza que equilibra la supresión del ruido con la conservación del detalle. Entre los artefactos habituales figuran una posible apariencia de bloques si las transiciones multiescala se hacen visibles y una sobreconservación si la detección de bordes es demasiado agresiva. Supervise la calidad del mapa de bordes para validar el comportamiento del filtrado. Aplíquelo en cadenas completas de análisis SAR en las que haya que conservar múltiples elementos y los bordes deban permanecer nítidos, algo especialmente importante en el preprocesamiento para aprendizaje automático que requiere datos de entrenamiento con límites de elementos claros.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "filter_size_x": {
                "label": "Tamaño de filtro X",
                "description": "Ancho de la vecindad en píxeles (entero impar, predeterminado 11)."
              },
              "filter_size_y": {
                "label": "Tamaño de filtro Y",
                "description": "Alto de la vecindad en píxeles (entero impar, predeterminado 11)."
              },
              "enl": {
                "label": "ENL",
                "description": "Parámetro de número equivalente de vistas para la ponderación por razón sigma (predeterminado 4.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "freeman_durden_decomposition": {
            "name": "Descomposición de Freeman-Durden",
            "description": "La descomposición de Freeman-Durden cuantifica las contribuciones de los mecanismos de dispersión a partir de SAR cuadripolarimétrico mediante una descomposición en una base ortogonal en componentes de reflexión superficial, doble rebote (urbano/diedro) y volumen (vegetación/medios aleatorios). La optimización por mínimos cuadrados no negativos restringe las fracciones de potencia para garantizar su realizabilidad física y su interpretabilidad. Los mapas de potencia de salida están directamente relacionados con las propiedades del terreno: un alto predominio superficial indica suelo desnudo/agua, un doble rebote alto indica estructuras urbanas y un volumen alto indica bosque/vegetación. Características clave: componentes de dispersión físicamente interpretables; firmas específicas del terreno; optimización restringida; admite SAR cuadripolarimétrico; robusta frente al speckle; permite una clasificación específica de objetivos. Casos de uso: clasificación urbano-rural; estimación de la biomasa forestal; detección de la humedad del suelo; detección de inundaciones; seguimiento de la fenología de los cultivos; cartografía de la cobertura del suelo. Interpretación de la salida: la potencia superficial indica reflexión especular en terreno seco/agua; la potencia de doble rebote indica estructuras artificiales/zonas urbanas; la potencia de volumen indica vegetación/bosque. Las combinaciones de componentes permiten discriminar la cobertura del suelo: volumen alto + doble rebote bajo indica bosque; doble rebote alto + volumen bajo indica zona urbana; un equilibrio superficie/volumen indica terreno mixto.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Rásteres de matriz: diag3 [m11,m22,m33], full3x3 compacto [m11,m22,m33,m12,m13,m23] o 9 rásteres completos en orden de filas."
              },
              "matrix_format": {
                "label": "Formato de matriz",
                "description": "Formato de la matriz de entrada: diag3 (predeterminado con 3 rásteres) o full3x3."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de salida opcional de 3 bandas [surface, double_bounce, volume]."
              },
              "output_clip_mask": {
                "label": "Máscara de recorte de salida",
                "description": "Ráster opcional de máscara de recorte de salida (1 donde ocurrió recorte/renormalización no física)."
              }
            }
          },
          "frost_filter": {
            "name": "Filtro de Frost",
            "description": "El filtro de Frost implementa la reducción del speckle SAR mediante un modelo de ruido multiplicativo y estadísticas locales adaptativas, diseñado específicamente para imágenes de radar en las que el speckle sigue una distribución Gamma en lugar de un ruido gaussiano. La implementación calcula la media y la varianza locales y luego aplica una ponderación multiplicativa adaptativa: F = I · exp(-variance/(2·mean²)·distance²), donde la distancia mide la desviación del píxel respecto a la media local. Esta formulación reduce la intensidad del speckle de forma inversa a la coherencia estimada. Entre sus características clave se incluyen una adaptación específica para SAR (modelo de ruido multiplicativo en lugar de aditivo), la conservación de los objetivos puntuales y los bordes (elementos coherentes), una adaptación basada en la varianza local que permite ajustar la intensidad y una eficacia probada en datos SAR de polarización simple y multipolarización. El filtrado de Frost destaca en el preprocesamiento de imágenes SAR para la clasificación (seguimiento agrícola, cartografía de usos del suelo), la fusión SAR-óptica ponderada por la coherencia, la cartografía de inundaciones a partir de radar con cobertura nubosa y los flujos de trabajo de detección de cambios con radar de apertura sintética. La interpretación de la salida muestra que las regiones de alta varianza (posibles objetivos coherentes) se filtran mínimamente, mientras que las regiones de baja varianza (dominadas por el speckle) se filtran de forma agresiva. Los rangos de salida típicos coinciden con los de entrada; a menudo se aplica un escalado logarítmico (decibelios) antes o después del filtrado para la visualización. La relación varianza/media controla directamente la intensidad del filtro: una relación > 0.5 indica un speckle probable; una relación < 0.1 sugiere objetivos coherentes. Entre los artefactos de salida figuran una posible pérdida de detalle si la estimación de la varianza no es fiable y un sesgo direccional en los elementos orientados. La verificación mediante mapas de coherencia confirma la conservación de los bordes en las zonas de alta coherencia. Supervise las estadísticas de salida: la media debería estabilizarse a lo largo de las iteraciones de filtrado y la varianza debería disminuir sustancialmente. Aplíquelo antes de la clasificación para mejorar la exactitud categórica. Combínelo con un posprocesamiento morfológico para refinar los límites de los objetos y eliminar los fragmentos residuales de speckle.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "radius": {
                "label": "Radio",
                "description": "Radio de la ventana local en píxeles (predeterminado 2)."
              },
              "damping_factor": {
                "label": "Factor de amortiguación",
                "description": "Factor de amortiguación de Frost que controla el decaimiento exponencial (predeterminado 2.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "gamma_map_filter": {
            "name": "Filtro Gamma MAP",
            "description": "El filtro Gamma Map realiza la reducción del speckle SAR mediante un modelo estadístico de distribución Gamma, teniendo en cuenta explícitamente las características multiplicativas del speckle de la señal de radar mediante una adaptación paramétrica. La implementación estima los parámetros locales de la distribución Gamma (forma α y escala β) a partir de las estadísticas de la imagen y luego filtra mediante una función de ponderación que respeta la distribución: F = I · [1 - (1-L/N)/(1 + L/N)·√(1 + N/L²)], donde L es el número equivalente de looks (medida de coherencia) y N es el parámetro estimado. Entre sus características clave se incluyen unas estadísticas SAR teóricamente rigurosas (la distribución Gamma es el estándar para el radar), la estimación automática del número de looks con una intervención mínima del usuario, una conservación de los bordes superior a la de los filtros uniformes y la aplicabilidad a SAR de un solo look y multilook. El filtrado Gamma Map destaca en la eliminación del ruido de pilas SAR multitemporales para la detección de cambios en series temporales, el realce de la coherencia de fase en SAR interferométrico (InSAR), el preprocesamiento para la descomposición SAR polarimétrica y la normalización de la retrodispersión SAR en aplicaciones forestales. La interpretación de la salida revela que la intensidad del filtro se adapta a la coherencia de la escena: las regiones de alta coherencia (α grande) se filtran suavemente, conservando los objetivos; las regiones de baja coherencia (α pequeño) se filtran de forma agresiva, suprimiendo el speckle. El número equivalente de looks L indica la eficacia del filtrado: L=1 (filtrado mínimo) conserva todo el detalle; L>5 produce un suavizado sustancial. El escalado de la salida se mantiene en las unidades de entrada; la conversión logarítmica facilita la visualización. Las reducciones típicas de la varianza de salida oscilan entre el 50 y el 80%, según el carácter de la escena y la selección del número de looks. Supervise los histogramas de salida en busca de la firma residual del speckle; las distribuciones bimodales sugieren una buena separación de los componentes de la escena. Entre los artefactos figuran un posible bandeado en los elementos orientados o una ligera degradación de la textura si L se sobreestima. Valide el filtrado con la verdad de campo en las áreas de entrenamiento. Aplíquelo estratégicamente en la clasificación SAR polarimétrica o en el filtrado de fase InSAR que requieran un realce ponderado por la coherencia.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "radius": {
                "label": "Radio",
                "description": "Radio de la ventana local en píxeles (predeterminado 2)."
              },
              "enl": {
                "label": "ENL",
                "description": "Número equivalente de vistas (predeterminado 1.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "h_alpha_wisart_classification": {
            "name": "Clasificación H-Alpha Wisart",
            "description": "La clasificación H/α/A-Wishart combina una zonificación no supervisada mediante la partición del espacio de parámetros H/α/A con un agrupamiento estadístico de Wishart para clasificar automáticamente los datos SAR polarimétricos en 9 zonas físicamente significativas que corresponden a clases de mecanismos de dispersión. El algoritmo recibe los parámetros de entropía (H), anisotropía (A) y alfa (α) de la descomposición de Cloude-Pottier y divide el espacio de características 3D (H,A,α) en 9 regiones mediante umbrales fijos: la zona 1 (H bajo, α~20°) representa la reflexión de Bragg en superficies secas; la zona 5 (H~0.7, α~45°) indica dispersión de volumen isótropa en bosques; la zona 9 (H alto, α~80°) representa la dispersión diédrica (doble rebote) de estructuras urbanas. Dentro de cada zona, el agrupamiento de Wishart refina opcionalmente la clasificación calculando distancias estadísticas en el espacio polarimétrico multivariante, lo que mejora la discriminación de mecanismos similares. Entre sus características clave se incluyen una clasificación automática y no supervisada que no requiere muestras de entrenamiento; 9 clases físicamente interpretables con definiciones estandarizadas que permiten la comparabilidad global; un funcionamiento opcional en dos modos (solo umbrales para mayor velocidad, umbrales+Wishart para mayor exactitud); y métricas de confianza integradas basadas en la distancia a los límites de las zonas y en la verosimilitud de Wishart. La herramienta acepta imágenes (H,A,α) precalculadas o llama automáticamente a la descomposición de Cloude-Pottier si se proporcionan matrices brutas. Los principales casos de uso abarcan la segmentación de imágenes SAR y la generación de mapas a partir de datos polarimétricos, la clasificación no supervisada de tipos de cobertura del suelo (agua, agricultura, bosque, urbano) directamente a partir de matrices de coherencia SAR, la evaluación rápida de la calidad de los datos polarimétricos mediante las distribuciones de ocupación de las zonas y la detección de cambios que revela transiciones de los mecanismos de dispersión indicativas de alteraciones de la cobertura del suelo. Interpretación de la salida: el mapa de 9 clases corresponde directamente a tipos de terreno; las zonas pueden agregarse en categorías más amplias (agua/especular = zonas 1-2, vegetación/volumen = zonas 4-6, urbano/diedro = zonas 7-9). Los píxeles no clasificados (clase 0) indican firmas polarimétricas inusuales que requieren investigación.",
            "params": {
              "h_raster": {
                "label": "Ráster H",
                "description": "Ráster de entropía (H) de entrada de la descomposición de Cloude-Pottier (rango 0-1)."
              },
              "alpha_raster": {
                "label": "Ráster alfa",
                "description": "Ráster alfa (α) de entrada de la descomposición de Cloude-Pottier (grados, 0-90)."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta alfa para que coincida con H cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de salida opcional con etiquetas de 9 clases (1-9)."
              }
            }
          },
          "kuan_filter": {
            "name": "Filtro de Kuan",
            "description": "Realiza un filtrado del speckle de Kuan para imágenes SAR/radar mediante un enfoque paramétrico que estima las medias y la varianza locales. Ponderación adaptativa basada en la varianza del ruido y la varianza local de la imagen. Similar a Lee, pero con supuestos estadísticos distintos. Método de procesamiento SAR operativo ampliamente utilizado. Equilibra la eficiencia computacional con buenos resultados en datos SAR variados. El filtrado de Kuan supone estadísticas gaussianas con un modelo de speckle multiplicativo. Se adapta a la varianza local, distinguiendo entre la variación de la señal y el speckle. Especialmente eficaz para imágenes SAR heterogéneas (mezcla de elementos brillantes y oscuros). Coste computacional razonable. Representa un compromiso práctico entre sofisticación y coste computacional. Estándar en muchos sistemas de procesamiento SAR. Aplicaciones: (1) eliminación operativa del speckle SAR, (2) preprocesamiento SAR con retrodispersión mixta, (3) preprocesamiento de RadarSat/Sentinel-1, (4) procesamiento SAR rutinario. Parámetros típicos: filter_size=5×7 a 7×7.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "radius": {
                "label": "Radio",
                "description": "Radio de la ventana local en píxeles (predeterminado 2)."
              },
              "enl": {
                "label": "ENL",
                "description": "Número equivalente de vistas (predeterminado 1.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "refined_lee_filter": {
            "name": "Filtro de Lee refinado",
            "description": "El filtro de Lee refinado mejora el filtrado de Lee estándar mediante una estimación mejorada de la coherencia y adaptaciones que conservan los bordes, usando estadísticas locales refinadas y un análisis direccional para lograr una reducción del speckle superior. La implementación amplía el modelo de Lee detectando la orientación de los bordes, aplicando ventanas direccionales alineadas con los límites y calculando estimaciones refinadas de la coherencia. Matemáticamente: F = μ + √(σ_p²/(σ_I²))·(I - μ), con un cálculo de la varianza alineado direccionalmente. Este refinamiento mejora la conservación de los bordes manteniendo la supresión del speckle. Entre sus características clave se incluyen la sensibilidad direccional (adapta la dirección del filtrado a las estructuras de la imagen), una estimación mejorada de la coherencia (utiliza ventanas anisótropas), una conservación de los bordes superior a la del Lee estándar y la eficacia en escenas SAR complejas. El filtrado de Lee refinado destaca en la detección de cambios que requiere límites nítidos, la preparación de mapas de coherencia InSAR, el procesamiento SAR polarimétrico en el que la conservación de los objetivos es fundamental y el análisis SAR forestal que distingue los árboles del fondo. La interpretación de la salida revela que el filtrado respeta la orientación de los bordes: los bordes horizontales se filtran horizontalmente, los verticales verticalmente y los diagonales diagonalmente. Esta adaptación direccional minimiza el filtrado a través de los límites reales. Las estimaciones de coherencia suelen ser más precisas que las del Lee estándar, lo que reduce los artefactos de filtrado. Los rangos de salida coinciden con los de entrada; la adaptación direccional se hace evidente mediante la inspección visual (los bordes permanecen más nítidos que con el Lee estándar). Las estadísticas muestran una mayor conservación de las regiones de alto contraste. Los componentes direccionales revelan la orientación de la estructura de la escena; un fuerte sesgo direccional indica la orientación predominante de los elementos. Los artefactos habituales se reducen en comparación con el Lee estándar, especialmente cerca de los bordes y de los elementos complejos. Entre los artefactos figuran una posible sobreadaptación si falla la estimación direccional y artefactos de ventana direccional en los límites débiles. Supervise los mapas de coherencia para validar la exactitud de la detección de bordes. Aplíquelo estratégicamente en la clasificación SAR en la que deban conservarse las estructuras direccionales (p. ej., bosques, parcelas agrícolas alineadas).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "filter_size_x": {
                "label": "Tamaño de filtro X",
                "description": "Ancho de la vecindad en píxeles (entero impar, predeterminado 11)."
              },
              "filter_size_y": {
                "label": "Tamaño de filtro Y",
                "description": "Alto de la vecindad en píxeles (entero impar, predeterminado 11)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "wisart_iterative_clustering": {
            "name": "Agrupamiento iterativo Wisart",
            "description": "El agrupamiento iterativo de Wishart realiza una clasificación no supervisada de datos SAR polarimétricos refinando iterativamente los centros de los clústeres mediante la métrica de distancia estadística compleja de Wishart, que mide la similitud entre distribuciones de probabilidad polarimétricas multivariantes. El algoritmo se inicializa a partir de las zonas de la descomposición H/α (que proporcionan 9 clústeres semilla con una interpretación física conocida) y luego entra en un bucle similar al de expectación-maximización: (1) calcula la distancia de Wishart desde la matriz de coherencia estimada de cada píxel hasta el prototipo de cada clúster; (2) reasigna los píxeles al clúster más cercano; (3) actualiza los prototipos de los clústeres promediando las matrices de los píxeles asignados; (4) itera hasta la convergencia (tasa de reasignación de píxeles <convergence_threshold) o hasta alcanzar max_iterations. Entre sus características clave se incluyen un marco estadístico de valores complejos que maneja adecuadamente la estructura de los datos polarimétricos, a diferencia de la distancia euclidiana; la inicialización automática a partir de zonas H/α interpretables, que reduce la dependencia de semillas aleatorias; la supervisión de la convergencia por píxel, que permite orientar las iteraciones de forma adaptativa; la entrada opcional de (H,α) precalculados o el cálculo automático de las matrices a partir de entradas de coherencia brutas; y una robustez integrada frente al speckle de un solo look gracias a la compatibilidad con el procesamiento multilook. La herramienta admite formatos de matriz tanto convencionales como compactos. Los principales casos de uso abarcan la clasificación de imágenes SAR polarimétricas que produce mapas de cobertura del suelo refinados más allá de la partición H/α de 9 zonas, el refinamiento iterativo de una clasificación no supervisada inicial para la cartografía, la evaluación automatizada de la calidad de los datos polarimétricos mediante métricas de estabilidad de los clústeres y la clasificación SAR de series temporales que permite detectar cambios temporales mediante el análisis de transiciones entre clústeres. Interpretación de la salida: mapa de clústeres refinado (normalmente de 3 a 9 clases según la convergencia) que muestra grupos de mecanismos de dispersión bien separados. El historial de convergencia proporciona una métrica de confianza: una convergencia temprana y rápida indica una separación de clases estable; una convergencia lenta sugiere píxeles ambiguos que se beneficiarían de un análisis multivista o de detección de cambios. La integración con las zonas H/α permite elaborar la leyenda: mantenga la correspondencia con las zonas H/α siempre que sea posible para conservar la interpretabilidad.",
            "params": {
              "h_raster": {
                "label": "Ráster H",
                "description": "Ráster de entropía (H) de entrada (rango 0-1)."
              },
              "alpha_raster": {
                "label": "Ráster alfa",
                "description": "Ráster alfa (α) de entrada (grados, 0-90)."
              },
              "max_iterations": {
                "label": "Iteraciones máximas",
                "description": "Número máximo de iteraciones de agrupamiento (predeterminado 10)."
              },
              "convergence_threshold": {
                "label": "Umbral de convergencia",
                "description": "Criterio de convergencia: fracción de píxeles sin cambio (predeterminado 0.99)."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta alfa para que coincida con H cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de etiquetas de clúster de salida opcional."
              }
            }
          },
          "yamaguchi_4component_decomposition": {
            "name": "Descomposición de Yamaguchi de 4 componentes",
            "description": "La descomposición SAR de 4 componentes de Yamaguchi descompone datos de radar de apertura sintética de doble polarización en componentes físicamente interpretables que representan la dispersión superficial, la dispersión de doble rebote (volumen), la dispersión helicoidal y la dispersión de volumen, mediante un análisis polarimétrico basado en modelos con la incorporación opcional de un DEM. La descomposición separa los distintos mecanismos de retrodispersión mediante el análisis de los valores propios de las matrices de covarianza polarimétricas, interpretando los componentes como reflexión superficial (dispersión de Bragg), reflexión de doble rebote en reflectores de esquina, rotación helicoidal de la polarización (poco común) y dispersión de volumen difusa de la vegetación o de superficies rugosas. La incorporación de un DEM externo estima la contribución topográfica a la dispersión, lo que permite discriminar mejor la dispersión de volumen real de los efectos topográficos. Entre sus características clave se incluyen una interpretación física basada en modelos que permite extraer parámetros geofísicos significativos, una corrección topográfica opcional basada en el DEM que mejora la exactitud de los componentes sobre el terreno, restricciones de no negatividad de los componentes que evitan resultados de descomposición no físicos y el manejo automático de los huecos de datos y las regiones de superposición (layover). Las aplicaciones incluyen la estimación de la biomasa forestal a partir del componente de dispersión de volumen, la cartografía urbana que aprovecha el predominio del doble rebote en las zonas edificadas, la estimación de la humedad del suelo a partir del comportamiento de la dispersión superficial y la detección de deslizamientos de tierra/cambios mediante variaciones en las relaciones entre componentes. La salida de la descomposición de Yamaguchi permite la interpretación geofísica. Comprende imágenes de cuatro componentes (potencia de dispersión superficial, de doble rebote, helicoidal y de volumen), métricas de calidad de la descomposición que cuantifican la exactitud del ajuste, índices del tipo de dispersión medio que facilitan la caracterización de la cobertura del suelo y diagnósticos opcionales de coherencia/entropía que orientan la evaluación de la calidad de los datos.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Rásteres de matriz: 6 compactos [m11,m22,m33,m12,m13,m23] o 9 elementos de matriz compleja 3x3 completa en orden de filas."
              },
              "matrix_format": {
                "label": "Formato de matriz",
                "description": "Formato de la matriz de entrada: full3x3 (predeterminado) para matrices hermíticas con partes real/imaginaria."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de salida opcional de 4 bandas [surface, double_bounce, volume, helix]."
              }
            }
          },
          "ascii_to_las": {
            "name": "ASCII a LAS",
            "description": "Conversión de formato: procesamiento por lotes de CSV→LAS. Analiza archivos de texto delimitados por espacios, comas o tabulaciones (x,y,z,intensity,class,returns,angle,time) y los convierte a LAS con metadatos EPSG.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Matriz de rutas de archivos ASCII de entrada."
              },
              "pattern": {
                "label": "Patrón",
                "description": "Patrón de campos, p. ej. 'x,y,z,i,c,rn,nr,sa'."
              },
              "epsg_code": {
                "label": "Código EPSG",
                "description": "Código EPSG para los metadatos de CRS del LAS de salida."
              },
              "output_directory": {
                "label": "Directorio de salida",
                "description": "Directorio de salida opcional para los archivos LAS generados."
              }
            }
          },
          "las_to_ascii": {
            "name": "LAS a ASCII",
            "description": "Conversión de formato: salida de LAS→CSV. Exporta todos los atributos de los puntos a texto delimitado para su importación en hojas de cálculo/bases de datos o su uso en scripts.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta opcional del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del CSV de salida (solo en modo de entrada única)."
              }
            }
          },
          "las_to_shapefile": {
            "name": "LAS a shapefile",
            "description": "Convierte nubes de puntos LAS/LAZ en shapefiles vectoriales de puntos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta opcional del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida para el modo de entrada única."
              },
              "output_multipoint": {
                "label": "Salida multipunto",
                "description": "Si es verdadero, emite una geometría multipunto con una sola entidad; en caso contrario, emite una entidad puntual por punto."
              }
            }
          },
          "lidar_colourize": {
            "name": "Colorear LiDAR",
            "description": "Asigna colores a los puntos a partir de una imagen: muestrea la ortofoto/imagen georreferenciada superpuesta en la ubicación de cada punto y lo almacena como RGB. Representación fotorrealista de nubes de puntos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado."
              },
              "image": {
                "label": "Imagen",
                "description": "Ruta del ráster de imagen de entrada u objeto ráster tipado."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "lidar_join": {
            "name": "Unir LiDAR",
            "description": "Combina varios archivos LiDAR: concatena las nubes de puntos conservando los atributos y la coherencia de los encabezados. Procesamiento por lotes en colecciones de teselas.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Matriz de rutas LiDAR de entrada u objetos LiDAR tipados."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "lidar_shift": {
            "name": "Desplazar LiDAR",
            "description": "Traslada las coordenadas de la nube de puntos: desplazamientos x/y/z para cambios de datum, correcciones de registro o transformaciones de sistemas de coordenadas. Ajuste masivo de coordenadas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "x_shift": {
                "label": "Desplazamiento X",
                "description": "Desplazamiento a sumar a las coordenadas x."
              },
              "y_shift": {
                "label": "Desplazamiento Y",
                "description": "Desplazamiento a sumar a las coordenadas y."
              },
              "z_shift": {
                "label": "Desplazamiento Z",
                "description": "Desplazamiento a sumar a las coordenadas z."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "lidar_tile": {
            "name": "Teselar LiDAR",
            "description": "Divide la nube de puntos en teselas de una malla regular: la particiona por extensión x/y con dimensiones configurables y un umbral mínimo de puntos. Distribución y procesamiento estándar de los datos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado."
              },
              "tile_width": {
                "label": "Ancho de tesela",
                "description": "Ancho de tesela en unidades x (predeterminado 1000)."
              },
              "tile_height": {
                "label": "Alto de tesela",
                "description": "Alto de tesela en unidades y (predeterminado 1000)."
              },
              "origin_x": {
                "label": "Origen X",
                "description": "Coordenada x del origen de la malla (predeterminado 0)."
              },
              "origin_y": {
                "label": "Origen Y",
                "description": "Coordenada y del origen de la malla (predeterminado 0)."
              },
              "min_points_in_tile": {
                "label": "Puntos mínimos por tesela",
                "description": "Puntos mínimos requeridos para escribir una tesela (predeterminado 2)."
              },
              "output_laz_format": {
                "label": "Formato de salida LAZ",
                "description": "Si es verdadero, escribe salidas .laz; en caso contrario .las (predeterminado true)."
              },
              "output_directory": {
                "label": "Directorio de salida",
                "description": "Directorio opcional donde escribir las teselas de salida; por defecto <input_dir>/<input_stem>/."
              }
            }
          },
          "lidar_tophat_transform": {
            "name": "Transformada de sombrero de copa LiDAR",
            "description": "Extrae la altura sobre el suelo mediante un top-hat blanco morfológico: la erosión + dilatación aproxima el suelo local y el residuo = altura. Normalización sin suelo de referencia.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado."
              },
              "search_radius": {
                "label": "Radio de búsqueda",
                "description": "Radio de vecindad usado para la erosión y la dilatación."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "recover_flightline_info": {
            "name": "Recuperar información de líneas de vuelo",
            "description": "Reconstruye los ID de las líneas de vuelo a partir de los saltos en el tiempo GPS: infiere los límites de las líneas de vuelo y los marca en point-source-ID/user-data/RGB. Recuperación de la trayectoria de vuelo.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado."
              },
              "max_time_diff": {
                "label": "Diferencia de tiempo máxima",
                "description": "Hueco máximo de tiempo GPS dentro de una línea de vuelo antes de iniciar una nueva línea de vuelo."
              },
              "pt_src_id": {
                "label": "ID de fuente de punto",
                "description": "Si es verdadero, escribe los ID de línea de vuelo inferidos en point_source_id."
              },
              "user_data": {
                "label": "Datos de usuario",
                "description": "Si es verdadero, escribe los ID de línea de vuelo inferidos en user_data (módulo 256)."
              },
              "rgb": {
                "label": "RGB",
                "description": "Si es verdadero, asigna un color aleatorio por línea de vuelo inferida."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "select_tiles_by_polygon": {
            "name": "Seleccionar teselas por polígono",
            "description": "Selección de teselas por lotes: copia las teselas LAS/LAZ de un directorio a la salida cuando los puntos de muestra de la tesela intersecan los límites del polígono. Extracción de datos basada en el área de interés.",
            "params": {
              "input_directory": {
                "label": "Directorio de entrada",
                "description": "Directorio de entrada que contiene las teselas LiDAR."
              },
              "output_directory": {
                "label": "Directorio de salida",
                "description": "Directorio de salida para las teselas LiDAR seleccionadas."
              },
              "polygons": {
                "label": "Polígonos",
                "description": "Ruta del vectorial de polígonos de entrada u objeto vectorial tipado."
              }
            }
          },
          "sort_lidar": {
            "name": "Ordenar LiDAR",
            "description": "Ordena los puntos según múltiples criterios: x/y/z con tamaños de intervalo, más atributos derivados. Optimiza la coherencia espacial para la compresión y el procesamiento por teselas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "sort_criteria": {
                "label": "Criterio de ordenación",
                "description": "Expresión de criterios de ordenación, p. ej. 'x 100, y 100, z 10, scan_angle'."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "split_lidar": {
            "name": "Dividir LiDAR",
            "description": "Divide los puntos en archivos separados según un atributo: los agrupa por clase, source-id, ventana temporal, intervalo espacial o número de puntos. Estratificación y distribución de los datos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "split_criterion": {
                "label": "Criterio de división",
                "description": "Criterio de agrupación: num_pts, x, y, z, intensity, class, user_data, point_source_id, scan_angle o time."
              },
              "interval": {
                "label": "Intervalo",
                "description": "Tamaño de intervalo para criterios numéricos; para num_pts es el número de puntos por archivo de salida."
              },
              "min_pts": {
                "label": "Puntos mínimos",
                "description": "Puntos mínimos necesarios antes de escribir un archivo de salida dividido (predeterminado 5)."
              },
              "output_directory": {
                "label": "Directorio de salida",
                "description": "Directorio opcional para las salidas divididas."
              }
            }
          },
          "classify_buildings_in_lidar": {
            "name": "Clasificar edificios en LiDAR",
            "description": "Marca los puntos dentro de las huellas de edificios: asigna la clase 6 a todos los puntos situados espacialmente dentro de los límites de los polígonos. Extracción de edificios basada en vectoriales.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado."
              },
              "buildings": {
                "label": "Edificios",
                "description": "Ruta del vectorial de polígonos de huellas de edificios de entrada u objeto vectorial tipado."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "classify_lidar": {
            "name": "Clasificar LiDAR",
            "description": "Clasificación automatizada de puntos: suelo, vegetación y edificios mediante la geometría local (linealidad, planaridad) y el ajuste de planos RANSAC. Segmentación basada en la geometría.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "search_radius": {
                "label": "Radio de búsqueda",
                "description": "Radio de vecindad (predeterminado 2.5)."
              },
              "grd_threshold": {
                "label": "Umbral de suelo",
                "description": "Altura sobre el mínimo local considerada suelo (predeterminado 0.1)."
              },
              "oto_threshold": {
                "label": "Umbral OTO",
                "description": "Altura sobre el mínimo local considerada objeto fuera del terreno (predeterminado 1.0)."
              },
              "linearity_threshold": {
                "label": "Umbral de linealidad",
                "description": "Umbral de linealidad usado en el cribado final de no clasificados (predeterminado 0.5)."
              },
              "planarity_threshold": {
                "label": "Umbral de planaridad",
                "description": "Umbral de planaridad usado en la segmentación y el refinamiento (predeterminado 0.85)."
              },
              "num_iter": {
                "label": "Número de iteraciones",
                "description": "Número de iteraciones RANSAC locales para las estimaciones de planaridad/linealidad (predeterminado 30)."
              },
              "facade_threshold": {
                "label": "Umbral de fachada",
                "description": "Distancia de vecinos usada al etiquetar fachadas de edificios (predeterminado 0.5)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "classify_overlap_points": {
            "name": "Clasificar puntos de solape",
            "description": "Identifica los solapes entre líneas de vuelo: detecta las celdas de la malla con varios ID de fuente de puntos y marca o elimina los puntos de solape. Control de calidad para la validación de la adquisición.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado."
              },
              "resolution": {
                "label": "Resolución",
                "description": "Tamaño de celda de malla usado para el análisis de solape."
              },
              "overlap_criterion": {
                "label": "Criterio de solape",
                "description": "max scan angle, not min point source id, not min time o multiple point source IDs."
              },
              "filter": {
                "label": "Filtro",
                "description": "Si es verdadero, elimina los puntos de solape; en caso contrario, clasifica los puntos de solape como clase 12."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "clip_lidar_to_polygon": {
            "name": "Recortar LiDAR con polígono",
            "description": "Subconjunto espacial de la nube de puntos: conserva los puntos situados dentro de los límites de los polígonos. Selección de puntos basada en vectoriales para extraer el área de estudio.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado."
              },
              "polygons": {
                "label": "Polígonos",
                "description": "Ruta del vectorial de polígonos de entrada u objeto vectorial tipado."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "erase_polygon_from_lidar": {
            "name": "Borrar polígono del LiDAR",
            "description": "Elimina los puntos LiDAR que se encuentran dentro de la geometría de los polígonos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado."
              },
              "polygons": {
                "label": "Polígonos",
                "description": "Ruta del vectorial de polígonos de entrada u objeto vectorial tipado."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "filter_lidar": {
            "name": "Filtrar LiDAR",
            "description": "Elimina puntos mediante una expresión: lógica booleana sobre atributos (class, elevation, return_number, scan_angle, noise_flag, etc.). Selección flexible de puntos.",
            "params": {
              "statement": {
                "label": "Sentencia",
                "description": "Expresión booleana, p. ej. '!is_noise && class == 2' o 'NOT is_noise AND class == 2'."
              },
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida para el modo de entrada única."
              }
            }
          },
          "filter_lidar_by_percentile": {
            "name": "Filtrar LiDAR por percentil",
            "description": "Selecciona el punto de rango percentil por celda: conserva un punto por bloque de la malla en el percentil de elevación especificado. Diezmado con muestra representativa.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "percentile": {
                "label": "Percentil",
                "description": "Percentil en [0, 100] (0=más bajo, 100=más alto)."
              },
              "block_size": {
                "label": "Tamaño de bloque",
                "description": "Tamaño de bloque de malla para la selección local por percentil (predeterminado 1.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "filter_lidar_by_reference_surface": {
            "name": "Filtrar LiDAR por superficie de referencia",
            "description": "Extrae puntos en relación con una superficie de referencia: z<superficie, z>superficie o dentro de un umbral. Identifica la vegetación por encima del DTM o los puntos bajo la superficie.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado."
              },
              "ref_surface": {
                "label": "Superficie de referencia",
                "description": "Ruta del ráster de referencia u objeto ráster tipado."
              },
              "query": {
                "label": "Consulta",
                "description": "Tipo de consulta: within, <, <=, >, >= (predeterminado within)."
              },
              "threshold": {
                "label": "Umbral",
                "description": "Umbral absoluto de distancia z usado por query=within."
              },
              "classify": {
                "label": "Clasificar",
                "description": "Si es verdadero, clasifica los puntos; en caso contrario, filtra y conserva solo las coincidencias."
              },
              "true_class_value": {
                "label": "Valor de clase verdadero",
                "description": "Valor de clase asignado a los puntos coincidentes en modo de clasificación."
              },
              "false_class_value": {
                "label": "Valor de clase falso",
                "description": "Valor de clase asignado a los puntos no coincidentes en modo de clasificación."
              },
              "preserve_classes": {
                "label": "Conservar clases",
                "description": "Si es verdadero, conserva las clases no coincidentes en modo de clasificación."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "filter_lidar_classes": {
            "name": "Filtrar clases LiDAR",
            "description": "Elimina puntos por clasificación: filtra las clases LAS no deseadas (ruido, agua, edificios, etc.). Preprocesamiento esencial para los flujos de trabajo de acondicionamiento del terreno.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "excluded_classes": {
                "label": "Clases excluidas",
                "description": "Clases a excluir (matriz o cadena delimitada por comas)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "filter_lidar_noise": {
            "name": "Filtrar ruido LiDAR",
            "description": "Elimina las clases de ruido ASPRS: filtra la clase 7 (ruido bajo) y la clase 18 (ruido alto). Limpieza estándar de nubes de puntos para datos compatibles con LAS 1.4.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "filter_lidar_scan_angles": {
            "name": "Filtrar ángulos de escaneo LiDAR",
            "description": "Elimina los retornos LiDAR oblicuos: filtra los puntos según un umbral de ángulo de escaneo. Mejora la exactitud vertical eliminando los retornos de ángulo rasante con error posicional.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "threshold": {
                "label": "Umbral",
                "description": "Ángulo de escaneo absoluto máximo (unidades LAS enteras; 1 unidad = 0.006°). Obligatorio."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "height_above_ground": {
            "name": "Altura sobre el suelo",
            "description": "Normaliza mediante la geometría de la nube de puntos: calcula la altura de cada punto sobre el vecino más cercano de clase suelo situado por debajo. Superficie del terreno local sin ráster de referencia.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "improved_ground_point_filter": {
            "name": "Filtro de puntos de suelo mejorado",
            "description": "Cadena de filtrado de puntos de suelo en varias etapas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada."
              },
              "block_size": {
                "label": "Tamaño de bloque",
                "description": "Tamaño de celda de malla en unidades xy."
              },
              "max_building_size": {
                "label": "Tamaño máximo de edificio",
                "description": "Ancho máximo esperado de edificio en unidades xy."
              },
              "slope_threshold": {
                "label": "Umbral de pendiente",
                "description": "Pendiente mínima de borde en grados."
              },
              "elev_threshold": {
                "label": "Umbral de elevación",
                "description": "Umbral de distancia de elevación."
              },
              "classify": {
                "label": "Clasificar",
                "description": "Clasificar en lugar de filtrar los puntos."
              },
              "preserve_classes": {
                "label": "Conservar clases",
                "description": "Conservar las clases existentes en modo de clasificación."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "individual_tree_segmentation": {
            "name": "Segmentación de árboles individuales",
            "description": "Segmenta los puntos de vegetación en copas de árboles: agrupamiento mean-shift con un ancho de banda adaptativo a partir de la geometría local del dosel. Delimitación de árboles a nivel de inventario.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado."
              },
              "only_use_veg": {
                "label": "Usar solo vegetación",
                "description": "Si es verdadero, procesa solo las clases de vegetación (predeterminado true)."
              },
              "veg_classes": {
                "label": "Clases de vegetación",
                "description": "Clases de vegetación como texto delimitado por comas o matriz de enteros (predeterminado '3,4,5')."
              },
              "min_height": {
                "label": "Altura mínima",
                "description": "Altura mínima de punto para la segmentación (predeterminado 2.0)."
              },
              "max_height": {
                "label": "Altura máxima",
                "description": "Altura máxima de punto opcional."
              },
              "bandwidth_min": {
                "label": "Ancho de banda mínimo",
                "description": "Ancho de banda horizontal mínimo (predeterminado 1.0)."
              },
              "bandwidth_max": {
                "label": "Ancho de banda máximo",
                "description": "Ancho de banda horizontal máximo (predeterminado 6.0)."
              },
              "adaptive_bandwidth": {
                "label": "Ancho de banda adaptativo",
                "description": "Estimar el ancho de banda horizontal por semilla a partir de la geometría local de la copa (predeterminado true)."
              },
              "adaptive_neighbors": {
                "label": "Vecinos adaptativos",
                "description": "Número de vecinos usado para la escala adaptativa de densidad local (predeterminado 24)."
              },
              "adaptive_sector_count": {
                "label": "Número de sectores adaptativos",
                "description": "Número de sectores angulares para la estimación local del radio de copa (predeterminado 8)."
              },
              "grid_acceleration": {
                "label": "Aceleración por malla",
                "description": "Usar aproximación por malla al estilo MeanShift++ para actualizaciones de moda más rápidas (predeterminado false)."
              },
              "grid_cell_size": {
                "label": "Tamaño de celda de malla",
                "description": "Tamaño de celda de malla para las actualizaciones de moda aceleradas (predeterminado 0.5)."
              },
              "grid_refine_exact": {
                "label": "Refinado exacto de malla",
                "description": "Ejecutar un breve refinamiento exacto por vecinos tras la aceleración por malla (predeterminado false)."
              },
              "grid_refine_iterations": {
                "label": "Iteraciones de refinado de malla",
                "description": "Límite de iteraciones de refinamiento exacto tras las actualizaciones de moda por malla (predeterminado 2)."
              },
              "tile_size": {
                "label": "Tamaño de tesela",
                "description": "Tamaño de tesela opcional para la planificación de semillas; <=0 desactiva el teselado (predeterminado 0.0)."
              },
              "tile_overlap": {
                "label": "Solape de teselas",
                "description": "Ancho de solape de teselas para la planificación de semillas teselada (predeterminado 0.0)."
              },
              "vertical_bandwidth": {
                "label": "Ancho de banda vertical",
                "description": "Ancho de banda del kernel vertical (predeterminado 5.0)."
              },
              "max_iterations": {
                "label": "Iteraciones máximas",
                "description": "Número máximo de iteraciones de desplazamiento de media por semilla (predeterminado 30)."
              },
              "convergence_tol": {
                "label": "Tolerancia de convergencia",
                "description": "Tolerancia de convergencia para la magnitud del desplazamiento (predeterminado 0.05)."
              },
              "min_cluster_points": {
                "label": "Puntos mínimos por clúster",
                "description": "Puntos mínimos por clúster de árbol retenido (predeterminado 50)."
              },
              "mode_merge_dist": {
                "label": "Distancia de fusión de modas",
                "description": "Umbral de distancia para fusionar modas convergidas (predeterminado 0.8)."
              },
              "threads": {
                "label": "Hilos",
                "description": "Sobrescritura del número de hilos (0 usa el pool de Rayon predeterminado)."
              },
              "simd": {
                "label": "SIMD",
                "description": "Habilitar aritmética asistida por SIMD en los bucles de ponderación (predeterminado true)."
              },
              "output_id_mode": {
                "label": "Modo de ID de salida",
                "description": "Codificación del ID de segmento de salida {rgb|user_data|point_source_id|rgb+user_data|rgb+point_source_id} (predeterminado rgb)."
              },
              "output_sidecar_csv": {
                "label": "CSV auxiliar de salida",
                "description": "Si es verdadero, escribe un CSV point_index,segment_id junto a la salida lidar."
              },
              "seed": {
                "label": "Semilla",
                "description": "Semilla determinista para la asignación de colores (predeterminado 1)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "lidar_classify_subset": {
            "name": "Clasificar subconjunto LiDAR",
            "description": "Transfiere la clasificación: marca los puntos base que coinciden con las ubicaciones de una nube de subconjunto. Permite una reclasificación espacial basada en conjuntos de puntos auxiliares.",
            "params": {
              "base": {
                "label": "Base",
                "description": "Ruta del LiDAR base u objeto LiDAR tipado."
              },
              "subset": {
                "label": "Subconjunto",
                "description": "Ruta del LiDAR de subconjunto u objeto LiDAR tipado."
              },
              "subset_class_value": {
                "label": "Valor de clase del subconjunto",
                "description": "Valor de clasificación asignado a los puntos del subconjunto emparejados (0-18)."
              },
              "nonsubset_class_value": {
                "label": "Valor de clase fuera del subconjunto",
                "description": "Clase opcional para los puntos no coincidentes (0-18). Use 255 para conservar las clases existentes."
              },
              "tolerance": {
                "label": "Tolerancia",
                "description": "Tolerancia de emparejamiento por vecino más cercano 3D en unidades del mapa."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "lidar_elevation_slice": {
            "name": "Corte de elevación LiDAR",
            "description": "Extrae los puntos de una banda de elevación: filtra o reclasifica los puntos dentro de un rango de z. Aísla capas específicas (suelo, sotobosque, dosel) o zonas de elevación.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "minz": {
                "label": "Z mínimo",
                "description": "Límite inferior del corte de elevación (predeterminado -infinito)."
              },
              "maxz": {
                "label": "Z máximo",
                "description": "Límite superior del corte de elevación (predeterminado +infinito)."
              },
              "classify": {
                "label": "Clasificar",
                "description": "Si es verdadero, reclasifica los puntos en lugar de filtrarlos (predeterminado false)."
              },
              "in_class_value": {
                "label": "Valor de clase de entrada",
                "description": "Clasificación asignada a los puntos dentro del corte cuando classify=true (predeterminado 2)."
              },
              "out_class_value": {
                "label": "Valor de clase de salida",
                "description": "Clasificación asignada a los puntos fuera del corte cuando classify=true (predeterminado 1)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "lidar_remove_outliers": {
            "name": "Eliminar valores atípicos LiDAR",
            "description": "Detecta puntos atípicos mediante residuos de elevación locales: compara cada punto con la media/mediana de su vecindad y marca las anomalías. Elimina errores groseros erráticos y ruido.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "search_radius": {
                "label": "Radio de búsqueda",
                "description": "Radio de vecindad para el cálculo del residuo local (predeterminado 2.0)."
              },
              "elev_diff": {
                "label": "Diferencia de elevación",
                "description": "Umbral absoluto de residuo de elevación para la detección de valores atípicos (predeterminado 50.0)."
              },
              "use_median": {
                "label": "Usar mediana",
                "description": "Usar la mediana en lugar de la media de elevación de la vecindad."
              },
              "classify": {
                "label": "Clasificar",
                "description": "Si es verdadero, clasifica los valores atípicos como clase 7/18 en lugar de eliminarlos."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "lidar_segmentation": {
            "name": "Segmentación LiDAR",
            "description": "Particiona la nube de puntos: el ajuste de planos RANSAC + crecimiento de regiones crea componentes conectados. Asigna ID de segmento almacenados en RGB. Agrupamiento de puntos basado en la forma.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado."
              },
              "search_radius": {
                "label": "Radio de búsqueda",
                "description": "Radio de vecindad para el crecimiento de regiones."
              },
              "num_iterations": {
                "label": "Número de iteraciones",
                "description": "Número de iteraciones RANSAC usadas para detectar modelos planos locales."
              },
              "num_samples": {
                "label": "Número de muestras",
                "description": "Número de puntos muestreados por ajuste de modelo RANSAC local."
              },
              "inlier_threshold": {
                "label": "Umbral de inliers",
                "description": "Umbral de residuo usado para clasificar puntos como inliers del plano local."
              },
              "acceptable_model_size": {
                "label": "Tamaño de modelo aceptable",
                "description": "Número mínimo de inliers requerido para un modelo de plano local aceptado."
              },
              "max_planar_slope": {
                "label": "Pendiente planar máxima",
                "description": "Pendiente planar máxima aceptada en grados."
              },
              "norm_diff_threshold": {
                "label": "Umbral de diferencia de normales",
                "description": "Diferencia angular máxima (grados) entre normales planas vecinas durante el crecimiento."
              },
              "max_z_diff": {
                "label": "Diferencia Z máxima",
                "description": "Diferencia Z máxima permitida al hacer crecer un segmento."
              },
              "classes": {
                "label": "Clases",
                "description": "Si es verdadero, no cruza los límites de clase al hacer crecer los segmentos."
              },
              "ground": {
                "label": "Suelo",
                "description": "Si es verdadero, asigna class=2 al segmento más grande y class=1 a los demás puntos segmentados."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "lidar_segmentation_based_filter": {
            "name": "Filtro basado en segmentación LiDAR",
            "description": "Filtrado del suelo mediante segmentación de bajo relieve: hace crecer componentes conectados a partir de regiones localmente planas y separa el terreno de la vegetación. Separación robusta del suelo.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado."
              },
              "search_radius": {
                "label": "Radio de búsqueda",
                "description": "Radio de vecindad para el crecimiento de componentes conexas."
              },
              "norm_diff_threshold": {
                "label": "Umbral de diferencia de normales",
                "description": "Parámetro de compatibilidad para las comprobaciones de ángulo de normales heredadas."
              },
              "max_z_diff": {
                "label": "Diferencia Z máxima",
                "description": "Diferencia máxima de elevación para el crecimiento conexo."
              },
              "classify_points": {
                "label": "Clasificar puntos",
                "description": "Si es verdadero, clasifica los puntos en lugar de filtrarlos."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "modify_lidar": {
            "name": "Modificar LiDAR",
            "description": "Actualiza los atributos de los puntos mediante asignaciones: z=z+offset, class=reclassify_expr, intensity=scale_factor. Transformaciones flexibles a nivel de punto.",
            "params": {
              "statement": {
                "label": "Sentencia",
                "description": "Una o más expresiones de asignación separadas por punto y coma, p. ej. 'z = z + 1; class = if(z > 5, 2, class)'."
              },
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida para el modo de entrada única."
              }
            }
          },
          "normalize_lidar": {
            "name": "Normalizar LiDAR",
            "description": "Convierte las elevaciones LiDAR absolutas en altura sobre el suelo: resta el DTM (DEM ráster) de los valores z de los puntos. Crea una nube de puntos normalizada para el análisis de estructuras.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado."
              },
              "dtm": {
                "label": "DTM",
                "description": "Ruta del ráster DTM de entrada u objeto ráster tipado."
              },
              "no_negatives": {
                "label": "Sin negativos",
                "description": "Limitar a cero las alturas normalizadas negativas."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "remove_duplicates": {
            "name": "Eliminar duplicados",
            "description": "Elimina los duplicados de la nube de puntos: elimina los puntos con x/y idénticos (y opcionalmente z). Maneja los solapes de múltiples escaneos y mejora la eficiencia del procesamiento.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "include_z": {
                "label": "Incluir Z",
                "description": "Si es verdadero, la detección de duplicados incluye z; en caso contrario usa solo x/y."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "flightline_overlap": {
            "name": "Solape de líneas de vuelo",
            "description": "Detecta los solapes de adquisición: cuenta los ID de fuente de puntos distintos por celda. Visualización de solapes basada en una malla para evaluar la cobertura de las líneas de vuelo.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta opcional del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "resolution": {
                "label": "Resolución",
                "description": "Resolución de malla usada para contar las líneas de vuelo distintas por celda."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "lidar_block_maximum": {
            "name": "Máximo por bloque LiDAR",
            "description": "Ráster a partir del atributo LiDAR máximo: valor de la celda = retorno del punto más alto (elevación, intensidad, clase, etc.). Generación de DSM, extracción de la parte superior del dosel, estadísticas de pulsos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "resolution": {
                "label": "Resolución",
                "description": "Tamaño de celda de salida."
              },
              "interpolation_parameter": {
                "label": "Parámetro de interpolación",
                "description": "Atributo del punto (elevation/intensity/class/return_number/number_of_returns/scan_angle/time/rgb/user_data)."
              },
              "returns_included": {
                "label": "Retornos incluidos",
                "description": "Modo de filtrado de retornos: all, first o last."
              },
              "excluded_classes": {
                "label": "Clases excluidas",
                "description": "Clases a excluir (matriz o cadena delimitada por comas)."
              },
              "min_elev": {
                "label": "Elevación mínima",
                "description": "Umbral de elevación mínima usado para el filtrado de inclusión de puntos."
              },
              "max_elev": {
                "label": "Elevación máxima",
                "description": "Umbral de elevación máxima usado para el filtrado de inclusión de puntos."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "lidar_block_minimum": {
            "name": "Mínimo por bloque LiDAR",
            "description": "Ráster a partir del atributo LiDAR mínimo: valor de la celda = retorno del punto más bajo (elevación, intensidad, clase). Generación de DEM, extracción de la superficie del suelo, establecimiento de la línea base del terreno.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "resolution": {
                "label": "Resolución",
                "description": "Tamaño de celda de salida."
              },
              "interpolation_parameter": {
                "label": "Parámetro de interpolación",
                "description": "Atributo del punto (elevation/intensity/class/return_number/number_of_returns/scan_angle/time/rgb/user_data)."
              },
              "returns_included": {
                "label": "Retornos incluidos",
                "description": "Modo de filtrado de retornos: all, first o last."
              },
              "excluded_classes": {
                "label": "Clases excluidas",
                "description": "Clases a excluir (matriz o cadena delimitada por comas)."
              },
              "min_elev": {
                "label": "Elevación mínima",
                "description": "Umbral de elevación mínima usado para el filtrado de inclusión de puntos."
              },
              "max_elev": {
                "label": "Elevación máxima",
                "description": "Umbral de elevación máxima usado para el filtrado de inclusión de puntos."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "lidar_construct_vector_tin": {
            "name": "Construir TIN vectorial LiDAR",
            "description": "Construye una malla 3D: la triangulación de Delaunay a partir de los puntos filtrados se genera como una capa vectorial de polígonos. Representación de superficies y análisis topográfico.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta opcional del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida; en modo por lotes cada entrada escribe un _tin.shp hermano."
              },
              "returns": {
                "label": "Retornos",
                "description": "Filtro de retornos: all, first o last."
              },
              "excluded_classes": {
                "label": "Clases excluidas",
                "description": "Valores de clase opcionales a excluir."
              },
              "min_elev": {
                "label": "Elevación mínima",
                "description": "Elevación mínima de punto permitida."
              },
              "max_elev": {
                "label": "Elevación máxima",
                "description": "Elevación máxima de punto permitida."
              },
              "max_triangle_edge_length": {
                "label": "Longitud máxima de arista del triángulo",
                "description": "Longitud máxima de arista de triángulo permitida opcional."
              }
            }
          },
          "lidar_contour": {
            "name": "Curvas de nivel LiDAR",
            "description": "Extrae curvas de nivel vectoriales: generación de curvas de nivel basada en TIN con interpolación para elevación, intensidad y tiempo. Intervalos configurables y filtrado por longitud de arista.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta opcional del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (.shp/.geojson). En modo por lotes cada entrada escribe un .shp hermano."
              },
              "interval": {
                "label": "Intervalo",
                "description": "Intervalo de curvas de nivel (debe ser > 0)."
              },
              "base_contour": {
                "label": "Curva de nivel base",
                "description": "Valor de desplazamiento de la curva de nivel base."
              },
              "smooth": {
                "label": "Suavizar",
                "description": "Parámetro de suavizado de compatibilidad (aceptado por paridad de la forma de llamada)."
              },
              "interpolation_parameter": {
                "label": "Parámetro de interpolación",
                "description": "Uno de elevation, intensity, scan_angle, time o user_data."
              },
              "returns": {
                "label": "Retornos",
                "description": "Filtro de retornos: all, first o last."
              },
              "excluded_classes": {
                "label": "Clases excluidas",
                "description": "Valores de clase opcionales a excluir."
              },
              "min_elev": {
                "label": "Elevación mínima",
                "description": "Elevación mínima de punto permitida."
              },
              "max_elev": {
                "label": "Elevación máxima",
                "description": "Elevación máxima de punto permitida."
              },
              "max_triangle_edge_length": {
                "label": "Longitud máxima de arista del triángulo",
                "description": "Longitud máxima opcional de arista de triángulo; los triángulos más largos se omiten."
              }
            }
          },
          "lidar_digital_surface_model": {
            "name": "Modelo digital de superficie LiDAR",
            "description": "Genera un DSM a partir de los retornos de la superficie superior LiDAR mediante TIN: utiliza candidatos locales de punto más alto dentro de un radio y luego la triangulación. Representación del dosel de la vegetación y de la parte superior de los elementos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "resolution": {
                "label": "Resolución",
                "description": "Tamaño de celda de salida."
              },
              "search_radius": {
                "label": "Radio de búsqueda",
                "description": "Radio de vecindad para seleccionar candidatos de superficie superior."
              },
              "min_elev": {
                "label": "Elevación mínima",
                "description": "Umbral de elevación mínima usado para el filtrado de inclusión de puntos."
              },
              "max_elev": {
                "label": "Elevación máxima",
                "description": "Umbral de elevación máxima usado para el filtrado de inclusión de puntos."
              },
              "max_triangle_edge_length": {
                "label": "Longitud máxima de arista del triángulo",
                "description": "Longitud máxima opcional de arista de triángulo para suprimir facetas de arista larga."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "lidar_hex_bin": {
            "name": "Agrupación hexagonal LiDAR",
            "description": "Agrega los puntos en hexágonos: malla de agrupación con resúmenes por celda (recuento, z media, intensidad). Muestreo uniforme y agrupación estadística.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado."
              },
              "width": {
                "label": "Ancho",
                "description": "Ancho del hexágono (distancia entre lados opuestos)."
              },
              "orientation": {
                "label": "Orientación",
                "description": "Orientación de la malla: h (vértice arriba) o v (lado arriba)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida."
              }
            }
          },
          "lidar_hillshade": {
            "name": "Sombreado del relieve LiDAR",
            "description": "Representa la superficie LiDAR mediante sombreado del relieve: calcula las normales de superficie por punto a partir de un ajuste de plano local y luego sombrea según el ángulo de iluminación. Se almacena como RGB para la visualización 3D.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "search_radius": {
                "label": "Radio de búsqueda",
                "description": "Radio de vecindad para la estimación local de normales. Los valores <= 0 usan el espaciado nominal estimado."
              },
              "azimuth": {
                "label": "Acimut",
                "description": "Acimut de iluminación en grados."
              },
              "altitude": {
                "label": "Altitud",
                "description": "Altitud de iluminación en grados."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "lidar_idw_interpolation": {
            "name": "Interpolación IDW LiDAR",
            "description": "Generación de malla LiDAR ponderada por la distancia: asigna el valor de la celda a partir de la media ponderada de los puntos circundantes (potencia de distancia inversa). Superficies suaves, controladas mediante el parámetro de exponente.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "resolution": {
                "label": "Resolución",
                "description": "Tamaño de celda de salida."
              },
              "weight": {
                "label": "Peso",
                "description": "Exponente (potencia) de IDW."
              },
              "search_radius": {
                "label": "Radio de búsqueda",
                "description": "Radio de vecindad; <=0 cambia al modo de k más cercanos."
              },
              "interpolation_parameter": {
                "label": "Parámetro de interpolación",
                "description": "Atributo del punto a interpolar (elevation, intensity, class, return_number, number_of_returns, scan_angle, time, rgb, user_data)."
              },
              "returns_included": {
                "label": "Retornos incluidos",
                "description": "Modo de filtrado de retornos: all, first o last."
              },
              "excluded_classes": {
                "label": "Clases excluidas",
                "description": "Clases a excluir (matriz o cadena delimitada por comas)."
              },
              "min_elev": {
                "label": "Elevación mínima",
                "description": "Umbral de elevación mínima usado para el filtrado de inclusión de puntos."
              },
              "max_elev": {
                "label": "Elevación máxima",
                "description": "Umbral de elevación máxima usado para el filtrado de inclusión de puntos."
              },
              "min_points": {
                "label": "Puntos mínimos",
                "description": "Número mínimo de puntos para la alternativa de k más cercanos."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "lidar_nearest_neighbour_gridding": {
            "name": "Rasterización por vecino más próximo LiDAR",
            "description": "Generación rápida de malla LiDAR: asigna el valor de la celda a partir del punto más cercano dentro del radio de búsqueda. Sesgo de interpolación mínimo, eficiente para nubes de puntos de alta densidad. Generación rápida de DSM/DEM.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "resolution": {
                "label": "Resolución",
                "description": "Tamaño de celda de salida."
              },
              "search_radius": {
                "label": "Radio de búsqueda",
                "description": "Distancia máxima al vecino más cercano; las celdas más allá pasan a ser NoData."
              },
              "interpolation_parameter": {
                "label": "Parámetro de interpolación",
                "description": "Atributo del punto a interpolar (elevation, intensity, class, return_number, number_of_returns, scan_angle, time, rgb, user_data)."
              },
              "returns_included": {
                "label": "Retornos incluidos",
                "description": "Modo de filtrado de retornos: all, first o last."
              },
              "excluded_classes": {
                "label": "Clases excluidas",
                "description": "Clases a excluir (matriz o cadena delimitada por comas)."
              },
              "min_elev": {
                "label": "Elevación mínima",
                "description": "Umbral de elevación mínima usado para el filtrado de inclusión de puntos."
              },
              "max_elev": {
                "label": "Elevación máxima",
                "description": "Umbral de elevación máxima usado para el filtrado de inclusión de puntos."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "lidar_radial_basis_function_interpolation": {
            "name": "Interpolación por funciones de base radial LiDAR",
            "description": "Superficie LiDAR suave mediante RBF: las funciones de base radial captan la curvatura local y la microtopografía. Generación de malla de alta calidad con derivadas continuas a través de los límites.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "resolution": {
                "label": "Resolución",
                "description": "Tamaño de celda de salida."
              },
              "num_points": {
                "label": "Número de puntos",
                "description": "Número mínimo de vecinos usados para la interpolación local."
              },
              "search_radius": {
                "label": "Radio de búsqueda",
                "description": "Radio de vecindad; <=0 usa solo el modo de k más cercanos."
              },
              "func_type": {
                "label": "Tipo de función",
                "description": "Tipo de base RBF (thinplatespline, polyharmonic, gaussian, multiquadric, inversemultiquadric)."
              },
              "poly_order": {
                "label": "Orden del polinomio",
                "description": "Orden de tendencia polinómica usado para la corrección local (none, constant, quadratic)."
              },
              "weight": {
                "label": "Peso",
                "description": "Parámetro/exponente de forma de la base según func_type."
              },
              "interpolation_parameter": {
                "label": "Parámetro de interpolación",
                "description": "Atributo del punto a interpolar (elevation, intensity, class, return_number, number_of_returns, scan_angle, time, rgb, user_data)."
              },
              "returns_included": {
                "label": "Retornos incluidos",
                "description": "Modo de filtrado de retornos: all, first o last."
              },
              "excluded_classes": {
                "label": "Clases excluidas",
                "description": "Clases a excluir (matriz o cadena delimitada por comas)."
              },
              "min_elev": {
                "label": "Elevación mínima",
                "description": "Umbral de elevación mínima usado para el filtrado de inclusión de puntos."
              },
              "max_elev": {
                "label": "Elevación máxima",
                "description": "Umbral de elevación máxima usado para el filtrado de inclusión de puntos."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "lidar_sibson_interpolation": {
            "name": "Interpolación de Sibson LiDAR",
            "description": "Generación de malla LiDAR por vecino natural: interpolación basada en Voronoi con pesos de vecino natural. Superficies suaves y de aspecto natural sin artefactos de pendiente en las ubicaciones de los puntos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "resolution": {
                "label": "Resolución",
                "description": "Tamaño de celda de salida."
              },
              "interpolation_parameter": {
                "label": "Parámetro de interpolación",
                "description": "Atributo del punto a interpolar (elevation, intensity, class, return_number, number_of_returns, scan_angle, time, rgb, user_data)."
              },
              "returns_included": {
                "label": "Retornos incluidos",
                "description": "Modo de filtrado de retornos: all, first o last."
              },
              "excluded_classes": {
                "label": "Clases excluidas",
                "description": "Clases a excluir (matriz o cadena delimitada por comas)."
              },
              "min_elev": {
                "label": "Elevación mínima",
                "description": "Umbral de elevación mínima usado para el filtrado de inclusión de puntos."
              },
              "max_elev": {
                "label": "Elevación máxima",
                "description": "Umbral de elevación máxima usado para el filtrado de inclusión de puntos."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "lidar_thin": {
            "name": "Adelgazar LiDAR",
            "description": "Diezma la densidad de la nube de puntos: conserva ≤1 punto por celda de la malla mediante la estrategia primero/último/más bajo/más alto/más cercano. Reduce el almacenamiento conservando la cobertura y la complejidad topográfica.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "resolution": {
                "label": "Resolución",
                "description": "Tamaño de celda de malla para el adelgazamiento (predeterminado 1.0)."
              },
              "method": {
                "label": "Método",
                "description": "Método de selección de punto por celda: first, last, lowest, highest, nearest (predeterminado 'first')."
              },
              "save_filtered": {
                "label": "Guardar filtrados",
                "description": "Si es verdadero, escribe también los puntos filtrados y devuelve su localizador en outputs.filtered_path."
              },
              "filtered_output": {
                "label": "Salida filtrada",
                "description": "Ruta de salida opcional para los puntos filtrados (modo de entrada única)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "lidar_thin_high_density": {
            "name": "Adelgazar LiDAR de alta densidad",
            "description": "Diezmado adaptativo de la densidad: reduce el número de puntos en las zonas con exceso de densidad conservando las regiones dispersas. Iguala el muestreo en patrones variables de solape entre líneas de vuelo.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "density": {
                "label": "Densidad",
                "description": "Umbral de densidad de puntos objetivo en puntos por unidad cuadrada."
              },
              "resolution": {
                "label": "Resolución",
                "description": "Resolución de malla usada para la agrupación en x/y y z (predeterminado 1.0)."
              },
              "save_filtered": {
                "label": "Guardar filtrados",
                "description": "Si es verdadero, escribe los puntos filtrados y devuelve outputs.filtered_path."
              },
              "filtered_output": {
                "label": "Salida filtrada",
                "description": "Ruta de salida opcional para los puntos filtrados en modo de entrada única."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "lidar_tile_footprint": {
            "name": "Huella de teselas LiDAR",
            "description": "Genera huellas: rectángulos envolventes alineados con los ejes o envolventes convexas por nube de puntos. Salida de polígonos vectoriales para la indexación espacial y el catálogo de datos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta opcional del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta sobre todos los archivos LiDAR del directorio actual."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida para las huellas."
              },
              "output_hulls": {
                "label": "Salida de envolventes",
                "description": "Si es verdadero, escribe huellas de envolvente convexa; en caso contrario, escribe cuadros delimitadores alineados con los ejes."
              }
            }
          },
          "lidar_tin_gridding": {
            "name": "Rasterización TIN LiDAR",
            "description": "Interpolación LiDAR exacta mediante TIN: construye una triangulación de Delaunay a partir de los puntos e interpola los valores de las celdas a partir de los planos de los triángulos. Respeta las alturas de los puntos; excelente para coberturas irregulares.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "resolution": {
                "label": "Resolución",
                "description": "Tamaño de celda de salida."
              },
              "max_triangle_edge_length": {
                "label": "Longitud máxima de arista del triángulo",
                "description": "Longitud máxima opcional de arista de triángulo para suprimir facetas de arista larga."
              },
              "interpolation_parameter": {
                "label": "Parámetro de interpolación",
                "description": "Atributo del punto a interpolar (elevation, intensity, class, return_number, number_of_returns, scan_angle, time, rgb, user_data)."
              },
              "returns_included": {
                "label": "Retornos incluidos",
                "description": "Modo de filtrado de retornos: all, first o last."
              },
              "excluded_classes": {
                "label": "Clases excluidas",
                "description": "Clases a excluir (matriz o cadena delimitada por comas)."
              },
              "min_elev": {
                "label": "Elevación mínima",
                "description": "Umbral de elevación mínima usado para el filtrado de inclusión de puntos."
              },
              "max_elev": {
                "label": "Elevación máxima",
                "description": "Umbral de elevación máxima usado para el filtrado de inclusión de puntos."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              },
              "triangulation_backend": {
                "label": "Motor de triangulación",
                "description": "Selección del motor de triangulación: auto, delaunator o wbtopology."
              },
              "triangulation_auto_threshold": {
                "label": "Umbral automático de triangulación",
                "description": "Cuando backend=auto, cambia a wbtopology con este número de muestras (predeterminado desactivado; establecer explícitamente para activar)."
              },
              "triangulation_epsilon": {
                "label": "Épsilon de triangulación",
                "description": "Épsilon usado por el manejo de duplicados del motor wbtopology (predeterminado 1e-12)."
              },
              "triangulation_thin_cell_size": {
                "label": "Tamaño de celda de adelgazamiento de triangulación",
                "description": "Tamaño de celda opcional de adelgazamiento previo para las muestras de triangulación; los valores > 0 activan el adelgazamiento y 0 lo desactiva."
              },
              "triangulation_thin_method": {
                "label": "Método de adelgazamiento de triangulación",
                "description": "Método de punto representativo para el adelgazamiento: nearest_center, min_value o max_value."
              }
            }
          },
          "colourize_based_on_class": {
            "name": "Colorear según la clase",
            "description": "Colorea los puntos por clase: colores estándar ASPRS (verde=vegetación, marrón=suelo, gris=edificio, etc.). Se combina con la intensidad para dar contraste. Visualización de la clasificación.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "intensity_blending_amount": {
                "label": "Cantidad de mezcla de intensidad",
                "description": "Mezcla porcentual [0,100] entre el color de clase y la intensidad."
              },
              "clr_str": {
                "label": "Cadena de colores",
                "description": "Sobrescrituras opcionales de colores de clase, p. ej. '2:(184,167,108);5:#9ab86c'."
              },
              "use_unique_clrs_for_buildings": {
                "label": "Usar colores únicos para edificios",
                "description": "Si es verdadero, asigna colores únicos a los clústeres de edificios conexos."
              },
              "search_radius": {
                "label": "Radio de búsqueda",
                "description": "Radio de vecindad usado para el coloreado de clústeres de edificios."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "colourize_based_on_point_returns": {
            "name": "Colorear según los retornos del punto",
            "description": "Colorea los puntos según el orden de retorno: los retornos primero/intermedio/último usan colores distintos. Visualización de la estructura de pulsos con múltiples retornos para validar el procesamiento.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "intensity_blending_amount": {
                "label": "Cantidad de mezcla de intensidad",
                "description": "Mezcla porcentual [0,100] entre el color de retorno y la intensidad."
              },
              "only_ret_colour": {
                "label": "Color de retorno único",
                "description": "Color para los puntos de retorno único."
              },
              "first_ret_colour": {
                "label": "Color de primer retorno",
                "description": "Color para los puntos de primer retorno en pulsos de múltiples retornos."
              },
              "intermediate_ret_colour": {
                "label": "Color de retorno intermedio",
                "description": "Color para los puntos de retorno intermedio."
              },
              "last_ret_colour": {
                "label": "Color de último retorno",
                "description": "Color para los puntos de último retorno en pulsos de múltiples retornos."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "find_flightline_edge_points": {
            "name": "Encontrar puntos de borde de línea de vuelo",
            "description": "Filtra los puntos del borde de vuelo: extrae solo los puntos situados en los límites de la franja de adquisición. Control de calidad del solape entre pasadas y de los efectos de borde.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "individual_tree_detection": {
            "name": "Detección de árboles individuales",
            "description": "Identifica las copas de los árboles: máximos locales en una nube de puntos filtrada por altura con un radio de búsqueda adaptativo. Devuelve un shapefile vectorial de puntos con las posibles ubicaciones de los troncos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado."
              },
              "min_search_radius": {
                "label": "Radio de búsqueda mínimo",
                "description": "Radio de búsqueda mínimo en unidades del mapa (predeterminado 1.0)."
              },
              "min_height": {
                "label": "Altura mínima",
                "description": "Altura mínima para considerar puntos (predeterminado 0.0)."
              },
              "max_search_radius": {
                "label": "Radio de búsqueda máximo",
                "description": "Radio de búsqueda máximo; si no se establece, usa min_search_radius."
              },
              "max_height": {
                "label": "Altura máxima",
                "description": "Altura máxima; si no se establece, usa min_height."
              },
              "only_use_veg": {
                "label": "Usar solo vegetación",
                "description": "Si es verdadero, procesa solo las clases de vegetación (predeterminado true)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del shapefile vectorial de salida."
              }
            }
          },
          "lidar_eigenvalue_features": {
            "name": "Rasgos de autovalores LiDAR",
            "description": "Deriva características PCA: valores/vectores propios de las vecindades. Descriptores de forma (planaridad, linealidad, varianza de la altura) para el análisis de nubes de puntos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta opcional del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "num_neighbours": {
                "label": "Número de vecinos",
                "description": "Tamaño de vecindad objetivo opcional (excluyendo el propio punto)."
              },
              "search_radius": {
                "label": "Radio de búsqueda",
                "description": "Radio de búsqueda máximo opcional para la recopilación de la vecindad."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional de salida .eigen en modo de entrada única."
              }
            }
          },
          "lidar_histogram": {
            "name": "Histograma LiDAR",
            "description": "Calcula la distribución de los atributos: histograma de frecuencias de elevación, intensidad, ángulo de escaneo y clase. Percentiles recortados para suprimir los valores atípicos. Visualización en HTML.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del HTML de salida para el informe de histograma."
              },
              "parameter": {
                "label": "Parámetro",
                "description": "Uno de elevation, intensity, scan angle, class o time."
              },
              "clip_percent": {
                "label": "Porcentaje de recorte",
                "description": "Cantidad de recorte por percentil en [0,50] para las colas inferior/superior."
              }
            }
          },
          "lidar_info": {
            "name": "Información LiDAR",
            "description": "Genera un informe resumen de metadatos: número de puntos, extensión, rango de intensidad, histograma de clases y distribución de retornos. Salida HTML/texto para la documentación de los datos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del informe de salida (.html/.txt)."
              },
              "show_point_density": {
                "label": "Mostrar densidad de puntos",
                "description": "Si es verdadero, incluye métricas aproximadas de densidad de puntos del cuadro delimitador."
              },
              "show_vlrs": {
                "label": "Mostrar VLR",
                "description": "Indicador de compatibilidad; reservado para una futura salida detallada de metadatos."
              },
              "show_geokeys": {
                "label": "Mostrar claves geográficas",
                "description": "Indicador de compatibilidad; reservado para una futura salida detallada de claves CRS."
              }
            }
          },
          "lidar_kappa": {
            "name": "Kappa LiDAR",
            "description": "Calcula un informe de concordancia kappa entre dos nubes LiDAR clasificadas y escribe un ráster de concordancia de clases.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Ruta del LiDAR de clasificación u objeto LiDAR tipado."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Ruta del LiDAR de referencia u objeto LiDAR tipado."
              },
              "report": {
                "label": "Informe",
                "description": "Ruta del informe HTML de salida."
              },
              "resolution": {
                "label": "Resolución",
                "description": "Resolución de malla para la salida espacial de concordancia de clases."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              },
              "output_class_accuracy": {
                "label": "Precisión de clase de salida",
                "description": "Indicador de compatibilidad conservado por paridad heredada; el ráster de concordancia siempre se produce."
              }
            }
          },
          "lidar_point_density": {
            "name": "Densidad de puntos LiDAR",
            "description": "Cartografía la intensidad de muestreo LiDAR: número de puntos por unidad de área (recuentos dentro de un radio por celda). Evaluación de la calidad de los datos, análisis de la cobertura y visualización del patrón de adquisición.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "resolution": {
                "label": "Resolución",
                "description": "Tamaño de celda de salida."
              },
              "search_radius": {
                "label": "Radio de búsqueda",
                "description": "Radio de vecindad para el conteo de puntos."
              },
              "returns_included": {
                "label": "Retornos incluidos",
                "description": "Modo de filtrado de retornos: all, first o last."
              },
              "excluded_classes": {
                "label": "Clases excluidas",
                "description": "Clases a excluir (matriz o cadena delimitada por comas)."
              },
              "min_elev": {
                "label": "Elevación mínima",
                "description": "Umbral de elevación mínima usado para el filtrado de inclusión de puntos."
              },
              "max_elev": {
                "label": "Elevación máxima",
                "description": "Umbral de elevación máxima usado para el filtrado de inclusión de puntos."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "lidar_point_return_analysis": {
            "name": "Análisis de retornos de puntos LiDAR",
            "description": "Herramienta de control de calidad: audita la validez de la secuencia de retornos (coherencia múltiple/primero/último). Genera un informe y una salida clasificada que marca las anomalías de los retornos. Comprobación de la integridad de los datos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado."
              },
              "create_output": {
                "label": "Crear salida",
                "description": "Si es verdadero, escribe una salida LiDAR de control de calidad clasificada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional de salida LiDAR usada cuando create_output=true."
              },
              "report": {
                "label": "Informe",
                "description": "Ruta opcional del informe de texto de salida."
              }
            }
          },
          "lidar_point_stats": {
            "name": "Estadísticas de puntos LiDAR",
            "description": "Crea mallas ráster de estadísticas: número de puntos, número de pulsos, promedio de puntos/pulso, rango de z/intensidad y clase predominante por celda. Análisis con múltiples salidas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta opcional del LiDAR de entrada u objeto LiDAR tipado. Si se omite, se ejecuta en modo por lotes sobre los archivos LiDAR del directorio actual."
              },
              "resolution": {
                "label": "Resolución",
                "description": "Resolución de la malla de salida."
              },
              "num_points": {
                "label": "Número de puntos",
                "description": "Crear ráster de conteo de puntos."
              },
              "num_pulses": {
                "label": "Número de pulsos",
                "description": "Crear ráster de conteo de pulsos de retornos tempranos."
              },
              "avg_points_per_pulse": {
                "label": "Promedio de puntos por pulso",
                "description": "Crear ráster de promedio de puntos por pulso."
              },
              "z_range": {
                "label": "Rango Z",
                "description": "Crear ráster de rango de elevación."
              },
              "intensity_range": {
                "label": "Rango de intensidad",
                "description": "Crear ráster de rango de intensidad."
              },
              "predominant_class": {
                "label": "Clase predominante",
                "description": "Crear ráster de clase predominante."
              },
              "output_directory": {
                "label": "Directorio de salida",
                "description": "Directorio de salida opcional para los rásteres generados."
              }
            }
          },
          "lidar_ransac_planes": {
            "name": "Planos RANSAC LiDAR",
            "description": "Identifica los puntos LiDAR localmente planos mediante el ajuste de planos RANSAC en la vecindad.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado."
              },
              "search_radius": {
                "label": "Radio de búsqueda",
                "description": "Radio de vecindad para el ajuste de planos locales."
              },
              "num_iterations": {
                "label": "Número de iteraciones",
                "description": "Número de iteraciones RANSAC por punto."
              },
              "num_samples": {
                "label": "Número de muestras",
                "description": "Número de puntos vecinos muestreados por iteración RANSAC."
              },
              "inlier_threshold": {
                "label": "Umbral de inliers",
                "description": "Residuo máximo punto-plano para los inliers."
              },
              "acceptable_model_size": {
                "label": "Tamaño de modelo aceptable",
                "description": "Número mínimo de puntos inlier requerido para un modelo plano."
              },
              "max_planar_slope": {
                "label": "Pendiente planar máxima",
                "description": "Pendiente máxima de plano aceptada en grados."
              },
              "classify": {
                "label": "Clasificar",
                "description": "Si es verdadero, clasifica los puntos planos frente a no planos en lugar de filtrarlos."
              },
              "only_last_returns": {
                "label": "Solo últimos retornos",
                "description": "Si es verdadero, usa solo los retornos tardíos en el ajuste del modelo."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "lidar_rooftop_analysis": {
            "name": "Análisis de cubiertas LiDAR",
            "description": "Identifica los segmentos planos de tejados dentro de las huellas de edificios y genera polígonos de segmentos con atributos de tejado.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Rutas LiDAR de entrada u objetos LiDAR tipados."
              },
              "building_footprints": {
                "label": "Huellas de edificios",
                "description": "Capa de polígonos de huellas de edificios."
              },
              "search_radius": {
                "label": "Radio de búsqueda",
                "description": "Radio de vecindad para el análisis local de tejados."
              },
              "inlier_threshold": {
                "label": "Umbral de inliers",
                "description": "Residuo máximo para el soporte plano local."
              },
              "acceptable_model_size": {
                "label": "Tamaño de modelo aceptable",
                "description": "Tamaño mínimo de segmento."
              },
              "max_planar_slope": {
                "label": "Pendiente planar máxima",
                "description": "Pendiente máxima de las facetas de tejado en grados."
              },
              "norm_diff_threshold": {
                "label": "Umbral de diferencia de normales",
                "description": "Diferencia angular máxima entre normales vecinas en grados."
              },
              "azimuth": {
                "label": "Acimut",
                "description": "Acimut de iluminación para la iluminación de facetas al estilo sombreado."
              },
              "altitude": {
                "label": "Altitud",
                "description": "Altitud de iluminación para la iluminación de facetas al estilo sombreado."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida."
              }
            }
          },
          "normal_vectors": {
            "name": "Vectores normales",
            "description": "Calcula las normales de superficie por punto: un PCA sobre la vecindad local estima la orientación del plano. Las normales se almacenan en los registros de los puntos y en una visualización RGB.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del LiDAR de entrada u objeto LiDAR tipado."
              },
              "search_radius": {
                "label": "Radio de búsqueda",
                "description": "Radio de vecindad para el ajuste de planos locales. Los valores <= 0 usan un espaciado nominal estimado."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida."
              }
            }
          },
          "snap_events_to_routes": {
            "name": "Ajustar eventos a rutas",
            "description": "Ajusta los puntos de eventos a las líneas de ruta e informa de diagnósticos de medida/desplazamiento de la ruta.",
            "params": {
              "routes": {
                "label": "Rutas",
                "description": "Capa de líneas de ruta de entrada."
              },
              "events": {
                "label": "Eventos",
                "description": "Capa de puntos de eventos de entrada."
              },
              "max_offset_distance": {
                "label": "Distancia máxima de desplazamiento",
                "description": "Distancia máxima opcional de desplazamiento respecto a la ruta en unidades del mapa."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de puntos de eventos ajustados de salida."
              }
            }
          },
          "locate_points_along_routes": {
            "name": "Localizar puntos a lo largo de rutas",
            "description": "Localiza entidades de puntos a lo largo de líneas de ruta y escribe los atributos de medida de la ruta.",
            "params": {
              "routes": {
                "label": "Rutas",
                "description": "Capa de líneas de ruta de entrada."
              },
              "points": {
                "label": "Puntos",
                "description": "Capa de puntos de entrada a localizar a lo largo de las rutas."
              },
              "max_offset_distance": {
                "label": "Distancia máxima de desplazamiento",
                "description": "Distancia máxima opcional de desplazamiento punto-ruta."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de puntos de salida."
              }
            }
          },
          "points_along_lines": {
            "name": "Puntos a lo largo de líneas",
            "description": "Genera entidades de puntos espaciadas regularmente a lo largo de las polilíneas de entrada para el seguimiento de infraestructuras, el muestreo ambiental y el análisis espacial.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de líneas de entrada."
              },
              "spacing": {
                "label": "Espaciado",
                "description": "Distancia de espaciado entre puntos."
              },
              "include_end": {
                "label": "Incluir extremo",
                "description": "Incluir los extremos de la línea (predeterminado true)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de puntos de salida."
              }
            }
          },
          "route_calibrate": {
            "name": "Calibrar ruta",
            "description": "Calibra las medidas inicial/final de las rutas a partir de puntos de control con medidas conocidas.",
            "params": {
              "routes": {
                "label": "Rutas",
                "description": "Capa de líneas de ruta de entrada."
              },
              "control_points": {
                "label": "Puntos de control",
                "description": "Capa de puntos de control de entrada."
              },
              "control_measure_field": {
                "label": "Campo de medida de control",
                "description": "Campo de los puntos de control que contiene los valores de medida conocidos."
              },
              "route_id_field": {
                "label": "Campo de ID de ruta",
                "description": "Campo opcional de identificador de ruta en routes. Por defecto el FID de la entidad."
              },
              "control_route_id_field": {
                "label": "Campo de ID de ruta de control",
                "description": "Campo opcional de identificador de ruta en los puntos de control. Por defecto el FID de la entidad."
              },
              "from_measure_field": {
                "label": "Campo de medida inicial",
                "description": "Campo de salida para la medida inicial de la ruta (predeterminado 'from_measure')."
              },
              "to_measure_field": {
                "label": "Campo de medida final",
                "description": "Campo de salida para la medida final de la ruta (predeterminado 'to_measure')."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Distancia máxima de desplazamiento de los puntos de control respecto a la geometría de la ruta (predeterminado 1.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de rutas calibradas de salida."
              }
            }
          },
          "route_event_lines_from_layer": {
            "name": "Líneas de eventos de ruta desde capa",
            "description": "Crea eventos lineales de ruta a partir de una capa vectorial de eventos usando las medidas desde/hasta.",
            "params": {
              "routes": {
                "label": "Rutas",
                "description": "Capa de líneas de ruta de entrada."
              },
              "events": {
                "label": "Eventos",
                "description": "Capa vectorial de eventos de entrada."
              },
              "event_route_field": {
                "label": "Campo de ruta del evento",
                "description": "Campo de la capa de eventos que contiene los identificadores de ruta."
              },
              "from_measure_field": {
                "label": "Campo de medida inicial",
                "description": "Campo de la capa de eventos que contiene las medidas iniciales."
              },
              "to_measure_field": {
                "label": "Campo de medida final",
                "description": "Campo de la capa de eventos que contiene las medidas finales."
              },
              "route_id_field": {
                "label": "Campo de ID de ruta",
                "description": "Campo opcional de la capa de rutas que contiene los identificadores de ruta. Por defecto el FID de la entidad."
              },
              "write_event_fid": {
                "label": "Escribir FID del evento",
                "description": "Escribir EVENT_FID para conservar los ID de entidad de los eventos de origen (predeterminado true)."
              },
              "write_event_xy": {
                "label": "Escribir XY del evento",
                "description": "Escribir los atributos X/Y de la geometría del evento de origen (predeterminado false)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de líneas de salida."
              }
            }
          },
          "route_event_lines_from_table": {
            "name": "Líneas de eventos de ruta desde tabla",
            "description": "Crea eventos lineales de ruta a partir de una tabla de eventos CSV y una capa de rutas usando las medidas desde/hasta.",
            "params": {
              "routes": {
                "label": "Rutas",
                "description": "Capa de líneas de ruta de entrada."
              },
              "events": {
                "label": "Eventos",
                "description": "Ruta de la tabla CSV de eventos de entrada."
              },
              "event_route_field": {
                "label": "Campo de ruta del evento",
                "description": "Campo del CSV que contiene los identificadores de ruta."
              },
              "from_measure_field": {
                "label": "Campo de medida inicial",
                "description": "Campo del CSV que contiene las medidas iniciales."
              },
              "to_measure_field": {
                "label": "Campo de medida final",
                "description": "Campo del CSV que contiene las medidas finales."
              },
              "route_id_field": {
                "label": "Campo de ID de ruta",
                "description": "Campo opcional de la capa de rutas que contiene los identificadores de ruta. Por defecto el FID de la entidad."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de líneas de salida."
              }
            }
          },
          "route_event_merge": {
            "name": "Fusionar eventos de ruta",
            "description": "Combina los eventos de ruta adyacentes compatibles.",
            "params": {
              "events": {
                "label": "Eventos",
                "description": "Capa de eventos de entrada que contiene intervalos de ruta."
              },
              "event_route_field": {
                "label": "Campo de ruta del evento",
                "description": "Campo de identificador de ruta de la capa de eventos."
              },
              "from_measure_field": {
                "label": "Campo de medida inicial",
                "description": "Campo de inicio de intervalo de la capa de eventos."
              },
              "to_measure_field": {
                "label": "Campo de medida final",
                "description": "Campo de fin de intervalo de la capa de eventos."
              },
              "group_fields": {
                "label": "Campos de agrupación",
                "description": "Campos opcionales delimitados por comas usados para la compatibilidad de fusión. Por defecto todos los campos que no son de medida."
              },
              "gap_tolerance": {
                "label": "Tolerancia de huecos",
                "description": "Hueco máximo permitido para la fusión por adyacencia (predeterminado 0.0)."
              },
              "conflict_mode": {
                "label": "Modo de conflicto",
                "description": "Modo de manejo de solapes: error|skip (predeterminado error)."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de eventos fusionados de salida."
              }
            }
          },
          "route_event_overlay": {
            "name": "Superponer eventos de ruta",
            "description": "Superpone dos capas de eventos de ruta según el solape de intervalos.",
            "params": {
              "primary_events": {
                "label": "Eventos primarios",
                "description": "Capa de eventos primaria."
              },
              "overlay_events": {
                "label": "Eventos de superposición",
                "description": "Capa de eventos de superposición."
              },
              "primary_route_field": {
                "label": "Campo de ruta primario",
                "description": "Campo de identificador de ruta de la capa primaria."
              },
              "primary_from_measure_field": {
                "label": "Campo de medida inicial primario",
                "description": "Campo de inicio de intervalo de la capa primaria."
              },
              "primary_to_measure_field": {
                "label": "Campo de medida final primario",
                "description": "Campo de fin de intervalo de la capa primaria."
              },
              "overlay_route_field": {
                "label": "Campo de ruta de superposición",
                "description": "Campo de identificador de ruta de la capa de superposición."
              },
              "overlay_from_measure_field": {
                "label": "Campo de medida inicial de superposición",
                "description": "Campo de inicio de intervalo de la capa de superposición."
              },
              "overlay_to_measure_field": {
                "label": "Campo de medida final de superposición",
                "description": "Campo de fin de intervalo de la capa de superposición."
              },
              "min_overlap_length": {
                "label": "Longitud mínima de solape",
                "description": "Longitud mínima de solape a conservar (predeterminado 0.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de superposición de salida."
              }
            }
          },
          "route_event_points_from_layer": {
            "name": "Puntos de eventos de ruta desde capa",
            "description": "Crea eventos puntuales de ruta a partir de una capa vectorial de eventos y una capa de rutas.",
            "params": {
              "routes": {
                "label": "Rutas",
                "description": "Capa de líneas de ruta de entrada."
              },
              "events": {
                "label": "Eventos",
                "description": "Capa vectorial de eventos de entrada."
              },
              "event_route_field": {
                "label": "Campo de ruta del evento",
                "description": "Campo de la capa de eventos que contiene los identificadores de ruta."
              },
              "measure_field": {
                "label": "Campo de medida",
                "description": "Campo de la capa de eventos que contiene las medidas de eventos puntuales."
              },
              "route_id_field": {
                "label": "Campo de ID de ruta",
                "description": "Campo opcional de la capa de rutas que contiene los identificadores de ruta. Por defecto el FID de la entidad."
              },
              "write_event_fid": {
                "label": "Escribir FID del evento",
                "description": "Escribir EVENT_FID para conservar los ID de entidad de los eventos de origen (predeterminado true)."
              },
              "write_event_xy": {
                "label": "Escribir XY del evento",
                "description": "Escribir los atributos X/Y de la geometría del evento de origen (predeterminado false)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de puntos de salida."
              }
            }
          },
          "route_event_points_from_table": {
            "name": "Puntos de eventos de ruta desde tabla",
            "description": "Crea eventos puntuales de ruta a partir de una tabla de eventos CSV y una capa de rutas.",
            "params": {
              "routes": {
                "label": "Rutas",
                "description": "Capa de líneas de ruta de entrada."
              },
              "events": {
                "label": "Eventos",
                "description": "Ruta de la tabla CSV de eventos de entrada."
              },
              "event_route_field": {
                "label": "Campo de ruta del evento",
                "description": "Campo del CSV que contiene los identificadores de ruta."
              },
              "measure_field": {
                "label": "Campo de medida",
                "description": "Campo del CSV que contiene las medidas de eventos puntuales."
              },
              "route_id_field": {
                "label": "Campo de ID de ruta",
                "description": "Campo opcional de la capa de rutas que contiene los identificadores de ruta. Por defecto el FID de la entidad."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de puntos de salida."
              }
            }
          },
          "route_event_split": {
            "name": "Dividir eventos de ruta",
            "description": "Divide los eventos de ruta según medidas de límite por ruta.",
            "params": {
              "events": {
                "label": "Eventos",
                "description": "Capa de eventos de entrada que contiene intervalos de ruta."
              },
              "boundaries": {
                "label": "Límites",
                "description": "Capa de límites de entrada que contiene los puntos de ruptura de medida de ruta."
              },
              "event_route_field": {
                "label": "Campo de ruta del evento",
                "description": "Campo de identificador de ruta de la capa de eventos."
              },
              "from_measure_field": {
                "label": "Campo de medida inicial",
                "description": "Campo de inicio de intervalo de la capa de eventos."
              },
              "to_measure_field": {
                "label": "Campo de medida final",
                "description": "Campo de fin de intervalo de la capa de eventos."
              },
              "boundary_route_field": {
                "label": "Campo de ruta del límite",
                "description": "Campo de identificador de ruta de la capa de límites."
              },
              "boundary_measure_field": {
                "label": "Campo de medida del límite",
                "description": "Campo de medida de la capa de límites."
              },
              "min_segment_length": {
                "label": "Longitud mínima de segmento",
                "description": "Longitud mínima opcional de segmento dividido a conservar (predeterminado 0.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de eventos divididos de salida."
              }
            }
          },
          "route_measure_qa": {
            "name": "Control de calidad de medidas de ruta",
            "description": "Diagnostica huecos, solapes, secuencias no monótonas y medidas duplicadas en las medidas de los eventos de ruta.",
            "params": {
              "events": {
                "label": "Eventos",
                "description": "Capa de eventos de entrada que contiene intervalos de ruta."
              },
              "route_field": {
                "label": "Campo de ruta",
                "description": "Campo de identificador de ruta."
              },
              "from_measure_field": {
                "label": "Campo de medida inicial",
                "description": "Campo de inicio de intervalo."
              },
              "to_measure_field": {
                "label": "Campo de medida final",
                "description": "Campo de fin de intervalo."
              },
              "gap_tolerance": {
                "label": "Tolerancia de huecos",
                "description": "Tolerancia de huecos (predeterminado 0.0)."
              },
              "overlap_tolerance": {
                "label": "Tolerancia de solape",
                "description": "Tolerancia de solape (predeterminado 0.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de diagnósticos de control de calidad de salida."
              }
            }
          },
          "route_recalibrate": {
            "name": "Recalibrar ruta",
            "description": "Recalibra las medidas de rutas editadas a partir de una capa de rutas de referencia conservando la continuidad de las medidas de la ruta.",
            "params": {
              "original_routes": {
                "label": "Rutas originales",
                "description": "Rutas de referencia que contienen medidas calibradas previas."
              },
              "edited_routes": {
                "label": "Rutas editadas",
                "description": "Rutas editadas a recalibrar."
              },
              "route_id_field": {
                "label": "Campo de ID de ruta",
                "description": "Campo opcional de identificador de ruta compartido. Por defecto el FID de la entidad."
              },
              "from_measure_field": {
                "label": "Campo de medida inicial",
                "description": "Nombre del campo de medida inicial (predeterminado 'from_measure')."
              },
              "to_measure_field": {
                "label": "Campo de medida final",
                "description": "Nombre del campo de medida final (predeterminado 'to_measure')."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de rutas recalibradas de salida."
              }
            }
          },
          "build_network_topology": {
            "name": "Construir topología de red",
            "description": "Construye una red de líneas topológica con nodos, con salidas estables de aristas y nodos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de red de líneas de entrada."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste opcional usada al detectar y dividir intersecciones."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de aristas con nodos topológicos de salida."
              },
              "nodes_output": {
                "label": "Salida de nodos",
                "description": "Ruta opcional del vectorial de nodos de salida."
              }
            }
          },
          "closest_facility_network": {
            "name": "Instalación más cercana en la red",
            "description": "Encuentra la ruta de red de coste mínimo desde cada punto de incidente hasta el punto de instalación alcanzable más cercano.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de red de líneas de entrada."
              },
              "incidents": {
                "label": "Incidentes",
                "description": "Capa de puntos de incidentes/demanda."
              },
              "facilities": {
                "label": "Instalaciones",
                "description": "Capa de puntos de instalaciones/oferta."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste de nodos opcional para la construcción del grafo."
              },
              "max_snap_distance": {
                "label": "Distancia máxima de ajuste",
                "description": "Distancia máxima opcional desde los puntos de incidentes/instalaciones al nodo de red más cercano."
              },
              "edge_cost_field": {
                "label": "Campo de coste de arista",
                "description": "Campo numérico de línea opcional usado como multiplicador de impedancia de la longitud del segmento."
              },
              "one_way_field": {
                "label": "Campo de sentido único",
                "description": "Campo de línea opcional que marca las aristas digitalizadas de sentido único (true/1/yes significa solo del primer al segundo vértice)."
              },
              "blocked_field": {
                "label": "Campo de bloqueo",
                "description": "Campo de línea opcional que marca las aristas bloqueadas/cerradas a excluir del enrutamiento (true/1/yes bloquea)."
              },
              "barriers": {
                "label": "Barreras",
                "description": "Capa de puntos de barreras opcional; los nodos de red más cercanos quedan bloqueados para el recorrido."
              },
              "barrier_snap_distance": {
                "label": "Distancia de ajuste de barreras",
                "description": "Distancia máxima opcional desde cada punto de barrera a un nodo de red para el bloqueo."
              },
              "node_cost_points": {
                "label": "Puntos de coste de nodo",
                "description": "Capa de puntos opcional que proporciona costes de entrada por nodo (p. ej., retardo en intersecciones)."
              },
              "node_cost_field": {
                "label": "Campo de coste de nodo",
                "description": "Campo numérico de node_cost_points que contiene los costes no negativos por nodo."
              },
              "node_cost_snap_distance": {
                "label": "Distancia de ajuste de coste de nodo",
                "description": "Distancia máxima opcional desde cada punto de coste de nodo a un nodo de red para la asignación."
              },
              "turn_penalty": {
                "label": "Penalización por giro",
                "description": "Coste aditivo opcional aplicado a los giros no rectos en los nodos de la red."
              },
              "u_turn_penalty": {
                "label": "Penalización por cambio de sentido",
                "description": "Coste aditivo opcional aplicado a las transiciones de cambio de sentido."
              },
              "forbid_u_turns": {
                "label": "Prohibir cambios de sentido",
                "description": "Si es verdadero, prohíbe las transiciones de cambio de sentido."
              },
              "forbid_left_turns": {
                "label": "Prohibir giros a la izquierda",
                "description": "Si es verdadero, prohíbe las transiciones de giro a la izquierda."
              },
              "forbid_right_turns": {
                "label": "Prohibir giros a la derecha",
                "description": "Si es verdadero, prohíbe las transiciones de giro a la derecha."
              },
              "turn_restrictions_csv": {
                "label": "CSV de restricciones de giro",
                "description": "CSV opcional de transiciones de giro con columnas prev_x,prev_y,node_x,node_y,next_x,next_y. Columnas opcionales: forbidden (predeterminado true cuando no se proporciona la columna turn_cost) y turn_cost (o penalty/cost/extra_cost) para el coste aditivo por giro."
              },
              "temporal_cost_profile": {
                "label": "Perfil de coste temporal",
                "description": "CSV opcional que define costes de arista dependientes del tiempo (columnas: edge_id,dow,start_minute,end_minute,value)."
              },
              "temporal_edge_id_field": {
                "label": "Campo de ID de arista temporal",
                "description": "Campo de red opcional usado para emparejar los valores edge_id de temporal_cost_profile (predeterminado EDGE_ID)."
              },
              "departure_time": {
                "label": "Hora de salida",
                "description": "Hora de salida RFC3339 opcional usada para la búsqueda en el perfil temporal."
              },
              "temporal_mode": {
                "label": "Modo temporal",
                "description": "Modo de interpretación temporal opcional: multiplier o absolute."
              },
              "temporal_fallback": {
                "label": "Alternativa temporal",
                "description": "Alternativa opcional cuando falta la fila temporal: static_cost o error."
              },
              "temporal_profile_report": {
                "label": "Informe de perfil temporal",
                "description": "Ruta de salida JSON opcional para los diagnósticos del perfil temporal (cobertura, aristas sin coincidencia, uso de alternativas)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de líneas de ruta a la instalación más cercana de salida."
              }
            }
          },
          "generate_network_nodes": {
            "name": "Generar nodos de red",
            "description": "Genera los nodos de la red y diagnósticos de los nodos a partir de la topología de las líneas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de red de líneas de entrada."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste de nodos opcional para la construcción del grafo."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de puntos de nodos de salida."
              }
            }
          },
          "k_shortest_paths_network": {
            "name": "K rutas más cortas en la red",
            "description": "Encuentra los k caminos simples más cortos entre las coordenadas de inicio y fin sobre una red de líneas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de red de líneas de entrada."
              },
              "start_x": {
                "label": "X inicial",
                "description": "Coordenada x inicial."
              },
              "start_y": {
                "label": "Y inicial",
                "description": "Coordenada y inicial."
              },
              "end_x": {
                "label": "X final",
                "description": "Coordenada x final."
              },
              "end_y": {
                "label": "Y final",
                "description": "Coordenada y final."
              },
              "k": {
                "label": "K",
                "description": "Número de trayectorias más cortas a devolver."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste de nodos opcional para la construcción del grafo."
              },
              "max_snap_distance": {
                "label": "Distancia máxima de ajuste",
                "description": "Distancia máxima opcional desde las coordenadas de inicio/fin al nodo de red más cercano."
              },
              "edge_cost_field": {
                "label": "Campo de coste de arista",
                "description": "Campo numérico de línea opcional usado como multiplicador de impedancia de la longitud del segmento."
              },
              "one_way_field": {
                "label": "Campo de sentido único",
                "description": "Campo de línea opcional que marca las aristas digitalizadas de sentido único (true/1/yes significa solo del primer al segundo vértice)."
              },
              "blocked_field": {
                "label": "Campo de bloqueo",
                "description": "Campo de línea opcional que marca las aristas bloqueadas/cerradas a excluir del enrutamiento (true/1/yes bloquea)."
              },
              "barriers": {
                "label": "Barreras",
                "description": "Capa de puntos de barreras opcional; los nodos de red más cercanos quedan bloqueados para el recorrido."
              },
              "barrier_snap_distance": {
                "label": "Distancia de ajuste de barreras",
                "description": "Distancia máxima opcional desde cada punto de barrera a un nodo de red para el bloqueo."
              },
              "node_cost_points": {
                "label": "Puntos de coste de nodo",
                "description": "Capa de puntos opcional que proporciona costes de entrada por nodo (p. ej., retardo en intersecciones)."
              },
              "node_cost_field": {
                "label": "Campo de coste de nodo",
                "description": "Campo numérico de node_cost_points que contiene los costes no negativos por nodo."
              },
              "node_cost_snap_distance": {
                "label": "Distancia de ajuste de coste de nodo",
                "description": "Distancia máxima opcional desde cada punto de coste de nodo a un nodo de red para la asignación."
              },
              "turn_penalty": {
                "label": "Penalización por giro",
                "description": "Coste aditivo opcional aplicado a los giros no rectos en los nodos de la red."
              },
              "u_turn_penalty": {
                "label": "Penalización por cambio de sentido",
                "description": "Coste aditivo opcional aplicado a las transiciones de cambio de sentido."
              },
              "forbid_u_turns": {
                "label": "Prohibir cambios de sentido",
                "description": "Si es verdadero, prohíbe las transiciones de cambio de sentido."
              },
              "forbid_left_turns": {
                "label": "Prohibir giros a la izquierda",
                "description": "Si es verdadero, prohíbe las transiciones de giro a la izquierda."
              },
              "forbid_right_turns": {
                "label": "Prohibir giros a la derecha",
                "description": "Si es verdadero, prohíbe las transiciones de giro a la derecha."
              },
              "turn_restrictions_csv": {
                "label": "CSV de restricciones de giro",
                "description": "CSV opcional de transiciones de giro con columnas prev_x,prev_y,node_x,node_y,next_x,next_y. Columnas opcionales: forbidden (predeterminado true cuando no se proporciona la columna turn_cost) y turn_cost (o penalty/cost/extra_cost) para el coste aditivo por giro."
              },
              "temporal_cost_profile": {
                "label": "Perfil de coste temporal",
                "description": "CSV opcional que define costes de arista dependientes del tiempo (columnas: edge_id,dow,start_minute,end_minute,value)."
              },
              "temporal_edge_id_field": {
                "label": "Campo de ID de arista temporal",
                "description": "Campo de red opcional usado para emparejar los valores edge_id de temporal_cost_profile (predeterminado EDGE_ID)."
              },
              "departure_time": {
                "label": "Hora de salida",
                "description": "Hora de salida RFC3339 opcional usada para la búsqueda en el perfil temporal."
              },
              "temporal_mode": {
                "label": "Modo temporal",
                "description": "Modo de interpretación temporal opcional: multiplier o absolute."
              },
              "temporal_fallback": {
                "label": "Alternativa temporal",
                "description": "Alternativa opcional cuando falta la fila temporal: static_cost o error."
              },
              "temporal_profile_report": {
                "label": "Informe de perfil temporal",
                "description": "Ruta de salida JSON opcional para los diagnósticos del perfil temporal (cobertura, aristas sin coincidencia, uso de alternativas)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de líneas de salida."
              }
            }
          },
          "location_allocation_network": {
            "name": "Localización-asignación en la red",
            "description": "Selecciona k instalaciones y asigna los puntos de demanda según el coste de red con resolución voraz o exacta, capacidades opcionales y restricciones de candidatos obligatorios/prohibidos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de red de líneas de entrada."
              },
              "demand_points": {
                "label": "Puntos de demanda",
                "description": "Capa de puntos de demanda a asignar."
              },
              "facilities": {
                "label": "Instalaciones",
                "description": "Capa de puntos de instalaciones candidatas."
              },
              "facility_count": {
                "label": "Número de instalaciones",
                "description": "Número de instalaciones a seleccionar (k)."
              },
              "solver_mode": {
                "label": "Modo del solucionador",
                "description": "Modo del solucionador: auto, greedy o exact (exact está pensado para problemas más pequeños)."
              },
              "demand_weight_field": {
                "label": "Campo de peso de demanda",
                "description": "Campo numérico opcional de peso de demanda en demand_points (predeterminado weight=1)."
              },
              "facility_capacity_field": {
                "label": "Campo de capacidad de instalación",
                "description": "Campo numérico opcional de capacidad en facilities; la capacidad se consume con los valores de demand_weight_field."
              },
              "required_facility_field": {
                "label": "Campo de instalación obligatoria",
                "description": "Campo booleano opcional de instalación que marca las candidatas que deben seleccionarse."
              },
              "forbidden_facility_field": {
                "label": "Campo de instalación prohibida",
                "description": "Campo booleano opcional de instalación que marca las candidatas que no deben seleccionarse."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste de nodos opcional para la construcción del grafo."
              },
              "max_snap_distance": {
                "label": "Distancia máxima de ajuste",
                "description": "Distancia máxima opcional desde los puntos de demanda/instalaciones al nodo de red más cercano."
              },
              "edge_cost_field": {
                "label": "Campo de coste de arista",
                "description": "Campo numérico de línea opcional usado como multiplicador de impedancia de la longitud del segmento."
              },
              "one_way_field": {
                "label": "Campo de sentido único",
                "description": "Campo de línea opcional que marca las aristas digitalizadas de sentido único (true/1/yes significa solo del primer al segundo vértice)."
              },
              "blocked_field": {
                "label": "Campo de bloqueo",
                "description": "Campo de línea opcional que marca las aristas bloqueadas/cerradas a excluir del enrutamiento (true/1/yes bloquea)."
              },
              "barriers": {
                "label": "Barreras",
                "description": "Capa de puntos de barreras opcional; los nodos de red más cercanos quedan bloqueados para el recorrido."
              },
              "barrier_snap_distance": {
                "label": "Distancia de ajuste de barreras",
                "description": "Distancia máxima opcional desde cada punto de barrera a un nodo de red para el bloqueo."
              },
              "node_cost_points": {
                "label": "Puntos de coste de nodo",
                "description": "Capa de puntos opcional que proporciona costes de entrada por nodo (p. ej., retardo en intersecciones)."
              },
              "node_cost_field": {
                "label": "Campo de coste de nodo",
                "description": "Campo numérico de node_cost_points que contiene los costes no negativos por nodo."
              },
              "node_cost_snap_distance": {
                "label": "Distancia de ajuste de coste de nodo",
                "description": "Distancia máxima opcional desde cada punto de coste de nodo a un nodo de red para la asignación."
              },
              "turn_penalty": {
                "label": "Penalización por giro",
                "description": "Coste aditivo opcional aplicado a los giros no rectos en los nodos de la red."
              },
              "u_turn_penalty": {
                "label": "Penalización por cambio de sentido",
                "description": "Coste aditivo opcional aplicado a las transiciones de cambio de sentido."
              },
              "forbid_u_turns": {
                "label": "Prohibir cambios de sentido",
                "description": "Si es verdadero, prohíbe las transiciones de cambio de sentido."
              },
              "forbid_left_turns": {
                "label": "Prohibir giros a la izquierda",
                "description": "Si es verdadero, prohíbe las transiciones de giro a la izquierda."
              },
              "forbid_right_turns": {
                "label": "Prohibir giros a la derecha",
                "description": "Si es verdadero, prohíbe las transiciones de giro a la derecha."
              },
              "turn_restrictions_csv": {
                "label": "CSV de restricciones de giro",
                "description": "CSV opcional de transiciones de giro con columnas prev_x,prev_y,node_x,node_y,next_x,next_y. Columnas opcionales: forbidden (predeterminado true cuando no se proporciona la columna turn_cost) y turn_cost (o penalty/cost/extra_cost) para el coste aditivo por giro."
              },
              "temporal_cost_profile": {
                "label": "Perfil de coste temporal",
                "description": "CSV opcional que define costes de arista dependientes del tiempo (columnas: edge_id,dow,start_minute,end_minute,value)."
              },
              "temporal_edge_id_field": {
                "label": "Campo de ID de arista temporal",
                "description": "Campo de red opcional usado para emparejar los valores edge_id de temporal_cost_profile (predeterminado EDGE_ID)."
              },
              "departure_time": {
                "label": "Hora de salida",
                "description": "Hora de salida RFC3339 opcional usada para la búsqueda en el perfil temporal."
              },
              "temporal_mode": {
                "label": "Modo temporal",
                "description": "Modo de interpretación temporal opcional: multiplier o absolute."
              },
              "temporal_fallback": {
                "label": "Alternativa temporal",
                "description": "Alternativa opcional cuando falta la fila temporal: static_cost o error."
              },
              "temporal_profile_report": {
                "label": "Informe de perfil temporal",
                "description": "Ruta de salida JSON opcional para los diagnósticos del perfil temporal (cobertura, aristas sin coincidencia, uso de alternativas)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de líneas de rutas asignadas de salida."
              }
            }
          },
          "map_matching_v1": {
            "name": "Emparejamiento de mapa v1",
            "description": "Ajusta los puntos de trayectoria a una red de líneas y reconstruye una ruta inferida con diagnósticos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de red de líneas de entrada."
              },
              "trajectory_points": {
                "label": "Puntos de trayectoria",
                "description": "Capa de puntos de trayectoria de entrada."
              },
              "timestamp_field": {
                "label": "Campo de marca de tiempo",
                "description": "Campo de la trayectoria usado para la ordenación temporal."
              },
              "search_radius": {
                "label": "Radio de búsqueda",
                "description": "Radio de búsqueda de candidatos opcional alrededor de cada punto de la trayectoria."
              },
              "candidate_k": {
                "label": "K de candidatos",
                "description": "Número opcional de candidatos más cercanos retenidos por punto."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste de nodos opcional para la construcción del grafo."
              },
              "max_snap_distance": {
                "label": "Distancia máxima de ajuste",
                "description": "Distancia máxima opcional para ajustar los puntos de la trayectoria a los nodos de la red."
              },
              "edge_cost_field": {
                "label": "Campo de coste de arista",
                "description": "Campo numérico de línea opcional usado como multiplicador de impedancia de la longitud del segmento."
              },
              "one_way_field": {
                "label": "Campo de sentido único",
                "description": "Campo de línea opcional que marca las aristas digitalizadas de sentido único (admite FT/TF/B más valores booleanos heredados)."
              },
              "blocked_field": {
                "label": "Campo de bloqueo",
                "description": "Campo de línea opcional que marca las aristas bloqueadas/cerradas a excluir del enrutamiento (true/1/yes bloquea)."
              },
              "barriers": {
                "label": "Barreras",
                "description": "Capa de puntos de barreras opcional; los nodos de red más cercanos quedan bloqueados para el recorrido."
              },
              "barrier_snap_distance": {
                "label": "Distancia de ajuste de barreras",
                "description": "Distancia máxima opcional desde cada punto de barrera a un nodo de red para el bloqueo."
              },
              "node_cost_points": {
                "label": "Puntos de coste de nodo",
                "description": "Capa de puntos opcional que proporciona costes de entrada por nodo (p. ej., retardo en intersecciones)."
              },
              "node_cost_field": {
                "label": "Campo de coste de nodo",
                "description": "Campo numérico de node_cost_points que contiene los costes no negativos por nodo."
              },
              "node_cost_snap_distance": {
                "label": "Distancia de ajuste de coste de nodo",
                "description": "Distancia máxima opcional desde cada punto de coste de nodo a un nodo de red para la asignación."
              },
              "turn_penalty": {
                "label": "Penalización por giro",
                "description": "Coste aditivo opcional aplicado a los giros no rectos en los nodos de la red."
              },
              "u_turn_penalty": {
                "label": "Penalización por cambio de sentido",
                "description": "Coste aditivo opcional aplicado a las transiciones de cambio de sentido."
              },
              "forbid_u_turns": {
                "label": "Prohibir cambios de sentido",
                "description": "Si es verdadero, prohíbe las transiciones de cambio de sentido."
              },
              "forbid_left_turns": {
                "label": "Prohibir giros a la izquierda",
                "description": "Si es verdadero, prohíbe las transiciones de giro a la izquierda."
              },
              "forbid_right_turns": {
                "label": "Prohibir giros a la derecha",
                "description": "Si es verdadero, prohíbe las transiciones de giro a la derecha."
              },
              "turn_restrictions_csv": {
                "label": "CSV de restricciones de giro",
                "description": "CSV opcional de transiciones de giro con columnas prev_x,prev_y,node_x,node_y,next_x,next_y. Columnas opcionales: forbidden (predeterminado true cuando no se proporciona la columna turn_cost) y turn_cost (o penalty/cost/extra_cost) para el coste aditivo por giro."
              },
              "matched_points_output": {
                "label": "Salida de puntos emparejados",
                "description": "Ruta opcional del vectorial de salida para los diagnósticos por punto."
              },
              "match_report": {
                "label": "Informe de emparejamiento",
                "description": "Ruta de salida JSON opcional para los diagnósticos de resumen."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de líneas de salida para la ruta inferida."
              }
            }
          },
          "multimodal_od_cost_matrix": {
            "name": "Matriz de costes OD multimodal",
            "description": "Calcula por lotes los costes OD multimodales y resúmenes por modo entre conjuntos de puntos de origen y destino.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de red de líneas de entrada."
              },
              "origins": {
                "label": "Orígenes",
                "description": "Capa de puntos de origen."
              },
              "destinations": {
                "label": "Destinos",
                "description": "Capa de puntos de destino."
              },
              "mode_field": {
                "label": "Campo de modo",
                "description": "Campo de atributo de línea que identifica el modo de viaje por segmento."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste de nodos opcional para la construcción del grafo."
              },
              "max_snap_distance": {
                "label": "Distancia máxima de ajuste",
                "description": "Distancia máxima opcional desde los puntos de origen/destino al nodo de red más cercano."
              },
              "default_mode_speed": {
                "label": "Velocidad predeterminada del modo",
                "description": "Velocidad predeterminada del modo en unidades de coordenadas por unidad de tiempo (predeterminado: 1)."
              },
              "mode_speed_overrides": {
                "label": "Velocidades por modo",
                "description": "Sobrescrituras opcionales modo:velocidad separadas por comas (por ejemplo: walk:1.4,drive:12,transit:8)."
              },
              "allowed_modes": {
                "label": "Modos permitidos",
                "description": "Lista blanca opcional separada por comas de modos a incluir en el enrutamiento."
              },
              "transfer_penalty": {
                "label": "Penalización por transbordo",
                "description": "Penalización aditiva opcional aplicada cada vez que la ruta cambia de modo."
              },
              "temporal_cost_profile": {
                "label": "Perfil de coste temporal",
                "description": "CSV opcional que define costes de arista dependientes del tiempo (columnas: edge_id,dow,start_minute,end_minute,value)."
              },
              "temporal_edge_id_field": {
                "label": "Campo de ID de arista temporal",
                "description": "Campo de red opcional usado para emparejar los valores edge_id de temporal_cost_profile (predeterminado EDGE_ID)."
              },
              "departure_time": {
                "label": "Hora de salida",
                "description": "Hora de salida RFC3339 opcional usada para la búsqueda en el perfil temporal."
              },
              "temporal_mode": {
                "label": "Modo temporal",
                "description": "Modo de interpretación temporal opcional: multiplier o absolute."
              },
              "temporal_fallback": {
                "label": "Alternativa temporal",
                "description": "Alternativa opcional cuando falta la fila temporal: static_cost o error."
              },
              "temporal_profile_report": {
                "label": "Informe de perfil temporal",
                "description": "Ruta de salida JSON opcional para los diagnósticos del perfil temporal cuando se usa entrada temporal directa."
              },
              "scenario_bundle_csv": {
                "label": "CSV del paquete de escenarios",
                "description": "CSV opcional que lista escenarios temporales con nombre para una salida OD comparativa multiescenario."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del CSV de salida."
              }
            }
          },
          "multimodal_routes_from_od": {
            "name": "Rutas multimodales desde OD",
            "description": "Construye las geometrías de las rutas para pares de puntos origen-destino multimodales con resúmenes por modo para cada ruta.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de red de líneas de entrada."
              },
              "origins": {
                "label": "Orígenes",
                "description": "Capa de puntos de origen."
              },
              "destinations": {
                "label": "Destinos",
                "description": "Capa de puntos de destino."
              },
              "mode_field": {
                "label": "Campo de modo",
                "description": "Campo de atributo de línea que identifica el modo de viaje por segmento."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste de nodos opcional para la construcción del grafo."
              },
              "max_snap_distance": {
                "label": "Distancia máxima de ajuste",
                "description": "Distancia máxima opcional desde los puntos de origen/destino al nodo de red más cercano."
              },
              "default_mode_speed": {
                "label": "Velocidad predeterminada del modo",
                "description": "Velocidad predeterminada del modo en unidades de coordenadas por unidad de tiempo (predeterminado: 1)."
              },
              "mode_speed_overrides": {
                "label": "Velocidades por modo",
                "description": "Sobrescrituras opcionales modo:velocidad separadas por comas (por ejemplo: walk:1.4,drive:12,transit:8)."
              },
              "allowed_modes": {
                "label": "Modos permitidos",
                "description": "Lista blanca opcional separada por comas de modos a incluir en el enrutamiento."
              },
              "transfer_penalty": {
                "label": "Penalización por transbordo",
                "description": "Penalización aditiva opcional aplicada cada vez que la ruta cambia de modo."
              },
              "temporal_cost_profile": {
                "label": "Perfil de coste temporal",
                "description": "CSV opcional que define costes de arista dependientes del tiempo (columnas: edge_id,dow,start_minute,end_minute,value)."
              },
              "temporal_edge_id_field": {
                "label": "Campo de ID de arista temporal",
                "description": "Campo de red opcional usado para emparejar los valores edge_id de temporal_cost_profile (predeterminado EDGE_ID)."
              },
              "departure_time": {
                "label": "Hora de salida",
                "description": "Hora de salida RFC3339 opcional usada para la búsqueda en el perfil temporal."
              },
              "temporal_mode": {
                "label": "Modo temporal",
                "description": "Modo de interpretación temporal opcional: multiplier o absolute."
              },
              "temporal_fallback": {
                "label": "Alternativa temporal",
                "description": "Alternativa opcional cuando falta la fila temporal: static_cost o error."
              },
              "temporal_profile_report": {
                "label": "Informe de perfil temporal",
                "description": "Ruta de salida JSON opcional para los diagnósticos del perfil temporal cuando se usa entrada temporal directa."
              },
              "scenario_bundle_csv": {
                "label": "CSV del paquete de escenarios",
                "description": "CSV opcional que lista escenarios temporales con nombre para una salida de rutas comparativa multiescenario."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de líneas de ruta de salida."
              }
            }
          },
          "multimodal_shortest_path": {
            "name": "Ruta multimodal más corta",
            "description": "Encuentra un camino más corto que tiene en cuenta los modos sobre una red de líneas con penalizaciones de transbordo configurables.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de red de líneas de entrada."
              },
              "start_x": {
                "label": "X inicial",
                "description": "Coordenada x inicial."
              },
              "start_y": {
                "label": "Y inicial",
                "description": "Coordenada y inicial."
              },
              "end_x": {
                "label": "X final",
                "description": "Coordenada x final."
              },
              "end_y": {
                "label": "Y final",
                "description": "Coordenada y final."
              },
              "mode_field": {
                "label": "Campo de modo",
                "description": "Campo de atributo de línea que identifica el modo de viaje por segmento."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste de nodos opcional para la construcción del grafo."
              },
              "max_snap_distance": {
                "label": "Distancia máxima de ajuste",
                "description": "Distancia máxima opcional desde las coordenadas de inicio/fin al nodo de red más cercano."
              },
              "default_mode_speed": {
                "label": "Velocidad predeterminada del modo",
                "description": "Velocidad predeterminada del modo en unidades de coordenadas por unidad de tiempo (predeterminado: 1)."
              },
              "mode_speed_overrides": {
                "label": "Velocidades por modo",
                "description": "Sobrescrituras opcionales modo:velocidad separadas por comas (por ejemplo: walk:1.4,drive:12,transit:8)."
              },
              "allowed_modes": {
                "label": "Modos permitidos",
                "description": "Lista blanca opcional separada por comas de modos a incluir en el enrutamiento."
              },
              "transfer_penalty": {
                "label": "Penalización por transbordo",
                "description": "Penalización aditiva opcional aplicada cada vez que la ruta cambia de modo."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de líneas de salida."
              }
            }
          },
          "network_accessibility_metrics": {
            "name": "Métricas de accesibilidad de red",
            "description": "Calcula índices de accesibilidad para los puntos de origen en función de la alcanzabilidad de los destinos, con límites de impedancia y funciones de decaimiento opcionales.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de red de líneas de entrada."
              },
              "origins": {
                "label": "Orígenes",
                "description": "Capa de puntos de origen."
              },
              "destinations": {
                "label": "Destinos",
                "description": "Capa de puntos de destino."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste de nodos opcional para la construcción del grafo."
              },
              "max_snap_distance": {
                "label": "Distancia máxima de ajuste",
                "description": "Distancia máxima opcional desde los puntos de origen/destino al nodo de red más cercano."
              },
              "impedance_cutoff": {
                "label": "Corte de impedancia",
                "description": "Umbral opcional de distancia máxima para contar los destinos alcanzables (predeterminado: infinito)."
              },
              "decay_function": {
                "label": "Función de decaimiento",
                "description": "Función de decaimiento opcional: 'none' (predeterminado), 'linear' o 'exponential' para accesibilidad ponderada por distancia."
              },
              "decay_parameter": {
                "label": "Parámetro de decaimiento",
                "description": "Parámetro de decaimiento opcional (lambda para exponencial, tasa para lineal)."
              },
              "edge_cost_field": {
                "label": "Campo de coste de arista",
                "description": "Campo numérico de línea opcional usado como multiplicador de impedancia de la longitud del segmento."
              },
              "one_way_field": {
                "label": "Campo de sentido único",
                "description": "Campo de línea opcional que marca las aristas digitalizadas de sentido único (admite FT/TF/B más valores booleanos heredados)."
              },
              "blocked_field": {
                "label": "Campo de bloqueo",
                "description": "Campo de línea opcional que marca las aristas bloqueadas/cerradas a excluir del enrutamiento (true/1/yes bloquea)."
              },
              "node_cost_points": {
                "label": "Puntos de coste de nodo",
                "description": "Capa de puntos opcional que proporciona costes de entrada por nodo (p. ej., retardo en intersecciones)."
              },
              "node_cost_field": {
                "label": "Campo de coste de nodo",
                "description": "Campo numérico de node_cost_points que contiene los costes no negativos por nodo."
              },
              "node_cost_snap_distance": {
                "label": "Distancia de ajuste de coste de nodo",
                "description": "Distancia máxima opcional desde cada punto de coste de nodo a un nodo de red para la asignación."
              },
              "parallel_execution": {
                "label": "Ejecución en paralelo",
                "description": "Si es verdadero (predeterminado), evalúa los orígenes en paralelo para un cálculo de accesibilidad más rápido."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de puntos de salida (orígenes con métricas de accesibilidad)."
              }
            }
          },
          "network_centrality_metrics": {
            "name": "Métricas de centralidad de red",
            "description": "Calcula métricas básicas de centralidad de grado, cercanía e intermediación para los nodos de la red.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de red de líneas de entrada."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste de nodos opcional para la construcción del grafo."
              },
              "edge_cost_field": {
                "label": "Campo de coste de arista",
                "description": "Campo numérico de línea opcional usado como multiplicador de impedancia de la longitud del segmento."
              },
              "one_way_field": {
                "label": "Campo de sentido único",
                "description": "Campo de línea opcional que marca las aristas digitalizadas de sentido único (admite FT/TF/B más valores booleanos heredados)."
              },
              "blocked_field": {
                "label": "Campo de bloqueo",
                "description": "Campo de línea opcional que marca las aristas bloqueadas/cerradas a excluir de la construcción del grafo (true/1/yes bloquea)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de puntos de salida."
              }
            }
          },
          "network_connected_components": {
            "name": "Componentes conexos de la red",
            "description": "Asigna un ID de componente conectado a cada entidad lineal de una red.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de red de líneas de entrada."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste de nodos opcional para la construcción del grafo."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de líneas de salida."
              }
            }
          },
          "network_node_degree": {
            "name": "Grado de los nodos de red",
            "description": "Extrae los nodos de la red a partir de entidades lineales y calcula el grado y el tipo de nodo.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de red de líneas de entrada."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste de nodos opcional para la construcción del grafo."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de puntos de salida."
              }
            }
          },
          "network_od_cost_matrix": {
            "name": "Matriz de costes OD de red",
            "description": "Calcula los costes de camino más corto origen-destino sobre una red de líneas y escribe una matriz CSV.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de red de líneas de entrada."
              },
              "origins": {
                "label": "Orígenes",
                "description": "Capa de puntos de origen."
              },
              "destinations": {
                "label": "Destinos",
                "description": "Capa de puntos de destino."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste de nodos opcional para la construcción del grafo."
              },
              "max_snap_distance": {
                "label": "Distancia máxima de ajuste",
                "description": "Distancia máxima opcional desde los puntos de origen/destino al nodo de red más cercano."
              },
              "edge_cost_field": {
                "label": "Campo de coste de arista",
                "description": "Campo numérico de línea opcional usado como multiplicador de impedancia de la longitud del segmento."
              },
              "one_way_field": {
                "label": "Campo de sentido único",
                "description": "Campo de línea opcional que marca las aristas digitalizadas de sentido único (admite FT/TF/B más valores booleanos heredados)."
              },
              "blocked_field": {
                "label": "Campo de bloqueo",
                "description": "Campo de línea opcional que marca las aristas bloqueadas/cerradas a excluir del enrutamiento (true/1/yes bloquea)."
              },
              "barriers": {
                "label": "Barreras",
                "description": "Capa de puntos de barreras opcional; los nodos de red más cercanos quedan bloqueados para el recorrido."
              },
              "barrier_snap_distance": {
                "label": "Distancia de ajuste de barreras",
                "description": "Distancia máxima opcional desde cada punto de barrera a un nodo de red para el bloqueo."
              },
              "node_cost_points": {
                "label": "Puntos de coste de nodo",
                "description": "Capa de puntos opcional que proporciona costes de entrada por nodo (p. ej., retardo en intersecciones)."
              },
              "node_cost_field": {
                "label": "Campo de coste de nodo",
                "description": "Campo numérico de node_cost_points que contiene los costes no negativos por nodo."
              },
              "node_cost_snap_distance": {
                "label": "Distancia de ajuste de coste de nodo",
                "description": "Distancia máxima opcional desde cada punto de coste de nodo a un nodo de red para la asignación."
              },
              "turn_penalty": {
                "label": "Penalización por giro",
                "description": "Coste aditivo opcional aplicado a los giros no rectos en los nodos de la red."
              },
              "u_turn_penalty": {
                "label": "Penalización por cambio de sentido",
                "description": "Coste aditivo opcional aplicado a las transiciones de cambio de sentido."
              },
              "forbid_u_turns": {
                "label": "Prohibir cambios de sentido",
                "description": "Si es verdadero, prohíbe las transiciones de cambio de sentido."
              },
              "forbid_left_turns": {
                "label": "Prohibir giros a la izquierda",
                "description": "Si es verdadero, prohíbe las transiciones de giro a la izquierda."
              },
              "forbid_right_turns": {
                "label": "Prohibir giros a la derecha",
                "description": "Si es verdadero, prohíbe las transiciones de giro a la derecha."
              },
              "turn_restrictions_csv": {
                "label": "CSV de restricciones de giro",
                "description": "CSV opcional de transiciones de giro con columnas prev_x,prev_y,node_x,node_y,next_x,next_y. Columnas opcionales: forbidden (predeterminado true cuando no se proporciona la columna turn_cost) y turn_cost (o penalty/cost/extra_cost) para el coste aditivo por giro."
              },
              "temporal_cost_profile": {
                "label": "Perfil de coste temporal",
                "description": "CSV opcional que define costes de arista dependientes del tiempo (columnas: edge_id,dow,start_minute,end_minute,value)."
              },
              "temporal_edge_id_field": {
                "label": "Campo de ID de arista temporal",
                "description": "Campo de red opcional usado para emparejar los valores edge_id de temporal_cost_profile (predeterminado EDGE_ID)."
              },
              "departure_time": {
                "label": "Hora de salida",
                "description": "Hora de salida RFC3339 opcional usada para la búsqueda en el perfil temporal."
              },
              "temporal_mode": {
                "label": "Modo temporal",
                "description": "Modo de interpretación temporal opcional: multiplier o absolute."
              },
              "temporal_fallback": {
                "label": "Alternativa temporal",
                "description": "Alternativa opcional cuando falta la fila temporal: static_cost o error."
              },
              "temporal_profile_report": {
                "label": "Informe de perfil temporal",
                "description": "Ruta de salida JSON opcional para los diagnósticos del perfil temporal (cobertura, aristas sin coincidencia, uso de alternativas)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del CSV de salida."
              }
            }
          },
          "network_routes_from_od": {
            "name": "Rutas de red desde OD",
            "description": "Construye las geometrías de las rutas para pares de puntos origen-destino sobre una red de líneas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de red de líneas de entrada."
              },
              "origins": {
                "label": "Orígenes",
                "description": "Capa de puntos de origen."
              },
              "destinations": {
                "label": "Destinos",
                "description": "Capa de puntos de destino."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste de nodos opcional para la construcción del grafo."
              },
              "max_snap_distance": {
                "label": "Distancia máxima de ajuste",
                "description": "Distancia máxima opcional desde los puntos de origen/destino al nodo de red más cercano."
              },
              "edge_cost_field": {
                "label": "Campo de coste de arista",
                "description": "Campo numérico de línea opcional usado como multiplicador de impedancia de la longitud del segmento."
              },
              "one_way_field": {
                "label": "Campo de sentido único",
                "description": "Campo de línea opcional que marca las aristas digitalizadas de sentido único (admite FT/TF/B más valores booleanos heredados)."
              },
              "blocked_field": {
                "label": "Campo de bloqueo",
                "description": "Campo de línea opcional que marca las aristas bloqueadas/cerradas a excluir del enrutamiento (true/1/yes bloquea)."
              },
              "barriers": {
                "label": "Barreras",
                "description": "Capa de puntos de barreras opcional; los nodos de red más cercanos quedan bloqueados para el recorrido."
              },
              "barrier_snap_distance": {
                "label": "Distancia de ajuste de barreras",
                "description": "Distancia máxima opcional desde cada punto de barrera a un nodo de red para el bloqueo."
              },
              "node_cost_points": {
                "label": "Puntos de coste de nodo",
                "description": "Capa de puntos opcional que proporciona costes de entrada por nodo (p. ej., retardo en intersecciones)."
              },
              "node_cost_field": {
                "label": "Campo de coste de nodo",
                "description": "Campo numérico de node_cost_points que contiene los costes no negativos por nodo."
              },
              "node_cost_snap_distance": {
                "label": "Distancia de ajuste de coste de nodo",
                "description": "Distancia máxima opcional desde cada punto de coste de nodo a un nodo de red para la asignación."
              },
              "turn_penalty": {
                "label": "Penalización por giro",
                "description": "Coste aditivo opcional aplicado a los giros no rectos en los nodos de la red."
              },
              "u_turn_penalty": {
                "label": "Penalización por cambio de sentido",
                "description": "Coste aditivo opcional aplicado a las transiciones de cambio de sentido."
              },
              "forbid_u_turns": {
                "label": "Prohibir cambios de sentido",
                "description": "Si es verdadero, prohíbe las transiciones de cambio de sentido."
              },
              "forbid_left_turns": {
                "label": "Prohibir giros a la izquierda",
                "description": "Si es verdadero, prohíbe las transiciones de giro a la izquierda."
              },
              "forbid_right_turns": {
                "label": "Prohibir giros a la derecha",
                "description": "Si es verdadero, prohíbe las transiciones de giro a la derecha."
              },
              "turn_restrictions_csv": {
                "label": "CSV de restricciones de giro",
                "description": "CSV opcional de transiciones de giro con columnas prev_x,prev_y,node_x,node_y,next_x,next_y. Columnas opcionales: forbidden (predeterminado true cuando no se proporciona la columna turn_cost) y turn_cost (o penalty/cost/extra_cost) para el coste aditivo por giro."
              },
              "temporal_cost_profile": {
                "label": "Perfil de coste temporal",
                "description": "CSV opcional que define costes de arista dependientes del tiempo (columnas: edge_id,dow,start_minute,end_minute,value)."
              },
              "temporal_edge_id_field": {
                "label": "Campo de ID de arista temporal",
                "description": "Campo de red opcional usado para emparejar los valores edge_id de temporal_cost_profile (predeterminado EDGE_ID)."
              },
              "departure_time": {
                "label": "Hora de salida",
                "description": "Hora de salida RFC3339 opcional usada para la búsqueda en el perfil temporal."
              },
              "temporal_mode": {
                "label": "Modo temporal",
                "description": "Modo de interpretación temporal opcional: multiplier o absolute."
              },
              "temporal_fallback": {
                "label": "Alternativa temporal",
                "description": "Alternativa opcional cuando falta la fila temporal: static_cost o error."
              },
              "temporal_profile_report": {
                "label": "Informe de perfil temporal",
                "description": "Ruta de salida JSON opcional para los diagnósticos del perfil temporal (cobertura, aristas sin coincidencia, uso de alternativas)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de líneas de ruta de salida."
              }
            }
          },
          "network_service_area": {
            "name": "Área de servicio de red",
            "description": "Calcula los nodos de la red alcanzables desde los puntos de origen dentro de un coste de red máximo.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de red de líneas de entrada."
              },
              "origins": {
                "label": "Orígenes",
                "description": "Capa de puntos de origen."
              },
              "max_cost": {
                "label": "Coste máximo",
                "description": "Coste máximo de trayectoria alcanzable."
              },
              "ring_costs": {
                "label": "Costes de anillos",
                "description": "Umbrales de anillos opcionales separados por comas para salidas multianillo (por ejemplo: 5,10,15)."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste de nodos opcional para la construcción del grafo."
              },
              "max_snap_distance": {
                "label": "Distancia máxima de ajuste",
                "description": "Distancia máxima opcional desde los puntos de origen al nodo de red más cercano."
              },
              "output_mode": {
                "label": "Modo de salida",
                "description": "Modo de salida: 'nodes' (predeterminado), 'edges' para segmentos de arista alcanzables recortados por coste, o 'polygons' para polígonos de tipo isócrona por origen a partir de las envolventes de aristas alcanzables."
              },
              "polygon_merge_origins": {
                "label": "Fusionar orígenes de polígonos",
                "description": "Si es verdadero y output_mode='polygons', disuelve los polígonos de origen solapados en una cobertura fusionada por anillo en lugar de emitir un polígono por origen."
              },
              "mode_field": {
                "label": "Campo de modo",
                "description": "Campo de atributo de línea opcional que identifica el modo de viaje por segmento; habilita costes de área de servicio sensibles al modo."
              },
              "default_mode_speed": {
                "label": "Velocidad predeterminada del modo",
                "description": "Velocidad predeterminada del modo en unidades de coordenadas por unidad de tiempo cuando se proporciona mode_field (predeterminado: 1)."
              },
              "mode_speed_overrides": {
                "label": "Velocidades por modo",
                "description": "Sobrescrituras opcionales modo:velocidad separadas por comas (por ejemplo: walk:1.4,drive:12)."
              },
              "allowed_modes": {
                "label": "Modos permitidos",
                "description": "Lista blanca opcional separada por comas de modos a incluir cuando se proporciona mode_field."
              },
              "edge_cost_field": {
                "label": "Campo de coste de arista",
                "description": "Campo numérico de línea opcional usado como multiplicador de impedancia de la longitud del segmento."
              },
              "one_way_field": {
                "label": "Campo de sentido único",
                "description": "Campo de línea opcional que marca las aristas digitalizadas de sentido único (admite FT/TF/B más valores booleanos heredados)."
              },
              "blocked_field": {
                "label": "Campo de bloqueo",
                "description": "Campo de línea opcional que marca las aristas bloqueadas/cerradas a excluir del enrutamiento (true/1/yes bloquea)."
              },
              "barriers": {
                "label": "Barreras",
                "description": "Capa de puntos de barreras opcional; los nodos de red más cercanos quedan bloqueados para el recorrido."
              },
              "barrier_snap_distance": {
                "label": "Distancia de ajuste de barreras",
                "description": "Distancia máxima opcional desde cada punto de barrera a un nodo de red para el bloqueo."
              },
              "node_cost_points": {
                "label": "Puntos de coste de nodo",
                "description": "Capa de puntos opcional que proporciona costes de entrada por nodo (p. ej., retardo en intersecciones)."
              },
              "node_cost_field": {
                "label": "Campo de coste de nodo",
                "description": "Campo numérico de node_cost_points que contiene los costes no negativos por nodo."
              },
              "node_cost_snap_distance": {
                "label": "Distancia de ajuste de coste de nodo",
                "description": "Distancia máxima opcional desde cada punto de coste de nodo a un nodo de red para la asignación."
              },
              "turn_penalty": {
                "label": "Penalización por giro",
                "description": "Coste aditivo opcional aplicado a los giros no rectos en los nodos de la red."
              },
              "u_turn_penalty": {
                "label": "Penalización por cambio de sentido",
                "description": "Coste aditivo opcional aplicado a las transiciones de cambio de sentido."
              },
              "forbid_u_turns": {
                "label": "Prohibir cambios de sentido",
                "description": "Si es verdadero, prohíbe las transiciones de cambio de sentido."
              },
              "forbid_left_turns": {
                "label": "Prohibir giros a la izquierda",
                "description": "Si es verdadero, prohíbe las transiciones de giro a la izquierda."
              },
              "forbid_right_turns": {
                "label": "Prohibir giros a la derecha",
                "description": "Si es verdadero, prohíbe las transiciones de giro a la derecha."
              },
              "turn_restrictions_csv": {
                "label": "CSV de restricciones de giro",
                "description": "CSV opcional de transiciones de giro con columnas prev_x,prev_y,node_x,node_y,next_x,next_y. Columnas opcionales: forbidden (predeterminado true cuando no se proporciona la columna turn_cost) y turn_cost (o penalty/cost/extra_cost) para el coste aditivo por giro."
              },
              "temporal_cost_profile": {
                "label": "Perfil de coste temporal",
                "description": "CSV opcional que define costes de arista dependientes del tiempo (columnas: edge_id,dow,start_minute,end_minute,value)."
              },
              "temporal_edge_id_field": {
                "label": "Campo de ID de arista temporal",
                "description": "Campo de red opcional usado para emparejar los valores edge_id de temporal_cost_profile (predeterminado EDGE_ID)."
              },
              "departure_time": {
                "label": "Hora de salida",
                "description": "Hora de salida RFC3339 opcional usada para la búsqueda en el perfil temporal."
              },
              "temporal_mode": {
                "label": "Modo temporal",
                "description": "Modo de interpretación temporal opcional: multiplier o absolute."
              },
              "temporal_fallback": {
                "label": "Alternativa temporal",
                "description": "Alternativa opcional cuando falta la fila temporal: static_cost o error."
              },
              "temporal_profile_report": {
                "label": "Informe de perfil temporal",
                "description": "Ruta de salida JSON opcional para los diagnósticos del perfil temporal (cobertura, aristas sin coincidencia, uso de alternativas)."
              },
              "snapped_origins_output": {
                "label": "Salida de orígenes ajustados",
                "description": "Ruta opcional del vectorial de salida para los puntos de anclaje de origen ajustados internos usados para iniciar el recorrido."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de área de servicio de salida."
              }
            }
          },
          "network_topology_audit": {
            "name": "Auditoría de topología de red",
            "description": "Audita una red de líneas en busca de anomalías topológicas (componentes desconectados, callejones sin salida y anomalías de grado) que provocan fallos en el cálculo de rutas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de red de líneas de entrada."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste de nodos opcional para la construcción del grafo."
              },
              "one_way_field": {
                "label": "Campo de sentido único",
                "description": "Campo de línea opcional que marca las aristas de sentido único (admite FT/TF/B más valores booleanos heredados)."
              },
              "blocked_field": {
                "label": "Campo de bloqueo",
                "description": "Campo de línea opcional que marca las aristas bloqueadas a excluir del análisis."
              },
              "report": {
                "label": "Informe",
                "description": "Ruta de salida JSON opcional para el informe de resumen de la auditoría."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de puntos de salida para los diagnósticos por nodo."
              }
            }
          },
          "od_sensitivity_analysis": {
            "name": "Análisis de sensibilidad OD",
            "description": "Calcula los costes de camino más corto OD con perturbaciones de la impedancia y genera estadísticas de sensibilidad mediante muestreo de Monte Carlo.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de red de líneas de entrada."
              },
              "origins": {
                "label": "Orígenes",
                "description": "Capa de puntos de origen."
              },
              "destinations": {
                "label": "Destinos",
                "description": "Capa de puntos de destino."
              },
              "edge_cost_field": {
                "label": "Campo de coste de arista",
                "description": "Campo numérico de línea obligatorio usado como multiplicador de impedancia para el análisis de perturbación."
              },
              "impedance_disturbance_range": {
                "label": "Rango de perturbación de impedancia",
                "description": "Rango para la perturbación de costes como 'min_factor,max_factor' (p. ej., '0.8,1.2' para una variación de ±20 %)."
              },
              "monte_carlo_samples": {
                "label": "Muestras de Monte Carlo",
                "description": "Número de muestras de Monte Carlo para el análisis de perturbación (predeterminado 1, máx. 100)."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste de nodos opcional para la construcción del grafo."
              },
              "max_snap_distance": {
                "label": "Distancia máxima de ajuste",
                "description": "Distancia máxima opcional desde los puntos de origen/destino al nodo de red más cercano."
              },
              "one_way_field": {
                "label": "Campo de sentido único",
                "description": "Campo de línea opcional que marca las aristas digitalizadas de sentido único (admite FT/TF/B más valores booleanos heredados)."
              },
              "blocked_field": {
                "label": "Campo de bloqueo",
                "description": "Campo de línea opcional que marca las aristas bloqueadas/cerradas."
              },
              "node_cost_points": {
                "label": "Puntos de coste de nodo",
                "description": "Capa de puntos opcional que proporciona costes de entrada por nodo (p. ej., retardo en intersecciones)."
              },
              "node_cost_field": {
                "label": "Campo de coste de nodo",
                "description": "Campo numérico de node_cost_points que contiene los costes no negativos por nodo."
              },
              "node_cost_snap_distance": {
                "label": "Distancia de ajuste de coste de nodo",
                "description": "Distancia máxima opcional desde cada punto de coste de nodo a un nodo de red para la asignación."
              },
              "parallel_execution": {
                "label": "Ejecución en paralelo",
                "description": "Si es verdadero (predeterminado), evalúa las búsquedas de orígenes en paralelo para las ejecuciones OD base y perturbadas."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del CSV de salida con pares OD y estadísticas de sensibilidad."
              }
            }
          },
          "shortest_path_network": {
            "name": "Ruta más corta en la red",
            "description": "Encuentra el camino más corto entre las coordenadas de inicio y fin sobre una red de líneas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de red de líneas de entrada."
              },
              "start_x": {
                "label": "X inicial",
                "description": "Coordenada x inicial."
              },
              "start_y": {
                "label": "Y inicial",
                "description": "Coordenada y inicial."
              },
              "end_x": {
                "label": "X final",
                "description": "Coordenada x final."
              },
              "end_y": {
                "label": "Y final",
                "description": "Coordenada y final."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste de nodos opcional para la construcción del grafo."
              },
              "max_snap_distance": {
                "label": "Distancia máxima de ajuste",
                "description": "Distancia máxima opcional desde las coordenadas de inicio/fin al nodo de red más cercano."
              },
              "edge_cost_field": {
                "label": "Campo de coste de arista",
                "description": "Campo numérico de línea opcional usado como multiplicador de impedancia de la longitud del segmento."
              },
              "one_way_field": {
                "label": "Campo de sentido único",
                "description": "Campo de línea opcional que marca las aristas digitalizadas de sentido único (admite FT/TF/B más valores booleanos heredados)."
              },
              "blocked_field": {
                "label": "Campo de bloqueo",
                "description": "Campo de línea opcional que marca las aristas bloqueadas/cerradas a excluir del enrutamiento (true/1/yes bloquea)."
              },
              "barriers": {
                "label": "Barreras",
                "description": "Capa de puntos de barreras opcional; los nodos de red más cercanos quedan bloqueados para el recorrido."
              },
              "barrier_snap_distance": {
                "label": "Distancia de ajuste de barreras",
                "description": "Distancia máxima opcional desde cada punto de barrera a un nodo de red para el bloqueo."
              },
              "turn_penalty": {
                "label": "Penalización por giro",
                "description": "Coste aditivo opcional aplicado a los giros no rectos en los nodos de la red."
              },
              "u_turn_penalty": {
                "label": "Penalización por cambio de sentido",
                "description": "Coste aditivo opcional aplicado a las transiciones de cambio de sentido."
              },
              "forbid_u_turns": {
                "label": "Prohibir cambios de sentido",
                "description": "Si es verdadero, prohíbe las transiciones de cambio de sentido."
              },
              "forbid_left_turns": {
                "label": "Prohibir giros a la izquierda",
                "description": "Si es verdadero, prohíbe las transiciones de giro a la izquierda."
              },
              "forbid_right_turns": {
                "label": "Prohibir giros a la derecha",
                "description": "Si es verdadero, prohíbe las transiciones de giro a la derecha."
              },
              "turn_restrictions_csv": {
                "label": "CSV de restricciones de giro",
                "description": "CSV opcional de transiciones de giro con columnas prev_x,prev_y,node_x,node_y,next_x,next_y. Columnas opcionales: forbidden (predeterminado true cuando no se proporciona la columna turn_cost) y turn_cost (o penalty/cost/extra_cost) para el coste aditivo por giro."
              },
              "temporal_cost_profile": {
                "label": "Perfil de coste temporal",
                "description": "CSV opcional que define costes de arista dependientes del tiempo (columnas: edge_id,dow,start_minute,end_minute,value)."
              },
              "temporal_edge_id_field": {
                "label": "Campo de ID de arista temporal",
                "description": "Campo de red opcional usado para emparejar los valores edge_id de temporal_cost_profile (predeterminado EDGE_ID)."
              },
              "departure_time": {
                "label": "Hora de salida",
                "description": "Hora de salida RFC3339 opcional usada para la búsqueda en el perfil temporal."
              },
              "temporal_mode": {
                "label": "Modo temporal",
                "description": "Modo de interpretación temporal opcional: multiplier o absolute."
              },
              "temporal_fallback": {
                "label": "Alternativa temporal",
                "description": "Alternativa opcional cuando falta la fila temporal: static_cost o error."
              },
              "temporal_profile_report": {
                "label": "Informe de perfil temporal",
                "description": "Ruta de salida JSON opcional para los diagnósticos del perfil temporal (cobertura, aristas sin coincidencia, uso de alternativas)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de líneas de salida."
              }
            }
          },
          "split_lines_at_intersections": {
            "name": "Dividir líneas en las intersecciones",
            "description": "Divide una red de líneas allí donde se intersecan los segmentos de línea, incluidas las autointersecciones.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de líneas de entrada a dividir en las intersecciones."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste opcional usada por las operaciones de división; por defecto el épsilon de la máquina."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de líneas divididas de salida."
              }
            }
          },
          "snap_points_to_network": {
            "name": "Ajustar puntos a la red",
            "description": "Ajusta las entidades de puntos de entrada a la ubicación más cercana a lo largo de una capa de líneas de red.",
            "params": {
              "points": {
                "label": "Puntos",
                "description": "Capa de puntos de entrada a ajustar."
              },
              "network": {
                "label": "Red",
                "description": "Capa de líneas de red de entrada."
              },
              "max_snap_distance": {
                "label": "Distancia máxima de ajuste",
                "description": "Distancia máxima de ajuste opcional en unidades del mapa."
              },
              "keep_unsnapped": {
                "label": "Conservar no ajustados",
                "description": "Si es verdadero (predeterminado), conserva los puntos que no pueden ajustarse dentro de la tolerancia."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de puntos ajustados de salida."
              }
            }
          },
          "transfer_attributes": {
            "name": "Transferir atributos",
            "description": "Transfiere los atributos de origen a las entidades objetivo mediante un predicado espacial.",
            "params": {
              "target": {
                "label": "Objetivo",
                "description": "Capa objetivo que recibe los atributos transferidos."
              },
              "source": {
                "label": "Origen",
                "description": "Capa de origen que proporciona los atributos."
              },
              "predicate": {
                "label": "Predicado",
                "description": "Predicado espacial: intersects, within, contains, touches, crosses, overlaps, within_distance."
              },
              "distance": {
                "label": "Distancia",
                "description": "Umbral de distancia cuando predicate=within_distance."
              },
              "strategy": {
                "label": "Estrategia",
                "description": "Estrategia de transferencia: first, last, count, sum, mean, min, max."
              },
              "prefix": {
                "label": "Prefijo",
                "description": "Prefijo para los campos de origen transferidos (predeterminado SRC_)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "travelling_salesman_problem": {
            "name": "Problema del viajante",
            "description": "Encuentra soluciones aproximadas al problema del viajante (TSP) mediante la heurística 2-opt. Dado un conjunto de ubicaciones de puntos, identifica la ruta más corta que conecta todos los puntos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos de entrada."
              },
              "duration": {
                "label": "Duración",
                "description": "Duración máxima de la optimización en segundos."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional de la polilínea de salida."
              }
            }
          },
          "vehicle_routing_cvrp": {
            "name": "Enrutamiento de vehículos CVRP",
            "description": "Construye rutas de reparto multidepósito con restricciones de capacidad, con controles de flota heterogénea, modos de objetivo y optimización local opcional.",
            "params": {
              "network": {
                "label": "Red",
                "description": "Capa de red de líneas de entrada (validada por paridad de contrato)."
              },
              "depot_points": {
                "label": "Puntos de depósito",
                "description": "Capa de puntos de depósito; cada punto puede aportar uno o más vehículos."
              },
              "stop_points": {
                "label": "Puntos de parada",
                "description": "Capa de puntos de paradas de entrega."
              },
              "demand_field": {
                "label": "Campo de demanda",
                "description": "Campo numérico de demanda en stop_points (predeterminado: demand)."
              },
              "priority_field": {
                "label": "Campo de prioridad",
                "description": "Campo opcional de prioridad de parada con valores como required/high/normal/low o rangos numéricos."
              },
              "allowed_vehicle_profiles_field": {
                "label": "Campo de perfiles de vehículo permitidos",
                "description": "Campo opcional de parada que lista los perfiles de vehículo compatibles (delimitado por comas/punto y coma/barra vertical)."
              },
              "allowed_route_classes_field": {
                "label": "Campo de clases de ruta permitidas",
                "description": "Alias opcional de allowed_vehicle_profiles_field para las reglas de compatibilidad de clase de ruta."
              },
              "depot_id_field": {
                "label": "Campo de ID de depósito",
                "description": "Campo opcional de ID de depósito usado en las salidas de rutas/asignaciones."
              },
              "vehicle_count_field": {
                "label": "Campo de número de vehículos",
                "description": "Campo opcional del depósito para el número de vehículos generados en cada depósito."
              },
              "vehicle_capacity_field": {
                "label": "Campo de capacidad de vehículo",
                "description": "Campo opcional del depósito que sobrescribe vehicle_capacity por plantilla de depósito/vehículo."
              },
              "vehicle_fixed_cost_field": {
                "label": "Campo de coste fijo de vehículo",
                "description": "Campo opcional del depósito que sobrescribe vehicle_fixed_cost por plantilla de depósito/vehículo."
              },
              "travel_speed_field": {
                "label": "Campo de velocidad de viaje",
                "description": "Campo opcional del depósito que sobrescribe travel_speed por plantilla de depósito/vehículo."
              },
              "max_route_distance_field": {
                "label": "Campo de distancia máxima de ruta",
                "description": "Campo opcional del depósito que sobrescribe max_route_distance por plantilla de depósito/vehículo."
              },
              "max_route_time_field": {
                "label": "Campo de tiempo máximo de ruta",
                "description": "Campo opcional del depósito que sobrescribe max_route_time por plantilla de depósito/vehículo."
              },
              "vehicle_profile_field": {
                "label": "Campo de perfil de vehículo",
                "description": "Campo opcional del depósito que define el token de perfil/categoría de vehículo usado para la compatibilidad de paradas."
              },
              "vehicle_route_class_field": {
                "label": "Campo de clase de ruta de vehículo",
                "description": "Alias opcional de vehicle_profile_field para las reglas de compatibilidad de clase de ruta."
              },
              "vehicle_capacity": {
                "label": "Capacidad del vehículo",
                "description": "Capacidad por vehículo (> 0)."
              },
              "vehicle_fixed_cost": {
                "label": "Coste fijo del vehículo",
                "description": "Coste fijo opcional cargado por vehículo/ruta despachado (predeterminado: 0)."
              },
              "max_vehicles": {
                "label": "Vehículos máximos",
                "description": "Número máximo opcional de vehículos/rutas a construir."
              },
              "max_route_distance": {
                "label": "Distancia máxima de ruta",
                "description": "Distancia máxima de viaje opcional por ruta, incluido el regreso al depósito."
              },
              "travel_speed": {
                "label": "Velocidad de viaje",
                "description": "Velocidad de viaje en unidades de coordenadas por unidad de tiempo (predeterminado: 1)."
              },
              "max_route_time": {
                "label": "Tiempo máximo de ruta",
                "description": "Duración máxima de ruta opcional en unidades de tiempo del modelo, incluido el regreso al depósito."
              },
              "max_stops_per_vehicle": {
                "label": "Paradas máximas por vehículo",
                "description": "Número máximo opcional de paradas asignadas a cada ruta de vehículo."
              },
              "objective_mode": {
                "label": "Modo de objetivo",
                "description": "Objetivo de construcción de rutas: minimize_distance, minimize_vehicles o minimize_cost."
              },
              "apply_local_optimization": {
                "label": "Aplicar optimización local",
                "description": "Cuando es verdadero, aplica una pasada determinista de mejora local 2-opt a cada ruta construida (predeterminado: true)."
              },
              "apply_simulated_annealing": {
                "label": "Aplicar recocido simulado",
                "description": "Cuando es verdadero, aplica una pasada de refinamiento por recocido simulado con semilla por ruta tras la optimización voraz/local (predeterminado: false)."
              },
              "sa_iterations": {
                "label": "Iteraciones de SA",
                "description": "Número máximo de iteraciones de recocido simulado por ruta cuando apply_simulated_annealing=true (predeterminado: 1500)."
              },
              "sa_initial_temperature": {
                "label": "Temperatura inicial de SA",
                "description": "Temperatura inicial del recocido simulado (> 0, predeterminado: 1.0)."
              },
              "sa_cooling_rate": {
                "label": "Tasa de enfriamiento de SA",
                "description": "Multiplicador de enfriamiento del recocido simulado en (0, 1); predeterminado 0.995."
              },
              "sa_seed": {
                "label": "Semilla de SA",
                "description": "Semilla aleatoria determinista opcional para el recocido simulado (predeterminado: 42)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de líneas de ruta de salida."
              },
              "assignment_output": {
                "label": "Salida de asignación",
                "description": "Salida opcional de puntos de asignación de paradas con diagnósticos de orden de visita/carga."
              }
            }
          },
          "vehicle_routing_pickup_delivery": {
            "name": "Enrutamiento de vehículos con recogida y entrega",
            "description": "Construye rutas emparejadas de recogida y entrega con restricciones de precedencia y capacidad usando una base determinista del vecino más cercano.",
            "params": {
              "network": {
                "label": "Red",
                "description": "Capa de red de líneas de entrada (validada por paridad de contrato)."
              },
              "depot_points": {
                "label": "Puntos de depósito",
                "description": "Capa de puntos de depósito; el primer punto se usa como depósito activo en esta implementación base."
              },
              "stop_points": {
                "label": "Puntos de parada",
                "description": "Capa de puntos de paradas que contiene registros emparejados de recogida y entrega."
              },
              "request_id_field": {
                "label": "Campo de ID de solicitud",
                "description": "Campo de identificador de solicitud en stop_points usado para emparejar los registros de recogida y entrega (predeterminado: request_id)."
              },
              "stop_type_field": {
                "label": "Campo de tipo de parada",
                "description": "Campo de tipo de parada en stop_points que contiene las etiquetas pickup/delivery (predeterminado: stop_type)."
              },
              "demand_field": {
                "label": "Campo de demanda",
                "description": "Campo numérico de demanda en stop_points; la demanda de recogida se carga y la demanda entregada se ignora (predeterminado: demand)."
              },
              "vehicle_capacity": {
                "label": "Capacidad del vehículo",
                "description": "Capacidad por vehículo (> 0)."
              },
              "max_vehicles": {
                "label": "Vehículos máximos",
                "description": "Número máximo opcional de vehículos/rutas a construir."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de líneas de ruta de salida."
              },
              "assignment_output": {
                "label": "Salida de asignación",
                "description": "Salida opcional de puntos de asignación de paradas con diagnósticos de solicitud y precedencia."
              }
            }
          },
          "vehicle_routing_vrptw": {
            "name": "Enrutamiento de vehículos VRPTW",
            "description": "Construye rutas VRPTW multidepósito con restricciones de capacidad, con configuración de flota heterogénea, ventanas de descanso y controles del modo de objetivo.",
            "params": {
              "network": {
                "label": "Red",
                "description": "Capa de red de líneas de entrada (validada por paridad de contrato)."
              },
              "depot_points": {
                "label": "Puntos de depósito",
                "description": "Capa de puntos de depósito; cada punto puede aportar uno o más vehículos."
              },
              "stop_points": {
                "label": "Puntos de parada",
                "description": "Capa de puntos de paradas de entrega con campos de demanda y ventana temporal."
              },
              "demand_field": {
                "label": "Campo de demanda",
                "description": "Campo numérico de demanda en stop_points (predeterminado: demand)."
              },
              "priority_field": {
                "label": "Campo de prioridad",
                "description": "Campo opcional de prioridad de parada con valores como required/high/normal/low o rangos numéricos."
              },
              "allowed_vehicle_profiles_field": {
                "label": "Campo de perfiles de vehículo permitidos",
                "description": "Campo opcional de parada que lista los perfiles de vehículo compatibles (delimitado por comas/punto y coma/barra vertical)."
              },
              "allowed_route_classes_field": {
                "label": "Campo de clases de ruta permitidas",
                "description": "Alias opcional de allowed_vehicle_profiles_field para las reglas de compatibilidad de clase de ruta."
              },
              "tw_start_field": {
                "label": "Campo de inicio de ventana temporal",
                "description": "Campo numérico de inicio de ventana temporal en stop_points (predeterminado: tw_start)."
              },
              "tw_end_field": {
                "label": "Campo de fin de ventana temporal",
                "description": "Campo numérico de fin de ventana temporal en stop_points (predeterminado: tw_end)."
              },
              "service_time_field": {
                "label": "Campo de tiempo de servicio",
                "description": "Campo numérico de tiempo de servicio por parada en stop_points (predeterminado: service_time)."
              },
              "depot_id_field": {
                "label": "Campo de ID de depósito",
                "description": "Campo opcional de ID de depósito usado en las salidas de rutas/asignaciones."
              },
              "vehicle_count_field": {
                "label": "Campo de número de vehículos",
                "description": "Campo opcional del depósito para el número de vehículos generados en cada depósito."
              },
              "vehicle_capacity_field": {
                "label": "Campo de capacidad de vehículo",
                "description": "Campo opcional del depósito que sobrescribe vehicle_capacity por plantilla de depósito/vehículo."
              },
              "vehicle_fixed_cost_field": {
                "label": "Campo de coste fijo de vehículo",
                "description": "Campo opcional del depósito que sobrescribe vehicle_fixed_cost por plantilla de depósito/vehículo."
              },
              "travel_speed_field": {
                "label": "Campo de velocidad de viaje",
                "description": "Campo opcional del depósito que sobrescribe travel_speed por plantilla de depósito/vehículo."
              },
              "max_route_distance_field": {
                "label": "Campo de distancia máxima de ruta",
                "description": "Campo opcional del depósito que sobrescribe max_route_distance por plantilla de depósito/vehículo."
              },
              "max_route_time_field": {
                "label": "Campo de tiempo máximo de ruta",
                "description": "Campo opcional del depósito que sobrescribe max_route_time por plantilla de depósito/vehículo."
              },
              "vehicle_profile_field": {
                "label": "Campo de perfil de vehículo",
                "description": "Campo opcional del depósito que define el token de perfil/categoría de vehículo usado para la compatibilidad de paradas."
              },
              "vehicle_route_class_field": {
                "label": "Campo de clase de ruta de vehículo",
                "description": "Alias opcional de vehicle_profile_field para las reglas de compatibilidad de clase de ruta."
              },
              "depot_close_time_field": {
                "label": "Campo de hora de cierre del depósito",
                "description": "Campo opcional del depósito que sobrescribe depot_close_time por plantilla de depósito/vehículo."
              },
              "break_start_field": {
                "label": "Campo de inicio de descanso",
                "description": "Campo opcional del depósito que sobrescribe break_start_time por plantilla de depósito/vehículo."
              },
              "break_end_field": {
                "label": "Campo de fin de descanso",
                "description": "Campo opcional del depósito que sobrescribe break_end_time por plantilla de depósito/vehículo."
              },
              "break_duration_field": {
                "label": "Campo de duración del descanso",
                "description": "Campo opcional del depósito que sobrescribe break_duration por plantilla de depósito/vehículo."
              },
              "vehicle_capacity": {
                "label": "Capacidad del vehículo",
                "description": "Capacidad por vehículo (> 0)."
              },
              "vehicle_fixed_cost": {
                "label": "Coste fijo del vehículo",
                "description": "Coste fijo opcional cargado por vehículo/ruta despachado (predeterminado: 0)."
              },
              "start_time": {
                "label": "Hora de inicio",
                "description": "Hora de inicio de la ruta en unidades de tiempo del modelo (predeterminado: 0)."
              },
              "travel_speed": {
                "label": "Velocidad de viaje",
                "description": "Velocidad de viaje en unidades de coordenadas por unidad de tiempo (predeterminado: 1)."
              },
              "enforce_time_windows": {
                "label": "Aplicar ventanas temporales",
                "description": "Cuando es verdadero, solo las paradas con retraso <= allowed_lateness son elegibles para la asignación (predeterminado: false)."
              },
              "allowed_lateness": {
                "label": "Retraso permitido",
                "description": "Retraso máximo tolerado cuando enforce_time_windows=true (predeterminado: 0)."
              },
              "depot_close_time": {
                "label": "Hora de cierre del depósito",
                "description": "Hora de cierre estricta opcional antes de la cual cada ruta debe regresar al depósito."
              },
              "break_start_time": {
                "label": "Hora de inicio del descanso",
                "description": "Hora de inicio opcional de la ventana de descanso global para todos los vehículos."
              },
              "break_end_time": {
                "label": "Hora de fin del descanso",
                "description": "Hora de fin opcional de la ventana de descanso global para todos los vehículos."
              },
              "break_duration": {
                "label": "Duración del descanso",
                "description": "Duración de descanso global opcional aplicada una vez por ruta cuando se interseca la ventana de descanso."
              },
              "use_priority_scoring": {
                "label": "Usar puntuación por prioridad",
                "description": "Cuando es verdadero, clasifica los candidatos factibles por retraso/holgura proyectados antes que por distancia de viaje; cuando es falso, usa la línea base de vecino más cercano (predeterminado: true)."
              },
              "max_vehicles": {
                "label": "Vehículos máximos",
                "description": "Número máximo opcional de vehículos/rutas a construir."
              },
              "max_route_distance": {
                "label": "Distancia máxima de ruta",
                "description": "Distancia máxima de viaje de ruta opcional, incluido el regreso al depósito."
              },
              "max_route_time": {
                "label": "Tiempo máximo de ruta",
                "description": "Duración máxima de ruta opcional en unidades de tiempo del modelo, incluido el regreso al depósito."
              },
              "max_stops_per_vehicle": {
                "label": "Paradas máximas por vehículo",
                "description": "Número máximo opcional de paradas asignadas a cada ruta de vehículo."
              },
              "objective_mode": {
                "label": "Modo de objetivo",
                "description": "Objetivo de construcción de rutas: minimize_lateness, minimize_distance, minimize_vehicles o minimize_cost."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de líneas de ruta de salida."
              },
              "assignment_output": {
                "label": "Salida de asignación",
                "description": "Salida opcional de puntos de asignación de paradas con diagnósticos de ventana temporal."
              }
            }
          },
          "clip": {
            "name": "Recortar",
            "description": "Recorta los polígonos de entrada según los límites de los polígonos de superposición mediante una intersección basada en la topología.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "overlay": {
                "label": "Superposición",
                "description": "Capa de polígonos de superposición."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste opcional usada por las operaciones topológicas; por defecto el épsilon de la máquina."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "difference": {
            "name": "Diferencia",
            "description": "Elimina las áreas de los polígonos de superposición de los polígonos de entrada mediante una diferencia basada en la topología.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "overlay": {
                "label": "Superposición",
                "description": "Capa de polígonos de superposición."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste opcional usada por las operaciones topológicas; por defecto el épsilon de la máquina."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "dissolve": {
            "name": "Disolver",
            "description": "Elimina los límites compartidos entre polígonos de forma global o según un campo de atributo de disolución.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de polígonos de entrada."
              },
              "dissolve_field": {
                "label": "Campo de disolución",
                "description": "Campo de atributo opcional usado para disolver polígonos dentro de grupos; si se omite, disuelve todos los polígonos."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste opcional usada durante las operaciones topológicas."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de polígonos de salida."
              }
            }
          },
          "erase": {
            "name": "Borrar",
            "description": "Borra las áreas de los polígonos de superposición de los polígonos de entrada y conserva los atributos de entrada.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "overlay": {
                "label": "Superposición",
                "description": "Capa de polígonos de superposición."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste opcional usada por las operaciones topológicas; por defecto el épsilon de la máquina."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "identity": {
            "name": "Identidad",
            "description": "Conserva todas las entidades de entrada; las partes que se solapan con la capa de identidad también adquieren los atributos de identidad.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "overlay": {
                "label": "Superposición",
                "description": "Capa de polígonos de superposición."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste opcional usada por las operaciones topológicas; por defecto el épsilon de la máquina."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "intersect": {
            "name": "Intersecar",
            "description": "Interseca los polígonos de entrada y de superposición mediante una superposición basada en la topología y registra los ID de las entidades de origen.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "overlay": {
                "label": "Superposición",
                "description": "Capa de polígonos de superposición."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste opcional usada por las operaciones topológicas; por defecto el épsilon de la máquina."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "line_intersections": {
            "name": "Intersecciones de líneas",
            "description": "Encuentra los puntos de intersección de líneas entre las capas de entrada y de superposición y añade los ID de origen con los atributos combinados.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de líneas o polígonos de entrada."
              },
              "overlay": {
                "label": "Superposición",
                "description": "Capa de líneas o polígonos de superposición."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste opcional usada por las operaciones geométricas; por defecto el épsilon de la máquina."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "line_polygon_clip": {
            "name": "Recorte de líneas por polígono",
            "description": "Recorta las entidades lineales al interior de los polígonos y genera los segmentos de línea recortados.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de líneas de entrada."
              },
              "clip": {
                "label": "Recortar",
                "description": "Capa de polígonos de recorte."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "near": {
            "name": "Proximidad",
            "description": "Añade los atributos NEAR_FID y NEAR_DIST que identifican las entidades más cercanas y sus distancias mediante indexación espacial.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "near": {
                "label": "Proximidad",
                "description": "Capa vectorial de entidades cercanas."
              },
              "max_distance": {
                "label": "Distancia máxima",
                "description": "Distancia máxima de búsqueda opcional."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "select_by_location": {
            "name": "Seleccionar por ubicación",
            "description": "Filtra las entidades objetivo según predicados espaciales (interseca, dentro de, contiene, toca, se solapa, etc.) respecto a las entidades de consulta.",
            "params": {
              "target": {
                "label": "Objetivo",
                "description": "Capa de entidades objetivo a filtrar."
              },
              "query": {
                "label": "Consulta",
                "description": "Capa de entidades de consulta."
              },
              "predicate": {
                "label": "Predicado",
                "description": "Predicado espacial: intersects, within, contains, touches, crosses, overlaps, disjoint, within_distance."
              },
              "distance": {
                "label": "Distancia",
                "description": "Umbral de distancia para el predicado within_distance."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "spatial_join": {
            "name": "Unión espacial",
            "description": "Transfiere atributos de las entidades de la capa de unión a las entidades objetivo mediante predicados espaciales; admite estrategias de agregación (recuento, suma, media, mín., máx.) para coincidencias múltiples.",
            "params": {
              "target": {
                "label": "Objetivo",
                "description": "Capa objetivo que recibe los atributos unidos."
              },
              "join": {
                "label": "Unión",
                "description": "Capa de unión que proporciona los atributos."
              },
              "predicate": {
                "label": "Predicado",
                "description": "Predicado espacial: intersects, within, contains, touches, crosses, overlaps, within_distance."
              },
              "distance": {
                "label": "Distancia",
                "description": "Umbral de distancia para el predicado within_distance."
              },
              "strategy": {
                "label": "Estrategia",
                "description": "Estrategia de unión: first, last, count, sum, mean, min, max."
              },
              "prefix": {
                "label": "Prefijo",
                "description": "Prefijo para los nombres de campos unidos (predeterminado JOIN_)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "symmetrical_difference": {
            "name": "Diferencia simétrica",
            "description": "Calcula las regiones poligonales no solapadas a partir de las capas de entrada y de superposición.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "overlay": {
                "label": "Superposición",
                "description": "Capa de polígonos de superposición."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste opcional usada por las operaciones topológicas; por defecto el épsilon de la máquina."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "union": {
            "name": "Unión",
            "description": "Disuelve los polígonos combinados de entrada y de superposición en una cobertura poligonal unificada.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "overlay": {
                "label": "Superposición",
                "description": "Capa de polígonos de superposición."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste opcional usada por las operaciones topológicas; por defecto el épsilon de la máquina."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "update": {
            "name": "Actualizar",
            "description": "Sustituye las entidades de entrada por las entidades de actualización donde se solapan; las entidades de entrada fuera de la capa de actualización se conservan.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "overlay": {
                "label": "Superposición",
                "description": "Capa de polígonos de superposición."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste opcional usada por las operaciones topológicas; por defecto el épsilon de la máquina."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "centroid_vector": {
            "name": "Centroide vectorial",
            "description": "Calcula el centro geográfico (coordenada media de masa) de cada entidad vectorial, generando una capa de puntos para la colocación de etiquetas, el agrupamiento y el análisis espacial.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de puntos de salida."
              }
            }
          },
          "concave_hull": {
            "name": "Envolvente cóncava",
            "description": "Crea polígonos de envolvente cóncava alrededor de las coordenadas de las entidades de entrada mediante el algoritmo concaveman.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "concavity": {
                "label": "Concavidad",
                "description": "Razón de concavidad (predeterminado 2.0). Los valores más altos producen una envolvente menos cóncava, más cercana a la envolvente convexa. Los valores más bajos permiten concavidades más ajustadas."
              },
              "max_edge_length": {
                "label": "Longitud máxima de arista",
                "description": "Umbral de longitud: las aristas de la envolvente más cortas que este valor no se refinan más. Por defecto sin límite (infinito)."
              },
              "epsilon": {
                "label": "Épsilon",
                "description": "Épsilon de robustez (predeterminado 1e-9)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "densify_features": {
            "name": "Densificar entidades",
            "description": "Añade vértices a lo largo de los límites de líneas y polígonos con un espaciado especificado.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "spacing": {
                "label": "Espaciado",
                "description": "Espaciado máximo entre vértices adyacentes."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "eliminate_coincident_points": {
            "name": "Eliminar puntos coincidentes",
            "description": "Elimina los puntos coincidentes o casi coincidentes dentro de una distancia de tolerancia.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos de entrada."
              },
              "tolerance_dist": {
                "label": "Distancia de tolerancia",
                "description": "Umbral de distancia para considerar puntos coincidentes."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de puntos de salida."
              }
            }
          },
          "extend_vector_lines": {
            "name": "Extender líneas vectoriales",
            "description": "Prolonga los extremos de las polilíneas una distancia especificada en el inicio, el final o ambos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de polilíneas de entrada."
              },
              "distance": {
                "label": "Distancia",
                "description": "Distancia para extender los extremos de la polilínea."
              },
              "extend_direction": {
                "label": "Dirección de extensión",
                "description": "Dirección de extensión de los extremos: both, start o end."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "merge_line_segments": {
            "name": "Fusionar segmentos de línea",
            "description": "Combina los segmentos de línea conectados que se unen en extremos sin ramificación.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de polilíneas de entrada."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste de extremos opcional usada para emparejar los extremos de las líneas; por defecto el épsilon de la máquina."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "minimum_bounding_box": {
            "name": "Rectángulo mínimo envolvente",
            "description": "Calcula rectángulos envolventes mínimos orientados alrededor de entidades individuales o de toda la capa.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "min_criteria": {
                "label": "Criterios mínimos",
                "description": "Criterio de minimización: area, perimeter, length o width. Por defecto area."
              },
              "individual_feature_hulls": {
                "label": "Envolventes por entidad individual",
                "description": "Si es verdadero, emite un rectángulo por entidad; en caso contrario, emite un rectángulo para toda la capa."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de polígonos de salida."
              }
            }
          },
          "minimum_bounding_circle": {
            "name": "Círculo mínimo envolvente",
            "description": "Calcula círculos envolventes mínimos alrededor de entidades individuales o de toda la capa.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "individual_feature_hulls": {
                "label": "Envolventes por entidad individual",
                "description": "Si es verdadero, emite un círculo por entidad; en caso contrario, emite un círculo para toda la capa."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de polígonos de salida."
              }
            }
          },
          "minimum_bounding_envelope": {
            "name": "Envolvente mínima",
            "description": "Calcula envolventes mínimas alineadas con los ejes alrededor de entidades individuales o de toda la capa.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "individual_feature_hulls": {
                "label": "Envolventes por entidad individual",
                "description": "Si es verdadero, emite una envolvente por entidad; en caso contrario, emite una envolvente para toda la capa."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de polígonos de salida."
              }
            }
          },
          "minimum_convex_hull": {
            "name": "Envolvente convexa mínima",
            "description": "Crea polígonos de envolvente convexa alrededor de entidades individuales o de toda la capa de entrada.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "individual_feature_hulls": {
                "label": "Envolventes por entidad individual",
                "description": "Si es verdadero, emite una envolvente por entidad de entrada; en caso contrario, emite una envolvente para toda la capa."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de polígonos de salida."
              }
            }
          },
          "polygonize": {
            "name": "Poligonizar",
            "description": "Crea polígonos a partir de las líneas de entrada, incluidos los segmentos que se intersecan o abiertos donde puedan formarse caras cerradas.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Capas vectoriales de líneas de entrada como matriz o cadena delimitada por punto y coma/comas. Si se omite, se usa 'input'."
              },
              "input": {
                "label": "Entrada",
                "description": "Ruta opcional de una única capa vectorial de líneas de entrada."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste opcional usada por la poligonización; por defecto el épsilon de la máquina."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "representative_point_vector": {
            "name": "Punto representativo vectorial",
            "description": "Genera un punto interior que se garantiza que se encuentra dentro o sobre cada geometría mediante el polo de inaccesibilidad, ideal para colocar etiquetas en polígonos cóncavos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de puntos de salida."
              }
            }
          },
          "simplify_features": {
            "name": "Simplificar entidades",
            "description": "Reduce la complejidad de la geometría mediante el algoritmo de Douglas-Peucker para minimizar el tamaño de archivo, eliminar el ruido GPS y optimizar el rendimiento de representación conservando la forma.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "tolerance": {
                "label": "Tolerancia",
                "description": "Tolerancia de simplificación en unidades del mapa."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "smooth_vectors": {
            "name": "Suavizar vectores",
            "description": "Suaviza geometrías de polilíneas o polígonos mediante un filtrado de media móvil para reducir el ruido de digitalización y la fluctuación de las trazas GPS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de líneas o polígonos de entrada."
              },
              "filter_size": {
                "label": "Tamaño de filtro",
                "description": "Tamaño impar de la ventana de media móvil (>= 3). Los valores pares se incrementan al siguiente valor impar."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "snap_endnodes": {
            "name": "Ajustar nodos finales",
            "description": "Ajusta los extremos cercanos de las polilíneas a una ubicación compartida dentro de una tolerancia.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de polilíneas de entrada."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste de extremos en unidades del mapa."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de polilíneas ajustadas de salida."
              }
            }
          },
          "split_vector_lines": {
            "name": "Dividir líneas vectoriales",
            "description": "Divide cada entidad de polilínea en segmentos de una longitud máxima especificada.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de polilíneas de entrada."
              },
              "segment_length": {
                "label": "Longitud de segmento",
                "description": "Longitud máxima de segmento en unidades del mapa."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de polilíneas de salida."
              }
            }
          },
          "split_with_lines": {
            "name": "Dividir con líneas",
            "description": "Divide las polilíneas de entrada usando los puntos de intersección de una capa de líneas de división.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de líneas de entrada a dividir."
              },
              "split": {
                "label": "Dividir",
                "description": "Capa de líneas de división usada para crear los puntos de ruptura."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia de ajuste opcional usada por las operaciones de división; por defecto el épsilon de la máquina."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "compactness_ratio": {
            "name": "Razón de compacidad",
            "description": "Calcula la relación de compacidad (área / perímetro) de las entidades poligonales.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de polígonos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Vectorial de salida con el campo de compacidad añadido."
              }
            }
          },
          "deviation_from_regional_direction": {
            "name": "Desviación de la dirección regional",
            "description": "Calcula la desviación direccional de los polígonos respecto a la orientación media regional ponderada y añade DEV_DIR.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de polígonos de entrada."
              },
              "elongation_threshold": {
                "label": "Umbral de elongación",
                "description": "Elongación mínima usada para incluir polígonos en la estimación de dirección regional; predeterminado 0.75."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "elongation_ratio": {
            "name": "Razón de elongación",
            "description": "Calcula la relación de alargamiento (eje corto / eje largo del rectángulo envolvente) de las entidades poligonales.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de polígonos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Vectorial de salida con el campo de elongación añadido."
              }
            }
          },
          "hole_proportion": {
            "name": "Proporción de huecos",
            "description": "Calcula el área de los huecos del polígono dividida por el área de la envolvente y añade HOLE_PROP.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de polígonos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "linearity_index": {
            "name": "Índice de linealidad",
            "description": "Calcula el índice de linealidad (r cuadrado de la regresión) de las entidades poligonales.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de polígonos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Vectorial de salida con el campo de linealidad añadido."
              }
            }
          },
          "narrowness_index_vector": {
            "name": "Índice de estrechez vectorial",
            "description": "Calcula el índice de estrechez (perímetro / sqrt(área)) de las entidades poligonales.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de polígonos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Vectorial de salida con el campo de estrechez añadido."
              }
            }
          },
          "patch_orientation": {
            "name": "Orientación del parche",
            "description": "Calcula la orientación de los polígonos (grados desde el norte) mediante regresión de eje mayor reducido y añade ORIENT.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de polígonos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "perimeter_area_ratio": {
            "name": "Razón perímetro-área",
            "description": "Calcula la relación perímetro/área de los polígonos y añade P_A_RATIO.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de polígonos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "polygon_area": {
            "name": "Área del polígono",
            "description": "Calcula el área de los polígonos y añade un campo de atributo AREA.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de polígonos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "polygon_long_axis": {
            "name": "Eje mayor del polígono",
            "description": "Representa como salida lineal el eje largo del rectángulo envolvente mínimo de cada entidad poligonal.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de polígonos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de polilíneas de salida."
              }
            }
          },
          "polygon_perimeter": {
            "name": "Perímetro del polígono",
            "description": "Calcula el perímetro de los polígonos y añade un campo de atributo PERIMETER.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de polígonos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "polygon_short_axis": {
            "name": "Eje menor del polígono",
            "description": "Representa como salida lineal el eje corto del rectángulo envolvente mínimo de cada entidad poligonal.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de polígonos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de polilíneas de salida."
              }
            }
          },
          "related_circumscribing_circle": {
            "name": "Círculo circunscrito relacionado",
            "description": "Calcula 1 - (área del polígono / área del círculo circunscrito más pequeño) y añade RC_CIRCLE.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de polígonos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "shape_complexity_index_vector": {
            "name": "Índice de complejidad de forma vectorial",
            "description": "Calcula el índice de complejidad de forma de las entidades poligonales vectoriales mediante el factor de forma normalizado.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de polígonos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Vectorial de salida con el campo de índice de complejidad añadido."
              }
            }
          },
          "global_morans_i": {
            "name": "I de Moran global",
            "description": "Calcula el I de Moran global para comprobar la autocorrelación espacial: si los valores similares se agrupan espacialmente. Fundamento esencial para el análisis geoestadístico.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "field": {
                "label": "Campo",
                "description": "Campo de atributo numérico a analizar."
              },
              "weights_mode": {
                "label": "Modo de pesos",
                "description": "Modo de vecindad: queen, rook, k_nearest, distance_band."
              },
              "k": {
                "label": "K",
                "description": "Valor de k para el modo k_nearest."
              },
              "distance": {
                "label": "Distancia",
                "description": "Umbral de distancia para el modo distance_band."
              },
              "row_standardize": {
                "label": "Estandarizar por filas",
                "description": "Aplicar estandarización por filas a los pesos (predeterminado true)."
              },
              "inference": {
                "label": "Inferencia",
                "description": "Modo de inferencia: asymptotic o permutation (predeterminado: asymptotic)."
              },
              "num_simulations": {
                "label": "Número de simulaciones",
                "description": "Número de permutaciones para la prueba de permutación (predeterminado: 999)."
              },
              "seed": {
                "label": "Semilla",
                "description": "Semilla aleatoria para una prueba de permutación reproducible."
              },
              "island_policy": {
                "label": "Política de islas",
                "description": "Tratamiento de islas: drop_with_warning, keep_zero_weight, error."
              },
              "output_json": {
                "label": "Salida JSON",
                "description": "Ruta opcional de salida del informe JSON."
              },
              "output_html": {
                "label": "Salida HTML",
                "description": "Ruta opcional de salida del informe HTML."
              },
              "output_csv": {
                "label": "Salida CSV",
                "description": "Ruta opcional de salida del resumen CSV."
              },
              "output_distribution": {
                "label": "Salida de distribución",
                "description": "Ruta opcional para guardar la distribución de permutaciones como JSON."
              }
            }
          },
          "getis_ord_gi_star": {
            "name": "Gi* de Getis-Ord",
            "description": "Calcula las puntuaciones z Gi/Gi* de Getis-Ord para identificar puntos calientes/fríos locales. Medida directa de la concentración de valores altos/bajos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "field": {
                "label": "Campo",
                "description": "Campo de atributo numérico a analizar."
              },
              "weights_mode": {
                "label": "Modo de pesos",
                "description": "Modo de vecindad: queen, rook, k_nearest, distance_band."
              },
              "k": {
                "label": "K",
                "description": "Valor de k para el modo k_nearest."
              },
              "distance": {
                "label": "Distancia",
                "description": "Umbral de distancia para el modo distance_band."
              },
              "row_standardize": {
                "label": "Estandarizar por filas",
                "description": "Aplicar estandarización por filas a los pesos (predeterminado true)."
              },
              "variant": {
                "label": "Variante",
                "description": "Variante: gi o gi_star (predeterminado gi_star)."
              },
              "inference": {
                "label": "Inferencia",
                "description": "Modo de inferencia: asymptotic o permutation (predeterminado: asymptotic)."
              },
              "num_simulations": {
                "label": "Número de simulaciones",
                "description": "Número de permutaciones para la prueba de permutación (predeterminado: 999)."
              },
              "seed": {
                "label": "Semilla",
                "description": "Semilla aleatoria para una prueba de permutación reproducible."
              },
              "island_policy": {
                "label": "Política de islas",
                "description": "Tratamiento de islas: drop_with_warning, keep_zero_weight, error."
              },
              "alpha": {
                "label": "Alfa",
                "description": "Umbral de significancia en [0, 1]; predeterminado 0.05."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida con campos GI."
              },
              "output_html": {
                "label": "Salida HTML",
                "description": "Ruta opcional de salida del informe HTML."
              }
            }
          },
          "local_morans_i_lisa": {
            "name": "I de Moran local (LISA)",
            "description": "Calcula el I de Moran local para cada entidad a fin de identificar clústeres y valores atípicos espaciales locales con pruebas de significación estadística.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "field": {
                "label": "Campo",
                "description": "Campo de atributo numérico a analizar."
              },
              "weights_mode": {
                "label": "Modo de pesos",
                "description": "Modo de vecindad: queen, rook, k_nearest, distance_band."
              },
              "k": {
                "label": "K",
                "description": "Valor de k para el modo k_nearest."
              },
              "distance": {
                "label": "Distancia",
                "description": "Umbral de distancia para el modo distance_band."
              },
              "row_standardize": {
                "label": "Estandarizar por filas",
                "description": "Aplicar estandarización por filas a los pesos (predeterminado true)."
              },
              "inference": {
                "label": "Inferencia",
                "description": "Modo de inferencia: asymptotic o permutation (predeterminado: asymptotic)."
              },
              "num_simulations": {
                "label": "Número de simulaciones",
                "description": "Número de permutaciones para la prueba de permutación (predeterminado: 999)."
              },
              "seed": {
                "label": "Semilla",
                "description": "Semilla aleatoria para una prueba de permutación reproducible."
              },
              "island_policy": {
                "label": "Política de islas",
                "description": "Tratamiento de islas: drop_with_warning, keep_zero_weight, error."
              },
              "alpha": {
                "label": "Alfa",
                "description": "Umbral de significancia en [0, 1]; predeterminado 0.05."
              },
              "fdr_correction": {
                "label": "Corrección FDR",
                "description": "Aplicar corrección FDR-BH (predeterminado true para permutación)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida con campos LISA."
              },
              "output_html": {
                "label": "Salida HTML",
                "description": "Ruta opcional de salida del informe HTML."
              }
            }
          },
          "nearest_neighbour_index": {
            "name": "Índice del vecino más próximo",
            "description": "Calcula el índice de vecino más cercano de Clark-Evans para comprobar la aleatoriedad espacial completa. Detecta agrupamiento frente a dispersión.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos de entrada."
              },
              "study_area_mode": {
                "label": "Modo de área de estudio",
                "description": "Modo de área de estudio: hull, envelope, polygon_layer."
              },
              "study_area_polygon": {
                "label": "Polígono de área de estudio",
                "description": "Capa de polígonos usada cuando study_area_mode=polygon_layer."
              },
              "output_json": {
                "label": "Salida JSON",
                "description": "Ruta opcional de salida del informe JSON."
              },
              "output_html": {
                "label": "Salida HTML",
                "description": "Ruta opcional de salida del informe HTML."
              },
              "output_csv": {
                "label": "Salida CSV",
                "description": "Ruta opcional de salida del resumen CSV."
              }
            }
          },
          "quadrat_count_test": {
            "name": "Prueba de conteo por cuadrantes",
            "description": "Realiza una prueba chi cuadrado de aleatoriedad del patrón de puntos mediante conteos por cuadrantes. Comprueba el agrupamiento frente a la dispersión.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos de entrada."
              },
              "grid_mode": {
                "label": "Modo de malla",
                "description": "Modo de malla: rows_cols o cell_size."
              },
              "rows": {
                "label": "Filas",
                "description": "Filas cuando grid_mode=rows_cols."
              },
              "cols": {
                "label": "Columnas",
                "description": "Columnas cuando grid_mode=rows_cols."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda cuando grid_mode=cell_size."
              },
              "study_area_mode": {
                "label": "Modo de área de estudio",
                "description": "Modo de área de estudio: hull, envelope, polygon_layer."
              },
              "study_area_polygon": {
                "label": "Polígono de área de estudio",
                "description": "Capa de polígonos usada cuando study_area_mode=polygon_layer."
              },
              "output_grid": {
                "label": "Malla de salida",
                "description": "Ruta opcional de salida de la malla de polígonos de cuadrantes."
              },
              "output_json": {
                "label": "Salida JSON",
                "description": "Ruta opcional de salida del informe JSON."
              },
              "output_html": {
                "label": "Salida HTML",
                "description": "Ruta opcional de salida del informe HTML."
              },
              "output_csv": {
                "label": "Salida CSV",
                "description": "Ruta opcional de salida del resumen CSV."
              }
            }
          },
          "spatial_lag_regression": {
            "name": "Regresión con retardo espacial",
            "description": "Estima un modelo autorregresivo espacial que capta los efectos de desbordamiento endógenos, en los que la variable dependiente está influida por los vecinos espaciales.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "response_field": {
                "label": "Campo de respuesta",
                "description": "Variable de respuesta (dependiente)."
              },
              "predictor_fields": {
                "label": "Campos predictores",
                "description": "Nombres de campos predictores separados por comas."
              },
              "weights_mode": {
                "label": "Modo de pesos",
                "description": "Modo de vecindad espacial."
              },
              "k": {
                "label": "K",
                "description": "Valor de k para k_nearest."
              },
              "distance": {
                "label": "Distancia",
                "description": "Umbral de distancia."
              },
              "row_standardize": {
                "label": "Estandarizar por filas",
                "description": "Estandarizar los pesos por filas."
              },
              "output": {
                "label": "Salida",
                "description": "Capa vectorial de salida."
              }
            }
          },
          "spatial_error_regression": {
            "name": "Regresión con error espacial",
            "description": "Estima un modelo de error espacial que aborda la dependencia espacial exógena en los residuos debida a variables omitidas o a errores de medición.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "response_field": {
                "label": "Campo de respuesta",
                "description": "Variable de respuesta."
              },
              "predictor_fields": {
                "label": "Campos predictores",
                "description": "Campos predictores separados por comas."
              },
              "weights_mode": {
                "label": "Modo de pesos",
                "description": "Modo de vecindad espacial."
              },
              "k": {
                "label": "K",
                "description": "k para k_nearest."
              },
              "distance": {
                "label": "Distancia",
                "description": "Umbral de distancia."
              },
              "row_standardize": {
                "label": "Estandarizar por filas",
                "description": "Estandarizar los pesos por filas."
              },
              "output": {
                "label": "Salida",
                "description": "Capa vectorial de salida."
              }
            }
          },
          "geographically_weighted_regression": {
            "name": "Regresión ponderada geográficamente",
            "description": "Regresión lineal local con pesos de kernel de decaimiento por distancia (GWR): coeficientes por entidad, R² local, residuos y predicciones, además de diagnósticos globales de AICc / R²; ancho de banda fijo o adaptativo, opcionalmente optimizado por AICc.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de entidades de entrada (puntos, u otras geometrías mediante su punto representativo)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según su extensión). Si se omite, se almacena en memoria."
              },
              "y_field": {
                "label": "Campo Y",
                "description": "Campo numérico dependiente (respuesta)."
              },
              "x_fields": {
                "label": "Campos X",
                "description": "Campo(s) numérico(s) explicativo(s) separados por comas."
              },
              "kernel": {
                "label": "Kernel",
                "description": "Kernel de decaimiento por distancia: 'gaussian' (predeterminado) o 'bisquare'."
              },
              "bandwidth_type": {
                "label": "Tipo de ancho de banda",
                "description": "'adaptive' (predeterminado; ancho de banda = k vecinos más cercanos) o 'fixed' (ancho de banda = una distancia)."
              },
              "bandwidth": {
                "label": "Ancho de banda",
                "description": "Ancho de banda: número de vecinos para adaptativo, o distancia para fijo. Omitir para seleccionarlo minimizando el AICc."
              }
            }
          },
          "ripleys_k_test": {
            "name": "Prueba K de Ripley",
            "description": "Calcula el estadístico de agrupamiento multiescala K de Ripley. Revela el agrupamiento/dispersión dependiente de la escala en distintos rangos de distancia.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos de entrada."
              },
              "max_distance": {
                "label": "Distancia máxima",
                "description": "Distancia máxima de análisis."
              },
              "step_size": {
                "label": "Tamaño de paso",
                "description": "Tamaño del paso de distancia."
              },
              "output": {
                "label": "Salida",
                "description": "Vectorial de salida con estadísticos K."
              }
            }
          },
          "envelope_test": {
            "name": "Prueba de envolvente",
            "description": "Realiza una prueba de envolvente de Monte Carlo que compara el patrón observado con la distribución nula de aleatoriedad espacial completa (CSR). Determina la significación del agrupamiento/dispersión.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos de entrada."
              },
              "num_simulations": {
                "label": "Número de simulaciones",
                "description": "Número de simulaciones de Monte Carlo."
              },
              "max_distance": {
                "label": "Distancia máxima",
                "description": "Distancia máxima de análisis."
              },
              "output": {
                "label": "Salida",
                "description": "Vectorial de salida con los límites de la envolvente."
              }
            }
          },
          "point_process_residuals": {
            "name": "Residuos del proceso puntual",
            "description": "Calcula los residuos de un modelo de proceso puntual de Poisson ajustado para su diagnóstico. Detecta la estructura espacial no modelada.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos de entrada."
              },
              "intensity_field": {
                "label": "Campo de intensidad",
                "description": "Campo de intensidad ajustada."
              },
              "output": {
                "label": "Salida",
                "description": "Vectorial de salida con residuos."
              }
            }
          },
          "ripleys_k_function": {
            "name": "Función K de Ripley",
            "description": "Calcula K(t) y L(t) para caracterizar los patrones de agrupamiento espacial.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos."
              },
              "max_distance": {
                "label": "Distancia máxima",
                "description": "Umbral de distancia máxima."
              },
              "num_distances": {
                "label": "Número de distancias",
                "description": "Número de pasos de distancia."
              },
              "output": {
                "label": "Salida",
                "description": "CSV de salida."
              }
            }
          },
          "point_pattern_envelope": {
            "name": "Envolvente del patrón de puntos",
            "description": "Genera envolventes de banda crítica para contrastar hipótesis frente a la aleatoriedad espacial completa (CSR).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos."
              },
              "max_distance": {
                "label": "Distancia máxima",
                "description": "Distancia máxima."
              },
              "num_distances": {
                "label": "Número de distancias",
                "description": "Intervalos de distancia."
              },
              "num_simulations": {
                "label": "Número de simulaciones",
                "description": "Réplicas de Monte Carlo."
              },
              "alpha": {
                "label": "Alfa",
                "description": "Nivel de significancia."
              },
              "output": {
                "label": "Salida",
                "description": "CSV de salida."
              }
            }
          },
          "inhomogeneous_baseline": {
            "name": "Línea base no homogénea",
            "description": "Estima una superficie de intensidad y calcula la función K corregida por la intensidad.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos."
              },
              "max_distance": {
                "label": "Distancia máxima",
                "description": "Distancia máxima."
              },
              "num_distances": {
                "label": "Número de distancias",
                "description": "Intervalos de distancia."
              },
              "bandwidth": {
                "label": "Ancho de banda",
                "description": "Ancho de banda de KDE (selección automática si se omite)."
              },
              "output": {
                "label": "Salida",
                "description": "CSV de salida."
              }
            }
          },
          "hotspot_vs_process": {
            "name": "Punto caliente frente a proceso",
            "description": "Compara los patrones de puntos calientes con la intensidad del proceso puntual subyacente.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos."
              },
              "hotspot_field": {
                "label": "Campo de puntos calientes",
                "description": "Campo de clasificación de puntos calientes."
              },
              "intensity_field": {
                "label": "Campo de intensidad",
                "description": "Campo de intensidad."
              },
              "output": {
                "label": "Salida",
                "description": "CSV de salida."
              }
            }
          },
          "point_process_residuals_comparison": {
            "name": "Comparación de residuos de procesos puntuales",
            "description": "Calcula diagnósticos de residuos para comprobar la adecuación del modelo.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos."
              },
              "observed_field": {
                "label": "Campo observado",
                "description": "Campo de valores observados."
              },
              "predicted_field": {
                "label": "Campo predicho",
                "description": "Campo de valores predichos."
              },
              "residual_type": {
                "label": "Tipo de residuo",
                "description": "Tipo de residuo."
              },
              "output": {
                "label": "Salida",
                "description": "CSV de salida."
              }
            }
          },
          "construct_vector_tin": {
            "name": "Construir TIN vectorial",
            "description": "Construye una red irregular de triángulos (TIN) a partir de un conjunto de puntos de entrada mediante la triangulación de Delaunay.",
            "params": {
              "input_points": {
                "label": "Puntos de entrada",
                "description": "Capa vectorial de puntos o multipuntos de entrada."
              },
              "field_name": {
                "label": "Nombre del campo",
                "description": "Nombre de campo opcional para las alturas de los vértices (campo numérico)."
              },
              "use_z": {
                "label": "Usar Z",
                "description": "Si es verdadero, usa los valores Z de la geometría para las elevaciones de los triángulos."
              },
              "max_triangle_edge_length": {
                "label": "Longitud máxima de arista del triángulo",
                "description": "Longitud máxima permitida de arista de triángulo (filtra las aristas largas). Use 0 o negativo para no limitar."
              },
              "output": {
                "label": "Salida",
                "description": "Capa vectorial de polígonos de salida (TIN)."
              }
            }
          },
          "contours_from_points": {
            "name": "Curvas de nivel desde puntos",
            "description": "Crea polilíneas de curvas de nivel a partir de las elevaciones de los puntos mediante un TIN de Delaunay.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del vectorial de puntos o multipuntos de entrada."
              },
              "base": {
                "label": "Base",
                "description": "Elevación de la curva de nivel base (predeterminado 0.0)."
              },
              "field_name": {
                "label": "Nombre del campo",
                "description": "Campo de atributo numérico que contiene los valores de elevación (se ignora cuando use_z_values=true)."
              },
              "interval": {
                "label": "Intervalo",
                "description": "Valor del intervalo de curvas de nivel (predeterminado 10.0)."
              },
              "max_triangle_edge_length": {
                "label": "Longitud máxima de arista del triángulo",
                "description": "Longitud máxima de arista de triángulo a incluir en el trazado de curvas (unidades del mapa)."
              },
              "smooth": {
                "label": "Suavizar",
                "description": "Tamaño del filtro de suavizado (entero impar, predeterminado 9)."
              },
              "use_z_values": {
                "label": "Usar valores Z",
                "description": "Usar los valores Z de la geometría como elevaciones (predeterminado false)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "contours_from_raster": {
            "name": "Curvas de nivel desde ráster",
            "description": "Crea polilíneas de curvas de nivel a partir de un modelo de superficie ráster.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de superficie de entrada u objeto ráster tipado."
              },
              "base": {
                "label": "Base",
                "description": "Elevación de la curva de nivel base (predeterminado 0.0)."
              },
              "interval": {
                "label": "Intervalo",
                "description": "Valor del intervalo de curvas de nivel (predeterminado 10.0)."
              },
              "smooth": {
                "label": "Suavizar",
                "description": "Tamaño del filtro de suavizado (entero impar, predeterminado 9)."
              },
              "tolerance": {
                "label": "Tolerancia",
                "description": "Ángulo mínimo de deflexión de línea en grados para la simplificación (predeterminado 10.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "extract_nodes": {
            "name": "Extraer nodos",
            "description": "Convierte los vértices de polilíneas y polígonos en entidades de puntos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de polilíneas o polígonos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de puntos de salida."
              }
            }
          },
          "extract_raster_values_at_points": {
            "name": "Extraer valores ráster en puntos",
            "description": "Muestrea uno o varios rásteres en las ubicaciones de los puntos y escribe los valores en los atributos de los puntos.",
            "params": {
              "rasters": {
                "label": "Rásteres",
                "description": "Rutas de rásteres de entrada como matriz o cadena delimitada."
              },
              "points": {
                "label": "Puntos",
                "description": "Capa vectorial de puntos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de puntos de salida."
              }
            }
          },
          "find_lowest_or_highest_points": {
            "name": "Encontrar los puntos más bajos o más altos",
            "description": "Localiza las celdas ráster más bajas y/o más altas y genera sus ubicaciones como puntos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de entrada."
              },
              "out_type": {
                "label": "Tipo de salida",
                "description": "Tipo de salida: lowest, highest o both."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de puntos de salida."
              }
            }
          },
          "hexagonal_grid_from_raster_base": {
            "name": "Malla hexagonal desde base ráster",
            "description": "Crea una malla poligonal hexagonal con ancho y orientación configurables, que proporciona una teselación no sesgada para mapas de calor y agregaciones.",
            "params": {
              "base": {
                "label": "Base",
                "description": "Ráster base que controla la extensión de la malla."
              },
              "width": {
                "label": "Ancho",
                "description": "Ancho del hexágono en unidades del mapa."
              },
              "orientation": {
                "label": "Orientación",
                "description": "Orientación del hexágono: horizontal o vertical."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de polígonos de salida."
              }
            }
          },
          "hexagonal_grid_from_vector_base": {
            "name": "Malla hexagonal desde base vectorial",
            "description": "Crea una malla poligonal hexagonal alineada con la extensión de una capa vectorial, lo que permite una agregación espacial no sesgada y la visualización de la densidad.",
            "params": {
              "base": {
                "label": "Base",
                "description": "Capa vectorial base que controla la extensión de la malla."
              },
              "width": {
                "label": "Ancho",
                "description": "Ancho del hexágono en unidades del mapa."
              },
              "orientation": {
                "label": "Orientación",
                "description": "Orientación del hexágono: horizontal o vertical."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de polígonos de salida."
              }
            }
          },
          "layer_footprint_raster": {
            "name": "Huella de capa ráster",
            "description": "Crea una huella poligonal que representa la extensión completa de un ráster de entrada.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de polígonos de salida."
              }
            }
          },
          "layer_footprint_vector": {
            "name": "Huella de capa vectorial",
            "description": "Crea una huella poligonal que representa la extensión envolvente completa de una capa vectorial de entrada.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de polígonos de salida."
              }
            }
          },
          "medoid": {
            "name": "Medoide",
            "description": "Calcula los puntos medoides a partir de geometrías vectoriales.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de puntos medoide de salida."
              }
            }
          },
          "random_points_in_polygon": {
            "name": "Puntos aleatorios en polígono",
            "description": "Genera puntos aleatorios distribuidos uniformemente dentro de las geometrías poligonales de entrada.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de polígonos de entrada."
              },
              "num_points": {
                "label": "Número de puntos",
                "description": "Número de puntos aleatorios a crear."
              },
              "seed": {
                "label": "Semilla",
                "description": "Semilla RNG opcional para la reproducibilidad."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "rectangular_grid_from_raster_base": {
            "name": "Malla rectangular desde base ráster",
            "description": "Crea una malla poligonal rectangular que cubre la extensión de un ráster.",
            "params": {
              "base": {
                "label": "Base",
                "description": "Ráster base que controla la extensión de la malla."
              },
              "width": {
                "label": "Ancho",
                "description": "Ancho de celda de malla en unidades del mapa."
              },
              "height": {
                "label": "Altura",
                "description": "Alto de celda de malla en unidades del mapa."
              },
              "x_origin": {
                "label": "Origen X",
                "description": "Origen x opcional para la alineación de la malla."
              },
              "y_origin": {
                "label": "Origen Y",
                "description": "Origen y opcional para la alineación de la malla."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de polígonos de salida."
              }
            }
          },
          "rectangular_grid_from_vector_base": {
            "name": "Malla rectangular desde base vectorial",
            "description": "Crea una malla poligonal rectangular que cubre la extensión envolvente de una capa vectorial.",
            "params": {
              "base": {
                "label": "Base",
                "description": "Capa vectorial base que controla la extensión de la malla."
              },
              "width": {
                "label": "Ancho",
                "description": "Ancho de celda de malla en unidades del mapa."
              },
              "height": {
                "label": "Altura",
                "description": "Alto de celda de malla en unidades del mapa."
              },
              "x_origin": {
                "label": "Origen X",
                "description": "Origen x opcional para la alineación de la malla."
              },
              "y_origin": {
                "label": "Origen Y",
                "description": "Origen y opcional para la alineación de la malla."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de polígonos de salida."
              }
            }
          },
          "vector_hex_binning": {
            "name": "Agrupación hexagonal vectorial",
            "description": "Agrega las entidades de puntos en intervalos hexagonales, contando los puntos por celda hexagonal.",
            "params": {
              "vector_points": {
                "label": "Puntos vectoriales",
                "description": "Capa vectorial de puntos o multipuntos de entrada."
              },
              "width": {
                "label": "Ancho",
                "description": "Ancho del hexágono (distancia entre lados opuestos)."
              },
              "orientation": {
                "label": "Orientación",
                "description": "Orientación del hexágono: 'h' para horizontal (vértice arriba) o 'v' para vertical (lado arriba)."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de polígonos hexagonales de salida con conteos."
              }
            }
          },
          "voronoi_diagram": {
            "name": "Diagrama de Voronoi",
            "description": "Crea polígonos de Voronoi (Thiessen) a partir de las ubicaciones de los puntos de entrada.",
            "params": {
              "input_points": {
                "label": "Puntos de entrada",
                "description": "Capa vectorial de puntos o multipuntos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de polígonos de Voronoi de salida."
              }
            }
          },
          "add_field": {
            "name": "Añadir campo",
            "description": "Añade un nuevo campo de atributo con un valor predeterminado opcional.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "field": {
                "label": "Campo",
                "description": "Nombre del campo nuevo."
              },
              "field_type": {
                "label": "Tipo de campo",
                "description": "Tipo de campo: integer, float, text, boolean."
              },
              "default": {
                "label": "Predeterminado",
                "description": "Valor predeterminado opcional."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "add_geometry_attributes": {
            "name": "Añadir atributos de geometría",
            "description": "Calcula automáticamente propiedades geométricas (área, longitud, perímetro, centroide) y las añade como nuevos campos, con soporte para mediciones tanto planas como geodésicas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "measurement_mode": {
                "label": "Modo de medición",
                "description": "Método de medición: auto (predeterminado), planar o geodesic."
              },
              "area": {
                "label": "Área",
                "description": "Incluir campo de área (AREA_M2 para geodésico, AREA_MAP2 para planar)."
              },
              "length": {
                "label": "Longitud",
                "description": "Incluir campo de longitud (LENGTH_M para geodésico, LENGTH_MAP para planar)."
              },
              "perimeter": {
                "label": "Perímetro",
                "description": "Incluir campo de perímetro (PERIM_M para geodésico, PERIM_MAP para planar)."
              },
              "centroid": {
                "label": "Centroide",
                "description": "Incluir campos X/Y del centroide (predeterminado true)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "attribute_correlation": {
            "name": "Correlación de atributos",
            "description": "Realiza un análisis de correlación de Pearson sobre los campos de atributos numéricos de una capa vectorial.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del vectorial de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional de salida del informe HTML (alias: output_html_file)."
              }
            }
          },
          "attribute_histogram": {
            "name": "Histograma de atributos",
            "description": "Crea un histograma de los valores de un campo numérico de una tabla de atributos vectorial.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del vectorial de entrada."
              },
              "field": {
                "label": "Campo",
                "description": "Nombre del campo de atributo numérico."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional de salida del informe HTML (alias: output_html_file)."
              }
            }
          },
          "attribute_scattergram": {
            "name": "Diagrama de dispersión de atributos",
            "description": "Calcula estadísticas resumen de diagrama de dispersión entre dos campos numéricos vectoriales.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del vectorial de entrada."
              },
              "fieldx": {
                "label": "Campo X",
                "description": "Nombre del campo numérico del eje x."
              },
              "fieldy": {
                "label": "Campo Y",
                "description": "Nombre del campo numérico del eje y."
              },
              "trendline": {
                "label": "Línea de tendencia",
                "description": "Incluir resumen de la línea de tendencia (predeterminado false)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional de salida del informe HTML (alias: output_html_file)."
              }
            }
          },
          "delete_field": {
            "name": "Eliminar campo",
            "description": "Elimina uno o varios campos de atributo de una capa vectorial.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "fields": {
                "label": "Campos",
                "description": "Nombres de campos a eliminar delimitados por comas."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "extract_by_attribute": {
            "name": "Extraer por atributo",
            "description": "Extrae las entidades vectoriales que cumplen una expresión de atributos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "statement": {
                "label": "Sentencia",
                "description": "Expresión booleana evaluada contra los campos de atributos; acepta los alias AND/OR/NOT/XOR al estilo SQL."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "field_calculator": {
            "name": "Calculadora de campos",
            "description": "Calcula el valor de un campo a partir de una expresión que usa atributos de la entidad y variables de geometría; admite CASE y CAST de estilo SQL, comprobaciones de nulos y envoltorios UPDATE ... SET ... [WHERE ...].",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "field": {
                "label": "Campo",
                "description": "Nombre del campo de salida."
              },
              "field_type": {
                "label": "Tipo de campo",
                "description": "Tipo del campo de salida: float, integer, text."
              },
              "expression": {
                "label": "Expresión",
                "description": "Expresión evaluada por entidad. Admite CASE al estilo SQL, CAST(... AS tipo), IS NULL/IS NOT NULL y envolturas UPDATE ... SET CAMPO = ... [WHERE ...]."
              },
              "overwrite": {
                "label": "Sobrescribir",
                "description": "Sobrescribir el campo existente si está presente (predeterminado true)."
              },
              "preview_rows": {
                "label": "Filas de vista previa",
                "description": "Número opcional de filas de vista previa a devolver en la carga útil del resultado. Cuando es > 0, la salida puede omitirse para una evaluación de solo vista previa."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida. Opcional cuando preview_rows > 0."
              }
            }
          },
          "filter_vector_features_by_area": {
            "name": "Filtrar entidades vectoriales por área",
            "description": "Filtra las entidades poligonales por debajo de un umbral de área mínima.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de polígonos de entrada."
              },
              "threshold": {
                "label": "Umbral",
                "description": "Área mínima de polígono a conservar, en unidades de coordenadas de la capa al cuadrado."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "list_unique_values": {
            "name": "Listar valores únicos",
            "description": "Enumera los valores únicos y sus frecuencias en un campo de atributo vectorial.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del vectorial de entrada."
              },
              "field": {
                "label": "Campo",
                "description": "Nombre del campo de atributo."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del CSV de salida."
              }
            }
          },
          "rename_field": {
            "name": "Renombrar campo",
            "description": "Cambia el nombre de un campo de atributo de una capa vectorial.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "field": {
                "label": "Campo",
                "description": "Nombre del campo existente."
              },
              "new_field": {
                "label": "Campo nuevo",
                "description": "Nombre del campo de sustitución."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "download_osm_vector": {
            "name": "Descargar vectorial de OSM",
            "description": "Descarga entidades de OpenStreetMap desde la API de Overpass para un rectángulo envolvente y escribe el resultado como una capa vectorial.",
            "params": {
              "west": {
                "label": "Oeste",
                "description": "Longitud del límite oeste (EPSG:4326)."
              },
              "south": {
                "label": "Sur",
                "description": "Latitud del límite sur (EPSG:4326)."
              },
              "east": {
                "label": "Este",
                "description": "Longitud del límite este (EPSG:4326)."
              },
              "north": {
                "label": "Norte",
                "description": "Latitud del límite norte (EPSG:4326)."
              },
              "input_extent_epsg": {
                "label": "EPSG de la extensión de entrada",
                "description": "Código EPSG de la extensión de entrada oeste/sur/este/norte (predeterminado 4326)."
              },
              "filter_preset": {
                "label": "Filtro predefinido",
                "description": "Clase de entidad predefinida: all, roads, buildings, water, landuse, trails, parks, rail, amenities, boundaries, transit, poi (predeterminado all)."
              },
              "include_tags": {
                "label": "Etiquetas incluidas",
                "description": "Lista de filtro de claves de etiquetas delimitada por punto y coma, p. ej. amenity;shop."
              },
              "include_key_values": {
                "label": "Pares clave-valor incluidos",
                "description": "Lista de filtro clave=valor delimitada por punto y coma, p. ej. amenity=school;building=yes."
              },
              "filter_key": {
                "label": "Clave de filtro",
                "description": "Filtro heredado de clave de etiqueta única (obsoleto; use include_tags)."
              },
              "filter_key_value": {
                "label": "Valor de clave de filtro",
                "description": "Filtro heredado de clave=valor único (obsoleto; use include_key_values)."
              },
              "include_points": {
                "label": "Incluir puntos",
                "description": "Incluir las entidades de nodo OSM con etiquetas como geometrías Point (predeterminado true)."
              },
              "include_lines": {
                "label": "Incluir líneas",
                "description": "Incluir las entidades de vía OSM como geometrías LineString (predeterminado true)."
              },
              "include_polygons": {
                "label": "Incluir polígonos",
                "description": "Incluir las vías OSM cerradas con etiquetas de área como geometrías Polygon (predeterminado true)."
              },
              "clip_to_extent": {
                "label": "Recortar a la extensión",
                "description": "Recortar las geometrías de salida a la extensión del cuadro delimitador de la consulta (predeterminado true)."
              },
              "split_output_by_geometry": {
                "label": "Dividir salida por geometría",
                "description": "Escribir salidas separadas por tipo de geometría (<output>_points|lines|polygons.ext)."
              },
              "output_epsg": {
                "label": "EPSG de salida",
                "description": "Reproyectar la salida a este código EPSG; omitir para mantener EPSG:4326."
              },
              "overpass_profile": {
                "label": "Perfil de Overpass",
                "description": "Perfil del punto final de Overpass: main, kumi, fr o custom (predeterminado main)."
              },
              "overpass_url": {
                "label": "URL de Overpass",
                "description": "URL del punto final de la API de Overpass (predeterminado https://overpass-api.de/api/interpreter)."
              },
              "timeout_seconds": {
                "label": "Tiempo de espera (segundos)",
                "description": "Tiempo de espera de la consulta en segundos (predeterminado 25)."
              },
              "max_elements": {
                "label": "Elementos máximos",
                "description": "Número máximo de elementos de Overpass devueltos antes de generar un error (predeterminado 50 000)."
              },
              "chunk_large_aoi": {
                "label": "Dividir AOI grandes en fragmentos",
                "description": "Dividir automáticamente las AOI grandes en múltiples solicitudes de Overpass (predeterminado true)."
              },
              "chunk_max_area_deg2": {
                "label": "Área máxima por fragmento (grados²)",
                "description": "Área máxima por fragmento en grados cuadrados al fragmentar (predeterminado 4.0)."
              },
              "max_chunk_count": {
                "label": "Número máximo de fragmentos",
                "description": "Límite estricto del número de fragmentos al fragmentar AOI grandes (predeterminado 64)."
              },
              "chunk_parallel_requests": {
                "label": "Solicitudes paralelas por fragmento",
                "description": "Número máximo de solicitudes de fragmentos en paralelo para AOI grandes (predeterminado 1 = secuencial)."
              },
              "cache_dir": {
                "label": "Directorio de caché",
                "description": "Directorio opcional para almacenar en caché las respuestas JSON de Overpass por hash de punto final+consulta."
              },
              "cache_ttl_hours": {
                "label": "TTL de caché (horas)",
                "description": "Tiempo de vida de la caché en horas (predeterminado 24; 0 significa sin comprobación de caducidad)."
              },
              "provenance_output": {
                "label": "Salida de procedencia",
                "description": "Ruta JSON opcional para escribir el archivo auxiliar de metadatos de consulta/procedencia."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida; cuando se omite, se usa una salida temporal."
              }
            }
          },
          "assign_projection_lidar": {
            "name": "Asignar proyección a LiDAR",
            "description": "Asigna un sistema de referencia de coordenadas a una nube de puntos LiDAR sin reproyectar sus puntos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo LiDAR de entrada (LAS/LAZ/COPC, o identificador en memoria)."
              },
              "epsg": {
                "label": "EPSG",
                "description": "Código EPSG del CRS a asignar, p. ej. 4326 (WGS84) o 3857 (Web Mercator). Las coordenadas no se transforman."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del LiDAR de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "assign_projection_raster": {
            "name": "Asignar proyección a ráster",
            "description": "Asigna un sistema de referencia de coordenadas a un ráster sin deformar sus celdas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada (o identificador en memoria)."
              },
              "epsg": {
                "label": "EPSG",
                "description": "Código EPSG del CRS a asignar, p. ej. 4326 (WGS84) o 3857 (Web Mercator). Las coordenadas no se transforman."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "assign_projection_vector": {
            "name": "Asignar proyección a vectorial",
            "description": "Asigna un sistema de referencia de coordenadas a una capa vectorial sin reproyectar sus geometrías.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo vectorial de entrada, formato detectado automáticamente (o identificador en memoria)."
              },
              "epsg": {
                "label": "EPSG",
                "description": "Código EPSG del CRS a asignar, p. ej. 4326 (WGS84) o 3857 (Web Mercator). Las coordenadas no se transforman."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según su extensión). Si se omite, se almacena en memoria."
              }
            }
          },
          "georeference_raster_from_control_points": {
            "name": "Georreferenciar ráster con puntos de control",
            "description": "Ajusta una transformación a partir de puntos de control terrestre (GCP) y deforma un ráster para obtener una salida georreferenciada.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada."
              },
              "control_points": {
                "label": "Puntos de control",
                "description": "Ruta del CSV de puntos de control con pixel_x,pixel_y,map_x,map_y (y alias aceptados)."
              },
              "epsg": {
                "label": "EPSG",
                "description": "Código EPSG de destino."
              },
              "transform_type": {
                "label": "Tipo de transformación",
                "description": "Tipo de transformación: affine, projective, polynomial o thin_plate_spline."
              },
              "transform_order": {
                "label": "Orden de transformación",
                "description": "Orden del polinomio cuando transform_type=polynomial."
              },
              "resample": {
                "label": "Remuestrear",
                "description": "Método de remuestreo; predeterminado bilinear."
              },
              "allow_auto_downgrade": {
                "label": "Permitir degradación automática",
                "description": "Permitir la degradación automática a una transformación más simple cuando los GCP son escasos."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster georreferenciado de salida."
              },
              "report": {
                "label": "Informe",
                "description": "Ruta del JSON del informe de salida."
              }
            }
          },
          "reproject_lidar": {
            "name": "Reproyectar LiDAR",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Entrada"
              },
              "dst_epsg": {
                "label": "EPSG de destino",
                "description": "EPSG de destino"
              },
              "output": {
                "label": "Salida",
                "description": "Salida"
              },
              "use_3d_transform": {
                "label": "Usar transformación 3D",
                "description": "Usar transformación 3D"
              },
              "failure_policy": {
                "label": "Política ante fallos",
                "description": "Política ante fallos"
              },
              "coordinate_epoch": {
                "label": "Época de coordenadas",
                "description": "Época de coordenadas"
              },
              "source_reference_epoch": {
                "label": "Época de referencia de origen",
                "description": "Época de referencia de origen"
              },
              "target_reference_epoch": {
                "label": "Época de referencia de destino",
                "description": "Época de referencia de destino"
              },
              "operation_code": {
                "label": "Código de operación",
                "description": "Código de operación"
              },
              "prefer_official_operation": {
                "label": "Preferir operación oficial",
                "description": "Preferir operación oficial"
              },
              "epoch_policy": {
                "label": "Política de época",
                "description": "Política de época"
              }
            }
          },
          "reproject_raster": {
            "name": "Reproyectar ráster",
            "description": "Reproyecta (deforma) un ráster a un sistema de referencia de coordenadas EPSG de destino.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada. Debe tener un CRS de origen (EPSG o WKT)."
              },
              "epsg": {
                "label": "EPSG",
                "description": "Código EPSG de destino, p. ej. 3857 (Web Mercator) o 4326 (WGS84)."
              },
              "method": {
                "label": "Método",
                "description": "Método de remuestreo: nearest (predeterminado), bilinear, cubic, lanczos, average, min, max, mode, median."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "reproject_vector": {
            "name": "Reproyectar vectorial",
            "description": "Reproyecta geometrías vectoriales a una proyección EPSG de destino conservando la topología y los atributos, lo que permite la integración de múltiples fuentes.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "epsg": {
                "label": "EPSG",
                "description": "Código EPSG de destino."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "orthorectification": {
            "name": "Ortorrectificación",
            "description": "Corrección geométrica basada en DEM de imágenes brutas mediante el modelo de cámara RPC. Elimina el desplazamiento por relieve del terreno para generar una ortoimagen georreferenciada.",
            "params": {
              "input_raster": {
                "label": "Ráster de entrada",
                "description": "Ruta del ráster de imagen bruta (sin corregir) de entrada. Los metadatos RPC deben estar incrustados en el archivo o presentes en un archivo auxiliar .RPB adyacente."
              },
              "input_dem": {
                "label": "DEM de entrada",
                "description": "Ráster DEM usado para obtener la elevación del terreno de cada píxel de salida. Debe cubrir toda la extensión de la escena. Si no está en coordenadas geográficas, la herramienta lo reproyecta según sea necesario."
              },
              "output_epsg": {
                "label": "EPSG de salida",
                "description": "Código EPSG del sistema de referencia de coordenadas de salida (predeterminado 4326 geográfico; especifique un CRS proyectado como 32617 para la zona UTM 17N)."
              },
              "output_resolution": {
                "label": "Resolución de salida",
                "description": "Resolución de píxel de salida en las unidades del CRS de salida (p. ej., grados para geográfico, metros para proyectado). Por defecto el GSD aproximado de la imagen de entrada."
              },
              "resample_method": {
                "label": "Método de remuestreo",
                "description": "Método de remuestreo para la salida: nearest, bilinear (predeterminado), cubic."
              },
              "nodata_value": {
                "label": "Valor sin datos",
                "description": "Valor sin datos a asignar a los píxeles sin cobertura de origen válida (predeterminado el mismo que la entrada)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de ortoimagen de salida."
              }
            }
          },
          "average_flowpath_slope": {
            "name": "Pendiente media de la trayectoria de flujo",
            "description": "Calcula la pendiente media de las trayectorias de flujo que pasan por cada celda del DEM.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM sin depresiones de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, devuelve un ráster en memoria."
              }
            }
          },
          "average_upslope_flowpath_length": {
            "name": "Longitud media de la trayectoria de flujo aguas arriba",
            "description": "Calcula la longitud media de la trayectoria de flujo aguas arriba que pasa por cada celda del DEM.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM sin depresiones de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, devuelve un ráster en memoria."
              }
            }
          },
          "d8_flow_accum": {
            "name": "Acumulación de flujo D8",
            "description": "Calcula la acumulación de flujo D8 a partir de un DEM o de un ráster de punteros D8.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster DEM o de punteros D8 de entrada"
              },
              "clip": {
                "label": "Recortar",
                "description": "Máximo de visualización de recorte (aceptado por compatibilidad)"
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Usar codificación de punteros ESRI para las entradas de punteros"
              },
              "input_is_pointer": {
                "label": "La entrada es un puntero",
                "description": "Tratar la entrada como ráster de punteros D8"
              },
              "log_transform": {
                "label": "Transformación logarítmica",
                "description": "Transformación logarítmica de la salida"
              },
              "out_type": {
                "label": "Tipo de salida",
                "description": "Tipo de salida: cells, ca o sca"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "d8_mass_flux": {
            "name": "Flujo de masa D8",
            "description": "Realiza una acumulación de flujo de masa basada en D8 usando rásteres de carga, eficiencia y absorción.",
            "params": {
              "absorption": {
                "label": "Absorción",
                "description": "Ráster de pérdidas de masa por celda en unidades de carga."
              },
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM sin depresiones de entrada usado para derivar las direcciones de flujo D8."
              },
              "efficiency": {
                "label": "Eficiencia",
                "description": "Ráster de valores de eficiencia de transferencia, ya sea en `[0, 1]` o en porcentaje."
              },
              "loading": {
                "label": "Carga",
                "description": "Ráster de valores iniciales de carga de masa."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, devuelve un ráster en memoria."
              }
            }
          },
          "d8_pointer": {
            "name": "Puntero D8",
            "description": "Dirección de flujo de máxima pendiente sobre 8 vecinos (N/NE/E/SE/S/SW/W/NW). Base del análisis hidrológico D8 y de la delimitación de cuencas hidrográficas.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada"
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Usar codificación de punteros ESRI"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "dinf_flow_accum": {
            "name": "Acumulación de flujo D-infinito",
            "description": "Calcula la acumulación de flujo D-infinito a partir de un DEM o de un ráster de punteros D-infinito.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster DEM o de punteros D-infinito de entrada"
              },
              "clip": {
                "label": "Recortar",
                "description": "Máximo de visualización de recorte (aceptado por compatibilidad)"
              },
              "convergence_threshold": {
                "label": "Umbral de convergencia",
                "description": "Umbral por encima del cual el flujo no se dispersa"
              },
              "input_is_pointer": {
                "label": "La entrada es un puntero",
                "description": "Tratar la entrada como ráster de punteros D-infinito"
              },
              "log_transform": {
                "label": "Transformación logarítmica",
                "description": "Transformación logarítmica de la salida"
              },
              "out_type": {
                "label": "Tipo de salida",
                "description": "Tipo de salida: cells, ca o sca"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "dinf_mass_flux": {
            "name": "Flujo de masa D-infinito",
            "description": "Realiza una acumulación de flujo de masa D-infinito usando rásteres de carga, eficiencia y absorción.",
            "params": {
              "absorption": {
                "label": "Absorción",
                "description": "Ráster de absorción de entrada en unidades de carga."
              },
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada."
              },
              "efficiency": {
                "label": "Eficiencia",
                "description": "Ráster de eficiencia de entrada (valores `0-1` o en porcentaje)."
              },
              "loading": {
                "label": "Carga",
                "description": "Ráster de carga de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, devuelve un ráster en memoria."
              }
            }
          },
          "dinf_pointer": {
            "name": "Puntero D-infinito",
            "description": "Direcciones de flujo continuas (0-2π radianes) que eliminan el sesgo diagonal de D8. Mejor para el transporte de sedimentos y la modelización del flujo divergente.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "downslope_flowpath_length": {
            "name": "Longitud de la trayectoria de flujo aguas abajo",
            "description": "Calcula la longitud de la trayectoria de flujo aguas abajo desde cada celda hasta una salida en un ráster de punteros D8.",
            "params": {
              "d8_pntr": {
                "label": "Puntero D8",
                "description": "Ráster de punteros D8 de entrada"
              },
              "watersheds": {
                "label": "Cuencas",
                "description": "Ráster de cuencas opcional"
              },
              "weights": {
                "label": "Pesos",
                "description": "Ráster opcional de ponderación por distancia por celda"
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Usar codificación de punteros ESRI"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "fd8_flow_accum": {
            "name": "Acumulación de flujo FD8",
            "description": "Calcula la acumulación de flujo FD8 a partir de un DEM.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada"
              },
              "clip": {
                "label": "Recortar",
                "description": "Máximo de visualización de recorte (aceptado por compatibilidad)"
              },
              "exponent": {
                "label": "Exponente",
                "description": "Exponente de ponderación por pendiente"
              },
              "log_transform": {
                "label": "Transformación logarítmica",
                "description": "Transformación logarítmica de la salida"
              },
              "out_type": {
                "label": "Tipo de salida",
                "description": "Tipo de salida: cells, ca o sca"
              },
              "threshold": {
                "label": "Umbral",
                "description": "Umbral"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "fd8_pointer": {
            "name": "Puntero FD8",
            "description": "Flujo fraccionado hacia múltiples vecinos aguas abajo ponderado por la pendiente. Mejor que D8 para procesos dispersivos y difusivos y para la conservación de la masa.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "flow_accum_full_workflow": {
            "name": "Flujo de trabajo completo de acumulación de flujo",
            "description": "Ejecuta un flujo de trabajo completo de acumulación de flujo no divergente y devuelve el DEM con brechas abiertas, el puntero de dirección de flujo y la acumulación.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada."
              },
              "clip": {
                "label": "Recortar",
                "description": "Si es verdadero, recorta el máximo de visualización de la acumulación (comportamiento de compatibilidad)."
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Si es verdadero, codifica la salida de dirección de flujo al estilo de punteros de Esri."
              },
              "log_transform": {
                "label": "Transformación logarítmica",
                "description": "Si es verdadero, aplica transformación logarítmica a los valores de acumulación."
              },
              "out_type": {
                "label": "Tipo de salida",
                "description": "Uno de `\"cells\"`, `\"ca\"`, `\"sca\"` (predeterminado)."
              },
              "breached_dem_output": {
                "label": "Salida de DEM con brechas",
                "description": "Ruta de salida opcional para el ráster DEM sin depresiones."
              },
              "flow_dir_output": {
                "label": "Salida de dirección de flujo",
                "description": "Ruta de salida opcional para el ráster de dirección de flujo."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional para el ráster de acumulación de flujo."
              },
              "output_pointer": {
                "label": "Puntero de salida",
                "description": "Ruta de salida opcional para el puntero de dirección de flujo D8 (alias de flow_dir_output; codificado ESRI cuando se establece esri_pntr)"
              }
            }
          },
          "flow_length_diff": {
            "name": "Diferencia de longitud de flujo",
            "description": "Calcula las diferencias absolutas máximas locales en la longitud de la trayectoria aguas abajo a partir de un ráster de punteros D8.",
            "params": {
              "d8_pntr": {
                "label": "Puntero D8",
                "description": "Ráster de punteros D8 de entrada."
              },
              "weights": {
                "label": "Pesos",
                "description": "Pesos"
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Si es verdadero, interpreta los valores de puntero usando la codificación D8 de ESRI."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, devuelve un ráster en memoria."
              }
            }
          },
          "max_upslope_flowpath_length": {
            "name": "Longitud máxima de trayectoria de flujo aguas arriba",
            "description": "Calcula la longitud máxima de la trayectoria de flujo aguas arriba que pasa por cada celda del DEM.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM sin depresiones de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, devuelve un ráster en memoria."
              }
            }
          },
          "max_upslope_value": {
            "name": "Valor máximo aguas arriba",
            "description": "Propaga el valor máximo aguas arriba a lo largo de las trayectorias de flujo D8 sobre un DEM.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada"
              },
              "values": {
                "label": "Valores",
                "description": "Ráster de valores de entrada"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "mdinf_flow_accum": {
            "name": "Acumulación de flujo MD-infinito",
            "description": "Acumulación de flujo múltiple con ponderación por la pendiente (exponente 1.1). Equilibra el realismo de la dispersión con la identificación del flujo principal concentrado. Salidas: celdas, CA o SCA.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada."
              },
              "clip": {
                "label": "Recortar",
                "description": "Indicador de compatibilidad aceptado por la API."
              },
              "convergence_threshold": {
                "label": "Umbral de convergencia",
                "description": "Umbral por encima del cual el flujo no se dispersa"
              },
              "exponent": {
                "label": "Exponente",
                "description": "Exponente de ponderación por pendiente (predeterminado `1.1`)."
              },
              "log_transform": {
                "label": "Transformación logarítmica",
                "description": "Transformación logarítmica de la salida"
              },
              "out_type": {
                "label": "Tipo de salida",
                "description": "Uno de `\"cells\"`, `\"ca\"`, `\"sca\"` (predeterminado)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, devuelve un ráster en memoria."
              }
            }
          },
          "minimal_dispersion_flow_algorithm": {
            "name": "Algoritmo de flujo de dispersión mínima",
            "description": "Genera rásteres de dirección de flujo y acumulación de flujo MDFA a partir de un DEM.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada"
              },
              "clip": {
                "label": "Recortar",
                "description": "Indicador de compatibilidad aceptado por la API."
              },
              "debug_stats": {
                "label": "Estadísticas de depuración",
                "description": "Emitir diagnósticos MDFA de una línea (conteos y máximo bruto)"
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Si es verdadero, codifica la salida de dirección de flujo al estilo de punteros de Esri."
              },
              "log_transform": {
                "label": "Transformación logarítmica",
                "description": "Si es verdadero, aplica transformación logarítmica a los valores de acumulación."
              },
              "out_type": {
                "label": "Tipo de salida",
                "description": "Uno de `\"cells\"`, `\"ca\"`, `\"sca\"` (predeterminado)."
              },
              "path_corrected_direction_preference": {
                "label": "Preferencia de dirección corregida por trayectoria",
                "description": "Parámetro de preferencia `p` en `[0, 1]`; `1.0` es totalmente no dispersivo."
              },
              "flow_dir_output": {
                "label": "Salida de dirección de flujo",
                "description": "Ruta de salida opcional para el ráster de dirección de flujo."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional para el ráster de acumulación de flujo."
              }
            }
          },
          "num_inflowing_neighbours": {
            "name": "Número de vecinos entrantes",
            "description": "Cuenta el número de vecinos D8 que fluyen hacia cada celda del DEM.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "qin_flow_accumulation": {
            "name": "Acumulación de flujo de Qin",
            "description": "Calcula la acumulación de flujo MFD de Qin a partir de un DEM.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada."
              },
              "clip": {
                "label": "Recortar",
                "description": "Indicador de compatibilidad aceptado por la API."
              },
              "convergence_threshold": {
                "label": "Umbral de convergencia",
                "description": "Umbral por encima del cual el flujo no se dispersa"
              },
              "exponent": {
                "label": "Exponente",
                "description": "Parámetro de exponente del límite superior (predeterminado `10.0`)."
              },
              "log_transform": {
                "label": "Transformación logarítmica",
                "description": "Transformación logarítmica de la salida"
              },
              "max_slope": {
                "label": "Pendiente máxima",
                "description": "Pendiente del límite superior en grados usada por la función de exponente dinámico (predeterminado `45.0`)."
              },
              "out_type": {
                "label": "Tipo de salida",
                "description": "Uno de `\"cells\"`, `\"ca\"`, `\"sca\"` (predeterminado)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, devuelve un ráster en memoria."
              }
            }
          },
          "quinn_flow_accumulation": {
            "name": "Acumulación de flujo de Quinn",
            "description": "Calcula la acumulación de flujo MFD de Quinn a partir de un DEM.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada."
              },
              "clip": {
                "label": "Recortar",
                "description": "Indicador de compatibilidad aceptado por la API."
              },
              "convergence_threshold": {
                "label": "Umbral de convergencia",
                "description": "Umbral por encima del cual el flujo no se dispersa"
              },
              "exponent": {
                "label": "Exponente",
                "description": "Parámetro de exponente (predeterminado `1.1`)."
              },
              "log_transform": {
                "label": "Transformación logarítmica",
                "description": "Transformación logarítmica de la salida"
              },
              "out_type": {
                "label": "Tipo de salida",
                "description": "Uno de `\"cells\"`, `\"ca\"`, `\"sca\"` (predeterminado)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, devuelve un ráster en memoria."
              }
            }
          },
          "rho8_flow_accum": {
            "name": "Acumulación de flujo Rho8",
            "description": "Calcula la acumulación de flujo Rho8 a partir de un DEM o de un ráster de punteros Rho8.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "DEM"
              },
              "clip": {
                "label": "Recortar",
                "description": "Máximo de visualización de recorte (aceptado por compatibilidad)"
              },
              "log_transform": {
                "label": "Transformación logarítmica",
                "description": "Transformación logarítmica de la salida"
              },
              "out_type": {
                "label": "Tipo de salida",
                "description": "Tipo de salida: cells, ca o sca"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "rho8_pointer": {
            "name": "Puntero Rho8",
            "description": "Dirección de flujo única estocástica ponderada por la pendiente. Ejecútela varias veces para un análisis de conjunto que reduzca los artefactos de canalización de D8.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "trace_downslope_flowpaths": {
            "name": "Trazar trayectorias de flujo aguas abajo",
            "description": "Marca las trayectorias de flujo D8 iniciadas en puntos semilla hasta que no haya flujo o se alcance el borde de la malla.",
            "params": {
              "d8_pntr": {
                "label": "Puntero D8",
                "description": "Ráster de punteros D8 de entrada."
              },
              "seed_points": {
                "label": "Puntos semilla",
                "description": "Vectorial de puntos de entrada con las ubicaciones semilla."
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Si es verdadero, interpreta los punteros D8 con codificación ESRI."
              },
              "zero_background": {
                "label": "Fondo cero",
                "description": "Si es verdadero, el fondo es `0`; en caso contrario, el fondo es NoData."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, devuelve un ráster en memoria."
              }
            }
          },
          "breach_depressions_least_cost": {
            "name": "Abrir brechas en depresiones por coste mínimo",
            "description": "Abre brechas en las depresiones de un DEM mediante una búsqueda restringida de la trayectoria de coste mínimo.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada."
              },
              "fill_deps": {
                "label": "Rellenar depresiones",
                "description": "Si es verdadero, rellena las depresiones no resueltas tras la apertura de brechas."
              },
              "flat_increment": {
                "label": "Incremento de planicie",
                "description": "Incremento de decremento monótono opcional."
              },
              "max_cost": {
                "label": "Coste máximo",
                "description": "Coste máximo de brecha permitido."
              },
              "max_dist": {
                "label": "Distancia máxima",
                "description": "Distancia máxima de búsqueda en celdas."
              },
              "minimize_dist": {
                "label": "Minimizar distancia",
                "description": "Si es verdadero, pondera los costes de brecha por distancia."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional."
              }
            }
          },
          "breach_single_cell_pits": {
            "name": "Abrir brechas en hoyos de una celda",
            "description": "Abre brechas en los hoyos de una celda de un DEM excavando canales de una celda.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se devuelve en memoria cuando es posible."
              }
            }
          },
          "burn_streams": {
            "name": "Grabar cauces",
            "description": "Graba una red de cauces en un DEM reduciendo la elevación de las celdas de los cauces.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada."
              },
              "streams": {
                "label": "Cauces",
                "description": "Vectorial de cauces de entrada."
              },
              "decrement_value": {
                "label": "Valor de decremento",
                "description": "Decremento de elevación aplicado a las celdas de cauce (predeterminado 5.0)."
              },
              "gradient_distance": {
                "label": "Distancia de gradiente",
                "description": "Distancia de gradiente en celdas de malla (0 = solo decremento plano; predeterminado 5)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del DEM grabado de salida."
              }
            }
          },
          "burn_streams_at_roads": {
            "name": "Grabar cauces en carreteras",
            "description": "Rebaja la elevación de los cauces cerca de los cruces entre cauces y carreteras para abrir brechas en los terraplenes viarios de un DEM.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada."
              },
              "roads": {
                "label": "Carreteras",
                "description": "Capa vectorial de carreteras."
              },
              "streams": {
                "label": "Cauces",
                "description": "Capa vectorial de cauces."
              },
              "method": {
                "label": "Método",
                "description": "Método"
              },
              "road_width": {
                "label": "Ancho de carretera",
                "description": "Ancho máximo de terraplén en unidades del mapa usado para establecer el alcance del grabado a lo largo del cauce."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, devuelve un ráster en memoria."
              }
            }
          },
          "depth_in_sink": {
            "name": "Profundidad en el sumidero",
            "description": "Mide la profundidad a la que se encuentra cada celda del DEM por debajo de una superficie con las depresiones rellenadas.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada."
              },
              "zero_background": {
                "label": "Fondo cero",
                "description": "Si es verdadero, asigna `0.0` a las celdas fuera de los sumideros; en caso contrario, asigna NoData."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "fill_burn": {
            "name": "Rellenar y grabar",
            "description": "Aplica la corrección hidrológica a un DEM grabando los cauces y rellenando después las depresiones.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada."
              },
              "streams": {
                "label": "Cauces",
                "description": "Capa vectorial de cauces de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, devuelve un ráster en memoria."
              }
            }
          },
          "fill_depressions": {
            "name": "Rellenar depresiones",
            "description": "Rellena las depresiones de un DEM mediante una estrategia priority-flood con resolución de zonas planas de Garbrecht-Martz de forma predeterminada y, opcionalmente, la resolución de zonas planas heredada por trayectoria natural.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada."
              },
              "fix_flats": {
                "label": "Corregir planicies",
                "description": "Si es verdadero, impone un pequeño gradiente sobre las planicies rellenadas."
              },
              "flat_increment": {
                "label": "Incremento de planicie",
                "description": "Incremento de planicie (predeterminado `0.0001`)."
              },
              "flat_resolution": {
                "label": "Resolución de planicies",
                "description": "Modo de resolución de planicies. Uno de `\"garbrecht_martz\"` o `\"natural\"`."
              },
              "max_depth": {
                "label": "Profundidad máxima",
                "description": "Profundidad máxima de relleno permitida."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional."
              }
            }
          },
          "fill_depressions_planchon_and_darboux": {
            "name": "Rellenar depresiones (Planchon y Darboux)",
            "description": "Rellena las depresiones de un DEM con una interfaz compatible con Planchon-Darboux.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada."
              },
              "fix_flats": {
                "label": "Corregir planicies",
                "description": "Si es verdadero, impone un pequeño gradiente sobre las planicies rellenadas."
              },
              "flat_increment": {
                "label": "Incremento de planicie",
                "description": "Incremento de planicie (predeterminado `0.0001`)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional."
              }
            }
          },
          "fill_depressions_wang_and_liu": {
            "name": "Rellenar depresiones (Wang y Liu)",
            "description": "Rellena las depresiones de un DEM con una interfaz compatible con Wang-Liu.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada."
              },
              "fix_flats": {
                "label": "Corregir planicies",
                "description": "Si es verdadero, impone un pequeño gradiente sobre las planicies rellenadas."
              },
              "flat_increment": {
                "label": "Incremento de planicie",
                "description": "Incremento de planicie (predeterminado `0.0001`)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional."
              }
            }
          },
          "fill_pits": {
            "name": "Rellenar hoyos",
            "description": "Rellena los hoyos de una celda de un DEM.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se devuelve en memoria cuando es posible."
              }
            }
          },
          "flatten_lakes": {
            "name": "Aplanar lagos",
            "description": "Aplana la elevación de los lagos usando la elevación mínima del perímetro de cada polígono.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada."
              },
              "lakes": {
                "label": "Lagos",
                "description": "Vectorial de polígonos de entrada con entidades de lagos."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, devuelve un ráster en memoria."
              }
            }
          },
          "impoundment_size_index": {
            "name": "Índice de tamaño de embalse",
            "description": "Calcula métricas de embalse de profundidad media/máxima, volumen, área y altura de presa.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada."
              },
              "max_dam_length": {
                "label": "Longitud máxima de presa",
                "description": "Longitud máxima de presa en unidades del mapa."
              },
              "output_area": {
                "label": "Área de salida",
                "description": "Incluir el ráster de área inundada en la tupla de salida."
              },
              "output_height": {
                "label": "Altura de salida",
                "description": "Incluir el ráster de altura de presa en la tupla de salida."
              },
              "output_max": {
                "label": "Máximo de salida",
                "description": "Incluir el ráster de profundidad máxima de inundación en la tupla de salida."
              },
              "output_mean": {
                "label": "Media de salida",
                "description": "Incluir el ráster de profundidad media de inundación en la tupla de salida."
              },
              "output_volume": {
                "label": "Volumen de salida",
                "description": "Incluir el ráster de volumen inundado en la tupla de salida."
              },
              "out_area": {
                "label": "Área de salida",
                "description": "Ruta de salida opcional para el ráster de área"
              },
              "out_dam_height": {
                "label": "Altura de presa de salida",
                "description": "Ruta de salida opcional para el ráster de altura de presa"
              },
              "out_max": {
                "label": "Máximo de salida",
                "description": "Ruta de salida opcional para el ráster de profundidad máxima"
              },
              "out_mean": {
                "label": "Media de salida",
                "description": "Ruta de salida opcional para el ráster de profundidad media"
              },
              "out_volume": {
                "label": "Volumen de salida",
                "description": "Ruta de salida opcional para el ráster de volumen"
              }
            }
          },
          "insert_dams": {
            "name": "Insertar presas",
            "description": "Añade terraplenes de presa locales en los puntos especificados mediante una selección de la coronación basada en perfiles.",
            "params": {
              "dam_points": {
                "label": "Puntos de presa",
                "description": "Vectorial de puntos de entrada con las ubicaciones de presas."
              },
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada."
              },
              "dam_length": {
                "label": "Longitud de presa",
                "description": "Longitud máxima de presa en unidades del mapa."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, devuelve un ráster en memoria."
              }
            }
          },
          "raise_walls": {
            "name": "Levantar muros",
            "description": "Eleva la elevación del DEM a lo largo de vectoriales de muros y, opcionalmente, abre brechas en los cruces seleccionados.",
            "params": {
              "breach_lines": {
                "label": "Líneas de brecha",
                "description": "Vectorial opcional que define las ubicaciones de las brechas."
              },
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada."
              },
              "walls": {
                "label": "Muros",
                "description": "Vectorial de líneas o polígonos de entrada que define los segmentos de muro."
              },
              "wall_height": {
                "label": "Altura de muro",
                "description": "Incremento de elevación aplicado a las celdas de muro."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, devuelve un ráster en memoria."
              }
            }
          },
          "sink": {
            "name": "Sumidero",
            "description": "Identifica las celdas que pertenecen a depresiones topográficas de un DEM.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada."
              },
              "zero_background": {
                "label": "Fondo cero",
                "description": "Si es verdadero, asigna `0.0` a las celdas fuera de los sumideros; en caso contrario, asigna NoData."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "stochastic_depression_analysis": {
            "name": "Análisis estocástico de depresiones",
            "description": "Ejecuta perturbaciones de Monte Carlo del DEM y estima la probabilidad de pertenencia a una depresión.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada."
              },
              "iterations": {
                "label": "Iteraciones",
                "description": "Número de iteraciones de Monte Carlo."
              },
              "range": {
                "label": "Rango",
                "description": "Rango de autocorrelación del error en unidades del mapa."
              },
              "rmse": {
                "label": "RMSE",
                "description": "RMSE de elevación usado para la perturbación gaussiana."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, devuelve un ráster en memoria."
              }
            }
          },
          "topological_breach_burn": {
            "name": "Grabado topológico de brechas",
            "description": "Graba los cauces en un DEM, acondiciona la superficie y devuelve los rásteres de cauces, DEM, punteros y acumulación.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada."
              },
              "streams": {
                "label": "Cauces",
                "description": "Vectorial de red de cauces de entrada."
              },
              "snap_distance": {
                "label": "Distancia de ajuste",
                "description": "Distancia de ajuste de cauces opcional usada en el escalado de la profundidad de grabado."
              },
              "out_dem": {
                "label": "DEM de salida",
                "description": "Ruta de salida opcional para el DEM grabado/acondicionado."
              },
              "out_dir": {
                "label": "Dirección de salida",
                "description": "Ruta de salida opcional para el ráster de punteros D8."
              },
              "out_fa": {
                "label": "Acumulación de flujo de salida",
                "description": "Ruta de salida opcional para el ráster de acumulación de flujo."
              },
              "out_streams": {
                "label": "Cauces de salida",
                "description": "Ruta de salida opcional para los cauces rasterizados."
              }
            }
          },
          "upslope_depression_storage": {
            "name": "Almacenamiento en depresiones aguas arriba",
            "description": "Cartografía la profundidad media de almacenamiento en depresiones aguas arriba enrutando la profundidad de las depresiones sobre un DEM acondicionado.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, devuelve un ráster en memoria."
              }
            }
          },
          "basins": {
            "name": "Cuencas",
            "description": "Delimita todas las cuencas de drenaje D8 que desaguan hacia los bordes con datos válidos.",
            "params": {
              "d8_pntr": {
                "label": "Puntero D8",
                "description": "Ráster de punteros D8 de entrada."
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Si es verdadero, interpreta los valores de puntero usando la codificación D8 de ESRI."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, devuelve un ráster en memoria."
              }
            }
          },
          "flood_order": {
            "name": "Orden de inundación",
            "description": "Genera el orden secuencial priority-flood de cada celda del DEM.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, devuelve un ráster en memoria."
              }
            }
          },
          "hillslopes": {
            "name": "Laderas",
            "description": "Identifica las regiones de ladera que drenan a cada tramo de cauce, separando las áreas de la margen izquierda y derecha.",
            "params": {
              "d8_pntr": {
                "label": "Puntero D8",
                "description": "Ráster de punteros D8."
              },
              "streams": {
                "label": "Cauces",
                "description": "Ráster de red de cauces donde las celdas de cauce tienen valor > 0 y no son NoData."
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Indicador de codificación de punteros ESRI."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "isobasins": {
            "name": "Isocuencas",
            "description": "Divide un paisaje en cuencas de tamaño aproximadamente igual (isocuencas) en función de un umbral de área objetivo.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM hidrológicamente acondicionado de entrada."
              },
              "target_size": {
                "label": "Tamaño objetivo",
                "description": "Área objetivo de isocuenca en número de celdas de malla (entero o decimal positivo)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida. Si se omite, devuelve un ráster en memoria."
              }
            }
          },
          "jenson_snap_pour_points": {
            "name": "Ajustar puntos de vertido (Jenson)",
            "description": "Ajusta cada punto de vertido a la celda de cauce más cercana dentro de una distancia de búsqueda, conservando todos los atributos de entrada.",
            "params": {
              "pour_pts": {
                "label": "Puntos de vertido",
                "description": "Archivo vectorial de entrada con puntos de vertido (geometrías de punto o multipunto)."
              },
              "streams": {
                "label": "Cauces",
                "description": "Ráster de red de cauces de entrada donde las celdas de cauce tienen valor > 0 y no son NoData."
              },
              "snap_dist": {
                "label": "Distancia de ajuste",
                "description": "Radio máximo de búsqueda en unidades del mapa. Por defecto un ancho de celda cuando se omite o es cero."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida del archivo vectorial de puntos de vertido ajustados (obligatorio; por defecto `snapped_pour_points.geojson` en el directorio de trabajo cuando no se proporciona al envoltorio)."
              }
            }
          },
          "longest_flowpath": {
            "name": "Trayectoria de flujo más larga",
            "description": "Delimita las líneas de la trayectoria de flujo más larga de cada cuenca en un ráster de cuencas.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada"
              },
              "basins": {
                "label": "Cuencas",
                "description": "Ráster de cuencas de entrada"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida"
              }
            }
          },
          "max_branch_length": {
            "name": "Longitud máxima de ramificación",
            "description": "Calcula la longitud máxima de rama entre trayectorias de flujo D8 vecinas, útil para resaltar las divisorias.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "log_transform": {
                "label": "Transformación logarítmica",
                "description": "Aplicar transformación logarítmica natural a las salidas positivas."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional."
              }
            }
          },
          "snap_pour_points": {
            "name": "Ajustar puntos de vertido",
            "description": "Ajusta los puntos de vertido a la celda de mayor acumulación de flujo dentro de una distancia de búsqueda.",
            "params": {
              "flow_accum": {
                "label": "Acumulación de flujo",
                "description": "Ráster de acumulación de flujo de entrada."
              },
              "pour_pts": {
                "label": "Puntos de vertido",
                "description": "Archivo vectorial de entrada con puntos de vertido (geometrías de punto o multipunto)."
              },
              "snap_dist": {
                "label": "Distancia de ajuste",
                "description": "Radio máximo de búsqueda en unidades del mapa. Por defecto un ancho de celda cuando se omite o es cero."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida del archivo vectorial de puntos de vertido ajustados (obligatorio; por defecto `snapped_pour_points.geojson` en el directorio de trabajo cuando no se proporciona al envoltorio)."
              }
            }
          },
          "subbasins": {
            "name": "Subcuencas",
            "description": "Identifica el área de captación de cada tramo de cauce (subcuencas) en una red de cauces D8.",
            "params": {
              "d8_pntr": {
                "label": "Puntero D8",
                "description": "Ráster de punteros D8 producido por `d8_pointer`."
              },
              "streams": {
                "label": "Cauces",
                "description": "Ráster de red de cauces donde las celdas de cauce tienen valor > 0 y no son NoData."
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Si es verdadero, interpreta los valores de puntero usando la codificación ESRI. Predeterminado `False`."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida. Si se omite, devuelve un ráster en memoria."
              }
            }
          },
          "unnest_basins": {
            "name": "Desanidar cuencas",
            "description": "Crea un ráster de cuencas por cada nivel de anidamiento de los puntos de vertido a partir de una malla de punteros D8.",
            "params": {
              "d8_pntr": {
                "label": "Puntero D8",
                "description": "Ráster de punteros D8 de entrada"
              },
              "pour_points": {
                "label": "Puntos de vertido",
                "description": "Vectorial de puntos de vertido de entrada"
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Interpretar los punteros al estilo ESRI"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta base de salida opcional para los rásteres numerados"
              }
            }
          },
          "watershed": {
            "name": "Cuenca hidrográfica",
            "description": "Delimita cuencas hidrográficas a partir de un puntero D8 y de puntos de vertido vectoriales.",
            "params": {
              "d8_pntr": {
                "label": "Puntero D8",
                "description": "Ráster de punteros D8 de entrada."
              },
              "pour_pts": {
                "label": "Puntos de vertido",
                "description": "Archivo vectorial de entrada con puntos de vertido (geometrías de punto o multipunto)."
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Si es verdadero, interpreta los valores de puntero usando la codificación D8 de ESRI."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, devuelve un ráster en memoria."
              }
            }
          },
          "watershed_from_raster_pour_points": {
            "name": "Cuenca desde puntos de vertido ráster",
            "description": "Delimita cuencas hidrográficas a partir de un puntero D8 y de un ráster de ID de salida de los puntos de vertido.",
            "params": {
              "d8_pntr": {
                "label": "Puntero D8",
                "description": "Ráster de punteros D8 de entrada."
              },
              "pour_points": {
                "label": "Puntos de vertido",
                "description": "Ráster de puntos de vertido; los valores de celda distintos de cero y no NoData se convierten en ID de salida."
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Si es verdadero, interpreta los valores de puntero usando la codificación D8 de ESRI."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, devuelve un ráster en memoria."
              }
            }
          },
          "depth_to_water": {
            "name": "Profundidad hasta el agua",
            "description": "Calcula la profundidad hasta el agua cartográfica mediante una acumulación de coste mínimo a partir de entidades de origen de cauces/lagos.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada."
              },
              "stream_raster": {
                "label": "Ráster de cauces",
                "description": "Ráster de cauces"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, devuelve un ráster en memoria."
              }
            }
          },
          "distance_to_outlet": {
            "name": "Distancia a la salida",
            "description": "Calcula la distancia aguas abajo hasta la salida para cada celda de cauce.",
            "params": {
              "d8_pntr": {
                "label": "Puntero D8",
                "description": "Ráster de punteros de flujo D8"
              },
              "streams": {
                "label": "Cauces",
                "description": "Cauces"
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Puntero ESRI"
              },
              "zero_background": {
                "label": "Fondo cero",
                "description": "Fondo cero"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "downslope_distance_to_stream": {
            "name": "Distancia aguas abajo hasta el cauce",
            "description": "Calcula la distancia aguas abajo desde cada celda del DEM hasta el cauce más cercano a lo largo de las trayectorias de flujo.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM sin depresiones de entrada."
              },
              "streams": {
                "label": "Cauces",
                "description": "Ráster de cauces de entrada; las celdas de cauce son valores `> 0` y no NoData."
              },
              "dinf": {
                "label": "D-infinito",
                "description": "Si es verdadero, usa enrutamiento D-infinito; en caso contrario, usa enrutamiento D8."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, devuelve un ráster en memoria."
              }
            }
          },
          "downslope_index": {
            "name": "Índice aguas abajo",
            "description": "Calcula el índice aguas abajo de Hjerdt et al. (2004) usando direcciones de flujo D8.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "output_type": {
                "label": "Tipo de salida",
                "description": "Métrica de salida: tangent, degrees, radians, distance (predeterminado tangent)."
              },
              "vertical_drop": {
                "label": "Caída vertical",
                "description": "Umbral de caída vertical d para el recorrido pendiente abajo."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional."
              }
            }
          },
          "edge_contamination": {
            "name": "Contaminación de bordes",
            "description": "Identifica las celdas del DEM cuya área aguas arriba se extiende más allá del borde del DEM para los esquemas habituales de enrutamiento de flujo.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM sin depresiones de entrada."
              },
              "flow_type": {
                "label": "Tipo de flujo",
                "description": "Método de enrutamiento a usar: uno de `\"d8\"`, `\"mfd\"`/`\"fd8\"` o `\"dinf\"`."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de escala vertical opcional. Los valores `<= 0` se tratan como `1.0`."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, devuelve un ráster en memoria."
              }
            }
          },
          "elev_relative_to_watershed_min_max": {
            "name": "Elevación relativa al mín-máx de la cuenca",
            "description": "Calcula la posición de elevación relativa de una celda del DEM dentro de cada cuenca hidrográfica como porcentaje.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "watersheds": {
                "label": "Cuencas",
                "description": "Ruta del ráster de ID de cuencas u objeto ráster tipado."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado permanece en memoria."
              }
            }
          },
          "elevation_above_stream": {
            "name": "Elevación sobre el cauce",
            "description": "Calcula la elevación sobre el cauce más cercano medida a lo largo de las trayectorias de flujo aguas abajo.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM sin depresiones de entrada."
              },
              "streams": {
                "label": "Cauces",
                "description": "Ráster de cauces de entrada; las celdas de cauce son valores `> 0` y no NoData."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, devuelve un ráster en memoria."
              }
            }
          },
          "elevation_above_stream_euclidean": {
            "name": "Elevación sobre el cauce (euclidiana)",
            "description": "Calcula la elevación sobre el cauce más cercano usando la proximidad en línea recta (euclidiana).",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada."
              },
              "streams": {
                "label": "Cauces",
                "description": "Ráster de cauces de entrada; las celdas de cauce son valores `> 0` y no NoData."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, devuelve un ráster en memoria."
              }
            }
          },
          "find_noflow_cells": {
            "name": "Encontrar celdas sin flujo",
            "description": "Encuentra las celdas del DEM que no tienen ningún vecino D8 más bajo.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada."
              },
              "interior_only": {
                "label": "Solo interior",
                "description": "Si es verdadero, solo marca las verdaderas celdas interiores sin flujo (excluyendo las salidas en el borde del ráster y adyacentes a NoData)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, devuelve un ráster en memoria."
              }
            }
          },
          "find_parallel_flow": {
            "name": "Encontrar flujo paralelo",
            "description": "Identifica las celdas de cauce que poseen direcciones de flujo D8 paralelas.",
            "params": {
              "d8_pntr": {
                "label": "Puntero D8",
                "description": "Ráster de punteros D8 de entrada."
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Puntero ESRI"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, devuelve un ráster en memoria."
              }
            }
          },
          "hydrologic_connectivity": {
            "name": "Conectividad hidrológica",
            "description": "Calcula los índices de conectividad DUL y UDSA a partir de un DEM.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada."
              },
              "convergence_threshold": {
                "label": "Umbral de convergencia",
                "description": "Umbral opcional de inicio de cauce en celdas contribuyentes."
              },
              "exponent": {
                "label": "Exponente",
                "description": "Parámetro de compatibilidad para el control de la dispersión."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de escala vertical opcional."
              },
              "output1": {
                "label": "Salida 1",
                "description": "Ruta de salida opcional para el ráster DUL."
              },
              "output2": {
                "label": "Salida 2",
                "description": "Ruta de salida opcional para el ráster UDSA."
              }
            }
          },
          "relative_stream_power_index": {
            "name": "Índice de potencia relativa del cauce",
            "description": "Calcula el índice de potencia relativa del cauce a partir del área de captación específica y la pendiente.",
            "params": {
              "sca": {
                "label": "SCA",
                "description": "Ruta del ráster de área de captación específica u objeto ráster tipado."
              },
              "slope": {
                "label": "Pendiente",
                "description": "Ráster de pendiente en grados."
              },
              "exponent": {
                "label": "Exponente",
                "description": "Exponente p del área de captación específica (predeterminado 1.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado permanece en memoria."
              }
            }
          },
          "sediment_transport_index": {
            "name": "Índice de transporte de sedimentos",
            "description": "Calcula el índice de transporte de sedimentos (factor LS) a partir del área de captación específica y la pendiente.",
            "params": {
              "sca": {
                "label": "SCA",
                "description": "Ruta del ráster de área de captación específica u objeto ráster tipado."
              },
              "slope": {
                "label": "Pendiente",
                "description": "Ráster de pendiente en grados."
              },
              "sca_exponent": {
                "label": "Exponente de SCA",
                "description": "Exponente n del área de captación específica (predeterminado 0.4)."
              },
              "slope_exponent": {
                "label": "Exponente de pendiente",
                "description": "Exponente m de la pendiente (predeterminado 1.3)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado permanece en memoria."
              }
            }
          },
          "wetness_index": {
            "name": "Índice de humedad",
            "description": "Calcula el índice topográfico de humedad ln(SCA / tan(pendiente)).",
            "params": {
              "sca": {
                "label": "SCA",
                "description": "Ruta del ráster de área de captación específica u objeto ráster tipado."
              },
              "slope": {
                "label": "Pendiente",
                "description": "Ráster de pendiente en grados."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "extract_streams": {
            "name": "Extraer cauces",
            "description": "Extrae los cauces en función de un umbral de acumulación de flujo.",
            "params": {
              "flow_accumulation": {
                "label": "Acumulación de flujo",
                "description": "Ráster de acumulación de flujo de entrada."
              },
              "threshold": {
                "label": "Umbral",
                "description": "Valor mínimo de acumulación requerido para formar parte de un canal de cauce."
              },
              "zero_background": {
                "label": "Fondo cero",
                "description": "Si es verdadero, el fondo fuera de los cauces es 0 en lugar de NoData."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de cauces de salida."
              }
            }
          },
          "extract_valleys": {
            "name": "Extraer valles",
            "description": "Extrae los valles de un DEM.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "DEM"
              },
              "filter_size": {
                "label": "Tamaño de filtro",
                "description": "Tamaño de filtro"
              },
              "line_thin": {
                "label": "Adelgazamiento de líneas",
                "description": "Adelgazamiento de líneas"
              },
              "variant": {
                "label": "Variante",
                "description": "Variante"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "prune_vector_streams": {
            "name": "Podar cauces vectoriales",
            "description": "Poda una red vectorial de cauces en función de la magnitud de Shreve.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada usado para determinar la dirección de flujo"
              },
              "streams": {
                "label": "Cauces",
                "description": "Red de cauces vectorial de entrada"
              },
              "max_ridge_cutting_height": {
                "label": "Altura máxima de corte de crestas",
                "description": "Ascenso máximo de elevación permitido al conectar enlaces aguas abajo"
              },
              "snap_distance": {
                "label": "Distancia de ajuste",
                "description": "Distancia máxima de ajuste para la conectividad de extremos"
              },
              "threshold": {
                "label": "Umbral",
                "description": "Magnitud de Shreve mínima a conservar"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida"
              }
            }
          },
          "raster_streams_to_vector": {
            "name": "Cauces ráster a vectorial",
            "description": "Convierte una red ráster de cauces en vectorial.",
            "params": {
              "d8_pntr": {
                "label": "Puntero D8",
                "description": "Ráster de punteros de flujo D8"
              },
              "streams_raster": {
                "label": "Ráster de cauces",
                "description": "Ráster de cauces"
              },
              "all_vertices": {
                "label": "Todos los vértices",
                "description": "Todos los vértices"
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Puntero ESRI"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "rasterize_streams": {
            "name": "Rasterizar cauces",
            "description": "Rasteriza una red vectorial de cauces.",
            "params": {
              "input_vector": {
                "label": "Vectorial de entrada",
                "description": "Vectorial de entrada"
              },
              "reference_raster": {
                "label": "Ráster de referencia",
                "description": "Ráster de referencia"
              },
              "use_feature_id": {
                "label": "Usar ID de entidad",
                "description": "Usar ID de entidad"
              },
              "zero_background": {
                "label": "Fondo cero",
                "description": "Fondo cero"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "remove_short_streams": {
            "name": "Eliminar cauces cortos",
            "description": "Elimina los tramos de cauce más cortos que una longitud mínima.",
            "params": {
              "d8_pntr": {
                "label": "Puntero D8",
                "description": "Ráster de punteros de flujo D8"
              },
              "streams": {
                "label": "Cauces",
                "description": "Cauces"
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Puntero ESRI"
              },
              "min_length": {
                "label": "Longitud mínima",
                "description": "Longitud mínima"
              },
              "zero_background": {
                "label": "Fondo cero",
                "description": "Fondo cero"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "repair_stream_vector_topology": {
            "name": "Reparar la topología vectorial de cauces",
            "description": "Repara la topología de una red vectorial de cauces.",
            "params": {
              "input_vector": {
                "label": "Vectorial de entrada",
                "description": "Vectorial de entrada"
              },
              "snap": {
                "label": "Ajustar",
                "description": "Ajustar"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "river_centerlines": {
            "name": "Ejes de río",
            "description": "Extrae los ejes de los ríos a partir de un ráster de agua mediante el eje medial.",
            "params": {
              "raster": {
                "label": "Ráster",
                "description": "Ráster binario de agua/no agua"
              },
              "min_length": {
                "label": "Longitud mínima",
                "description": "Longitud mínima de línea central en celdas ráster"
              },
              "search_radius": {
                "label": "Radio de búsqueda",
                "description": "Radio de búsqueda (celdas) usado para conectar extremos cercanos"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de líneas centrales de salida"
              }
            }
          },
          "farthest_channel_head": {
            "name": "Cabecera de canal más lejana",
            "description": "Calcula la distancia a la cabecera de canal más lejana.",
            "params": {
              "d8_pntr": {
                "label": "Puntero D8",
                "description": "Ráster de punteros de flujo D8"
              },
              "streams": {
                "label": "Cauces",
                "description": "Cauces"
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Puntero ESRI"
              },
              "zero_background": {
                "label": "Fondo cero",
                "description": "Fondo cero"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "find_main_stem": {
            "name": "Encontrar el cauce principal",
            "description": "Identifica el cauce principal de la red de cauces.",
            "params": {
              "d8_pntr": {
                "label": "Puntero D8",
                "description": "Ráster de punteros de flujo D8"
              },
              "streams": {
                "label": "Cauces",
                "description": "Cauces"
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Puntero ESRI"
              },
              "zero_background": {
                "label": "Fondo cero",
                "description": "Fondo cero"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "length_of_upstream_channels": {
            "name": "Longitud de los canales aguas arriba",
            "description": "Calcula la longitud total de canal aguas arriba.",
            "params": {
              "d8_pntr": {
                "label": "Puntero D8",
                "description": "Ráster de punteros de flujo D8"
              },
              "streams": {
                "label": "Cauces",
                "description": "Cauces"
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Puntero ESRI"
              },
              "zero_background": {
                "label": "Fondo cero",
                "description": "Fondo cero"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "long_profile": {
            "name": "Perfil longitudinal",
            "description": "Crea un perfil longitudinal del cauce.",
            "params": {
              "d8_pntr": {
                "label": "Puntero D8",
                "description": "Ráster de punteros de flujo D8"
              },
              "dem": {
                "label": "DEM",
                "description": "DEM"
              },
              "streams_raster": {
                "label": "Ráster de cauces",
                "description": "Ráster de cauces"
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Puntero ESRI"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "long_profile_from_points": {
            "name": "Perfil longitudinal desde puntos",
            "description": "Crea un perfil longitudinal a partir de puntos vectoriales.",
            "params": {
              "d8_pntr": {
                "label": "Puntero D8",
                "description": "Ráster de punteros de flujo D8"
              },
              "dem": {
                "label": "DEM",
                "description": "DEM"
              },
              "points": {
                "label": "Puntos",
                "description": "Puntos"
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Puntero ESRI"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "hack_stream_order": {
            "name": "Orden de cauces de Hack",
            "description": "Asigna el orden de cauces de Hack a las celdas de cauce.",
            "params": {
              "d8_pntr": {
                "label": "Puntero D8",
                "description": "Ráster de punteros de flujo D8"
              },
              "streams": {
                "label": "Cauces",
                "description": "Ráster de cauces"
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Usar punteros al estilo ESRI"
              },
              "zero_background": {
                "label": "Fondo cero",
                "description": "Asignar cero al fondo"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "horton_ratios": {
            "name": "Razones de Horton",
            "description": "Calcula las relaciones de Horton de bifurcación, longitud, área de drenaje y pendiente.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada."
              },
              "streams_raster": {
                "label": "Ráster de cauces",
                "description": "Ráster binario de cauces (positivo = cauce)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del informe de texto de salida (opcional)."
              }
            }
          },
          "horton_stream_order": {
            "name": "Orden de cauces de Horton",
            "description": "Asigna el orden de cauces de Horton a las celdas de cauce.",
            "params": {
              "d8_pntr": {
                "label": "Puntero D8",
                "description": "Ráster de punteros de flujo D8"
              },
              "streams": {
                "label": "Cauces",
                "description": "Ráster de cauces"
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Usar punteros al estilo ESRI"
              },
              "zero_background": {
                "label": "Fondo cero",
                "description": "Asignar cero al fondo"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "shreve_stream_magnitude": {
            "name": "Magnitud de cauces de Shreve",
            "description": "Calcula la magnitud de cauces de Shreve.",
            "params": {
              "d8_pntr": {
                "label": "Puntero D8",
                "description": "Ráster de punteros de flujo D8"
              },
              "streams": {
                "label": "Cauces",
                "description": "Ráster de cauces"
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Usar punteros al estilo ESRI"
              },
              "zero_background": {
                "label": "Fondo cero",
                "description": "Asignar cero al fondo"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "strahler_order_basins": {
            "name": "Cuencas por orden de Strahler",
            "description": "Delimita cuencas hidrográficas etiquetadas según el orden de Horton-Strahler del tramo de cauce que las drena.",
            "params": {
              "d8_pntr": {
                "label": "Puntero D8",
                "description": "Ráster de punteros D8."
              },
              "streams": {
                "label": "Cauces",
                "description": "Ráster de red de cauces donde las celdas de cauce tienen valor > 0 y no son NoData."
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Indicador de codificación de punteros ESRI."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "strahler_stream_order": {
            "name": "Orden de cauces de Strahler",
            "description": "Asigna el orden de cauces de Strahler a las celdas de cauce.",
            "params": {
              "d8_pntr": {
                "label": "Puntero D8",
                "description": "Ráster de punteros de flujo D8"
              },
              "streams": {
                "label": "Cauces",
                "description": "Ráster de cauces (valores positivos = celdas de cauce)"
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Usar valores de puntero al estilo ESRI (predeterminado: Whitebox)"
              },
              "zero_background": {
                "label": "Fondo cero",
                "description": "Asignar cero al fondo en lugar de NoData"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "stream_link_class": {
            "name": "Clase de tramo de cauce",
            "description": "Clasifica los tramos de cauce como interiores, exteriores o de cabecera.",
            "params": {
              "d8_pntr": {
                "label": "Puntero D8",
                "description": "Ráster de punteros de flujo D8"
              },
              "streams": {
                "label": "Cauces",
                "description": "Cauces"
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Puntero ESRI"
              },
              "zero_background": {
                "label": "Fondo cero",
                "description": "Fondo cero"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "stream_link_identifier": {
            "name": "Identificador de tramo de cauce",
            "description": "Asigna un ID único a cada tramo de cauce.",
            "params": {
              "d8_pntr": {
                "label": "Puntero D8",
                "description": "Ráster de punteros de flujo D8"
              },
              "streams": {
                "label": "Cauces",
                "description": "Cauces"
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Puntero ESRI"
              },
              "zero_background": {
                "label": "Fondo cero",
                "description": "Fondo cero"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "stream_link_length": {
            "name": "Longitud de tramo de cauce",
            "description": "Calcula la longitud total de cada tramo de cauce.",
            "params": {
              "d8_pntr": {
                "label": "Puntero D8",
                "description": "Ráster de punteros de flujo D8"
              },
              "linkid": {
                "label": "ID de enlace",
                "description": "ID de enlace"
              },
              "streams": {
                "label": "Cauces",
                "description": "Cauces"
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Puntero ESRI"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "stream_link_slope": {
            "name": "Pendiente de tramo de cauce",
            "description": "Calcula la pendiente media de cada tramo de cauce.",
            "params": {
              "d8_pntr": {
                "label": "Puntero D8",
                "description": "Ráster de punteros de flujo D8"
              },
              "dem": {
                "label": "DEM",
                "description": "DEM"
              },
              "linkid": {
                "label": "ID de enlace",
                "description": "ID de enlace"
              },
              "streams": {
                "label": "Cauces",
                "description": "Cauces"
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Puntero ESRI"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "stream_slope_continuous": {
            "name": "Pendiente continua del cauce",
            "description": "Calcula el valor de la pendiente para cada celda de cauce.",
            "params": {
              "d8_pntr": {
                "label": "Puntero D8",
                "description": "Ráster de punteros de flujo D8"
              },
              "dem": {
                "label": "DEM",
                "description": "DEM"
              },
              "streams": {
                "label": "Cauces",
                "description": "Cauces"
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Puntero ESRI"
              },
              "zero_background": {
                "label": "Fondo cero",
                "description": "Fondo cero"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "topological_stream_order": {
            "name": "Orden topológico de cauces",
            "description": "Asigna un orden topológico de cauces en función del número de tramos.",
            "params": {
              "d8_pntr": {
                "label": "Puntero D8",
                "description": "Ráster de punteros de flujo D8"
              },
              "streams": {
                "label": "Cauces",
                "description": "Cauces"
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Puntero ESRI"
              },
              "zero_background": {
                "label": "Fondo cero",
                "description": "Fondo cero"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "tributary_identifier": {
            "name": "Identificador de afluentes",
            "description": "Asigna un ID único a cada afluente.",
            "params": {
              "d8_pntr": {
                "label": "Puntero D8",
                "description": "Ráster de punteros de flujo D8"
              },
              "streams": {
                "label": "Cauces",
                "description": "Cauces"
              },
              "esri_pntr": {
                "label": "Puntero ESRI",
                "description": "Puntero ESRI"
              },
              "zero_background": {
                "label": "Fondo cero",
                "description": "Fondo cero"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "vector_stream_network_analysis": {
            "name": "Análisis de red vectorial de cauces",
            "description": "Análisis completo de redes vectoriales de cauces.",
            "params": {
              "streams": {
                "label": "Cauces",
                "description": "Capa vectorial de red de cauces de entrada."
              },
              "dem": {
                "label": "DEM",
                "description": "Ráster de elevación (DEM) de entrada."
              },
              "max_ridge_cutting_height": {
                "label": "Altura máxima de corte de crestas",
                "description": "Altura máxima permitida de corte de crestas."
              },
              "snap_distance": {
                "label": "Distancia de ajuste",
                "description": "Tolerancia de distancia de ajuste para la limpieza de la red."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida."
              }
            }
          },
          "add_point_coordinates_to_table": {
            "name": "Añadir coordenadas de puntos a la tabla",
            "description": "Copia una capa de puntos y añade los campos de atributo XCOORD e YCOORD.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del vectorial de puntos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida. Si se omite, se deriva una ruta GeoJSON junto a la entrada."
              }
            }
          },
          "clean_vector": {
            "name": "Limpiar vectorial",
            "description": "Elimina las geometrías vectoriales nulas y no válidas (p. ej., líneas/polígonos de tamaño insuficiente) conservando las entidades válidas y sus atributos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del vectorial de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida. Si se omite, se deriva una ruta GeoJSON junto a la entrada."
              }
            }
          },
          "csv_points_to_vector": {
            "name": "Puntos CSV a vectorial",
            "description": "Importa registros de puntos de un archivo CSV a una capa vectorial de puntos.",
            "params": {
              "input_file": {
                "label": "Archivo de entrada",
                "description": "Ruta del archivo CSV de entrada."
              },
              "x_field_num": {
                "label": "Número de campo X",
                "description": "Índice (base 0) del campo de coordenada X. Por defecto 0."
              },
              "y_field_num": {
                "label": "Número de campo Y",
                "description": "Índice (base 0) del campo de coordenada Y. Por defecto 1."
              },
              "epsg": {
                "label": "EPSG",
                "description": "Código EPSG opcional para el CRS de salida."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "export_table_to_csv": {
            "name": "Exportar tabla a CSV",
            "description": "Exporta una tabla de atributos vectorial a un archivo CSV.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del vectorial de entrada."
              },
              "output_csv_file": {
                "label": "Archivo CSV de salida",
                "description": "Ruta del archivo CSV de salida."
              },
              "headers": {
                "label": "Encabezados",
                "description": "Incluir fila de encabezado en la salida. Por defecto true."
              }
            }
          },
          "join_tables": {
            "name": "Unir tablas",
            "description": "Une atributos de una tabla vectorial externa a una tabla vectorial principal mediante campos clave.",
            "params": {
              "primary_vector": {
                "label": "Vectorial primario",
                "description": "Ruta del vectorial primario que recibe los campos unidos."
              },
              "primary_key_field": {
                "label": "Campo de clave primaria",
                "description": "Campo de clave primaria en el vectorial primario."
              },
              "foreign_vector": {
                "label": "Vectorial foráneo",
                "description": "Ruta del vectorial foráneo que contiene los campos de origen."
              },
              "foreign_key_field": {
                "label": "Campo de clave foránea",
                "description": "Campo de clave foránea en el vectorial foráneo."
              },
              "import_field": {
                "label": "Campo a importar",
                "description": "Campo único opcional a importar; por defecto todos los campos que no son clave ni FID."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida. Por defecto una ruta GeoJSON derivada junto a la entrada primaria."
              }
            }
          },
          "merge_table_with_csv": {
            "name": "Combinar tabla con CSV",
            "description": "Combina atributos de una tabla CSV en una tabla de atributos vectorial mediante campos clave.",
            "params": {
              "primary_vector": {
                "label": "Vectorial primario",
                "description": "Ruta del vectorial primario que recibe los campos fusionados."
              },
              "primary_key_field": {
                "label": "Campo de clave primaria",
                "description": "Campo de clave primaria en el vectorial primario."
              },
              "foreign_csv_filename": {
                "label": "Nombre del archivo CSV foráneo",
                "description": "Archivo CSV que contiene la tabla foránea."
              },
              "foreign_key_field": {
                "label": "Campo de clave foránea",
                "description": "Nombre del campo de clave foránea en el encabezado del CSV."
              },
              "import_field": {
                "label": "Campo a importar",
                "description": "Campo único opcional del CSV a importar; por defecto todos los campos que no son clave."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida. Por defecto una ruta GeoJSON derivada junto a la entrada primaria."
              }
            }
          },
          "merge_vectors": {
            "name": "Combinar vectoriales",
            "description": "Combina dos o más vectoriales de entrada del mismo tipo de geometría en un único vectorial de salida.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Matriz de rutas de vectoriales de entrada (se requieren al menos dos)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "reinitialize_attribute_table": {
            "name": "Reinicializar tabla de atributos",
            "description": "Crea una copia de una capa vectorial con solo un atributo FID regenerado.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del vectorial de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida. Si se omite, sobrescribe la ruta de entrada."
              }
            }
          },
          "vector_summary_statistics": {
            "name": "Estadísticas resumen vectoriales",
            "description": "Calcula el recuento, la suma, la media, el mínimo, el máximo y la desviación estándar por grupo categórico y los exporta a CSV.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "group_field": {
                "label": "Campo de agrupación",
                "description": "Nombre del campo de agrupación."
              },
              "value_field": {
                "label": "Campo de valor",
                "description": "Nombre del campo de valor numérico."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del CSV de salida."
              }
            }
          },
          "fix_dangling_arcs": {
            "name": "Corregir arcos colgantes",
            "description": "Corrige los arcos colgantes que no llegan o que sobrepasan en una red de líneas ajustando los extremos de las líneas dentro de una distancia umbral.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del vectorial de polilíneas de entrada."
              },
              "snap": {
                "label": "Ajustar",
                "description": "Umbral de distancia de ajuste en unidades del mapa."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida. Si se omite, se deriva una ruta GeoJSON junto a la entrada."
              }
            }
          },
          "lines_to_polygons": {
            "name": "Líneas a polígonos",
            "description": "Convierte entidades de polilínea en entidades poligonales, tratando la primera parte como el anillo exterior y las partes posteriores como huecos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del vectorial de polilíneas de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de polígonos de salida. Si se omite, se deriva una ruta GeoJSON junto a la entrada."
              }
            }
          },
          "multipart_to_singlepart": {
            "name": "Multiparte a parte simple",
            "description": "Convierte un vectorial que contiene entidades multiparte en uno con solo entidades de una sola parte.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del vectorial de entrada (polilínea, polígono o multipunto)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida. Por defecto un GeoJSON con marca de tiempo junto a la entrada."
              },
              "exclude_holes": {
                "label": "Excluir huecos",
                "description": "Cuando es verdadero, los huecos de los polígonos permanecen unidos a su anillo exterior envolvente (predeterminado: false)."
              }
            }
          },
          "polygons_to_lines": {
            "name": "Polígonos a líneas",
            "description": "Convierte entidades poligonales y multipoligonales en líneas que trazan sus límites.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del vectorial de polígonos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de líneas de salida. Si se omite, se deriva una ruta GeoJSON junto a la entrada."
              }
            }
          },
          "remove_polygon_holes": {
            "name": "Eliminar huecos de polígonos",
            "description": "Elimina los anillos interiores de las entidades poligonales conservando los atributos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del vectorial de polígonos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de polígonos de salida. Si se omite, se deriva una ruta GeoJSON junto a la entrada."
              }
            }
          },
          "singlepart_to_multipart": {
            "name": "Parte simple a multiparte",
            "description": "Combina entidades de una sola parte en entidades multiparte, agrupadas por un campo categórico opcional.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del vectorial de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida. Por defecto un GeoJSON con marca de tiempo junto a la entrada."
              },
              "field": {
                "label": "Campo",
                "description": "Nombre de campo de atributo opcional por el que agrupar las entidades. Cuando se omite, todas las entidades se fusionan en una geometría."
              }
            }
          },
          "topology_rule_autofix": {
            "name": "Corrección automática de reglas topológicas",
            "description": "Aplica automáticamente correcciones seguras y auditables a las infracciones de topología detectadas por topology_rule_validate: ajuste de extremos entre entidades, ajuste/proyección de extremos colgantes y proyección de puntos sobre líneas. polygon_must_not_have_gaps no tiene corrección automática y se notifica con cero cambios.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del vectorial de entrada."
              },
              "rule_set": {
                "label": "Conjunto de reglas",
                "description": "Configuración de reglas como matriz/objeto JSON, cadena CSV o ruta de archivo. Reglas con correcciones automáticas: line_endpoints_must_snap_within_tolerance, line_must_not_have_dangles, point_must_be_covered_by_line. polygon_must_not_have_gaps se acepta pero nunca produce cambios."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tolerancia para las operaciones de ajuste en unidades de coordenadas. Por defecto 0.01."
              },
              "dry_run": {
                "label": "Simulación",
                "description": "Si es verdadero (EL VALOR PREDETERMINADO), solo previsualiza: se emite el informe de cambios pero no se escribe ninguna salida. Pase false para aplicar las correcciones."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida para las entidades corregidas. Si se omite, se deriva junto a la entrada."
              },
              "change_report": {
                "label": "Informe de cambios",
                "description": "Ruta opcional del informe JSON de auditoría de cambios."
              }
            }
          },
          "topology_rule_validate": {
            "name": "Validar reglas topológicas",
            "description": "Valida la topología vectorial frente a comprobaciones de un conjunto de reglas (autointersección, solape, huecos, extremos colgantes, cobertura de puntos, ajuste de extremos) y emite las infracciones a nivel de entidad.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del vectorial de entrada."
              },
              "rule_set": {
                "label": "Conjunto de reglas",
                "description": "Configuración de reglas como matriz/objeto JSON, cadena CSV o ruta de archivo. Por defecto las 6 reglas MVP. Admitidas: 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": "Tolerancia de ajuste",
                "description": "Tolerancia para la regla line_endpoints_must_snap_within_tolerance en unidades de coordenadas. Por defecto 1.0."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida para las violaciones. Si se omite, se deriva junto a la entrada."
              },
              "report": {
                "label": "Informe",
                "description": "Ruta opcional del informe JSON de resumen."
              }
            }
          },
          "topology_validation_report": {
            "name": "Informe de validación topológica",
            "description": "Audita una capa vectorial en busca de problemas de topología y escribe un informe CSV por entidad.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del vectorial de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del CSV de salida."
              }
            }
          },
          "convert_nodata_to_zero": {
            "name": "Convertir NoData a cero",
            "description": "Sustituye las celdas NoData del ráster por 0 y deja sin cambios las celdas válidas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida. Si se omite, devuelve un ráster en memoria."
              }
            }
          },
          "modify_nodata_value": {
            "name": "Modificar el valor NoData",
            "description": "Cambia el valor NoData del ráster y reescribe las celdas NoData existentes con el nuevo valor.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada."
              },
              "new_value": {
                "label": "Valor nuevo",
                "description": "Nuevo valor sin datos. Por defecto -32768.0."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida. Si se omite, devuelve un ráster en memoria."
              }
            }
          },
          "new_raster_from_base_raster": {
            "name": "Nuevo ráster a partir de ráster base",
            "description": "Crea un nuevo ráster usando la extensión, las dimensiones y el CRS de un ráster base.",
            "params": {
              "base": {
                "label": "Base",
                "description": "Ruta del ráster base."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida. Si se omite, devuelve un ráster en memoria."
              },
              "out_val": {
                "label": "Valor de salida",
                "description": "Valor de relleno opcional. Por defecto el valor sin datos del ráster."
              },
              "data_type": {
                "label": "Tipo de datos",
                "description": "Tipo de datos opcional: 'float', 'double' o 'integer'."
              }
            }
          },
          "new_raster_from_base_vector": {
            "name": "Nuevo ráster a partir de vectorial base",
            "description": "Crea un nuevo ráster a partir de la extensión de un vectorial base y un tamaño de celda, relleno con un valor opcional.",
            "params": {
              "base": {
                "label": "Base",
                "description": "Ruta del vectorial base."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de la malla de salida (> 0)."
              },
              "out_val": {
                "label": "Valor de salida",
                "description": "Valor de relleno opcional. Por defecto sin datos (-32768)."
              },
              "data_type": {
                "label": "Tipo de datos",
                "description": "Palabra clave opcional del tipo de datos de salida: integer, float o double."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "raster_to_vector_lines": {
            "name": "Ráster a líneas vectoriales",
            "description": "Convierte las celdas de línea ráster distintas de cero y de NoData en entidades vectoriales de polilínea.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada (monobanda)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida. Si se omite, se deriva una ruta GeoJSON junto a la entrada."
              }
            }
          },
          "raster_to_vector_points": {
            "name": "Ráster a puntos vectoriales",
            "description": "Convierte las celdas de un ráster distintas de cero y de NoData en entidades de puntos situadas en los centros de las celdas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de puntos de salida. Si se omite, se deriva una ruta GeoJSON junto a la entrada."
              }
            }
          },
          "raster_to_vector_polygons": {
            "name": "Ráster a polígonos vectoriales",
            "description": "Convierte las regiones ráster distintas de cero y de NoData en entidades vectoriales poligonales con los atributos FID y VALUE.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada (monobanda)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida. Si se omite, se deriva una ruta GeoJSON junto a la entrada."
              }
            }
          },
          "remove_raster_polygon_holes": {
            "name": "Eliminar huecos de polígonos ráster",
            "description": "Elimina los huecos de fondo interiores (regiones de 0 o NoData rodeadas por el primer plano) de los polígonos ráster.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada (monobanda)."
              },
              "threshold": {
                "label": "Umbral",
                "description": "Tamaño máximo opcional de hueco en celdas a eliminar. 0 significa todos los huecos cerrados."
              },
              "use_diagonals": {
                "label": "Usar diagonales",
                "description": "Usar conectividad de 8 vecinos para la agrupación y la conectividad de bordes."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "set_nodata_value": {
            "name": "Establecer el valor NoData",
            "description": "Establece un valor NoData del ráster y asigna a las celdas NoData existentes el valor de fondo especificado.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada."
              },
              "back_value": {
                "label": "Valor de fondo",
                "description": "Valor de fondo a asignar como sin datos. Por defecto 0.0."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida. Si se omite, devuelve un ráster en memoria."
              }
            }
          },
          "vector_lines_to_raster": {
            "name": "Líneas vectoriales a ráster",
            "description": "Rasteriza geometrías de líneas y de límites de polígonos en una malla ráster.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del vectorial de entrada (líneas o polígonos)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida. Si se omite, la salida permanece en memoria."
              },
              "field": {
                "label": "Campo",
                "description": "Nombre de campo numérico opcional a grabar. Por defecto FID."
              },
              "zero_background": {
                "label": "Fondo cero",
                "description": "Cuando es verdadero, inicializa el fondo de la salida a 0 en lugar de sin datos."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida cuando no se proporciona 'base'. Si se omite y no se da base, el tamaño de celda automático es extensión máxima / 500."
              },
              "base": {
                "label": "Base",
                "description": "Ruta opcional del ráster base que define la malla y la extensión de salida."
              }
            }
          },
          "vector_points_to_raster": {
            "name": "Puntos vectoriales a ráster",
            "description": "Rasteriza vectoriales de puntos o multipuntos en una malla usando una operación de asignación seleccionada.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del vectorial de entrada (punto/multipunto)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida. Si se omite, el resultado está en memoria."
              },
              "field": {
                "label": "Campo",
                "description": "Campo numérico opcional usado para los valores del ráster. Por defecto FID."
              },
              "assign": {
                "label": "Asignar",
                "description": "Operación de asignación: last, first, min, max, sum, num, mean."
              },
              "zero_background": {
                "label": "Fondo cero",
                "description": "Cuando es verdadero, inicializa el fondo a 0; en caso contrario sin datos."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida. Obligatorio cuando no se proporciona 'base'."
              },
              "base": {
                "label": "Base",
                "description": "Ruta opcional del ráster base para definir la extensión/malla."
              }
            }
          },
          "vector_polygons_to_raster": {
            "name": "Polígonos vectoriales a ráster",
            "description": "Rasteriza vectoriales de polígonos en una malla, con soporte para valores de grabado basados en atributos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del vectorial de polígonos de entrada."
              },
              "field": {
                "label": "Campo",
                "description": "Nombre de campo numérico opcional para los valores de grabado (por defecto FID)."
              },
              "zero_background": {
                "label": "Fondo cero",
                "description": "Cuando es verdadero, inicializa el fondo de la salida a 0 en lugar de sin datos."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida cuando no se proporciona 'base'."
              },
              "base": {
                "label": "Base",
                "description": "Ruta opcional del ráster base que define la malla y la extensión de salida."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida. Si se omite, la salida permanece en memoria."
              }
            }
          },
          "local_morans_i_lisa_raster": {
            "name": "I de Moran local (LISA) ráster",
            "description": "Calcula un análisis de clústeres LISA a partir de puntos y genera un ráster categórico (HH/LL/HL/LH/NS). Permite la integración basada en ráster.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada con puntos de observación."
              },
              "field": {
                "label": "Campo",
                "description": "Campo de atributo numérico a analizar."
              },
              "weights_mode": {
                "label": "Modo de pesos",
                "description": "Modo de vecindad: queen, rook, k_nearest, distance_band."
              },
              "k": {
                "label": "K",
                "description": "Valor de k para el modo k_nearest (predeterminado 8)."
              },
              "distance": {
                "label": "Distancia",
                "description": "Umbral de distancia para el modo distance_band."
              },
              "row_standardize": {
                "label": "Estandarizar por filas",
                "description": "Aplicar estandarización por filas a los pesos (predeterminado true)."
              },
              "island_policy": {
                "label": "Política de islas",
                "description": "Tratamiento de islas: drop_with_warning, keep_zero_weight, error."
              },
              "alpha": {
                "label": "Alfa",
                "description": "Umbral de significancia en [0, 1]; predeterminado 0.05."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda del ráster de salida (opcional; se calcula automáticamente a partir de la extensión)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida (clasificación: 0=NS, 1=HH, 2=LL, 3=HL, 4=LH)."
              }
            }
          },
          "getis_ord_gi_star_raster": {
            "name": "Gi* de Getis-Ord ráster",
            "description": "Calcula clasificaciones de puntos calientes/fríos Gi* a partir de puntos y genera un ráster (-1=frío, 0=NS, 1=caliente). Para el análisis basado en puntos calientes.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada con puntos de observación."
              },
              "field": {
                "label": "Campo",
                "description": "Campo de atributo numérico a analizar."
              },
              "weights_mode": {
                "label": "Modo de pesos",
                "description": "Modo de vecindad: queen, rook, k_nearest, distance_band."
              },
              "k": {
                "label": "K",
                "description": "Valor de k para el modo k_nearest (predeterminado 8)."
              },
              "distance": {
                "label": "Distancia",
                "description": "Umbral de distancia para el modo distance_band."
              },
              "row_standardize": {
                "label": "Estandarizar por filas",
                "description": "Aplicar estandarización por filas a los pesos (predeterminado true)."
              },
              "island_policy": {
                "label": "Política de islas",
                "description": "Tratamiento de islas: drop_with_warning, keep_zero_weight, error."
              },
              "alpha": {
                "label": "Alfa",
                "description": "Umbral de significancia en [0, 1]; predeterminado 0.05."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda del ráster de salida (opcional; se calcula automáticamente a partir de la extensión)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida (clasificación: -1=Frío, 0=NS, 1=Caliente)."
              }
            }
          },
          "ordinary_kriging": {
            "name": "Kriging ordinario",
            "description": "Realiza una interpolación por kriging ordinario para estimar valores en celdas de la malla sin datos a partir de una muestra de mediciones puntuales. El kriging ordinario es un método geoestadístico que aprovecha la estructura de autocorrelación espacial para proporcionar tanto predicciones como la varianza de kriging asociada (incertidumbre de la predicción). La herramienta estima automáticamente un variograma empírico a partir de los datos de puntos de entrada y ajusta un modelo de variograma teórico (esférico, exponencial o gaussiano) para captar la dependencia espacial.",
            "params": {
              "points": {
                "label": "Puntos",
                "description": "Capa vectorial de puntos de entrada."
              },
              "value_field": {
                "label": "Campo de valor",
                "description": "Campo de atributo numérico que contiene los valores a interpolar."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida en unidades del mapa (obligatorio si no hay base_raster)."
              },
              "base_raster": {
                "label": "Ráster base",
                "description": "Ráster base opcional que controla la geometría de salida."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "local_kriging": {
            "name": "Kriging local",
            "description": "Realiza una interpolación por kriging ordinario local usando los k vecinos más cercanos, lo que proporciona una estimación espacial eficiente para grandes conjuntos de datos. Este enfoque es computacionalmente más práctico que el kriging ordinario global para conjuntos de datos con miles de puntos.",
            "params": {
              "points": {
                "label": "Puntos",
                "description": "Capa vectorial de puntos de entrada."
              },
              "value_field": {
                "label": "Campo de valor",
                "description": "Campo de atributo numérico que contiene los valores a interpolar."
              },
              "k_neighbors": {
                "label": "K vecinos",
                "description": "Número de vecinos más cercanos a usar; por defecto 10."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida en unidades del mapa (obligatorio si no hay base_raster)."
              },
              "base_raster": {
                "label": "Ráster base",
                "description": "Ráster base opcional que controla la geometría de salida."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "simple_kriging": {
            "name": "Kriging simple",
            "description": "Realiza una interpolación por kriging simple cuando la media del campo espacial se conoce a priori. Este método reduce la varianza de kriging y proporciona predicciones más estables cuando la media se conoce de forma fiable a partir de información externa.",
            "params": {
              "points": {
                "label": "Puntos",
                "description": "Capa vectorial de puntos de entrada."
              },
              "value_field": {
                "label": "Campo de valor",
                "description": "Campo de atributo numérico que contiene los valores a interpolar."
              },
              "known_mean": {
                "label": "Media conocida",
                "description": "Media conocida del campo espacial."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida en unidades del mapa (obligatorio si no hay base_raster)."
              },
              "base_raster": {
                "label": "Ráster base",
                "description": "Ráster base opcional que controla la geometría de salida."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "universal_kriging": {
            "name": "Kriging universal",
            "description": "Realiza una interpolación por kriging universal cuando el fenómeno espacial presenta una tendencia o deriva sistemática. Combina el kriging con la estimación de una superficie de tendencia polinómica.",
            "params": {
              "points": {
                "label": "Puntos",
                "description": "Capa vectorial de puntos de entrada."
              },
              "value_field": {
                "label": "Campo de valor",
                "description": "Campo de atributo numérico que contiene los valores a interpolar."
              },
              "trend_order": {
                "label": "Orden de tendencia",
                "description": "Orden de la tendencia polinómica (1=lineal, 2=cuadrática); por defecto 1."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida en unidades del mapa (obligatorio si no hay base_raster)."
              },
              "base_raster": {
                "label": "Ráster base",
                "description": "Ráster base opcional que controla la geometría de salida."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "spacetime_kriging": {
            "name": "Kriging espacio-temporal",
            "description": "Realiza una interpolación por kriging espacio-temporal para modelizar conjuntamente la variación espacial y temporal de las mediciones puntuales. Ideal para datos de series temporales distribuidos espacialmente.",
            "params": {
              "points": {
                "label": "Puntos",
                "description": "Capa vectorial de puntos de entrada."
              },
              "value_field": {
                "label": "Campo de valor",
                "description": "Campo de atributo numérico que contiene los valores a interpolar."
              },
              "time_field": {
                "label": "Campo de tiempo",
                "description": "Campo de atributo temporal que contiene los valores de tiempo."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida en unidades del mapa (obligatorio si no hay base_raster)."
              },
              "base_raster": {
                "label": "Ráster base",
                "description": "Ráster base opcional que controla la geometría de salida."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "spatial_lag_regression_raster": {
            "name": "Regresión con retardo espacial (ráster)",
            "description": "Estima un modelo SAR y genera una superficie de valores ajustados.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "response_field": {
                "label": "Campo de respuesta",
                "description": "Variable de respuesta."
              },
              "predictor_fields": {
                "label": "Campos predictores",
                "description": "Campos predictores."
              },
              "weights_mode": {
                "label": "Modo de pesos",
                "description": "Modo de vecindad."
              },
              "k": {
                "label": "K",
                "description": "k para k_nearest."
              },
              "distance": {
                "label": "Distancia",
                "description": "Umbral de distancia."
              },
              "row_standardize": {
                "label": "Estandarizar por filas",
                "description": "Estandarizar los pesos por filas."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda del ráster de salida."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de salida."
              }
            }
          },
          "spatial_error_regression_raster": {
            "name": "Regresión con error espacial (ráster)",
            "description": "Estima un modelo SEM y genera una superficie de valores ajustados.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "response_field": {
                "label": "Campo de respuesta",
                "description": "Variable de respuesta."
              },
              "predictor_fields": {
                "label": "Campos predictores",
                "description": "Campos predictores."
              },
              "weights_mode": {
                "label": "Modo de pesos",
                "description": "Modo de vecindad."
              },
              "k": {
                "label": "K",
                "description": "k para k_nearest."
              },
              "distance": {
                "label": "Distancia",
                "description": "Umbral de distancia."
              },
              "row_standardize": {
                "label": "Estandarizar por filas",
                "description": "Estandarizar los pesos por filas."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda del ráster de salida."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de salida."
              }
            }
          },
          "geographically_weighted_regression_raster": {
            "name": "Regresión ponderada geográficamente (ráster)",
            "description": "Estima una GWR y genera superficies ráster de coeficientes locales.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "response_field": {
                "label": "Campo de respuesta",
                "description": "Variable de respuesta."
              },
              "predictor_fields": {
                "label": "Campos predictores",
                "description": "Campos predictores."
              },
              "bandwidth": {
                "label": "Ancho de banda",
                "description": "Ancho de banda del kernel."
              },
              "kernel": {
                "label": "Kernel",
                "description": "Tipo de kernel."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda del ráster de salida."
              },
              "output_prefix": {
                "label": "Prefijo de salida",
                "description": "Prefijo del ráster de salida."
              }
            }
          },
          "inhomogeneous_intensity_raster": {
            "name": "Intensidad no homogénea (ráster)",
            "description": "Calcula una superficie de estimación de densidad kernel (KDE) que visualiza la intensidad espacial de los puntos. Revela puntos calientes y fríos más allá de la simple densidad.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos de entrada."
              },
              "bandwidth": {
                "label": "Ancho de banda",
                "description": "Ancho de banda del kernel."
              },
              "kernel": {
                "label": "Kernel",
                "description": "Tipo de kernel."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda del ráster de salida."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de intensidad de salida."
              }
            }
          },
          "add": {
            "name": "Sumar",
            "description": "Suma dos rásteres celda a celda.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Primer ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Segundo ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, la salida permanece en memoria y se devuelve como identificador de ráster memory://."
              }
            }
          },
          "average_overlay": {
            "name": "Superposición por media",
            "description": "Calcula el promedio por celda de una pila ráster, ignorando NoData salvo que todas las entradas sean NoData.",
            "params": {
              "input_rasters": {
                "label": "Rásteres de entrada",
                "description": "Pila de rásteres de entrada como matriz de rutas o cadena delimitada por punto y coma/comas."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado permanece en memoria."
              }
            }
          },
          "bool_and": {
            "name": "Y lógico",
            "description": "Calcula un AND lógico de dos rásteres celda a celda.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Primer ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Segundo ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, la salida permanece en memoria y se devuelve como identificador de ráster memory://."
              }
            }
          },
          "bool_not": {
            "name": "No lógico",
            "description": "Calcula un NOT lógico de cada celda ráster, generando 1 para las celdas de valor cero y 0 en caso contrario.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "bool_or": {
            "name": "O lógico",
            "description": "Calcula un OR lógico de dos rásteres celda a celda.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Primer ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Segundo ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, la salida permanece en memoria y se devuelve como identificador de ráster memory://."
              }
            }
          },
          "bool_xor": {
            "name": "O exclusivo lógico",
            "description": "Calcula un XOR lógico de dos rásteres celda a celda.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Primer ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Segundo ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, la salida permanece en memoria y se devuelve como identificador de ráster memory://."
              }
            }
          },
          "count_if": {
            "name": "Contar si",
            "description": "Cuenta el número de rásteres de entrada cuya celda es igual a un valor de comparación.",
            "params": {
              "input_rasters": {
                "label": "Rásteres de entrada",
                "description": "Pila de rásteres de entrada como matriz de rutas o cadena delimitada por punto y coma/comas."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "comparison_value": {
                "label": "Valor de comparación",
                "description": "Valor de comparación a contar dentro de la pila de rásteres."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado permanece en memoria."
              }
            }
          },
          "divide": {
            "name": "Dividir",
            "description": "Divide el primer ráster por el segundo celda a celda.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Primer ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Segundo ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, la salida permanece en memoria y se devuelve como identificador de ráster memory://."
              }
            }
          },
          "highest_position": {
            "name": "Posición más alta",
            "description": "Devuelve el índice (basado en cero) de la pila ráster que contiene el valor más alto en cada celda.",
            "params": {
              "input_rasters": {
                "label": "Rásteres de entrada",
                "description": "Pila de rásteres de entrada como matriz de rutas o cadena delimitada por punto y coma/comas."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado permanece en memoria."
              }
            }
          },
          "lowest_position": {
            "name": "Posición más baja",
            "description": "Devuelve el índice (basado en cero) de la pila ráster que contiene el valor más bajo en cada celda.",
            "params": {
              "input_rasters": {
                "label": "Rásteres de entrada",
                "description": "Pila de rásteres de entrada como matriz de rutas o cadena delimitada por punto y coma/comas."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado permanece en memoria."
              }
            }
          },
          "max_absolute_overlay": {
            "name": "Superposición por máximo absoluto",
            "description": "Calcula el valor absoluto máximo por celda de una pila ráster, propagando NoData si alguna celda de entrada es NoData.",
            "params": {
              "input_rasters": {
                "label": "Rásteres de entrada",
                "description": "Pila de rásteres de entrada como matriz de rutas o cadena delimitada por punto y coma/comas."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado permanece en memoria."
              }
            }
          },
          "max_overlay": {
            "name": "Superposición por máximo",
            "description": "Calcula el máximo por celda de una pila ráster, propagando NoData si alguna celda de entrada es NoData.",
            "params": {
              "input_rasters": {
                "label": "Rásteres de entrada",
                "description": "Pila de rásteres de entrada como matriz de rutas o cadena delimitada por punto y coma/comas."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado permanece en memoria."
              }
            }
          },
          "min_absolute_overlay": {
            "name": "Superposición por mínimo absoluto",
            "description": "Calcula el valor absoluto mínimo por celda de una pila ráster, propagando NoData si alguna celda de entrada es NoData.",
            "params": {
              "input_rasters": {
                "label": "Rásteres de entrada",
                "description": "Pila de rásteres de entrada como matriz de rutas o cadena delimitada por punto y coma/comas."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado permanece en memoria."
              }
            }
          },
          "min_overlay": {
            "name": "Superposición por mínimo",
            "description": "Calcula el mínimo por celda de una pila ráster, propagando NoData si alguna celda de entrada es NoData.",
            "params": {
              "input_rasters": {
                "label": "Rásteres de entrada",
                "description": "Pila de rásteres de entrada como matriz de rutas o cadena delimitada por punto y coma/comas."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado permanece en memoria."
              }
            }
          },
          "modulo": {
            "name": "Módulo",
            "description": "Calcula el resto de dividir el primer ráster por el segundo celda a celda.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Primer ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Segundo ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, la salida permanece en memoria y se devuelve como identificador de ráster memory://."
              }
            }
          },
          "multiply": {
            "name": "Multiplicar",
            "description": "Multiplica dos rásteres celda a celda.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Primer ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Segundo ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, la salida permanece en memoria y se devuelve como identificador de ráster memory://."
              }
            }
          },
          "multiply_overlay": {
            "name": "Superposición por producto",
            "description": "Calcula el producto por celda de una pila ráster, propagando NoData si alguna celda de entrada es NoData.",
            "params": {
              "input_rasters": {
                "label": "Rásteres de entrada",
                "description": "Pila de rásteres de entrada como matriz de rutas o cadena delimitada por punto y coma/comas."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado permanece en memoria."
              }
            }
          },
          "percent_equal_to": {
            "name": "Porcentaje igual a",
            "description": "Calcula la fracción de rásteres de una pila cuyos valores son iguales al ráster de comparación en cada celda.",
            "params": {
              "input_rasters": {
                "label": "Rásteres de entrada",
                "description": "Pila de rásteres de entrada como matriz de rutas o cadena delimitada por punto y coma/comas."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "comparison": {
                "label": "Comparación",
                "description": "Ruta del ráster de comparación o identificador de ráster en memoria."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado permanece en memoria."
              }
            }
          },
          "percent_greater_than": {
            "name": "Porcentaje mayor que",
            "description": "Calcula la fracción de rásteres de una pila cuyos valores son mayores que el ráster de comparación en cada celda.",
            "params": {
              "input_rasters": {
                "label": "Rásteres de entrada",
                "description": "Pila de rásteres de entrada como matriz de rutas o cadena delimitada por punto y coma/comas."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "comparison": {
                "label": "Comparación",
                "description": "Ruta del ráster de comparación o identificador de ráster en memoria."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado permanece en memoria."
              }
            }
          },
          "percent_less_than": {
            "name": "Porcentaje menor que",
            "description": "Calcula la fracción de rásteres de una pila cuyos valores son menores que el ráster de comparación en cada celda.",
            "params": {
              "input_rasters": {
                "label": "Rásteres de entrada",
                "description": "Pila de rásteres de entrada como matriz de rutas o cadena delimitada por punto y coma/comas."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "comparison": {
                "label": "Comparación",
                "description": "Ruta del ráster de comparación o identificador de ráster en memoria."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado permanece en memoria."
              }
            }
          },
          "pick_from_list": {
            "name": "Elegir de una lista",
            "description": "Selecciona los valores por celda de una pila ráster usando un ráster de posiciones basado en cero.",
            "params": {
              "input_rasters": {
                "label": "Rásteres de entrada",
                "description": "Pila de rásteres de entrada como matriz de rutas o cadena delimitada por punto y coma/comas."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "pos_input": {
                "label": "Entrada positiva",
                "description": "Ráster (base 0) de posiciones en la pila."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "power": {
            "name": "Potencia",
            "description": "Eleva el primer ráster a la potencia del segundo celda a celda.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Primer ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Segundo ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, la salida permanece en memoria y se devuelve como identificador de ráster memory://."
              }
            }
          },
          "standard_deviation_overlay": {
            "name": "Superposición por desviación estándar",
            "description": "Calcula la desviación estándar por celda de una pila ráster, propagando NoData si alguna celda de entrada es NoData.",
            "params": {
              "input_rasters": {
                "label": "Rásteres de entrada",
                "description": "Pila de rásteres de entrada como matriz de rutas o cadena delimitada por punto y coma/comas."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado permanece en memoria."
              }
            }
          },
          "subtract": {
            "name": "Restar",
            "description": "Resta el segundo ráster del primero celda a celda.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Primer ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Segundo ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, la salida permanece en memoria y se devuelve como identificador de ráster memory://."
              }
            }
          },
          "sum_overlay": {
            "name": "Superposición por suma",
            "description": "Calcula la suma por celda de una pila ráster, propagando NoData si alguna celda de entrada es NoData.",
            "params": {
              "input_rasters": {
                "label": "Rásteres de entrada",
                "description": "Pila de rásteres de entrada como matriz de rutas o cadena delimitada por punto y coma/comas."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado permanece en memoria."
              }
            }
          },
          "update_nodata_cells": {
            "name": "Actualizar celdas NoData",
            "description": "Asigna a las celdas NoData de input1 los valores de las celdas válidas correspondientes de input2.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Ráster primario a actualizar."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Ráster secundario que proporciona los valores de sustitución."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "weighted_overlay": {
            "name": "Superposición ponderada",
            "description": "Combina rásteres de factores usando pesos normalizados, indicadores de coste opcionales y restricciones binarias opcionales.",
            "params": {
              "factors": {
                "label": "Factores",
                "description": "Pila de rásteres de factores de entrada."
              },
              "weights": {
                "label": "Pesos",
                "description": "Pesos numéricos correspondientes a cada ráster de factor."
              },
              "cost": {
                "label": "Coste",
                "description": "Indicadores booleanos opcionales que señalan los factores de coste."
              },
              "constraints": {
                "label": "Restricciones",
                "description": "Pila opcional de rásteres de restricciones; los valores <= 0 fuerzan la salida a cero."
              },
              "scale_max": {
                "label": "Máximo de escala",
                "description": "Valor máximo de escala usado tras la normalización de factores."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "weighted_sum": {
            "name": "Suma ponderada",
            "description": "Calcula una suma ponderada de una pila ráster tras normalizar los pesos para que sumen uno.",
            "params": {
              "input_rasters": {
                "label": "Rásteres de entrada",
                "description": "Pila de rásteres de entrada."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "weights": {
                "label": "Pesos",
                "description": "Pesos numéricos correspondientes a cada ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "image_correlation_neighbourhood_analysis": {
            "name": "Análisis de vecindad por correlación de imágenes",
            "description": "Realiza un análisis de correlación en ventana móvil entre dos rásteres y devuelve rásteres de correlación y de valor p.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Ruta del primer ráster de entrada."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Ruta del segundo ráster de entrada."
              },
              "filter_size": {
                "label": "Tamaño de filtro",
                "description": "Tamaño de la ventana móvil en celdas (mínimo 3, predeterminado 11)."
              },
              "correlation_stat": {
                "label": "Estadístico de correlación",
                "description": "Métrica de correlación: pearson, spearman o kendall (predeterminado pearson)."
              },
              "output1": {
                "label": "Salida 1",
                "description": "Ruta de salida opcional para el ráster de correlación."
              },
              "output2": {
                "label": "Salida 2",
                "description": "Ruta de salida opcional para el ráster de significancia (valor p)."
              }
            }
          },
          "natural_neighbour_interpolation": {
            "name": "Interpolación por vecino natural",
            "description": "Interpola un ráster a partir de muestras puntuales mediante una ponderación por área de vecino natural de Sibson verdadera.",
            "params": {
              "points": {
                "label": "Puntos",
                "description": "Capa vectorial de puntos de entrada."
              },
              "field_name": {
                "label": "Nombre del campo",
                "description": "Campo de atributo numérico opcional; por defecto se recurre al FID."
              },
              "use_z": {
                "label": "Usar Z",
                "description": "Usar los valores Z de la geometría de los puntos en lugar de los atributos."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida cuando no se proporciona base_raster."
              },
              "base_raster": {
                "label": "Ráster base",
                "description": "Ráster base opcional que controla la geometría de salida."
              },
              "clip_to_hull": {
                "label": "Recortar a la envolvente",
                "description": "Limitar la interpolación a la envolvente convexa de los puntos."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "nearest_neighbour_interpolation": {
            "name": "Interpolación por vecino más próximo",
            "description": "Interpola un ráster a partir de muestras puntuales asignando a cada celda el valor de la muestra más cercana.",
            "params": {
              "points": {
                "label": "Puntos",
                "description": "Capa vectorial de puntos de entrada."
              },
              "field_name": {
                "label": "Nombre del campo",
                "description": "Campo de atributo numérico opcional; por defecto se recurre al FID."
              },
              "use_z": {
                "label": "Usar Z",
                "description": "Usar los valores Z de la geometría de los puntos en lugar de los atributos."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida cuando no se proporciona base_raster."
              },
              "base_raster": {
                "label": "Ráster base",
                "description": "Ráster base opcional que controla la geometría de salida."
              },
              "max_dist": {
                "label": "Distancia máxima",
                "description": "Distancia máxima de búsqueda opcional en unidades del mapa; por defecto infinito."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "conditional_evaluation": {
            "name": "Evaluación condicional",
            "description": "Realiza una evaluación condicional si-entonces-si no sobre las celdas ráster.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada."
              },
              "statement": {
                "label": "Sentencia",
                "description": "Expresión condicional evaluada por celda."
              },
              "true": {
                "label": "Verdadero",
                "description": "Valor o ráster/expresión usado cuando la condición es verdadera."
              },
              "false": {
                "label": "Falso",
                "description": "Valor o ráster/expresión usado cuando la condición es falsa."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "reclass": {
            "name": "Reclasificar",
            "description": "Reclasifica los valores ráster usando rangos o pares de asignación exacta.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de entrada."
              },
              "reclass_values": {
                "label": "Valores de reclasificación",
                "description": "Valores de reclasificación como filas de [nuevo, desde, hasta_menor_que] o [nuevo, antiguo] cuando assign_mode=true."
              },
              "assign_mode": {
                "label": "Modo de asignación",
                "description": "Si es verdadero, usa el modo de asignación exacta con pares [valor_nuevo, valor_antiguo]."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida. Si se omite, el resultado se mantiene en memoria."
              }
            }
          },
          "reclass_equal_interval": {
            "name": "Reclasificar por intervalos iguales",
            "description": "Reclasifica los valores ráster en intervalos de igual amplitud sobre un rango de valores opcional.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de entrada."
              },
              "interval_size": {
                "label": "Tamaño de intervalo",
                "description": "Ancho de intervalo de igual amplitud."
              },
              "start_value": {
                "label": "Valor inicial",
                "description": "Límite inferior opcional para la reclasificación; por defecto el mínimo del ráster."
              },
              "end_value": {
                "label": "Valor final",
                "description": "Límite superior opcional para la reclasificación; por defecto el máximo del ráster."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida. Si se omite, el resultado se mantiene en memoria."
              }
            }
          },
          "buffer_raster": {
            "name": "Zona de influencia ráster",
            "description": "Crea una zona de buffer binaria alrededor de las celdas ráster distintas de cero y de NoData dentro de una distancia especificada.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de entrada donde las celdas distintas de cero son objetivos del buffer."
              },
              "buffer_size": {
                "label": "Tamaño de buffer",
                "description": "Umbral de distancia del buffer."
              },
              "grid_cell_units": {
                "label": "Unidades en celdas de malla",
                "description": "Si es verdadero, interpreta buffer_size en unidades de celdas de malla en lugar de unidades del mapa."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "cost_allocation": {
            "name": "Asignación de coste",
            "description": "Asigna cada celda a una región de origen usando un ráster de enlace inverso (backlink) del análisis de distancia de coste.",
            "params": {
              "source": {
                "label": "Origen",
                "description": "Ráster de origen con celdas de origen positivas."
              },
              "backlink": {
                "label": "Retroenlace",
                "description": "Ráster de retroenlace de cost_distance."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "cost_distance": {
            "name": "Distancia de coste",
            "description": "Calcula los rásteres de coste de desplazamiento acumulado y de enlace inverso a partir de las superficies de origen y de coste.",
            "params": {
              "source": {
                "label": "Origen",
                "description": "Ráster de origen con celdas de origen positivas."
              },
              "cost": {
                "label": "Coste",
                "description": "Ráster de coste/fricción."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida de coste acumulado."
              },
              "backlink_output": {
                "label": "Salida de retroenlace",
                "description": "Ruta opcional del ráster de salida de retroenlace."
              }
            }
          },
          "cost_pathway": {
            "name": "Trayectoria de coste",
            "description": "Traza las trayectorias de coste mínimo desde las celdas de destino usando un ráster de enlace inverso.",
            "params": {
              "destination": {
                "label": "Destino",
                "description": "Ráster de destino con celdas de destino positivas."
              },
              "backlink": {
                "label": "Retroenlace",
                "description": "Ráster de retroenlace de cost_distance."
              },
              "zero_background": {
                "label": "Fondo cero",
                "description": "Si es verdadero, el fondo de la salida es cero en lugar de NoData."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "euclidean_allocation": {
            "name": "Asignación euclidiana",
            "description": "Asigna a cada celda válida el valor de su celda objetivo distinta de cero más cercana.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de entrada con celdas objetivo distintas de cero."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "euclidean_distance": {
            "name": "Distancia euclidiana",
            "description": "Calcula la distancia euclidiana a la celda objetivo distinta de cero más cercana de un ráster.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de entrada con celdas objetivo distintas de cero."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "abs": {
            "name": "Valor absoluto",
            "description": "Calcula el valor absoluto de cada celda ráster.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "aggregate_raster": {
            "name": "Agregar ráster",
            "description": "Reduce la resolución del ráster agregando bloques mediante la media, la suma, el mínimo, el máximo o el rango.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de entrada."
              },
              "aggregation_factor": {
                "label": "Factor de agregación",
                "description": "Tamaño de bloque en celdas de origen."
              },
              "aggregation_type": {
                "label": "Tipo de agregación",
                "description": "Uno de mean, sum, maximum, minimum o range."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "anova": {
            "name": "ANOVA",
            "description": "Realiza un ANOVA de un factor sobre los valores ráster agrupados según las categorías de un ráster de clases.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de medición."
              },
              "features": {
                "label": "Entidades",
                "description": "Ruta del ráster de clases/categorías."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional de salida del informe HTML (alias: output_html_file)."
              }
            }
          },
          "arccos": {
            "name": "Arcocoseno",
            "description": "Calcula el coseno inverso (arccos) de cada celda ráster.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "arcosh": {
            "name": "Arcocoseno hiperbólico",
            "description": "Calcula el coseno hiperbólico inverso de cada celda ráster.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "arcsin": {
            "name": "Arcoseno",
            "description": "Calcula el seno inverso (arcsin) de cada celda ráster.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "arctan": {
            "name": "Arcotangente",
            "description": "Calcula la tangente inversa (arctan) de cada celda ráster.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "arsinh": {
            "name": "Arcoseno hiperbólico",
            "description": "Calcula el seno hiperbólico inverso de cada celda ráster.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "artanh": {
            "name": "Arcotangente hiperbólica",
            "description": "Calcula la tangente hiperbólica inversa de cada celda ráster.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "atan2": {
            "name": "Atan2",
            "description": "Calcula la tangente inversa de cuatro cuadrantes usando dos rásteres celda a celda.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Primer ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Segundo ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, la salida permanece en memoria y se devuelve como identificador de ráster memory://."
              }
            }
          },
          "block_maximum": {
            "name": "Máximo por bloque",
            "description": "Rasteriza entidades de puntos asignando el valor máximo observado dentro de cada celda de salida.",
            "params": {
              "points": {
                "label": "Puntos",
                "description": "Capa vectorial de puntos de entrada."
              },
              "field_name": {
                "label": "Nombre del campo",
                "description": "Campo de atributo numérico opcional a rasterizar; por defecto se recurre al FID."
              },
              "use_z": {
                "label": "Usar Z",
                "description": "Usar los valores Z de la geometría de los puntos en lugar de los atributos."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida cuando no se proporciona base_raster."
              },
              "base_raster": {
                "label": "Ráster base",
                "description": "Ráster base opcional que controla la geometría de salida."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "block_minimum": {
            "name": "Mínimo por bloque",
            "description": "Rasteriza entidades de puntos asignando el valor mínimo observado dentro de cada celda de salida.",
            "params": {
              "points": {
                "label": "Puntos",
                "description": "Capa vectorial de puntos de entrada."
              },
              "field_name": {
                "label": "Nombre del campo",
                "description": "Campo de atributo numérico opcional a rasterizar; por defecto se recurre al FID."
              },
              "use_z": {
                "label": "Usar Z",
                "description": "Usar los valores Z de la geometría de los puntos en lugar de los atributos."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida cuando no se proporciona base_raster."
              },
              "base_raster": {
                "label": "Ráster base",
                "description": "Ráster base opcional que controla la geometría de salida."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "boundary_shape_complexity": {
            "name": "Complejidad de la forma del límite",
            "description": "Calcula la complejidad de la forma del límite de los parches ráster mediante una métrica de ramas del esqueleto obtenido por adelgazamiento de líneas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de ID de parches de entrada con ID enteros positivos."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "ceil": {
            "name": "Redondear hacia arriba",
            "description": "Redondea cada celda ráster hacia arriba al entero más cercano.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "centroid_raster": {
            "name": "Centroide ráster",
            "description": "Calcula la celda centroide de cada ID de parche de valor positivo de un ráster.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de parches de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "clip_raster_to_polygon": {
            "name": "Recortar ráster con polígono",
            "description": "Recorta un ráster a la extensión de los polígonos; las celdas fuera de los polígonos se establecen en NoData.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de entrada."
              },
              "polygons": {
                "label": "Polígonos",
                "description": "Capa vectorial de polígonos de entrada."
              },
              "maintain_dimensions": {
                "label": "Mantener dimensiones",
                "description": "Conservar las dimensiones originales del ráster en lugar de recortar a la extensión del polígono."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "clump": {
            "name": "Agrupar",
            "description": "Agrupa las celdas ráster contiguas de igual valor en identificadores de parche únicos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster categórico de entrada."
              },
              "diag": {
                "label": "Diagonal",
                "description": "Si es verdadero, incluye la conectividad diagonal (8 vecinos); en caso contrario, usa 4 vecinos."
              },
              "zero_background": {
                "label": "Fondo cero",
                "description": "Si es verdadero, trata las celdas con valor cero como fondo y las mantiene como cero en la salida."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "cos": {
            "name": "Coseno",
            "description": "Calcula el coseno del valor de cada celda ráster.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "cosh": {
            "name": "Coseno hiperbólico",
            "description": "Calcula el coseno hiperbólico de cada celda ráster.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "create_plane": {
            "name": "Crear plano",
            "description": "Crea un ráster a partir de una ecuación de plano usando la geometría de un ráster base.",
            "params": {
              "base": {
                "label": "Base",
                "description": "Ráster base que define la geometría de salida."
              },
              "gradient": {
                "label": "Gradiente",
                "description": "Gradiente de pendiente del plano en grados."
              },
              "aspect": {
                "label": "Orientación",
                "description": "Orientación del plano en grados."
              },
              "constant": {
                "label": "Constante",
                "description": "Término constante aditivo de la ecuación del plano."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "crispness_index": {
            "name": "Índice de nitidez",
            "description": "Calcula el índice de nitidez (crispness) de un ráster de probabilidad de pertenencia.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional de salida del informe HTML (alias: output_html_file)."
              }
            }
          },
          "cross_tabulation": {
            "name": "Tabulación cruzada",
            "description": "Realiza una tabulación cruzada de dos rásteres categóricos.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Ruta del ráster de entrada 1."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Ruta del ráster de entrada 2."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional de salida del informe HTML (alias: output_html_file)."
              }
            }
          },
          "cumulative_distribution": {
            "name": "Distribución acumulada",
            "description": "Convierte los valores ráster en probabilidades de distribución acumulada.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "dbscan": {
            "name": "DBSCAN",
            "description": "Realiza un agrupamiento no supervisado basado en densidad DBSCAN sobre una pila de rásteres de entrada.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Lista delimitada por comas/punto y coma o matriz JSON de rutas de rásteres de entrada (bandas de rasgos)."
              },
              "scaling_method": {
                "label": "Método de escalado",
                "description": "Escalado de rasgos: 'none' (predeterminado), 'normalize' (rango 0-1) o 'standardize' (puntuaciones z)."
              },
              "search_distance": {
                "label": "Distancia de búsqueda",
                "description": "Épsilon: radio de búsqueda de vecindad en el espacio de rasgos (predeterminado 1.0)."
              },
              "min_points": {
                "label": "Puntos mínimos",
                "description": "Número mínimo de vecinos dentro de épsilon para un punto núcleo (predeterminado 5)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida para las etiquetas de ID de clúster."
              }
            }
          },
          "decrement": {
            "name": "Decremento",
            "description": "Resta un valor (predeterminado 1.0) de cada celda ráster que no sea NoData.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "value": {
                "label": "Valor",
                "description": "La cantidad a restar de cada celda. Por defecto 1.0."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "edge_proportion": {
            "name": "Proporción de borde",
            "description": "Calcula la proporción de celdas de cada parche que son celdas de borde y la asigna de nuevo a las celdas del parche.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de ID de parches de entrada con ID enteros positivos."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "equal_to": {
            "name": "Igual a",
            "description": "Comprueba si dos rásteres son iguales celda a celda.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Primer ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Segundo ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, la salida permanece en memoria y se devuelve como identificador de ráster memory://."
              }
            }
          },
          "erase_polygon_from_raster": {
            "name": "Borrar polígono del ráster",
            "description": "Establece en NoData las celdas ráster situadas dentro de los polígonos, conservando las celdas de los huecos de los polígonos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de entrada."
              },
              "polygons": {
                "label": "Polígonos",
                "description": "Capa vectorial de polígonos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "exp": {
            "name": "Exponencial",
            "description": "Calcula e elevado a la potencia de cada celda ráster.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "exp2": {
            "name": "Exponencial base 2",
            "description": "Calcula 2 elevado a la potencia de cada celda ráster.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "fft_random_field": {
            "name": "Campo aleatorio FFT",
            "description": "Crea un campo aleatorio espacialmente autocorrelacionado mediante síntesis espectral FFT.",
            "params": {
              "base_raster": {
                "label": "Ráster base",
                "description": "Ruta del ráster base usado para la geometría de la malla."
              },
              "range": {
                "label": "Rango",
                "description": "Rango de correlación aproximado en unidades del mapa. Predeterminado: 1.0."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "filter_raster_features_by_area": {
            "name": "Filtrar entidades ráster por área",
            "description": "Elimina los elementos ráster etiquetados con enteros más pequeños que un umbral de número de celdas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de entrada que contiene etiquetas de clase enteras."
              },
              "threshold": {
                "label": "Umbral",
                "description": "Tamaño mínimo de rasgo en celdas a conservar."
              },
              "zero_background": {
                "label": "Fondo cero",
                "description": "Si es verdadero, a los rasgos eliminados se les asigna 0; en caso contrario, se les asigna NoData."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida. Si se omite, el resultado se mantiene en memoria."
              }
            }
          },
          "find_patch_edge_cells": {
            "name": "Encontrar celdas de borde de parche",
            "description": "Identifica las celdas de borde de cada ID de parche ráster positivo; las celdas del parche que no son de borde se establecen en cero.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de ID de parches de entrada; los valores positivos se tratan como celdas de parche."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "floor": {
            "name": "Redondear hacia abajo",
            "description": "Redondea cada celda ráster hacia abajo al entero más cercano.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "greater_than": {
            "name": "Mayor que",
            "description": "Comprueba si el primer ráster es mayor que el segundo celda a celda.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Primer ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Segundo ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, la salida permanece en memoria y se devuelve como identificador de ráster memory://."
              }
            }
          },
          "heat_map": {
            "name": "Mapa de calor",
            "description": "Genera un ráster de mapa de calor de densidad kernel a partir de las ocurrencias de puntos.",
            "params": {
              "points": {
                "label": "Puntos",
                "description": "Capa vectorial de puntos de entrada."
              },
              "field_name": {
                "label": "Nombre del campo",
                "description": "Campo numérico de peso opcional; por defecto ocurrencias sin ponderar."
              },
              "bandwidth": {
                "label": "Ancho de banda",
                "description": "Ancho de banda del kernel en unidades del mapa."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida cuando no se proporciona base_raster."
              },
              "base_raster": {
                "label": "Ráster base",
                "description": "Ráster base opcional que controla la geometría de salida."
              },
              "kernel_function": {
                "label": "Función kernel",
                "description": "Tipo de función kernel; por defecto quartic."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "idw_interpolation": {
            "name": "Interpolación IDW",
            "description": "Interpola un ráster a partir de muestras puntuales mediante ponderación por distancia inversa.",
            "params": {
              "points": {
                "label": "Puntos",
                "description": "Capa vectorial de puntos de entrada."
              },
              "field_name": {
                "label": "Nombre del campo",
                "description": "Campo de atributo numérico opcional; por defecto se recurre al FID."
              },
              "use_z": {
                "label": "Usar Z",
                "description": "Usar los valores Z de la geometría de los puntos en lugar de los atributos."
              },
              "weight": {
                "label": "Peso",
                "description": "Exponente de distancia de IDW; por defecto 2.0."
              },
              "radius": {
                "label": "Radio",
                "description": "Radio de vecindad opcional en unidades del mapa; <=0 usa la alternativa de k vecinos más próximos."
              },
              "min_points": {
                "label": "Puntos mínimos",
                "description": "Número mínimo de vecinos a utilizar; por defecto 0."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida cuando no se proporciona base_raster."
              },
              "base_raster": {
                "label": "Ráster base",
                "description": "Ráster base opcional que controla la geometría de salida."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "image_autocorrelation": {
            "name": "Autocorrelación de imagen",
            "description": "Calcula el I de Moran para una o varias imágenes ráster.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Lista de rutas de rásteres de entrada."
              },
              "contiguity": {
                "label": "Contigüidad",
                "description": "Regla de vecindad: rook, king/queen o bishop."
              }
            }
          },
          "image_correlation": {
            "name": "Correlación de imágenes",
            "description": "Calcula la matriz de correlación de Pearson para dos o más imágenes ráster.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Lista de rutas de rásteres de entrada."
              }
            }
          },
          "image_regression": {
            "name": "Regresión de imágenes",
            "description": "Realiza una regresión lineal bivariante entre dos rásteres y genera un ráster de residuos y un informe.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Ruta del ráster de la variable independiente."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Ruta del ráster de la variable dependiente."
              },
              "standardize_residuals": {
                "label": "Estandarizar residuos",
                "description": "Indica si se estandarizan los residuos por el error estándar del modelo."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional del ráster de residuos."
              }
            }
          },
          "increment": {
            "name": "Incremento",
            "description": "Suma un valor (predeterminado 1.0) a cada celda ráster que no sea NoData.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "value": {
                "label": "Valor",
                "description": "Cantidad que se añade a cada celda. Por defecto 1.0."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "inplace_add": {
            "name": "Sumar en el lugar",
            "description": "Realiza una operación de suma in situ (input1 += input2).",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Ráster de entrada que se va a modificar."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Ruta del ráster de entrada o constante numérica."
              }
            }
          },
          "inplace_divide": {
            "name": "Dividir en el lugar",
            "description": "Realiza una operación de división in situ (input1 /= input2).",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Ráster de entrada que se va a modificar."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Ruta del ráster de entrada o constante numérica distinta de cero."
              }
            }
          },
          "inplace_multiply": {
            "name": "Multiplicar en el lugar",
            "description": "Realiza una operación de multiplicación in situ (input1 *= input2).",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Ráster de entrada que se va a modificar."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Ruta del ráster de entrada o constante numérica."
              }
            }
          },
          "inplace_subtract": {
            "name": "Restar en el lugar",
            "description": "Realiza una operación de resta in situ (input1 -= input2).",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Ráster de entrada que se va a modificar."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Ruta del ráster de entrada o constante numérica."
              }
            }
          },
          "integer_division": {
            "name": "División entera",
            "description": "Divide dos rásteres y trunca cada resultado hacia cero.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Primer ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Segundo ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, la salida permanece en memoria y se devuelve como identificador de ráster memory://."
              }
            }
          },
          "inverse_pca": {
            "name": "PCA inversa",
            "description": "Reconstruye las imágenes de las bandas originales a partir de rásteres de componentes PCA usando los vectores propios almacenados.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Rutas de los rásteres de componentes."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "pca_report": {
                "label": "Informe de PCA",
                "description": "Cadena del informe JSON generado por el PCA."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta base de salida opcional."
              }
            }
          },
          "is_nodata": {
            "name": "Es NoData",
            "description": "Genera 1 para las celdas NoData y 0 para todas las celdas válidas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "kappa_index": {
            "name": "Índice kappa",
            "description": "Calcula el kappa de Cohen y métricas de concordancia entre dos rásteres categóricos.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Ruta del ráster de clasificación de entrada."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Ruta del ráster de referencia de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional de salida del informe HTML (alias: output_html_file)."
              }
            }
          },
          "ks_normality_test": {
            "name": "Prueba de normalidad KS",
            "description": "Evalúa si los valores ráster proceden de una distribución normal.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada."
              },
              "num_samples": {
                "label": "Número de muestras",
                "description": "Tamaño de muestra aleatoria opcional. Omítalo para usar todas las celdas válidas."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional de salida del informe HTML (alias: output_html_file)."
              }
            }
          },
          "less_than": {
            "name": "Menor que",
            "description": "Comprueba si el primer ráster es menor que el segundo celda a celda.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Primer ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Segundo ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, la salida permanece en memoria y se devuelve como identificador de ráster memory://."
              }
            }
          },
          "list_unique_values_raster": {
            "name": "Listar valores únicos (ráster)",
            "description": "Enumera las categorías ráster válidas únicas y sus frecuencias.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del CSV de salida."
              },
              "strict_parity": {
                "label": "Paridad estricta",
                "description": "Cuando es verdadero, devuelve la salida completa de frecuencias por categoría (predeterminado true)."
              },
              "max_values": {
                "label": "Valores máximos",
                "description": "Máximo de valores únicos que se incluyen cuando strict_parity es falso (predeterminado 10000)."
              }
            }
          },
          "ln": {
            "name": "Logaritmo natural",
            "description": "Calcula el logaritmo natural de cada celda ráster.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "log10": {
            "name": "Logaritmo base 10",
            "description": "Calcula el logaritmo en base 10 de cada celda ráster.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "log2": {
            "name": "Logaritmo base 2",
            "description": "Calcula el logaritmo en base 2 de cada celda ráster.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "map_features": {
            "name": "Mapear entidades",
            "description": "Cartografía elementos del terreno elevados discretos a partir de un ráster mediante un crecimiento de regiones por prioridad descendente.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de entrada."
              },
              "min_feature_height": {
                "label": "Altura mínima de rasgo",
                "description": "Separación vertical mínima para entidades independientes."
              },
              "min_feature_size": {
                "label": "Tamaño mínimo de rasgo",
                "description": "Tamaño mínimo de entidad en celdas."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "max": {
            "name": "Máximo",
            "description": "Realiza una operación MAX sobre dos rásteres o sobre un ráster y un valor constante.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Ruta del primer ráster o constante numérica."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Ruta del segundo ráster o constante numérica."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "min": {
            "name": "Mínimo",
            "description": "Realiza una operación MIN sobre dos rásteres o sobre un ráster y un valor constante.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Ruta del primer ráster o constante numérica."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Ruta del segundo ráster o constante numérica."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "modified_shepard_interpolation": {
            "name": "Interpolación de Shepard modificada",
            "description": "Interpola un ráster a partir de muestras puntuales mediante una mezcla de Shepard modificada ponderada localmente.",
            "params": {
              "points": {
                "label": "Puntos",
                "description": "Capa vectorial de puntos de entrada."
              },
              "field_name": {
                "label": "Nombre del campo",
                "description": "Campo de atributo numérico opcional; por defecto se recurre al FID."
              },
              "use_z": {
                "label": "Usar Z",
                "description": "Usar los valores Z de la geometría de los puntos en lugar de los atributos."
              },
              "weight": {
                "label": "Peso",
                "description": "Exponente de ponderación de Shepard; por defecto 2.0."
              },
              "radius": {
                "label": "Radio",
                "description": "Radio de vecindad opcional en unidades del mapa."
              },
              "min_points": {
                "label": "Puntos mínimos",
                "description": "Número mínimo de vecinos; por defecto 8."
              },
              "use_quadratic_basis": {
                "label": "Usar base cuadrática",
                "description": "Aplicar correcciones locales de base cuadrática (modo compatible con versiones anteriores)."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida cuando no se proporciona base_raster."
              },
              "base_raster": {
                "label": "Ráster base",
                "description": "Ráster base opcional que controla la geometría de salida."
              },
              "use_data_hull": {
                "label": "Usar envolvente de datos",
                "description": "Limitar la interpolación a la envolvente convexa de los puntos."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "narrowness_index": {
            "name": "Índice de estrechez",
            "description": "Calcula el índice de estrechez de los parches ráster como el área dividida por el área del mayor círculo contenido, basado en la distancia máxima al borde.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de ID de parches de entrada con ID enteros positivos."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "negate": {
            "name": "Negar",
            "description": "Cambia el signo del valor de cada celda ráster que no sea NoData.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "nibble": {
            "name": "Nibble",
            "description": "Rellena las regiones de fondo mediante una asignación por vecino más cercano.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de entrada al que se aplicará Nibble."
              },
              "mask": {
                "label": "Máscara",
                "description": "Ráster de máscara binaria."
              },
              "use_nodata": {
                "label": "Usar sin datos",
                "description": "Tratar los NoData de entrada como valor de clase (no como fondo)."
              },
              "nibble_nodata": {
                "label": "Rellenar sin datos",
                "description": "Aplicar Nibble también en las áreas NoData situadas fuera de la máscara."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "not_equal_to": {
            "name": "Distinto de",
            "description": "Comprueba si dos rásteres son distintos celda a celda.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Primer ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Segundo ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, la salida permanece en memoria y se devuelve como identificador de ráster memory://."
              }
            }
          },
          "paired_sample_t_test": {
            "name": "Prueba t para muestras pareadas",
            "description": "Realiza una prueba t para muestras pareadas sobre dos rásteres usando las celdas válidas emparejadas.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Ruta del primer ráster de entrada."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Ruta del segundo ráster de entrada."
              },
              "num_samples": {
                "label": "Número de muestras",
                "description": "Tamaño de muestra opcional con reemplazo."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional de salida del informe HTML (alias: output_html_file)."
              }
            }
          },
          "phi_coefficient": {
            "name": "Coeficiente phi",
            "description": "Realiza una evaluación de la concordancia de una clasificación binaria mediante el coeficiente phi.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Ruta del primer ráster binario."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Ruta del segundo ráster binario."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional de salida del informe HTML (alias: output_html_file)."
              }
            }
          },
          "principal_component_analysis": {
            "name": "Análisis de componentes principales",
            "description": "Realiza un PCA sobre una pila de rásteres y devuelve las imágenes de los componentes y un informe JSON.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Rutas de los rásteres de entrada (≥3)."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "num_components": {
                "label": "Número de componentes",
                "description": "Número de componentes. Predeterminado: todos."
              },
              "standardized": {
                "label": "Estandarizado",
                "description": "Usar matriz de correlación. Predeterminado: false."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta base de salida opcional."
              }
            }
          },
          "print_geotiff_tags": {
            "name": "Imprimir etiquetas GeoTIFF",
            "description": "Genera un informe de texto que describe las etiquetas TIFF/GeoTIFF y los metadatos clave de un ráster de entrada de la familia GeoTIFF.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada."
              }
            }
          },
          "quantiles": {
            "name": "Cuantiles",
            "description": "Transforma los valores ráster en clases de cuantiles.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada."
              },
              "num_quantiles": {
                "label": "Número de cuantiles",
                "description": "Número de cuantiles (predeterminado 5)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "radial_basis_function_interpolation": {
            "name": "Interpolación por funciones de base radial",
            "description": "Interpola un ráster a partir de muestras puntuales mediante una ponderación por similitud de base radial local.",
            "params": {
              "points": {
                "label": "Puntos",
                "description": "Capa vectorial de puntos de entrada."
              },
              "field_name": {
                "label": "Nombre del campo",
                "description": "Campo de atributo numérico opcional; por defecto se recurre al FID."
              },
              "use_z": {
                "label": "Usar Z",
                "description": "Usar los valores Z de la geometría de los puntos en lugar de los atributos."
              },
              "approximate_mode": {
                "label": "Modo aproximado",
                "description": "Si es verdadero, usa la ponderación aproximada rápida NG; si es falso, resuelve sistemas RBF locales (al estilo heredado)."
              },
              "radius": {
                "label": "Radio",
                "description": "Radio de vecindad opcional en unidades del mapa."
              },
              "min_points": {
                "label": "Puntos mínimos",
                "description": "Número mínimo de vecinos a utilizar."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida cuando no se proporciona base_raster."
              },
              "base_raster": {
                "label": "Ráster base",
                "description": "Ráster base opcional que controla la geometría de salida."
              },
              "func_type": {
                "label": "Tipo de función",
                "description": "Tipo de base radial (thinplatespline, polyharmonic, gaussian, multiquadric, inversemultiquadric)."
              },
              "poly_order": {
                "label": "Orden del polinomio",
                "description": "Sugerencia de orden polinómico (none, constant, quadratic)."
              },
              "weight": {
                "label": "Peso",
                "description": "Parámetro/exponente de forma de la base según func_type."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "radius_of_gyration": {
            "name": "Radio de giro",
            "description": "Calcula el radio de giro por parche y asigna los valores de nuevo a las celdas del parche.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de ID de parches de entrada con ID enteros positivos."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "random_field": {
            "name": "Campo aleatorio",
            "description": "Crea un ráster que contiene valores aleatorios normales estándar.",
            "params": {
              "base": {
                "label": "Base",
                "description": "Ruta del ráster base usado para la geometría de la malla."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "random_forest_classification_fit": {
            "name": "Ajustar clasificación por bosque aleatorio",
            "description": "Ajusta un modelo de clasificación Random Forest y devuelve los bytes del modelo serializado.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Matriz de rásteres de entrada monobanda."
              },
              "training_data": {
                "label": "Datos de entrenamiento",
                "description": "Ruta de los datos de entrenamiento vectoriales de puntos/polígonos."
              },
              "class_field": {
                "label": "Campo de clase",
                "description": "Campo de clase en los atributos de training_data."
              },
              "scaling": {
                "label": "Escalado",
                "description": "Modo de escalado de rasgos: none (predeterminado), normalize, standardize."
              },
              "split_criterion": {
                "label": "Criterio de división",
                "description": "Sugerencia de criterio de división del árbol (se conserva por compatibilidad con versiones anteriores)."
              },
              "n_trees": {
                "label": "Número de árboles",
                "description": "Número de árboles del bosque (predeterminado 200)."
              },
              "min_samples_leaf": {
                "label": "Muestras mínimas por hoja",
                "description": "Número mínimo de muestras requeridas en un nodo hoja (predeterminado 1)."
              },
              "min_samples_split": {
                "label": "Muestras mínimas por división",
                "description": "Número mínimo de muestras requeridas para dividir un nodo interno (predeterminado 2)."
              },
              "test_proportion": {
                "label": "Proporción de prueba",
                "description": "Argumento de compatibilidad con versiones anteriores; reservado para diagnósticos futuros."
              }
            }
          },
          "random_forest_classification_predict": {
            "name": "Predecir clasificación por bosque aleatorio",
            "description": "Aplica un modelo de clasificación Random Forest serializado a predictores multibanda.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Matriz de rásteres de entrada monobanda."
              },
              "model_bytes": {
                "label": "Bytes del modelo",
                "description": "Bytes del modelo generados por random_forest_classification_fit."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "random_forest_regression_fit": {
            "name": "Ajustar regresión por bosque aleatorio",
            "description": "Ajusta un modelo de regresión Random Forest y devuelve los bytes del modelo serializado.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Matriz de rásteres de entrada monobanda."
              },
              "training_data": {
                "label": "Datos de entrenamiento",
                "description": "Ruta de los datos de entrenamiento vectoriales de puntos."
              },
              "field": {
                "label": "Campo",
                "description": "Campo objetivo numérico en los atributos de training_data."
              },
              "scaling": {
                "label": "Escalado",
                "description": "Modo de escalado de rasgos: none (predeterminado), normalize, standardize."
              },
              "n_trees": {
                "label": "Número de árboles",
                "description": "Número de árboles del bosque (predeterminado 200)."
              },
              "min_samples_leaf": {
                "label": "Muestras mínimas por hoja",
                "description": "Número mínimo de muestras requeridas en un nodo hoja (predeterminado 1)."
              },
              "min_samples_split": {
                "label": "Muestras mínimas por división",
                "description": "Número mínimo de muestras requeridas para dividir un nodo interno (predeterminado 2)."
              },
              "test_proportion": {
                "label": "Proporción de prueba",
                "description": "Argumento de compatibilidad con versiones anteriores; reservado para diagnósticos futuros."
              }
            }
          },
          "random_forest_regression_predict": {
            "name": "Predecir regresión por bosque aleatorio",
            "description": "Aplica un modelo de regresión Random Forest serializado a predictores multibanda.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Matriz de rásteres de entrada monobanda."
              },
              "model_bytes": {
                "label": "Bytes del modelo",
                "description": "Bytes del modelo generados por random_forest_regression_fit."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "random_sample": {
            "name": "Muestra aleatoria",
            "description": "Crea un ráster que contiene celdas de muestra situadas aleatoriamente con ID únicos.",
            "params": {
              "base": {
                "label": "Base",
                "description": "Ruta del ráster base usado para la geometría de la malla y la máscara de celdas válidas."
              },
              "num_samples": {
                "label": "Número de muestras",
                "description": "Número de celdas de muestra que se van a generar."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "raster_area": {
            "name": "Área del ráster",
            "description": "Estima el área de los polígonos ráster por clase en unidades de celda de la malla o de mapa y escribe los totales de la clase en cada celda de esa clase.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster categórico de entrada."
              },
              "units": {
                "label": "Unidades",
                "description": "Unidades de área: 'map units' (predeterminado) o 'grid cells'."
              },
              "zero_background": {
                "label": "Fondo cero",
                "description": "Si es verdadero, las celdas con valor cero se excluyen del análisis."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "raster_calculator": {
            "name": "Calculadora ráster",
            "description": "Evalúa una expresión matemática sobre una lista de rásteres de entrada celda a celda.",
            "params": {
              "expression": {
                "label": "Expresión",
                "description": "Expresión matemática con los nombres de las variables ráster entre comillas."
              },
              "inputs": {
                "label": "Entradas",
                "description": "Rutas ordenadas de los rásteres de entrada."
              },
              "auto_reproject": {
                "label": "Reproyección automática",
                "description": "Si es verdadero (predeterminado), reproyecta automáticamente los rásteres de la pila para que coincidan con inputs[0] cuando el CRS difiere."
              },
              "auto_reproject_method": {
                "label": "Método de reproyección automática",
                "description": "Método de remuestreo de reproyección opcional: nearest, bilinear, cubic, lanczos, average, min, max, mode, median, stddev."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "raster_cell_assignment": {
            "name": "Asignación de celdas ráster",
            "description": "Crea un ráster derivado de un ráster base que asigna a cada celda valores de fila, columna, x o y.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster base de entrada."
              },
              "what_to_assign": {
                "label": "Qué asignar",
                "description": "Destino de la asignación: column, row, x o y."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "raster_histogram": {
            "name": "Histograma ráster",
            "description": "Construye un histograma de intervalos fijos para las celdas ráster válidas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional de salida del informe HTML (alias: output_html_file)."
              },
              "bins": {
                "label": "Intervalos",
                "description": "Número de intervalos del histograma (predeterminado log2(rows*cols)+1)."
              }
            }
          },
          "raster_perimeter": {
            "name": "Perímetro del ráster",
            "description": "Estima el perímetro de los polígonos ráster por clase mediante una tabla de consulta con antialiasing y escribe los totales de la clase en cada celda de esa clase.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster categórico de entrada."
              },
              "units": {
                "label": "Unidades",
                "description": "Unidades de perímetro: 'map units' (predeterminado) o 'grid cells'."
              },
              "zero_background": {
                "label": "Fondo cero",
                "description": "Si es verdadero, las celdas con valor cero se excluyen del análisis."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "raster_summary_stats": {
            "name": "Estadísticas resumen del ráster",
            "description": "Calcula estadísticas resumen básicas para las celdas ráster válidas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional del informe (.json o .csv)."
              }
            }
          },
          "reciprocal": {
            "name": "Recíproco",
            "description": "Calcula el recíproco (1/x) de cada celda ráster.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "rescale_value_range": {
            "name": "Reescalar el rango de valores",
            "description": "Reescala linealmente los valores ráster a un rango objetivo.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada."
              },
              "out_min": {
                "label": "Mínimo de salida",
                "description": "Valor mínimo de salida."
              },
              "out_max": {
                "label": "Máximo de salida",
                "description": "Valor máximo de salida."
              },
              "clip_min": {
                "label": "Mínimo de recorte",
                "description": "Mínimo de entrada opcional para el recorte previo al reescalado."
              },
              "clip_max": {
                "label": "Máximo de recorte",
                "description": "Máximo de entrada opcional para el recorte previo al reescalado."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "root_mean_square_error": {
            "name": "Error cuadrático medio",
            "description": "Calcula el RMSE y estadísticas de exactitud relacionadas entre dos rásteres.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de comparación."
              },
              "base": {
                "label": "Base",
                "description": "Ruta del ráster base."
              }
            }
          },
          "round": {
            "name": "Redondear",
            "description": "Redondea cada celda ráster al entero más cercano.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "shape_complexity_index_raster": {
            "name": "Índice de complejidad de forma ráster",
            "description": "Calcula la complejidad de la forma de los parches ráster a partir de la frecuencia de transiciones horizontales/verticales normalizada por la extensión del parche.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de ID de parches de entrada con ID enteros positivos."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "sieve": {
            "name": "Tamizar",
            "description": "Elimina los parches aislados pequeños por debajo de un umbral de número de celdas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster categórico de entrada."
              },
              "threshold": {
                "label": "Umbral",
                "description": "Tamaño mínimo de parche en celdas que se conserva."
              },
              "zero_background": {
                "label": "Fondo cero",
                "description": "Poner a cero las celdas de fondo (valor 0) en la salida."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "sin": {
            "name": "Seno",
            "description": "Calcula el seno del valor de cada celda ráster.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "sinh": {
            "name": "Seno hiperbólico",
            "description": "Calcula el seno hiperbólico de cada celda ráster.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "sqrt": {
            "name": "Raíz cuadrada",
            "description": "Calcula la raíz cuadrada de cada celda ráster.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "square": {
            "name": "Cuadrado",
            "description": "Eleva al cuadrado el valor de cada celda ráster.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "tan": {
            "name": "Tangente",
            "description": "Calcula la tangente del valor de cada celda ráster.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "tanh": {
            "name": "Tangente hiperbólica",
            "description": "Calcula la tangente hiperbólica de cada celda ráster.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "tin_interpolation": {
            "name": "Interpolación TIN",
            "description": "Interpola un ráster a partir de muestras puntuales mediante la triangulación de Delaunay y la interpolación plana dentro de cada triángulo.",
            "params": {
              "points": {
                "label": "Puntos",
                "description": "Capa vectorial de puntos de entrada."
              },
              "field_name": {
                "label": "Nombre del campo",
                "description": "Campo de atributo numérico opcional; por defecto se recurre al FID."
              },
              "use_z": {
                "label": "Usar Z",
                "description": "Usar los valores Z de la geometría de los puntos en lugar de los atributos."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida cuando no se proporciona base_raster."
              },
              "base_raster": {
                "label": "Ráster base",
                "description": "Ráster base opcional que controla la geometría de salida."
              },
              "max_triangle_edge_length": {
                "label": "Longitud máxima de arista del triángulo",
                "description": "Longitud máxima permitida opcional de las aristas de los triángulos en unidades del mapa."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "to_degrees": {
            "name": "A grados",
            "description": "Convierte cada celda ráster de radianes a grados.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "to_radians": {
            "name": "A radianes",
            "description": "Convierte cada celda ráster de grados a radianes.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "trend_surface": {
            "name": "Superficie de tendencia",
            "description": "Ajusta una superficie de tendencia polinómica a un ráster mediante regresión por mínimos cuadrados.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada."
              },
              "polynomial_order": {
                "label": "Orden del polinomio",
                "description": "Orden polinómico 1–10. Predeterminado: 1."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "trend_surface_vector_points": {
            "name": "Superficie de tendencia desde puntos vectoriales",
            "description": "Ajusta una superficie de tendencia polinómica a datos vectoriales de puntos mediante regresión por mínimos cuadrados.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo vectorial de puntos de entrada."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda del ráster de salida en unidades del mapa."
              },
              "field_name": {
                "label": "Nombre del campo",
                "description": "Campo de atributo para los valores Z. Predeterminado: 'FID'."
              },
              "polynomial_order": {
                "label": "Orden del polinomio",
                "description": "Orden polinómico 1–10. Predeterminado: 1."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "truncate": {
            "name": "Truncar",
            "description": "Trunca el valor de cada celda ráster a su parte entera.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "turning_bands_simulation": {
            "name": "Simulación por bandas rotatorias",
            "description": "Crea un campo aleatorio espacialmente autocorrelacionado mediante el algoritmo de bandas rotantes (turning bands).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster base."
              },
              "range": {
                "label": "Rango",
                "description": "Rango de correlación en unidades del mapa. Predeterminado: 1.0."
              },
              "iterations": {
                "label": "Iteraciones",
                "description": "Número de direcciones de banda. Predeterminado: 1000."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "two_sample_ks_test": {
            "name": "Prueba KS de dos muestras",
            "description": "Realiza una prueba de Kolmogorov-Smirnov de dos muestras sobre dos distribuciones de valores ráster.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Ruta del primer ráster de entrada."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Ruta del segundo ráster de entrada."
              },
              "num_samples": {
                "label": "Número de muestras",
                "description": "Tamaño de muestra opcional con reemplazo por ráster."
              }
            }
          },
          "wilcoxon_signed_rank_test": {
            "name": "Prueba de rangos con signo de Wilcoxon",
            "description": "Realiza una prueba de rangos con signo de Wilcoxon sobre las diferencias ráster pareadas.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Ruta del primer ráster de entrada."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Ruta del segundo ráster de entrada."
              },
              "num_samples": {
                "label": "Número de muestras",
                "description": "Tamaño de muestra opcional con reemplazo."
              }
            }
          },
          "z_scores": {
            "name": "Puntuaciones Z",
            "description": "Estandariza los valores ráster en puntuaciones z usando la media y la desviación estándar globales.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "zonal_statistics": {
            "name": "Estadísticas zonales",
            "description": "Resume los valores de un ráster de datos dentro de las zonas definidas por un ráster de entidades.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de datos de entrada."
              },
              "features": {
                "label": "Entidades",
                "description": "Ruta del ráster de definición de zonas."
              },
              "stat_type": {
                "label": "Tipo de estadístico",
                "description": "Estadístico: 'mean', 'median', 'min', 'max', 'range', 'standard deviation', 'diversity', 'total'. Predeterminado: 'mean'."
              },
              "zero_is_background": {
                "label": "Cero es fondo",
                "description": "Excluir las celdas de la zona 0. Predeterminado: false."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "assess_route": {
            "name": "Evaluar ruta",
            "description": "Segmenta las líneas de ruta y evalúa métricas del terreno por segmento a partir de un DEM.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "routes": {
                "label": "Rutas",
                "description": "Ruta del vectorial de rutas de polilíneas de entrada."
              },
              "search_radius": {
                "label": "Radio de búsqueda",
                "description": "Radio de búsqueda de visibilidad en celdas de malla (predeterminado 15, mínimo 4)."
              },
              "segment_length": {
                "label": "Longitud de segmento",
                "description": "Longitud objetivo de los segmentos de ruta en unidades del mapa (predeterminado 100.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida."
              }
            }
          },
          "breakline_mapping": {
            "name": "Cartografía de líneas de ruptura",
            "description": "Cartografía las líneas de ruptura umbralizando la curvatura (curvedness) transformada logarítmicamente y vectorizando los elementos lineales adelgazados.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "threshold": {
                "label": "Umbral",
                "description": "Umbral mínimo de curvidad logarítmica usado para la extracción de líneas de ruptura (predeterminado 0.8)."
              },
              "min_length": {
                "label": "Longitud mínima",
                "description": "Longitud mínima de las líneas de salida en celdas de malla (predeterminado 3)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida vectorial opcional (predeterminado: .shp temporal)."
              }
            }
          },
          "convergence_index": {
            "name": "Índice de convergencia",
            "description": "Convergencia/divergencia del flujo a partir de la alineación de la orientación local. Identifica valles (convergentes) y crestas (divergentes) sin un enrutamiento de flujo completo. Alternativa eficiente a los algoritmos de dirección de flujo.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de conversión de Z."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional."
              }
            }
          },
          "dem_void_filling": {
            "name": "Relleno de vacíos del MDE",
            "description": "Rellena los vacíos del DEM usando una superficie secundaria y desplazamientos de elevación interpolados para lograr una fusión continua.",
            "params": {
              "fill": {
                "label": "Relleno",
                "description": "Ruta del ráster DEM de relleno u objeto ráster tipado usado para rellenar los vacíos."
              },
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada (con vacíos) u objeto ráster tipado."
              },
              "edge_treatment": {
                "label": "Tratamiento de bordes",
                "description": "Tratamiento del borde del vacío: 'dem', 'fill' o 'average' (predeterminado 'dem')."
              },
              "mean_plane_dist": {
                "label": "Distancia al plano medio",
                "description": "Distancia en celdas desde los bordes del vacío más allá de la cual los desplazamientos se fijan al desplazamiento medio global (predeterminado 20)."
              },
              "weight_value": {
                "label": "Valor de peso",
                "description": "Potencia de interpolación por distancia inversa para la interpolación de desplazamientos cerca del borde (predeterminado 2.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional."
              }
            }
          },
          "deviation_from_mean_elevation": {
            "name": "Desviación respecto a la elevación media",
            "description": "Calcula la puntuación z topográfica local usando la media y la desviación estándar locales.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "filter_size_x": {
                "label": "Tamaño de filtro X",
                "description": "Ancho impar del filtro en celdas (predeterminado 11). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Tamaño de filtro Y",
                "description": "Alto impar del filtro en celdas (predeterminado filter_size_x). Alias: filtery."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado permanece en memoria."
              }
            }
          },
          "difference_from_mean_elevation": {
            "name": "Diferencia respecto a la elevación media",
            "description": "Calcula la diferencia entre cada elevación y la elevación media local.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "filter_size_x": {
                "label": "Tamaño de filtro X",
                "description": "Ancho impar del filtro en celdas (predeterminado 11). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Tamaño de filtro Y",
                "description": "Alto impar del filtro en celdas (predeterminado filter_size_x). Alias: filtery."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado permanece en memoria."
              }
            }
          },
          "directional_relief": {
            "name": "Relieve direccional",
            "description": "Calcula el relieve direccional mediante el trazado de rayos de la elevación en un acimut especificado.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "azimuth": {
                "label": "Acimut",
                "description": "Acimut de la dirección en grados en sentido horario desde el norte."
              },
              "max_dist": {
                "label": "Distancia máxima",
                "description": "Distancia máxima opcional del rayo en unidades del mapa."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional."
              }
            }
          },
          "elev_above_pit": {
            "name": "Elevación sobre el hoyo",
            "description": "Calcula la elevación sobre la celda de hoyo aguas abajo más cercana (o el sumidero de borde).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional."
              }
            }
          },
          "elev_above_pit_dist": {
            "name": "Distancia de elevación sobre el hoyo",
            "description": "Alias de compatibilidad de elev_above_pit.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional."
              }
            }
          },
          "elevation_percentile": {
            "name": "Percentil de elevación",
            "description": "Rango percentil de la elevación local dentro de la vecindad (0-100). Identifica valles (% bajo), crestas (% alto) y laderas (% medio). Métrica de clasificación de las formas del relieve independiente de la elevación absoluta.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "filter_size_x": {
                "label": "Tamaño de filtro X",
                "description": "Ancho impar del filtro en celdas (predeterminado 11). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Tamaño de filtro Y",
                "description": "Alto impar del filtro en celdas (predeterminado filter_size_x). Alias: filtery."
              },
              "sig_digits": {
                "label": "Dígitos significativos",
                "description": "Número de dígitos decimales significativos que se conservan durante la agrupación en intervalos (predeterminado 2)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional."
              }
            }
          },
          "embankment_mapping": {
            "name": "Cartografía de terraplenes",
            "description": "Cartografía los terraplenes de infraestructuras de transporte a partir de un DEM y una red viaria, con eliminación opcional de la superficie del terraplén mediante interpolación. Autores: John Lindsay y Nigel VanNieuwenhuizen.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "roads_vector": {
                "label": "Vectorial de carreteras",
                "description": "Ruta del vectorial de carreteras de entrada (geometría de polilínea)."
              },
              "embankment_max_width": {
                "label": "Ancho máximo de terraplén",
                "description": "Ancho máximo de terraplén en unidades del mapa (predeterminado 60.0)."
              },
              "max_upwards_increment": {
                "label": "Incremento ascendente máximo",
                "description": "Incremento ascendente local máximo permitido durante el crecimiento (predeterminado 0.05)."
              },
              "min_road_width": {
                "label": "Ancho mínimo de carretera",
                "description": "Ancho mínimo cartografiado de carretera en unidades del mapa (predeterminado 6.0)."
              },
              "remove_embankments": {
                "label": "Eliminar terraplenes",
                "description": "Si es verdadero, genera además un DEM con los terraplenes eliminados mediante interpolación local."
              },
              "search_dist": {
                "label": "Distancia de búsqueda",
                "description": "Distancia de reposicionamiento de las semillas de carretera en unidades del mapa (predeterminado 2.5)."
              },
              "spillout_slope": {
                "label": "Pendiente de desbordamiento",
                "description": "Pendiente de desbordamiento máxima en grados para las transiciones cuesta arriba (predeterminado 4.0)."
              },
              "typical_embankment_max_height": {
                "label": "Altura máxima típica de terraplén",
                "description": "Altura máxima típica de terraplén en unidades de elevación (predeterminado 2.0)."
              },
              "typical_embankment_width": {
                "label": "Ancho típico de terraplén",
                "description": "Ancho típico de terraplén en unidades del mapa (predeterminado 30.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional de la máscara de terraplenes."
              },
              "output_dem": {
                "label": "DEM de salida",
                "description": "Ruta de salida opcional del DEM con los terraplenes eliminados cuando remove_embankments=true."
              }
            }
          },
          "exposure_towards_wind_flux": {
            "name": "Exposición al flujo del viento",
            "description": "Calcula la exposición del terreno respecto a la dirección dominante del viento y el apantallamiento del horizonte a barlovento.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "azimuth": {
                "label": "Acimut",
                "description": "Acimut del viento dominante en grados en sentido horario desde el norte."
              },
              "max_dist": {
                "label": "Distancia máxima",
                "description": "Distancia máxima de búsqueda del ángulo de horizonte a barlovento en unidades del mapa."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de escala vertical opcional para DEM proyectados."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional."
              }
            }
          },
          "feature_preserving_smoothing": {
            "name": "Suavizado con preservación de rasgos",
            "description": "Suaviza la rugosidad del DEM conservando las rupturas de pendiente mediante un filtrado de vectores normales.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "filter_size": {
                "label": "Tamaño de filtro",
                "description": "Tamaño impar del filtro en celdas (predeterminado 11)."
              },
              "iterations": {
                "label": "Iteraciones",
                "description": "Número de iteraciones de suavizado (predeterminado 3)."
              },
              "max_elevation_diff": {
                "label": "Diferencia máxima de elevación",
                "description": "Cambio vertical máximo permitido respecto al DEM original (predeterminado inf)."
              },
              "normal_diff_threshold": {
                "label": "Umbral de diferencia de normales",
                "description": "Diferencia angular máxima de las normales en grados (predeterminado 8.0)."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de conversión de z opcional (predeterminado 1.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado permanece en memoria."
              }
            }
          },
          "feature_preserving_smoothing_multiscale": {
            "name": "Suavizado multiescala con preservación de rasgos",
            "description": "Suaviza la rugosidad del DEM con una continuación multiescala de lo grueso a lo fino. Cada escala vuelve a derivar las normales, aplica una difusión robusta adaptativa del campo de normales y reconstruye las elevaciones con una resolución de Poisson apantallada.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "smoothing_amount": {
                "label": "Cantidad de suavizado",
                "description": "Cantidad global de suavizado en [0,1] (predeterminado 0.65). Los valores más altos aumentan el presupuesto de difusión, especialmente en las escalas gruesas."
              },
              "edge_preservation": {
                "label": "Preservación de bordes",
                "description": "Intensidad de preservación de bordes en [0,1] (predeterminado 0.75). Los valores más altos suprimen con más fuerza el suavizado a través de las principales rupturas de pendiente."
              },
              "scale_levels": {
                "label": "Niveles de escala",
                "description": "Número de niveles de la pirámide para el suavizado de grueso a fino (predeterminado 3)."
              },
              "fidelity": {
                "label": "Fidelidad",
                "description": "Peso de fidelidad a los datos en la reconstrucción de Poisson apantallada (predeterminado 0.45). Los valores más altos mantienen el resultado más próximo al DEM de origen."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de conversión de z opcional (predeterminado 1.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado permanece en memoria."
              }
            }
          },
          "fetch_analysis": {
            "name": "Análisis de fetch",
            "description": "Calcula la distancia a barlovento hasta el primer obstáculo topográfico a lo largo de un acimut especificado.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "azimuth": {
                "label": "Acimut",
                "description": "Acimut del viento en grados en sentido horario desde el norte."
              },
              "hgt_inc": {
                "label": "Incremento de altura",
                "description": "Umbral de incremento de altura en m/m (predeterminado 0.05)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional."
              }
            }
          },
          "fill_missing_data": {
            "name": "Rellenar datos faltantes",
            "description": "Rellena los huecos NoData mediante ponderación por distancia inversa a partir de las celdas válidas del borde del hueco.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster de entrada u objeto ráster tipado."
              },
              "exclude_edge_nodata": {
                "label": "Excluir sin datos en bordes",
                "description": "Excluir del relleno las regiones NoData conectadas al borde (predeterminado false). Alias: no_edges."
              },
              "filter_size": {
                "label": "Tamaño de filtro",
                "description": "Radio de búsqueda en celdas de malla (predeterminado 11)."
              },
              "weight": {
                "label": "Peso",
                "description": "Exponente de potencia de la distancia inversa (predeterminado 2.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado permanece en memoria."
              }
            }
          },
          "find_ridges": {
            "name": "Encontrar crestas",
            "description": "Identifica las posibles celdas de cresta y de cumbre en un DEM, con adelgazamiento opcional de líneas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "line_thin": {
                "label": "Adelgazamiento de líneas",
                "description": "Aplicar adelgazamiento iterativo de líneas (predeterminado true)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional."
              }
            }
          },
          "hillshade": {
            "name": "Sombreado del relieve",
            "description": "Visualización de sombreado del relieve direccional con una sola fuente de luz (escala de grises 0-255). Los parámetros de acimut y altitud controlan la dirección de la luz. Visualización rápida del terreno para la inspección de DEM y la presentación de mapas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster DEM de entrada"
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Exageración vertical aplicada a las elevaciones"
              },
              "altitude": {
                "label": "Altitud",
                "description": "Altura de iluminación sobre el horizonte en grados"
              },
              "azimuth": {
                "label": "Acimut",
                "description": "Acimut de iluminación en grados en sentido horario desde el norte"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "hypsometrically_tinted_hillshade": {
            "name": "Sombreado del relieve con tintado hipsométrico",
            "description": "Crea una representación del terreno de estilo suizo combinando un sombreado del relieve con múltiples acimuts, un tintado hipsométrico y una neblina atmosférica opcional.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ruta del ráster DEM de entrada."
              },
              "solar_altitude": {
                "label": "Altitud solar",
                "description": "Altura solar en grados [0, 90]."
              },
              "hillshade_weight": {
                "label": "Peso del sombreado",
                "description": "Peso de mezcla del sombreado del relieve en [0, 1]."
              },
              "brightness": {
                "label": "Brillo",
                "description": "Control de brillo en [0, 1]."
              },
              "atmospheric_effects": {
                "label": "Efectos atmosféricos",
                "description": "Cantidad de bruma atmosférica en [0, 1]."
              },
              "palette": {
                "label": "Paleta",
                "description": "Nombre de la paleta (atlas, high_relief, arid, soft, muted, viridis, dem, grey, white, etc.)."
              },
              "reverse_palette": {
                "label": "Invertir paleta",
                "description": "Invertir el orden de la paleta."
              },
              "full_360_mode": {
                "label": "Modo de 360 grados completo",
                "description": "Usar iluminación de 8 direcciones en lugar del modo de 4 direcciones."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Multiplicador de exageración vertical."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida."
              }
            }
          },
          "local_hypsometric_analysis": {
            "name": "Análisis hipsométrico local",
            "description": "Calcula la integral hipsométrica local mínima a lo largo de un rango de escalas de vecindad muestreado de forma no lineal.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "min_scale": {
                "label": "Escala mínima",
                "description": "Radio mínimo de media ventana en celdas (predeterminado 4)."
              },
              "step_size": {
                "label": "Tamaño de paso",
                "description": "Tamaño de paso base en celdas (predeterminado 1). Alias: step."
              },
              "num_steps": {
                "label": "Número de pasos",
                "description": "Número de escalas que se van a evaluar (predeterminado 10)."
              },
              "step_nonlinearity": {
                "label": "No linealidad del paso",
                "description": "No linealidad del paso de escala en [1,4] (predeterminado 1.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional del ráster del mínimo local de HI."
              },
              "output_scale": {
                "label": "Escala de salida",
                "description": "Ruta de salida opcional del ráster de la escala del HI mínimo."
              }
            }
          },
          "low_points_on_headwater_divides": {
            "name": "Puntos bajos en divisorias de cabecera",
            "description": "Localiza los puntos de paso bajos a lo largo de las divisorias entre subcuencas de cabecera vecinas.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ruta del ráster DEM sin depresiones de entrada u objeto ráster tipado."
              },
              "streams": {
                "label": "Cauces",
                "description": "Ruta del ráster de cauces de entrada (los valores positivos indican celdas de canal)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida vectorial opcional (predeterminado: .shp temporal)."
              }
            }
          },
          "max_downslope_elev_change": {
            "name": "Cambio máximo de elevación aguas abajo",
            "description": "Calcula el descenso máximo de elevación hacia las celdas vecinas más bajas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional."
              }
            }
          },
          "max_upslope_elev_change": {
            "name": "Cambio máximo de elevación aguas arriba",
            "description": "Calcula el ascenso máximo de elevación hacia las celdas vecinas más altas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional."
              }
            }
          },
          "min_downslope_elev_change": {
            "name": "Cambio mínimo de elevación aguas abajo",
            "description": "Calcula el descenso de elevación no negativo mínimo hacia las celdas vecinas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional."
              }
            }
          },
          "multidirectional_hillshade": {
            "name": "Sombreado multidireccional",
            "description": "Sombreado del relieve multidireccional (8+ fuentes de luz) que elimina los artefactos de sombreado de una sola fuente de luz. Visibilidad equilibrada de los elementos en terrenos complejos; preferido para publicaciones y análisis detallados.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster DEM de entrada"
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Exageración vertical aplicada a las elevaciones"
              },
              "altitude": {
                "label": "Altitud",
                "description": "Altura de iluminación sobre el horizonte en grados"
              },
              "full_360_mode": {
                "label": "Modo de 360 grados completo",
                "description": "Combinar 8 fuentes de luz en los 360 grados completos en lugar de las 4 predeterminadas"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida"
              }
            }
          },
          "num_downslope_neighbours": {
            "name": "Número de vecinos aguas abajo",
            "description": "Cuenta el número de celdas de la vecindad de 8 más bajas que cada celda del DEM.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional."
              }
            }
          },
          "num_upslope_neighbours": {
            "name": "Número de vecinos aguas arriba",
            "description": "Cuenta el número de celdas de la vecindad de 8 más altas que cada celda del DEM.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional."
              }
            }
          },
          "profile": {
            "name": "Perfil",
            "description": "Crea un gráfico HTML de perfil de elevación para una o varias entidades de polilínea de entrada muestreadas a partir de un ráster de superficie.",
            "params": {
              "lines_vector": {
                "label": "Vectorial de líneas",
                "description": "Ruta del vectorial de polilíneas de entrada."
              },
              "surface": {
                "label": "Superficie",
                "description": "Ruta del ráster de superficie de entrada u objeto ráster tipado."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del informe HTML de salida."
              }
            }
          },
          "slope_vs_aspect_plot": {
            "name": "Gráfico de pendiente frente a orientación",
            "description": "Crea un gráfico HTML de análisis radial de pendiente frente a orientación para un DEM de entrada.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "aspect_bin_size": {
                "label": "Tamaño de intervalo de orientación",
                "description": "Tamaño de intervalo de orientación en grados (predeterminado 2.0)."
              },
              "min_slope": {
                "label": "Pendiente mínima",
                "description": "Ignorar las pendientes por debajo de este umbral en grados (predeterminado 0.1)."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de escala vertical para los valores de elevación."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del informe HTML de salida."
              }
            }
          },
          "slope_vs_elev_plot": {
            "name": "Gráfico de pendiente frente a elevación",
            "description": "Crea un gráfico HTML de análisis de pendiente frente a elevación para uno o varios DEM.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Rutas de los DEM de entrada como cadena separada por ';' o ',', o como lista."
              },
              "watershed": {
                "label": "Cuenca hidrográfica",
                "description": "Rásteres de cuencas opcionales que se corresponden con cada DEM de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del informe HTML de salida."
              }
            }
          },
          "surface_area_ratio": {
            "name": "Razón de superficie",
            "description": "Relación entre el área de superficie 3D y el área planimétrica (método de Jenness). >1.0=terreno rugoso, ≈1.0=plano. Métrica adimensional de rugosidad que permite comparar el terreno entre regiones.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "topographic_hachures": {
            "name": "Normales topográficas",
            "description": "Crea polilíneas de sombreado por normales (hachures) topográficas a partir de un DEM mediante líneas de flujo aguas abajo y aguas arriba sembradas en las curvas de nivel. Para esta herramienta se conserva intencionadamente la atribución de autoría heredada.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "base": {
                "label": "Base",
                "description": "Elevación de la curva de nivel base (predeterminado 0.0)."
              },
              "depth": {
                "label": "Profundidad",
                "description": "Profundidad de relleno recursivo usada en las áreas divergentes (predeterminado 16)."
              },
              "discretization": {
                "label": "Discretización",
                "description": "Longitud de paso de la línea de flujo en unidades de celda media (predeterminado 0.5)."
              },
              "distmax": {
                "label": "Distancia máxima",
                "description": "Multiplicador de espaciado máximo usado para insertar normales adicionales (predeterminado 2.0)."
              },
              "distmin": {
                "label": "Distancia mínima",
                "description": "Multiplicador de espaciado mínimo usado para truncar las normales próximas (predeterminado 0.5)."
              },
              "interval": {
                "label": "Intervalo",
                "description": "Valor del intervalo de curvas de nivel (predeterminado 10.0)."
              },
              "separation": {
                "label": "Separación",
                "description": "Separación nominal de las semillas de curvas de nivel en unidades de celda media (predeterminado 2.0)."
              },
              "slopemin": {
                "label": "Pendiente mínima",
                "description": "Ángulo mínimo de pendiente en grados para continuar el trazado (predeterminado 0.5)."
              },
              "smooth": {
                "label": "Suavizar",
                "description": "Tamaño del filtro de suavizado de las curvas de nivel (preferiblemente un entero impar, predeterminado 9)."
              },
              "tolerance": {
                "label": "Tolerancia",
                "description": "Ángulo mínimo de curvatura de las curvas de nivel en grados que se conserva durante la simplificación (predeterminado 10.0)."
              },
              "turnmax": {
                "label": "Giro máximo",
                "description": "Ángulo de giro máximo permitido en grados durante el trazado de las normales (predeterminado 45.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "map_off_terrain_objects": {
            "name": "Cartografiar objetos ajenos al terreno",
            "description": "Cartografía los segmentos de objetos sobre el terreno en DSM mediante un crecimiento de regiones restringido por la pendiente y un filtrado opcional por tamaño mínimo de elemento.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DSM de entrada u objeto ráster tipado."
              },
              "max_slope": {
                "label": "Pendiente máxima",
                "description": "Pendiente de conexión máxima en grados [1, 90] (predeterminado inf, limitado a 90)."
              },
              "min_feature_size": {
                "label": "Tamaño mínimo de rasgo",
                "description": "Tamaño mínimo de segmento conservado en celdas (predeterminado 0). Los segmentos más pequeños se asignan a la clase de fondo 1."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado permanece en memoria."
              }
            }
          },
          "remove_off_terrain_objects": {
            "name": "Eliminar objetos ajenos al terreno",
            "description": "Elimina de los DEM los objetos empinados sobre el terreno mediante normalización top-hat blanca, crecimiento de regiones restringido por la pendiente e interpolación local.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "filter_size": {
                "label": "Tamaño de filtro",
                "description": "Ancho máximo esperado del objeto en celdas; se fuerza a un tamaño impar >= 3 (predeterminado 11)."
              },
              "slope_threshold": {
                "label": "Umbral de pendiente",
                "description": "Pendiente mínima del borde del objeto en grados (predeterminado 15.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado permanece en memoria."
              }
            }
          },
          "ridge_and_valley_vectors": {
            "name": "Vectores de crestas y valles",
            "description": "Extrae vectoriales de los ejes de crestas y valles a partir de un DEM.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada."
              },
              "filter_size": {
                "label": "Tamaño de filtro",
                "description": "Tamaño de la vecindad para el percentil de elevación."
              },
              "ep_threshold": {
                "label": "Umbral EP",
                "description": "Umbral de percentil de elevación [5, 50]."
              },
              "slope_threshold": {
                "label": "Umbral de pendiente",
                "description": "Umbral mínimo de pendiente en grados."
              },
              "min_length": {
                "label": "Longitud mínima",
                "description": "Longitud mínima de la línea central en celdas."
              },
              "output_ridges": {
                "label": "Salida de crestas",
                "description": "Ruta de salida de las líneas centrales de las crestas."
              },
              "output_valleys": {
                "label": "Salida de valles",
                "description": "Ruta de salida de las líneas centrales de los valles."
              }
            }
          },
          "smooth_vegetation_residual": {
            "name": "Suavizar el residuo de vegetación",
            "description": "Reduce la rugosidad residual del dosel enmascarando las respuestas DEV locales altas a escalas pequeñas y reinterpolando las elevaciones enmascaradas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "max_scale": {
                "label": "Escala máxima",
                "description": "Radio máximo de media ventana de DEV en celdas (predeterminado 30)."
              },
              "dev_threshold": {
                "label": "Umbral de desviación",
                "description": "Magnitud mínima de DEV usada para marcar las celdas de rugosidad (predeterminado 1.0)."
              },
              "scale_threshold": {
                "label": "Umbral de escala",
                "description": "Escala máxima considerada rugosidad (predeterminado 5)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado permanece en memoria."
              }
            }
          },
          "average_horizon_distance": {
            "name": "Distancia media al horizonte",
            "description": "Calcula la distancia media al horizonte en todas las direcciones de acimut.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ruta del ráster DEM/DSM de entrada."
              },
              "az_fraction": {
                "label": "Fracción de acimut",
                "description": "Paso de acimut en grados [1, 45]."
              },
              "max_dist": {
                "label": "Distancia máxima",
                "description": "Distancia máxima de búsqueda en unidades del mapa."
              },
              "observer_hgt_offset": {
                "label": "Desplazamiento de altura del observador",
                "description": "Desplazamiento de la altura del observador sobre el terreno."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida."
              }
            }
          },
          "horizon_angle": {
            "name": "Ángulo del horizonte",
            "description": "Calcula el ángulo del horizonte (pendiente máxima) a lo largo de una dirección de acimut especificada.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ruta del ráster DEM de entrada."
              },
              "azimuth": {
                "label": "Acimut",
                "description": "Acimut en grados [0, 360)."
              },
              "max_dist": {
                "label": "Distancia máxima",
                "description": "Distancia máxima de búsqueda en unidades del mapa."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida."
              }
            }
          },
          "horizon_area": {
            "name": "Área del horizonte",
            "description": "Calcula el área del polígono del horizonte (hectáreas).",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ruta del ráster DEM/DSM de entrada."
              },
              "az_fraction": {
                "label": "Fracción de acimut",
                "description": "Paso de acimut en grados [1, 45]."
              },
              "max_dist": {
                "label": "Distancia máxima",
                "description": "Distancia máxima de búsqueda en unidades del mapa."
              },
              "observer_hgt_offset": {
                "label": "Desplazamiento de altura del observador",
                "description": "Desplazamiento de la altura del observador sobre el terreno."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida."
              }
            }
          },
          "openness": {
            "name": "Apertura",
            "description": "Apertura topográfica de Yokoyama: métricas de exposición positiva (crestas/cumbres expuestas) y negativa (valles encajados). Clasificación de las formas del relieve y análisis de visibilidad/microclima.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "dist": {
                "label": "Distancia",
                "description": "Distancia de búsqueda en celdas (predeterminado 20)."
              },
              "neg_output": {
                "label": "Salida negativa",
                "description": "Ruta de salida opcional de la apertura negativa."
              },
              "pos_output": {
                "label": "Salida positiva",
                "description": "Ruta de salida opcional de la apertura positiva."
              }
            }
          },
          "shadow_animation": {
            "name": "Animación de sombras",
            "description": "Crea un visor HTML interactivo y un GIF animado que muestran las sombras del terreno a lo largo de un día.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ruta del ráster DEM/DSM de entrada."
              },
              "date": {
                "label": "Fecha",
                "description": "Fecha en formato DD/MM/YYYY."
              },
              "delay": {
                "label": "Retardo",
                "description": "Retardo por fotograma del GIF en milisegundos."
              },
              "image_height": {
                "label": "Alto de imagen",
                "description": "Alto de la imagen mostrada en píxeles."
              },
              "label": {
                "label": "Etiqueta",
                "description": "Etiqueta opcional mostrada en el visor."
              },
              "location": {
                "label": "Ubicación",
                "description": "Cadena de ubicación LAT/LON/UTC_OFFSET, p. ej. 43.5448/-80.2482/-4."
              },
              "max_dist": {
                "label": "Distancia máxima",
                "description": "Distancia máxima de búsqueda del horizonte en unidades del mapa."
              },
              "palette": {
                "label": "Paleta",
                "description": "Nombre de la paleta hipsométrica (p. ej. soft, atlas, high_relief, turbo, viridis, dem, grey, white)."
              },
              "time_interval": {
                "label": "Intervalo de tiempo",
                "description": "Intervalo entre fotogramas en minutos [1, 60]."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del HTML de salida."
              }
            }
          },
          "shadow_image": {
            "name": "Imagen de sombras",
            "description": "Genera un ráster de intensidad de las sombras del terreno para una fecha, una hora y una ubicación especificadas.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ruta del ráster DEM/DSM de entrada."
              },
              "date": {
                "label": "Fecha",
                "description": "Fecha en formato DD/MM/YYYY."
              },
              "location": {
                "label": "Ubicación",
                "description": "Cadena de ubicación LAT/LON/UTC_OFFSET, p. ej. 43.5448/-80.2482/-4."
              },
              "max_dist": {
                "label": "Distancia máxima",
                "description": "Distancia máxima de búsqueda del horizonte en unidades del mapa."
              },
              "palette": {
                "label": "Paleta",
                "description": "Nombre de la paleta hipsométrica (p. ej. soft, atlas, high_relief, turbo, viridis, dem, grey, white)."
              },
              "time": {
                "label": "Hora",
                "description": "Hora local en formato HH:MM o HH:MMAM/HH:MMPM."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "sky_view_factor": {
            "name": "Factor de vista del cielo",
            "description": "Calcula la proporción de cielo visible a partir de un DEM/DSM.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ruta del ráster DEM/DSM de entrada."
              },
              "az_fraction": {
                "label": "Fracción de acimut",
                "description": "Paso de acimut en grados [1, 45]."
              },
              "max_dist": {
                "label": "Distancia máxima",
                "description": "Distancia máxima de búsqueda en unidades del mapa."
              },
              "observer_hgt_offset": {
                "label": "Desplazamiento de altura del observador",
                "description": "Desplazamiento de la altura del observador sobre el terreno."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida."
              }
            }
          },
          "skyline_analysis": {
            "name": "Análisis de la línea del horizonte",
            "description": "Realiza un análisis de la línea del horizonte para uno o varios puntos de observación y escribe una traza vectorial del horizonte junto con un informe HTML.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ruta del ráster DEM/DSM de entrada."
              },
              "points": {
                "label": "Puntos",
                "description": "Ruta del vectorial de puntos de entrada."
              },
              "az_fraction": {
                "label": "Fracción de acimut",
                "description": "Paso de acimut en grados [0.01, 45]."
              },
              "max_dist": {
                "label": "Distancia máxima",
                "description": "Distancia máxima de búsqueda en unidades del mapa."
              },
              "observer_hgt_offset": {
                "label": "Desplazamiento de altura del observador",
                "description": "Desplazamiento de la altura del observador sobre el terreno."
              },
              "output_as_polygons": {
                "label": "Salida como polígonos",
                "description": "Escribir los horizontes como polígonos en lugar de polilíneas."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              },
              "output_html": {
                "label": "Salida HTML",
                "description": "Ruta opcional del informe HTML."
              }
            }
          },
          "time_in_daylight": {
            "name": "Tiempo con luz diurna",
            "description": "Calcula la proporción del día en que cada celda está iluminada (sin sombra del terreno/de objetos).",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ruta del ráster DEM/DSM de entrada."
              },
              "az_fraction": {
                "label": "Fracción de acimut",
                "description": "Tamaño de intervalo de acimut en grados (0, 360)."
              },
              "end_day": {
                "label": "Día final",
                "description": "Día del año final (1..366)."
              },
              "end_time": {
                "label": "Hora final",
                "description": "Hora final HH:MM:SS o 'sunset'."
              },
              "latitude": {
                "label": "Latitud",
                "description": "Latitud opcional en grados que sustituye a la calculada; en caso contrario se infiere del CRS del DEM."
              },
              "longitude": {
                "label": "Longitud",
                "description": "Longitud opcional en grados que sustituye a la calculada; en caso contrario se infiere del CRS del DEM."
              },
              "max_dist": {
                "label": "Distancia máxima",
                "description": "Distancia máxima de búsqueda del horizonte en unidades del mapa."
              },
              "start_day": {
                "label": "Día inicial",
                "description": "Día del año inicial (1..366)."
              },
              "start_time": {
                "label": "Hora de inicio",
                "description": "Hora inicial HH:MM:SS o 'sunrise'."
              },
              "utc_offset": {
                "label": "Desfase UTC",
                "description": "Cadena opcional de desfase UTC como UTC+00:00; si se omite, se estima a partir de la longitud central."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida."
              }
            }
          },
          "viewshed": {
            "name": "Cuenca visual",
            "description": "Calcula los recuentos de visibilidad de las estaciones a partir de estaciones puntuales sobre un DEM.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "stations": {
                "label": "Estaciones",
                "description": "Archivo vectorial de puntos de entrada con las estaciones de observación."
              },
              "height": {
                "label": "Altura",
                "description": "Altura de la estación de observación sobre el suelo en unidades z del DEM (predeterminado 2.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional."
              }
            }
          },
          "visibility_index": {
            "name": "Índice de visibilidad",
            "description": "Calcula un índice de visibilidad basado en la topografía a partir de cuencas visuales muestreadas.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ruta del ráster DEM de entrada."
              },
              "max_dist": {
                "label": "Distancia máxima",
                "description": "Distancia máxima de búsqueda de visibilidad en unidades del mapa."
              },
              "resolution_factor": {
                "label": "Factor de resolución",
                "description": "Factor de resolución de muestreo [1, 25]."
              },
              "station_height": {
                "label": "Altura de estación",
                "description": "Altura del observador sobre el suelo."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida."
              }
            }
          },
          "accumulation_curvature": {
            "name": "Curvatura de acumulación",
            "description": "Calcula la curvatura de acumulación a partir de un DEM.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de conversión de z opcional (predeterminado 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Transformación logarítmica",
                "description": "Transformación logarítmica opcional de los valores de salida (predeterminado false). Alias: log."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "aspect": {
            "name": "Orientación",
            "description": "Dirección de la pendiente máxima (0°=N, 90°=E, 180°=S, 270°=O). Fundamental para el análisis de la radiación solar, los patrones de vegetación, el microclima y la exposición.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de conversión de Z."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional."
              }
            }
          },
          "casorati_curvature": {
            "name": "Curvatura de Casorati",
            "description": "Calcula la curvatura de Casorati a partir de un DEM.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de conversión de z opcional (predeterminado 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Transformación logarítmica",
                "description": "Transformación logarítmica opcional de los valores de salida (predeterminado false). Alias: log."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "curvedness": {
            "name": "Curvidad",
            "description": "Calcula el descriptor de forma de superficie curvedness a partir de un DEM.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de conversión de z opcional (predeterminado 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Transformación logarítmica",
                "description": "Transformación logarítmica opcional de los valores de salida (predeterminado false). Alias: log."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "difference_curvature": {
            "name": "Curvatura de diferencia",
            "description": "Calcula la curvatura diferencial a partir de un DEM.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de conversión de z opcional (predeterminado 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Transformación logarítmica",
                "description": "Transformación logarítmica opcional de los valores de salida (predeterminado false). Alias: log."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "gaussian_curvature": {
            "name": "Curvatura gaussiana",
            "description": "Calcula la curvatura gaussiana (intrínseca) (producto de las curvaturas principales). Indica la topología local de la superficie: positiva (cuenco/cúpula), negativa (silla de montar), cero (cilíndrica). Clasifica el terreno en categorías de formas del relieve: elementos convexos (crestas), elementos cóncavos (valles), elementos de silla (collados/pasos). Se utiliza en la clasificación avanzada de formas del relieve.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de conversión de z opcional cuando las unidades verticales y horizontales difieren (predeterminado 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Transformación logarítmica",
                "description": "Transformación logarítmica opcional de los valores de salida para mejorar la legibilidad (predeterminado false). Alias: log."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "generating_function": {
            "name": "Función generatriz",
            "description": "Calcula la función generadora a partir de un DEM.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de conversión de z opcional (predeterminado 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Transformación logarítmica",
                "description": "Transformación logarítmica opcional de los valores de salida (predeterminado false). Alias: log."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "horizontal_excess_curvature": {
            "name": "Curvatura de exceso horizontal",
            "description": "Calcula la curvatura de exceso horizontal a partir de un DEM.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de conversión de z opcional (predeterminado 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Transformación logarítmica",
                "description": "Transformación logarítmica opcional de los valores de salida (predeterminado false). Alias: log."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "maximal_curvature": {
            "name": "Curvatura máxima",
            "description": "Calcula la curvatura máxima (principal máxima) a partir de un DEM.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de conversión de z opcional (predeterminado 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Transformación logarítmica",
                "description": "Transformación logarítmica opcional de los valores de salida (predeterminado false). Alias: log."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "mean_curvature": {
            "name": "Curvatura media",
            "description": "Calcula la curvatura media (promedio de las curvaturas principales). Relacionada con la curvatura total, pero resalta la suavidad de la superficie. Los valores cercanos a 0 indican un terreno suave; los valores altos indican cambios bruscos de curvatura. Útil para la caracterización de superficies y la detección de líneas de ruptura.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de conversión de z opcional cuando las unidades verticales y horizontales difieren (predeterminado 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Transformación logarítmica",
                "description": "Transformación logarítmica opcional de los valores de salida para mejorar la legibilidad (predeterminado false). Alias: log."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "minimal_curvature": {
            "name": "Curvatura mínima",
            "description": "Calcula la curvatura mínima (principal mínima) a partir de un DEM.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de conversión de z opcional (predeterminado 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Transformación logarítmica",
                "description": "Transformación logarítmica opcional de los valores de salida (predeterminado false). Alias: log."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "plan_curvature": {
            "name": "Curvatura de plano",
            "description": "Calcula la curvatura en planta (de curvas de nivel), que mide la convergencia/divergencia del flujo a través de las curvas de nivel. Los valores positivos (convergentes) indican concentración del flujo hacia el centro (cóncavo); los valores negativos (divergentes) indican dispersión del flujo desde el centro (convexo). Identifica las zonas de concentración lateral del flujo (valles) frente a las zonas de dispersión (crestas). Esencial para predecir la distribución de la humedad del suelo y la susceptibilidad a los deslizamientos de tierra.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de conversión de z opcional cuando las unidades verticales y horizontales difieren (predeterminado 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Transformación logarítmica",
                "description": "Transformación logarítmica opcional de los valores de salida para mejorar la legibilidad (predeterminado false). Alias: log."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "principal_curvature_direction": {
            "name": "Dirección de la curvatura principal",
            "description": "Calcula el ángulo de dirección de la curvatura principal (grados).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de conversión de z opcional (predeterminado 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Transformación logarítmica",
                "description": "Transformación logarítmica opcional de los valores de salida (predeterminado false). Alias: log."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "profile_curvature": {
            "name": "Curvatura de perfil",
            "description": "Calcula la curvatura en perfil (aguas abajo), que mide la aceleración/deceleración del flujo a lo largo de la dirección de la pendiente. Los valores positivos (cóncavos) indican zonas de aceleración del flujo (erosivas); los valores negativos (convexos) indican zonas de deceleración del flujo (de sedimentación). Revela la forma de la ladera: cóncava (fondos de valle, erosión), convexa (crestas, eliminación de material), lineal (de transición).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de conversión de z opcional cuando las unidades verticales y horizontales difieren (predeterminado 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Transformación logarítmica",
                "description": "Transformación logarítmica opcional de los valores de salida para mejorar la legibilidad (predeterminado false). Alias: log."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "relative_aspect": {
            "name": "Orientación relativa",
            "description": "Calcula la orientación del terreno respecto a un acimut especificado por el usuario (de 0 a 180 grados).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "azimuth": {
                "label": "Acimut",
                "description": "Acimut de referencia en grados en sentido horario desde el norte."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de escala vertical opcional."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional."
              }
            }
          },
          "ring_curvature": {
            "name": "Curvatura de anillo",
            "description": "Calcula la curvatura anular (torsión de las líneas de flujo al cuadrado) a partir de un DEM.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de conversión de z opcional (predeterminado 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Transformación logarítmica",
                "description": "Transformación logarítmica opcional de los valores de salida (predeterminado false). Alias: log."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "rotor": {
            "name": "Rotor",
            "description": "Calcula el rotor (torsión de las líneas de flujo) a partir de un DEM.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de conversión de z opcional (predeterminado 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Transformación logarítmica",
                "description": "Transformación logarítmica opcional de los valores de salida (predeterminado false). Alias: log."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "shape_index": {
            "name": "Índice de forma",
            "description": "Calcula el descriptor de forma de superficie índice de forma (shape index) a partir de un DEM.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de conversión de z opcional (predeterminado 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Transformación logarítmica",
                "description": "Transformación logarítmica opcional de los valores de salida (predeterminado false). Alias: log."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "slope": {
            "name": "Pendiente",
            "description": "Pendiente de Zevenbergen-Thorne (grados/radianes/porcentaje). Métrica geomorfométrica fundamental; entrada para cálculos posteriores de curvatura, dirección de flujo, sombreado y visibilidad.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "units": {
                "label": "Unidades",
                "description": "Unidades de salida: degrees, radians, percent."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de conversión de Z."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional."
              }
            }
          },
          "tangential_curvature": {
            "name": "Curvatura tangencial",
            "description": "Calcula la curvatura tangencial (componente en dirección E-O), similar a la curvatura en planta pero direccional. Se utiliza para una caracterización completa de la curvatura que capta la divergencia lateral del flujo perpendicular a la dirección de la pendiente. Suele combinarse con la curvatura en perfil para una comprensión completa de la curvatura 3D.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de conversión de z opcional cuando las unidades verticales y horizontales difieren (predeterminado 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Transformación logarítmica",
                "description": "Transformación logarítmica opcional de los valores de salida para mejorar la legibilidad (predeterminado false). Alias: log."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "total_curvature": {
            "name": "Curvatura total",
            "description": "Calcula la curvatura total (media cuadrática de las curvaturas principales). Métrica escalar independiente de la dirección. Los valores altos indican un terreno muy curvado (cumbres, hoyos); los valores bajos indican un terreno plano. Útil como métrica adimensional de rugosidad para la clasificación del terreno y la detección de anomalías.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de conversión de z opcional cuando las unidades verticales y horizontales difieren (predeterminado 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Transformación logarítmica",
                "description": "Transformación logarítmica opcional de los valores de salida para mejorar la legibilidad (predeterminado false). Alias: log."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "unsphericity": {
            "name": "No esfericidad",
            "description": "Calcula la curvatura de no esfericidad (la mitad de la diferencia de las curvaturas principales) a partir de un DEM.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de conversión de z opcional (predeterminado 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Transformación logarítmica",
                "description": "Transformación logarítmica opcional de los valores de salida (predeterminado false). Alias: log."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "vertical_excess_curvature": {
            "name": "Curvatura de exceso vertical",
            "description": "Calcula la curvatura de exceso vertical a partir de un DEM.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de conversión de z opcional (predeterminado 1.0). Alias: zfactor."
              },
              "log_transform": {
                "label": "Transformación logarítmica",
                "description": "Transformación logarítmica opcional de los valores de salida (predeterminado false). Alias: log."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "average_normal_vector_angular_deviation": {
            "name": "Desviación angular media del vector normal",
            "description": "Calcula la desviación angular media local entre las normales de la superficie original y de la suavizada.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "filter_size": {
                "label": "Tamaño de filtro",
                "description": "Tamaño impar de la vecindad en celdas (predeterminado 11). Alias: filter."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de escala vertical opcional."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional."
              }
            }
          },
          "circular_variance_of_aspect": {
            "name": "Varianza circular de la orientación",
            "description": "Calcula la varianza circular local de la orientación dentro de una vecindad móvil.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "filter": {
                "label": "Filtro",
                "description": "Tamaño impar de la vecindad en celdas (predeterminado 11)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional."
              }
            }
          },
          "edge_density": {
            "name": "Densidad de bordes",
            "description": "Calcula la densidad local de rupturas de pendiente mediante las diferencias angulares de los vectores normales.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "filter_size": {
                "label": "Tamaño de filtro",
                "description": "Tamaño impar de la vecindad en celdas (predeterminado 11). Alias: filter."
              },
              "norm_diff": {
                "label": "Diferencia de normales",
                "description": "Umbral angular del vector normal en grados (predeterminado 5)."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de escala vertical opcional."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional."
              }
            }
          },
          "ruggedness_index": {
            "name": "Índice de escabrosidad",
            "description": "Rugosidad del terreno mediante el TRI de Riley (suma de las diferencias de elevación al cuadrado). Métrica de clasificación del terreno independiente de la escala: baja=llanuras suaves, alta=montañas abruptas. Cartografía ecológica y geomorfológica de las formas del relieve.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "spherical_std_dev_of_normals": {
            "name": "Desviación estándar esférica de las normales",
            "description": "Calcula la desviación estándar esférica de las normales de la superficie local.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "filter_size": {
                "label": "Tamaño de filtro",
                "description": "Tamaño impar de la vecindad en celdas (predeterminado 11). Alias: filter."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de escala vertical opcional."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional."
              }
            }
          },
          "standard_deviation_of_slope": {
            "name": "Desviación estándar de la pendiente",
            "description": "Calcula la desviación estándar local de la pendiente como métrica de rugosidad del terreno.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "filter_size": {
                "label": "Tamaño de filtro",
                "description": "Tamaño impar del filtro en celdas (predeterminado 11)."
              },
              "filter_size_x": {
                "label": "Tamaño de filtro X",
                "description": "Ancho impar del filtro en celdas (predeterminado filter_size). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Tamaño de filtro Y",
                "description": "Alto impar del filtro en celdas (predeterminado filter_size). Alias: filtery."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de conversión de Z cuando las unidades verticales y horizontales difieren (predeterminado 1.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado permanece en memoria."
              }
            }
          },
          "elev_relative_to_min_max": {
            "name": "Elevación relativa al mín-máx",
            "description": "Expresa cada elevación como un porcentaje (0–100) del rango de elevación del ráster.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "geomorphons": {
            "name": "Geomorfones",
            "description": "Clasifica las formas del relieve mediante patrones ternarios de línea de visión en 8 direcciones derivados de comparaciones de ángulos cenitales y nadirales, o en 10 formas de geomorfón comunes.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "analyze_residuals": {
                "label": "Analizar residuos",
                "description": "Si es verdadero, elimina la tendencia del DEM mediante un plano lineal ajustado antes de la clasificación."
              },
              "flatness_distance": {
                "label": "Distancia de planicidad",
                "description": "Distancia en celdas a partir de la cual el umbral de planitud disminuye con la distancia al horizonte (predeterminado 0)."
              },
              "flatness_threshold": {
                "label": "Umbral de planicidad",
                "description": "Umbral de planitud en grados (predeterminado 1.0), aplicado a la diferencia angular cenit-nadir."
              },
              "output_forms": {
                "label": "Salida de formas",
                "description": "Si es verdadero, genera las 10 clases comunes de formas del terreno; en caso contrario, genera el código ternario bruto del geomorfón ordenado en sentido antihorario desde el este."
              },
              "search_distance": {
                "label": "Distancia de búsqueda",
                "description": "Distancia máxima de consulta en celdas por dirección (predeterminado 50); se incluye la celda del extremo."
              },
              "skip_distance": {
                "label": "Distancia de omisión",
                "description": "Distancia en celdas que se omite antes de evaluar la línea de visión (predeterminado 0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional."
              }
            }
          },
          "hypsometric_analysis": {
            "name": "Análisis hipsométrico",
            "description": "Crea un informe HTML de curva hipsométrica (área-elevación) para uno o varios DEM.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Rutas de los DEM de entrada como cadena separada por ';' o ',', o como lista."
              },
              "watershed": {
                "label": "Cuenca hidrográfica",
                "description": "Rásteres de cuencas opcionales que se corresponden con cada DEM de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del informe HTML de salida."
              }
            }
          },
          "multiscale_topographic_position_class": {
            "name": "Clase de posición topográfica multiescala",
            "description": "Clasifica cada celda del DEM en un sistema de posición topográfica relativa amplia/local de nueve clases usando dos mosaicos de escala DEVmax.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "local_min_scale": {
                "label": "Escala mínima local",
                "description": "Radio mínimo de media ventana en celdas para el rango de escala local (predeterminado 5)."
              },
              "local_max_scale": {
                "label": "Escala máxima local",
                "description": "Radio máximo de media ventana en celdas para el rango de escala local (predeterminado 80)."
              },
              "local_step_size": {
                "label": "Tamaño de paso local",
                "description": "Incremento de escala en celdas para el rango de escala local (predeterminado 1). Alias: local_step."
              },
              "broad_min_scale": {
                "label": "Escala mínima amplia",
                "description": "Radio mínimo de media ventana en celdas para el rango de escala amplia (predeterminado 500)."
              },
              "broad_max_scale": {
                "label": "Escala máxima amplia",
                "description": "Radio máximo de media ventana en celdas para el rango de escala amplia (predeterminado 2000)."
              },
              "broad_step_size": {
                "label": "Tamaño de paso amplio",
                "description": "Incremento de escala en celdas para el rango de escala amplia (predeterminado 20). Alias: broad_step."
              },
              "local_threshold": {
                "label": "Umbral local",
                "description": "Umbral de DEV usado para clasificar el mosaico de escala local en los estados de hondonada, posición intermedia y loma (predeterminado 0.5)."
              },
              "broad_threshold": {
                "label": "Umbral amplio",
                "description": "Umbral de DEV usado para clasificar el mosaico de escala amplia en los estados de tierras bajas, intermedias y tierras altas (predeterminado 0.5)."
              },
              "min_patch_size": {
                "label": "Tamaño mínimo de parche",
                "description": "Tamaño mínimo de parche opcional en celdas para el filtrado de parches posterior a la clasificación (predeterminado 0, desactivado)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional del ráster categórico de nueve clases."
              },
              "output_confidence": {
                "label": "Salida de confianza",
                "description": "Ruta de salida opcional de un ráster de confianza en el rango [0, 1]."
              }
            }
          },
          "pennock_landform_classification": {
            "name": "Clasificación de formas del terreno de Pennock",
            "description": "Clasifica los elementos de las formas del relieve en las siete clases de terreno de Pennock et al. (1987).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "plan_curv_threshold": {
                "label": "Umbral de curvatura en planta",
                "description": "Umbral de curvatura plana en grados (predeterminado 0.0)."
              },
              "prof_curv_threshold": {
                "label": "Umbral de curvatura de perfil",
                "description": "Umbral de curvatura de perfil en grados (predeterminado 0.1)."
              },
              "slope_threshold": {
                "label": "Umbral de pendiente",
                "description": "Umbral de pendiente en grados (predeterminado 3.0)."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de escala vertical opcional (si es < 0 y el CRS es geográfico, se estima a partir de la latitud media)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional."
              }
            }
          },
          "percent_elev_range": {
            "name": "Porcentaje del rango de elevación",
            "description": "Calcula la posición topográfica local como porcentaje del rango de elevación de la vecindad.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "filter_size_x": {
                "label": "Tamaño de filtro X",
                "description": "Ancho impar del filtro en celdas (predeterminado 11). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Tamaño de filtro Y",
                "description": "Alto impar del filtro en celdas (predeterminado filter_size_x). Alias: filtery."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional."
              }
            }
          },
          "relative_topographic_position": {
            "name": "Posición topográfica relativa",
            "description": "Calcula la RTP usando los valores de elevación mínimo, medio y máximo de la vecindad.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "filter_size_x": {
                "label": "Tamaño de filtro X",
                "description": "Ancho impar del filtro en celdas (predeterminado 11). Alias: filterx."
              },
              "filter_size_y": {
                "label": "Tamaño de filtro Y",
                "description": "Alto impar del filtro en celdas (predeterminado filter_size_x). Alias: filtery."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional."
              }
            }
          },
          "max_anisotropy_dev": {
            "name": "Desviación de anisotropía máxima",
            "description": "Calcula la anisotropía máxima de la desviación de la elevación a lo largo de un rango de escalas de vecindad. Autor: Dan Newman.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "min_scale": {
                "label": "Escala mínima",
                "description": "Radio mínimo de media ventana en celdas (predeterminado 3)."
              },
              "max_scale": {
                "label": "Escala máxima",
                "description": "Radio máximo de media ventana en celdas (predeterminado 100)."
              },
              "step_size": {
                "label": "Tamaño de paso",
                "description": "Incremento de escala en celdas (predeterminado 2). Alias: step."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional del ráster de magnitud de anisotropía."
              },
              "output_scale": {
                "label": "Escala de salida",
                "description": "Ruta de salida opcional del ráster que almacena la escala de respuesta máxima."
              }
            }
          },
          "max_anisotropy_dev_signature": {
            "name": "Firma de desviación de anisotropía máxima",
            "description": "Calcula firmas de anisotropía multiescala para los sitios puntuales de entrada y escribe un informe HTML. Autor: Dan Newman.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada."
              },
              "points": {
                "label": "Puntos",
                "description": "Ruta del archivo vectorial de puntos o multipuntos de entrada."
              },
              "min_scale": {
                "label": "Escala mínima",
                "description": "Radio mínimo de media ventana en celdas (predeterminado 1)."
              },
              "max_scale": {
                "label": "Escala máxima",
                "description": "Radio máximo de media ventana en celdas (predeterminado 100)."
              },
              "step_size": {
                "label": "Tamaño de paso",
                "description": "Incremento de escala en celdas (predeterminado 1). Alias: step."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional del informe HTML de firmas."
              }
            }
          },
          "max_difference_from_mean": {
            "name": "Diferencia máxima respecto a la media",
            "description": "Calcula la diferencia absoluta máxima respecto a la media a lo largo de un rango de escalas de vecindad.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "min_scale": {
                "label": "Escala mínima",
                "description": "Radio mínimo de media ventana en celdas (predeterminado 1)."
              },
              "max_scale": {
                "label": "Escala máxima",
                "description": "Radio máximo de media ventana en celdas (predeterminado 100)."
              },
              "step_size": {
                "label": "Tamaño de paso",
                "description": "Incremento de escala en celdas (predeterminado 1). Alias: step."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional del ráster de magnitud de diferencia máxima."
              },
              "output_scale": {
                "label": "Escala de salida",
                "description": "Ruta de salida opcional del ráster que almacena la escala de respuesta máxima."
              }
            }
          },
          "max_elevation_deviation": {
            "name": "Desviación máxima de elevación",
            "description": "Calcula la desviación de elevación estandarizada máxima (DEVmax) a lo largo de un rango de escalas de vecindad.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "min_scale": {
                "label": "Escala mínima",
                "description": "Radio mínimo de media ventana en celdas (predeterminado 1)."
              },
              "max_scale": {
                "label": "Escala máxima",
                "description": "Radio máximo de media ventana en celdas (predeterminado 100)."
              },
              "step_size": {
                "label": "Tamaño de paso",
                "description": "Incremento de escala en celdas (predeterminado 1). Alias: step."
              },
              "min_vertical": {
                "label": "Mínimo vertical",
                "description": "Umbral mínimo de desviación estándar local; se suprimen las respuestas de relieve más débil (predeterminado 0.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional del ráster de magnitud de DEVmax."
              },
              "output_scale": {
                "label": "Escala de salida",
                "description": "Ruta de salida opcional del ráster que almacena la escala de respuesta máxima."
              }
            }
          },
          "max_elev_dev_signature": {
            "name": "Firma de desviación máxima de elevación",
            "description": "Calcula firmas multiescala de desviación de la elevación para los sitios puntuales de entrada y escribe un informe HTML.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada."
              },
              "points": {
                "label": "Puntos",
                "description": "Ruta del archivo vectorial de puntos o multipuntos de entrada."
              },
              "min_scale": {
                "label": "Escala mínima",
                "description": "Radio mínimo de media ventana en celdas (predeterminado 1)."
              },
              "max_scale": {
                "label": "Escala máxima",
                "description": "Radio máximo de media ventana en celdas (predeterminado 100)."
              },
              "step_size": {
                "label": "Tamaño de paso",
                "description": "Incremento de escala en celdas (predeterminado 10). Alias: step."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional del informe HTML de firmas."
              }
            }
          },
          "multiscale_curvatures": {
            "name": "Curvaturas multiescala",
            "description": "Calcula curvaturas multiescala e índices basados en la curvatura a partir de un DEM.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado. Alias: dem."
              },
              "curv_type": {
                "label": "Tipo de curvatura",
                "description": "Tipo de curvatura."
              },
              "out_mag": {
                "label": "Magnitud de salida",
                "description": "Ruta de salida opcional de la magnitud. Alias: output."
              },
              "out_scale": {
                "label": "Escala de salida",
                "description": "Ruta de salida opcional de la escala cuando num_steps > 1."
              },
              "min_scale": {
                "label": "Escala mínima",
                "description": "Radio mínimo de la vecindad de búsqueda en celdas de malla."
              },
              "step": {
                "label": "Paso",
                "description": "Tamaño de paso."
              },
              "num_steps": {
                "label": "Número de pasos",
                "description": "Número de pasos de escala muestreados."
              },
              "step_nonlinearity": {
                "label": "No linealidad del paso",
                "description": "Factor de no linealidad del paso."
              },
              "log_transform": {
                "label": "Transformación logarítmica",
                "description": "Aplicar una transformación logarítmica con signo. Alias: log."
              },
              "standardize": {
                "label": "Estandarizar",
                "description": "Estandarizar cada escala a puntuaciones z."
              }
            }
          },
          "multiscale_elevated_index": {
            "name": "Índice multiescala de elevación",
            "description": "Calcula rásteres del índice de elevación multiescala (MsEI) y de escala clave usando los residuos del espacio de escalas gaussiano.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "min_scale": {
                "label": "Escala mínima",
                "description": "Radio de búsqueda mínimo en celdas de malla (predeterminado 2)."
              },
              "num_steps": {
                "label": "Número de pasos",
                "description": "Número de escalas que se van a evaluar (predeterminado 100)."
              },
              "step_nonlinearity": {
                "label": "No linealidad del paso",
                "description": "No linealidad del paso de escala en [1,4] (predeterminado 1.1)."
              },
              "step_size": {
                "label": "Tamaño de paso",
                "description": "Tamaño de paso base en celdas (predeterminado 1). Alias: step."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional del ráster de índice."
              },
              "output_scale": {
                "label": "Escala de salida",
                "description": "Ruta de salida opcional del ráster de escala clave."
              }
            }
          },
          "multiscale_elevation_percentile": {
            "name": "Percentil de elevación multiescala",
            "description": "Calcula el percentil de elevación local más extremo a lo largo de un rango de escalas de vecindad.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "min_scale": {
                "label": "Escala mínima",
                "description": "Radio mínimo de media ventana en celdas (predeterminado 4)."
              },
              "num_steps": {
                "label": "Número de pasos",
                "description": "Número de escalas que se van a evaluar (predeterminado 10)."
              },
              "step_size": {
                "label": "Tamaño de paso",
                "description": "Incremento de escala en celdas (predeterminado 1). Alias: step."
              },
              "step_nonlinearity": {
                "label": "No linealidad del paso",
                "description": "Exponente de escalado no lineal; >1.0 agrupa las escalas hacia resoluciones más finas (predeterminado 1.0)."
              },
              "sig_digits": {
                "label": "Dígitos significativos",
                "description": "Dígitos decimales significativos usados durante la agrupación en intervalos por percentiles (predeterminado 3)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional del ráster de magnitud de percentil."
              },
              "output_scale": {
                "label": "Escala de salida",
                "description": "Ruta de salida opcional del ráster que almacena la escala de la respuesta de percentil más extrema."
              }
            }
          },
          "multiscale_low_lying_index": {
            "name": "Índice multiescala de zonas bajas",
            "description": "Calcula rásteres del índice de zonas bajas multiescala (MsLLI) y de escala clave usando los residuos del espacio de escalas gaussiano.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "min_scale": {
                "label": "Escala mínima",
                "description": "Radio de búsqueda mínimo en celdas de malla (predeterminado 2)."
              },
              "num_steps": {
                "label": "Número de pasos",
                "description": "Número de escalas que se van a evaluar (predeterminado 100)."
              },
              "step_nonlinearity": {
                "label": "No linealidad del paso",
                "description": "No linealidad del paso de escala en [1,4] (predeterminado 1.1)."
              },
              "step_size": {
                "label": "Tamaño de paso",
                "description": "Tamaño de paso base en celdas (predeterminado 1). Alias: step."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional del ráster de índice."
              },
              "output_scale": {
                "label": "Escala de salida",
                "description": "Ruta de salida opcional del ráster de escala clave."
              }
            }
          },
          "multiscale_roughness": {
            "name": "Rugosidad multiescala",
            "description": "Calcula la rugosidad de la superficie a lo largo de un rango de escalas de vecindad.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "min_scale": {
                "label": "Escala mínima",
                "description": "Radio mínimo de media ventana en celdas (predeterminado 1)."
              },
              "max_scale": {
                "label": "Escala máxima",
                "description": "Radio máximo de media ventana en celdas (predeterminado 100)."
              },
              "step_size": {
                "label": "Tamaño de paso",
                "description": "Incremento de escala en celdas (predeterminado 1). Alias: step."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de conversión de Z cuando las unidades verticales y horizontales difieren (predeterminado 1.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional del ráster de magnitud de rugosidad."
              },
              "output_scale": {
                "label": "Escala de salida",
                "description": "Ruta de salida opcional del ráster que almacena la escala de respuesta máxima."
              }
            }
          },
          "multiscale_roughness_signature": {
            "name": "Firma de rugosidad multiescala",
            "description": "Calcula firmas de rugosidad multiescala para los sitios puntuales de entrada y escribe un informe HTML.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada."
              },
              "points": {
                "label": "Puntos",
                "description": "Ruta del archivo vectorial de puntos o multipuntos de entrada."
              },
              "min_scale": {
                "label": "Escala mínima",
                "description": "Radio mínimo de media ventana en celdas (predeterminado 1)."
              },
              "max_scale": {
                "label": "Escala máxima",
                "description": "Radio máximo de media ventana en celdas (predeterminado 100)."
              },
              "step_size": {
                "label": "Tamaño de paso",
                "description": "Incremento de escala en celdas (predeterminado 1). Alias: step."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de conversión de Z cuando las unidades verticales y horizontales difieren (predeterminado 1.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional del informe HTML de firmas."
              }
            }
          },
          "multiscale_std_dev_normals": {
            "name": "Desviación estándar multiescala de las normales",
            "description": "Calcula la desviación estándar esférica máxima de las normales de la superficie a lo largo de un rango de escalas muestreado de forma no lineal.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "min_scale": {
                "label": "Escala mínima",
                "description": "Radio mínimo de media ventana en celdas (predeterminado 4)."
              },
              "step": {
                "label": "Paso",
                "description": "Tamaño de paso base en celdas usado por la planificación de escalas no lineal (predeterminado 1)."
              },
              "num_steps": {
                "label": "Número de pasos",
                "description": "Número de escalas muestreadas (predeterminado 10)."
              },
              "step_nonlinearity": {
                "label": "No linealidad del paso",
                "description": "Exponente de no linealidad de la planificación de escalas (predeterminado 1.0)."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de conversión de Z cuando las unidades verticales y horizontales difieren (predeterminado 1.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional del ráster de magnitud de la desviación estándar esférica."
              },
              "output_scale": {
                "label": "Escala de salida",
                "description": "Ruta de salida opcional del ráster que almacena la escala de respuesta máxima."
              }
            }
          },
          "multiscale_std_dev_normals_signature": {
            "name": "Firma de desviación estándar multiescala de las normales",
            "description": "Calcula firmas de escala de la desviación estándar esférica para los sitios puntuales de entrada y escribe un informe HTML.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada."
              },
              "points": {
                "label": "Puntos",
                "description": "Ruta del archivo vectorial de puntos o multipuntos de entrada."
              },
              "min_scale": {
                "label": "Escala mínima",
                "description": "Radio mínimo de media ventana en celdas (predeterminado 4)."
              },
              "step": {
                "label": "Paso",
                "description": "Tamaño de paso base en celdas usado por la planificación de escalas no lineal (predeterminado 1)."
              },
              "num_steps": {
                "label": "Número de pasos",
                "description": "Número de escalas muestreadas (predeterminado 10)."
              },
              "step_nonlinearity": {
                "label": "No linealidad del paso",
                "description": "Exponente de no linealidad de la planificación de escalas (predeterminado 1.0)."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Factor de conversión de Z cuando las unidades verticales y horizontales difieren (predeterminado 1.0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional del informe HTML de firmas."
              }
            }
          },
          "multiscale_topographic_position_image": {
            "name": "Imagen de posición topográfica multiescala",
            "description": "Crea una imagen RGB empaquetada de posición topográfica multiescala a partir de rásteres DEVmax local, meso y amplio.",
            "params": {
              "local": {
                "label": "Local",
                "description": "Ruta del ráster DEVmax de escala local de entrada."
              },
              "meso": {
                "label": "Meso",
                "description": "Ruta del ráster DEVmax de meso escala de entrada."
              },
              "broad": {
                "label": "Amplio",
                "description": "Ruta del ráster DEVmax de escala amplia de entrada."
              },
              "hillshade": {
                "label": "Sombreado del relieve",
                "description": "Ruta opcional del ráster de sombreado del relieve usado para modular la iluminación."
              },
              "lightness": {
                "label": "Luminosidad",
                "description": "Factor de escala de la luminosidad de la imagen (predeterminado 1.2)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional del ráster RGB empaquetado."
              }
            }
          },
          "topographic_position_animation": {
            "name": "Animación de posición topográfica",
            "description": "Crea un visor HTML interactivo y un GIF animado de DEV o DEVmax a lo largo de escalas muestreadas de forma no lineal.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del ráster DEM de entrada u objeto ráster tipado."
              },
              "delay": {
                "label": "Retardo",
                "description": "Retardo por fotograma del GIF en milisegundos."
              },
              "image_height": {
                "label": "Alto de imagen",
                "description": "Alto de la imagen mostrada en píxeles."
              },
              "label": {
                "label": "Etiqueta",
                "description": "Etiqueta opcional mostrada en el visor."
              },
              "min_scale": {
                "label": "Escala mínima",
                "description": "Radio mínimo de media ventana en celdas (predeterminado 1)."
              },
              "num_steps": {
                "label": "Número de pasos",
                "description": "Número de pasos de la animación (predeterminado 10)."
              },
              "palette": {
                "label": "Paleta",
                "description": "Nombre de la paleta usada para colorear los valores de DEV."
              },
              "step_nonlinearity": {
                "label": "No linealidad del paso",
                "description": "Exponente de escala no lineal en [1, 4] que controla el espaciado de grueso a fino."
              },
              "use_dev_max": {
                "label": "Usar desviación máxima",
                "description": "Si es verdadero, los fotogramas acumulan la respuesta DEV absoluta más fuerte encontrada hasta ese momento."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del HTML de salida."
              }
            }
          },
          "topo_render": {
            "name": "Representación topográfica",
            "description": "Crea una representación topográfica pseudo-3D usando tintado de paleta, sombreado del relieve, sombras y atenuación.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ruta del ráster DEM de entrada."
              },
              "palette": {
                "label": "Paleta",
                "description": "Nombre de la paleta (soft, atlas, high_relief, turbo, viridis, dem, grey, white)."
              },
              "reverse_palette": {
                "label": "Invertir paleta",
                "description": "Invertir el orden de la paleta."
              },
              "azimuth": {
                "label": "Acimut",
                "description": "Acimut de la fuente de luz en grados [0, 360]."
              },
              "altitude": {
                "label": "Altitud",
                "description": "Altura de la fuente de luz en grados [0, 90]."
              },
              "clipping_polygon": {
                "label": "Polígono de recorte",
                "description": "Ruta opcional del vectorial de polígonos; solo se representan las celdas del DEM situadas dentro de los polígonos."
              },
              "background_hgt_offset": {
                "label": "Desplazamiento de altura del fondo",
                "description": "Desplazamiento vertical desde la elevación mínima del DEM hasta el plano de fondo."
              },
              "background_clr": {
                "label": "Color de fondo",
                "description": "Color RGBA del fondo como matriz [r,g,b,a]."
              },
              "attenuation_parameter": {
                "label": "Parámetro de atenuación",
                "description": "Exponente de atenuación por distancia (>= 0)."
              },
              "ambient_light": {
                "label": "Luz ambiental",
                "description": "Cantidad de luz ambiental en [0, 1]."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Multiplicador de exageración vertical."
              },
              "max_dist": {
                "label": "Distancia máxima",
                "description": "Distancia máxima de búsqueda de sombras en unidades del mapa."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida."
              }
            }
          },
          "add_surface_information": {
            "name": "Añadir información de superficie",
            "description": "Añade estadísticas de superficie por entidad a partir de un ráster de elevación — Z, longitud de superficie 3D, área de superficie 3D, Z mínimo/máximo/medio y pendiente mínima/máxima/media — como campos de atributos sin alterar la geometría de entrada, como Añadir información de superficie de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada (puntos, líneas o polígonos) que comparte el CRS de la superficie."
              },
              "surface": {
                "label": "Superficie",
                "description": "Ráster de elevación/superficie que se va a muestrear."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida (el controlador se deduce de la extensión). Si se omite, se almacena en memoria."
              },
              "properties": {
                "label": "Propiedades",
                "description": "Lista separada por comas de los grupos de propiedades de superficie que se añaden: Z, SURFACE_LENGTH, SURFACE_AREA, MIN_MAX_MEAN_Z, MIN_MAX_AVG_SLOPE. Predeterminado: todos los aplicables a la geometría de la capa."
              },
              "sample_distance": {
                "label": "Distancia de muestreo",
                "description": "Intervalo de densificación en unidades del CRS para el muestreo de líneas/perímetros; los segmentos largos se dividen para que sigan la superficie. Predeterminado: el tamaño de celda del ráster."
              },
              "method": {
                "label": "Método",
                "description": "Muestreo de la superficie en los vértices: 'bilinear' (predeterminado) o 'nearest'."
              },
              "band": {
                "label": "Banda",
                "description": "Banda de la superficie que se va a muestrear, con índice desde 1 (predeterminado 1)."
              }
            }
          },
          "add_z_information": {
            "name": "Añadir información Z",
            "description": "Añade estadísticas de geometría derivadas de Z a entidades 3D — Z puntual/mínimo/máximo/medio, longitud 3D, área y volumen de la superficie de malla, estadísticas de pendiente y conteo de vértices (Añadir información Z de ArcGIS). vector_summary_statistics y attribute_histogram resumen atributos en lugar de geometría, y polygon_volume / surface_volume miden un ráster contra un plano de referencia, por lo que actualmente nada anota una entidad vectorial 3D a partir de su propia Z.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Entidades 3D de punto, línea, polígono o multiparche. Tenga en cuenta que un valor Z de cero es indistinguible de la ausencia de Z, por lo que 'features_with_z' es una indicación y no una garantía."
              },
              "output": {
                "label": "Salida",
                "description": "Entidades de entrada con los campos solicitados añadidos. Si se omite, se almacena en memoria."
              },
              "properties": {
                "label": "Propiedades",
                "description": "Subconjunto separado por comas de spot_z, min_z, max_z, mean_z, length_3d, surface_area, volume, min_slope, max_slope, mean_slope, point_count, vertex_count. Predeterminado: todos ellos (los campos no aplicables a una geometría se dejan nulos)."
              },
              "noise_filtering": {
                "label": "Filtrado de ruido",
                "description": "Porcentaje (0-50) que se recorta en cada extremo de la distribución de Z antes de calcular min_z / max_z, de modo que un único vértice anómalo no defina los extremos notificados. Predeterminado 0."
              }
            }
          },
          "adjust_3d_z": {
            "name": "Ajustar Z en 3D",
            "description": "Aplica una conversión de unidades Z, un desplazamiento vertical y/o un factor multiplicativo a las ordenadas Z de entidades 3D.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada (las entidades deben llevar ordenadas Z)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida vectorial opcional. Si se omite, el resultado se almacena en memoria."
              },
              "factor": {
                "label": "Factor",
                "description": "Factor multiplicativo aplicado a Z (predeterminado 1.0). Útil para la exageración vertical o para una escala de datum."
              },
              "offset": {
                "label": "Desplazamiento",
                "description": "Desplazamiento vertical aditivo aplicado después del factor, en unidades de destino (predeterminado 0.0)."
              },
              "from_unit": {
                "label": "Unidad de origen",
                "description": "Unidad Z de origen preestablecida (meters, feet, us_feet, centimeters, millimeters, kilometers, miles, yards, inches). Requiere to_unit."
              },
              "to_unit": {
                "label": "Unidad de destino",
                "description": "Unidad Z de destino preestablecida. Requiere from_unit. Z se escala por (metros-por-from_unit / metros-por-to_unit)."
              }
            }
          },
          "adjust_stream_to_raster": {
            "name": "Ajustar cauce al ráster",
            "description": "Mueve los vértices de polilíneas de cauces sobre la trayectoria de flujo implícita en un DEM para que la hidrografía vectorial y la superficie de elevación concuerden, ajustando los nodos a celdas de alta acumulación y trazando la cadena de punteros D8 entre ellos. Es la operación inversa del grabado de cauces. Como Ajustar cauce a ráster de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Entidades de polilínea de cauces que se van a ajustar."
              },
              "dem": {
                "label": "DEM",
                "description": "Ráster de superficie que define la trayectoria de flujo real."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida de los cauces ajustados. Si se omite, se almacena en memoria."
              },
              "snap_distance": {
                "label": "Distancia de ajuste",
                "description": "Radio de búsqueda en unidades del mapa para ajustar los nodos a una celda de acumulación alta (predeterminado: 5 celdas)."
              },
              "channel_threshold": {
                "label": "Umbral de canal",
                "description": "Valor de acumulación de flujo (en celdas) a partir del cual una celda se considera canalizada para el ajuste (predeterminado: 1 % de la acumulación máxima del DEM)."
              },
              "remove_disconnected": {
                "label": "Eliminar desconectados",
                "description": "Descartar las líneas que no se pueden enrutar en absoluto (predeterminado true). Cuando es falso, se transfieren sin cambios y se marcan."
              },
              "output_stream_raster": {
                "label": "Ráster de cauces de salida",
                "description": "Ráster opcional que marca las celdas de cauce ajustadas."
              },
              "output_flow_direction": {
                "label": "Dirección de flujo de salida",
                "description": "Ráster de puntero D8 opcional derivado del DEM."
              },
              "output_split_points": {
                "label": "Puntos de división de salida",
                "description": "Puntos opcionales donde el trazado del puntero falló y se utilizó una alternativa de coste mínimo."
              }
            }
          },
          "aggregate_multidimensional_raster": {
            "name": "Agregar ráster multidimensional",
            "description": "Agrupa en intervalos las rebanadas de un cubo ráster a lo largo de su dimensión y reduce cada intervalo a una banda de salida — escenas diarias en compuestos mensuales, una década en medias anuales (Agregar ráster multidimensional de ArcGIS). cell_statistics de la ronda 17 reduce una pila solo a una única capa y no tiene noción de dimensión, mientras que multidimensional_anomaly de la ronda 16 realiza la operación opuesta y conserva el número de rebanadas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Un ráster multibanda (cada banda es una rebanada) o una lista separada por comas de rásteres corregistrados."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster multibanda de salida, una banda por intervalo. Si se omite, se almacena en memoria."
              },
              "dimension": {
                "label": "Dimensión",
                "description": "Nombre de la dimensión, usado solo en el informe (predeterminado 'slice')."
              },
              "dimension_values": {
                "label": "Valores de dimensión",
                "description": "Coordenada de cada rebanada separada por comas, estrictamente creciente. Por defecto el índice de rebanada con base 1."
              },
              "aggregation_definition": {
                "label": "Definición de agregación",
                "description": "'all' (predeterminado), 'interval_value', 'interval_count' o 'interval_ranges'."
              },
              "interval_value": {
                "label": "Valor de intervalo",
                "description": "Ancho del intervalo en unidades de la dimensión, para 'interval_value'."
              },
              "interval_count": {
                "label": "Número de intervalos",
                "description": "Número de intervalos de igual anchura, para 'interval_count'."
              },
              "interval_ranges": {
                "label": "Rangos de intervalos",
                "description": "Intervalos explícitos como 'start:end,start:end', para 'interval_ranges'."
              },
              "aggregation_method": {
                "label": "Método de agregación",
                "description": "'mean' (predeterminado), 'majority', 'maximum', 'median', 'minimum', 'minority', 'percentile', 'range', 'std', 'sum' o 'variety'."
              },
              "percentile_value": {
                "label": "Valor de percentil",
                "description": "Percentil en [0, 100] para el método 'percentile' (predeterminado 50)."
              },
              "ignore_nodata": {
                "label": "Ignorar sin datos",
                "description": "Omitir las rebanadas sin datos en cada celda (predeterminado true). Cuando es falso, una sola rebanada sin datos convierte todo el intervalo en sin datos en esa celda."
              }
            }
          },
          "aggregate_points": {
            "name": "Agregar puntos",
            "description": "Agrupa los puntos que se encuentran dentro de una distancia de agregación entre sí en polígonos de clúster (envolvente convexa o unión con buffer), cada uno con un conteo de puntos y sumas opcionales de campos por clúster, como Agregar puntos de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos de entrada (Point o MultiPoint)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de polígonos de salida (el controlador se deduce de la extensión). Si se omite, se almacena en memoria."
              },
              "aggregation_distance": {
                "label": "Distancia de agregación",
                "description": "Distancia máxima entre puntos para que se unan al mismo clúster (unidades del mapa)."
              },
              "min_points": {
                "label": "Puntos mínimos",
                "description": "Número mínimo de puntos que necesita un clúster para generarse (predeterminado 2; establezca 1 para conservar los clústeres de un solo punto)."
              },
              "method": {
                "label": "Método",
                "description": "'convex_hull' (predeterminado) o 'buffer' (unión con búfer erosionada de nuevo)."
              },
              "sum_fields": {
                "label": "Campos a sumar",
                "description": "Campos numéricos separados por comas que se suman por clúster (columnas de salida 'sum_<field>')."
              }
            }
          },
          "aggregate_polygons": {
            "name": "Agregar polígonos",
            "description": "Combina polígonos dentro de una distancia de agregación en polígonos más grandes (cierre morfológico), con filtros de área mínima y tamaño mínimo de hueco y una capa opcional de barreras que la agregación no puede cruzar.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de polígonos de entrada, formato detectado automáticamente (o identificador en memoria)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según su extensión). Si se omite, se almacena en memoria."
              },
              "aggregation_distance": {
                "label": "Distancia de agregación",
                "description": "Los polígonos situados a esta distancia (unidades del CRS) entre sí se agregan. Establece el radio de cierre morfológico en la mitad de este valor."
              },
              "min_area": {
                "label": "Área mínima",
                "description": "Descartar los polígonos agregados cuya área (unidades del CRS al cuadrado) esté por debajo de este valor. Predeterminado: conservarlos todos."
              },
              "min_hole_size": {
                "label": "Tamaño mínimo de hueco",
                "description": "Rellenar los huecos interiores cuya área (unidades del CRS al cuadrado) esté por debajo de este valor. Predeterminado: conservar todos los huecos."
              },
              "barrier": {
                "label": "Barrera",
                "description": "Capa vectorial de barreras opcional (líneas o polígonos) que la agregación no puede cruzar; los puentes que atraviesan una barrera se cortan. Los polígonos de entrada existentes nunca se dividen."
              }
            }
          },
          "align_features": {
            "name": "Alinear entidades",
            "description": "Ajusta los bordes de líneas/polígonos de origen a una capa objetivo fiable cercana dentro de una distancia de búsqueda, arrastrando tramos enteros de borde (no solo los extremos) con una transición suave y límites compartidos coincidentes, como Alinear entidades de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de origen que se va a alinear (líneas o polígonos)."
              },
              "target": {
                "label": "Objetivo",
                "description": "Capa de destino de confianza (líneas o límites de polígonos) hacia la que se atraen los vértices de origen."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según la extensión). Si se omite, se almacena en memoria."
              },
              "search_distance": {
                "label": "Distancia de búsqueda",
                "description": "Distancia máxima (unidades del CRS) que un vértice de origen puede desplazarse hacia el destino. Obligatorio."
              },
              "match_field": {
                "label": "Campo de coincidencia",
                "description": "Campo de atributos de origen opcional; solo las aristas de destino cuyo valor de target_match_field coincida son candidatas para los vértices de esa entidad."
              },
              "target_match_field": {
                "label": "Campo de coincidencia objetivo",
                "description": "Campo de atributos de destino comparado con match_field. Si se omite, el valor predeterminado es el nombre de match_field; requiere match_field."
              }
            }
          },
          "analyze_changes_ccdc": {
            "name": "Analizar cambios con CCDC",
            "description": "Detección continua de cambios CCDC sobre una serie temporal densa de imágenes (como Analizar cambios mediante CCDC de ArcGIS): regresión OLS armónica (estacional) por píxel y luego una prueba de residuos deslizante (k×RMSE, mínimo de anomalías consecutivas) que declara rupturas y reajusta los segmentos. Genera rásteres de número de rupturas, fecha de la primera ruptura y RMSE/pendiente/amplitud del segmento inicial — el historial de cambios estacional y con múltiples rupturas que el landtrendr anual y el change_vector_analysis de dos fechas no pueden producir.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Un único ráster multibanda (cada banda es una rebanada temporal) O una lista separada por comas de rutas de rásteres monobanda corregistrados, en orden temporal."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de salida con el recuento de rupturas (rupturas detectadas por píxel). Si se omite, se almacena en memoria."
              },
              "dates": {
                "label": "Fechas",
                "description": "Fechas numéricas separadas por comas (años decimales o números de día) que corresponden a las rebanadas. Predeterminado 0,1,2,..."
              },
              "period": {
                "label": "Periodo",
                "description": "Duración de un ciclo estacional en las unidades de 'dates' (predeterminado 1.0 para años decimales; use 365 para números de día)."
              },
              "harmonic_order": {
                "label": "Orden armónico",
                "description": "Número de pares armónicos seno/coseno en la frecuencia anual (predeterminado 1 = solo anual; 2 añade el término semianual)."
              },
              "change_threshold": {
                "label": "Umbral de cambio",
                "description": "Umbral de anomalía como múltiplo k del RMSE del segmento (predeterminado 3.0). Un residuo > k×RMSE marca una observación."
              },
              "min_consecutive": {
                "label": "Mínimo consecutivo",
                "description": "Número de observaciones marcadas consecutivas necesarias para declarar una ruptura (predeterminado 3)."
              },
              "min_observations": {
                "label": "Observaciones mínimas",
                "description": "Número mínimo de observaciones válidas usadas para inicializar el modelo armónico de un segmento (predeterminado 12). Los píxeles con menos observaciones válidas pasan a ser NoData."
              },
              "band": {
                "label": "Banda",
                "description": "Para una entrada con lista separada por comas: banda (con índice desde 1) que se lee de cada ráster (predeterminado 1). Se ignora para una única entrada multibanda."
              },
              "break_date_output": {
                "label": "Salida de fecha de ruptura",
                "description": "Ráster opcional con la fecha de la primera ruptura detectada por píxel (NoData donde no hay ruptura)."
              },
              "rmse_output": {
                "label": "Salida de RMSE",
                "description": "Ráster opcional con el RMSE del modelo armónico del segmento inicial."
              },
              "slope_output": {
                "label": "Salida de pendiente",
                "description": "Ráster opcional con el coeficiente de tendencia lineal (pendiente) del segmento inicial."
              },
              "amplitude_output": {
                "label": "Salida de amplitud",
                "description": "Ráster opcional con la amplitud del primer armónico del segmento inicial sqrt(a²+b²)."
              }
            }
          },
          "apply_radiometric_calibration": {
            "name": "Aplicar calibración radiométrica",
            "description": "Convierte los números digitales brutos SAR en retrodispersión calibrada — beta cero, sigma cero o gamma cero — para que las adquisiciones sean físicamente comparables y se puedan aplicar los umbrales publicados (Aplicar calibración radiométrica de ArcGIS). Nada en ninguno de los registros hace esto: rescale_value_range es un estiramiento lineal sin significado radiométrico, y multilook, sar_coherence, los filtros de speckle de Lee y compute_sar_indices consumen los valores que se les entregan tal cual.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster SAR en números digitales, amplitud, intensidad o dB (véase 'input_units')."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de salida de retrodispersión calibrada. Si se omite, se almacena en memoria."
              },
              "calibration_type": {
                "label": "Tipo de calibración",
                "description": "'sigma0' (predeterminado), 'beta0' o 'gamma0'. sigma0 y gamma0 requieren 'incidence_angle'."
              },
              "calibration_constant": {
                "label": "Constante de calibración",
                "description": "Constante de calibración del sensor A (predeterminado 1.0). Se ignora cuando se proporciona 'calibration_lut'."
              },
              "calibration_lut": {
                "label": "LUT de calibración",
                "description": "Ráster corregistrado opcional con las constantes de calibración A por celda, que anula 'calibration_constant'."
              },
              "incidence_angle": {
                "label": "Ángulo de incidencia",
                "description": "Ángulo de incidencia local en grados: una constante o la ruta de un ráster corregistrado. Obligatorio para 'sigma0' y 'gamma0'."
              },
              "input_units": {
                "label": "Unidades de entrada",
                "description": "'dn' (predeterminado), 'amplitude', 'intensity' o 'db'. dn y amplitude se elevan al cuadrado para obtener potencia; db se deslinealiza primero."
              },
              "output_units": {
                "label": "Unidades de salida",
                "description": "'linear' (predeterminado) o 'db'."
              },
              "band": {
                "label": "Banda",
                "description": "Banda (con índice desde 1) que se calibra (predeterminado 1)."
              }
            }
          },
          "apportion_polygon": {
            "name": "Repartir polígono",
            "description": "Transfiere atributos numéricos de una capa de polígonos de origen a una capa de polígonos objetivo, repartidos según el área de solape (reagregación dasimétrica entre sistemas de zonas), como Repartir polígono de ArcGIS.",
            "params": {
              "target": {
                "label": "Objetivo",
                "description": "Capa de polígonos de destino (recibe los valores repartidos; se conservan sus entidades y atributos)."
              },
              "source": {
                "label": "Origen",
                "description": "Capa de polígonos de origen que contiene los valores que se van a distribuir."
              },
              "fields": {
                "label": "Campos",
                "description": "Nombre(s) de campo(s) numérico(s) del origen que se van a repartir, separados por comas."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida (una copia del destino con las columnas repartidas). Si se omite, se almacena en memoria."
              },
              "method": {
                "label": "Método",
                "description": "'area' (predeterminado; reparto por área de superposición) o 'weight' (reparto por el área de superposición multiplicada por el 'weight_field' del destino)."
              },
              "weight_field": {
                "label": "Campo de peso",
                "description": "Campo numérico del destino utilizado como peso adicional cuando method=weight."
              },
              "suffix": {
                "label": "Sufijo",
                "description": "Sufijo para las columnas repartidas de salida. Predeterminado '_app'."
              }
            }
          },
          "areal_interpolation": {
            "name": "Interpolación areal",
            "description": "Predice valores agregados para polígonos objetivo a partir de polígonos de origen con una geografía distinta, ajustando una superficie subyacente suave y reintegrándola en lugar de ponderar por área (Capa de interpolación areal a polígonos de ArcGIS). apportion_polygon asume que la cantidad es uniforme dentro de cada polígono de origen — el fallo clásico del problema de la unidad de área modificable — y no proporciona errores estándar; la suite de kriging incluida trabaja únicamente con soporte puntual y no puede aceptar observaciones poligonales.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Polígonos de origen que contienen el campo medido."
              },
              "target": {
                "label": "Objetivo",
                "description": "Polígonos de destino para los que se predicen valores."
              },
              "field": {
                "label": "Campo",
                "description": "Campo numérico de valores en los polígonos de origen."
              },
              "output": {
                "label": "Salida",
                "description": "Polígonos de destino con PREDICTED, PRED_STD_ERR y los diagnósticos añadidos. Si se omite, se almacena en memoria."
              },
              "field_type": {
                "label": "Tipo de campo",
                "description": "'count' (predeterminado): un total extensivo, reescalado para conservar la suma del origen. 'average': una media intensiva, predicha directamente sin reescalado."
              },
              "discretization": {
                "label": "Discretización",
                "description": "Número aproximado de puntos interiores usados para representar el soporte de área de cada polígono (predeterminado 25). Un valor mayor es más preciso y mucho más lento."
              },
              "model": {
                "label": "Modelo",
                "description": "Modelo de variograma: 'exponential' (predeterminado), 'spherical' o 'gaussian'."
              },
              "preserve_total": {
                "label": "Conservar el total",
                "description": "Reescala las predicciones de recuento para que el total del destino coincida con el total del origen (predeterminado verdadero para 'count', siempre desactivado para 'average'). Solo se aplica cuando los destinos cubren a los orígenes — el factor aplicado se informa como 'mass_scale' para que una ejecución con cobertura parcial sea visible."
              }
            }
          },
          "attribute_uncertainty": {
            "name": "Incertidumbre de atributos",
            "description": "Propagación de errores por Monte Carlo con semilla sobre un atributo incierto (como Incertidumbre de atributos de ArcGIS): extrae realizaciones NORMAL/UNIFORM a partir de un campo de error por entidad o de un par de límites y añade estadísticas de media/desviación estándar/p5/p50/p95/CV.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada (o tabla) con el atributo incierto."
              },
              "value_field": {
                "label": "Campo de valor",
                "description": "Campo numérico que contiene la estimación (media/centro de la distribución) de cada entidad."
              },
              "error_field": {
                "label": "Campo de error",
                "description": "Campo numérico que contiene la incertidumbre simétrica: un error estándar para NORMAL o una semiamplitud para UNIFORM. Proporcione este campo O bien ambos lower_field/upper_field."
              },
              "lower_field": {
                "label": "Campo inferior",
                "description": "Campo numérico con el límite inferior del valor. Se usa junto con upper_field en lugar de error_field."
              },
              "upper_field": {
                "label": "Campo superior",
                "description": "Campo numérico con el límite superior del valor. Se usa junto con lower_field en lugar de error_field."
              },
              "distribution": {
                "label": "Distribución",
                "description": "Distribución del error: NORMAL (predeterminado) o UNIFORM."
              },
              "iterations": {
                "label": "Iteraciones",
                "description": "Número de realizaciones de Monte Carlo por entidad (predeterminado 1000)."
              },
              "seed": {
                "label": "Semilla",
                "description": "Semilla para el generador de números aleatorios determinista (predeterminado 1)."
              },
              "output": {
                "label": "Salida",
                "description": "Capa vectorial de salida con las estadísticas añadidas. Si se omite, se almacena en memoria."
              }
            }
          },
          "band_collection_statistics": {
            "name": "Estadísticas de colección de bandas",
            "description": "Mínimo/máximo/media/desviación estándar por banda más las matrices de covarianza y correlación entre bandas de una pila ráster (como Estadísticas de colección de bandas de ArcGIS) — el resumen multivariante (precursor de PCA / clasificación) del que carece la suite incluida; distinto de cell_statistics por píxel.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Un ráster multibanda (cada banda es una capa) o una lista separada por comas de rásteres corregistrados."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta CSV opcional para el informe de estadísticas. Las matrices siempre se devuelven en el resultado."
              },
              "detail": {
                "label": "Detalle",
                "description": "'detailed' (predeterminado) incluye las matrices de covarianza/correlación; 'brief' devuelve únicamente las estadísticas por banda."
              }
            }
          },
          "bivariate_spatial_association": {
            "name": "Asociación espacial bivariada",
            "description": "Estadístico L de Lee global y local que mide dónde dos variables continuas covarían espacialmente, con un valor p de prueba de permutación con semilla y una clase Alto-Alto/Alto-Bajo/Bajo-Alto/Bajo-Bajo por entidad — como Asociación espacial bivariada de ArcGIS. La contraparte de campo continuo de colocation_analysis.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada con dos campos numéricos."
              },
              "x_field": {
                "label": "Campo X",
                "description": "Campo de la primera variable numérica."
              },
              "y_field": {
                "label": "Campo Y",
                "description": "Campo de la segunda variable numérica."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de salida con los campos L local, valor p y clase. Si se omite, se almacena en memoria."
              },
              "neighbors": {
                "label": "Vecinos",
                "description": "Número de vecinos más próximos para los pesos espaciales (predeterminado 8)."
              },
              "permutations": {
                "label": "Permutaciones",
                "description": "Número de permutaciones para la prueba de significación (predeterminado 199; 0 lo desactiva)."
              },
              "seed": {
                "label": "Semilla",
                "description": "Semilla para el generador de números aleatorios de las permutaciones (predeterminado 1), para obtener resultados reproducibles."
              }
            }
          },
          "block_statistics": {
            "name": "Estadísticas por bloque",
            "description": "Divide un ráster en bloques no solapados, reduce cada uno mediante un estadístico y escribe ese valor de vuelta en cada celda del bloque a la resolución de entrada (Estadísticas de bloque de ArcGIS). Complementa a focal_statistics (ventana solapada), zonal_statistics (por capa de zonas) y cell_statistics (a través de una pila) incluidos; a diferencia de aggregate_raster, conserva el tamaño de celda, de modo que entrada - media de bloque da una superficie de residuos local, y añade los estadísticos categóricos mayoría/minoría/mediana/variedad.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida. Si se omite, el resultado se almacena en memoria."
              },
              "statistic": {
                "label": "Estadístico",
                "description": "Uno de: mean (predeterminado), majority, maximum, median, minimum, minority, range, std, sum, variety."
              },
              "neighborhood": {
                "label": "Vecindad",
                "description": "Forma del bloque: rectangle (predeterminado), circle, annulus o wedge."
              },
              "size": {
                "label": "Tamaño",
                "description": "Dimensiones del bloque en celdas: 'width,height' para rectangle (predeterminado '3,3'), 'radius' para circle/wedge, o 'inner,outer' para annulus."
              },
              "start_angle": {
                "label": "Ángulo inicial",
                "description": "Ángulo inicial del sector en grados en sentido antihorario desde el este (predeterminado 0)."
              },
              "end_angle": {
                "label": "Ángulo final",
                "description": "Ángulo final del sector en grados en sentido antihorario desde el este (predeterminado 90)."
              },
              "ignore_nodata": {
                "label": "Ignorar sin datos",
                "description": "Si es verdadero (predeterminado), los bloques se calculan solo a partir de celdas válidas; si es falso, cualquier celda NoData convierte todo el bloque en NoData."
              },
              "band": {
                "label": "Banda",
                "description": "Banda (con índice desde 1) que se lee (predeterminado 1)."
              }
            }
          },
          "boundary_clean": {
            "name": "Limpieza de límites",
            "description": "Suaviza los límites de zonas de un ráster categórico y elimina el moteado mediante filtrado por mayoría o limpieza de límites por expansión/contracción, la limpieza estándar previa a la poligonización — como Limpieza de límites / Filtro de mayoría de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster categórico de entrada (con valores enteros)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida. Si se omite, se almacena en memoria."
              },
              "method": {
                "label": "Método",
                "description": "'majority' (eliminación de moteado por mayoría de vecinos; predeterminado) o 'expand_shrink' (suavizado tipo Boundary Clean)."
              },
              "neighbors": {
                "label": "Vecinos",
                "description": "Conectividad de la vecindad: 4 (torre) u 8 (reina; predeterminado)."
              },
              "threshold": {
                "label": "Umbral",
                "description": "Solo en el modo majority: 'majority' (mayoría estricta de vecinos; predeterminado) o 'half' (al menos la mitad)."
              },
              "iterations": {
                "label": "Iteraciones",
                "description": "Número de pasadas que se ejecutan (predeterminado 1)."
              },
              "sort": {
                "label": "Ordenar",
                "description": "Solo en el modo expand_shrink: prioridad de zona por recuento de celdas — 'descending' (ganan las zonas mayores; predeterminado), 'ascending' (ganan las zonas menores) o 'none'."
              },
              "band": {
                "label": "Banda",
                "description": "Banda (con índice desde 1) que se lee (predeterminado 1)."
              }
            }
          },
          "buffer_3d": {
            "name": "Zona de influencia 3D",
            "description": "Crea buffers de puntos y líneas 3D en geometría volumétrica (esferas y cápsulas) emitida como superficie triangulada, como Buffer 3D de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de entrada de puntos o polilíneas 3D (la Z ausente se trata como 0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              },
              "distance": {
                "label": "Distancia",
                "description": "Radio de búfer en unidades de mapa."
              },
              "distance_field": {
                "label": "Campo de distancia",
                "description": "Campo de radio por entidad opcional, que anula 'distance'."
              },
              "shape": {
                "label": "Forma",
                "description": "round (predeterminado; extremos hemisféricos) o flat (cilindro con extremos planos)."
              },
              "quality": {
                "label": "Calidad",
                "description": "Resolución de la teselación: segmentos alrededor de la circunferencia (predeterminado 12, mín. 4, máx. 64)."
              }
            }
          },
          "buffer_vector": {
            "name": "Zona de influencia vectorial",
            "description": "Extiende geometrías una distancia especificada, creando buffers poligonales con estilos de extremo/unión personalizables. La disolución opcional fusiona los buffers solapados en polígonos unificados.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "distance": {
                "label": "Distancia",
                "description": "Distancia de búfer en unidades de mapa."
              },
              "quadrant_segments": {
                "label": "Segmentos por cuadrante",
                "description": "Resolución del arco en segmentos por cuadrante; el valor predeterminado es 8."
              },
              "cap_style": {
                "label": "Estilo de extremo",
                "description": "Estilo de extremo de línea: round, flat o square."
              },
              "join_style": {
                "label": "Estilo de unión",
                "description": "Estilo de unión de esquinas: round, bevel o mitre."
              },
              "mitre_limit": {
                "label": "Límite de inglete",
                "description": "Límite de la unión en inglete usado cuando join_style=mitre; el valor predeterminado es 5.0."
              },
              "dissolve": {
                "label": "Disolver",
                "description": "Disuelve los búferes superpuestos en un único polígono unificado; el valor predeterminado es falso."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida."
              }
            }
          },
          "build_balanced_zones": {
            "name": "Construir zonas equilibradas",
            "description": "Agrupa polígonos contiguos en un número objetivo de zonas conectadas que equilibran el número de entidades, la suma de un atributo o la homogeneidad de un atributo, mediante particionamiento por árbol de expansión SKATER.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de polígonos de entrada, con formato detectado automáticamente (o identificador en memoria)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según su extensión). Si se omite, se almacena en memoria."
              },
              "zones": {
                "label": "Zonas",
                "description": "Número objetivo de zonas que se van a crear."
              },
              "criterion": {
                "label": "Criterio",
                "description": "Objetivo de equilibrio: 'homogeneity' (predeterminado), 'equal_count' o 'equal_sum' (del primer campo)."
              },
              "fields": {
                "label": "Campos",
                "description": "Campo(s) numérico(s) de análisis separados por comas. Obligatorio para 'homogeneity' y 'equal_sum'; determina los pesos de las aristas del árbol de expansión."
              },
              "contiguity": {
                "label": "Contigüidad",
                "description": "Regla de adyacencia: 'rook' (arista compartida, predeterminado) o 'queen' (arista o vértice compartido)."
              },
              "tolerance": {
                "label": "Tolerancia",
                "description": "Distancia máxima para que dos segmentos de límite se consideren compartidos (torre). Predeterminado 1e-6."
              }
            }
          },
          "build_seamlines": {
            "name": "Construir líneas de unión",
            "description": "Dado un conjunto de rásteres solapados (y huellas opcionales), calcula dónde debe cortarse cada imagen para que el mosaico se una a lo largo de una costura mínimamente visible, emitiendo un polígono de línea de costura no solapado por imagen mediante una asignación de Voronoi, por orden de prioridad, radiométrica o sensible a bordes. Como Construir líneas de costura de ArcGIS.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Rutas de rásteres que se van a mosaicar, separadas por comas o puntos y comas."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del polígono de líneas de unión de salida (una entidad por ráster de entrada). Si se omite, se almacena en memoria."
              },
              "footprints": {
                "label": "Huellas",
                "description": "Capa de polígonos opcional que indica la extensión válida de cada ráster, en el orden de entrada. Cuando se omite, se deriva de los datos válidos."
              },
              "method": {
                "label": "Método",
                "description": "'voronoi' (predeterminado), 'order', 'radiometry' o 'edge_detection'."
              },
              "sort_ascending": {
                "label": "Orden ascendente",
                "description": "Para el método 'order': verdadero (predeterminado) da prioridad a los rásteres anteriores, falso da prioridad a los posteriores."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda del análisis (predeterminado: el tamaño de celda de entrada más fino)."
              },
              "band": {
                "label": "Banda",
                "description": "Banda (con índice desde 1) utilizada para los métodos radiométricos (predeterminado 1)."
              },
              "min_region_size": {
                "label": "Tamaño mínimo de región",
                "description": "Reasigna a una imagen vecina las regiones asignadas con menos celdas que este valor (predeterminado 0, es decir, conservarlas todas)."
              },
              "blend_width": {
                "label": "Ancho de mezcla",
                "description": "Ancho de difuminado en unidades de mapa, escrito como atributo para el mosaicado posterior (predeterminado 0)."
              },
              "blend_type": {
                "label": "Tipo de mezcla",
                "description": "'both' (predeterminado), 'inside' u 'outside'; se escribe como atributo."
              }
            }
          },
          "calculate_adjacent_fields": {
            "name": "Calcular campos adyacentes",
            "description": "Rellena ocho campos de hojas vecinas direccionales (N, NE, E, SE, S, SO, O, NO) en cada tesela de una malla índice de serie de mapas con el nombre de la página adyacente, para etiquetas de margen del tipo «continúa en la hoja…» — como Calcular campos adyacentes de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Malla de índice de polígonos de la serie de mapas de entrada (p. ej., la salida de grid_index_features)."
              },
              "page_name_field": {
                "label": "Campo de nombre de página",
                "description": "Campo cuyo valor etiqueta cada página (se escribe en los campos direccionales de los vecinos)."
              },
              "output": {
                "label": "Salida",
                "description": "Vectorial de polígonos de salida (controlador según la extensión). Si se omite, se almacena en memoria."
              },
              "include_diagonal": {
                "label": "Incluir diagonal",
                "description": "Rellena también los cuatro campos diagonales (NE, SE, SW, NW) a partir de las teselas que se tocan en las esquinas. Predeterminado verdadero."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Cuantiza los vértices sobre una malla de este tamaño (unidades del CRS) antes de emparejar los límites. Predeterminado 0 (coordenadas exactas)."
              }
            }
          },
          "calculate_central_meridian_and_parallels": {
            "name": "Calcular meridiano central y paralelos",
            "description": "Calcula por entidad un meridiano central y dos paralelos estándar a partir de la extensión de cada entidad, para páginas de series de mapas y atlas, como Calcular meridiano central y paralelos de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Entidades de entrada en coordenadas geográficas (longitud/latitud), normalmente una malla de páginas de grid_index_features."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              },
              "field": {
                "label": "Campo",
                "description": "Nombre del campo de meridiano central que se va a escribir (predeterminado 'central_meridian')."
              },
              "standard_offset": {
                "label": "Desplazamiento estándar",
                "description": "Fracción del rango de latitud utilizada para separar cada paralelo estándar del borde de la entidad (predeterminado 0.1667, la regla de 1/6 de Esri). Debe estar en [0, 0.5)."
              }
            }
          },
          "calculate_composite_index": {
            "name": "Calcular índice compuesto",
            "description": "Combina varios atributos numéricos en un índice compuesto (como Calcular índice compuesto de ArcGIS): escalado por variable (mín-máx/puntuación z/percentil) con inversión opcional, combinación ponderada (media/suma/media geométrica) y reescalado de la salida — el equivalente vectorial de fuzzy_overlay.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada (o tabla) con campos de variables numéricas."
              },
              "fields": {
                "label": "Campos",
                "description": "Campos de variables separados por comas; añada ':reverse' a un campo cuyos valores altos deban reducir el índice (p. ej., 'income:reverse,unemployment')."
              },
              "output": {
                "label": "Salida",
                "description": "Capa vectorial de salida con los campos del índice añadidos. Si se omite, se almacena en memoria."
              },
              "scaling": {
                "label": "Escalado",
                "description": "Escalado por variable: 'minmax' (predeterminado), 'zscore', 'percentile' o 'none'."
              },
              "weights": {
                "label": "Pesos",
                "description": "Pesos separados por comas que corresponden a 'fields' (predeterminado: pesos iguales)."
              },
              "combine": {
                "label": "Combinar",
                "description": "Cómo combinar las variables escaladas: 'mean' (predeterminado), 'sum' o 'geometric_mean'."
              },
              "output_range": {
                "label": "Rango de salida",
                "description": "Reescalado del índice combinado: 'minmax' (0–1, predeterminado), 'zero_to_100', 'zscore' o 'none'."
              }
            }
          },
          "calculate_distance_band": {
            "name": "Calcular banda de distancia",
            "description": "Informa de la distancia mínima, media y máxima a la que cada entidad tiene al menos N vecinos (como Calcular banda de distancia a partir del conteo de vecinos de ArcGIS) — el diagnóstico de umbral que garantiza que ninguna entidad quede sin vecinos antes de las estadísticas espaciales basadas en distancia. El generate_spatial_weights_matrix incluido construye la matriz pero nunca informa de esta banda.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos/entidades de entrada (CRS proyectado; distancias en sus unidades)."
              },
              "neighbors": {
                "label": "Vecinos",
                "description": "Número de vecinos k (>= 1). Predeterminado 1."
              },
              "distance_method": {
                "label": "Método de distancia",
                "description": "'euclidean' (predeterminado) o 'manhattan'."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta CSV opcional para una tabla feature_id,kth_neighbor_distance."
              }
            }
          },
          "calculate_end_time": {
            "name": "Calcular hora de fin",
            "description": "Rellena un campo de hora de fin con la hora de inicio del siguiente registro dentro de cada grupo de entidades, convirtiendo observaciones instantáneas en registros con extensión temporal (Calcular hora de fin de ArcGIS). transform_fields realiza transformaciones por valor y summary_statistics agrega grupos, pero nada realizaba un relleno temporal ordenado por filas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial o tabla de entrada."
              },
              "start_field": {
                "label": "Campo de inicio",
                "description": "Campo de marca de tiempo: un valor numérico de época o una cadena de fecha/fecha-hora ISO-8601."
              },
              "end_field": {
                "label": "Campo de fin",
                "description": "Campo que recibe la hora de fin (predeterminado 'END_TIME'). Se crea si no existe y se sobrescribe si ya existe."
              },
              "id_fields": {
                "label": "Campos de ID",
                "description": "Campos de agrupación separados por comas o puntos y comas. Las horas de fin se derivan únicamente dentro de un grupo, nunca entre grupos distintos."
              },
              "last_record": {
                "label": "Último registro",
                "description": "Qué escribir en la última fila de cada grupo: 'null' (predeterminado), 'same_as_start' o 'duration' (inicio + default_duration)."
              },
              "default_duration": {
                "label": "Duración predeterminada",
                "description": "Segundos añadidos al inicio para last_record 'duration'."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de salida. Si se omite, se almacena en memoria."
              }
            }
          },
          "calculate_grid_convergence_angle": {
            "name": "Calcular ángulo de convergencia de cuadrícula",
            "description": "Calcula, por entidad, el ángulo de convergencia de cuadrícula entre el norte de cuadrícula y el norte verdadero a partir de la longitud/latitud del centroide y un meridiano central (por defecto el meridiano central UTM de la propia entidad), escribiéndolo en un campo para la rotación correcta de símbolos/etiquetas en mapas proyectados — como Calcular ángulo de convergencia de cuadrícula de ArcGIS. Convención geográfica (en sentido horario desde el norte) o aritmética (en sentido antihorario desde el este). Matemática pura, sin PROJ; no relacionado con la métrica de terreno convergence_index incluida. La geometría se lee como grados de longitud/latitud.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada (cualquier tipo de geometría) en coordenadas geográficas (grados de longitud/latitud, EPSG:4326)."
              },
              "angle_field": {
                "label": "Campo de ángulo",
                "description": "Nombre del campo flotante que contendrá el ángulo de convergencia en grados. Predeterminado 'GRID_CONV'."
              },
              "angle_type": {
                "label": "Tipo de ángulo",
                "description": "Convención angular: 'geographic' (grados en sentido horario desde el norte, positivo hacia el este) o 'arithmetic' (grados en sentido antihorario desde el este, 90 − geographic). Predeterminado 'geographic'."
              },
              "central_meridian": {
                "label": "Meridiano central",
                "description": "Longitud del meridiano central en grados. Si se omite, cada entidad usa el meridiano central de su propia zona UTM derivado de su longitud."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida (el controlador se deduce de la extensión). Si se omite, se almacena en memoria."
              }
            }
          },
          "calculate_missing_z_values": {
            "name": "Calcular valores Z faltantes",
            "description": "Rellena valores Z ausentes o de marcador de posición a lo largo de entidades 3D interpolando a partir de los valores Z válidos a ambos lados, como Calcular valores Z ausentes de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de entidades de entrada con vértices 3D."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              },
              "placeholder": {
                "label": "Marcador de posición",
                "description": "Valor centinela que marca una Z ausente (p. ej., -9999). Los vértices que carecen por completo de Z siempre se tratan como ausentes."
              },
              "method": {
                "label": "Método",
                "description": "Método de relleno: 'linear' (predeterminado; interpola por distancia a lo largo de la entidad) o 'nearest'."
              },
              "extrapolate": {
                "label": "Extrapolar",
                "description": "Rellena los huecos iniciales/finales extendiendo el vértice válido más próximo (predeterminado falso; en su lugar se cuentan los vértices sin rellenar)."
              }
            }
          },
          "calculate_motion_statistics": {
            "name": "Calcular estadísticas de movimiento",
            "description": "Anota puntos de trayectoria con marca de tiempo con estadísticas de movimiento — velocidad, aceleración, rumbo, distancia por segmento y acumulada, tiempo transcurrido e indicador de inactividad — agrupados por trayectoria y ordenados por tiempo, como Calcular estadísticas de movimiento de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos de entrada con observaciones con marca de tiempo."
              },
              "track_field": {
                "label": "Campo de trayectoria",
                "description": "Campo que identifica cada trayecto/objeto en movimiento."
              },
              "time_field": {
                "label": "Campo de tiempo",
                "description": "Campo que contiene la hora de cada punto: segundos numéricos o una marca de tiempo ISO-8601."
              },
              "output": {
                "label": "Salida",
                "description": "Vectorial de puntos de salida (atributos originales + campos de movimiento). Si se omite, se almacena en memoria."
              },
              "window": {
                "label": "Ventana",
                "description": "Número de puntos anteriores usados para la 'avg_speed' suavizada (predeterminado 1 = instantánea)."
              },
              "idle_distance": {
                "label": "Distancia de inactividad",
                "description": "Radio de inactividad: un punto está inactivo cuando el objeto en movimiento no ha recorrido más de esta distancia en los últimos idle_duration segundos. Predeterminado 0 (detección de inactividad desactivada)."
              },
              "idle_duration": {
                "label": "Duración de inactividad",
                "description": "Ventana retrospectiva (segundos) para la detección de inactividad. Predeterminado 60."
              }
            }
          },
          "calculate_polygon_main_angle": {
            "name": "Calcular ángulo principal del polígono",
            "description": "Escribe la orientación dominante de cada polígono (la dirección del lado largo de su rectángulo envolvente de área mínima, mediante calibradores rotatorios) en un campo de ángulo — como Calcular ángulo principal de polígono de ArcGIS. La orientación vectorial por polígono de la que carece patch_orientation, solo ráster; alimenta la rotación de símbolos/etiquetas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de polígonos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de polígonos de salida con el campo de ángulo añadido. Si se omite, se almacena en memoria."
              },
              "angle_field": {
                "label": "Campo de ángulo",
                "description": "Nombre del campo de ángulo que se va a escribir (predeterminado 'MainAngle')."
              },
              "convention": {
                "label": "Convención",
                "description": "'arithmetic' (antihorario desde el este; predeterminado), 'geographic' (horario desde el norte) o 'graphic' (horario desde el este)."
              }
            }
          },
          "calculate_rates": {
            "name": "Calcular tasas",
            "description": "Calcula tasas suavizadas a partir de campos de conteo y población (como Calcular tasas de ArcGIS): tasa bruta, Bayes empírico global de Marshall o Bayes empírico espacial sobre k vecinos más cercanos — el paso de estabilización estándar antes del análisis de puntos calientes de tasas de enfermedad/delincuencia.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de polígonos o puntos de entrada con campos de recuento y de población."
              },
              "count_field": {
                "label": "Campo de conteo",
                "description": "Campo que contiene el recuento de eventos (numerador)."
              },
              "population_field": {
                "label": "Campo de población",
                "description": "Campo que contiene la población en riesgo (denominador)."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de salida con los campos de tasa añadidos. Si se omite, se almacena en memoria."
              },
              "method": {
                "label": "Método",
                "description": "'crude', 'eb_global' (predeterminado) o 'eb_spatial'."
              },
              "per": {
                "label": "Por",
                "description": "Multiplicador de la tasa, p. ej., 100000 para tasas por 100 000 (predeterminado 100000)."
              },
              "neighbors": {
                "label": "Vecinos",
                "description": "Solo para eb_spatial: número de vecinos más próximos para la tasa de referencia local (predeterminado 8)."
              }
            }
          },
          "calculate_transformation_errors": {
            "name": "Calcular errores de transformación",
            "description": "Ajusta una transformación de similitud/afín/proyectiva a partir de enlaces de desplazamiento e informa del error residual de cada enlace más el RMSE global, de modo que los puntos de control defectuosos puedan detectarse y eliminarse antes de transformar. Como Calcular errores de transformación de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Líneas de enlace de desplazamiento: el primer vértice es el punto de origen (desde) y el último vértice el punto de destino (hasta)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida para la tabla de enlaces con los campos de residuos añadidos. Si se omite, se almacena en memoria."
              },
              "method": {
                "label": "Método",
                "description": "'affine' (predeterminado, 6 parámetros), 'similarity' (4) o 'projective' (8)."
              },
              "keep_geometry": {
                "label": "Conservar geometría",
                "description": "Conserva la geometría de cada enlace en la salida (predeterminado verdadero). Establecer en falso para obtener solo una tabla."
              }
            }
          },
          "calculate_transit_service_frequency": {
            "name": "Calcular frecuencia del servicio de tránsito",
            "description": "Frecuencia de servicio de transporte público GTFS en una ventana: para una fecha de servicio (mediante calendar/calendar_dates) y una ventana temporal, cuenta los viajes que sirven cada parada o línea de ruta e informa de los viajes por hora, como Calcular frecuencia de servicio de transporte público de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta a un directorio con un feed GTFS extraído."
              },
              "target": {
                "label": "Objetivo",
                "description": "'stops' (un punto por parada, predeterminado) o 'lines' (una polilínea por ruta)."
              },
              "date": {
                "label": "Fecha",
                "description": "Fecha de servicio YYYYMMDD, resuelta mediante calendar.txt/calendar_dates.txt. Si se omite, se cuentan todos los servicios."
              },
              "start_time": {
                "label": "Hora de inicio",
                "description": "Inicio de la ventana HH:MM o HH:MM:SS (las horas GTFS pueden superar las 24:00). Si se omite, se cuenta el día completo."
              },
              "duration_minutes": {
                "label": "Duración (minutos)",
                "description": "Duración de la ventana en minutos (se usa con start_time; también establece el denominador por hora)."
              },
              "count": {
                "label": "Conteo",
                "description": "'departures' (predeterminado) o 'arrivals' — qué campo de hora de parada se cuenta."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida (el controlador se deduce de la extensión). Si se omite, se almacena en memoria."
              }
            }
          },
          "calculate_utm_zone": {
            "name": "Calcular zona UTM",
            "description": "Calcula la zona UTM óptima y el código EPSG WGS84 de cada entidad a partir de la longitud/latitud de su centroide, añadiendo un campo de zona (1–60) y un campo EPSG (326##/327##) — para series de mapas con proyección adaptativa, como Calcular zona UTM de ArcGIS. Matemática pura con las excepciones de Noruega/Svalbard; sin PROJ. La geometría se lee como grados de longitud/latitud.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada (cualquier tipo de geometría) en coordenadas geográficas (grados de longitud/latitud, EPSG:4326)."
              },
              "zone_field": {
                "label": "Campo de zona",
                "description": "Nombre del campo entero que contendrá el número de zona UTM (1–60). Predeterminado 'utm_zone'."
              },
              "epsg_field": {
                "label": "Campo EPSG",
                "description": "Nombre del campo entero que contendrá el código EPSG UTM WGS84 (326## norte, 327## sur). Predeterminado 'utm_epsg'."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida (el controlador se deduce de la extensión). Si se omite, se almacena en memoria."
              }
            }
          },
          "cartogram": {
            "name": "Cartograma",
            "description": "Distorsiona polígonos para que el área sea proporcional a un valor de atributo: no contiguo (escala cada polígono respecto a su centroide) o Dorling (círculos proporcionales con eliminación de solapes).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de polígonos de entrada, formato detectado automáticamente (o identificador en memoria)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según su extensión). Si se omite, se almacena en memoria."
              },
              "value_field": {
                "label": "Campo de valor",
                "description": "Campo numérico a cuyo valor debe ser proporcional el área de cada entidad."
              },
              "method": {
                "label": "Método",
                "description": "'non_contiguous' (predeterminado; escala los polígonos en su sitio) o 'dorling' (círculos proporcionales)."
              },
              "iterations": {
                "label": "Iteraciones",
                "description": "Iteraciones de eliminación de superposiciones de Dorling (predeterminado 100). non_contiguous lo ignora."
              }
            }
          },
          "causal_inference_analysis": {
            "name": "Análisis de inferencia causal",
            "description": "Estima el efecto causal de un tratamiento binario sobre un resultado mediante emparejamiento por puntuación de propensión, ponderación por probabilidad inversa o ajuste por regresión, con un IC bootstrap con semilla y una tabla de balance de covariables por confusor antes/después del ajuste (como Análisis de inferencia causal de ArcGIS).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de entidades de entrada."
              },
              "outcome_field": {
                "label": "Campo de resultado",
                "description": "Campo numérico de resultado (dependiente)."
              },
              "treatment_field": {
                "label": "Campo de tratamiento",
                "description": "Campo de tratamiento binario (0/1 o booleano). Los tratamientos continuos no se admiten en esta versión."
              },
              "confounding_fields": {
                "label": "Campos de confusión",
                "description": "Campo(s) numérico(s) de factores de confusión que se van a ajustar, separados por comas."
              },
              "method": {
                "label": "Método",
                "description": "'ps_matching' (predeterminado, emparejamiento por calibre con el vecino más próximo sobre la puntuación de propensión), 'ipw' (ponderación estabilizada por la inversa de la probabilidad) o 'regression_adjustment' (resultado ~ tratamiento + factores de confusión)."
              },
              "add_spatial_confounders": {
                "label": "Añadir confusores espaciales",
                "description": "Si es verdadero, amplía el conjunto de factores de confusión con las coordenadas x/y de cada entidad más la media de los k vecinos más próximos de cada factor de confusión (predeterminado falso)."
              },
              "balance_threshold": {
                "label": "Umbral de balance",
                "description": "Umbral de diferencia de medias estandarizada para la comprobación de equilibrio posterior al ajuste (predeterminado 0.1)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (copia de la entrada + columnas de puntuación de propensión / peso / id de emparejamiento). Si se omite, se almacena en memoria."
              },
              "seed": {
                "label": "Semilla",
                "description": "Semilla entera para el intervalo de confianza bootstrap determinista (predeterminado 42)."
              }
            }
          },
          "cell_position_statistics": {
            "name": "Estadísticas de posición de celda",
            "description": "Estadísticas de posición y rango por celda a través de una pila de rásteres alineados (Posición más alta, Posición más baja, Popularidad y Rango de ArcGIS): qué capa contiene el valor extremo, el valor que aparece un número dado de veces o el n-ésimo valor más pequeño. cell_statistics reduce una pila a un valor y nunca puede indicar de qué capa procede, y el find_argument_statistics incluido trabaja a lo largo del eje de argumentos de un único ráster multibanda sin la semántica de selector de popularidad/rango.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Un ráster multibanda (cada banda es una capa) o una lista separada por comas de rásteres corregistrados."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de salida. Si se omite, se almacena en memoria."
              },
              "statistic": {
                "label": "Estadístico",
                "description": "'highest_position' (predeterminado), 'lowest_position', 'popularity' o 'rank'."
              },
              "selector": {
                "label": "Selector",
                "description": "Obligatorio para 'popularity' y 'rank': la ruta de un ráster corregistrado, o un número constante, que indica el recuento de apariciones por celda (popularity) o el rango (con índice desde 1) que se va a seleccionar."
              },
              "ignore_nodata": {
                "label": "Ignorar sin datos",
                "description": "Omite las observaciones NoData en cada celda (predeterminado verdadero). Si es falso, cualquier observación NoData convierte la celda en NoData."
              },
              "process_as_multiband": {
                "label": "Procesar como multibanda",
                "description": "'single_band' (predeterminado): cada banda de cada entrada es una capa de una única pila. 'multi_band': la banda i de cada entrada forma su propia pila, lo que da un resultado multibanda."
              }
            }
          },
          "cell_records_to_sectors": {
            "name": "Registros de celda a sectores",
            "description": "Construye geometría de cobertura de antenas a partir de puntos de torres de telefonía: polígonos en cuña o líneas bisectrices de sector a partir del acimut, ancho de haz y radio por torre — como Registros de emplazamientos celulares a clase de entidad / Generar líneas de sector de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos de entrada con antenas/torres."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida (el controlador se deduce de la extensión). Si se omite, se almacena en memoria."
              },
              "output_type": {
                "label": "Tipo de salida",
                "description": "Geometría que se genera: 'wedge' (polígonos de cobertura, predeterminado) o 'line' (líneas bisectrices del sector)."
              },
              "azimuth_field": {
                "label": "Campo de acimut",
                "description": "Campo que contiene el acimut de cada antena (grados de brújula, 0 = norte, sentido horario). Si falta, se recurre a 'azimuth'."
              },
              "beamwidth_field": {
                "label": "Campo de ancho de haz",
                "description": "Campo que contiene el ancho de haz de cada antena en grados. Si falta, se recurre a 'beamwidth'."
              },
              "radius_field": {
                "label": "Campo de radio",
                "description": "Campo que contiene el radio de cobertura de cada antena en unidades del CRS. Si falta, se recurre a 'radius'."
              },
              "azimuth": {
                "label": "Acimut",
                "description": "Acimut predeterminado en grados de brújula cuando no se indica ningún campo / falta un valor. Predeterminado 0."
              },
              "beamwidth": {
                "label": "Ancho de haz",
                "description": "Ancho de haz predeterminado en grados (0 < bw ≤ 360; ≥ 360 = omnidireccional). Predeterminado 65."
              },
              "radius": {
                "label": "Radio",
                "description": "Radio de cobertura predeterminado en unidades del CRS (debe ser positivo). Predeterminado 1000."
              },
              "segments": {
                "label": "Segmentos",
                "description": "Número de segmentos rectos usados para aproximar cada arco de sector (≥ 1). Predeterminado 16."
              }
            }
          },
          "cell_statistics": {
            "name": "Estadísticas de celda",
            "description": "Estadístico por píxel a través de una pila de rásteres alineados (como Estadísticas de celda de ArcGIS): media, mayoría, máximo, mediana, mínimo, minoría, percentil, rango, desviación estándar, suma o variedad — el reductor local multirráster que no proporcionan sum_overlay/weighted_sum (solo suma) ni las herramientas de vecindad/zonales incluidas.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Un ráster multibanda (cada banda es una capa) o una lista separada por comas de rásteres corregistrados."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster monobanda de salida con el valor reducido. Si se omite, se almacena en memoria."
              },
              "statistic": {
                "label": "Estadístico",
                "description": "'mean' (predeterminado), 'majority', 'maximum', 'median', 'minimum', 'minority', 'percentile', 'range', 'std', 'sum' o 'variety'."
              },
              "ignore_nodata": {
                "label": "Ignorar sin datos",
                "description": "Omite las observaciones NoData en cada celda (predeterminado verdadero). Si es falso, cualquier observación NoData convierte la celda en NoData."
              },
              "percentile_value": {
                "label": "Valor de percentil",
                "description": "Percentil en [0, 100] para el estadístico 'percentile' (predeterminado 50 = mediana)."
              }
            }
          },
          "central_feature": {
            "name": "Entidad central / media direccional lineal",
            "description": "La entidad central (la entidad de entrada con la menor distancia total a todas las demás) o la media direccional lineal (rumbo medio, varianza circular y longitud media de entidades lineales) — los dos miembros de Medición de distribuciones geográficas de los que carece directional_distribution (Entidad central / Media direccional lineal de ArcGIS).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada (puntos para central_feature; líneas para linear_directional_mean)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida (el controlador se deduce de la extensión). Si se omite, se almacena en memoria."
              },
              "statistic": {
                "label": "Estadístico",
                "description": "'central_feature' (predeterminado) o 'linear_directional_mean'."
              },
              "weight_field": {
                "label": "Campo de peso",
                "description": "Campo numérico opcional que pondera cada entidad (solo para central_feature)."
              },
              "case_field": {
                "label": "Campo de caso",
                "description": "Campo opcional por el que agrupar las entidades; un resultado por cada valor distinto."
              },
              "distance": {
                "label": "Distancia",
                "description": "Métrica de distancia para central_feature: 'euclidean' (predeterminado) o 'manhattan'."
              },
              "orientation_only": {
                "label": "Solo orientación",
                "description": "Trata las líneas como no dirigidas (orientación módulo 180°) para linear_directional_mean. Predeterminado falso."
              }
            }
          },
          "change_point_detection": {
            "name": "Detección de puntos de cambio",
            "description": "Detecta cambios abruptos en la serie temporal de cada ubicación de un cubo espacio-temporal H3 (como Detección de puntos de cambio de ArcGIS): segmentación binaria con un coste de cambio de media o de pendiente y una penalización escalada por sensibilidad (o un número fijo de puntos de cambio), informando por celda del número de cambios, el año del mayor cambio y las medias de los segmentos. La segmentación temporal que change_vector_analysis de dos fechas y las pruebas monotónicas de Mann-Kendall no pueden hacer.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de puntos de entrada con eventos con marca de tiempo (long./lat.)."
              },
              "time_field": {
                "label": "Campo de tiempo",
                "description": "Campo que contiene la hora de cada punto: un número o una marca de tiempo ISO-8601."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de polígonos H3 de salida con los atributos de los puntos de cambio. Si se omite, se almacena en memoria."
              },
              "value_field": {
                "label": "Campo de valor",
                "description": "Campo numérico que se agrega por celda (predeterminado: recuento de puntos)."
              },
              "change_type": {
                "label": "Tipo de cambio",
                "description": "'mean' (cambios de nivel; predeterminado) o 'slope' (cambios de tendencia)."
              },
              "method": {
                "label": "Método",
                "description": "'auto' (basado en penalización, predeterminado) o 'defined' (exactamente num_change_points)."
              },
              "num_change_points": {
                "label": "Número de puntos de cambio",
                "description": "Método defined: número de puntos de cambio que se buscan por ubicación (predeterminado 1)."
              },
              "sensitivity": {
                "label": "Sensibilidad",
                "description": "Método auto: escala de penalización; un valor mayor = menos puntos de cambio (predeterminado 1.0)."
              },
              "time_step": {
                "label": "Paso de tiempo",
                "description": "Amplitud de un paso temporal en las unidades de time_field (predeterminado 1)."
              },
              "resolution": {
                "label": "Resolución",
                "description": "Resolución H3 0..15 (predeterminado 7)."
              }
            }
          },
          "classification_accuracy_assessment": {
            "name": "Evaluación de la precisión de clasificación",
            "description": "Evalúa un ráster clasificado (o puntos que ya llevan una clase predicha) contra puntos de referencia etiquetados con verdad de terreno, produciendo una matriz de confusión, precisión global, precisión del productor/usuario por clase y kappa de Cohen — como Calcular matriz de confusión de ArcGIS.",
            "params": {
              "points": {
                "label": "Puntos",
                "description": "Capa de puntos de referencia (evaluación de la exactitud) que contiene el campo de clase de verdad de campo."
              },
              "class_field": {
                "label": "Campo de clase",
                "description": "Atributo de los puntos que contiene la etiqueta de clase de verdad de campo (referencia)."
              },
              "input": {
                "label": "Entrada",
                "description": "Ráster clasificado que se muestrea en cada punto de referencia (celda más próxima). Proporcione este O bien 'classified_field'."
              },
              "classified_field": {
                "label": "Campo clasificado",
                "description": "Atributo de los puntos que ya contiene la clase predicha (del mapa), usado en lugar de muestrear un ráster. Proporcione este O bien 'input'."
              },
              "band": {
                "label": "Banda",
                "description": "Banda (con índice desde 1) del ráster clasificado que se muestrea (predeterminado 1)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida para los puntos de referencia anotados con REF_CLASS, MAP_CLASS, CORRECT. Si se omite, se almacena en memoria."
              }
            }
          },
          "collapse_dual_lines_to_centerline": {
            "name": "Colapsar líneas dobles a eje central",
            "description": "Detecta pares de líneas aproximadamente paralelas dentro de una tolerancia de ancho (calzadas dobles, bordes de carreteras) y sustituye cada par por una única línea central, reconectando los cruces — como Colapsar líneas dobles a línea central de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de líneas de entrada (CRS proyectado; anchuras en sus unidades)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de líneas de salida (controlador según la extensión). Si se omite, se almacena en memoria."
              },
              "min_width": {
                "label": "Ancho mínimo",
                "description": "Separación mínima entre líneas emparejadas, en unidades del CRS (predeterminado 0)."
              },
              "max_width": {
                "label": "Ancho máximo",
                "description": "Separación máxima entre líneas emparejadas, en unidades del CRS. Obligatorio (la anchura de colapso)."
              },
              "attribute": {
                "label": "Atributo",
                "description": "Campo opcional que debe coincidir para que dos líneas se emparejen (p. ej., el nombre o la clase de la carretera)."
              },
              "sample_distance": {
                "label": "Distancia de muestreo",
                "description": "Intervalo de densificación para la comprobación de paralelismo, en unidades del CRS. Predeterminado: max_width / 2."
              },
              "min_overlap": {
                "label": "Solape mínimo",
                "description": "Fracción mínima de una línea que debe discurrir paralela a su pareja para emparejarse (0-1, predeterminado 0.5)."
              }
            }
          },
          "collapse_hydro_polygon": {
            "name": "Colapsar polígono hidrográfico",
            "description": "Colapsa polígonos de agua estrechos a líneas centrales manteniendo los tramos anchos como polígonos (como Colapsar polígono hidrográfico de ArcGIS): traza la línea central de cada polígono a lo largo de su eje principal mediante los puntos medios de secciones transversales perpendiculares, mide el ancho local y colapsa donde el ancho mediano está en o por debajo de un umbral. La generalización polígono→línea con umbral de ancho que collapse_dual_lines_to_centerline (bordes de líneas) y river_centerlines (ráster) no hacen.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de polígonos de agua de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de salida con las líneas centrales de los polígonos colapsados (estrechos). Si se omite, se almacena en memoria."
              },
              "collapse_width": {
                "label": "Ancho de colapso",
                "description": "Los polígonos cuya anchura mediana sea igual o inferior a este valor se colapsan en una línea central."
              },
              "sample_distance": {
                "label": "Distancia de muestreo",
                "description": "Espaciado de las estaciones de sección transversal a lo largo del eje (predeterminado: collapse_width / 2)."
              },
              "min_length": {
                "label": "Longitud mínima",
                "description": "Descarta las líneas centrales colapsadas más cortas que este valor (predeterminado 0)."
              },
              "retained": {
                "label": "Retenidos",
                "description": "Capa de polígonos de salida opcional para los tramos anchos (no colapsados)."
              }
            }
          },
          "collapse_road_detail": {
            "name": "Colapsar detalle viario",
            "description": "Colapsa pequeños bucles y quiebros de carreteras (rotondas, huesos de perro, quiebros desplazados) por debajo de un umbral de diámetro en conexiones directas únicas para visualización a pequeña escala, preservando la conectividad de la red — como Colapsar detalle de carreteras de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de carreteras (líneas) de entrada, con formato detectado automáticamente (o identificador en memoria)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según su extensión). Si se omite, se almacena en memoria."
              },
              "collapse_distance": {
                "label": "Distancia de colapso",
                "description": "Diámetro máximo del detalle que se va a colapsar. Los bucles/quiebros cuyo diámetro envolvente sea inferior a este valor (metros para un CRS geográfico, unidades del CRS en los demás casos) se colapsan; los mayores se conservan."
              },
              "road_class_field": {
                "label": "Campo de clase de carretera",
                "description": "Campo opcional de clase de carretera. Cuando se establece, solo se colapsan los bucles cuyas carreteras de contorno comparten todas el mismo valor de clase (los cruces entre clases distintas se conservan)."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Distancia dentro de la cual los extremos de las carreteras se tratan como el mismo cruce. Predeterminado 1e-6."
              }
            }
          },
          "collect_events": {
            "name": "Recopilar eventos",
            "description": "Colapsa puntos de incidentes coincidentes en ubicaciones únicas, cada una con un conteo ICOUNT de los eventos allí ocurridos, como Recopilar eventos de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos de entrada (Point o MultiPoint)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de puntos de salida (controlador según la extensión). Si se omite, se almacena en memoria."
              },
              "tolerance": {
                "label": "Tolerancia",
                "description": "Tolerancia de ajuste en unidades de mapa; los puntos cuyas coordenadas se redondean a la misma celda se tratan como coincidentes (predeterminado 1e-8, es decir, exacto en la práctica)."
              }
            }
          },
          "colocation_analysis": {
            "name": "Análisis de colocalización",
            "description": "Cociente de colocación local (Leslie y Kronenfeld) que mide si los puntos de la categoría A se encuentran de forma desproporcionada entre vecinos de la categoría B, con un valor p de prueba de permutación con semilla — como Análisis de colocación de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos de entrada con un campo de categoría."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida (una copia de la entrada con los campos de colocalización). Si se omite, se almacena en memoria."
              },
              "category_field": {
                "label": "Campo de categoría",
                "description": "Campo que contiene la categoría de cada punto."
              },
              "category_a": {
                "label": "Categoría A",
                "description": "Categoría focal (A): los puntos cuya colocalización con B se mide."
              },
              "category_b": {
                "label": "Categoría B",
                "description": "Categoría de vecinos (B): los puntos con los que se contrasta A."
              },
              "neighbors": {
                "label": "Vecinos",
                "description": "Número de vecinos más próximos k (predeterminado 8)."
              },
              "weight": {
                "label": "Peso",
                "description": "Ponderación de vecinos: 'gaussian' (decaimiento con la distancia, predeterminado) o 'uniform'."
              },
              "permutations": {
                "label": "Permutaciones",
                "description": "Número de permutaciones de etiquetas para la prueba de significación (predeterminado 99; 0 lo desactiva)."
              },
              "seed": {
                "label": "Semilla",
                "description": "Semilla para el generador de números aleatorios de las permutaciones (predeterminado 1), para obtener resultados reproducibles."
              }
            }
          },
          "color_polygons": {
            "name": "Colorear polígonos",
            "description": "Asigna a cada polígono un pequeño índice de color entero de modo que dos polígonos adyacentes nunca compartan valor (como Calcular campo de teorema de color de ArcGIS) — estilo coroplético seguro frente a adyacencias mediante coloreado de grafos DSATUR sobre contigüidad de arista compartida (o de esquina compartida).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de polígonos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de polígonos de salida con el campo de color añadido. Si se omite, se almacena en memoria."
              },
              "field": {
                "label": "Campo",
                "description": "Nombre del campo de índice de color que se va a escribir (predeterminado 'color_id')."
              },
              "adjacency": {
                "label": "Adyacencia",
                "description": "'edge' (torre, límite compartido; predeterminado) o 'edge_or_corner' (reina, límite o vértice compartido)."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Tamaño de malla al que se ajustan los vértices antes de emparejar los límites (predeterminado 0 = exacto)."
              }
            }
          },
          "combine": {
            "name": "Combinar",
            "description": "Asigna un ID de zona único a cada combinación única de valores entre dos o más rásteres categóricos corregistrados, más una tabla de atributos de valores (ID, conteo, una columna por entrada).",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Lista separada por comas de >=2 rásteres categóricos/enteros corregistrados que se van a combinar."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional del ráster para la malla de identificadores de condiciones únicas. Si se omite, se almacena en memoria."
              },
              "csv_output": {
                "label": "Salida CSV",
                "description": "Ruta CSV opcional para la tabla de atributos de valores (value, count, una columna por ráster de entrada)."
              },
              "band": {
                "label": "Banda",
                "description": "Banda que se lee de cada ráster de entrada, con índice desde 1. Predeterminado 1."
              }
            }
          },
          "compare_spatial_weights": {
            "name": "Comparar pesos espaciales",
            "description": "Clasifica conceptualizaciones candidatas de pesos espaciales (KNN, banda de distancia fija, contigüidad por aristas / aristas+esquinas, Delaunay) según la fuerza con la que cada una captura la agrupación espacial de uno o más campos de análisis, usando la I de Moran global estandarizada por filas con su puntuación z y valor p bilateral — como Comparar conceptualizaciones de vecindad de ArcGIS. Emite una tabla comparativa ordenada y el único mejor método.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada (puntos/líneas/polígonos; la contigüidad requiere polígonos)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de la tabla de comparación de salida — un CSV (extensión .csv) o una tabla vectorial sin geometría. Si se omite, se almacena en memoria."
              },
              "input_fields": {
                "label": "Campos de entrada",
                "description": "Lista separada por comas de nombres de campos numéricos que se analizarán para detectar agrupamiento espacial."
              },
              "id_field": {
                "label": "Campo de ID",
                "description": "Campo que contiene el identificador único de cada entidad (se acepta por compatibilidad; no es necesario para calcular la I de Moran)."
              },
              "methods": {
                "label": "Métodos",
                "description": "Conceptualizaciones candidatas separadas por comas entre: knn, fixed_distance_band, contiguity_edges, contiguity_edges_corners, delaunay. Predeterminado 'knn,contiguity_edges,contiguity_edges_corners'. Se omiten los métodos que no son aplicables a la geometría (o que dan error)."
              },
              "number_of_neighbors": {
                "label": "Número de vecinos",
                "description": "Número k de vecinos más próximos para el método knn. Predeterminado 8."
              },
              "threshold_distance": {
                "label": "Distancia umbral",
                "description": "Umbral de la banda de distancia en unidades del mapa. Solo es necesario cuando fixed_distance_band está entre los métodos."
              }
            }
          },
          "composite_bands": {
            "name": "Componer bandas",
            "description": "Apila varios rásteres monobanda en un ráster multibanda, en el orden dado (Bandas compuestas de ArcGIS). El create_colour_composite incluido está fijado a tres bandas RGB, por lo que no había forma de ensamblar la entrada de N bandas que band_collection_statistics, principal_component_analysis, spectral_index y la suite OBIA requieren.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Rutas de rásteres separadas por comas o punto y coma, en el orden de las bandas de salida. Al menos una."
              },
              "band": {
                "label": "Banda",
                "description": "Banda que se toma de cada entrada, con índice desde 1, cuando una entrada es a su vez multibanda (predeterminado 1)."
              },
              "nodata_policy": {
                "label": "Política de sin datos",
                "description": "'any' (predeterminado): una celda es sin datos si alguna banda es sin datos. 'all': solo si lo son todas las bandas."
              },
              "nodata": {
                "label": "Sin datos",
                "description": "Valor sin datos de la salida (predeterminado: el valor sin datos de la primera entrada)."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster multibanda de salida. Si se omite, se almacena en memoria."
              }
            }
          },
          "compute_accuracy_for_object_detection": {
            "name": "Calcular precisión de detección de objetos",
            "description": "Evalúa entidades detectadas contra la verdad de terreno mediante emparejamiento por IoU, informando de la precisión, exhaustividad y precisión media por clase y del mAP global, como Calcular precisión para detección de objetos de ArcGIS.",
            "params": {
              "detected": {
                "label": "Detectados",
                "description": "Entidades detectadas (polígonos o rectángulos delimitadores)."
              },
              "ground_truth": {
                "label": "Verdad de terreno",
                "description": "Entidades de referencia con las que se compara la puntuación."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional de la tabla de exactitud. Si se omite, se almacena en memoria."
              },
              "detected_class_field": {
                "label": "Campo de clase detectada",
                "description": "Campo de etiqueta de clase en las detecciones. Omítalo para puntuarlo todo como una sola clase."
              },
              "ground_truth_class_field": {
                "label": "Campo de clase de verdad de terreno",
                "description": "Campo de etiqueta de clase en la verdad de campo. Omítalo para puntuarlo todo como una sola clase."
              },
              "confidence_field": {
                "label": "Campo de confianza",
                "description": "Campo de puntuación de confianza en las detecciones, usado para ordenarlas al calcular la precisión media. Sin él, las detecciones se puntúan en el orden de entrada."
              },
              "min_iou": {
                "label": "IoU mínimo",
                "description": "Intersección sobre unión mínima para que una detección se considere una coincidencia (predeterminado 0.5)."
              }
            }
          },
          "compute_sar_indices": {
            "name": "Calcular índices SAR",
            "description": "Deriva índices SAR polarimétricos — RVI (índice de vegetación radar), RFDI (índice radar de degradación forestal), CSI (índice de estructura del dosel) y DPSVI (índice de vegetación SAR de doble polarización) — a partir de retrodispersión multipolarización (Calcular índices SAR de ArcGIS). spectral_index solo cubre álgebra de bandas ópticas: sus fórmulas y convenciones de bandas pertenecen al dominio de la reflectancia y no tiene noción de canales de polarización, por lo que la cadena SAR del catálogo (multilook, sar_coherence, filtros de speckle) carece actualmente de un punto final de análisis.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster SAR calibrado multipolarización (una banda por polarización)."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de índice de salida. Si se omite, se almacena en memoria."
              },
              "index": {
                "label": "Índice",
                "description": "'rvi' (predeterminado), 'rfdi', 'csi' o 'dpsvi'."
              },
              "polarization_bands": {
                "label": "Bandas de polarización",
                "description": "Asignación de bandas con índice desde 1, p. ej. 'vv=1,vh=2' o 'hh=1,hv=2,vv=3'. Predeterminado según el número de bandas: 2 bandas = 'vv=1,vh=2', 3 o más bandas = 'hh=1,hv=2,vv=3'."
              },
              "input_units": {
                "label": "Unidades de entrada",
                "description": "'linear' (predeterminado) o 'db'. La entrada en dB se convierte a potencia lineal antes de la aritmética de cocientes, porque los cocientes de decibelios carecen de sentido."
              }
            }
          },
          "construct_sight_lines": {
            "name": "Construir líneas de visión",
            "description": "Construye entidades de líneas de visión entre puntos de observador y entidades objetivo, con desplazamientos de altura de observador/objetivo, muestreo a lo largo de objetivos lineales y areales, campos opcionales de acimut y ángulo vertical, y distancia 2D o 3D. Como Construir líneas de visión de ArcGIS.",
            "params": {
              "observers": {
                "label": "Observadores",
                "description": "Entidades de puntos de observación."
              },
              "targets": {
                "label": "Objetivos",
                "description": "Entidades de destino de punto, línea o polígono."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida de las líneas de visión. Si se omite, se almacena en memoria."
              },
              "observer_height_field": {
                "label": "Campo de altura del observador",
                "description": "Campo opcional que indica el desplazamiento de altura de cada observador (se suma a su Z)."
              },
              "target_height_field": {
                "label": "Campo de altura del objetivo",
                "description": "Campo opcional que indica el desplazamiento de altura de cada destino (se suma a su Z)."
              },
              "join_field": {
                "label": "Campo de unión",
                "description": "Campo opcional presente en ambas entradas; solo se emparejan los observadores y los destinos que comparten un valor. Sin él, cada observador se empareja con todos los destinos."
              },
              "sample_distance": {
                "label": "Distancia de muestreo",
                "description": "Espaciado en unidades del mapa para los puntos de destino generados a lo largo de los límites de líneas/polígonos (predeterminado: un punto por vértice)."
              },
              "output_direction": {
                "label": "Dirección de salida",
                "description": "Añadir los campos AZIMUTH y VERT_ANGLE (predeterminado false)."
              },
              "distance_method": {
                "label": "Método de distancia",
                "description": "'2d' (predeterminado) o '3d' para el campo DISTANCE."
              }
            }
          },
          "contiguous_cartogram": {
            "name": "Cartograma contiguo",
            "description": "Cartograma de ecualización de densidad (difusión de Gastner-Newman): distorsiona las áreas de los polígonos en proporción a un atributo manteniendo el mapa como una hoja conectada con fronteras compartidas (Generar cartograma contiguo de ArcGIS). La herramienta cartogram incluida implementa solo los métodos no contiguo y Dorling, ambos destruyen la adyacencia, y la documentación de su propio módulo pospone la forma contigua.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de polígonos contiguos."
              },
              "value_field": {
                "label": "Campo de valor",
                "description": "Atributo numérico positivo a cuyo total deben pasar a ser proporcionales las áreas."
              },
              "grid_size": {
                "label": "Tamaño de malla",
                "description": "Resolución de la malla de densidad; debe ser una potencia de dos (predeterminado 256). Es el parámetro que más influye en la relación exactitud/coste."
              },
              "iterations": {
                "label": "Iteraciones",
                "description": "Pasos de difusión (predeterminado 20). Más pasos igualan más la densidad a costa de una mayor distorsión."
              },
              "blur": {
                "label": "Desenfoque",
                "description": "Suavizado gaussiano previo del campo de densidad, en celdas de malla (predeterminado 0.5). Evita la distorsión extrema que produce una discontinuidad abrupta de densidad."
              },
              "sea_density": {
                "label": "Densidad marina",
                "description": "Densidad fuera del área de estudio: 'mean' (predeterminado) o 'min'. Esto cambia sustancialmente el resultado en el borde del mapa."
              },
              "densify_spacing": {
                "label": "Espaciado de densificación",
                "description": "Longitud máxima de los segmentos de borde en celdas de malla antes de insertar vértices (predeterminado 1.0). De lo contrario, los bordes rectos largos se separan de sus vecinos."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de polígonos de salida con los vértices desplazados y los atributos originales. Si se omite, se almacena en memoria."
              }
            }
          },
          "contour_list": {
            "name": "Lista de curvas de nivel",
            "description": "Genera curvas de nivel en una lista explícita de valores en lugar de un intervalo fijo, como polilíneas encadenadas o polígonos rellenos, cada uno etiquetado con su nivel (Lista de curvas de nivel de ArcGIS). El contours_from_raster incluido solo acepta «interval» y «base», por lo que las series irregulares que usan los mapas reales — escalones de profundidad IHO, etapas de recurrencia de inundación, cortes de clase publicados — necesitan una ejecución por valor y una fusión, y aun así no pueden salir como una única capa etiquetada por nivel.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de superficie de entrada."
              },
              "contour_values": {
                "label": "Valores de curvas de nivel",
                "description": "Lista separada por comas de los niveles que se van a contornear, en las unidades z propias del ráster."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de curvas de nivel de salida. Si se omite, se almacena en memoria."
              },
              "geometry_type": {
                "label": "Tipo de geometría",
                "description": "'polyline' (predeterminado) para líneas de contorno, o 'polygon' para la región rellena situada en cada nivel o por encima de él."
              },
              "min_length": {
                "label": "Longitud mínima",
                "description": "Descartar las líneas de contorno más cortas que este valor, en unidades del mapa, lo que elimina las motas que produce una superficie ruidosa."
              },
              "close_rings": {
                "label": "Cerrar anillos",
                "description": "Repetir el primer vértice en los contornos que se cierran sobre sí mismos (predeterminado true)."
              },
              "band": {
                "label": "Banda",
                "description": "Banda que se va a contornear, con índice desde 1 (predeterminado 1)."
              }
            }
          },
          "contour_with_barriers": {
            "name": "Curvas de nivel con barreras",
            "description": "Traza líneas de curvas de nivel de isovalor de una superficie que terminan en entidades de barrera en lugar de cruzarlas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de superficie continua de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional del vectorial de líneas (el controlador se deduce de su extensión). Si se omite, se almacena en memoria."
              },
              "barriers": {
                "label": "Barreras",
                "description": "Capa vectorial de barreras opcional (líneas o polígonos). Las curvas de nivel no cruzarán estas entidades."
              },
              "interval": {
                "label": "Intervalo",
                "description": "Intervalo entre curvas de nivel en unidades de la superficie. Los niveles son base + k*intervalo dentro del rango de los datos. Se ignora si se proporciona 'levels'."
              },
              "base": {
                "label": "Base",
                "description": "Valor base a partir del cual se mide el intervalo (predeterminado 0)."
              },
              "levels": {
                "label": "Niveles",
                "description": "Valores de curvas de nivel explícitos separados por comas (p. ej. \"10,20,30\"). Prevalecen sobre interval/base."
              },
              "band": {
                "label": "Banda",
                "description": "Banda (con índice desde 1) que se lee (predeterminado 1)."
              }
            }
          },
          "convert_coordinate_notation": {
            "name": "Convertir notación de coordenadas",
            "description": "Convierte la coordenada de cada entidad entre notaciones — grados decimales (DD), grados-minutos-segundos (DMS), grados-minutos decimales (DDM), UTM y MGRS/USNG — escribiendo un nuevo campo en la notación de destino, como Convertir notación de coordenadas de ArcGIS. Matemática de cuadrícula pura (Mercator transversa de Krüger + letras MGRS sobre WGS84); sin PROJ.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos (o de tabla) de entrada."
              },
              "input_notation": {
                "label": "Notación de entrada",
                "description": "Notación de la coordenada de entrada: DD, DMS, DDM, UTM o MGRS."
              },
              "output_notation": {
                "label": "Notación de salida",
                "description": "Notación de destino que se va a escribir: DD, DMS, DDM, UTM o MGRS."
              },
              "coord_field": {
                "label": "Campo de coordenadas",
                "description": "Campo que contiene la cadena de la coordenada de entrada. Si se omite, se usa la geometría del punto (válido solo cuando input_notation=DD; en la geometría x=longitud, y=latitud)."
              },
              "output_field": {
                "label": "Campo de salida",
                "description": "Nombre del campo que se va a escribir. Predeterminado: la notación de salida en minúsculas (p. ej. 'utm')."
              },
              "precision": {
                "label": "Precisión",
                "description": "Dígitos MGRS por eje (1=10km … 5=1m, hasta 9). Predeterminado 5. Las demás notaciones lo ignoran."
              },
              "update_geometry": {
                "label": "Actualizar geometría",
                "description": "Si es verdadero, reconstruye la geometría de cada entidad como un punto de longitud/latitud en EPSG:4326 a partir de la coordenada analizada. Predeterminado false (conserva la geometría/CRS de entrada)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida (el controlador se deduce de la extensión). Si se omite, se almacena en memoria."
              }
            }
          },
          "convert_sar_units": {
            "name": "Convertir unidades SAR",
            "description": "Convierte un ráster SAR entre representaciones de amplitud, intensidad, potencia lineal, decibelios, complejo a intensidad y fase desenrollada a desplazamiento (Convertir unidades SAR de ArcGIS). raster_calculator puede evaluar la aritmética pero no incorpora ninguna de las semánticas ni salvaguardas — devuelve -inf para celdas con valor cero en una conversión logarítmica, y nada en el catálogo registra en qué unidad está un ráster SAR, por lo que los filtros de speckle y los índices de cociente se aplican habitualmente a la representación equivocada.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster SAR de entrada. Para 'complex_to_intensity' es un ráster I/Q de dos bandas (el convenio de multilook / sar_coherence)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida. Si se omite, se almacena en memoria."
              },
              "conversion": {
                "label": "Conversión",
                "description": "'linear_to_db', 'db_to_linear', 'amplitude_to_intensity', 'intensity_to_amplitude', 'complex_to_intensity' o 'phase_to_displacement'."
              },
              "wavelength": {
                "label": "Longitud de onda",
                "description": "Longitud de onda del radar en metros para 'phase_to_displacement' (predeterminado 0.05546576, banda C de Sentinel-1)."
              },
              "band": {
                "label": "Banda",
                "description": "Banda que se lee, con índice desde 1 (predeterminado 1). Se ignora para 'complex_to_intensity', que siempre lee las bandas 1 y 2 como I y Q."
              }
            }
          },
          "coregister_rasters": {
            "name": "Corregistrar rásteres",
            "description": "Alinea automáticamente un ráster secundario a uno de referencia mediante correlación cruzada normalizada de una malla de teselas, refinamiento subpíxel del pico, ajuste de transformación por mínimos cuadrados con recorte de valores atípicos y remuestreo (Aplicar corregistro de ArcGIS). Es la precondición ausente para toda la cadena InSAR del catálogo: sar_coherence, flatten_interferogram y goldstein_phase_filter requieren entradas corregistradas y nada las producía. georeference_raster_from_control_points necesita puntos de control elegidos a mano, image_correlation solo puntúa la similitud y warp_raster necesita que se le suministre una transformación.",
            "params": {
              "reference": {
                "label": "Referencia",
                "description": "Ráster de referencia. La salida se escribe sobre la malla de este ráster."
              },
              "secondary": {
                "label": "Secundario",
                "description": "Ráster que se va a alinear con la referencia. Se remuestrean todas sus bandas."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster secundario remuestreado de salida sobre la malla de referencia. Si se omite, se almacena en memoria."
              },
              "tie_points": {
                "label": "Puntos de enlace",
                "description": "Capa de puntos de salida con los puntos de enlace aceptados junto con su desplazamiento medido y su correlación. Se genera siempre; se almacena en memoria cuando no se indica ninguna ruta."
              },
              "band": {
                "label": "Banda",
                "description": "Banda usada para el emparejamiento, con índice desde 1 (predeterminado 1). Una entrada de dos bandas se empareja por su magnitud compleja salvo que se indique este valor."
              },
              "transform": {
                "label": "Transformación",
                "description": "'translation', 'affine' (predeterminado) o 'polynomial2'."
              },
              "tile_size": {
                "label": "Tamaño de tesela",
                "description": "Lado de cada tesela de emparejamiento en celdas (predeterminado 32)."
              },
              "grid_size": {
                "label": "Tamaño de malla",
                "description": "Número de teselas por eje (predeterminado 8, es decir, 64 teselas)."
              },
              "max_shift": {
                "label": "Desplazamiento máximo",
                "description": "Semianchura de la ventana de búsqueda entera en celdas (predeterminado 8)."
              },
              "min_correlation": {
                "label": "Correlación mínima",
                "description": "Rechazar los puntos de enlace cuya correlación normalizada máxima esté por debajo de este valor (predeterminado 0.3)."
              },
              "outlier_sigma": {
                "label": "Sigma de valores atípicos",
                "description": "Recortar los puntos de enlace cuyo residuo de ajuste supere este número de desviaciones estándar (predeterminado 3.0). Establecer en 0 para desactivar el recorte."
              },
              "resample": {
                "label": "Remuestrear",
                "description": "'bilinear' (predeterminado) o 'nearest'."
              }
            }
          },
          "corridor": {
            "name": "Corredor",
            "description": "Corredor de menor coste entre dos superficies de coste acumulado (Corredor de ArcGIS): suma dos rásteres de distancia de coste en una superficie de corredor cuyo mínimo es la trayectoria de menor coste y, opcionalmente, aplica un umbral para obtener la banda casi óptima. Modo directo (dos rásteres de coste) o modo de conveniencia (un ráster de fricción + dos rásteres de origen).",
            "params": {
              "cost1": {
                "label": "Coste 1",
                "description": "Primer ráster de coste acumulado (desde el origen A). Modo directo."
              },
              "cost2": {
                "label": "Coste 2",
                "description": "Segundo ráster de coste acumulado (desde el origen B). Modo directo."
              },
              "cost": {
                "label": "Coste",
                "description": "Ráster de fricción/coste de paso. Modo simplificado (con source1/source2)."
              },
              "source1": {
                "label": "Origen 1",
                "description": "Primer ráster de orígenes (las celdas positivas son orígenes). Modo simplificado."
              },
              "source2": {
                "label": "Origen 2",
                "description": "Segundo ráster de orígenes (las celdas positivas son orígenes). Modo simplificado."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de corredor de salida. Si se omite, se almacena en memoria."
              },
              "threshold": {
                "label": "Umbral",
                "description": "Conservar solo las celdas cuyo coste de corredor sea igual o inferior a este valor absoluto (el resto se enmascara como sin datos)."
              },
              "percent": {
                "label": "Porcentaje",
                "description": "Conservar solo las celdas que estén dentro de este porcentaje por encima del coste mínimo del corredor (p. ej. 5 = dentro del 5%). Se ignora si se establece 'threshold'."
              },
              "band": {
                "label": "Banda",
                "description": "Banda que se lee del ráster o rásteres de entrada, con índice desde 1. Predeterminado 1."
              }
            }
          },
          "cost_back_link": {
            "name": "Enlace inverso de coste",
            "description": "Emite el ráster de codificación de dirección de vecino 0-8 que indica, para cada celda, el siguiente paso a lo largo de la ruta de menor coste de regreso al origen más cercano, más la superficie de coste acumulado (Retroenlace de coste y Retroenlace de trayectoria de ArcGIS). cost_distance, cost_pathway y cost_allocation calculan esto internamente y lo descartan, por lo que retrazar N destinos cuesta actualmente N resoluciones completas de coste en lugar de una pasada de acumulación más N recorridos baratos.",
            "params": {
              "source": {
                "label": "Origen",
                "description": "Celdas de origen: un ráster (cualquier celda distinta de cero y con datos es un origen) o una capa vectorial de puntos/multipuntos."
              },
              "cost": {
                "label": "Coste",
                "description": "Ráster de coste por unidad de distancia. Opcional cuando se proporciona 'surface' (en ese caso el coste es 1 en todas partes por defecto, lo que da la distancia sobre la superficie pura)."
              },
              "surface": {
                "label": "Superficie",
                "description": "Ráster de elevación opcional que habilita la variante Path Back Link: el espaciado horizontal se sustituye por la distancia real sobre la superficie sqrt(dxy^2 + dz^2)."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de retroenlace de salida (0 = origen, 1-8 = dirección hacia el origen, 1 = este en sentido antihorario). Si se omite, se almacena en memoria."
              },
              "out_distance": {
                "label": "Distancia de salida",
                "description": "Ráster de coste acumulado. Se genera siempre; recurre a un identificador en memoria cuando no se indica ninguna ruta."
              },
              "max_distance": {
                "label": "Distancia máxima",
                "description": "Umbral de acumulación opcional: las celdas cuyo coste supere este valor se dejan como inalcanzables."
              }
            }
          },
          "cost_connectivity": {
            "name": "Conectividad de coste",
            "description": "Red de menor coste que conecta múltiples sitios sobre una superficie de coste (como Conectividad de coste / Conexiones óptimas de regiones de ArcGIS): asignación de Dijkstra multiorigen, trayectorias de menor coste por pares entre regiones adyacentes y su árbol de expansión mínimo — la red de menor coste que cost_distance y path_distance de origen único incluidos no pueden construir.",
            "params": {
              "sources": {
                "label": "Orígenes",
                "description": "Capa de puntos con los sitios/regiones que se van a conectar."
              },
              "cost": {
                "label": "Coste",
                "description": "Ráster de coste/fricción (coste de tránsito por celda; las celdas sin datos son barreras)."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de polilíneas de salida con las rutas de coste mínimo. Si se omite, se almacena en memoria."
              },
              "connections": {
                "label": "Conexiones",
                "description": "'mst' (árbol de expansión mínima que conecta todos los sitios; predeterminado) o 'all_neighbors' (todas las rutas entre regiones adyacentes)."
              },
              "id_field": {
                "label": "Campo de ID",
                "description": "Campo opcional para etiquetar los orígenes (predeterminado: el índice con base 1)."
              },
              "band": {
                "label": "Banda",
                "description": "Banda del ráster de coste, con índice desde 1 (predeterminado 1)."
              }
            }
          },
          "count_overlapping_features": {
            "name": "Contar entidades superpuestas",
            "description": "Aplana polígonos solapados en regiones disjuntas, cada una con el número (y opcionalmente los ID) de entidades de entrada que la cubren, como Contar entidades solapadas de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de polígonos de entrada (las entidades pueden solaparse)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de polígonos de salida (el controlador se deduce de la extensión) con un campo 'count'. Si se omite, se almacena en memoria."
              },
              "min_count": {
                "label": "Conteo mínimo",
                "description": "Conservar solo las regiones cubiertas al menos por este número de entidades (predeterminado 1; use 2 para obtener solo los solapes)."
              },
              "id_field": {
                "label": "Campo de ID",
                "description": "Campo opcional que identifica cada entidad de entrada (se usa en la columna de identificadores y en el informe). Predeterminado: el índice de la entidad."
              },
              "report_ids": {
                "label": "IDs de informe",
                "description": "Ruta CSV opcional para una tabla de unión region_id,feature_id (una fila por cada entidad que cubre la región)."
              }
            }
          },
          "create_accuracy_assessment_points": {
            "name": "Crear puntos de evaluación de precisión",
            "description": "Genera puntos de referencia distribuidos aleatoriamente y estratificados por las clases de un ráster clasificado o una capa de polígonos, prerrellenados con la clase del mapa y listos para el etiquetado de verdad de terreno (Crear puntos de evaluación de precisión de ArcGIS). classification_accuracy_assessment consume tales puntos pero nada los producía, y create_spatial_sampling_locations estratifica por entidad poligonal o campo en lugar de por clase ráster y no tiene asignación equilibrada.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster clasificado, o una capa de polígonos clasificada con 'class_field'."
              },
              "class_field": {
                "label": "Campo de clase",
                "description": "Atributo de clase, necesario cuando 'input' es una capa vectorial. Se ignora con entradas ráster, que usan el valor de la celda."
              },
              "num_points": {
                "label": "Número de puntos",
                "description": "Número total de puntos de referencia (predeterminado 500)."
              },
              "sampling_strategy": {
                "label": "Estrategia de muestreo",
                "description": "Uno de estos: 'stratified_random' (predeterminado, asigna proporcionalmente al área de cada clase), 'equalized_stratified' (mismo número por clase), 'random' (ignora la clase)."
              },
              "min_points_per_class": {
                "label": "Puntos mínimos por clase",
                "description": "Mínimo aplicado con 'stratified_random' para que las clases raras no se descarten (predeterminado 1)."
              },
              "band": {
                "label": "Banda",
                "description": "Banda de una entrada ráster, con índice desde 1 (predeterminado 1)."
              },
              "seed": {
                "label": "Semilla",
                "description": "Semilla para el generador de números aleatorios determinista (predeterminado 1)."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de puntos de salida con CLASSVALUE (clase del mapa), GrndTruth (-1 hasta que se recopila) y Stratum. Si se omite, se almacena en memoria."
              }
            }
          },
          "create_cartographic_partitions": {
            "name": "Crear particiones cartográficas",
            "description": "Produce polígonos de partición adaptativos y no solapados que contienen cada uno aproximadamente un número objetivo de entidades (más densos donde los datos se agrupan), de modo que los grandes trabajos de generalización / enmascarado puedan teselarse con cobertura segura — un equivalente en Rust puro de Crear particiones cartográficas de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada (cualquier geometría). Cada entidad se reduce a un punto representativo y se asigna a una partición."
              },
              "feature_count": {
                "label": "Número de entidades",
                "description": "Número máximo objetivo de entidades por partición. Una celda se divide mientras siga conteniendo más entidades que este valor. Predeterminado 1000."
              },
              "output": {
                "label": "Salida",
                "description": "Vectorial de polígonos de salida con las particiones (el controlador se deduce de la extensión). Si se omite, se almacena en memoria."
              }
            }
          },
          "create_overpass": {
            "name": "Crear paso elevado",
            "description": "Construye polígonos de máscara de recorte (y líneas de decoración opcionales con marcas de ala) donde una línea «superior» cruza una línea «inferior», de modo que la línea inferior quede enmascarada en el cruce.",
            "params": {
              "above": {
                "label": "Por encima",
                "description": "Vectorial de líneas con las entidades que pasan POR ENCIMA del cruce (la máscara se orienta a lo largo de ellas). Formato detectado automáticamente, o identificador en memoria."
              },
              "below": {
                "label": "Por debajo",
                "description": "Vectorial de líneas con las entidades enmascaradas POR DEBAJO del cruce (las líneas que se van a recortar). Formato detectado automáticamente, o identificador en memoria."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional de los polígonos de máscara (el controlador se deduce de su extensión). Si se omite, se almacena en memoria."
              },
              "output_decoration": {
                "label": "Decoración de salida",
                "description": "Ruta de salida opcional de las líneas de decoración con marcas laterales. Si se omite, se almacena en memoria (se sigue devolviendo como 'output_decoration')."
              },
              "margin_along": {
                "label": "Margen longitudinal",
                "description": "Semilongitud de cada máscara a lo largo de la línea superior, en unidades del CRS (la longitud de la máscara es el doble de este valor). Predeterminado 1.0."
              },
              "margin_across": {
                "label": "Margen transversal",
                "description": "Semianchura de cada máscara transversal a la línea superior, en unidades del CRS (la anchura de la máscara es el doble de este valor). Predeterminado 1.0."
              },
              "wing_type": {
                "label": "Tipo de ala",
                "description": "Estilo de decoración: 'none', 'perpendicular' (predeterminado; una marca transversal en cada extremo de la máscara) o 'parallel' (líneas de contorno a lo largo de cada lado)."
              }
            }
          },
          "create_routes": {
            "name": "Crear rutas",
            "description": "Disuelve entidades lineales por un campo identificador de ruta, ordena sus segmentos en una única polilínea por ruta y asigna medidas lineales (valores M) a partir de la longitud geométrica o de campos de medida inicial/final.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo vectorial de líneas de entrada, formato detectado automáticamente (o identificador en memoria)."
              },
              "route_id_field": {
                "label": "Campo de ID de ruta",
                "description": "Atributo que identifica cada ruta; las líneas de entrada se agrupan por él y se genera una ruta de salida por cada valor distinto."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional del vectorial de rutas (el controlador se deduce de su extensión). Si se omite, se almacena en memoria."
              },
              "measure_source": {
                "label": "Fuente de medida",
                "description": "Cómo se asignan las medidas: LENGTH (0..longitud geométrica), ONE_FIELD (el inicio procede de un campo, el final = inicio + longitud) o TWO_FIELDS (inicio/final procedentes de campos, interpolados). Predeterminado LENGTH."
              },
              "from_measure_field": {
                "label": "Campo de medida inicial",
                "description": "Campo numérico que indica la medida inicial de cada ruta (lo usan ONE_FIELD y TWO_FIELDS). Se lee del primer segmento de la ruta."
              },
              "to_measure_field": {
                "label": "Campo de medida final",
                "description": "Campo numérico que indica la medida final de cada ruta (lo usa TWO_FIELDS). Se lee del primer segmento de la ruta."
              },
              "measure_factor": {
                "label": "Factor de medida",
                "description": "Multiplicador aplicado a la medida natural (basada en la longitud), p. ej. 0.001 para convertir metros en kilómetros. Predeterminado 1.0."
              },
              "measure_offset": {
                "label": "Desplazamiento de medida",
                "description": "Valor que se suma a todas las medidas de la ruta (desplaza todos los valores m de la ruta). Predeterminado 0.0."
              },
              "ignore_gaps": {
                "label": "Ignorar huecos",
                "description": "Para LENGTH/ONE_FIELD, excluye de la medida acumulada los saltos rectos entre segmentos disjuntos para que los huecos no inflen las distancias. Predeterminado false."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Los extremos situados a menos de esta distancia (unidades del CRS) se consideran coincidentes al unir los segmentos. Predeterminado 1e-6."
              }
            }
          },
          "create_spatial_sampling_locations": {
            "name": "Crear ubicaciones de muestreo espacial",
            "description": "Genera puntos de muestreo sobre un área de estudio poligonal mediante diseño aleatorio simple, estratificado, sistemático (cuadrado/hexágono/triángulo) o por conglomerados, con aleatoriedad reproducible por semilla.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo vectorial de polígonos del área de estudio (o identificador en memoria)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional del vectorial de puntos (el controlador se deduce de su extensión). Si se omite, se almacena en memoria."
              },
              "method": {
                "label": "Método",
                "description": "'simple_random' (predeterminado), 'stratified', 'systematic' o 'cluster'."
              },
              "num_samples": {
                "label": "Número de muestras",
                "description": "Número total de puntos de muestra para simple_random, stratified y cluster. Predeterminado 100."
              },
              "strata_field": {
                "label": "Campo de estratos",
                "description": "Para stratified: agrupa las entidades de entrada en estratos según este atributo. Si se omite, cada entidad de entrada constituye su propio estrato."
              },
              "allocation": {
                "label": "Asignación",
                "description": "Para stratified: 'proportional' al área del estrato (predeterminado), 'equal' por estrato o 'population_field' proporcional al total de un campo."
              },
              "population_field": {
                "label": "Campo de población",
                "description": "Para allocation=population_field: el campo numérico cuyo total por estrato determina la asignación."
              },
              "bin_shape": {
                "label": "Forma de celda",
                "description": "Para systematic: retícula 'square' (predeterminado), 'hexagon' o 'triangle'."
              },
              "bin_size": {
                "label": "Tamaño de celda",
                "description": "Espaciado (unidades del CRS) para las retículas systematic y los intervalos de cluster. Es necesario para esos métodos."
              },
              "num_clusters": {
                "label": "Número de clústeres",
                "description": "Para cluster: cuántos intervalos se seleccionan aleatoriamente. Predeterminado 10."
              },
              "min_distance": {
                "label": "Distancia mínima",
                "description": "Espaciado mínimo entre los puntos de simple_random / stratified / cluster (unidades del CRS). Predeterminado 0 (sin restricción)."
              },
              "seed": {
                "label": "Semilla",
                "description": "Semilla para el generador de números aleatorios determinista (predeterminado 1)."
              }
            }
          },
          "create_spatially_balanced_points": {
            "name": "Crear puntos espacialmente equilibrados",
            "description": "Genera puntos de muestreo espacialmente bien distribuidos (cuasialeatorios de Halton) dentro de un polígono de restricción, opcionalmente ponderados por un ráster de probabilidad de inclusión, cada uno etiquetado con un orden de muestreo equilibrado, como Crear puntos espacialmente equilibrados de ArcGIS.",
            "params": {
              "constraint": {
                "label": "Restricción",
                "description": "Capa de polígonos de restricción; los puntos se generan dentro de estos polígonos."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de puntos de salida (controlador según la extensión). Si se omite, se almacena en memoria."
              },
              "num_points": {
                "label": "Número de puntos",
                "description": "Número de puntos de muestra que se van a generar."
              },
              "probability": {
                "label": "Probabilidad",
                "description": "Ráster de probabilidad de inclusión opcional; las celdas con valores más altos tienen más probabilidad de ser muestreadas (se normaliza por su máximo)."
              },
              "seed": {
                "label": "Semilla",
                "description": "Semilla aleatoria para un muestreo reproducible (predeterminado 1)."
              }
            }
          },
          "create_underpass": {
            "name": "Crear paso inferior",
            "description": "En los cruces de líneas, construye polígonos de máscara orientados a lo largo de la entidad superior y recorta un hueco correspondiente en la entidad inferior para que se lea como pasando por debajo (Crear paso inferior de ArcGIS). Hermana de create_overpass, que enmascara la línea inferior para que la superior se lea continua; un paso inferior necesita en cambio la interrupción decorativa, que es lo que distingue la boca de un túnel de un puente. Emite tanto las máscaras como las líneas inferiores recortadas.",
            "params": {
              "above": {
                "label": "Por encima",
                "description": "Vectorial de líneas con las entidades que pasan POR ENCIMA del cruce (las máscaras se orientan a lo largo de ellas). Formato detectado automáticamente, o identificador en memoria."
              },
              "below": {
                "label": "Por debajo",
                "description": "Vectorial de líneas con las entidades que pasan POR DEBAJO del cruce (las líneas en las que se abre el hueco). Formato detectado automáticamente, o identificador en memoria."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional de los polígonos de máscara del paso inferior. Si se omite, se almacena en memoria."
              },
              "output_lines": {
                "label": "Salida de líneas",
                "description": "Ruta de salida opcional de la capa inferior con los huecos del paso inferior recortados. Si se omite, se almacena en memoria (se sigue devolviendo como 'output_lines')."
              },
              "margin_along": {
                "label": "Margen longitudinal",
                "description": "Semilongitud de cada máscara medida A LO LARGO de la línea superior, en unidades del CRS; la máscara abarca el doble de este valor en esa dirección. Predeterminado 1.0."
              },
              "margin_across": {
                "label": "Margen transversal",
                "description": "Semianchura de cada máscara TRANSVERSAL a la línea superior, en unidades del CRS. En un cruce perpendicular es lo que delimita el hueco recortado en la línea inferior, por lo que la longitud eliminada es el doble de este valor. Predeterminado 1.0."
              },
              "min_angle": {
                "label": "Ángulo mínimo",
                "description": "Omitir los cruces en los que las dos líneas se encuentran con un ángulo menor que este, en grados, ya que una máscara casi paralela es inestable. Predeterminado 15."
              }
            }
          },
          "cul_de_sac_masks": {
            "name": "Máscaras de fondos de saco",
            "description": "Genera polígonos de máscara de recorte sensibles a la escala en los bulbos de los fondos de saco de una red viaria, como Máscaras de fondo de saco de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de ejes de carretera."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional de los polígonos de máscara. Si se omite, se almacena en memoria."
              },
              "reference_scale": {
                "label": "Escala de referencia",
                "description": "Denominador de la escala del mapa para la que se dimensiona la máscara (p. ej. 24000 para 1:24.000)."
              },
              "symbol_width": {
                "label": "Ancho de símbolo",
                "description": "Ancho del contorno de la carretera en unidades de página (véase 'page_unit') a la escala de referencia."
              },
              "margin": {
                "label": "Margen",
                "description": "Margen adicional alrededor del símbolo, en unidades de página (predeterminado 0)."
              },
              "page_unit": {
                "label": "Unidad de página",
                "description": "Unidad de 'symbol_width' y 'margin': points (predeterminado, 1/72 de pulgada), mm o inches."
              },
              "map_units_per_meter": {
                "label": "Unidades de mapa por metro",
                "description": "Unidades del CRS por metro (predeterminado 1, correcto para CRS proyectados basados en metros). Para una capa en grados use aproximadamente 0.000008983."
              },
              "tolerance": {
                "label": "Tolerancia",
                "description": "Tolerancia de ajuste de coordenadas para unir los extremos de las líneas en nodos de red (predeterminado 0.001 unidades del mapa)."
              },
              "attributes": {
                "label": "Atributos",
                "description": "ids_only (predeterminado) | all — indica si los atributos de la entidad de origen se trasladan a la máscara."
              }
            }
          },
          "cut_fill": {
            "name": "Desmonte y terraplén",
            "description": "Cambio volumétrico entre dos superficies DEM (antes/después) o entre una superficie y un plano de referencia: ráster de cambio de elevación con signo más volúmenes de corte, relleno y neto, con etiquetado opcional de volumen por región.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster 'antes' (o la superficie única en el modo de plano)."
              },
              "after": {
                "label": "Después",
                "description": "Ráster 'después' (modo de dos superficies). Debe compartir la malla de 'input'. Proporcione este o 'plane'."
              },
              "plane": {
                "label": "Plano",
                "description": "Elevación del plano de referencia (modo de volumen de superficie): el cambio se mide como la entrada menos este valor. Proporcione este o 'after'."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional del ráster de cambio de elevación con signo (Δz). Si se omite, se almacena en memoria."
              },
              "band": {
                "label": "Banda",
                "description": "Banda que se lee del ráster o rásteres de entrada, con índice desde 1. Predeterminado 1."
              },
              "tolerance": {
                "label": "Tolerancia",
                "description": "Las celdas con |Δz| igual o inferior a este valor (unidades z del CRS) se consideran sin cambios. Predeterminado 0."
              },
              "region_output": {
                "label": "Salida de regiones",
                "description": "Ruta ráster opcional para las etiquetas de las regiones contiguas de desmonte/terraplén (identificadores de región >= 1; las celdas sin cambios son NoData)."
              },
              "csv_output": {
                "label": "Salida CSV",
                "description": "Ruta CSV opcional para la tabla de volúmenes por región (region_id, type, cell_count, volume)."
              }
            }
          },
          "darcy_flow": {
            "name": "Flujo de Darcy",
            "description": "Campo de velocidad de Darcy de aguas subterráneas en estado estacionario a partir de rásteres de carga hidráulica, transmisividad y porosidad — un ráster de magnitud de flujo (velocidad de Darcy) y un ráster de dirección de flujo descendente (v = -(T/n)·∇carga), con seguimiento advectivo opcional de partículas (RK2) desde puntos semilla hasta polilíneas de líneas de corriente — como Flujo de Darcy / Seguimiento de partículas de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de carga hidráulica del agua subterránea (elevación del nivel freático). El tamaño de celda se toma de este ráster."
              },
              "transmissivity": {
                "label": "Transmisividad",
                "description": "Ráster de transmisividad (corregistrado con el ráster de carga hidráulica)."
              },
              "porosity": {
                "label": "Porosidad",
                "description": "Ráster de porosidad eficaz (corregistrado con el ráster de carga hidráulica; los valores deben ser > 0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de magnitud de la velocidad de Darcy de salida. Si se omite, se almacena en memoria."
              },
              "direction": {
                "label": "Dirección",
                "description": "Ruta de salida opcional del ráster de dirección de flujo (acimut en grados, desde el norte en sentido horario, en el sentido descendente del gradiente). Si se omite, se almacena en memoria."
              },
              "band": {
                "label": "Banda",
                "description": "Banda que se lee de cada ráster de entrada, con índice desde 1 (predeterminado 1)."
              },
              "seeds": {
                "label": "Semillas",
                "description": "Vectorial de puntos opcional con las semillas de partículas. Cuando se proporciona, se trazan líneas de corriente desde cada semilla."
              },
              "streamlines": {
                "label": "Líneas de corriente",
                "description": "Ruta de salida opcional del vectorial de líneas para las líneas de corriente de partículas trazadas (requiere 'seeds')."
              },
              "step": {
                "label": "Paso",
                "description": "Longitud de paso del seguimiento de partículas en unidades del CRS (predeterminado: el tamaño de celda del ráster de carga hidráulica)."
              },
              "max_steps": {
                "label": "Pasos máximos",
                "description": "Número máximo de pasos de integración por partícula (predeterminado 1000)."
              }
            }
          },
          "delineate_built_up_areas": {
            "name": "Delimitar áreas urbanizadas",
            "description": "Generaliza huellas de edificios densas en polígonos suaves de asentamiento / extensión urbana agrupando edificios cercanos (cierre morfológico), con filtros de número mínimo de edificios y de área.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de polígonos de huellas de edificios de entrada, formato detectado automáticamente (o identificador en memoria)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según su extensión). Si se omite, se almacena en memoria."
              },
              "grouping_distance": {
                "label": "Distancia de agrupación",
                "description": "Los edificios cuyas huellas se encuentran a esta distancia (unidades del CRS) se agrupan en una única área edificada. Establece el radio de cierre morfológico en la mitad de este valor."
              },
              "min_building_count": {
                "label": "Número mínimo de edificios",
                "description": "Descartar las áreas edificadas que contengan menos edificios que este número (predeterminado 1 — conserva todos los grupos)."
              },
              "min_area": {
                "label": "Área mínima",
                "description": "Descartar las áreas edificadas cuya superficie (unidades del CRS al cuadrado) esté por debajo de este valor y rellenar los huecos interiores menores que él. Predeterminado: conservarlas todas."
              },
              "simplify_tolerance": {
                "label": "Tolerancia de simplificación",
                "description": "Tolerancia de Douglas–Peucker (unidades del CRS) aplicada al límite del área edificada para adelgazar la zona de influencia redondeada con vértices densos. Predeterminado 0 (sin simplificación)."
              }
            }
          },
          "delineate_depressions": {
            "name": "Delimitar depresiones",
            "description": "Delinea depresiones anidadas a partir de un ráster de sumideros mediante el método de conjuntos de nivel (lidar slicing.py).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de sumideros de entrada (p. ej. la salida de extract_sinks)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de identificadores de depresión. Si se omite, se almacena en memoria."
              },
              "level_output": {
                "label": "Salida de nivel",
                "description": "Ruta de salida opcional del ráster de niveles de depresión."
              },
              "csv_output": {
                "label": "Salida CSV",
                "description": "Ruta de salida opcional del CSV de atributos de las depresiones."
              },
              "vector_output": {
                "label": "Salida vectorial",
                "description": "Ruta de salida opcional de los polígonos de depresión en formato GeoJSON (con los atributos unidos)."
              },
              "min_size": {
                "label": "Tamaño mínimo",
                "description": "Número mínimo de píxeles de una depresión (predeterminado 10)."
              },
              "min_depth": {
                "label": "Profundidad mínima",
                "description": "Profundidad mínima de la depresión (se acepta por compatibilidad; no se usa, para coincidir con lidar)."
              },
              "interval": {
                "label": "Intervalo",
                "description": "Intervalo de rebanado del método de conjuntos de nivel (predeterminado 0.3)."
              }
            }
          },
          "delineate_mounts": {
            "name": "Delimitar montes",
            "description": "Delinea la jerarquía anidada de rasgos elevados (montículos) en un DEM (lidar mounts.py).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster DEM de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de identificadores de montículo. Si se omite, se almacena en memoria."
              },
              "level_output": {
                "label": "Salida de nivel",
                "description": "Ruta de salida opcional del ráster de niveles de montículo."
              },
              "csv_output": {
                "label": "Salida CSV",
                "description": "Ruta de salida opcional del CSV de atributos de los montículos."
              },
              "vector_output": {
                "label": "Salida vectorial",
                "description": "Ruta de salida opcional de los polígonos de montículo en formato GeoJSON (con los atributos unidos)."
              },
              "min_size": {
                "label": "Tamaño mínimo",
                "description": "Número mínimo de píxeles de un montículo (predeterminado 10)."
              },
              "min_height": {
                "label": "Altura mínima",
                "description": "Altura mínima del montículo (se acepta por compatibilidad; no se usa, para coincidir con lidar)."
              },
              "interval": {
                "label": "Intervalo",
                "description": "Intervalo de rebanado del método de conjuntos de nivel (predeterminado 0.3)."
              },
              "delta": {
                "label": "Delta",
                "description": "Valor base que se añade al invertir el DEM (predeterminado 100)."
              }
            }
          },
          "dem_filter": {
            "name": "Filtro de MDE",
            "description": "Suaviza un DEM con un filtro de media, mediana o gaussiano (lidar filtering.py).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster DEM de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida. Si se omite, el resultado se almacena en memoria."
              },
              "filter": {
                "label": "Filtro",
                "description": "Tipo de filtro: 'mean', 'median' o 'gaussian' (predeterminado 'mean')."
              },
              "kernel_size": {
                "label": "Tamaño de kernel",
                "description": "Tamaño de la ventana en píxeles para los filtros mean/median (predeterminado 3)."
              },
              "sigma": {
                "label": "Sigma",
                "description": "Desviación estándar del filtro gaussiano (predeterminado 1.0)."
              },
              "band": {
                "label": "Banda",
                "description": "Banda que se va a filtrar, con índice desde 1 (predeterminado 1)."
              }
            }
          },
          "dendrogram": {
            "name": "Dendrograma",
            "description": "Construye un árbol de fusión jerárquico sobre las firmas de clase para mostrar cuán separables son las clases, como Dendrograma de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de entidades agrupadas que contiene un campo de clase y los campos numéricos que definen el espacio de rasgos."
              },
              "class_field": {
                "label": "Campo de clase",
                "description": "Campo que contiene el identificador de clase/clúster."
              },
              "fields": {
                "label": "Campos",
                "description": "Campos numéricos separados por comas que definen el espacio de rasgos."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional de la tabla de fusión. Si se omite, se almacena en memoria."
              },
              "distance": {
                "label": "Distancia",
                "description": "Distancia entre firmas: 'variance' (predeterminado; normalizada por la dispersión dentro de la clase) o 'mean_only'."
              },
              "standardize": {
                "label": "Estandarizar",
                "description": "Estandarizar cada campo a puntuaciones z antes de calcular las distancias para que los campos de rango amplio no dominen (predeterminado true)."
              },
              "output_text": {
                "label": "Salida de texto",
                "description": "Ruta opcional para una representación del árbol en texto plano con sangría."
              }
            }
          },
          "densify_sampling_network": {
            "name": "Densificar la red de muestreo",
            "description": "Propone nuevas ubicaciones de muestreo en las celdas de mayor superficie de predicción de kriging (error estándar), respetando una distancia de inhibición de espaciado mínimo, como Densificar red de muestreo de ArcGIS.",
            "params": {
              "prediction_error": {
                "label": "Error de predicción",
                "description": "Ráster de error estándar de predicción de entrada (p. ej. una superficie de varianza/error de kriging). Las nuevas muestras se dirigen a sus celdas de mayor error."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de puntos de salida (controlador según la extensión). Si se omite, se almacena en memoria."
              },
              "count": {
                "label": "Conteo",
                "description": "Número de nuevas ubicaciones de muestreo que se van a proponer."
              },
              "inhibition_distance": {
                "label": "Distancia de inhibición",
                "description": "Espaciado mínimo entre las muestras propuestas en unidades del mapa (predeterminado 0 = sin inhibición; solo las celdas de mayor error)."
              },
              "mask": {
                "label": "Máscara",
                "description": "Capa de polígonos opcional; solo son candidatas admisibles las celdas cuyo centro queda dentro."
              },
              "band": {
                "label": "Banda",
                "description": "Banda del ráster de error de predicción que se lee, con índice desde 1 (predeterminado 1)."
              }
            }
          },
          "detect_bright_ocean_objects": {
            "name": "Detectar objetos brillantes en el océano",
            "description": "Encuentra embarcaciones y otros objetivos puntuales brillantes sobre el agua en imágenes SAR con un detector CFAR de dos parámetros, y los emite como cuadros delimitadores orientados con longitud, ancho, rumbo y retrodispersión máxima (Detectar objetos oceánicos brillantes de ArcGIS). Ningún registro dispone de un detector de clutter local: un umbral global no puede funcionar porque el clutter marino se aclara con el viento y el ángulo de incidencia, matched_filter_target_detection es un detector óptico espectral y detect_image_anomalies usa un modelo global en lugar de uno de ventana deslizante.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de retrodispersión SAR."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de polígonos de salida con los objetos detectados. Si se omite, se almacena en memoria."
              },
              "geometry_type": {
                "label": "Tipo de geometría",
                "description": "'bounding_box' (predeterminado) para el rectángulo mínimo orientado, o 'perimeter' para el contorno trazado de la detección."
              },
              "threshold": {
                "label": "Umbral",
                "description": "Umbral de detección CFAR en desviaciones estándar del fondo (predeterminado 5.0)."
              },
              "guard_size": {
                "label": "Tamaño de guarda",
                "description": "Semianchura en celdas de la banda de guarda excluida de la estimación del fondo (predeterminado 3). Debe ser menor que background_size."
              },
              "background_size": {
                "label": "Tamaño de fondo",
                "description": "Semianchura en celdas del anillo de fondo (predeterminado 12)."
              },
              "mask_features": {
                "label": "Entidades de máscara",
                "description": "Capa de polígonos que enmascara la tierra o el agua. Las celdas excluidas por la máscara no se comprueban ni se usan como fondo."
              },
              "mask_type": {
                "label": "Tipo de máscara",
                "description": "'land_polygon' (predeterminado; analiza fuera de los polígonos) o 'water_polygon' (analiza dentro de ellos)."
              },
              "min_object_length": {
                "label": "Longitud mínima de objeto",
                "description": "Descartar los objetos más cortos que este valor, en unidades del mapa."
              },
              "max_object_length": {
                "label": "Longitud máxima de objeto",
                "description": "Descartar los objetos más largos que este valor, en unidades del mapa."
              },
              "min_object_width": {
                "label": "Ancho mínimo de objeto",
                "description": "Descartar los objetos más estrechos que este valor, en unidades del mapa."
              },
              "max_object_width": {
                "label": "Ancho máximo de objeto",
                "description": "Descartar los objetos más anchos que este valor, en unidades del mapa."
              },
              "min_cells": {
                "label": "Celdas mínimas",
                "description": "Descartar las detecciones con menos celdas que este número (predeterminado 2), lo que suprime los picos aislados de moteado."
              },
              "input_units": {
                "label": "Unidades de entrada",
                "description": "'intensity' (predeterminado), 'dn', 'amplitude' o 'db'. La detección se ejecuta sobre potencia lineal, donde las estadísticas de clutter tienen sentido."
              },
              "band": {
                "label": "Banda",
                "description": "Banda en la que se busca, con índice desde 1 (predeterminado 1)."
              }
            }
          },
          "detect_dark_ocean_areas": {
            "name": "Detectar áreas oscuras del océano",
            "description": "Encuentra manchas anómalamente oscuras sobre el agua en imágenes SAR — vertidos de petróleo, filtraciones naturales, películas de algas, zonas de viento bajo — como regiones situadas un número determinado de desviaciones estándar por debajo del fondo marino local, informadas con su contraste en dB (Detectar áreas oceánicas oscuras de ArcGIS). El complemento de detect_bright_ocean_objects, y distinto de extract_water_sar: una escena completamente de agua es unimodal, por lo que una división de Otsu simplemente bisecaría el clutter marino e informaría de la mitad del océano como una mancha.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de retrodispersión SAR sobre agua."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de polígonos de salida con las áreas oscuras. Si se omite, se almacena en memoria."
              },
              "output_raster": {
                "label": "Ráster de salida",
                "description": "Máscara binaria de salida (1 oscuro, 0 fondo). Se genera siempre; se almacena en memoria cuando no se indica ninguna ruta."
              },
              "method": {
                "label": "Método",
                "description": "'statistical' (predeterminado; un número determinado de desviaciones estándar por debajo de la media del fondo), 'otsu' o 'fixed'."
              },
              "threshold": {
                "label": "Umbral",
                "description": "Para 'statistical', cuántas desviaciones estándar por debajo de la media se consideran oscuras (predeterminado 2.0). Para 'fixed', el nivel en dB en el que una celda es oscura o por debajo del cual lo es."
              },
              "min_area": {
                "label": "Área mínima",
                "description": "Descartar las áreas oscuras cuya superficie sea menor que este valor, en unidades del mapa al cuadrado. Las manchas son grandes y contiguas; el moteado no."
              },
              "min_contrast_db": {
                "label": "Contraste mínimo (dB)",
                "description": "Descartar las regiones que se sitúen menos de este número de dB por debajo del fondo. Una mancha de aceite mineral suele estar más de 5 dB por debajo."
              },
              "mask_features": {
                "label": "Entidades de máscara",
                "description": "Capa de polígonos que restringe el análisis al agua. La tierra es brillante e inflaría la estimación del fondo."
              },
              "mask_type": {
                "label": "Tipo de máscara",
                "description": "'land_polygon' (predeterminado; analiza fuera de los polígonos) o 'water_polygon' (analiza dentro de ellos)."
              },
              "histogram_bins": {
                "label": "Intervalos del histograma",
                "description": "Intervalos usados para el histograma de Otsu (predeterminado 256)."
              },
              "input_units": {
                "label": "Unidades de entrada",
                "description": "'intensity' (predeterminado), 'dn', 'amplitude' o 'db'."
              },
              "band": {
                "label": "Banda",
                "description": "Banda en la que se busca, con índice desde 1 (predeterminado 1)."
              }
            }
          },
          "detect_feature_changes": {
            "name": "Detectar cambios en entidades",
            "description": "Empareja dos conjuntos de datos de líneas por distancia de Hausdorff y clasifica cada una como sin cambio / espacial / atributo / espacial_atributo / nueva, más las entidades base eliminadas — el punto de entrada para la detección de cambios vectoriales y la conflación, como Detectar cambios de entidades de ArcGIS.",
            "params": {
              "update": {
                "label": "Actualizar",
                "description": "Capa vectorial de líneas actualizada (el nuevo estado)."
              },
              "base": {
                "label": "Base",
                "description": "Capa vectorial de líneas base (el estado anterior) con la que se compara."
              },
              "output": {
                "label": "Salida",
                "description": "Vectorial de líneas de salida (las entidades actualizadas clasificadas, más las entidades base eliminadas). Si se omite, se almacena en memoria."
              },
              "search_distance": {
                "label": "Distancia de búsqueda",
                "description": "Distancia máxima (unidades del CRS) para emparejar una línea actualizada con una línea base. Obligatorio."
              },
              "spatial_tolerance": {
                "label": "Tolerancia espacial",
                "description": "Distancia de Hausdorff por debajo de la cual una geometría emparejada se considera sin cambios (unidades del CRS). Predeterminado: search_distance / 5."
              },
              "compare_fields": {
                "label": "Campos a comparar",
                "description": "Campo o campos separados por comas presentes en ambas capas que se comparan para detectar cambios de atributos."
              }
            }
          },
          "detect_graphic_conflict": {
            "name": "Detectar conflicto gráfico",
            "description": "Encuentra dónde las extensiones simbolizadas (ancho dibujado) de dos capas de entidades — o de una capa contra sí misma — se solapan o se aglomeran dentro de una separación mínima, emitiendo un polígono de conflicto por cada par en conflicto etiquetado con ambos ID de entidad de origen y el área de solape, como Detectar conflicto gráfico de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada (puntos, líneas o polígonos)."
              },
              "conflict": {
                "label": "Conflicto",
                "description": "Segunda capa vectorial con la que se comprueba 'input'. Omítala para comprobar 'input' consigo mismo."
              },
              "symbol_width": {
                "label": "Ancho de símbolo",
                "description": "Anchura/diámetro simbolizado de las entidades de 'input', en unidades del mapa."
              },
              "conflict_symbol_width": {
                "label": "Ancho de símbolo en conflicto",
                "description": "Anchura/diámetro simbolizado de las entidades de 'conflict', en unidades del mapa. Predeterminado: el mismo que 'symbol_width'. Se ignora cuando se omite 'conflict'."
              },
              "conflict_distance": {
                "label": "Distancia de conflicto",
                "description": "Separación adicional requerida más allá del contacto, en unidades del mapa. Predeterminado 0."
              },
              "line_connection_allowance": {
                "label": "Margen de conexión de líneas",
                "description": "Radio alrededor de un extremo compartido por dos entidades de línea de la misma capa dentro del cual su solape se trata como conectividad normal de extremo a extremo y no como un conflicto. Predeterminado 0 (sin tolerancia)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de polígonos de salida con los campos 'input_fid', 'conflict_fid' y 'overlap_area'. Si se omite, se almacena en memoria."
              }
            }
          },
          "detect_image_anomalies": {
            "name": "Detectar anomalías en imágenes",
            "description": "Puntúa cada píxel de una imagen multibanda según su distancia de Mahalanobis a las estadísticas de bandas de la escena (o de una ventana móvil) — el detector de anomalías Reed–Xiaoli (RX) — con una máscara opcional de umbral por percentil, como Detectar anomalías de imagen de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster multibanda de entrada (2 o más bandas)."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de salida con las puntuaciones de anomalía (F32). Si se omite, se almacena en memoria."
              },
              "mode": {
                "label": "Modo",
                "description": "'global' (estadísticas de toda la escena, predeterminado) o 'local' (estadísticas de ventana móvil)."
              },
              "window": {
                "label": "Ventana",
                "description": "Tamaño impar de la ventana (en píxeles) para el modo local (predeterminado 15)."
              },
              "threshold": {
                "label": "Umbral",
                "description": "Percentil opcional (0-100) de la distribución de puntuaciones por encima del cual se escribe una máscara binaria de anomalías."
              },
              "mask_output": {
                "label": "Salida de máscara",
                "description": "Ruta de salida de la máscara binaria de anomalías (requiere 'threshold'). Si se omite habiendo un umbral, se almacena en memoria."
              }
            }
          },
          "detect_incidents": {
            "name": "Detectar incidentes",
            "description": "Marca dónde comienza y termina una condición a lo largo de cada trayectoria: agrupa puntos con marca de tiempo por trayectoria, ordena por tiempo, evalúa una comparación de inicio (y opcionalmente de fin) sobre un atributo numérico y emite episodios de incidente como puntos marcados o segmentos de línea por episodio con ID y duraciones — como Detectar incidentes de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos de entrada con observaciones con marca de tiempo."
              },
              "track_field": {
                "label": "Campo de trayectoria",
                "description": "Campo que identifica cada trayectoria/objeto móvil (p. ej. el identificador de un vehículo o de un animal)."
              },
              "time_field": {
                "label": "Campo de tiempo",
                "description": "Campo que contiene la hora de cada punto: segundos numéricos o una marca de tiempo ISO-8601."
              },
              "start_condition": {
                "label": "Condición de inicio",
                "description": "Condición que abre un incidente, p. ej. 'speed > 30'. Gramática: '<field> <op> <number>', donde op es uno de > >= < <= == != , opcionalmente con dos cláusulas unidas por AND."
              },
              "end_condition": {
                "label": "Condición de fin",
                "description": "Condición opcional que cierra un incidente (misma gramática). Si se omite, un incidente termina cuando deja de cumplirse la condición de inicio."
              },
              "mode": {
                "label": "Modo",
                "description": "Modo de salida: 'points' (predeterminado, se copian todos los puntos con los campos del incidente) o 'segments' (una polilínea por incidente)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida (el controlador se deduce de la extensión). Si se omite, se almacena en memoria."
              }
            }
          },
          "dice": {
            "name": "Dividir en dados",
            "description": "Divide polígonos o polilíneas con más vértices que un límite en una malla de piezas más pequeñas (como Dividir en dados de ArcGIS), para que la superposición y el teselado posteriores sigan siendo rápidos — un quadtree adaptativo interseca la geometría con cada cuadrante hasta que cada pieza está por debajo del límite.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de polígonos o polilíneas de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de salida con las piezas troceadas. Si se omite, se almacena en memoria."
              },
              "vertex_limit": {
                "label": "Límite de vértices",
                "description": "Número máximo de vértices por entidad de salida (predeterminado 10000). Las entidades que no lo superan se transfieren sin cambios."
              }
            }
          },
          "difference_3d": {
            "name": "Diferencia 3D",
            "description": "Resta un conjunto de sólidos 3D de otro conjunto, informando del volumen eliminado y del restante en cada entidad minuendo (Diferencia 3D de ArcGIS). union_3d era la única superposición 3D de ambos registros y erase es solo 2D poligonal, por lo que no había forma de calcular el volumen excavado restante tras un cuerpo de corte o el volumen de una pluma fuera de una envolvente de exclusión. Los volúmenes del minuendo son exactos; el volumen eliminado se estima por ocupación de vóxeles a una resolución informada.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Sólidos 3D cerrados minuendos (MultiPolygons de malla de triángulos con Z)."
              },
              "subtract": {
                "label": "Restar",
                "description": "Sólidos 3D cerrados sustraendos que se eliminan de cada minuendo."
              },
              "output": {
                "label": "Salida",
                "description": "Tabla de salida, una fila por minuendo. Si se omite, se almacena en memoria."
              },
              "resolution": {
                "label": "Resolución",
                "description": "Celdas de vóxel a lo largo del eje más largo del rectángulo delimitador de cada minuendo (predeterminado 64). Un valor mayor es más exacto y más lento."
              },
              "keep_geometry": {
                "label": "Conservar geometría",
                "description": "Traslada la geometría original de cada minuendo a su fila de salida (predeterminado false: una tabla solo de atributos). La geometría es el minuendo SIN RECORTAR — no se produce ninguna malla fusionada exacta."
              }
            }
          },
          "diffusion_interpolation_with_barriers": {
            "name": "Interpolación por difusión con barreras",
            "description": "Interpola mediciones puntuales dispersas a un ráster simulando una difusión de calor que fluye ALREDEDOR de barreras absolutas (sin flujo) en lugar de atravesarlas (como Interpolación por difusión con barreras de ArcGIS). Las muestras se fijan como celdas fijas; todas las demás celdas se relajan hacia la media de sus vecinas no barrera durante `number_iterations` barridos de Jacobi de la ecuación de Laplace/calor, de modo que la influencia decae con la distancia de difusión. Distinto del kernel de trayectoria más corta sin barreras de interpolate_with_barriers y del suavizador ráster anisotropic_diffusion_filter.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos de entrada con las mediciones de muestra (Point / MultiPoint)."
              },
              "z_field": {
                "label": "Campo Z",
                "description": "Campo numérico de los puntos que contiene el valor que se va a interpolar."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster interpolado de salida (GeoTIFF). Si se omite, se almacena en memoria."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda / resolución de salida en unidades del mapa (metros para un CRS geográfico, unidades del CRS en los demás casos). Obligatorio."
              },
              "barriers": {
                "label": "Barreras",
                "description": "Capa vectorial de barreras opcional (polilíneas o polígonos) que bloquea la difusión. Las polilíneas bloquean las celdas que cruzan sus segmentos; los polígonos bloquean las celdas cuyo centro queda dentro. Omítala para un control sin barreras."
              },
              "bandwidth": {
                "label": "Ancho de banda",
                "description": "Peso de relajación lambda por iteración en (0, 0.25] (predeterminado 0.2): en cada pasada, cada celda libre se desplaza esta fracción del camino hacia la media de sus vecinas."
              },
              "number_iterations": {
                "label": "Número de iteraciones",
                "description": "Número de pasadas de relajación de Jacobi de la ecuación del calor (predeterminado 100). Más iteraciones extienden la influencia más lejos."
              },
              "weight_field": {
                "label": "Campo de peso",
                "description": "Campo numérico opcional que indica un peso por punto (predeterminado 1), usado solo para promediar las muestras coincidentes que caen en la misma celda de salida."
              },
              "epsg": {
                "label": "EPSG",
                "description": "Sustituye el código EPSG del CRS de entrada (p. ej. cuando la capa no está etiquetada). El valor 4326 activa la proyección local en metros."
              }
            }
          },
          "dimension_reduction": {
            "name": "Reducción de dimensiones",
            "description": "Análisis de componentes principales sobre atributos numéricos de entidades (como Reducción de dimensiones de ArcGIS): estandariza los campos seleccionados, descompone en autovalores la matriz de correlación/covarianza con una rotación de Jacobi implementada a mano y escribe las puntuaciones de los componentes PC1..PCk de vuelta en las entidades más un informe de autovalores/varianza/cargas — la contraparte de atributos vectoriales del principal_component_analysis incluido, que solo trabaja con bandas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial (o tabla) de entrada con campos de atributos numéricos."
              },
              "fields": {
                "label": "Campos",
                "description": "Lista separada por comas de al menos dos campos numéricos que se van a reducir."
              },
              "output": {
                "label": "Salida",
                "description": "Capa vectorial de salida con los campos de puntuaciones de los componentes principales añadidos. Si se omite, se almacena en memoria."
              },
              "table": {
                "label": "Tabla",
                "description": "Ruta CSV opcional para el informe de componentes (autovalor, varianza explicada, acumulada, cargas por variable). Siempre se devuelve en el resultado."
              },
              "num_components": {
                "label": "Número de componentes",
                "description": "Número de componentes principales que se conservan. Predeterminado: los necesarios para alcanzar 'min_variance'; en su defecto, todos los campos."
              },
              "min_variance": {
                "label": "Varianza mínima",
                "description": "Conservar el menor número de componentes cuya varianza explicada acumulada alcance esta fracción (0-1). Se ignora si se establece 'num_components'."
              },
              "standardize": {
                "label": "Estandarizar",
                "description": "Estandarizar cada campo (puntuación z) antes del PCA para que las escalas sean comparables — analiza la matriz de correlación. Predeterminado true; con false se analiza la matriz de covarianza."
              }
            }
          },
          "dimensional_moving_statistics": {
            "name": "Estadísticas móviles dimensionales",
            "description": "Ejecuta una ventana móvil a lo largo de la dimensión de un cubo ráster, escribiendo una rebanada suavizada por cada rebanada de entrada — la media o mediana móvil en el sitio que convierte una serie temporal satelital ruidosa en una utilizable (Estadísticas móviles dimensionales de ArcGIS). time_series_smoothing de la ronda 17 es solo vectorial, los filtros focales incluidos mueven una ventana espacialmente dentro de una única rebanada y aggregate_multidimensional_raster acorta el cubo en intervalos. Incluye una media circular, sin la cual promediar orientación o fase a través del punto de envoltura carece de sentido.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Un ráster multibanda (cada banda es una rebanada) o una lista separada por comas de rásteres corregistrados."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster multibanda de salida con una banda por cada rebanada de entrada. Si se omite, se almacena en memoria."
              },
              "dimension": {
                "label": "Dimensión",
                "description": "Nombre de la dimensión, usado solo en el informe (predeterminado 'slice')."
              },
              "backward_window": {
                "label": "Ventana hacia atrás",
                "description": "Rebanadas anteriores a la actual que se incluyen (predeterminado 1)."
              },
              "forward_window": {
                "label": "Ventana hacia adelante",
                "description": "Rebanadas posteriores a la actual que se incluyen (predeterminado 1)."
              },
              "statistic": {
                "label": "Estadístico",
                "description": "'mean' (predeterminado), 'circular_mean', 'majority', 'maximum', 'median', 'minimum', 'minority', 'percentile', 'std' o 'sum'."
              },
              "percentile_value": {
                "label": "Valor de percentil",
                "description": "Percentil en [0, 100] para el estadístico 'percentile' (predeterminado 50)."
              },
              "period": {
                "label": "Periodo",
                "description": "Periodo de envoltura para 'circular_mean' (predeterminado 360, es decir, grados; use 6.283185307179586 para radianes)."
              },
              "min_valid": {
                "label": "Mínimo válido",
                "description": "Número mínimo de observaciones con datos en la ventana antes de escribir un valor (predeterminado 1)."
              },
              "nodata_handling": {
                "label": "Tratamiento de sin datos",
                "description": "'data' (predeterminado; omite los valores sin datos y calcula con el resto), 'nodata' (cualquier valor sin datos en la ventana hace que la salida sea sin datos) o 'fill_nodata' (escribe también un valor donde la propia rebanada central es sin datos)."
              }
            }
          },
          "directional_distribution": {
            "name": "Distribución direccional",
            "description": "Estadísticas descriptivas de distribución geográfica: centro medio, centro mediano, entidad central, distancia estándar (círculo) y elipse de desviación estándar — con ponderación y agrupación opcionales.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada (se prefieren puntos; las demás geometrías usan su punto representativo, la media de sus vértices)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según su extensión). Si se omite, se almacena en memoria."
              },
              "statistic": {
                "label": "Estadístico",
                "description": "Medida que se va a calcular: 'mean_center', 'median_center', 'central_feature', 'standard_distance' o 'standard_deviational_ellipse'."
              },
              "weight_field": {
                "label": "Campo de peso",
                "description": "Campo numérico opcional para ponderar cada entidad (p. ej. la población). Predeterminado: todas las entidades con peso 1."
              },
              "case_field": {
                "label": "Campo de caso",
                "description": "Campo opcional por el que se agrupan las entidades; se genera una entidad de salida por cada valor distinto."
              },
              "n_std": {
                "label": "N desviaciones estándar",
                "description": "Multiplicador de la desviación estándar (1, 2 o 3) para el círculo de distancia estándar y la elipse de desviación. Predeterminado 1."
              }
            }
          },
          "directional_trend": {
            "name": "Tendencia direccional",
            "description": "Proyecta puntos de muestreo sobre un acimut elegido y ajusta un polinomio de orden 1 a 3 de valor frente a distancia para detectar una tendencia global/anisotrópica antes de la variografía (como Tendencia direccional de ArcGIS). «determine» barre los acimuts en busca de la dirección de máxima varianza explicada.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada (se prefieren puntos; las demás geometrías usan su punto representativo, la media de sus vértices)."
              },
              "field": {
                "label": "Campo",
                "description": "Campo de atributo numérico cuya tendencia se va a analizar."
              },
              "azimuth": {
                "label": "Acimut",
                "description": "Rumbo de brújula en grados (0 = norte, sentido horario) sobre el que se proyecta, o 'determine' (predeterminado) para barrer de 0 a 179° en busca del rumbo de máxima varianza explicada."
              },
              "order": {
                "label": "Orden",
                "description": "Orden polinómico 1, 2 o 3 (predeterminado 2)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida vectorial opcional (el controlador se deduce de su extensión). Si se omite, se almacena en memoria. Los puntos llevan proj_dist, value, fitted y residual."
              }
            }
          },
          "directional_variogram": {
            "name": "Análisis de variograma direccional",
            "description": "Calcula variogramas en múltiples direcciones para detectar anisotropía espacial. Revela patrones de continuidad direccional esenciales para un kriging realista.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de puntos con los valores medidos"
              },
              "field": {
                "label": "Campo",
                "description": "Campo que contiene los valores medidos"
              },
              "directions": {
                "label": "Direcciones",
                "description": "Lista separada por comas de acimutes (0-180°) que se van a analizar"
              },
              "tolerance": {
                "label": "Tolerancia",
                "description": "Tolerancia de dirección en grados (predeterminado 22.5)"
              },
              "max_distance": {
                "label": "Distancia máxima",
                "description": "Distancia de retardo máxima que se calcula (predeterminado 1000)"
              },
              "bin_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de los intervalos de retardo (predeterminado 50)"
              },
              "output_json": {
                "label": "Salida JSON",
                "description": "Ruta del archivo de salida para los resultados del variograma direccional"
              },
              "output_html": {
                "label": "Salida HTML",
                "description": "Ruta de salida opcional para la visualización del diagrama de rosa en HTML"
              }
            }
          },
          "disperse_markers": {
            "name": "Dispersar marcadores",
            "description": "Separa símbolos de puntos coincidentes o solapados hasta un espaciado mínimo de centro a centro (patrones expandido/anillo/cruz/cuadrado) para que los puntos apilados sigan siendo visibles individualmente, como Dispersar marcadores de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de puntos de salida (controlador según la extensión). Si se omite, se almacena en memoria."
              },
              "min_spacing": {
                "label": "Espaciado mínimo",
                "description": "Espaciado mínimo entre centros que se impone a los puntos agrupados, en unidades del mapa."
              },
              "pattern": {
                "label": "Patrón",
                "description": "'expanded' (predeterminado, anillos concéntricos + repulsión local), 'ring' (un solo círculo), 'cross' (cuatro brazos) o 'square' (malla)."
              },
              "seed": {
                "label": "Semilla",
                "description": "Semilla entera para desempatar de forma determinista cuando los miembros parten de posiciones exactamente coincidentes (predeterminado 0)."
              }
            }
          },
          "dissolve_route_events": {
            "name": "Disolver eventos de ruta",
            "description": "Fusiona eventos de ruta que se tocan o solapan a lo largo de la misma ruta en tramos de medida únicos, bien solo cuando los campos de disolución coinciden («dissolve») o bien concatenando los valores distintos («concatenate»). Como Disolver eventos de ruta de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Tabla de eventos de entrada (eventos de línea con medidas inicial y final)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de la tabla de eventos de salida. Si se omite, se almacena en memoria."
              },
              "route_id_field": {
                "label": "Campo de ID de ruta",
                "description": "Campo que contiene el identificador de la ruta."
              },
              "from_measure_field": {
                "label": "Campo de medida inicial",
                "description": "Campo que contiene la medida inicial de cada evento."
              },
              "to_measure_field": {
                "label": "Campo de medida final",
                "description": "Campo que contiene la medida final de cada evento. Para los eventos puntuales, use el mismo campo que en 'from_measure_field'."
              },
              "dissolve_fields": {
                "label": "Campos de disolución",
                "description": "Nombre o nombres de campo separados por comas o punto y coma que deben coincidir para que dos tramos se fusionen (o cuyos valores se concatenan)."
              },
              "mode": {
                "label": "Modo",
                "description": "'dissolve' (predeterminado) o 'concatenate'."
              },
              "tolerance": {
                "label": "Tolerancia",
                "description": "Diferencia de medida por debajo de la cual dos tramos se consideran adyacentes (predeterminado 0)."
              },
              "separator": {
                "label": "Separador",
                "description": "Separador usado para unir los valores en el modo 'concatenate' (predeterminado ', ')."
              }
            }
          },
          "edgematch_features": {
            "name": "Emparejar entidades en los bordes",
            "description": "Conecta conjuntos de datos de líneas a través de un límite de tesela/hoja (como Generar enlaces de ajuste de bordes + Ajustar bordes de entidades de ArcGIS): empareja extremos colgantes uno a uno dentro de una tolerancia y los concilia (punto medio o ajuste), con una capa opcional de enlaces de emparejamiento. El emparejamiento uno a uno entre entidades del que carece el snap_endnodes ciego.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de líneas de entrada (p. ej. dos teselas adyacentes fusionadas) cuyos bordes se van a empalmar."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de líneas ajustada de salida. Si se omite, se almacena en memoria."
              },
              "tolerance": {
                "label": "Tolerancia",
                "description": "Distancia máxima entre extremos sueltos para emparejarlos."
              },
              "method": {
                "label": "Método",
                "description": "'midpoint' (desplaza ambos extremos a su punto medio; predeterminado) o 'move_endpoint' (ajusta el segundo sobre el primero)."
              },
              "match_fields": {
                "label": "Campos de coincidencia",
                "description": "Campos opcionales separados por comas; un par emparejado debe coincidir en ellos (desambigua los candidatos)."
              },
              "links": {
                "label": "Enlaces",
                "description": "Capa de líneas de salida opcional con los enlaces de emparejamiento (para control de calidad)."
              }
            }
          },
          "eighty_twenty_analysis": {
            "name": "Análisis ochenta-veinte",
            "description": "Ajusta puntos de incidentes a ubicaciones ponderadas y calcula la concentración de Pareto («el X % de los incidentes ocurren en el Y % de las ubicaciones»), etiquetando cada ubicación con su rango, porcentaje acumulado de incidentes y banda de cabeza/cola, como Análisis ochenta-veinte de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos de incidentes de entrada (Point o MultiPoint)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de puntos de salida (controlador según la extensión). Si se omite, se almacena en memoria."
              },
              "cluster_tolerance": {
                "label": "Tolerancia de clúster",
                "description": "Distancia dentro de la cual los incidentes se ajustan a una única ubicación (unidades del mapa, predeterminado 0 = solo los puntos exactamente coincidentes)."
              },
              "weight_field": {
                "label": "Campo de peso",
                "description": "Campo numérico opcional que indica el peso de cada incidente (predeterminado: cada incidente cuenta como 1)."
              },
              "threshold": {
                "label": "Umbral",
                "description": "Porcentaje umbral de concentración que define la 'cabeza' de Pareto (predeterminado 80)."
              }
            }
          },
          "eliminate_polygon_part": {
            "name": "Eliminar parte de polígono",
            "description": "Elimina los huecos interiores (y opcionalmente las partes exteriores pequeñas) de polígonos cuya área está por debajo de un umbral de área absoluta o de porcentaje, conservando los atributos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo vectorial de polígonos de entrada, formato detectado automáticamente (o identificador en memoria)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según su extensión). Si se omite, se almacena en memoria."
              },
              "condition": {
                "label": "Condición",
                "description": "Prueba de tamaño: 'AREA' (predeterminado) compara con 'min_area'; 'PERCENT' compara el área de la parte o del hueco, como porcentaje del área exterior total de la entidad, con 'percentage'."
              },
              "min_area": {
                "label": "Área mínima",
                "description": "Condición AREA: elimina las partes y los huecos cuya área (en unidades del CRS al cuadrado) esté por debajo de este valor. Obligatorio cuando condition = AREA."
              },
              "percentage": {
                "label": "Porcentaje",
                "description": "Condición PERCENT: elimina las partes y los huecos cuya área, como porcentaje (0-100) del área exterior total de la entidad, esté por debajo de este valor. Obligatorio cuando condition = PERCENT."
              },
              "part_option": {
                "label": "Opción de partes",
                "description": "Qué puede eliminarse: 'CONTAINED_ONLY' (predeterminado) elimina solo los anillos interiores (huecos); 'ANY' elimina además las partes exteriores pequeñas, excepto la parte más grande."
              }
            }
          },
          "eliminate_polygons": {
            "name": "Eliminar polígonos",
            "description": "Fusiona polígonos astilla (por área máxima y/o una consulta de atributos) en un polígono vecino, elegido por el borde compartido más largo o la mayor área.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo vectorial de polígonos de entrada, formato detectado automáticamente (o identificador en memoria)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según su extensión). Si se omite, se almacena en memoria."
              },
              "max_area": {
                "label": "Área máxima",
                "description": "Selecciona los polígonos cuya área (en unidades del CRS al cuadrado) sea igual o inferior a este valor. Puede combinarse con 'where' (deben cumplirse ambas condiciones)."
              },
              "where": {
                "label": "Dónde",
                "description": "Selecciona los polígonos que cumplen una condición sencilla de atributos 'FIELD OP VALUE', donde OP es uno de = != < <= > >= (p. ej. \"class = 0\"). Puede combinarse con 'max_area'."
              },
              "exclude": {
                "label": "Excluir",
                "description": "Protege de la eliminación las entidades que cumplen esta condición (misma sintaxis 'FIELD OP VALUE'); se conservan y pueden recibir fusiones."
              },
              "strategy": {
                "label": "Estrategia",
                "description": "Vecino con el que se fusiona una astilla: 'longest_border' (predeterminado) o 'largest_area'."
              },
              "tolerance": {
                "label": "Tolerancia",
                "description": "Distancia perpendicular máxima (en unidades del CRS) para que dos segmentos de límite se consideren un borde compartido. Predeterminado 1e-6."
              }
            }
          },
          "emerging_hot_spot_analysis": {
            "name": "Análisis de puntos calientes emergentes",
            "description": "Tendencias de puntos calientes espacio-temporales en un cubo espacio-temporal H3: agrupa puntos con marca de tiempo en celdas H3 × pasos de tiempo, calcula Gi* de Getis-Ord por intervalo y clasifica cada celda (punto caliente o frío nuevo/intensificándose/persistente/disminuyendo/...) mediante una prueba de tendencia de Mann-Kendall, como Análisis de puntos calientes emergentes de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos de entrada (coordenadas geográficas de longitud/latitud, EPSG:4326). Las demás geometrías usan su punto representativo, la media de sus vértices."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida (el controlador se deduce de la extensión). Un polígono H3 por celda. Si se omite, se almacena en memoria."
              },
              "time_field": {
                "label": "Campo de tiempo",
                "description": "Campo que contiene el tiempo de cada punto: un campo numérico (en sus propias unidades) o una cadena de fecha/fecha-hora ISO-8601."
              },
              "time_step": {
                "label": "Paso de tiempo",
                "description": "Anchura de un paso temporal: un número simple (para un time_field numérico) o una duración como '1w', '7d', '12h', '1M' para un campo de fecha. Predeterminado '1w'."
              },
              "value_field": {
                "label": "Campo de valor",
                "description": "Campo numérico opcional que se suma en cada intervalo. Predeterminado: el recuento de puntos por intervalo."
              },
              "resolution": {
                "label": "Resolución",
                "description": "Resolución H3 de 0 (la más gruesa) a 15 (la más fina); predeterminado 7 (celdas de ~5 km²)."
              },
              "neighborhood": {
                "label": "Vecindad",
                "description": "Radio de vecindad espacial en anillos k de H3 (predeterminado 1)."
              },
              "time_window": {
                "label": "Ventana temporal",
                "description": "Radio de vecindad temporal en pasos temporales (predeterminado 1)."
              }
            }
          },
          "empirical_bayesian_kriging": {
            "name": "Kriging bayesiano empírico",
            "description": "Interpola un campo de puntos mediante muchos subconjuntos locales solapados, cada uno ajustando su propio semivariograma cuya incertidumbre se captura simulando semivariogramas perturbados con un RNG con semilla, y luego mezcla las predicciones/varianzas de kriging de los subconjuntos por distancia (como Kriging bayesiano empírico de ArcGIS) — distinto del kriging ordinario/universal/simple/cokriging incluido, que ajustan todos un único semivariograma global aceptado manualmente (o de una sola ventana móvil).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de puntos de entrada."
              },
              "field": {
                "label": "Campo",
                "description": "Campo numérico de la capa de entrada que se va a interpolar."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de predicción de salida. Si se omite, se almacena en memoria."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida en unidades del CRS. Predeterminado: dimensionado para que el eje más largo de la malla tenga ~150 celdas."
              },
              "subset_size": {
                "label": "Tamaño del subconjunto",
                "description": "Número objetivo de puntos por subconjunto local (predeterminado 40, mínimo 4)."
              },
              "overlap": {
                "label": "Solape",
                "description": "Fracción de la anchura/altura de una tesela de subconjunto en la que se solapan las teselas vecinas (predeterminado 0.25)."
              },
              "simulations": {
                "label": "Simulaciones",
                "description": "Número de semivariogramas simulados que se extraen por subconjunto para representar la incertidumbre del modelo (predeterminado 5, máximo 50)."
              },
              "semivariogram": {
                "label": "Semivariograma",
                "description": "Familia del modelo de semivariograma: 'power' (predeterminado), 'linear' o 'exponential'."
              },
              "transform": {
                "label": "Transformación",
                "description": "Transformación de los datos antes del kriging: 'none' (predeterminado) o 'log_empirical' (logaritmo natural; requiere que el campo sea > 0 en todas partes)."
              },
              "error_output": {
                "label": "Salida de error",
                "description": "Ráster de error estándar de predicción de salida opcional."
              },
              "seed": {
                "label": "Semilla",
                "description": "Semilla del generador de números aleatorios determinista para la simulación de semivariogramas (predeterminado 42)."
              }
            }
          },
          "enclose_multipatch": {
            "name": "Encerrar multiparche",
            "description": "Convierte superficies abiertas de malla triangular 3D en sólidos cerrados y estancos tapando sus bucles de contorno, de modo que se conviertan en entradas válidas para el análisis volumétrico (Cerrar multiparche de ArcGIS). is_closed_3d puede diagnosticar una malla abierta pero nada podía repararla, y union_3d / intersect_3d / difference_3d / inside_3d rechazan o informan incorrectamente las mallas abiertas — que es el estado normal de las huellas extruidas, las envolventes de terreno y las superficies de edificios importadas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Entidades de superficie 3D (MultiPolygons de malla de triángulos con Z)."
              },
              "output": {
                "label": "Salida",
                "description": "Entidades sólidas cerradas de salida. Si se omite, se almacena en memoria."
              },
              "drop_failed": {
                "label": "Descartar fallidos",
                "description": "Omitir las entidades que no se han podido hacer estancas (predeterminado false: se generan con CAP_FAILED = true para que el fallo sea visible en lugar de silencioso)."
              }
            }
          },
          "enforce_river_monotonicity": {
            "name": "Imponer monotonía fluvial",
            "description": "Talla un DEM para que las elevaciones disminuyan monótonamente aguas abajo a lo largo de polilíneas de río cartografiadas — un paso de acondicionamiento hidrológico para modelado hidráulico y de inundaciones, como Forzar monotonicidad de río de ArcGIS. A diferencia de fill_depressions/fill_burn (que eliminan pozos cerrados), esto impone un perfil monótono a lo largo de un vector de río conocido.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de polilíneas de ríos de entrada (LineString / MultiLineString) que comparte el CRS del DEM."
              },
              "surface": {
                "label": "Superficie",
                "description": "Ráster de elevación (DEM) que se va a corregir."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del DEM corregido de salida (el formato se deduce de la extensión). Si se omite, se almacena en memoria."
              },
              "tolerance": {
                "label": "Tolerancia",
                "description": "Descenso mínimo de elevación que se impone en cada paso densificado, en unidades Z (predeterminado 0 = no creciente). Los valores positivos fuerzan un perfil estrictamente decreciente."
              },
              "sample_distance": {
                "label": "Distancia de muestreo",
                "description": "Intervalo de densificación en unidades del CRS a lo largo de cada línea de río. Predeterminado: el tamaño de celda del ráster (≈ una muestra por celda)."
              },
              "band": {
                "label": "Banda",
                "description": "Banda del DEM que se va a corregir, con índice desde 1 (predeterminado 1)."
              }
            }
          },
          "estimate_time_to_event": {
            "name": "Estimar tiempo hasta el evento",
            "description": "Estima el tiempo hasta un evento mediante una curva de supervivencia de Kaplan-Meier (como Estimar tiempo hasta evento de ArcGIS): a partir de un campo de duración y un campo de evento/censura, calcula la probabilidad de supervivencia de cada entidad y el tiempo mediano hasta el evento de su estrato, opcionalmente estratificado por un campo categórico.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de puntos o polígonos de entrada con un campo de duración y un campo de evento/censura."
              },
              "age_field": {
                "label": "Campo de edad",
                "description": "Campo que contiene la duración observada de cada entidad (tiempo hasta el evento o hasta la censura), un número no negativo."
              },
              "event_field": {
                "label": "Campo de evento",
                "description": "Campo que indica si el evento ocurrió (valor verdadero: 1/true) o si la observación fue censurada (valor falso: 0/false)."
              },
              "stratify_field": {
                "label": "Campo de estratificación",
                "description": "Campo categórico opcional para ajustar una curva de supervivencia distinta por grupo."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de salida con los campos km_survival, km_median y km_stratum añadidos. Si se omite, se almacena en memoria."
              }
            }
          },
          "estimate_variogram": {
            "name": "Estimar variograma",
            "description": "Calcula un semivariograma empírico a partir de observaciones puntuales para caracterizar la estructura de correlación espacial. Primer paso esencial del flujo de trabajo geoestadístico.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos de entrada con valores"
              },
              "field": {
                "label": "Campo",
                "description": "Campo que contiene los valores medidos"
              },
              "lag_distance": {
                "label": "Distancia de retardo",
                "description": "Tamaño de los intervalos de retardo en unidades del mapa (predeterminado: 100.0)"
              },
              "lag_tolerance": {
                "label": "Tolerancia de retardo",
                "description": "Tolerancia para la agrupación en intervalos de retardo (predeterminado: 50.0)"
              },
              "max_lag_count": {
                "label": "Número máximo de retardos",
                "description": "Número máximo de retardos que se conservan (predeterminado: 20)"
              }
            }
          },
          "euclidean_direction": {
            "name": "Dirección euclidiana",
            "description": "Calcula el acimut de brújula desde cada celda hacia su celda de origen más cercana, más rásteres opcionales de distancia y dirección de retorno (Dirección euclidiana de ArcGIS). Completa la familia euclidiana incluida, que ofrece euclidean_distance (cuán lejos) y euclidean_allocation (qué origen) pero no el rumbo. Usa una transformada de distancia exacta que transporta las coordenadas del origen más cercano; con un ráster de barreras, en cambio, enruta alrededor de los obstáculos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de orígenes: las celdas que no son ni sin datos ni cero son orígenes."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional del ráster de dirección (grados en sentido horario desde el norte). Si se omite, se almacena en memoria."
              },
              "output_distance": {
                "label": "Distancia de salida",
                "description": "Ruta opcional del ráster de distancia complementario."
              },
              "output_back_direction": {
                "label": "Dirección de retorno de salida",
                "description": "Ruta opcional del ráster de dirección de retorno: el rumbo que hay que seguir desde esta celda de vuelta hacia el origen más próximo. Coincide con el ráster de dirección cuando no se proporcionan barreras; con barreras es el primer paso del camino de vuelta."
              },
              "barriers": {
                "label": "Barreras",
                "description": "Ráster de barreras opcional; las celdas distintas de cero y con datos bloquean las trayectorias en línea recta, obligando a rodearlas."
              },
              "max_distance": {
                "label": "Distancia máxima",
                "description": "Las celdas situadas a más de esta distancia de cualquier origen se escriben como sin datos."
              },
              "band": {
                "label": "Banda",
                "description": "Banda del ráster de orígenes que se lee, con índice desde 1 (predeterminado 1)."
              }
            }
          },
          "evaluate_bin_sizes": {
            "name": "Evaluar tamaños de bin",
            "description": "Barre tamaños de celda de agregación candidatos e informa diagnósticos que identifican qué tamaño revela mejor la estructura, como Evaluar tamaños de celda de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Entidades de punto que se van a agregar."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional de la tabla de diagnósticos. Si se omite, se almacena en memoria."
              },
              "bin_shape": {
                "label": "Forma de celda",
                "description": "hexagon (predeterminado; aproximación por desplazamiento de filas, véase la documentación) | square."
              },
              "sizes": {
                "label": "Tamaños",
                "description": "Tamaños de intervalo candidatos separados por comas (unidades del mapa). Cuando se omite, se genera un barrido geométrico a partir de la distancia media al vecino más próximo."
              },
              "steps": {
                "label": "Pasos",
                "description": "Número de candidatos del barrido generado (predeterminado 8, máximo 64)."
              },
              "analysis_field": {
                "label": "Campo de análisis",
                "description": "Campo numérico opcional que se suma por intervalo en lugar de contar los puntos."
              }
            }
          },
          "evaluate_variable_influence": {
            "name": "Evaluar la influencia de las variables",
            "description": "Informa de la importancia por permutación y de las curvas de dependencia parcial de un modelo de bosque ajustado a partir de una tabla, respondiendo qué variables explicativas usa realmente un modelo y qué forma tiene cada efecto (Evaluar influencia de variables de ArcGIS). El catálogo puede ajustar modelos — generalized_linear_regression, exploratory_regression, geographically_weighted_regression, forest_based_forecast, los bosques aleatorios de whitebox — pero ninguno informa de ninguna de las dos medidas. ArcGIS lee un archivo de modelo .ssm entrenado; esta pila no tiene un formato de modelo portátil, por lo que la herramienta ajusta su propio bosque y luego lo explica. Totalmente determinista: bagging por zancada y una permutación fija, sin RNG.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa o tabla que contiene las observaciones de entrenamiento."
              },
              "dependent_field": {
                "label": "Campo dependiente",
                "description": "Campo que se predice."
              },
              "explanatory_fields": {
                "label": "Campos explicativos",
                "description": "Campos numéricos separados por comas que se van a evaluar."
              },
              "output": {
                "label": "Salida",
                "description": "Tabla de salida con la importancia de cada variable. Si se omite, se almacena en memoria."
              },
              "output_partial_dependence": {
                "label": "Salida de dependencia parcial",
                "description": "Tabla de salida con las curvas de dependencia parcial, una fila por variable y punto de la malla. Se genera siempre; se almacena en memoria cuando no se indica ninguna ruta."
              },
              "model_type": {
                "label": "Tipo de modelo",
                "description": "'regression' (predeterminado) para un objetivo continuo, o 'classification' para uno categórico."
              },
              "number_of_trees": {
                "label": "Número de árboles",
                "description": "Árboles del conjunto (predeterminado 50)."
              },
              "max_depth": {
                "label": "Profundidad máxima",
                "description": "Profundidad máxima del árbol (predeterminado 8)."
              },
              "min_samples_leaf": {
                "label": "Muestras mínimas por hoja",
                "description": "Número mínimo de observaciones que puede contener una hoja (predeterminado 3)."
              },
              "grid_points": {
                "label": "Puntos de malla",
                "description": "Puntos por curva de dependencia parcial (predeterminado 12)."
              },
              "permutation_repeats": {
                "label": "Repeticiones de permutación",
                "description": "Permutaciones distintas que se promedian por variable (predeterminado 3). Más permutaciones dan un resultado más estable pero más lento."
              }
            }
          },
          "excel_to_table": {
            "name": "Excel a tabla",
            "description": "Lee una hoja de un libro .xlsx/.xls/.xlsb/.ods en una tabla de atributos, infiriendo columnas numéricas frente a de texto.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del libro de Excel/OpenDocument de entrada (.xlsx, .xls, .xlsb o .ods)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional de la tabla (el controlador se deduce de su extensión; se recomienda GeoParquet .parquet). Si se omite, se almacena en memoria."
              },
              "sheet": {
                "label": "Hoja",
                "description": "Hoja de cálculo que se lee, por nombre o por índice con base 0. Predeterminado: la primera hoja."
              },
              "cell_range": {
                "label": "Rango de celdas",
                "description": "Rango opcional en notación A1 que se importa, p. ej. 'B2:E40'. Predeterminado: todo el rango utilizado de la hoja."
              },
              "field_names_row": {
                "label": "Fila de nombres de campo",
                "description": "Fila del rango seleccionado que contiene los nombres de las columnas, con índice desde 1 (predeterminado 1). Se omiten las filas anteriores; 0 significa que no hay fila de encabezado (se generan automáticamente Field1, Field2, ...)."
              }
            }
          },
          "expand_shrink": {
            "name": "Expandir / contraer",
            "description": "Expande o contrae clases seleccionadas de un ráster categórico un número de celdas, dejando intactas las demás clases — la limpieza estándar de coberturas del suelo clasificadas antes de la poligonización, como Expandir / Contraer de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster categórico de entrada (con valores enteros)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida. Si se omite, se almacena en memoria."
              },
              "classes": {
                "label": "Clases",
                "description": "Valor o valores de clase separados por comas que se van a expandir o contraer."
              },
              "cells": {
                "label": "Celdas",
                "description": "Número de celdas que se expanden o se contraen (>= 1)."
              },
              "mode": {
                "label": "Modo",
                "description": "'expand' (hace crecer las clases seleccionadas; predeterminado) o 'shrink' (las erosiona)."
              },
              "band": {
                "label": "Banda",
                "description": "Banda (con índice desde 1) que se lee (predeterminado 1)."
              }
            }
          },
          "exploratory_interpolation": {
            "name": "Interpolación exploratoria",
            "description": "Ejecuta varios métodos de interpolación (IDW, vecino más próximo, superficies de tendencia de primer/segundo orden), realiza validación cruzada dejando uno fuera para cada uno y los clasifica por precisión de predicción (RMSE/MAE) o sesgo (ME) — como Interpolación exploratoria de ArcGIS. Informa de una tabla comparativa ordenada por método y puede emitir el ráster de predicción del mejor método. Subsume una solicitud de validación cruzada independiente.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos de entrada con las mediciones."
              },
              "field": {
                "label": "Campo",
                "description": "Campo numérico de los puntos que contiene el valor que se va a interpolar."
              },
              "output": {
                "label": "Salida",
                "description": "Tabla de comparación ordenada de salida — un CSV (extensión .csv) o una tabla vectorial sin geometría. Si se omite, se almacena en memoria."
              },
              "methods": {
                "label": "Métodos",
                "description": "Subconjunto de métodos que se comparan, separados por comas o barras verticales: 'idw', 'nearest', 'trend1', 'trend2'. Predeterminado: los cuatro."
              },
              "criterion": {
                "label": "Criterio",
                "description": "Criterio de ordenación: 'rmse' (predeterminado, menor error), 'mae' (menor error absoluto) o 'me' (menor sesgo, el |error medio| más pequeño)."
              },
              "power": {
                "label": "Potencia",
                "description": "Exponente de decaimiento con la distancia de IDW (predeterminado 2)."
              },
              "output_raster": {
                "label": "Ráster de salida",
                "description": "GeoTIFF de salida opcional: el método mejor clasificado ajustado con todas las muestras y evaluado sobre una malla que abarca la extensión de las muestras."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda del ráster ganador en unidades del CRS (grados para un CRS geográfico). Predeterminado: dimensionado para que el eje más largo abarque ~256 celdas."
              }
            }
          },
          "exploratory_regression": {
            "name": "Regresión exploratoria",
            "description": "Enumera modelos OLS sobre cada combinación de campos explicativos candidatos y criba cada uno por R2 ajustado, significancia de coeficientes, multicolinealidad VIF, normalidad de residuos de Jarque-Bera y autocorrelación espacial de residuos por I de Moran, informando de cada modelo más el conjunto ordenado de los que pasan y un resumen de significancia por variable — como Regresión exploratoria de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de entidades de entrada con geometría (se usa para la vecindad de la I de Moran de los residuos)."
              },
              "dependent_field": {
                "label": "Campo dependiente",
                "description": "Campo numérico dependiente (respuesta)."
              },
              "explanatory_fields": {
                "label": "Campos explicativos",
                "description": "Campos numéricos explicativos candidatos separados por comas sobre los que se realiza la búsqueda."
              },
              "min_vars": {
                "label": "Variables mínimas",
                "description": "Número mínimo de variables explicativas por modelo candidato (predeterminado 1)."
              },
              "max_vars": {
                "label": "Variables máximas",
                "description": "Número máximo de variables explicativas por modelo candidato (predeterminado: el mínimo entre el número de candidatas y 6)."
              },
              "max_coef_p": {
                "label": "Valor p máximo de coeficiente",
                "description": "Valor p máximo permitido para cada coeficiente explicativo (predeterminado 0.05)."
              },
              "min_adj_r2": {
                "label": "R² ajustado mínimo",
                "description": "R cuadrado ajustado mínimo (predeterminado 0.5)."
              },
              "max_vif": {
                "label": "VIF máximo",
                "description": "Factor de inflación de la varianza máximo permitido por término (predeterminado 7.5)."
              },
              "min_jb_p": {
                "label": "Valor p mínimo de JB",
                "description": "Valor p mínimo de Jarque-Bera para la normalidad de los residuos (predeterminado 0.1)."
              },
              "min_moran_p": {
                "label": "Valor p mínimo de Moran",
                "description": "Valor p mínimo para la autocorrelación espacial de los residuos (I de Moran); por encima de él, los residuos no están agrupados de forma significativa (predeterminado 0.1)."
              },
              "neighbors": {
                "label": "Vecinos",
                "description": "Número de vecinos más próximos que definen los pesos espaciales para la prueba de la I de Moran de los residuos (predeterminado 8)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de la tabla de informe de salida — un CSV (extensión .csv) o una tabla vectorial sin geometría."
              }
            }
          },
          "extract_locations_from_text": {
            "name": "Extraer ubicaciones de texto",
            "description": "Explora texto libre en busca de coordenadas incrustadas — grados decimales (DD), grados-minutos decimales (DDM), grados-minutos-segundos (DMS) y referencias de cuadrícula MGRS/USNG — y emite un punto WGS84 por coincidencia, como Extraer ubicaciones de texto de ArcGIS (rama de coordenadas). Exploración de patrones pura; sin servicio de geocodificación.",
            "params": {
              "input_text": {
                "label": "Texto de entrada",
                "description": "Texto libre que se va a analizar. Puede ser el texto literal o la ruta a un archivo de texto UTF-8 (se lee cuando el valor corresponde a un archivo existente)."
              },
              "notations": {
                "label": "Notaciones",
                "description": "Subconjunto de notaciones que se buscan, separadas por comas o espacios: DD, DDM, DMS, MGRS (USNG es un alias de MGRS). Predeterminado: las cuatro."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida (el controlador se deduce de la extensión). Si se omite, se almacena en memoria."
              }
            }
          },
          "extract_ocean_winds": {
            "name": "Extraer vientos oceánicos",
            "description": "Recupera la velocidad del viento oceánico neutro equivalente a 10 m a partir de retrodispersión SAR calibrada invirtiendo la función de modelo geofísico CMOD5.N (Extraer vientos oceánicos de ArcGIS). Toda la cadena SAR incluida permanece en el dominio radiométrico y nada convertía la retrodispersión en una magnitud geofísica, que es también lo que separa una zona de viento bajo de un vertido de petróleo.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de retrodispersión calibrada (sigma0)."
              },
              "units": {
                "label": "Unidades",
                "description": "Unidades de 'input': 'dn', 'amplitude', 'intensity' o 'db' (predeterminado 'db')."
              },
              "incidence_angle": {
                "label": "Ángulo de incidencia",
                "description": "Ángulo de incidencia por celda en grados: la ruta de un ráster o un número constante."
              },
              "wind_direction": {
                "label": "Dirección del viento",
                "description": "Dirección meteorológica del viento en grados (la dirección DESDE la que sopla el viento), como ruta de un ráster o como constante. Es una información previa obligatoria: CMOD tiene dos incógnitas y una sola observación."
              },
              "look_direction": {
                "label": "Dirección de observación",
                "description": "Acimut de observación del radar en grados, como ruta de un ráster o como constante. Se usa para convertir la dirección del viento en el ángulo relativo que emplea CMOD."
              },
              "polarization": {
                "label": "Polarización",
                "description": "'vv' (predeterminado, CMOD5.N nativo) o 'hh' (aplica una razón de polarización aproximada)."
              },
              "polarization_ratio_alpha": {
                "label": "Alfa de relación de polarización",
                "description": "Alfa de la razón de polarización HH a VV (predeterminado 0.6). Solo se usa cuando la polarización es 'hh'."
              },
              "water_mask": {
                "label": "Máscara de agua",
                "description": "Capa de polígonos o ráster opcional que restringe la salida al agua; aquí los retornos de tierra carecen de sentido."
              },
              "max_wind": {
                "label": "Viento máximo",
                "description": "Extremo superior del intervalo de inversión, en m/s (predeterminado 50)."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de velocidad del viento de salida en m/s. Si se omite, se almacena en memoria."
              }
            }
          },
          "extract_scanned_features": {
            "name": "Extraer entidades escaneadas",
            "description": "Vectoriza un ráster binario (escaneado/umbralizado) en líneas limpias (trazado de esqueleto) o polígonos, con eliminación de ruido, relleno de huecos, cierre de brechas y simplificación.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster binario/clasificado de entrada que se va a vectorizar."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según su extensión). Si se omite, se almacena en memoria."
              },
              "feature_type": {
                "label": "Tipo de rasgo",
                "description": "'lines' (predeterminado): esqueletiza y traza las líneas centrales. 'polygons': vectoriza las regiones rellenas."
              },
              "foreground_value": {
                "label": "Valor de primer plano",
                "description": "Valor de celda que marca el primer plano. Si se omite, son primer plano las celdas >= 'threshold' (o, en su defecto, cualquier celda válida distinta de cero)."
              },
              "threshold": {
                "label": "Umbral",
                "description": "El primer plano son las celdas con un valor >= a este (se usa cuando no se indica 'foreground_value')."
              },
              "noise_size": {
                "label": "Tamaño de ruido",
                "description": "Eliminar los componentes de primer plano con menos celdas que este número (predeterminado 4)."
              },
              "hole_size": {
                "label": "Tamaño de hueco",
                "description": "Rellenar los huecos de fondo con menos celdas que este número (predeterminado 4)."
              },
              "gap_distance": {
                "label": "Distancia de hueco",
                "description": "Para 'lines': salva los huecos de hasta esta distancia (unidades del CRS) entre extremos de líneas casi colineales. Predeterminado 0 (desactivado)."
              },
              "simplify_tolerance": {
                "label": "Tolerancia de simplificación",
                "description": "Tolerancia de Douglas-Peucker (unidades del CRS) para la geometría de salida. Predeterminado ~1 celda."
              },
              "band": {
                "label": "Banda",
                "description": "Banda (con índice desde 1) que se lee (predeterminado 1)."
              }
            }
          },
          "extract_sinks": {
            "name": "Extraer sumideros",
            "description": "Extrae sumideros (extensión máxima de depresión) de un DEM (lidar filling.py).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster DEM de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de sumideros. Si se omite, se almacena en memoria."
              },
              "min_size": {
                "label": "Tamaño mínimo",
                "description": "Número mínimo de píxeles de un sumidero (se conserva si es estrictamente mayor; predeterminado 10)."
              },
              "region_output": {
                "label": "Salida de regiones",
                "description": "Ruta de salida opcional del ráster de regiones etiquetadas."
              },
              "depth_output": {
                "label": "Salida de profundidad",
                "description": "Ruta de salida opcional del ráster de profundidad de relleno."
              },
              "filled_output": {
                "label": "Salida rellenada",
                "description": "Ruta de salida opcional del DEM con las depresiones rellenadas."
              },
              "csv_output": {
                "label": "Salida CSV",
                "description": "Ruta de salida opcional del CSV de atributos por región."
              },
              "vector_output": {
                "label": "Salida vectorial",
                "description": "Ruta de salida opcional de los polígonos de región en formato GeoJSON (con los atributos unidos)."
              },
              "flat_increment": {
                "label": "Incremento de planicie",
                "description": "Incremento constante que se añade durante el relleno para forzar el drenaje (predeterminado 0)."
              }
            }
          },
          "extract_spectra_from_image": {
            "name": "Extraer espectros de la imagen",
            "description": "Deriva una biblioteca espectral a partir de una imagen multibanda y regiones de entrenamiento, un espectro por clase, en el formato CSV que lee spectral_library_matching (Extraer espectros de imagen de ArcGIS). spectral_library_matching, spectral_angle_mapper y matched_filter_target_detection consumen todos una biblioteca y nada creaba una, por lo que la suite espectral solo podía usarse contra bibliotecas publicadas preexistentes.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Imagen multibanda."
              },
              "training_features": {
                "label": "Entidades de entrenamiento",
                "description": "Capa de polígonos o puntos que delimita cada clase u objetivo."
              },
              "class_field": {
                "label": "Campo de clase",
                "description": "Atributo que contiene la etiqueta de clase. Las entidades que comparten etiqueta se agrupan en un único espectro."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del CSV de la biblioteca espectral de salida ('name,b1,b2,...' por clase), listo para el parámetro 'library_csv' de spectral_library_matching."
              },
              "statistic": {
                "label": "Estadístico",
                "description": "Reducción sobre las celdas cubiertas: 'mean' (predeterminado), 'median', 'max', 'min'."
              },
              "trim_percent": {
                "label": "Porcentaje de recorte",
                "description": "Porcentaje descartado en cada cola y por banda antes de reducir, para suprimir los píxeles mezclados de los bordes (predeterminado 0, máximo 49)."
              },
              "min_cells": {
                "label": "Celdas mínimas",
                "description": "Las clases que cubren menos celdas que este número se notifican y se omiten en lugar de generar un 'espectro' de un solo píxel (predeterminado 1)."
              },
              "wavelengths": {
                "label": "Longitudes de onda",
                "description": "Longitudes de onda por banda opcionales separadas por comas, registradas como encabezado de comentario en la biblioteca y en output_stats."
              },
              "output_stats": {
                "label": "Estadísticas de salida",
                "description": "CSV opcional que recibe la desviación estándar y el recuento de celdas por clase y banda. Se mantiene aparte para que la biblioteca siga siendo analizable."
              }
            }
          },
          "extract_water_sar": {
            "name": "Extraer agua (SAR)",
            "description": "Delinea agua abierta y extensión de inundación a partir de retrodispersión SAR con un umbral de Otsu por escena en decibelios, más filtros opcionales de pendiente del DEM y de altura sobre el mínimo que rechazan la sombra del radar y las superficies secas oscuras (Extraer agua de ArcGIS). Ningún registro puede hacer esto a partir de radar: el NDWI/MNDWI de spectral_index necesita bandas de reflectancia verde/NIR/SWIR que un SAR no tiene, depth_to_water modela dónde debería haber agua a partir del terreno en lugar de observarla, y un umbral de raster_calculator fijado a mano no se transfiere entre escenas porque la separación agua/tierra se desplaza con el viento y el ángulo de incidencia.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de retrodispersión SAR."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de polígonos de agua de salida. Si se omite, se almacena en memoria."
              },
              "output_raster": {
                "label": "Ráster de salida",
                "description": "Máscara binaria de agua de salida (1 agua, 0 tierra). Se genera siempre; se almacena en memoria cuando no se indica ninguna ruta."
              },
              "dem": {
                "label": "DEM",
                "description": "DEM opcional, corregistrado con la entrada, que habilita los filtros de pendiente y de altura."
              },
              "threshold_db": {
                "label": "Umbral (dB)",
                "description": "Umbral fijo en dB; las celdas iguales o inferiores a él son agua. Prevalece sobre el umbral automático de Otsu."
              },
              "min_area": {
                "label": "Área mínima",
                "description": "Descartar las masas de agua cuya superficie sea menor que este valor, en unidades del mapa al cuadrado."
              },
              "max_slope": {
                "label": "Pendiente máxima",
                "description": "Con un DEM, rechaza el agua situada en terreno con una pendiente mayor que este número de grados (predeterminado 5). El agua estancada no puede ocupar una pendiente pronunciada, pero la sombra del radar allí es igual de oscura."
              },
              "max_height_above_min": {
                "label": "Altura máxima sobre el mínimo",
                "description": "Con un DEM, rechaza las celdas candidatas que estén más de este número de unidades z por encima de la celda más baja del DEM en su propia región conectada."
              },
              "mask_features": {
                "label": "Entidades de máscara",
                "description": "Capa de polígonos que restringe el área de análisis."
              },
              "mask_type": {
                "label": "Tipo de máscara",
                "description": "'land_polygon' (predeterminado; analiza fuera de los polígonos) o 'water_polygon' (analiza dentro de ellos)."
              },
              "histogram_bins": {
                "label": "Intervalos del histograma",
                "description": "Intervalos usados para el histograma de Otsu (predeterminado 256)."
              },
              "input_units": {
                "label": "Unidades de entrada",
                "description": "'intensity' (predeterminado), 'dn', 'amplitude' o 'db'."
              },
              "band": {
                "label": "Banda",
                "description": "Banda que se umbraliza, con índice desde 1 (predeterminado 1)."
              }
            }
          },
          "extrude_between": {
            "name": "Extruir entre",
            "description": "Construye sólidos cerrados y estancos que abarcan el espacio entre dos superficies dentro de cada polígono de entrada, con volúmenes exactos por entidad (Extruir entre de ArcGIS). cut_fill da el cambio de volumen por celda entre dos rásteres pero emite un ráster, no puede restringirse a huellas y no lleva atributos; buffer_3d y minimum_bounding_volume construyen sólidos a partir de entidades en lugar de un par de superficies. La salida alimenta directamente a union_3d, intersect_3d, difference_3d e inside_3d.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Huellas poligonales que definen la extensión lateral de cada sólido. Solo se usa el PRIMER anillo de la primera parte: se ignoran los huecos interiores y las partes adicionales de un MultiPolygon, así que divida previamente las huellas multiparte y rellene los huecos antes de extruir."
              },
              "surface_upper": {
                "label": "Superficie superior",
                "description": "Ráster de la superficie delimitadora superior."
              },
              "surface_lower": {
                "label": "Superficie inferior",
                "description": "Ráster de la superficie delimitadora inferior, corregistrado con el superior."
              },
              "output": {
                "label": "Salida",
                "description": "Entidades sólidas cerradas (MultiPolygons de malla de triángulos con Z). Si se omite, se almacena en memoria."
              },
              "sample_distance": {
                "label": "Distancia de muestreo",
                "description": "Espaciado del muestreo de la huella y de la densificación del límite en unidades del CRS. Predeterminado: el tamaño de celda de la superficie más fina."
              },
              "band": {
                "label": "Banda",
                "description": "Banda que se lee de cada ráster de superficie, con índice desde 1 (predeterminado 1)."
              }
            }
          },
          "feature_outline_masks": {
            "name": "Máscaras de contorno de entidades",
            "description": "Genera polígonos de máscara cartográfica con un margen alrededor de las entidades (contorno exacto, envolvente convexa o cuadro delimitador), opcionalmente recortados a una segunda capa (Máscaras de capas intersecantes).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada (cualquier geometría), formato detectado automáticamente (o identificador en memoria)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según su extensión). Si se omite, se almacena en memoria."
              },
              "margin": {
                "label": "Margen",
                "description": "Distancia del margen de la máscara. En metros para un CRS geográfico (EPSG:4326 o desconocido, convertidos a grados); en los demás casos, en las unidades del CRS de la capa. Debe ser positiva."
              },
              "mask_kind": {
                "label": "Tipo de máscara",
                "description": "Forma de la máscara: 'exact' (predeterminado, el contorno de la entidad con zona de influencia), 'convex_hull' (envolvente convexa dilatada) o 'box' (rectángulo delimitador + margen)."
              },
              "masked_layer": {
                "label": "Capa enmascarada",
                "description": "Segunda capa de polígonos opcional. Cuando se proporciona, las máscaras se recortan a su intersección con ella (máscaras de capas que se intersecan); las máscaras que no se solapan se descartan."
              },
              "id_field": {
                "label": "Campo de ID",
                "description": "Campo de origen opcional cuyo valor se copia en cada máscara como 'source_id'. Por defecto, el índice de la entidad de origen."
              }
            }
          },
          "feature_to_line": {
            "name": "Entidad a línea",
            "description": "Planariza entidades de líneas/límites de polígonos en segmentos de línea con nodos y sin solapes, divididos en cada intersección mutua y propia, como Entidad a línea de ArcGIS — el precursor de construcción topológica que polygons_to_lines y split_vector_lines incluidos no proporcionan.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de líneas o polígonos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de líneas de salida (controlador según la extensión). Si se omite, se almacena en memoria."
              },
              "cluster_tolerance": {
                "label": "Tolerancia de clúster",
                "description": "Ajusta los puntos de división a esta malla en unidades del mapa para fusionar los nodos casi coincidentes (predeterminado 1e-9)."
              },
              "attributes": {
                "label": "Atributos",
                "description": "Cuando es verdadero (predeterminado), etiqueta cada segmento de salida con 'src_fid', el identificador de la entidad de origen."
              }
            }
          },
          "feature_vertices_to_points": {
            "name": "Vértices de entidad a puntos",
            "description": "Crea una capa de puntos a partir de vértices de entidad seleccionados — ALL, START, END, BOTH_ENDS, MID (punto medio de longitud de arco) o DANGLE (extremos de línea no compartidos) — con un campo de FID padre, como Vértices de entidad a puntos de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de líneas, polígonos o puntos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de puntos de salida (controlador según la extensión). Si se omite, se almacena en memoria."
              },
              "point_location": {
                "label": "Ubicación del punto",
                "description": "Vértices que se extraen: ALL | START | END | BOTH_ENDS | MID | DANGLE. Predeterminado ALL."
              }
            }
          },
          "features_to_gpx": {
            "name": "Entidades a GPX",
            "description": "Escribe entidades de puntos como waypoints GPX y entidades de líneas como tracks GPX, asignando campos de atributos a nombre/descripción/elevación/hora.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos o líneas que se va a exportar (se supone WGS84 / EPSG:4326)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del archivo .gpx de salida."
              },
              "name_field": {
                "label": "Campo de nombre",
                "description": "Campo de atributo asignado al elemento <name> de GPX (opcional)."
              },
              "description_field": {
                "label": "Campo de descripción",
                "description": "Campo de atributo asignado al elemento <desc> de GPX (opcional)."
              },
              "z_field": {
                "label": "Campo Z",
                "description": "Campo de atributo asignado a la elevación <ele> de GPX (opcional; recurre a la Z de la geometría cuando existe)."
              },
              "date_field": {
                "label": "Campo de fecha",
                "description": "Campo de atributo asignado a la marca de tiempo <time> de GPX, una cadena ISO-8601 (opcional)."
              }
            }
          },
          "features_to_gtfs": {
            "name": "Entidades a GTFS",
            "description": "Exporta entidades de puntos a stops.txt de GTFS y entidades de líneas a shapes.txt de GTFS, cerrando el ciclo de ida y vuelta GTFS.",
            "params": {
              "stops_input": {
                "label": "Entrada de paradas",
                "description": "Capa vectorial de puntos que se escribe como stops.txt (usa los campos de atributo stop_id/stop_name cuando existen)."
              },
              "shapes_input": {
                "label": "Entrada de trazados",
                "description": "Capa vectorial de líneas que se escribe como shapes.txt (usa un campo de atributo shape_id cuando existe)."
              },
              "output_dir": {
                "label": "Directorio de salida",
                "description": "Directorio en el que se escriben los archivos de texto GTFS (stops.txt / shapes.txt). Se crea si no existe."
              }
            }
          },
          "features_to_kml": {
            "name": "Entidades a KML",
            "description": "Escribe una capa vectorial en un documento KML 2.2 (o un KMZ comprimido), con los atributos como ExtendedData y un estilo compartido opcional (Capa a KML / Mapa a KML de ArcGIS). kml_to_features ya podía leer KML pero nada lo escribía, a diferencia de los pares simétricos GPX, GTFS y GeoParquet.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada. Debe estar en EPSG:4326 (longitud/latitud), el único CRS que define KML."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del archivo .kml o .kmz de salida."
              },
              "name_field": {
                "label": "Campo de nombre",
                "description": "Atributo usado para el <name> de cada Placemark."
              },
              "description_field": {
                "label": "Campo de descripción",
                "description": "Atributo usado para <description>. Cuando se omite, todos los atributos se escriben como <ExtendedData>."
              },
              "z_field": {
                "label": "Campo Z",
                "description": "Atributo que proporciona una elevación, escrita como tercera coordenada."
              },
              "altitude_mode": {
                "label": "Modo de altitud",
                "description": "'clampToGround' (predeterminado), 'relativeToGround' o 'absolute'."
              },
              "color": {
                "label": "Color",
                "description": "Color de la línea o del contorno en hexadecimal aabbggrr de KML (p. ej. 'ff0000ff' para rojo opaco)."
              },
              "line_width": {
                "label": "Ancho de línea",
                "description": "Ancho de línea en píxeles (predeterminado 1.0)."
              },
              "fill_color": {
                "label": "Color de relleno",
                "description": "Color de relleno del polígono en hexadecimal aabbggrr de KML. Omítalo para no aplicar relleno."
              }
            }
          },
          "fence_diagram": {
            "name": "Diagrama de vallas",
            "description": "Genera paneles de sección vertical 3D donde una línea de traza cruza una pila de superficies — la forma estándar de visualizar la estratigrafía del subsuelo o la estratificación atmosférica (Diagrama de valla de ArcGIS). profile, long_profile y stack_profile muestrean superficies a lo largo de una línea pero devuelven líneas de perfil 2D o tablas, sin geometría para el espacio ENTRE superficies consecutivas, y voxel_isosurface extrae una superficie de nivel de un volumen en lugar de una sección.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Entidades de línea que definen la traza de la sección."
              },
              "surfaces": {
                "label": "Superficies",
                "description": "Lista separada por comas de rásteres de superficie corregistrados, ordenados de ARRIBA hacia ABAJO."
              },
              "output": {
                "label": "Salida",
                "description": "Paneles de sección 3D, uno por traza y por par de superficies. Si se omite, se almacena en memoria."
              },
              "sample_distance": {
                "label": "Distancia de muestreo",
                "description": "Espaciado del muestreo a lo largo de la traza en unidades del CRS. Predeterminado: el tamaño de celda de superficie más fino."
              },
              "floor_height": {
                "label": "Altura del suelo",
                "description": "Límite inferior constante opcional: una superficie de base sintética a esta elevación, que cierra el panel más profundo."
              },
              "ceiling_height": {
                "label": "Altura del techo",
                "description": "Límite superior constante opcional: una superficie de techo sintética a esta elevación."
              },
              "band": {
                "label": "Banda",
                "description": "Banda que se lee de cada ráster de superficie, con índice desde 1 (predeterminado 1)."
              }
            }
          },
          "fill_missing_values": {
            "name": "Rellenar valores faltantes",
            "description": "Estima y rellena valores nulos en un campo de atributo numérico usando vecinos espaciales (k más cercanos o una banda de distancia), opcionalmente restringido a una ventana temporal, con un estimador seleccionable (media/mediana/mínimo/máximo/tendencia_temporal). Las filas imputadas se marcan con un campo indicador (Rellenar valores ausentes de ArcGIS).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada con el campo que se va a rellenar."
              },
              "fill_field": {
                "label": "Campo de relleno",
                "description": "Campo numérico cuyos valores nulos se van a estimar y rellenar."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida (el controlador se deduce de la extensión). Si se omite, se almacena en memoria."
              },
              "estimator": {
                "label": "Estimador",
                "description": "Cómo se combinan los valores de los vecinos: 'mean' (predeterminado), 'median', 'min', 'max' o 'temporal_trend' (mínimos cuadrados en el tiempo; requiere time_field)."
              },
              "neighbourhood": {
                "label": "Vecindad",
                "description": "Selección espacial: 'knn' (predeterminado, los k más próximos) o 'distance_band' (todos los que estén dentro de search_radius)."
              },
              "k": {
                "label": "K",
                "description": "Número de vecinos más próximos para 'knn' (predeterminado 8)."
              },
              "search_radius": {
                "label": "Radio de búsqueda",
                "description": "Radio (unidades del CRS) para la selección 'distance_band'."
              },
              "time_field": {
                "label": "Campo de tiempo",
                "description": "Campo numérico opcional que indica el tiempo/orden de cada entidad (obligatorio para 'temporal_trend')."
              },
              "time_window": {
                "label": "Ventana temporal",
                "description": "Opcional: restringe los vecinos a los que estén dentro de esta distancia temporal respecto al objetivo (requiere time_field)."
              },
              "flag_field": {
                "label": "Campo de marca",
                "description": "Nombre del campo booleano que marca las filas imputadas (predeterminado 'imputed')."
              }
            }
          },
          "fill_spill_merge": {
            "name": "Fill-Spill-Merge",
            "description": "Enruta un volumen finito de agua superficial a través de un DEM para producir extensiones realistas de lagos/inundación (relleno parcial de depresiones con desbordamiento y fusión), reimplementando Fill-Spill-Merge de RichDEM.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada (elevaciones)."
              },
              "water_level": {
                "label": "Nivel del agua",
                "description": "Profundidad uniforme de agua superficial aplicada a todas las celdas. Proporcione este parámetro o 'surface_water'."
              },
              "surface_water": {
                "label": "Agua superficial",
                "description": "Ráster de profundidad de agua superficial por celda (alineado con el DEM). Prevalece sobre 'water_level' cuando se indican ambos."
              },
              "ocean_level": {
                "label": "Nivel del océano",
                "description": "Nivel del mar opcional: las celdas situadas a esta elevación o por debajo de ella que conectan con el borde de la malla se convierten en océano (línea base de inundación costera)."
              },
              "edge_outlet": {
                "label": "Salida por el borde",
                "description": "Tratar todas las celdas del borde de la malla como una salida libre (predeterminado true). El agua que llega al borde abandona el DEM."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de profundidad del agua estancada. Si se omite, se almacena en memoria."
              },
              "water_surface": {
                "label": "Superficie del agua",
                "description": "Ruta de salida opcional de la superficie hidráulica (DEM + profundidad del agua)."
              },
              "flood_extent": {
                "label": "Extensión de inundación",
                "description": "Ruta de salida opcional de una máscara de extensión de la inundación (1 donde hay agua estancada, 0 en el resto)."
              }
            }
          },
          "find_argument_statistics": {
            "name": "Encontrar estadísticas de argumento",
            "description": "Estadísticas de argumento por píxel sobre una pila ráster (como Buscar estadísticas de argumento de ArcGIS): el índice de rebanada (o fecha) del máximo/mínimo, la posición de la mediana, el número de rebanadas que superan un umbral (duración) o la racha consecutiva más larga — las respuestas de posición de argumento que los agregados de valores de cell-statistics e image_stack_profile incluidos no pueden dar.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Un ráster multibanda (cada banda es una rebanada) o una lista separada por comas de rásteres corregistrados, en orden temporal."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster monobanda de salida con índices de rebanada / fechas / recuentos. Si se omite, se almacena en memoria."
              },
              "statistic": {
                "label": "Estadístico",
                "description": "'argmax' (predeterminado), 'argmin', 'median_position', 'duration' o 'longest_run'."
              },
              "threshold": {
                "label": "Umbral",
                "description": "Umbral numérico para 'duration'/'longest_run' (obligatorio para esos métodos)."
              },
              "comparison": {
                "label": "Comparación",
                "description": "Comparación para 'duration'/'longest_run': '>' (predeterminado), '>=', '<' o '<='."
              },
              "dates": {
                "label": "Fechas",
                "description": "Fechas numéricas opcionales separadas por comas (p. ej. el día del año) por rebanada; argmax/argmin/median devuelven la fecha correspondiente en lugar del índice de rebanada."
              },
              "min_valid": {
                "label": "Mínimo válido",
                "description": "Número mínimo de observaciones con datos por píxel (predeterminado 1)."
              }
            }
          },
          "find_dwell_locations": {
            "name": "Encontrar lugares de permanencia",
            "description": "Detecta dónde una entidad móvil permaneció quieta: rachas de posiciones de trayectoria dentro de una tolerancia de distancia durante al menos una tolerancia de tiempo, emitidas como posiciones, centros medios o envolventes convexas, como Buscar ubicaciones de permanencia de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Entidades de punto con marca de tiempo (posiciones de trayectoria)."
              },
              "track_field": {
                "label": "Campo de trayectoria",
                "description": "Campo que identifica la trayectoria a la que pertenece cada posición."
              },
              "time_field": {
                "label": "Campo de tiempo",
                "description": "Campo de marca de tiempo (segundos numéricos o texto ISO-8601)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              },
              "distance_tolerance": {
                "label": "Tolerancia de distancia",
                "description": "Distancia máxima (unidades del mapa) a la que puede situarse una posición respecto al centroide móvil de la parada."
              },
              "time_tolerance": {
                "label": "Tolerancia de tiempo",
                "description": "Duración mínima (en las mismas unidades que time_field) para que una serie estacionaria se considere una parada."
              },
              "output_type": {
                "label": "Tipo de salida",
                "description": "dwell_features (predeterminado) | mean_centers | convex_hulls | all_features."
              }
            }
          },
          "find_identical": {
            "name": "Encontrar idénticos",
            "description": "Encuentra entidades idénticas en geometría y/o campos elegidos, agrupando los duplicados; «report» añade columnas dup_group/dup_seq, «delete» conserva solo la primera de cada grupo, como Buscar idénticos / Eliminar idénticos de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada en la que se van a eliminar los duplicados."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida (el controlador se deduce de la extensión). Si se omite, se almacena en memoria."
              },
              "fields": {
                "label": "Campos",
                "description": "Campos separados por comas que se comparan. Omítalo para comparar solo la geometría; combínelo con 'compare_geometry'."
              },
              "compare_geometry": {
                "label": "Comparar geometría",
                "description": "Indica si la geometría forma parte de la prueba de identidad (predeterminado true; establézcalo en false para comparar solo los campos)."
              },
              "xy_tolerance": {
                "label": "Tolerancia XY",
                "description": "Tolerancia de ajuste para la comparación de geometrías (los vértices se redondean a esta malla antes de calcular el hash). Predeterminado 0 (exacto)."
              },
              "mode": {
                "label": "Modo",
                "description": "'report' (predeterminado; añade dup_group/dup_seq) o 'delete' (conserva el primero de cada grupo)."
              }
            }
          },
          "find_meeting_locations": {
            "name": "Encontrar lugares de encuentro",
            "description": "Detecta reuniones donde múltiples trayectorias distintas están juntas dentro de una distancia durante al menos una duración mínima (como Buscar ubicaciones de reunión de ArcGIS) — la co-ocurrencia de N trayectorias que trace_proximity_events (por pares) y reconstruct_tracks (permanencia de una sola trayectoria) no cubren. Emite envolventes de área y puntos representativos con número de participantes, hora de inicio/fin y duración.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de puntos de trayectoria con marca de tiempo (CRS proyectado; distancias en unidades del mapa)."
              },
              "track_field": {
                "label": "Campo de trayectoria",
                "description": "Campo que identifica cada trayectoria/entidad."
              },
              "time_field": {
                "label": "Campo de tiempo",
                "description": "Campo que contiene la hora de cada punto: segundos numéricos o una marca de tiempo ISO-8601."
              },
              "search_distance": {
                "label": "Distancia de búsqueda",
                "description": "Distancia máxima (unidades del mapa) para que dos trayectorias se consideren juntas."
              },
              "min_meeting_duration": {
                "label": "Duración mínima de encuentro",
                "description": "Duración mínima (unidades de tiempo) que debe persistir una reunión para que se notifique."
              },
              "max_meeting_duration": {
                "label": "Duración máxima de encuentro",
                "description": "Duración máxima opcional; las reuniones más largas se descartan."
              },
              "min_participants": {
                "label": "Participantes mínimos",
                "description": "Número mínimo de trayectorias distintas en una reunión (predeterminado 2)."
              },
              "time_step": {
                "label": "Paso de tiempo",
                "description": "Anchura de una rebanada temporal (unidades de tiempo). Predeterminado: min_meeting_duration."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de puntos representativos de salida (un punto por reunión). Si se omite, se almacena en memoria."
              },
              "output_area": {
                "label": "Área de salida",
                "description": "Capa de áreas de salida opcional (un polígono de envolvente convexa por reunión). Si se omite, se almacena en memoria."
              }
            }
          },
          "find_space_time_matches": {
            "name": "Encontrar coincidencias espacio-temporales",
            "description": "Empareja entidades entre dos capas de puntos con marca de tiempo que se encuentran dentro de una distancia de búsqueda espacial Y de una ventana temporal entre sí (antes/después/cualquiera), emitiendo pares emparejados con distancia y desfase temporal, como Buscar coincidencias espacio-temporales de ArcGIS.",
            "params": {
              "primary": {
                "label": "Primario",
                "description": "Capa de puntos principal (cada entidad se empareja con la capa secundaria)."
              },
              "secondary": {
                "label": "Secundario",
                "description": "Capa de puntos secundaria con la que se realiza el emparejamiento."
              },
              "time_field": {
                "label": "Campo de tiempo",
                "description": "Campo de marca de tiempo presente en AMBAS capas (numérico o ISO-8601)."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de emparejamientos de salida (una línea de enlace por par emparejado). Si se omite, se almacena en memoria."
              },
              "search_distance": {
                "label": "Distancia de búsqueda",
                "description": "Distancia espacial máxima entre una entidad principal y una secundaria (unidades del mapa)."
              },
              "time_window": {
                "label": "Ventana temporal",
                "description": "Separación temporal máxima: un número de segundos o una duración como '2h', '30m', '7d'."
              },
              "temporal_relationship": {
                "label": "Relación temporal",
                "description": "'either' (predeterminado), 'before' (la secundaria antes que la principal) o 'after' (la secundaria después que la principal)."
              },
              "primary_id_field": {
                "label": "Campo de ID primario",
                "description": "Campo que da nombre a cada entidad principal en la salida (predeterminado: el índice de la entidad)."
              },
              "secondary_id_field": {
                "label": "Campo de ID secundario",
                "description": "Campo que da nombre a cada entidad secundaria en la salida (predeterminado: el índice de la entidad)."
              }
            }
          },
          "fit_variogram": {
            "name": "Ajustar modelo de variograma",
            "description": "Ajusta un modelo de variograma teórico (esférico, exponencial, gaussiano) a datos de semivariograma empírico para su uso en kriging.",
            "params": {
              "lags_json": {
                "label": "JSON de retardos",
                "description": "Matriz JSON de intervalos de retardo procedente de estimate_variogram"
              },
              "model_family": {
                "label": "Familia de modelos",
                "description": "Modelo: spherical, exponential o gaussian"
              }
            }
          },
          "flatten_interferogram": {
            "name": "Aplanar interferograma",
            "description": "Elimina la componente de fase topográfica de un interferograma enrollado usando un DEM y la línea base interferométrica, dejando la señal de deformación y atmósfera (el modo de aplanado TOPO de Generar interferograma de ArcGIS). sar_coherence ya emite el interferograma en sí mediante output_phase, pero nada en ninguno de los registros puede simular y restar la fase topográfica — y sobre cualquier relieve esa componente domina, por lo que un interferograma sin aplanar es inutilizable para trabajos de deformación.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de fase interferométrica envuelta en radianes (tal como lo genera output_phase de sar_coherence), o un interferograma I/Q de dos bandas."
              },
              "dem": {
                "label": "DEM",
                "description": "Ráster de elevación corregistrado."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de fase envuelta aplanada, reenvuelta a (-pi, pi]. Si se omite, se almacena en memoria."
              },
              "perpendicular_baseline": {
                "label": "Línea base perpendicular",
                "description": "Línea base perpendicular B_perp en metros. Obligatorio: fija la sensibilidad altura-fase y no existe un valor predeterminado defendible."
              },
              "wavelength": {
                "label": "Longitud de onda",
                "description": "Longitud de onda del radar en metros (predeterminado 0.05546576, banda C de Sentinel-1)."
              },
              "incidence_angle": {
                "label": "Ángulo de incidencia",
                "description": "Ángulo de incidencia en grados: una constante (predeterminado 39.0, valor típico del centro de la franja IW de Sentinel-1) o la ruta de un ráster corregistrado."
              },
              "slant_range": {
                "label": "Distancia oblicua",
                "description": "Distancia oblicua R del sensor al suelo en metros (predeterminado 800000)."
              },
              "reference_elevation": {
                "label": "Elevación de referencia",
                "description": "Elevación tratada como fase topográfica cero. Predeterminado: la media del DEM, de modo que la salida no arrastra ningún desfase global arbitrario."
              },
              "out_topographic_phase": {
                "label": "Salida de fase topográfica",
                "description": "Ráster de fase topográfica simulada, ENVUELTO a (-pi, pi] igual que la salida aplanada — no es la fase simulada absoluta. Se genera siempre; recurre a un identificador en memoria cuando no se indica ninguna ruta."
              },
              "band": {
                "label": "Banda",
                "description": "Banda que contiene la fase, con índice desde 1. Omítala para un ráster de fase monobanda o un interferograma I/Q de dos bandas (que se detecta automáticamente); indíquela para leer la fase real de una banda concreta de una pila multibanda. Un ráster con más de dos bandas REQUIERE este parámetro, porque tres o más bandas no forman un par I/Q y adivinar devolvería una fase plausible pero incorrecta."
              }
            }
          },
          "flip_line": {
            "name": "Invertir línea",
            "description": "Invierte el orden de vértices (inicio↔fin) de entidades de polilínea para cambiar su dirección de digitalización.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo vectorial de líneas de entrada, formato detectado automáticamente (o identificador en memoria)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según su extensión). Si se omite, se almacena en memoria."
              }
            }
          },
          "focal_flow": {
            "name": "Flujo focal",
            "description": "Codifica cuáles de los ocho vecinos de una celda fluyen hacia ella como una máscara de 8 bits (Flujo focal de ArcGIS). A diferencia de las herramientas de acumulación D8/D-infinito incluidas, que enrutan cada celda pendiente abajo en una única dirección, esto registra cada vecino que aporta flujo — capturando la convergencia en pozos, sumideros y collados. Los pesos de bit van en sentido antihorario desde el este (1, 2, 4, 8, 16, 32, 64, 128); 0 es un máximo local, 255 un pozo.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de superficie de entrada (elevación o cualquier superficie continua)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida. Si se omite, el resultado se almacena en memoria."
              },
              "threshold": {
                "label": "Umbral",
                "description": "Un vecino se considera entrante solo si supera a la celda central en más de este valor (predeterminado 0)."
              },
              "band": {
                "label": "Banda",
                "description": "Banda (con índice desde 1) que se lee (predeterminado 1)."
              }
            }
          },
          "focal_statistics": {
            "name": "Estadísticas focales",
            "description": "Estadísticas de vecindad con ventana móvil (rectángulo/círculo/anillo/cuña; numéricas y categóricas).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida. Si se omite, el resultado se almacena en memoria."
              },
              "statistics": {
                "label": "Estadísticas",
                "description": "Estadístico: mean, majority, maximum, median, minimum, minority, percentile, range, std, sum o variety (predeterminado mean)."
              },
              "neighborhood": {
                "label": "Vecindad",
                "description": "Forma de la vecindad: rectangle, circle, annulus o wedge (predeterminado rectangle)."
              },
              "width": {
                "label": "Ancho",
                "description": "Ancho del rectángulo en celdas (predeterminado 3)."
              },
              "height": {
                "label": "Altura",
                "description": "Alto del rectángulo en celdas (predeterminado 3)."
              },
              "radius": {
                "label": "Radio",
                "description": "Radio en celdas para circle / wedge, y radio exterior para annulus (predeterminado 1)."
              },
              "inner_radius": {
                "label": "Radio interior",
                "description": "Radio interior en celdas para la vecindad annulus (predeterminado 0)."
              },
              "start_angle": {
                "label": "Ángulo inicial",
                "description": "Ángulo inicial del sector en grados (0 = este, sentido antihorario; predeterminado 0)."
              },
              "end_angle": {
                "label": "Ángulo final",
                "description": "Ángulo final del sector en grados (0 = este, sentido antihorario; predeterminado 90)."
              },
              "percentile_value": {
                "label": "Valor de percentil",
                "description": "Percentil en [0, 100] para el estadístico percentile (predeterminado 90)."
              },
              "ignore_nodata": {
                "label": "Ignorar sin datos",
                "description": "Si es verdadero (predeterminado), reduce solo sobre las celdas válidas; si es falso, cualquier celda sin datos en la ventana produce sin datos."
              },
              "band": {
                "label": "Banda",
                "description": "Banda que se procesa, con índice desde 1 (predeterminado 1)."
              }
            }
          },
          "forest_based_forecast": {
            "name": "Pronóstico basado en bosques",
            "description": "Pronostica un valor hacia adelante en cada ubicación con un bosque aleatorio entrenado en ventanas deslizantes de retardo del propio historial de esa ubicación, como Pronóstico basado en bosque de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Entidades con marca de tiempo que llevan un identificador de ubicación, un campo de tiempo y un campo de valor."
              },
              "location_field": {
                "label": "Campo de ubicación",
                "description": "Campo que identifica la ubicación a la que pertenece cada observación."
              },
              "time_field": {
                "label": "Campo de tiempo",
                "description": "Campo de tiempo numérico usado para ordenar la serie de cada ubicación."
              },
              "value_field": {
                "label": "Campo de valor",
                "description": "Campo numérico que se va a pronosticar."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional de la tabla de pronósticos. Si se omite, se almacena en memoria."
              },
              "forecast_steps": {
                "label": "Pasos de pronóstico",
                "description": "Número de pasos que se pronostican hacia delante (predeterminado 3)."
              },
              "time_window": {
                "label": "Ventana temporal",
                "description": "Número de valores previos usados como predictores (predeterminado: una cuarta parte de la longitud de la serie, con un mínimo de 2)."
              },
              "validation_steps": {
                "label": "Pasos de validación",
                "description": "Pasos finales reservados para calcular el RMSE (predeterminado 0, sin validación)."
              },
              "n_trees": {
                "label": "Número de árboles",
                "description": "Número de árboles del bosque (predeterminado 50, máximo 500)."
              },
              "min_leaf_size": {
                "label": "Tamaño mínimo de hoja",
                "description": "Número mínimo de filas de entrenamiento en una hoja (predeterminado 2)."
              },
              "max_depth": {
                "label": "Profundidad máxima",
                "description": "Profundidad máxima del árbol (predeterminado 8)."
              },
              "seed": {
                "label": "Semilla",
                "description": "Semilla del generador de números aleatorios determinista que controla el bootstrapping y la selección de subconjuntos de variables (predeterminado 42)."
              }
            }
          },
          "frequency_comparison": {
            "name": "Comparación de frecuencias",
            "description": "Cuenta, por celda, cuántos rásteres de una pila son iguales / mayores / menores que la celda correspondiente de un ráster de valores de referencia (Frecuencia igual a, Frecuencia mayor que y Frecuencia menor que de ArcGIS, más los operadores inclusivos y negados). Ningún registro puede agregar una comparación a través de una pila: cell_statistics no tiene entrada de referencia, raster_calculator expresa una comparación pero no puede contar a través de una pila de longitud arbitraria, y conditional_evaluation es un selector de condición única.",
            "params": {
              "value_raster": {
                "label": "Ráster de valores",
                "description": "Ráster de referencia con el que se compara cada capa de la pila, corregistrado con las entradas. Una referencia monobanda se difunde a todos los grupos de bandas; una referencia multibanda debe tener una banda por grupo y avanza con él."
              },
              "inputs": {
                "label": "Entradas",
                "description": "Un ráster multibanda (cada banda es una capa) o una lista separada por comas de rásteres corregistrados."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de recuento de salida (0..n). Si se omite, se almacena en memoria."
              },
              "comparison": {
                "label": "Comparación",
                "description": "'equal' (predeterminado), 'greater', 'less', 'greater_equal', 'less_equal' o 'not_equal'."
              },
              "tolerance": {
                "label": "Tolerancia",
                "description": "Tolerancia absoluta para 'equal'/'not_equal' con datos en coma flotante (predeterminado 0 = exacto)."
              },
              "ignore_nodata": {
                "label": "Ignorar sin datos",
                "description": "Omite las observaciones NoData en cada celda (predeterminado verdadero). Si es falso, cualquier observación NoData convierte la celda en NoData."
              },
              "process_as_multiband": {
                "label": "Procesar como multibanda",
                "description": "'single_band' (predeterminado): cada banda de cada entrada es una capa de una única pila. 'multi_band': la banda i de cada entrada forma su propia pila, lo que da un resultado multibanda."
              }
            }
          },
          "fuzzy_overlay": {
            "name": "Superposición difusa",
            "description": "Reescala un ráster a una superficie de pertenencia difusa 0..1 (linear/gaussian/small/large/ms_small/ms_large), o combina varios rásteres de pertenencia con AND/OR/PRODUCT/SUM/GAMMA difusos, como Pertenencia difusa + Superposición difusa de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Modo de pertenencia: ráster de entrada que se transforma en una superficie de 0 a 1."
              },
              "inputs": {
                "label": "Entradas",
                "description": "Modo de superposición: lista separada por comas de ≥2 rásteres de pertenencia que se combinan. Prevalece sobre 'input'."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida. Si se omite, el resultado se almacena en memoria."
              },
              "function": {
                "label": "Función",
                "description": "Función de pertenencia: 'linear' (predeterminado), 'gaussian', 'small', 'large', 'ms_small', 'ms_large'."
              },
              "overlay": {
                "label": "Superposición",
                "description": "Operador de superposición: 'and' (mínimo, predeterminado), 'or' (máximo), 'product', 'sum', 'gamma'."
              },
              "midpoint": {
                "label": "Punto medio",
                "description": "linear: el valor que se asigna a 0.5 se ignora (use min/max); gaussian/small/large: el punto medio de la función; ms_small/ms_large: el multiplicador de la media (predeterminado a partir de las estadísticas de la banda)."
              },
              "spread": {
                "label": "Dispersión",
                "description": "gaussian/small/large: dispersión (predeterminado 0.1 para gaussian, 5 para small/large); ms_small/ms_large: el multiplicador de la desviación estándar (predeterminado 1)."
              },
              "min": {
                "label": "Mínimo",
                "description": "linear: el valor que se asigna a la pertenencia 0 (predeterminado el mínimo de la banda). Si min>max la rampa es decreciente."
              },
              "max": {
                "label": "Máximo",
                "description": "linear: el valor que se asigna a la pertenencia 1 (predeterminado el máximo de la banda)."
              },
              "gamma": {
                "label": "Gamma",
                "description": "Exponente de la superposición gamma en [0,1] (predeterminado 0.9)."
              },
              "band": {
                "label": "Banda",
                "description": "Banda que se transforma en el modo de pertenencia, con índice desde 1 (predeterminado 1)."
              }
            }
          },
          "gaussian_geostatistical_simulations": {
            "name": "Simulaciones geoestadísticas gaussianas",
            "description": "Simulación gaussiana secuencial: N realizaciones condicionales equiprobables de un campo que respetan los datos de muestra (como Simulaciones geoestadísticas gaussianas de ArcGIS) — la salida condicional de múltiples realizaciones que empirical_bayesian_kriging / kriging ordinario de superficie única y la turning_bands_simulation incondicional no proporcionan. Con semilla y determinista.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de puntos de entrada con los valores de condicionamiento (CRS proyectado)."
              },
              "value_field": {
                "label": "Campo de valor",
                "description": "Campo numérico que contiene el valor que se va a simular."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster multibanda de salida (una banda por realización). Si se omite, se almacena en memoria."
              },
              "num_realizations": {
                "label": "Número de realizaciones",
                "description": "Número de realizaciones / bandas de salida (predeterminado 10)."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida en unidades del CRS. Predeterminado: el lado más largo de la extensión / 100."
              },
              "variogram_model": {
                "label": "Modelo de variograma",
                "description": "'exponential' (predeterminado), 'spherical' o 'gaussian'."
              },
              "nugget": {
                "label": "Pepita",
                "description": "Pepita manual; omítalo para ajustarla a partir de los datos."
              },
              "sill": {
                "label": "Meseta",
                "description": "Meseta parcial manual; omítalo para ajustarla a partir de los datos."
              },
              "range": {
                "label": "Rango",
                "description": "Rango manual; omítalo para ajustarlo a partir de los datos."
              },
              "max_neighbors": {
                "label": "Vecinos máximos",
                "description": "Número máximo de puntos conocidos usados en el kriging de cada celda (predeterminado 16)."
              },
              "seed": {
                "label": "Semilla",
                "description": "Semilla para el generador de números aleatorios determinista (predeterminado 1)."
              },
              "output_mean": {
                "label": "Media de salida",
                "description": "Ruta ráster opcional para la media del conjunto."
              },
              "output_std": {
                "label": "Salida de desviación estándar",
                "description": "Ruta ráster opcional para la desviación estándar del conjunto."
              }
            }
          },
          "generalized_linear_regression": {
            "name": "Regresión lineal generalizada",
            "description": "Regresión global (gaussiana/OLS, de Poisson o logística) de un campo dependiente sobre campos explicativos mediante IRLS, con campos de salida ajustados + residuos y diagnósticos completos: coeficiente por término, error estándar, t/z, probabilidad y VIF, más AICc, R²/devianza y la prueba de heterocedasticidad de Koenker estudentizada (Breusch–Pagan) — como Regresión lineal generalizada de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de entidades de entrada (puntos, u otras geometrías — la geometría se transfiere sin cambios)."
              },
              "dependent_field": {
                "label": "Campo dependiente",
                "description": "Campo numérico dependiente (de respuesta). Para 'logistic' debe ser 0/1."
              },
              "explanatory_fields": {
                "label": "Campos explicativos",
                "description": "Campo(s) numérico(s) explicativo(s) separados por comas."
              },
              "family": {
                "label": "Familia",
                "description": "Familia del modelo: 'gaussian' (OLS, predeterminado), 'poisson' (enlace logarítmico, recuentos) o 'logistic' (enlace logit, 0/1)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según su extensión). Si se omite, se almacena en memoria."
              },
              "report": {
                "label": "Informe",
                "description": "Ruta CSV opcional para el informe de coeficientes y diagnósticos del modelo."
              }
            }
          },
          "generate_breach_lines": {
            "name": "Generar líneas de brecha",
            "description": "Dados polígonos de depresión y un DEM, emite la polilínea a lo largo de la cual cada depresión sería abierta para drenar, usando un criterio de mínimo coste de apertura, trayectoria más corta o mínimo cambio de elevación, con profundidad de corte y volumen excavado por brecha. Como Generar líneas de brecha de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Polígonos de depresión (p. ej. la salida de delineate_depressions)."
              },
              "dem": {
                "label": "DEM",
                "description": "Ráster de superficie a través del cual se excava la brecha."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida de las líneas de brecha. Si se omite, se almacena en memoria."
              },
              "connection_points": {
                "label": "Puntos de conexión",
                "description": "Entidades de punto opcionales que restringen dónde puede terminar una brecha."
              },
              "method": {
                "label": "Método",
                "description": "'minimum_breaching_cost' (predeterminado), 'shortest_path' o 'minimum_elevation_change'."
              },
              "max_length": {
                "label": "Longitud máxima",
                "description": "Descartar las brechas más largas que este valor (unidades del mapa); esas depresiones se dejan sin abrir."
              }
            }
          },
          "generate_near_table": {
            "name": "Generar tabla de proximidad",
            "description": "Para cada entidad de entrada, enumera las k entidades más cercanas (o todas dentro de un radio de búsqueda) de la capa cercana con distancia, rango, ángulo de rumbo opcional y XY cercano — una tabla de proximidad multivecino, como Generar tabla de proximidad de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada (puntos, líneas o polígonos) cuya proximidad se mide."
              },
              "near_features": {
                "label": "Entidades cercanas",
                "description": "Capa vectorial de proximidad en la que se busca (puntos, líneas o polígonos)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de puntos de salida (un Point por cada coincidencia de proximidad). Si se omite, se almacena en memoria."
              },
              "search_radius": {
                "label": "Radio de búsqueda",
                "description": "Conservar solo las entidades próximas situadas dentro de esta distancia (unidades del mapa). Obligatorio cuando closest_count = 0 (todas las que estén dentro del radio)."
              },
              "closest_count": {
                "label": "Número de más cercanos",
                "description": "Número de entidades próximas más cercanas por cada entidad de entrada (k, predeterminado 1). Use 0 para devolver todas las entidades próximas dentro de search_radius."
              },
              "angle": {
                "label": "Ángulo",
                "description": "Añadir NEAR_ANGLE (rumbo aritmético en grados, este = 0, sentido antihorario). Predeterminado false."
              },
              "location": {
                "label": "Ubicación",
                "description": "Añadir las columnas NEAR_X / NEAR_Y con la ubicación próxima. Predeterminado false."
              }
            }
          },
          "generate_network_swm": {
            "name": "Generar SWM de red",
            "description": "Construye una matriz de pesos espaciales en la que los vecinos y los pesos provienen de la distancia de viaje a lo largo de una red de líneas en lugar de la geometría en línea recta (Generar pesos espaciales de red de ArcGIS). generate_spatial_weights_matrix solo ofrece conceptualizaciones euclidianas y topológicas (knn, banda de distancia fija, distancia inversa, contigüidad, Delaunay), por lo que para fenómenos restringidos a una red enlaza entidades que no pueden alcanzarse entre sí y sesga todas las estadísticas posteriores. La salida usa el mismo esquema de tabla, de modo que global_morans_i, local_morans_i_lisa, getis_ord_gi_star y compare_spatial_weights la consumen sin cambios.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Entidades de punto que se van a ponderar."
              },
              "network": {
                "label": "Red",
                "description": "Red de líneas a lo largo de la cual se miden las distancias de recorrido."
              },
              "output": {
                "label": "Salida",
                "description": "Tabla de pesos (CSV según la extensión, o una tabla vectorial sin geometría), con el mismo esquema origen/vecino/peso que genera generate_spatial_weights_matrix. Si se omite, se almacena en memoria."
              },
              "id_field": {
                "label": "Campo de ID",
                "description": "Campo que contiene el identificador único de cada entidad. Predeterminado: el índice de entidad con base 0, igual que en generate_spatial_weights_matrix."
              },
              "impedance_field": {
                "label": "Campo de impedancia",
                "description": "Campo de coste de la red. Predeterminado: la longitud geométrica de cada segmento."
              },
              "distance_cutoff": {
                "label": "Corte de distancia",
                "description": "Impedancia de red máxima a la que puede situarse un vecino. Predeterminado: sin límite."
              },
              "max_neighbors": {
                "label": "Vecinos máximos",
                "description": "Límite de vecinos por origen, conservando los más próximos. Predeterminado: sin límite."
              },
              "conceptualization": {
                "label": "Conceptualización",
                "description": "'fixed' (predeterminado, peso binario 1 dentro del umbral) o 'inverse' (peso = 1 / impedancia^exponente)."
              },
              "exponent": {
                "label": "Exponente",
                "description": "Exponente de decaimiento para 'inverse' (predeterminado 1)."
              },
              "row_standardization": {
                "label": "Estandarización por filas",
                "description": "Divide los pesos de cada origen por la suma de su fila para que cada origen sume 1. Predeterminado false, igual que generate_spatial_weights_matrix."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Distancia dentro de la cual dos vértices de la red se sueldan en un único nodo, en unidades del CRS (predeterminado 1e-6). De lo contrario, una red cuyos segmentos casi se tocan se desconectaría de forma silenciosa y cada origen afectado no generaría ninguna fila."
              },
              "search_tolerance": {
                "label": "Tolerancia de búsqueda",
                "description": "Distancia máxima de ajuste de un punto a la red. Los puntos más alejados se notifican como no ajustados en lugar de vincularse silenciosamente a un nodo lejano."
              }
            }
          },
          "generate_od_links": {
            "name": "Generar enlaces origen-destino",
            "description": "Dibuja líneas de deseo rectas desde puntos de origen hasta puntos de destino — emparejados por un ID compartido, dentro de una distancia y/o con los k más cercanos — cada una con los ID de origen/destino y la longitud, como Generar enlaces origen-destino de ArcGIS.",
            "params": {
              "origins": {
                "label": "Orígenes",
                "description": "Capa de puntos de origen (Point o MultiPoint)."
              },
              "destinations": {
                "label": "Destinos",
                "description": "Capa de puntos de destino (Point o MultiPoint)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de líneas de salida (controlador según la extensión). Si se omite, se almacena en memoria."
              },
              "num_nearest": {
                "label": "Número de más cercanos",
                "description": "Conservar solo los k destinos más próximos por origen (después de aplicar cualquier filtro de identificador o distancia)."
              },
              "search_distance": {
                "label": "Distancia de búsqueda",
                "description": "Conservar solo los destinos situados dentro de esta distancia del origen (unidades del mapa)."
              },
              "id_field": {
                "label": "Campo de ID",
                "description": "Campo presente en AMBAS capas; enlaza solo los pares cuyos valores coinciden. También se escribe como 'link_id'."
              },
              "origin_id_field": {
                "label": "Campo de ID de origen",
                "description": "Campo de la capa de orígenes que se escribe como 'origin_id' (predeterminado: el índice de la entidad)."
              },
              "dest_id_field": {
                "label": "Campo de ID de destino",
                "description": "Campo de la capa de destinos que se escribe como 'dest_id' (predeterminado: el índice de la entidad)."
              }
            }
          },
          "generate_points_along_3d_lines": {
            "name": "Generar puntos a lo largo de líneas 3D",
            "description": "Genera puntos uniformemente espaciados a lo largo de líneas 3D medidos en distancia 3D real (no la longitud en planta 2D que usa el points_along_lines incluido), con Z interpolada, puntos extremos opcionales y un campo de distancia acumulada 3D. Como Generar puntos a lo largo de líneas 3D de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Entidades de polilínea 3D de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de los puntos de salida. Si se omite, se almacena en memoria."
              },
              "method": {
                "label": "Método",
                "description": "'distance' (predeterminado), 'percentage' o 'distance_field'."
              },
              "distance": {
                "label": "Distancia",
                "description": "Espaciado en unidades del mapa para el método 'distance'."
              },
              "percentage": {
                "label": "Porcentaje",
                "description": "Espaciado como porcentaje (0-100) de la longitud 3D de cada línea para el método 'percentage'."
              },
              "distance_field": {
                "label": "Campo de distancia",
                "description": "Campo que proporciona un espaciado por entidad para el método 'distance_field'."
              },
              "include_end_points": {
                "label": "Incluir puntos extremos",
                "description": "Generar también los vértices inicial y final de cada línea (predeterminado false)."
              },
              "add_chainage": {
                "label": "Añadir distancia acumulada",
                "description": "Escribir un campo CHAINAGE con la distancia 3D acumulada desde el inicio de la línea (predeterminado false)."
              }
            }
          },
          "generate_spatial_weights_matrix": {
            "name": "Generar matriz de pesos espaciales",
            "description": "Emite una tabla reutilizable de vecinos/pesos en formato largo (origin_id, neighbor_id, weight) a partir de una conceptualización elegida — KNN, banda de distancia fija, distancia inversa, contigüidad (aristas / aristas+esquinas) o Delaunay — con estandarización por filas opcional, como Generar matriz de pesos espaciales de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada (puntos/líneas/polígonos; la contigüidad requiere polígonos)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de la tabla de salida — un CSV (extensión .csv) o una tabla vectorial sin geometría. Si se omite, se almacena en memoria."
              },
              "id_field": {
                "label": "Campo de ID",
                "description": "Campo que contiene el identificador único de cada entidad. Predeterminado: el índice de entidad con base 0."
              },
              "method": {
                "label": "Método",
                "description": "Conceptualización de las relaciones espaciales: 'knn', 'fixed_distance_band', 'inverse_distance', 'contiguity_edges', 'contiguity_edges_corners' o 'delaunay'. Predeterminado 'knn'."
              },
              "number_of_neighbors": {
                "label": "Número de vecinos",
                "description": "Número k de vecinos más próximos (method = knn). Predeterminado 8."
              },
              "threshold_distance": {
                "label": "Distancia umbral",
                "description": "Umbral de la banda de distancia en unidades del mapa. Obligatorio para fixed_distance_band; umbral opcional para inverse_distance (sin definir = todas las demás entidades)."
              },
              "exponent": {
                "label": "Exponente",
                "description": "Exponente p de decaimiento con la distancia para inverse_distance (peso = 1/d^p). Predeterminado 1."
              },
              "row_standardization": {
                "label": "Estandarización por filas",
                "description": "Divide los pesos de cada origen por la suma de su fila para que los pesos de cada origen sumen 1. Predeterminado false."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Cuantiza los vértices sobre una malla de este tamaño (unidades del CRS) antes de emparejar los límites para la contigüidad. Predeterminado 0 (coordenadas exactas)."
              }
            }
          },
          "generate_subset_polygons": {
            "name": "Generar polígonos de subconjunto",
            "description": "Particiona una capa de puntos densa en polígonos compactos y no solapados que teselan la extensión de los puntos, cada uno conteniendo entre un número mínimo y máximo de puntos (Generar polígonos de subconjunto de ArcGIS). El paso de preprocesamiento estándar para interpolar conjuntos de puntos muy grandes. A diferencia de las mallas fijas incluidas se adapta a la densidad (división k-d por la mediana), a diferencia de voronoi_diagram agrupa puntos en lugar de crear una celda por cada uno, y a diferencia de group_by_proximity emite polígonos y respeta los límites de tamaño.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de puntos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional de los polígonos. Si se omite, el resultado se almacena en memoria."
              },
              "output_points": {
                "label": "Puntos de salida",
                "description": "Ruta opcional para los puntos de entrada etiquetados con su identificador de subconjunto. Si se omite, se almacena en memoria (se sigue devolviendo)."
              },
              "min_points_per_subset": {
                "label": "Puntos mínimos por subconjunto",
                "description": "Límite inferior de puntos por subconjunto (predeterminado 50)."
              },
              "max_points_per_subset": {
                "label": "Puntos máximos por subconjunto",
                "description": "Límite superior de puntos por subconjunto (predeterminado 200)."
              },
              "coincident_points": {
                "label": "Puntos coincidentes",
                "description": "'single' (predeterminado; los puntos exactamente coincidentes cuentan una sola vez al dimensionar) o 'all' (cada uno cuenta por separado)."
              },
              "clip_to_hull": {
                "label": "Recortar a la envolvente",
                "description": "Recortar los polígonos de subconjunto a la envolvente convexa de los puntos para que el resultado se ciña a los datos y no a su rectángulo delimitador (predeterminado true)."
              }
            }
          },
          "generate_transects_along_lines": {
            "name": "Generar transectos a lo largo de líneas",
            "description": "Recorre cada línea a un intervalo fijo y emite líneas de transecto perpendiculares de una longitud dada (centradas o desplazadas), para muestreo de cambio de línea de costa, ribereño y de secciones transversales — como Generar transectos a lo largo de líneas de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de líneas de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de líneas de salida (controlador según la extensión). Si se omite, se almacena en memoria."
              },
              "interval": {
                "label": "Intervalo",
                "description": "Espaciado entre transectos a lo largo de cada línea, en unidades del CRS. Obligatorio."
              },
              "length": {
                "label": "Longitud",
                "description": "Longitud total del transecto, en unidades del CRS. Obligatorio."
              },
              "offset": {
                "label": "Desplazamiento",
                "description": "Desplazamiento con signo del centro del transecto respecto a la línea, en unidades del CRS (0 = centrado; +/- lo desplaza a la izquierda/derecha). Predeterminado 0."
              },
              "include_ends": {
                "label": "Incluir extremos",
                "description": "Colocar también un transecto exactamente al principio y al final de cada línea. Predeterminado false."
              }
            }
          },
          "generate_trend_raster": {
            "name": "Generar ráster de tendencia",
            "description": "Ajusta una tendencia temporal por píxel a través de una serie temporal de rásteres corregistrados (como Generar ráster de tendencia de ArcGIS): pendiente/intersección/R² de OLS o Mann-Kendall no paramétrico + pendiente de Sen con un valor p — la tendencia temporal por píxel que trend_surface (espacial) y change_vector_analysis (dos fechas) incluidos no pueden producir.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Lista separada por comas de rutas de rásteres monobanda corregistrados, en orden temporal (>= 3)."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de pendiente de salida (pendiente de Sen para mann_kendall). Si se omite, se almacena en memoria."
              },
              "times": {
                "label": "Tiempos",
                "description": "Tiempos numéricos separados por comas (p. ej. años) que se corresponden con 'inputs'. Predeterminado 0,1,2,..."
              },
              "method": {
                "label": "Método",
                "description": "'linear' (OLS; predeterminado) o 'mann_kendall' (no paramétrico + pendiente de Sen)."
              },
              "intercept_output": {
                "label": "Salida de intersección",
                "description": "Solo para linear: ráster de salida opcional con la ordenada en el origen del OLS."
              },
              "significance_output": {
                "label": "Salida de significancia",
                "description": "Ráster de salida opcional: R² (linear) o el valor p bilateral de Mann-Kendall (mann_kendall)."
              },
              "min_valid": {
                "label": "Mínimo válido",
                "description": "Número mínimo de observaciones con datos por píxel (predeterminado 3)."
              },
              "band": {
                "label": "Banda",
                "description": "Banda que se lee de cada entrada, con índice desde 1 (predeterminado 1)."
              }
            }
          },
          "geodetic_densify": {
            "name": "Densificar geodésicamente",
            "description": "Inserta vértices a lo largo de la trayectoria geodésica o loxodrómica (rumbo constante) verdadera entre los vértices existentes de una capa geográfica (lon/lat) de líneas o polígonos, como Densificación geodésica de ArcGIS — de modo que los segmentos largos sigan la curvatura terrestre en lugar de una cuerda plana.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de líneas o polígonos de entrada, que se supone geográfica (longitud/latitud, al estilo de EPSG:4326)."
              },
              "geodetic_type": {
                "label": "Tipo geodésico",
                "description": "Tipo de trayecto entre vértices: 'geodesic' (predeterminado; el camino más corto sobre el elipsoide WGS84) o 'rhumb'/'loxodrome' (rumbo verdadero constante)."
              },
              "max_segment_length": {
                "label": "Longitud máxima de segmento",
                "description": "Espaciado máximo objetivo, en metros, entre vértices consecutivos tras la densificación. Debe indicarse exactamente uno de max_segment_length / vertices_per_segment."
              },
              "vertices_per_segment": {
                "label": "Vértices por segmento",
                "description": "Alternativa a max_segment_length: inserta exactamente este número de vértices equiespaciados en cada segmento original, independientemente de su longitud. Debe indicarse exactamente uno de max_segment_length / vertices_per_segment."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional; si se omite, se almacena en memoria."
              }
            }
          },
          "geotagged_photos_to_points": {
            "name": "Fotos geoetiquetadas a puntos",
            "description": "Lee una carpeta de fotos geoetiquetadas y construye una capa de puntos WGS-84 con la ruta de cada foto, fecha y hora de captura, altitud, rumbo de la cámara (dirección de imagen GPS) y marca/modelo — extraídos únicamente de los metadatos EXIF (sin decodificar píxeles), como Fotos geoetiquetadas a puntos de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta de la carpeta que contiene las fotos (JPEG/TIFF) de las que se leen los metadatos GPS EXIF."
              },
              "output": {
                "label": "Salida",
                "description": "Vectorial de puntos de salida (el controlador se deduce de la extensión). Si se omite, se almacena en memoria."
              },
              "recursive": {
                "label": "Recursivo",
                "description": "Descender a las subcarpetas al buscar fotos. Predeterminado false."
              },
              "only_geotagged": {
                "label": "Solo con geoetiqueta",
                "description": "Omitir las imágenes que no llevan posición GPS (predeterminado true). Cuando es falso, las imágenes sin geoetiqueta se generan con una geometría nula."
              }
            }
          },
          "getis_ord_general_g": {
            "name": "Agrupamiento alto/bajo (G general de Getis-Ord)",
            "description": "Calcula el estadístico G general de Getis-Ord global — una única puntuación z y un valor p que indican si los valores ALTOS o BAJOS están agrupados globalmente, como Agrupación alta/baja (G general de Getis-Ord) de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada. Los puntos usan sus coordenadas; las demás geometrías usan su punto representativo, la media de sus vértices (los pesos de contigüidad requieren polígonos)."
              },
              "field": {
                "label": "Campo",
                "description": "Campo numérico no negativo que se somete a la prueba de agrupamiento alto/bajo."
              },
              "weights": {
                "label": "Pesos",
                "description": "Esquema de pesos espaciales: 'distance_band' (predeterminado), 'k_nearest', 'queen' o 'rook'."
              },
              "distance_band": {
                "label": "Banda de distancia",
                "description": "Distancia umbral (unidades del CRS) para el esquema 'distance_band'. Predeterminado: la distancia máxima al vecino más próximo (toda entidad tiene >=1 vecino)."
              },
              "k": {
                "label": "K",
                "description": "Número de vecinos para el esquema 'k_nearest' (predeterminado 8)."
              },
              "row_standardize": {
                "label": "Estandarizar por filas",
                "description": "Estandarizar por filas la matriz de pesos para que cada fila sume 1 (predeterminado false)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta CSV opcional para el informe de una sola fila. Siempre se devuelve en el resultado."
              }
            }
          },
          "goldstein_phase_filter": {
            "name": "Filtro de fase de Goldstein",
            "description": "Filtrado espectral adaptativo (Goldstein) de la fase SAR interferométrica, el paso que hace viable el desenrollado de fase (Aplicar filtro de datos complejos de ArcGIS). unwrap_phase de la ronda 17 falla con un interferograma bruto porque los residuos de ruido fuerzan cortes de rama; toda la familia de filtros lee/frost/kuan/wiener/gaussiano incluida trabaja sobre intensidad de valor real y no puede usarse aquí, ya que promediar fase enrollada a través de la discontinuidad +/-pi la destruye. Filtra la señal compleja parche a parche en el dominio de la frecuencia e informa del número de residuos antes y después.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Interferograma: un ráster I/Q de dos bandas o un ráster monobanda de fase envuelta en radianes (se supone amplitud unitaria)."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster complejo filtrado de dos bandas (I, Q) de salida. Si se omite, se almacena en memoria."
              },
              "output_phase": {
                "label": "Salida de fase",
                "description": "Fase envuelta filtrada monobanda de salida en radianes, en (-pi, pi]. Se genera siempre; se almacena en memoria cuando no se indica ninguna ruta."
              },
              "alpha": {
                "label": "Alfa",
                "description": "Intensidad del filtro en [0, 1] (predeterminado 0.5). 0 deja la fase intacta; 1 es lo más agresivo posible."
              },
              "outer_window_size": {
                "label": "Tamaño de ventana exterior",
                "description": "Tamaño del parche de la FFT en celdas (predeterminado 32). Se redondea al alza a una potencia de dos."
              },
              "inner_window_size": {
                "label": "Tamaño de ventana interior",
                "description": "Paso entre parches en celdas (predeterminado = outer/4). Un valor menor implica más solape y una mezcla más suave; no debe superar la ventana exterior."
              },
              "spectrum_smoothing": {
                "label": "Suavizado del espectro",
                "description": "Anchura en intervalos de la media móvil aplicada al espectro del parche antes de la exponenciación (predeterminado 3, debe ser impar)."
              }
            }
          },
          "gpx_to_features": {
            "name": "GPX a entidades",
            "description": "Analiza un archivo GPX en puntos de waypoint y/o polilíneas de track/ruta, transportando ele/time/name.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta a un archivo .gpx (XML del formato GPS Exchange)."
              },
              "points_output": {
                "label": "Salida de puntos",
                "description": "Ruta de salida opcional del vectorial de puntos para los waypoints (el controlador se deduce de su extensión). Si no se indica ninguna de las dos salidas, los waypoints se almacenan en memoria."
              },
              "lines_output": {
                "label": "Salida de líneas",
                "description": "Ruta de salida opcional del vectorial de líneas para las trayectorias y rutas (el controlador se deduce de su extensión)."
              }
            }
          },
          "graphic_buffer": {
            "name": "Zona de influencia gráfica",
            "description": "Crea buffers de entidades con elección de estilos de extremo (round/square/butt) y de unión de esquinas (round/miter/bevel), con un límite de inglete — la geometría de buffer cuadrada/en inglete que los buffers solo redondeados no pueden producir.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo vectorial de entrada, formato detectado automáticamente (o identificador en memoria)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según su extensión). Si se omite, se almacena en memoria."
              },
              "distance": {
                "label": "Distancia",
                "description": "Distancia de la zona de influencia en las unidades del CRS de la capa. Debe ser positiva."
              },
              "cap": {
                "label": "Extremo",
                "description": "Estilo de extremo para los finales de líneas y puntos: 'round' (predeterminado), 'square' o 'butt' (alias 'flat')."
              },
              "join": {
                "label": "Unión",
                "description": "Estilo de unión de esquinas: 'round' (predeterminado), 'miter' o 'bevel'."
              },
              "miter_limit": {
                "label": "Límite de inglete",
                "description": "Razón entre la longitud del inglete y la distancia de la zona de influencia por encima de la cual una esquina en inglete se bisela (predeterminado 10 en ArcGIS/JTS). Debe ser >= 1. Solo se usa cuando join='miter'."
              },
              "dissolve": {
                "label": "Disolver",
                "description": "Cuando es verdadero, une todas las zonas de influencia en una única entidad (multi)poligonal disuelta. Predeterminado false (una zona de influencia por entidad de entrada, conservando los atributos)."
              }
            }
          },
          "greater_than_or_equal_to": {
            "name": "MayorOIgualQue",
            "description": "Comprueba si el primer ráster es mayor o igual que el segundo celda a celda.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Primer ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Segundo ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, la salida permanece en memoria y se devuelve como identificador de ráster memory://."
              }
            }
          },
          "grid_index_features": {
            "name": "Entidades de índice de cuadrícula",
            "description": "Construye una malla índice de serie de mapas con rectángulos del tamaño de página con nombres de página (A1, B3, ... o secuenciales), dimensionado derivado de la escala y un filtro opcional de intersección con datos — como Entidades de índice de cuadrícula de ArcGIS, más un modo de franja que sigue una ruta con páginas rotadas como Entidades de índice de mapa de franja de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada. Proporciona la extensión cuando no se indica una extensión explícita, la ruta en el modo de banda y las entidades que comprueba intersect_only."
              },
              "output": {
                "label": "Salida",
                "description": "Vectorial de polígonos de salida con las páginas del índice (el controlador se deduce de la extensión). Si se omite, se almacena en memoria."
              },
              "mode": {
                "label": "Modo",
                "description": "grid (predeterminado): tesela una extensión rectangular. strip: sigue una línea de ruta con páginas rotadas y solapadas."
              },
              "x_min": {
                "label": "X mínimo",
                "description": "X mínima de la extensión explícita (unidades del CRS). Indique los cuatro valores x_min/y_min/x_max/y_max para sustituir la extensión de la entrada."
              },
              "y_min": {
                "label": "Y mínimo",
                "description": "Y mínima de la extensión explícita (unidades del CRS)."
              },
              "x_max": {
                "label": "X máximo",
                "description": "X máxima de la extensión explícita (unidades del CRS)."
              },
              "y_max": {
                "label": "Y máximo",
                "description": "Y máxima de la extensión explícita (unidades del CRS)."
              },
              "tile_width": {
                "label": "Ancho de tesela",
                "description": "Anchura de la página en unidades del CRS. Indique tanto tile_width como tile_height, o use page_size + map_scale."
              },
              "tile_height": {
                "label": "Alto de tesela",
                "description": "Altura de la página en unidades del CRS (longitud de la página a lo largo de la ruta en el modo de banda)."
              },
              "page_size": {
                "label": "Tamaño de página",
                "description": "Tamaño de papel preestablecido (a0..a4, letter, legal, tabloid) cuyas dimensiones métricas se multiplican por map_scale para dimensionar cada página. Requiere map_scale."
              },
              "map_scale": {
                "label": "Escala del mapa",
                "description": "Denominador de la escala del mapa (p. ej. 24000 para 1:24.000). Con page_size, el tamaño de la tesela = metros de papel × map_scale (se supone un CRS métrico)."
              },
              "origin_x": {
                "label": "Origen X",
                "description": "X del origen de la malla con el que se alinean los límites de las teselas. Predeterminado: la X mínima de la extensión."
              },
              "origin_y": {
                "label": "Origen Y",
                "description": "Y del origen de la malla con el que se alinean los límites de las teselas. Predeterminado: la Y mínima de la extensión."
              },
              "naming": {
                "label": "Nomenclatura",
                "description": "Esquema de denominación de páginas: alphanumeric (predeterminado; letra de columna + número de fila, p. ej. A1) o sequential (número en orden de lectura)."
              },
              "intersect_only": {
                "label": "Solo intersección",
                "description": "Cuando es verdadero, descarta las páginas que no intersecan ninguna entidad de entrada. Requiere input. Predeterminado false."
              },
              "route": {
                "label": "Ruta",
                "description": "Modo de banda: capa vectorial de líneas que se sigue. Por defecto, la primera entidad de línea de input."
              },
              "overlap": {
                "label": "Solape",
                "description": "Modo de banda: fracción [0,1) en la que se solapan las páginas consecutivas a lo largo de la ruta. Predeterminado 0.05."
              },
              "epsg": {
                "label": "EPSG",
                "description": "Código EPSG de salida cuando la extensión se indica explícitamente y no hay ninguna capa de entrada de la que heredar un CRS."
              }
            }
          },
          "group_by_proximity": {
            "name": "Agrupar por proximidad",
            "description": "Etiqueta entidades con un GROUP_ID de componentes conexas espaciales de enlace simple — entidades dentro de una distancia («near») o que se tocan («intersects»), opcionalmente compartiendo un valor de atributo — como Agrupar por proximidad de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada (cualquier tipo de geometría)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida (el controlador se deduce de la extensión). Si se omite, se almacena en memoria."
              },
              "relationship": {
                "label": "Relación",
                "description": "'near' (dentro de 'spatial_near_distance', predeterminado) o 'intersects' (en contacto, distancia 0)."
              },
              "spatial_near_distance": {
                "label": "Distancia de proximidad espacial",
                "description": "Distancia de búsqueda en unidades del mapa para 'near' (predeterminado 0)."
              },
              "attribute_field": {
                "label": "Campo de atributo",
                "description": "Campo opcional; las entidades solo se agrupan cuando comparten este valor de atributo."
              },
              "group_field": {
                "label": "Campo de agrupación",
                "description": "Nombre del campo de identificador de grupo de salida (predeterminado 'GROUP_ID')."
              }
            }
          },
          "gtfs_to_features": {
            "name": "GTFS a entidades",
            "description": "Analiza un feed de transporte público GTFS en puntos de paradas y líneas de rutas, opcionalmente con conteos de frecuencia de servicio por parada.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta a un directorio con un feed GTFS extraído (carpeta de archivos *.txt: stops.txt, shapes.txt, trips.txt, ...)."
              },
              "stops_output": {
                "label": "Salida de paradas",
                "description": "Ruta de salida opcional del vectorial de puntos para las paradas (el controlador se deduce de su extensión). Si no se indica ninguna de las dos salidas, las paradas se almacenan en memoria."
              },
              "shapes_output": {
                "label": "Salida de trazados",
                "description": "Ruta de salida opcional del vectorial de líneas para los trazados de las líneas (el controlador se deduce de su extensión)."
              },
              "frequency": {
                "label": "Frecuencia",
                "description": "Cuando es verdadero, cuenta las salidas programadas de cada parada según stop_times.txt en un campo n_departures. Predeterminado false."
              },
              "start_time": {
                "label": "Hora de inicio",
                "description": "Límite inferior HH:MM:SS opcional de la ventana de frecuencias (las horas de GTFS pueden superar 24:00:00)."
              },
              "end_time": {
                "label": "Hora final",
                "description": "Límite superior HH:MM:SS opcional de la ventana de frecuencias."
              }
            }
          },
          "h3_polyfill": {
            "name": "Relleno de polígonos H3",
            "description": "Cubre los polígonos de entrada con celdas de la malla global discreta H3 a una resolución elegida.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo vectorial de polígonos de entrada (debe ser geográfico, longitud/latitud, EPSG:4326) o identificador en memoria."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida; el controlador se deduce de su extensión (.geojson, .fgb, .parquet, ...). Si se omite, la capa se almacena en memoria."
              },
              "resolution": {
                "label": "Resolución",
                "description": "Resolución H3 de 0 (la más gruesa) a 15 (la más fina); predeterminado 8 (celdas de ~0,7 km²)."
              }
            }
          },
          "h3_to_vector": {
            "name": "Celdas H3 a polígonos",
            "description": "Convierte una columna de ID de celdas H3 en polígonos de límite de celda, copiando los demás atributos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo vectorial de entrada (o identificador en memoria) con un campo de identificadores de celda H3."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida; el controlador se deduce de su extensión (.geojson, .fgb, .parquet, ...). Si se omite, la capa se almacena en memoria."
              },
              "field": {
                "label": "Campo",
                "description": "Nombre del campo de texto que contiene el identificador de celda H3; predeterminado 'h3'."
              }
            }
          },
          "hdbscan": {
            "name": "Agrupamiento HDBSCAN",
            "description": "Agrupamiento jerárquico basado en densidad (HDBSCAN*): MST de alcanzabilidad mutua, árbol de clústeres condensado y selección por exceso de masa, con probabilidad de pertenencia y puntuación de valor atípico por punto — maneja densidad variable sin épsilon, como la opción HDBSCAN de Agrupamiento basado en densidad de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos de entrada (CRS proyectado; distancias en sus unidades)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida (una copia de la entrada con los campos de clúster). Si se omite, se almacena en memoria."
              },
              "min_cluster_size": {
                "label": "Tamaño mínimo de clúster",
                "description": "Agrupación más pequeña que se considera un clúster (>= 2). Predeterminado 5."
              },
              "min_samples": {
                "label": "Muestras mínimas",
                "description": "Tamaño de la vecindad para la estimación de densidad por distancia al núcleo (un valor mayor clasifica más puntos como ruido). Predeterminado: min_cluster_size."
              }
            }
          },
          "hot_spot_analysis_comparison": {
            "name": "Comparación de análisis de puntos calientes",
            "description": "Compara dos capas de resultados de puntos calientes de Getis-Ord: empareja sus ubicaciones, clasifica cada transición (hot_to_hot, hot_to_cold, none_to_hot, ...) y ejecuta una prueba de permutación con semilla de concordancia global — como Comparación de análisis de puntos calientes de ArcGIS.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Primera capa de resultados de puntos calientes (puntos o polígonos)."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Segunda capa de resultados de puntos calientes."
              },
              "bin_field": {
                "label": "Campo de celda",
                "description": "Campo de significación presente en ambas entradas (positivo = caliente, negativo = frío)."
              },
              "significance": {
                "label": "Significancia",
                "description": "Umbral de valor absoluto por debajo del cual una ubicación es 'none' (predeterminado 0)."
              },
              "match_field": {
                "label": "Campo de coincidencia",
                "description": "Campo de identificador opcional presente en ambas entradas que se usa para unir las ubicaciones; en su defecto, el centroide más próximo."
              },
              "tolerance": {
                "label": "Tolerancia",
                "description": "Distancia máxima entre centroides para el emparejamiento por ubicación más próxima (unidades del mapa). Sin límite si se omite."
              },
              "permutations": {
                "label": "Permutaciones",
                "description": "Número de permutaciones de la prueba global de concordancia (predeterminado 499)."
              },
              "seed": {
                "label": "Semilla",
                "description": "Semilla del generador de permutaciones determinista (predeterminado 1)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida (el controlador se deduce de la extensión). Si se omite, se almacena en memoria."
              }
            }
          },
          "identify_narrow_polygons": {
            "name": "Identificar polígonos estrechos",
            "description": "Marca los polígonos que son más estrechos que una tolerancia de ancho en algún lugar (astillas y cuellos delgados), anotando cada uno con un indicador is_narrow y un ancho mínimo estimado.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo vectorial de polígonos de entrada, formato detectado automáticamente (o identificador en memoria)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según su extensión). Si se omite, se almacena en memoria."
              },
              "width_tolerance": {
                "label": "Tolerancia de ancho",
                "description": "Umbral de anchura en unidades del CRS. Un polígono es estrecho donde es más delgado que este valor. Obligatorio."
              },
              "min_narrow_area": {
                "label": "Área estrecha mínima",
                "description": "Área mínima de la porción estrecha (unidades del CRS al cuadrado) necesaria para marcar un polígono; las áreas estrechas menores se ignoran por considerarse ruido. Predeterminado: width_tolerance al cuadrado, que además absorbe el ligero redondeo de esquinas de la apertura."
              },
              "narrow_only": {
                "label": "Solo estrechas",
                "description": "Cuando es verdadero, descarta las entidades no estrechas y genera solo los polígonos estrechos marcados. Predeterminado false (anota y conserva todas las entidades)."
              }
            }
          },
          "idw_3d": {
            "name": "IDW 3D",
            "description": "Interpolación volumétrica por distancia inversa de observaciones puntuales 3D en una pila de niveles de elevación (una banda ráster por nivel), con un factor de inflación de elevación que maneja la anisotropía vertical frente a horizontal y puntos opcionales de validación cruzada dejando uno fuera. Como IDW3D de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Entidades de punto 3D de entrada."
              },
              "value_field": {
                "label": "Campo de valor",
                "description": "Campo numérico que contiene el valor que se va a interpolar."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster multibanda de salida (una banda por nivel de elevación). Si se omite, se almacena en memoria."
              },
              "z_field": {
                "label": "Campo Z",
                "description": "Campo que proporciona la elevación; por defecto, la Z de la geometría."
              },
              "power": {
                "label": "Potencia",
                "description": "Exponente de distancia inversa (predeterminado 2)."
              },
              "elev_inflation_factor": {
                "label": "Factor de inflación de elevación",
                "description": "Multiplicador aplicado a la separación vertical antes de calcular la distancia 3D (predeterminado 1). Los valores > 1 hacen que la distancia vertical pese más, en consonancia con la menor escala de correlación vertical de la mayoría de los datos volumétricos."
              },
              "x_spacing": {
                "label": "Espaciado X",
                "description": "Tamaño de celda de salida en X (predeterminado: la extensión / 100)."
              },
              "y_spacing": {
                "label": "Espaciado Y",
                "description": "Tamaño de celda de salida en Y (predeterminado: el mismo que x_spacing)."
              },
              "z_spacing": {
                "label": "Espaciado Z",
                "description": "Separación vertical entre los niveles de salida (predeterminado: el rango de z / 10)."
              },
              "z_min": {
                "label": "Z mínimo",
                "description": "Nivel de salida más bajo (predeterminado: el mínimo de los datos)."
              },
              "z_max": {
                "label": "Z máximo",
                "description": "Nivel de salida más alto (predeterminado: el máximo de los datos)."
              },
              "neighbors": {
                "label": "Vecinos",
                "description": "Número máximo de muestras por predicción (predeterminado 12)."
              },
              "search_radius": {
                "label": "Radio de búsqueda",
                "description": "Distancia de búsqueda 3D máxima (inflada) opcional; las muestras que la superen se ignoran."
              },
              "output_cv_features": {
                "label": "Salida de entidades de validación cruzada",
                "description": "Ruta opcional para los puntos de validación cruzada dejando uno fuera, con los valores observado, predicho y residual."
              },
              "epsg": {
                "label": "EPSG",
                "description": "Código EPSG que se estampa en el ráster de salida (predeterminado: el CRS de la capa de entrada)."
              }
            }
          },
          "incremental_spatial_autocorrelation": {
            "name": "Autocorrelación espacial incremental",
            "description": "Calcula la I de Moran global a través de una serie de bandas de distancia crecientes e informa de la curva de puntuación z con su primer pico y su pico máximo — la forma defendible de elegir una distancia de agrupación, como Autocorrelación espacial incremental de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos de entrada (las demás geometrías usan su punto representativo, la media de sus vértices). Use un CRS proyectado."
              },
              "field": {
                "label": "Campo",
                "description": "Campo numérico que se somete a la prueba de autocorrelación espacial."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta CSV opcional para la tabla por bandas. Siempre se devuelve en el resultado."
              },
              "begin_distance": {
                "label": "Distancia inicial",
                "description": "Distancia de la primera banda, en unidades del CRS. Predeterminado: la distancia máxima al vecino más próximo (toda entidad tiene >=1 vecino)."
              },
              "increment": {
                "label": "Incremento",
                "description": "Distancia que se añade en cada banda, en unidades del CRS. Predeterminado: la distancia inicial."
              },
              "num_bands": {
                "label": "Número de bandas",
                "description": "Número de bandas de distancia que se evalúan (predeterminado 10)."
              }
            }
          },
          "inside_3d": {
            "name": "Dentro en 3D",
            "description": "Determina qué entidades 3D (puntos, polilíneas o sólidos) caen dentro de contenedores volumétricos cerrados, informando opcionalmente de la longitud contenida o la fracción de vértices (Dentro 3D de ArcGIS). Todos los predicados de contención de ambos registros proyectan al plano XY, por lo que un sensor sobre una huella o una tubería bajo una parcela actualmente se evalúan como dentro de ella. Los contenedores siguen la convención de malla triangular de buffer_3d y minimum_bounding_volume incluidos.",
            "params": {
              "target": {
                "label": "Objetivo",
                "description": "Entidades 3D que se comprueban: puntos, polilíneas o sólidos de malla de triángulos."
              },
              "container": {
                "label": "Contenedor",
                "description": "Entidades 3D cerradas (sólidos de malla de triángulos) que actúan como contenedores."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional de la tabla de pares objetivo/contenedor. Si se omite, se almacena en memoria."
              },
              "mode": {
                "label": "Modo",
                "description": "'simple' (predeterminado) indica si el objetivo está dentro; 'complex' añade la longitud contenida y la fracción interior."
              },
              "output_features": {
                "label": "Entidades de salida",
                "description": "Ruta opcional para las porciones interiores recortadas de los objetivos de línea (modo complex). Si se omite, se almacena en memoria (se sigue devolviendo)."
              }
            }
          },
          "integrate": {
            "name": "Integrar",
            "description": "Ajusta todos los vértices de todas las entidades dentro de una tolerancia de clúster a una ubicación compartida para que los límites compartidos casi coincidentes sean exactamente coincidentes, insertando opcionalmente vértices de unión en T sobre aristas cercanas — como Integrar de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada (cualquier tipo de geometría)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según la extensión). Si se omite, se almacena en memoria."
              },
              "tolerance": {
                "label": "Tolerancia",
                "description": "Distancia de agrupación en unidades del CRS: los vértices situados a menos de esta distancia se ajustan a una ubicación común. Obligatorio."
              },
              "snap_to_edges": {
                "label": "Ajustar a bordes",
                "description": "Insertar también un vértice donde el vértice de una entidad cae dentro de la tolerancia respecto al segmento de otra entidad (uniones en T). Predeterminado true."
              }
            }
          },
          "interpolate_from_spatiotemporal_points": {
            "name": "Interpolar desde puntos espacio-temporales",
            "description": "Agrupa observaciones puntuales con marca de tiempo en rebanadas temporales regulares e interpola cada una sobre una malla compartida, produciendo un ráster multidimensional corregistrado, como Interpolar desde puntos espaciotemporales de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Entidades de punto con marca de tiempo."
              },
              "value_field": {
                "label": "Campo de valor",
                "description": "Campo numérico que se va a interpolar."
              },
              "time_field": {
                "label": "Campo de tiempo",
                "description": "Campo de marca de tiempo: segundos numéricos desde la época o texto ISO-8601."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida de la primera rebanada. Las rebanadas posteriores se escriben junto a ella con el sufijo _t<index>. Si se omite, todas las rebanadas se almacenan en memoria."
              },
              "time_step": {
                "label": "Paso de tiempo",
                "description": "daily | weekly | monthly (predeterminado) | quarterly | yearly."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida en unidades del mapa. Por defecto, 1/50 de la dimensión mayor de la extensión."
              },
              "method": {
                "label": "Método",
                "description": "idw (predeterminado) | nearest | mean | median."
              },
              "power": {
                "label": "Potencia",
                "description": "Exponente de distancia de IDW (predeterminado 2)."
              },
              "neighbors": {
                "label": "Vecinos",
                "description": "Número de observaciones más próximas usadas por celda (predeterminado 8)."
              },
              "min_points": {
                "label": "Puntos mínimos",
                "description": "Número mínimo de observaciones necesarias para interpolar una rebanada; las rebanadas más dispersas generan todo NoData en lugar de una superficie engañosa (predeterminado 3)."
              }
            }
          },
          "interpolate_shape": {
            "name": "Interpolar forma",
            "description": "Drapea puntos/líneas/polígonos sobre un ráster de superficie: densifica, muestrea Z por vértice (bilineal o vecino más próximo), escribe geometría 3D y añade métricas de superficie (z_min/z_max/z_mean, longitud de superficie 3D, pendiente media), como Interpolar forma / Añadir información de superficie de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada (puntos, líneas o polígonos) que comparte el CRS de la superficie."
              },
              "surface": {
                "label": "Superficie",
                "description": "Ráster de elevación/superficie que se va a muestrear."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida (el controlador se deduce de la extensión). Si se omite, se almacena en memoria."
              },
              "sample_distance": {
                "label": "Distancia de muestreo",
                "description": "Intervalo de densificación en unidades del CRS; los segmentos largos se dividen para que sigan la superficie. Predeterminado: el tamaño de celda del ráster."
              },
              "method": {
                "label": "Método",
                "description": "Muestreo de la superficie: 'bilinear' (predeterminado) o 'nearest'."
              },
              "attributes": {
                "label": "Atributos",
                "description": "Lista separada por comas de las columnas de métricas que se añaden: z_min,z_max,z_mean,surf_len,avg_slope. Predeterminado: todas."
              },
              "band": {
                "label": "Banda",
                "description": "Banda de la superficie que se va a muestrear, con índice desde 1 (predeterminado 1)."
              }
            }
          },
          "interpolate_with_barriers": {
            "name": "Interpolar con barreras",
            "description": "Interpola mediciones puntuales a un ráster respetando barreras absolutas (líneas de costa, crestas, fallas, muros): la influencia viaja alrededor de las barreras mediante distancia de coste/geodésica, no a través de ellas — IDW o un kernel polinómico local de primer orden, como Interpolación de kernel con barreras / Spline con barreras de ArcGIS. Las herramientas idw/kriging/vecino natural/spline incluidas ignoran todas las barreras.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos de entrada con las mediciones."
              },
              "field": {
                "label": "Campo",
                "description": "Campo numérico de los puntos que contiene el valor que se va a interpolar."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster interpolado de salida (GeoTIFF). Si se omite, se almacena en memoria."
              },
              "barriers": {
                "label": "Barreras",
                "description": "Capa vectorial de barreras opcional (polilíneas o polígonos). Se rasteriza como celdas infranqueables, de modo que la influencia debe rodearlas. Omítala para un control sin barreras."
              },
              "method": {
                "label": "Método",
                "description": "'idw' (predeterminado) o 'local_polynomial' (ajuste planar ponderado de primer orden con un kernel gaussiano de distancia geodésica)."
              },
              "power": {
                "label": "Potencia",
                "description": "Exponente de decaimiento con la distancia de IDW (predeterminado 2)."
              },
              "bandwidth": {
                "label": "Ancho de banda",
                "description": "Ancho de banda del kernel gaussiano para local_polynomial (unidades de distancia). Predeterminado: el radio de búsqueda o, en su defecto, la extensión de la malla."
              },
              "radius": {
                "label": "Radio",
                "description": "Radio de búsqueda como distancia geodésica (de coste): las muestras que lo superan no influyen en una celda, y las celdas inalcanzables dentro de él pasan a ser sin datos. En metros para un CRS geográfico; en unidades del CRS en los demás casos. Predeterminado: sin límite."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida en unidades del CRS (grados para un CRS geográfico). Predeterminado: dimensionado para que el eje más largo abarque ~256 celdas."
              }
            }
          },
          "intersect_3d": {
            "name": "Intersecar en 3D",
            "description": "Calcula el volumen compartido por sólidos 3D cerrados solapados, par a par, con un sólido delimitador opcional para cada intersección (Intersecar 3D de ArcGIS). union_3d es la única superposición 3D de ambos registros y solo responde a la pregunta del volumen combinado; inside_3d es un predicado de contención para puntos y líneas, y polygon_volume / surface_volume miden contra un plano de referencia. Los volúmenes por sólido son exactos; la intersección se estima por ocupación de vóxeles a una resolución informada.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Entidades sólidas 3D cerradas (MultiPolygons de malla de triángulos con Z, como los que generan buffer_3d y minimum_bounding_volume)."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Segunda capa de sólidos opcional. Cuando se omite, se intersecan todos los pares dentro de 'input' (el modo de entrada única de ArcGIS)."
              },
              "output": {
                "label": "Salida",
                "description": "Tabla de salida con los pares que se intersecan, una fila por intersección no vacía. Si se omite, se almacena en memoria."
              },
              "mode": {
                "label": "Modo",
                "description": "'table' (predeterminado): solo atributos. 'solid': genera además el sólido delimitador de cada intersección como geometría. El volumen medido es siempre un atributo — no se afirma producir ninguna malla fusionada exacta."
              },
              "resolution": {
                "label": "Resolución",
                "description": "Celdas de vóxel a lo largo del eje más largo del rectángulo delimitador común de cada par (predeterminado 64). Un valor mayor es más exacto y más lento."
              }
            }
          },
          "intersect_3d_line_with_surface": {
            "name": "Intersecar línea 3D con superficie",
            "description": "Divide líneas 3D en cada punto donde cruzan una superficie de elevación o un multiparche, etiquetando cada pieza como por encima o por debajo y emitiendo los puntos de cruce (Intersecar línea 3D con superficie / Intersecar línea 3D con multiparche de ArcGIS). intersect_3d de la ronda 17 toma sólidos cerrados en lugar de líneas, inside_3d es un predicado de contención que ni corta la geometría ni localiza los cruces, e interpolate_shape drapea una línea sobre una superficie, descartando la z de la línea de la que depende la comparación.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de líneas 3D, con vértices que llevan valores z."
              },
              "surface": {
                "label": "Superficie",
                "description": "Ráster de elevación contra el que se corta. Obligatorio salvo que se indique 'multipatch'."
              },
              "multipatch": {
                "label": "Multiparche",
                "description": "Capa de multiparches (multipolígonos de triángulos) contra la que se corta, en lugar de una superficie ráster."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de líneas de salida dividida en cada cruce. Si se omite, se almacena en memoria."
              },
              "output_points": {
                "label": "Puntos de salida",
                "description": "Capa de puntos de salida con los propios cruces. Se genera siempre; se almacena en memoria cuando no se indica ninguna ruta."
              },
              "spacing": {
                "label": "Espaciado",
                "description": "Paso de densificación en planta en unidades del mapa (predeterminado: una celda de la superficie). Un valor menor resuelve los cruces con más detalle a mayor coste."
              },
              "keep_above": {
                "label": "Conservar por encima",
                "description": "Conservar las piezas situadas por encima de la superficie (predeterminado true)."
              },
              "keep_below": {
                "label": "Conservar por debajo",
                "description": "Conservar las piezas situadas por debajo de la superficie (predeterminado true)."
              },
              "band": {
                "label": "Banda",
                "description": "Banda del ráster de superficie, con índice desde 1 (predeterminado 1)."
              }
            }
          },
          "intersecting_layers_masks": {
            "name": "Máscaras de capas que se intersecan",
            "description": "Genera polígonos de máscara cartográfica con un margen alrededor de las entidades de una capa enmascarada, pero solo donde intersecan una segunda capa de enmascarado (contorno exacto, envolvente convexa o cuadro delimitador).",
            "params": {
              "masked_layer": {
                "label": "Capa enmascarada",
                "description": "Capa vectorial enmascarada (cualquier geometría): cada entidad que interseca la capa de enmascaramiento recibe una máscara. Formato detectado automáticamente (o un identificador en memoria)."
              },
              "masking_layer": {
                "label": "Capa de enmascarado",
                "description": "Capa vectorial de enmascaramiento (cualquier geometría): una entidad enmascarada solo se enmascara donde interseca una entidad de esta capa."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según su extensión). Si se omite, se almacena en memoria."
              },
              "margin": {
                "label": "Margen",
                "description": "Distancia del margen de la máscara. En metros para un CRS geográfico (EPSG:4326 o desconocido, convertidos a grados); en los demás casos, en las unidades del CRS de la capa. Debe ser positiva."
              },
              "mask_kind": {
                "label": "Tipo de máscara",
                "description": "Forma de la máscara: 'exact' (predeterminado, el contorno de la entidad con zona de influencia), 'convex_hull' (envolvente convexa dilatada) o 'box' (rectángulo delimitador + margen)."
              },
              "id_field": {
                "label": "Campo de ID",
                "description": "Campo opcional de la capa enmascarada cuyo valor se copia en cada máscara como 'source_id'. Por defecto, el índice de la entidad de origen."
              }
            }
          },
          "intervisibility": {
            "name": "Intervisibilidad",
            "description": "Prueba cada línea de visión contra obstrucciones vectoriales 3D y la marca como visible o bloqueada, informando de qué obstrucción la bloqueó y dónde (Intervisibilidad de ArcGIS). line_of_sight, visibility_index, viewshed y skyline_analysis trabajan todos contra un ráster de superficie; ninguno puede evaluar contra obstrucciones multiparche 3D como edificios, cuyos voladizos y soportales se pierden al grabarlos en un DEM.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Líneas de visión: polilíneas 3D cuyo primer vértice es el observador y el último el objetivo."
              },
              "obstructions": {
                "label": "Obstrucciones",
                "description": "Una o varias capas de obstrucciones 3D separadas por comas (MultiPolygons de malla de triángulos con Z)."
              },
              "output": {
                "label": "Salida",
                "description": "Líneas de visión de salida con los campos de visibilidad añadidos. Si se omite, se almacena en memoria."
              },
              "visible_field": {
                "label": "Campo de visibilidad",
                "description": "Nombre del campo booleano de visibilidad (predeterminado 'VISIBLE'), igual que el parámetro de ArcGIS."
              },
              "observer_offset": {
                "label": "Desplazamiento del observador",
                "description": "Altura que se añade al extremo del observador antes de la comprobación, en unidades del CRS (predeterminado 0). Modela la altura del ojo o del instrumento."
              },
              "target_offset": {
                "label": "Desplazamiento del objetivo",
                "description": "Altura que se añade al extremo del objetivo antes de la comprobación, en unidades del CRS (predeterminado 0)."
              },
              "visible_only": {
                "label": "Solo visibles",
                "description": "Generar solo las líneas de visión que no están obstruidas (predeterminado false)."
              }
            }
          },
          "is_closed_3d": {
            "name": "Está cerrado en 3D",
            "description": "Marca qué entidades multiparche 3D son sólidos cerrados estancos y cuáles son superficies abiertas, con conteos de diagnóstico de aristas de contorno no emparejadas, aristas no variedad y consistencia de orientación (Está cerrado 3D de ArcGIS). Todas las herramientas volumétricas del catálogo — union_3d, inside_3d, minimum_bounding_volume, buffer_3d — asumen una entrada cerrada y devuelven un número sin sentido para una malla abierta, y nada permite comprobar esa precondición primero.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Entidades 3D (MultiPolygons de malla de triángulos con Z, como los que generan buffer_3d, minimum_bounding_volume y voxel_isosurface)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida: las entidades de entrada con los campos de diagnóstico añadidos. Si se omite, se almacena en memoria."
              },
              "closed_only": {
                "label": "Solo cerrados",
                "description": "Generar solo las entidades que son sólidos cerrados (predeterminado false: se genera cada entidad con su veredicto)."
              }
            }
          },
          "kernel_density_ratio": {
            "name": "Razón de densidad kernel",
            "description": "Cociente de riesgo relativo de dos superficies de densidad de kernel: evalúa una capa de puntos numerador (casos) y una capa de puntos denominador (población en riesgo) con el mismo kernel cuártico y ancho de banda compartido, y luego divide celda a celda — como Calcular cociente de densidad de kernel de ArcGIS. Un mínimo del denominador escribe sin datos donde la población es demasiado escasa (sin fugas de inf/NaN), y una transformación logarítmica natural opcional hace simétrica la sobre/infrarrepresentación. El cociente de densidades que heat_map de una sola capa no puede expresar.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de puntos del numerador (p. ej. casos/incidentes)."
              },
              "denominator": {
                "label": "Denominador",
                "description": "Capa de puntos del denominador (p. ej. población/exposición en riesgo)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de razón de salida. Si se omite, se almacena en memoria."
              },
              "weight_field": {
                "label": "Campo de peso",
                "description": "Campo numérico que pondera los puntos del numerador (predeterminado: cada punto cuenta 1)."
              },
              "denominator_weight_field": {
                "label": "Campo de peso del denominador",
                "description": "Campo numérico que pondera los puntos del denominador (predeterminado: cada punto cuenta 1)."
              },
              "bandwidth": {
                "label": "Ancho de banda",
                "description": "Ancho de banda del kernel / radio de búsqueda compartido (en metros para un CRS geográfico; en unidades del CRS en los demás casos). Predeterminado: la regla de Silverman a partir de la dispersión conjunta de los puntos."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida en unidades del CRS (predeterminado: el lado mayor de la extensión / 200)."
              },
              "log_ratio": {
                "label": "Relación logarítmica",
                "description": "Si es verdadero, genera el logaritmo natural de la razón (simétrico en torno a 0). Predeterminado false."
              },
              "denominator_floor": {
                "label": "Mínimo del denominador",
                "description": "Las celdas cuya densidad en el denominador esté por debajo de este valor (o sea cero) pasan a ser sin datos, evitando divisiones desbordadas. Predeterminado 0 (solo se enmascara el denominador exactamente cero)."
              },
              "epsg": {
                "label": "EPSG",
                "description": "EPSG con el que se etiqueta la salida (predeterminado: el de la capa del numerador)."
              }
            }
          },
          "kernel_interpolation_with_barriers": {
            "name": "Interpolación kernel con barreras",
            "description": "Interpola observaciones puntuales con un ajuste polinómico ponderado por kernel en ventana móvil en el que la distancia se mide como la trayectoria más corta ALREDEDOR de barreras absolutas en lugar de directamente a través de ellas (Interpolación de kernel con barreras de ArcGIS). Complementa a diffusion_interpolation_with_barriers incluido, que resuelve una ecuación de calor en lugar de aplicar un kernel explícito. Todos los demás interpoladores de ambos registros usan distancia euclidiana, por lo que todos interpolan directamente a través de cabos y fallas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de puntos de entrada que contiene las observaciones."
              },
              "z_field": {
                "label": "Campo Z",
                "description": "Campo numérico que se va a interpolar."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional del ráster de valores predichos. Si se omite, se almacena en memoria."
              },
              "output_error": {
                "label": "Salida de error",
                "description": "Ruta opcional del ráster de la raíz cuadrática media de los residuos ponderados locales — la dispersión ponderada de los residuos de los vecinos respecto al ajuste local. Es una medida de bondad de ajuste, NO un error estándar de predicción al estilo de ArcGIS (no tiene en cuenta ni los grados de libertad efectivos ni el apalancamiento). Si se omite, se almacena en memoria (se sigue devolviendo)."
              },
              "barriers": {
                "label": "Barreras",
                "description": "Capa de polilíneas opcional con barreras absolutas. Si no se proporciona ninguna, la herramienta degenera en una interpolación kernel simple."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida en unidades del CRS. Por defecto, aproximadamente 1/100 del lado mayor de la extensión."
              },
              "kernel": {
                "label": "Kernel",
                "description": "exponential, gaussian, quartic, epanechnikov, polynomial5 (predeterminado) o constant."
              },
              "bandwidth": {
                "label": "Ancho de banda",
                "description": "Ancho de banda del kernel en unidades del CRS. Por defecto, un valor deducido de los datos a partir del espaciado medio al vecino más próximo."
              },
              "power": {
                "label": "Potencia",
                "description": "Orden del polinomio local: 0 (media ponderada) o 1 (predeterminado, ajuste planar)."
              },
              "ridge": {
                "label": "Cresta",
                "description": "Parámetro de cresta que estabiliza el ajuste local por mínimos cuadrados cuando una vecindad es degenerada (predeterminado 1e-6)."
              },
              "max_neighbors": {
                "label": "Vecinos máximos",
                "description": "Límite del número de observaciones que contribuyen a cada ajuste local (predeterminado 32)."
              }
            }
          },
          "kml_to_features": {
            "name": "KML a entidades",
            "description": "Lee los Placemarks de .kml/.kmz en capas de puntos, líneas y polígonos con atributos de nombre/descripción.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta a un archivo .kml o a un archivo comprimido .kmz (un KML comprimido en zip)."
              },
              "points_output": {
                "label": "Salida de puntos",
                "description": "Ruta de salida opcional del vectorial de puntos (el controlador se deduce de su extensión). Solo se escribe si el KML contiene marcas de posición de punto."
              },
              "lines_output": {
                "label": "Salida de líneas",
                "description": "Ruta de salida opcional del vectorial de líneas (el controlador se deduce de su extensión). Solo se escribe si el KML contiene marcas de posición de línea."
              },
              "polygons_output": {
                "label": "Salida de polígonos",
                "description": "Ruta de salida opcional del vectorial de polígonos (el controlador se deduce de su extensión). Solo se escribe si el KML contiene marcas de posición de polígono."
              }
            }
          },
          "landtrendr": {
            "name": "LandTrendr",
            "description": "Segmentación temporal LandTrendr de una serie anual de imágenes (como Analizar cambios mediante LandTrendr de ArcGIS): eliminación de picos, ajuste lineal por tramos basado en vértices voraz y extracción de la mayor perturbación (año, magnitud, duración) por píxel. La segmentación del historial de cambios por píxel que change_vector_analysis de dos fechas y generate_trend_raster de tendencia única no pueden hacer.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Rutas de rásteres anuales separadas por comas en orden temporal (p. ej. salidas NBR de spectral_index; >= 4)."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de salida: el año de la mayor perturbación en cada píxel. Si se omite, se almacena en memoria."
              },
              "years": {
                "label": "Años",
                "description": "Años separados por comas que se corresponden con 'inputs' (predeterminado 0,1,2,...)."
              },
              "magnitude_output": {
                "label": "Salida de magnitud",
                "description": "Ráster opcional con la magnitud de la perturbación (cambio del índice)."
              },
              "duration_output": {
                "label": "Salida de duración",
                "description": "Ráster opcional con la duración de la perturbación (en años)."
              },
              "direction": {
                "label": "Dirección",
                "description": "Sentido de la perturbación en el índice: 'loss' (una caída; predeterminado) o 'gain' (un aumento)."
              },
              "max_segments": {
                "label": "Segmentos máximos",
                "description": "Número máximo de segmentos (predeterminado 6)."
              },
              "spike_threshold": {
                "label": "Umbral de picos",
                "description": "Intensidad de eliminación de picos 0..1 (fracción del rango de la serie; predeterminado 0.75; 1 la desactiva)."
              },
              "min_valid": {
                "label": "Mínimo válido",
                "description": "Número mínimo de observaciones válidas por píxel (predeterminado 4)."
              },
              "band": {
                "label": "Banda",
                "description": "Banda que se lee de cada entrada, con índice desde 1 (predeterminado 1)."
              }
            }
          },
          "las_height_metrics": {
            "name": "Métricas de altura LAS",
            "description": "Rasteriza métricas de altura del dosel por celda a partir de alturas lidar (como Métricas de altura LAS de ArcGIS): media, desviación estándar, asimetría, curtosis, MAD y percentiles de altura como una malla multibanda — la suite forestal de momentos/percentiles que height_above_ground y lidar_point_stats incluidos no emiten en una sola pasada.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Nube de puntos LAS/LAZ de entrada con alturas sobre el suelo (normalícela antes con height_above_ground)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster multibanda de salida. Si se omite, se almacena en memoria."
              },
              "metrics": {
                "label": "Métricas",
                "description": "Subconjunto separado por comas de mean,std,skewness,kurtosis,mad (predeterminado 'mean,std,skewness,kurtosis,mad')."
              },
              "height_percentiles": {
                "label": "Percentiles de altura",
                "description": "Percentiles separados por comas en [0,100], p. ej. '50,95,99' (predeterminado '50,95,99'; vacío para ninguno)."
              },
              "min_height": {
                "label": "Altura mínima",
                "description": "Excluir los puntos cuya altura esté por debajo de este valor (umbral de suelo/ruido). Predeterminado 0."
              },
              "min_points": {
                "label": "Puntos mínimos",
                "description": "Las celdas con menos puntos válidos que este número pasan a ser sin datos. Predeterminado 4."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida en unidades del CRS. Predeterminado 10."
              }
            }
          },
          "less_than_or_equal_to": {
            "name": "MenorOIgualQue",
            "description": "Comprueba si el primer ráster es menor o igual que el segundo celda a celda.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Primer ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Segundo ráster de entrada (cadena de ruta u objeto ráster tipado)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del archivo ráster de salida. Si se omite, la salida permanece en memoria y se devuelve como identificador de ráster memory://."
              }
            }
          },
          "line_density": {
            "name": "Densidad de líneas",
            "description": "Densidad de entidades lineales (longitud por unidad de área) en una vecindad circular alrededor de cada celda ráster — densidad de carreteras, cauces o fallas — recortando cada segmento de línea al círculo del radio de búsqueda (forma cerrada) y dividiendo la longitud ponderada sumada por pi*r^2. Como Densidad de línea de ArcGIS; la contraparte para líneas vectoriales de la que carecen heat_map (solo puntos) y edge_density (categórico) incluidos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de polilíneas de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de densidad de salida (el controlador se deduce de la extensión). Si se omite, se almacena en memoria."
              },
              "weight_field": {
                "label": "Campo de peso",
                "description": "Campo numérico que pondera cada línea (p. ej. carriles, tráfico, población). Predeterminado: todas las líneas con peso 1."
              },
              "search_radius": {
                "label": "Radio de búsqueda",
                "description": "Radio de la vecindad (en metros para un CRS geográfico; en unidades del CRS en los demás casos). Predeterminado: el lado menor de la extensión / 25."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida (en las mismas unidades que search_radius). Predeterminado: search_radius / 10."
              },
              "area_units": {
                "label": "Unidades de área",
                "description": "Unidad de área de los valores de densidad: 'square_map_units' (predeterminado), 'square_meters', 'square_kilometers', 'square_miles' o 'square_feet'."
              }
            }
          },
          "line_of_sight": {
            "name": "Línea de visión",
            "description": "Visibilidad punto a punto sobre un DEM: para cada par observador-objetivo emite la línea de visión dividida en segmentos visibles y obstruidos más un indicador de objetivo visible, como Línea de visión de ArcGIS.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster de elevación de entrada (CRS proyectado; distancias y alturas en sus unidades)."
              },
              "observers": {
                "label": "Observadores",
                "description": "Capa vectorial de puntos de observación."
              },
              "targets": {
                "label": "Objetivos",
                "description": "Capa vectorial de puntos de destino."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de líneas de salida (controlador según la extensión). Si se omite, se almacena en memoria."
              },
              "observer_offset": {
                "label": "Desplazamiento del observador",
                "description": "Altura del observador sobre el suelo, en unidades del DEM (predeterminado 1.75)."
              },
              "target_offset": {
                "label": "Desplazamiento del objetivo",
                "description": "Altura del objetivo sobre el suelo, en unidades del DEM (predeterminado 0)."
              },
              "pair_field": {
                "label": "Campo de par",
                "description": "Campo opcional presente en ambas capas; los observadores y los objetivos se emparejan donde coincide este campo (en lugar de todos con todos)."
              },
              "band": {
                "label": "Banda",
                "description": "Banda del DEM que se muestrea (predeterminado 1)."
              }
            }
          },
          "line_statistics": {
            "name": "Estadísticas de líneas",
            "description": "Rasteriza un estadístico de vecindad de un atributo de línea (media, mayoría, mediana, mínimo/máximo, rango, variedad o longitud total) recortando cada segmento al círculo del radio de búsqueda y ponderando los valores por longitud — como Estadísticas de línea de ArcGIS; el complemento de superficie de atributos de line_density del que carece la suite incluida.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de polilíneas de entrada."
              },
              "field": {
                "label": "Campo",
                "description": "Campo numérico que se resume. Obligatorio para todos los estadísticos excepto 'length'."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida (el controlador se deduce de la extensión). Si se omite, se almacena en memoria."
              },
              "statistic": {
                "label": "Estadístico",
                "description": "'mean' (predeterminado), 'majority', 'maximum', 'median', 'minimum', 'minority', 'range', 'variety' o 'length'."
              },
              "search_radius": {
                "label": "Radio de búsqueda",
                "description": "Radio de la vecindad en unidades del CRS. Predeterminado: el lado menor de la extensión / 25."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida en unidades del CRS. Predeterminado: search_radius / 10."
              }
            }
          },
          "local_bivariate_relationships": {
            "name": "Relaciones bivariadas locales",
            "description": "Para cada entidad, clasifica cómo se relacionan dos variables en su vecindad local (no significativa, lineal positiva/negativa, cóncava, convexa, indefinida) a partir de ajustes locales lineales y cuadráticos, un estadístico de dependencia por reducción de entropía y un valor p de prueba de permutación con semilla — como Relaciones bivariadas locales de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos de entrada que contiene los dos campos de variables."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida (una copia de la entrada con los campos de relación). Si se omite, se almacena en memoria."
              },
              "field1": {
                "label": "Campo 1",
                "description": "Nombre del campo de la primera variable (explicativa)."
              },
              "field2": {
                "label": "Campo 2",
                "description": "Nombre del campo de la segunda variable (dependiente)."
              },
              "neighbors": {
                "label": "Vecinos",
                "description": "Número k de vecinos más próximos que definen cada muestra local (predeterminado 12; debe ser >= 5)."
              },
              "permutations": {
                "label": "Permutaciones",
                "description": "Número de permutaciones para la prueba de significación (predeterminado 199; 0 lo desactiva)."
              },
              "significance": {
                "label": "Significancia",
                "description": "Umbral de pseudovalor p para considerar significativa una relación (predeterminado 0.05)."
              },
              "seed": {
                "label": "Semilla",
                "description": "Semilla para el generador de números aleatorios de las permutaciones (predeterminado 1), para obtener resultados reproducibles."
              }
            }
          },
          "local_outlier_analysis": {
            "name": "Análisis local de valores atípicos",
            "description": "Análisis de valores atípicos locales espacio-temporal (I de Moran local de Anselin sobre un cubo espacio-temporal H3): clasifica cada celda × intervalo de tiempo como clúster Alto-Alto/Bajo-Bajo o valor atípico Alto-Bajo/Bajo-Alto con un valor p de permutación con semilla, y luego resume por celda a lo largo del tiempo — como Análisis de valores atípicos locales de ArcGIS. La extensión espacio-temporal del local_morans_i_lisa incluido, solo espacial.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de puntos de entrada con eventos con marca de tiempo (long./lat.)."
              },
              "time_field": {
                "label": "Campo de tiempo",
                "description": "Campo que contiene la hora de cada punto: un número o una marca de tiempo ISO-8601."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de resumen de polígonos H3 de salida. Si se omite, se almacena en memoria."
              },
              "value_field": {
                "label": "Campo de valor",
                "description": "Campo numérico que se agrega por celda (predeterminado: recuento de puntos)."
              },
              "time_step": {
                "label": "Paso de tiempo",
                "description": "Amplitud de un paso temporal en las unidades de time_field (predeterminado 1)."
              },
              "resolution": {
                "label": "Resolución",
                "description": "Resolución H3 0..15 (predeterminado 7)."
              },
              "kring": {
                "label": "Kring",
                "description": "Radio de la vecindad espacial en anillos k (predeterminado 1)."
              },
              "time_window": {
                "label": "Ventana temporal",
                "description": "Semianchura de la vecindad temporal en pasos (predeterminado 1)."
              },
              "permutations": {
                "label": "Permutaciones",
                "description": "Permutaciones de la prueba de significación (predeterminado 99; 0 la desactiva)."
              },
              "seed": {
                "label": "Semilla",
                "description": "Semilla del generador de permutaciones (predeterminado 1)."
              }
            }
          },
          "local_polynomial_interpolation": {
            "name": "Interpolación polinómica local",
            "description": "Ajusta un polinomio de orden 1/2/3 dentro de una vecindad móvil ponderada por kernel en cada celda, produciendo una superficie de predicción, una superficie de error estándar de predicción o una superficie de número de condición. A diferencia del trend_surface global incluido, el polinomio se reajusta localmente. Como Interpolación polinómica local de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Entidades de punto de entrada que llevan el valor que se va a interpolar."
              },
              "z_field": {
                "label": "Campo Z",
                "description": "Campo numérico que contiene el valor que se va a interpolar."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida. Si se omite, se almacena en memoria."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida en unidades del mapa (predeterminado: la extensión de entrada / 200)."
              },
              "order": {
                "label": "Orden",
                "description": "Orden del polinomio: 1 (predeterminado), 2 o 3."
              },
              "kernel": {
                "label": "Kernel",
                "description": "'exponential' (predeterminado), 'gaussian', 'quartic', 'epanechnikov', 'fifth_order' o 'constant'."
              },
              "bandwidth": {
                "label": "Ancho de banda",
                "description": "Ancho de banda fijo del kernel en unidades del mapa. Si se omite, se usa un ancho de banda adaptativo: la distancia a la muestra número 'neighbors' más próxima."
              },
              "neighbors": {
                "label": "Vecinos",
                "description": "Número de muestras por ajuste local para el ancho de banda adaptativo (predeterminado: 3 veces el número de términos del polinomio)."
              },
              "weight_field": {
                "label": "Campo de peso",
                "description": "Campo opcional de peso de medición por observación."
              },
              "condition_number": {
                "label": "Número de condición",
                "description": "Negarse a predecir donde el número de condición del diseño local supere este umbral (predeterminado: sin límite)."
              },
              "output_type": {
                "label": "Tipo de salida",
                "description": "'prediction' (predeterminado), 'standard_error' o 'condition_number'."
              },
              "epsg": {
                "label": "EPSG",
                "description": "Código EPSG que se estampa en el ráster de salida (predeterminado: el CRS de la capa de entrada)."
              }
            }
          },
          "locate_lines_along_routes": {
            "name": "Localizar líneas a lo largo de rutas",
            "description": "Superpone entidades de líneas o polígonos sobre rutas con medidas para producir eventos lineales de medida inicial/final (RID, FMEAS, TMEAS), como Localizar entidades a lo largo de rutas de ArcGIS (eventos de líneas/polígonos).",
            "params": {
              "input_features": {
                "label": "Entidades de entrada",
                "description": "Capa vectorial de líneas o polígonos de entrada que se va a localizar a lo largo de las rutas."
              },
              "routes": {
                "label": "Rutas",
                "description": "Capa vectorial de rutas (líneas) que proporciona las medidas de referenciación lineal."
              },
              "route_id_field": {
                "label": "Campo de ID de ruta",
                "description": "Campo de la capa de rutas que contiene el identificador de cada ruta (RID). Si se omite, se usa el índice de entidad con base 0 de la ruta."
              },
              "tolerance": {
                "label": "Tolerancia",
                "description": "Radio de búsqueda en unidades del CRS. El vértice de una entidad situado dentro de esta distancia de una ruta se considera coincidente. Obligatorio (> 0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de eventos de línea de salida (el controlador se deduce de la extensión). Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "locate_regions": {
            "name": "Localizar regiones",
            "description": "Encuentra la(s) mejor(es) región(es) contigua(s) de un área objetivo a partir de un ráster de idoneidad (como Localizar regiones de ArcGIS): crecimiento de regiones «mejor primero» desde los picos de idoneidad con control de forma/compacidad y espaciado entre regiones — el paso de emplazamiento que convierte una superficie de fuzzy_overlay/weighted_overlay en regiones reales, cosa que clump y la umbralización no pueden hacer.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de idoneidad (un valor mayor = más idóneo)."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de salida con identificadores de región con base 1 (sin datos en el resto). Si se omite, se almacena en memoria."
              },
              "total_area": {
                "label": "Área total",
                "description": "Área objetivo total del conjunto de las regiones, en unidades de área del CRS (predeterminado: el 5 % del área válida)."
              },
              "num_regions": {
                "label": "Número de regiones",
                "description": "Número de regiones que se van a localizar (predeterminado 1). Cada una tiene como objetivo total_area / num_regions."
              },
              "shape": {
                "label": "Forma",
                "description": "Peso de la compacidad 0..1: 0 = solo idoneidad, 1 = favorece con fuerza las regiones redondeadas (predeterminado 0.3)."
              },
              "min_distance": {
                "label": "Distancia mínima",
                "description": "Distancia mínima entre regiones, en unidades del CRS (predeterminado 0)."
              },
              "band": {
                "label": "Banda",
                "description": "Banda (con índice desde 1) que se lee (predeterminado 1)."
              }
            }
          },
          "matched_filter_target_detection": {
            "name": "Detección de objetivos por filtro adaptado (CEM/ACE)",
            "description": "Puntúa cada píxel de una imagen multibanda contra un espectro objetivo conocido usando las estadísticas de la escena para suprimir el fondo — Minimización de energía restringida (CEM) o Estimador de coherencia adaptativo (ACE) — con una máscara opcional de umbral por percentil, como Detectar objetivo mediante espectros de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster multibanda de entrada (2 o más bandas)."
              },
              "target_spectrum": {
                "label": "Espectro objetivo",
                "description": "Espectro objetivo: un valor por banda, como matriz JSON o como lista separada por comas o espacios (su longitud debe ser igual al número de bandas)."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de puntuaciones de detección de salida (F32). Si se omite, se almacena en memoria."
              },
              "method": {
                "label": "Método",
                "description": "'cem' (minimización de energía restringida, predeterminado) o 'ace' (estimador de coherencia adaptativa, puntuaciones en 0..1)."
              },
              "threshold": {
                "label": "Umbral",
                "description": "Percentil opcional (0-100) de la distribución de puntuaciones por encima del cual se escribe una máscara binaria de detección."
              },
              "mask_output": {
                "label": "Salida de máscara",
                "description": "Ruta de salida de la máscara binaria de detección (requiere 'threshold'). Si se omite habiendo un umbral, se almacena en memoria."
              }
            }
          },
          "maximum_likelihood_classification": {
            "name": "Clasificación por máxima verosimilitud",
            "description": "Clasificador supervisado gaussiano de máxima verosimilitud: modela cada clase de entrenamiento como una normal multivariante (media + covarianza por clase), clasifica cada píxel de una imagen multibanda por la mayor log-verosimilitud gaussiana con pesos a priori opcionales iguales/por muestra, y puede emitir un ráster de probabilidad/confianza por píxel y rechazar las celdas menos confiables, como Clasificación de máxima verosimilitud de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster multibanda de entrada que se va a clasificar (1 o más bandas; cada banda es un rasgo)."
              },
              "training": {
                "label": "Entrenamiento",
                "description": "Ráster de entrenamiento con etiquetas enteras sobre la misma malla que 'input': cada entero positivo distinto es una clase; las celdas sin datos, no positivas o no finitas quedan sin etiquetar."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster clasificado de salida que lleva los identificadores de clase del entrenamiento. Si se omite, se almacena en memoria."
              },
              "prob_output": {
                "label": "Salida de probabilidad",
                "description": "Ráster F32 de salida opcional con la probabilidad posterior (confianza) de la clase ganadora en [0,1]."
              },
              "a_priori": {
                "label": "A priori",
                "description": "Pesos a priori de las clases: 'equal' (predeterminado, 1/K) o 'sample' (proporcional al número de píxeles de entrenamiento de cada clase)."
              },
              "reject_fraction": {
                "label": "Fracción de rechazo",
                "description": "Fracción en [0,1) de las celdas clasificadas con menor confianza que se dejan sin clasificar (sin datos). Predeterminado 0."
              }
            }
          },
          "median_center": {
            "name": "Centro mediano",
            "description": "La mediana geométrica (punto de Weiszfeld que minimiza la suma de distancias euclidianas, opcionalmente ponderadas, a todos los puntos de entrada) — un punto central robusto por grupo de caso, con atributos de mediana por campo opcionales (Centro mediano de ArcGIS).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida (el controlador se deduce de la extensión). Si se omite, se almacena en memoria."
              },
              "weight_field": {
                "label": "Campo de peso",
                "description": "Campo numérico opcional que pondera la atracción de cada punto sobre la mediana."
              },
              "case_field": {
                "label": "Campo de caso",
                "description": "Campo opcional por el que se agrupan los puntos; una mediana por cada valor distinto."
              },
              "attribute_fields": {
                "label": "Campos de atributos",
                "description": "Campos numéricos opcionales separados por comas; la mediana por grupo de cada uno se añade como '<field>_med'."
              }
            }
          },
          "merge_divided_roads": {
            "name": "Combinar carreteras divididas",
            "description": "Sustituye pares emparejados de carriles de carreteras divididas por líneas centrales únicas preservando la conectividad de las intersecciones, emparejando solo carriles que comparten un campo de fusión y discurren antiparalelos dentro de una distancia de separación, y emitiendo polígonos de desplazamiento para propagate_displacement. Como Fusionar carreteras divididas de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Entidades de ejes de carretera."
              },
              "merge_field": {
                "label": "Campo de fusión",
                "description": "Campo cuyos valores coincidentes hacen que dos líneas sean candidatas a formar un par de calzadas."
              },
              "merge_distance": {
                "label": "Distancia de fusión",
                "description": "Separación máxima entre calzadas emparejadas, en unidades del mapa."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del eje fusionado de salida. Si se omite, se almacena en memoria."
              },
              "output_displacement_features": {
                "label": "Salida de entidades de desplazamiento",
                "description": "Polígonos opcionales que muestran dónde se ha desplazado la geometría, para propagate_displacement."
              },
              "character_field": {
                "label": "Campo de carácter",
                "description": "Campo opcional; las entidades con un valor distinto de cero o no vacío se excluyen de la fusión."
              },
              "output_table": {
                "label": "Tabla de salida",
                "description": "Tabla de linaje opcional que relaciona las entidades de salida con sus entidades de origen."
              }
            }
          },
          "merge_lines_by_pseudo_node": {
            "name": "Combinar líneas por pseudonodo",
            "description": "Disuelve cadenas de segmentos de línea que se encuentran en pseudonodos de grado 2 en polilíneas únicas, preservando las intersecciones verdaderas y (opcionalmente) las rupturas de atributos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo vectorial de líneas de entrada, formato detectado automáticamente (o identificador en memoria)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según su extensión). Si se omite, se almacena en memoria."
              },
              "dissolve_fields": {
                "label": "Campos de disolución",
                "description": "Nombres de campos de atributo separados por comas; dos segmentos solo se fusionan cuando coinciden en todos ellos. Si se omite, los segmentos se fusionan en todos los nodos de grado 2 con independencia de los atributos."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Los extremos situados a menos de esta distancia (unidades del CRS) se consideran el mismo nodo. Predeterminado 1e-6."
              }
            }
          },
          "merge_multidimensional_rasters": {
            "name": "Combinar rásteres multidimensionales",
            "description": "Une varios cubos ráster corregistrados en uno, ordenados por coordenada de dimensión, resolviendo las coordenadas duplicadas por celda (Fusionar rásteres multidimensionales de ArcGIS). aggregate_multidimensional_raster reduce un cubo y composite_bands apila rásteres monobanda en bandas, pero nada unía cubos a lo largo de su dimensión compartida.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Rutas de cubos separadas por comas o punto y coma (rásteres multibanda). Al menos dos."
              },
              "dimension_values": {
                "label": "Valores de dimensión",
                "description": "Coordenadas opcionales por rebanada que cubren todas las rebanadas de todas las entradas, en el orden de entrada. No es necesario que estén ordenadas ni que sean únicas — eso es lo que resuelve esta herramienta. Sin ellas, las entradas se concatenan en el orden indicado."
              },
              "dimension": {
                "label": "Dimensión",
                "description": "Nombre de la dimensión, usado solo en los informes (predeterminado 'slice')."
              },
              "resolve_overlap": {
                "label": "Resolver solapes",
                "description": "Regla para coordenadas duplicadas: 'first' (predeterminado), 'last', 'mean', 'min', 'max' o 'error'."
              },
              "tolerance": {
                "label": "Tolerancia",
                "description": "Tolerancia relativa para considerar iguales dos coordenadas (predeterminado 1e-9)."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de cubo de salida, una banda por rebanada fusionada, en orden de la dimensión. Si se omite, se almacena en memoria."
              }
            }
          },
          "mgwr": {
            "name": "Regresión ponderada geográficamente multiescala",
            "description": "GWR en la que cada término explicativo obtiene su propio ancho de banda mediante reajuste por AICc (MGWR): coeficientes por entidad, R2 local, residuos, número de condición, más el ancho de banda óptimo de cada término con una interpretación local/regional/global y diagnósticos globales de AICc / R2.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de entidades de entrada (puntos, u otras geometrías mediante su punto representativo)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según su extensión). Si se omite, se almacena en memoria."
              },
              "dependent_field": {
                "label": "Campo dependiente",
                "description": "Campo numérico dependiente (respuesta)."
              },
              "explanatory_fields": {
                "label": "Campos explicativos",
                "description": "Campo o campos numéricos explicativos separados por comas, cada uno ajustado con su propio ancho de banda."
              },
              "kernel": {
                "label": "Kernel",
                "description": "Kernel de decaimiento por distancia: 'gaussian' (predeterminado) o 'bisquare'."
              },
              "bandwidth_type": {
                "label": "Tipo de ancho de banda",
                "description": "'adaptive' (predeterminado; ancho de banda = los k vecinos más próximos) o 'fixed' (ancho de banda = una distancia). Se aplica a la búsqueda de ancho de banda propia de cada término."
              },
              "tolerance": {
                "label": "Tolerancia",
                "description": "Tolerancia de convergencia del retroajuste: se detiene cuando el cambio relativo de la SCR entre pasadas cae por debajo de este valor (predeterminado 0.001)."
              },
              "max_iterations": {
                "label": "Iteraciones máximas",
                "description": "Número máximo de pasadas de retroajuste sobre todos los términos (predeterminado 30)."
              }
            }
          },
          "minimum_bounding_volume": {
            "name": "Volumen mínimo envolvente",
            "description": "Calcula el volumen envolvente mínimo (envolvente convexa, esfera o caja) alrededor de entidades 3D, por entidad, por grupo o sobre toda la entrada, emitiendo el sólido como caras triangulares con valor Z con atributos de volumen y área de superficie. Como Volumen delimitador mínimo de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Entidades 3D de punto, multipunto o línea de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida de las caras del volumen. Si se omite, se almacena en memoria."
              },
              "z_value": {
                "label": "Valor Z",
                "description": "'geometry' (predeterminado) para tomar la Z de la geometría, o el nombre de un campo numérico que proporcione la Z."
              },
              "geometry_type": {
                "label": "Tipo de geometría",
                "description": "'convex_hull' (predeterminado), 'sphere' o 'envelope'. ('concave_hull' no está implementado en esta versión.)"
              },
              "group_option": {
                "label": "Opción de agrupación",
                "description": "'none' (un volumen por entidad, predeterminado), 'all' (un único volumen para toda la entrada) o 'list' (uno por cada valor de 'group_field')."
              },
              "group_field": {
                "label": "Campo de agrupación",
                "description": "Campo que define los grupos cuando 'group_option' es 'list'."
              },
              "mbv_fields": {
                "label": "Campos MBV",
                "description": "Añadir los campos MBV_VOLUME y MBV_AREA (predeterminado false)."
              }
            }
          },
          "multicriteria_overlay": {
            "name": "Superposición multicriterio",
            "description": "Combina una pila de rásteres de criterios en una superficie de idoneidad con MCDA basado en rangos: weighted_sum, weighted_geometric_mean, OWA (promedio ponderado ordenado) o TOPSIS (cercanía al punto ideal), con pesos por ráster y reescalado from_scale/to_scale, como Superposición multicriterio de ArcGIS.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Lista separada por comas de ≥2 rásteres de criterios corregistrados (un valor mayor = más idóneo; cada uno se reescala por mínimo-máximo a 0..1 antes de combinarlos)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida. Si se omite, el resultado se almacena en memoria."
              },
              "method": {
                "label": "Método",
                "description": "Método de combinación: 'weighted_sum' (predeterminado), 'weighted_geometric_mean', 'owa', 'topsis'."
              },
              "weights": {
                "label": "Pesos",
                "description": "Pesos de importancia por ráster separados por comas, uno por entrada (predeterminado: iguales). Se normalizan para que sumen 1."
              },
              "order_weights": {
                "label": "Pesos de orden",
                "description": "Solo para OWA: pesos de orden separados por comas, uno por entrada, aplicados a los criterios ordenados de mayor a menor en cada celda (predeterminado: iguales, lo que hace que OWA equivalga a una media ponderada). Se normalizan para que sumen 1."
              },
              "from_scale": {
                "label": "Escala de origen",
                "description": "Límite inferior de la escala de evaluación de salida (predeterminado 0)."
              },
              "to_scale": {
                "label": "Escala de destino",
                "description": "Límite superior de la escala de evaluación de salida (predeterminado 1)."
              }
            }
          },
          "multidimensional_anomaly": {
            "name": "Generar anomalía multidimensional",
            "description": "Cubo de anomalías temporales por rebanada a partir de una pila temporal ráster (como Generar anomalía multidimensional de ArcGIS): para cada píxel calcula una línea base temporal (media/desviación estándar o mediana a lo largo de la dimensión de rebanadas) y reescribe cada rebanada temporal como su desviación respecto a esa línea base — diferencia respecto a la media, porcentaje de la media, puntuación z o diferencia respecto a la mediana — emitiendo una pila de anomalías con una rebanada por rebanada de entrada.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Un ráster multibanda (cada banda es una rebanada temporal) o una lista separada por comas de rásteres corregistrados, en orden temporal."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster multibanda de anomalías de salida (una banda por rebanada de entrada). Si se omite, se almacena en memoria."
              },
              "method": {
                "label": "Método",
                "description": "Cálculo de la anomalía: 'difference_from_mean' (predeterminado), 'percent_of_mean', 'z_score' o 'difference_from_median'."
              },
              "reference_range": {
                "label": "Rango de referencia",
                "description": "Rango de rebanadas opcional inclusivo con base 1, 'start-end', usado para calcular la línea base por píxel (predeterminado: todas las rebanadas)."
              },
              "min_valid": {
                "label": "Mínimo válido",
                "description": "Número mínimo de observaciones con datos por píxel dentro del rango de referencia (predeterminado 1); por debajo de él, el píxel queda sin datos."
              }
            }
          },
          "multidimensional_principal_components": {
            "name": "Componentes principales multidimensionales",
            "description": "Descompone un cubo ráster en los pocos modos reales subyacentes a una serie temporal larga, emitiendo rásteres de componentes, cargas y autovalores, en forma de reducción de dimensión o de reducción espacial (Componentes principales multidimensionales de ArcGIS). El principal_component_analysis incluido descompone el espacio de bandas dentro de una escena, por lo que sus componentes mezclan bandas espectrales en lugar de tiempo; dimension_reduction trabaja sobre tablas de atributos vectoriales. Ambas reducciones provienen de una covarianza en el espacio de rebanadas, ya que el equivalente en el espacio de píxeles sería una matriz cuadrada de millones de filas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Un ráster multibanda (cada banda es una rebanada) o una lista separada por comas de rásteres corregistrados."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster multibanda de salida: puntuaciones de los componentes para 'dimension_reduction', cargas de los componentes para 'spatial_reduction'. Si se omite, se almacena en memoria."
              },
              "output_loadings": {
                "label": "Salida de cargas",
                "description": "Tabla de salida con las cargas por rebanada (o con las series de componentes por rebanada en 'spatial_reduction'). Se genera siempre; se almacena en memoria cuando no se indica ninguna ruta."
              },
              "output_eigenvalues": {
                "label": "Salida de autovalores",
                "description": "Tabla de salida con los autovalores y la varianza que explica cada uno. Se genera siempre; se almacena en memoria cuando no se indica ninguna ruta."
              },
              "mode": {
                "label": "Modo",
                "description": "'dimension_reduction' (predeterminado; los componentes son patrones espaciales) o 'spatial_reduction' (los componentes son series a lo largo de la dimensión)."
              },
              "dimension": {
                "label": "Dimensión",
                "description": "Nombre de la dimensión, usado solo en el informe (predeterminado 'slice')."
              },
              "dimension_values": {
                "label": "Valores de dimensión",
                "description": "Coordenada de cada rebanada separada por comas, estrictamente creciente. Por defecto el índice de rebanada con base 1."
              },
              "number_of_pc": {
                "label": "Número de componentes principales",
                "description": "Cuántos componentes se conservan (predeterminado: todas las rebanadas)."
              },
              "correlation": {
                "label": "Correlación",
                "description": "Descomponer la matriz de correlación en lugar de la de covarianza (predeterminado false). Úselo cuando las rebanadas estén en escalas diferentes."
              }
            }
          },
          "multidimensional_raster_correlation": {
            "name": "Correlación de rásteres multidimensionales",
            "description": "Correlaciona dos cubos ráster celda a celda a lo largo de su dimensión compartida, produciendo un mapa de coeficientes de Pearson, Spearman o Kendall y — en modo de correlación cruzada — el retardo en el que la asociación de cada celda alcanza su pico (Correlación de ráster multidimensional de ArcGIS). Nada en ninguno de los registros cartografía esto: image_correlation colapsa un par de imágenes a un escalar, time_series_cross_correlation de la ronda 17 es solo vectorial, attribute_correlation es una operación de tabla y bivariate_spatial_association compara dos rásteres monobanda sin eje temporal.",
            "params": {
              "input1": {
                "label": "Entrada 1",
                "description": "Primer cubo: un ráster multibanda (cada banda una rebanada) o una lista separada por comas de rásteres corregistrados."
              },
              "input2": {
                "label": "Entrada 2",
                "description": "Segundo cubo, corregistrado con el primero y con el mismo número de rebanadas."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de correlación de salida en [-1, 1]. Si se omite, se almacena en memoria."
              },
              "output_lag": {
                "label": "Salida de retardo",
                "description": "Ráster de salida con el mejor retardo en cada celda (modo de correlación cruzada); en los demás casos, el retardo fijo en todas partes. Se genera siempre; se almacena en memoria cuando no se indica ninguna ruta."
              },
              "output_count": {
                "label": "Salida de conteo",
                "description": "Ráster de salida con el número de muestras emparejadas que respalda cada coeficiente. Se genera siempre; se almacena en memoria cuando no se indica ninguna ruta."
              },
              "method": {
                "label": "Método",
                "description": "'pearson' (predeterminado), 'spearman' o 'kendall'."
              },
              "lag": {
                "label": "Retardo",
                "description": "Número fijo de rebanadas que se desplaza hacia delante el segundo cubo antes del emparejamiento (predeterminado 0). Se ignora en el modo de correlación cruzada."
              },
              "cross_correlation": {
                "label": "Correlación cruzada",
                "description": "Buscar en todos los retardos de -max_lag..=max_lag y conservar el coeficiente más fuerte (predeterminado false)."
              },
              "max_lag": {
                "label": "Retardo máximo",
                "description": "Semianchura de la búsqueda de retardos en rebanadas (predeterminado 3). Solo en el modo de correlación cruzada."
              },
              "use_absolute": {
                "label": "Usar absoluto",
                "description": "En el modo de correlación cruzada, ordena los retardos por correlación absoluta para que gane una asociación negativa fuerte (predeterminado true)."
              },
              "min_valid": {
                "label": "Mínimo válido",
                "description": "Número mínimo de muestras emparejadas antes de escribir un coeficiente (predeterminado 3)."
              }
            }
          },
          "multilook": {
            "name": "Multilook",
            "description": "Reduce el speckle SAR promediando incoherentemente vistas adyacentes en rango y acimut, produciendo imágenes de intensidad con píxeles cuadrados (Multilook de ArcGIS). Ningún registro incluye herramientas SAR; la familia lee_filter incluida opera sobre intensidad ya detectada, por lo que esto proporciona el paso previo que convierte los datos complejos de una sola vista en las imágenes detectadas que esos filtros esperan. La entrada compleja se lee como un par I/Q de dos bandas; la detección ocurre antes del promediado, y se informa del número equivalente de vistas para el filtrado de speckle posterior.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster SAR de entrada: un par I/Q de dos bandas para datos complejos (SLC), o una única banda de datos ya detectados (véase 'input_domain')."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida. Si se omite, el resultado se almacena en memoria."
              },
              "input_domain": {
                "label": "Dominio de entrada",
                "description": "Para entradas no complejas, qué contiene ya la banda 1: 'intensity' (predeterminado) o 'amplitude'. La amplitud se eleva al cuadrado para convertirla en intensidad antes de promediar, ya que el promediado incoherente solo es correcto en el dominio de la intensidad."
              },
              "complex": {
                "label": "Complejo",
                "description": "Tratar la entrada como un par I/Q complejo (predeterminado: true cuando el ráster tiene 2 o más bandas; false en caso contrario)."
              },
              "range_looks": {
                "label": "Vistas en rango",
                "description": "Número de vistas en rango (x). Predeterminado 1, o deducido cuando se establece auto_looks."
              },
              "azimuth_looks": {
                "label": "Vistas en acimut",
                "description": "Número de vistas en acimut (y). Predeterminado 1, o deducido cuando se establece auto_looks."
              },
              "auto_looks": {
                "label": "Vistas automáticas",
                "description": "Si es verdadero (predeterminado) y las vistas no se indican explícitamente, se deducen de la razón de espaciado de píxeles para que los píxeles de suelo de salida sean aproximadamente cuadrados."
              },
              "output_units": {
                "label": "Unidades de salida",
                "description": "amplitude, intensity (predeterminado) o db."
              },
              "statistic": {
                "label": "Estadístico",
                "description": "mean (predeterminado) o median; la mediana es más robusta donde dominan los dispersores fuertes en una ventana de vistas."
              }
            }
          },
          "multipatch_footprint": {
            "name": "Huella de multiparche",
            "description": "Proyecta entidades multiparche 3D sobre el plano XY y las disuelve en polígonos de huella 2D, uno por entidad o por campo de grupo (Huella de multiparche de ArcGIS). layer_footprint_vector devuelve un único rectángulo de extensión para toda una capa, no contornos por entidad, por lo que actualmente no hay forma de alimentar buffer_3d / voxel_isosurface / sólidos de edificios importados en la cadena de regularize_building_footprints.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Entidades multiparche 3D (MultiPolygons de malla de triángulos con Z)."
              },
              "output": {
                "label": "Salida",
                "description": "Huellas poligonales 2D de salida. Si se omite, se almacena en memoria."
              },
              "group_field": {
                "label": "Campo de agrupación",
                "description": "Campo opcional cuyos valores disuelven las huellas entre sí (un polígono de salida por cada valor distinto). Predeterminado: una salida por entidad de entrada."
              },
              "simplify_tolerance": {
                "label": "Tolerancia de simplificación",
                "description": "Tolerancia de Douglas-Peucker opcional (unidades del CRS) aplicada a la huella disuelta. Se omite por defecto para conservar el contorno bruto de cara a regularize_building_footprints."
              }
            }
          },
          "multipatch_to_mesh": {
            "name": "Multiparche a malla",
            "description": "Exporta geometría multiparche y de sólidos 3D a OBJ o glTF 2.0 / GLB para cualquier visor 3D o web (Multiparche a Collada de ArcGIS). La suite union_3d / difference_3d / enclose_multipatch / voxel_isosurface no tenía ninguna vía de exportación — no existía ningún formato de malla en ningún lugar del registro — por lo que los resultados 3D solo podían ser leídos de vuelta por este catálogo.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de multiparches / polígonos 3D."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del archivo .glb, .gltf u .obj de salida. La extensión determina el formato salvo que se indique 'format'."
              },
              "format": {
                "label": "Formato",
                "description": "'glb' (predeterminado para .glb), 'gltf' (JSON con un búfer base64 incrustado) u 'obj'. Por defecto se deduce de la extensión de salida."
              },
              "origin": {
                "label": "Origen",
                "description": "Traslación al origen local: 'centroid' (predeterminado), 'min_corner' o 'none'. Es necesaria por precisión — las posiciones de glTF son números de coma flotante de 32 bits."
              },
              "y_up": {
                "label": "Y hacia arriba",
                "description": "Cambiar al convenio Y arriba de glTF desde el convenio geoespacial Z arriba (predeterminado true para glTF/GLB, false para OBJ)."
              },
              "name_field": {
                "label": "Campo de nombre",
                "description": "Atributo que da nombre a la malla de cada entidad en la salida."
              }
            }
          },
          "multiple_ring_buffer": {
            "name": "Zona de influencia de anillos múltiples",
            "description": "Crea buffers de entidades a una lista de distancias en bandas concéntricas — discos anidados o anillos no solapados — opcionalmente disueltos por distancia, con la distancia de la banda almacenada como atributo.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada (puntos, líneas o polígonos), formato detectado automáticamente (o identificador en memoria)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según su extensión). Si se omite, se almacena en memoria."
              },
              "distances": {
                "label": "Distancias",
                "description": "Lista separada por comas de distancias de zona de influencia en unidades del CRS, p. ej. \"100,250,500\". Se ordenan de forma ascendente; se descartan los duplicados y los valores no positivos."
              },
              "ring_type": {
                "label": "Tipo de anillo",
                "description": "'rings' (predeterminado) para bandas anulares que no se solapan, o 'disks' para zonas de influencia acumulativas anidadas."
              },
              "dissolve": {
                "label": "Disolver",
                "description": "'none' (predeterminado) conserva una banda por entidad de origen; 'per_ring' une las bandas de todas las entidades a cada distancia en un solo polígono."
              },
              "distance_field": {
                "label": "Campo de distancia",
                "description": "Nombre del atributo de salida que contiene la distancia de cada banda. Predeterminado 'distance'."
              }
            }
          },
          "multitemporal_coherence": {
            "name": "Coherencia multitemporal",
            "description": "Calcula la coherencia interferométrica a través de una pila de adquisiciones SAR corregistradas y la reduce a media/mínimo/máximo/desviación estándar y pendiente de decorrelación temporal, emitiendo opcionalmente el cubo de coherencia por par (Generar coherencia multitemporal de ArcGIS). sar_coherence maneja exactamente dos escenas, por lo que la selección de dispersores persistentes y la datación de cambios de coherencia estaban fuera de alcance.",
            "params": {
              "inputs": {
                "label": "Entradas",
                "description": "Rásteres SLC complejos corregistrados separados por comas o punto y coma (dos bandas cada uno: I y luego Q). Al menos dos."
              },
              "dates": {
                "label": "Fechas",
                "description": "Tiempos de adquisición opcionales, uno por entrada, como números en unidades coherentes (p. ej. días). Los requiere el estadístico 'decorrelation_slope'."
              },
              "pairs": {
                "label": "Pares",
                "description": "'consecutive' (predeterminado, i con i+1), 'all' (todos los pares sin orden) o 'reference' (cada escena frente a reference_index)."
              },
              "reference_index": {
                "label": "Índice de referencia",
                "description": "Índice con base 0 de la escena de referencia para pairs='reference' (predeterminado 0)."
              },
              "window_size": {
                "label": "Tamaño de ventana",
                "description": "Ventana de estimación en celdas; un único valor o 'range,azimuth' (predeterminado 5). Los valores pares se redondean al alza al impar siguiente."
              },
              "bias_correction": {
                "label": "Corrección de sesgo",
                "description": "Aplicar la corrección del sesgo de coherencia para muestras pequeñas (predeterminado true)."
              },
              "statistics": {
                "label": "Estadísticas",
                "description": "Separados por comas: 'mean' (predeterminado), 'min', 'max', 'std', 'decorrelation_slope'. Una banda de salida por estadístico, en este orden."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de salida, una banda por cada estadístico solicitado. Si se omite, se almacena en memoria."
              },
              "output_pairs": {
                "label": "Salida de pares",
                "description": "Ráster opcional que recibe el cubo de coherencia por pares, una banda por par."
              }
            }
          },
          "multivariate_clustering": {
            "name": "Agrupamiento multivariante",
            "description": "Agrupa entidades vectoriales por la similitud de sus valores de atributos estandarizados (k-means o k-medoids con semilla), eligiendo automáticamente el número de clústeres mediante la pseudo-F de Calinski-Harabasz cuando no se indica, como Agrupamiento multivariante de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada, formato detectado automáticamente (o identificador en memoria)."
              },
              "fields": {
                "label": "Campos",
                "description": "Campos numéricos de análisis separados por comas (el espacio de atributos sobre el que se agrupa)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida (una copia de la entrada con cluster_id/silhouette). Si se omite, se almacena en memoria."
              },
              "num_clusters": {
                "label": "Número de clústeres",
                "description": "Número k de clústeres. Omítalo o pase 0 para evaluar automáticamente k = 2..15 mediante la pseudo-F de Calinski-Harabasz."
              },
              "method": {
                "label": "Método",
                "description": "Método de agrupamiento: 'kmeans' (predeterminado) o 'kmedoids' (PAM; adecuado para un número menor de entidades)."
              },
              "seed": {
                "label": "Semilla",
                "description": "Semilla aleatoria para la inicialización determinista de k-means++ / medoides (predeterminado 1)."
              }
            }
          },
          "near_3d": {
            "name": "Proximidad 3D",
            "description": "Encuentra la entidad más cercana en distancia 3D real, informando de la distancia, la ubicación más cercana, los ángulos y las diferencias por eje, como Proximidad 3D de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de entidades de entrada (vértices 3D; la ausencia de Z se trata como 0)."
              },
              "near_features": {
                "label": "Entidades cercanas",
                "description": "Lista separada por comas de capas en las que se busca. Omítala para realizar una autounión con la capa de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              },
              "search_radius": {
                "label": "Radio de búsqueda",
                "description": "Considerar solo las entidades próximas situadas dentro de esta distancia 3D (unidades del mapa). Sin límite cuando se omite."
              },
              "location": {
                "label": "Ubicación",
                "description": "Añadir las coordenadas del punto más próximo como near_x / near_y / near_z (predeterminado false)."
              },
              "angle": {
                "label": "Ángulo",
                "description": "Añadir el rumbo horizontal (near_bearing, grados desde el norte) y el ángulo vertical (near_vert_angle, grados desde la horizontal) hasta el punto más próximo (predeterminado false)."
              },
              "delta": {
                "label": "Delta",
                "description": "Añadir los desplazamientos por eje near_dx / near_dy / near_dz (predeterminado false)."
              }
            }
          },
          "neighborhood_summary_statistics": {
            "name": "Estadísticas resumen de vecindad",
            "description": "Para cada entidad, resume los campos numéricos elegidos sobre sus vecinos (k más cercanos, dentro de una distancia o contigüidad por arista compartida), añadiendo <campo>_nbr_mean/median/std/min/max/sum y un conteo de vecinos, como Estadísticas de resumen de vecindad de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada (puntos, líneas o polígonos)."
              },
              "fields": {
                "label": "Campos",
                "description": "Campos numéricos separados por comas que se resumen sobre los vecinos."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida (copia de la entrada + columnas de estadísticos de vecindad). Si se omite, se almacena en memoria."
              },
              "neighborhood": {
                "label": "Vecindad",
                "description": "'knn' (predeterminado), 'distance_band' o 'contiguity' (polígonos que comparten un borde)."
              },
              "neighbors": {
                "label": "Vecinos",
                "description": "k para knn (predeterminado 8)."
              },
              "distance": {
                "label": "Distancia",
                "description": "Distancia de la banda para distance_band (unidades del mapa)."
              },
              "weights": {
                "label": "Pesos",
                "description": "'uniform' (predeterminado) o 'inverse_distance' (pondera la media y la desviación estándar)."
              }
            }
          },
          "non_maximum_suppression": {
            "name": "Supresión de no máximos",
            "description": "Conserva la detección de mayor confianza en cada clúster de solape y descarta los polígonos con menor puntuación cuya intersección sobre unión supera un umbral (como Supresión de no máximos de ArcGIS) — el deduplicador basado en puntuación para salidas de detección de objetos/OBIA que count_overlapping_features (cuenta, conserva todo), resolve_building_conflicts (desplaza) y find_identical (solo exactos) no proporcionan.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Detecciones poligonales de entrada (pueden solaparse)."
              },
              "confidence_score_field": {
                "label": "Campo de puntuación de confianza",
                "description": "Campo numérico que contiene la confianza/puntuación de cada detección; gana el valor más alto."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de los polígonos de salida con las detecciones supervivientes. Si se omite, se almacena en memoria."
              },
              "max_overlap_ratio": {
                "label": "Relación máxima de solape",
                "description": "IoU por encima del cual se suprime una detección con menor puntuación (0-1, predeterminado 0.5)."
              },
              "class_value_field": {
                "label": "Campo de valor de clase",
                "description": "Campo opcional; solo se suprimen entre sí las detecciones de la misma clase."
              }
            }
          },
          "observer_points": {
            "name": "Puntos de observación",
            "description": "Identifica cuáles de hasta 32 observadores pueden ver cada celda, como una máscara de bits por observador, y escribe el ráster de altura sobre el nivel del suelo que indica cuánto tendría que elevarse un objetivo para hacerse visible (Puntos de observador / Cuenca visual 2 en modo OBSERVERS de ArcGIS). El viewshed incluido devuelve solo un conteo de estaciones visibles, del que no puede recuperarse ninguna de las dos respuestas: un conteo de 1 no dice qué torre cubre una parcela, y un conteo de 0 no distingue entre dos metros de falta y estar detrás de una montaña.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de elevación de entrada (DEM o DSM)."
              },
              "observers": {
                "label": "Observadores",
                "description": "Capa de puntos con las posiciones de los observadores, un máximo de 32."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de visibilidad de salida: una máscara de bits de observadores, o un recuento con analysis_type 'frequency'. Si se omite, se almacena en memoria."
              },
              "output_agl": {
                "label": "Salida AGL",
                "description": "Ráster de salida de altura sobre el nivel del suelo: la altura a la que hay que elevar un objetivo para que sea visible. Se genera siempre; se almacena en memoria cuando no se indica ninguna ruta."
              },
              "output_table": {
                "label": "Tabla de salida",
                "description": "Tabla de salida con una fila por observador y las celdas y el área que ve. Se genera siempre; se almacena en memoria cuando no se indica ninguna ruta."
              },
              "analysis_type": {
                "label": "Tipo de análisis",
                "description": "'observers' (predeterminado; una máscara de bits) o 'frequency' (un recuento, igual que la cuenca visual incluida)."
              },
              "observer_offset": {
                "label": "Desplazamiento del observador",
                "description": "Altura de cada observador sobre la superficie, en unidades z (predeterminado 2.0)."
              },
              "observer_offset_field": {
                "label": "Campo de desplazamiento del observador",
                "description": "Atributo que contiene una altura por observador y que prevalece sobre 'observer_offset'."
              },
              "target_offset": {
                "label": "Desplazamiento del objetivo",
                "description": "Altura del objetivo sobre la superficie, en unidades z (predeterminado 0.0)."
              },
              "max_distance": {
                "label": "Distancia máxima",
                "description": "Ignorar las celdas situadas a más de esta distancia de un observador, en unidades del mapa. Sin límite por defecto."
              },
              "curvature": {
                "label": "Curvatura",
                "description": "Aplicar la corrección por curvatura terrestre y refracción (predeterminado false, es decir, tierra plana)."
              },
              "refractivity_coefficient": {
                "label": "Coeficiente de refractividad",
                "description": "Coeficiente de refracción atmosférica usado con 'curvature' (predeterminado 0.13)."
              },
              "band": {
                "label": "Banda",
                "description": "Banda del ráster de elevación, con índice desde 1 (predeterminado 1)."
              }
            }
          },
          "optics_clustering": {
            "name": "Agrupamiento OPTICS",
            "description": "Agrupamiento basado en densidad multiescala mediante OPTICS (como la opción OPTICS de Agrupamiento basado en densidad de ArcGIS): construye una ordenación de alcanzabilidad y extrae clústeres de densidad variable con el método ξ-pendiente — el miembro multiescala del trío DBSCAN/HDBSCAN/OPTICS que los dbscan y hdbscan creados no cubren.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos de entrada (CRS proyectado; distancias en sus unidades)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida (una copia de la entrada con los campos de clúster). Si se omite, se almacena en memoria."
              },
              "min_features_cluster": {
                "label": "Entidades mínimas por clúster",
                "description": "Número mínimo de puntos para la estimación de densidad por distancia al núcleo y para el clúster más pequeño (>= 2). Predeterminado 5."
              },
              "search_distance": {
                "label": "Distancia de búsqueda",
                "description": "Distancia de alcanzabilidad máxima opcional (épsilon máximo). Predeterminado: sin límite (todas las escalas)."
              },
              "cluster_sensitivity": {
                "label": "Sensibilidad de clúster",
                "description": "0-100; un valor mayor detecta más clústeres y más compactos. Se corresponde con xi = 1 - sensitivity/100. Predeterminado 95 (xi = 0.05)."
              }
            }
          },
          "optimal_corridor_connections": {
            "name": "Conexiones óptimas de corredor",
            "description": "Calcula la red de polígonos de corredor de menor coste de ancho fijo que conecta de forma óptima todas las regiones de entrada a través de una superficie de coste, más las líneas centrales de los corredores. A diferencia de cost_connectivity (líneas de ancho cero) o corridor (una superficie de coste de un solo par), esto emite polígonos de corredor listos para usar para toda la red de regiones. Como Conexiones óptimas de corredor de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Entidades poligonales de región que se van a conectar."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de los polígonos de corredor de salida. Si se omite, se almacena en memoria."
              },
              "cost_raster": {
                "label": "Ráster de coste",
                "description": "Superficie de coste opcional. Sin ella, el coste es uniforme (euclídeo)."
              },
              "barriers": {
                "label": "Barreras",
                "description": "Entidades poligonales opcionales que se consideran infranqueables."
              },
              "corridor_width": {
                "label": "Ancho de corredor",
                "description": "Anchura del corredor en unidades del mapa (predeterminado: 10 celdas)."
              },
              "output_lines": {
                "label": "Salida de líneas",
                "description": "Ruta opcional para los ejes de los corredores."
              },
              "neighbor_option": {
                "label": "Opción de vecinos",
                "description": "'spanning_tree' (predeterminado) conserva solo los corredores necesarios para conectar todas las regiones; 'all_pairs' genera un corredor por cada par de regiones."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda del análisis cuando no se proporciona ningún ráster de coste (predeterminado: la extensión de las regiones / 200)."
              }
            }
          },
          "optimal_interpolation": {
            "name": "Interpolación óptima",
            "description": "Corrige un campo ráster de fondo con observaciones puntuales mediante el paso de análisis de interpolación óptima / asimilación de datos x_a = x_b + B Hᵀ (H B Hᵀ + R)⁻¹ (y − H x_b), usando una correlación espacial gaussiana de la longitud de correlación dada y varianzas de error por observación/de fondo (como Interpolación óptima de ArcGIS). A diferencia de IDW/kriging/EBK, que interpolan solo a partir de puntos, esto mezcla un campo previo en malla con observaciones y puede emitir un ráster de varianza del error de análisis.",
            "params": {
              "background": {
                "label": "Fondo",
                "description": "Campo ráster de fondo (previo) que se va a corregir."
              },
              "observations": {
                "label": "Observaciones",
                "description": "Capa de puntos de observación."
              },
              "field": {
                "label": "Campo",
                "description": "Campo numérico de la capa de observaciones que contiene el valor observado."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster corregido (de análisis) de salida. Si se omite, se almacena en memoria."
              },
              "correlation_length": {
                "label": "Longitud de correlación",
                "description": "Longitud de correlación espacial L en unidades del CRS (gaussiana). Predeterminado: el 5 % del lado mayor del fondo."
              },
              "background_error_variance": {
                "label": "Varianza del error de fondo",
                "description": "Varianza del error del fondo σ_b² (predeterminado 1.0). Cuanto mayor, más se confía en las observaciones."
              },
              "obs_error_variance": {
                "label": "Varianza del error de observación",
                "description": "Varianza del error de observación σ_o² (predeterminado 1.0), usada cuando no se indica un campo de error por punto. Cuanto mayor, más se confía en el fondo."
              },
              "error_field": {
                "label": "Campo de error",
                "description": "Campo opcional de la capa de observaciones que indica la varianza del error de cada punto (prevalece sobre obs_error_variance donde existe y es > 0)."
              },
              "band": {
                "label": "Banda",
                "description": "Banda del fondo que se va a corregir, con índice desde 1 (predeterminado 1)."
              },
              "max_obs": {
                "label": "Observaciones máximas",
                "description": "Número máximo de observaciones más próximas usadas en la resolución local de cada celda (predeterminado 50, rango 1..=200)."
              },
              "analysis_error": {
                "label": "Error de análisis",
                "description": "Ráster de salida opcional con la varianza del error de análisis σ_a² (≤ σ_b²)."
              }
            }
          },
          "optimal_path_as_line": {
            "name": "Ruta óptima como línea",
            "description": "Traza un ráster de retroenlace de coste desde cada destino de vuelta a su origen y emite las rutas de menor coste como polilíneas (Trayectoria óptima como línea / Trayectoria de coste como polilínea de ArcGIS). cost_pathway solo marca la ruta como celdas ráster y cost_connectivity solo cubre el caso de red de N sitios, por lo que la trayectoria ordinaria de origen a destino no tenía forma vectorial.",
            "params": {
              "destination": {
                "label": "Destino",
                "description": "Destinos desde los que se traza: un ráster (cualquier celda distinta de cero y con datos) o una capa vectorial de puntos/multipuntos."
              },
              "backlink": {
                "label": "Retroenlace",
                "description": "Ráster de dirección de retroenlace de cost_back_link (0 = origen, 1-8 = dirección hacia el origen, 1 = este en sentido antihorario)."
              },
              "accumulation": {
                "label": "Acumulación",
                "description": "Ráster de coste acumulado opcional (la salida out_distance de cost_back_link). Proporciona el coste total de cada ruta y lo requieren los valores 'each_zone' y 'best_single' de path_type."
              },
              "path_type": {
                "label": "Tipo de trayectoria",
                "description": "Uno de estos: 'each_cell' (predeterminado, una ruta por celda de destino), 'each_zone' (una ruta por zona de destino, desde su celda más barata) o 'best_single' (la única ruta más barata)."
              },
              "zone_field": {
                "label": "Campo de zona",
                "description": "Atributo que contiene el identificador de zona para un destino vectorial con path_type 'each_zone'. Los destinos ráster usan el valor de la celda como zona."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de polilíneas de salida. Si se omite, se almacena en memoria."
              }
            }
          },
          "optimized_hot_spot_analysis": {
            "name": "Análisis optimizado de puntos calientes",
            "description": "Agrega automáticamente incidentes, selecciona automáticamente la banda de distancia de análisis, ejecuta Gi* de Getis-Ord e informa de una clase de punto caliente/frío corregida por FDR (como Análisis de puntos calientes optimizado de ArcGIS) — el envoltorio de flujo de trabajo del que carece el getis_ord_gi_star básico incluido.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de entidades de entrada (puntos de incidentes, o entidades con un campo de análisis)."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de puntos de salida con los resultados de Gi*. Si se omite, se almacena en memoria."
              },
              "analysis_field": {
                "label": "Campo de análisis",
                "description": "Campo numérico que se analiza (ponderado, sin agregación). Omítalo para contar incidentes."
              },
              "aggregation": {
                "label": "Agregación",
                "description": "Agregación de incidentes cuando no hay analysis_field: 'fishnet' (recuento por malla; predeterminado) o 'snap' (fusiona los coincidentes)."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda o de ajuste de la agregación en unidades del CRS. Predeterminado: el lado mayor de la extensión / 30."
              },
              "distance_band": {
                "label": "Banda de distancia",
                "description": "Banda de distancia del análisis en unidades del CRS. Predeterminado: se selecciona automáticamente según la intensidad máxima de agrupamiento."
              }
            }
          },
          "optimized_outlier_analysis": {
            "name": "Análisis optimizado de valores atípicos",
            "description": "Agrega automáticamente incidentes, selecciona automáticamente la banda de distancia de análisis, ejecuta la I de Moran local de Anselin e informa de tipos de clúster/valor atípico corregidos por FDR (HH/LL/HL/LH) — como Análisis de valores atípicos optimizado de ArcGIS; el envoltorio de Moran local no temporal que el local_morans_i_lisa básico incluido y el local_outlier_analysis espacio-temporal no proporcionan.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de entidades de entrada (puntos de incidentes, o entidades con un campo de análisis)."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de puntos de salida con los resultados de la I de Moran local. Si se omite, se almacena en memoria."
              },
              "analysis_field": {
                "label": "Campo de análisis",
                "description": "Campo numérico que se analiza (ponderado, sin agregación). Omítalo para contar incidentes."
              },
              "aggregation": {
                "label": "Agregación",
                "description": "Agregación de incidentes cuando no hay analysis_field: 'fishnet' (recuento por malla; predeterminado) o 'snap' (fusiona los coincidentes)."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda o de ajuste de la agregación en unidades del CRS. Predeterminado: el lado mayor de la extensión / 30."
              },
              "distance_band": {
                "label": "Banda de distancia",
                "description": "Banda de distancia del análisis en unidades del CRS. Predeterminado: se selecciona automáticamente según la intensidad máxima de agrupamiento."
              },
              "fdr_alpha": {
                "label": "Alfa de FDR",
                "description": "Nivel de la tasa de falsos descubrimientos para la significación de COType (predeterminado 0.05)."
              }
            }
          },
          "ordinary_cokriging": {
            "name": "Interpolación por cokriging ordinario",
            "description": "Realiza interpolación espacial multivariante usando variables auxiliares para mejorar las predicciones de la variable primaria. Ideal cuando los datos primarios son escasos pero los datos secundarios correlacionados son abundantes.",
            "params": {
              "primary_points": {
                "label": "Puntos primarios",
                "description": "Capa vectorial con los puntos de entrenamiento de la variable principal"
              },
              "primary_field": {
                "label": "Campo primario",
                "description": "Campo que contiene los valores de la variable principal"
              },
              "auxiliary_inputs": {
                "label": "Entradas auxiliares",
                "description": "Lista separada por comas de rutas de archivos de variables auxiliares"
              },
              "auxiliary_fields": {
                "label": "Campos auxiliares",
                "description": "Nombres de campo separados por comas para las variables auxiliares (vacío para rásteres)"
              },
              "template_raster": {
                "label": "Ráster plantilla",
                "description": "Plantilla ráster que define la malla y el CRS de salida"
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida del kriging"
              },
              "output_variance": {
                "label": "Salida de varianza",
                "description": "Ruta de salida opcional del ráster de varianza del kriging"
              },
              "neighborhood_size": {
                "label": "Tamaño de vecindad",
                "description": "Número de vecinos más próximos para el cokriging local (predeterminado: todos)"
              }
            }
          },
          "pairwise_comparison_weights": {
            "name": "Pesos por comparación por pares",
            "description": "Deriva pesos de criterios a partir de una matriz de comparación por pares AHP (escala 1-9 de Saaty) como el autovector principal normalizado, con una comprobación de consistencia (lambda_max, índice de consistencia, razón de consistencia) — como Asignar pesos por comparación por pares de ArcGIS.",
            "params": {
              "matrix": {
                "label": "Matriz",
                "description": "La matriz de comparación recíproca n x n como matriz JSON bidimensional, p. ej. [[1,3,5],[0.333,1,2],[0.2,0.5,1]]. Proporcione esta o `input`."
              },
              "input": {
                "label": "Entrada",
                "description": "Archivo CSV que contiene la matriz de comparación (filas numéricas simples, o etiquetada con una fila de encabezado y una primera columna de nombres). Proporcione este o `matrix`."
              },
              "criteria": {
                "label": "Criterios",
                "description": "Nombres de criterio separados por comas (deben coincidir con el orden de la matriz). Prevalecen sobre las etiquetas del CSV; por defecto C1..Cn."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de la tabla de salida — un CSV (extensión .csv) o una tabla vectorial sin geometría (criterio, peso, rango). Si se omite, se almacena en memoria."
              }
            }
          },
          "path_distance": {
            "name": "Distancia de trayecto",
            "description": "Distancia acumulada de menor coste donde cada paso paga la distancia de superficie 3D real (a partir de un DEM) multiplicada por un factor vertical dependiente de la pendiente (senderismo de Tobler, lineal, binario) y por la fricción, como Distancia de trayectoria de ArcGIS.",
            "params": {
              "source": {
                "label": "Origen",
                "description": "Ráster de orígenes; las celdas con valores positivos y con datos son orígenes (coste acumulado 0)."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de coste acumulado de salida. Si se omite, se almacena en memoria."
              },
              "cost": {
                "label": "Coste",
                "description": "Ráster de fricción/coste de paso opcional (predeterminado: uniforme 1)."
              },
              "surface": {
                "label": "Superficie",
                "description": "Ráster de elevación (DEM) opcional; habilita la distancia 3D sobre la superficie y los factores verticales basados en la pendiente."
              },
              "vertical_factor": {
                "label": "Factor vertical",
                "description": "'tobler' (predeterminado), 'linear', 'sym_linear', 'inverse_linear' o 'binary'."
              },
              "slope_factor": {
                "label": "Factor de pendiente",
                "description": "Coeficiente de penalización por pendiente para los factores lineales (predeterminado 1)."
              },
              "zero_factor": {
                "label": "Factor cero",
                "description": "Valor mínimo del factor vertical (cuesta abajo) para linear/inverse_linear (predeterminado 0.1)."
              },
              "max_slope": {
                "label": "Pendiente máxima",
                "description": "Para 'binary': las pendientes más pronunciadas que este número de grados son infranqueables (predeterminado 30)."
              },
              "band": {
                "label": "Banda",
                "description": "Banda de todos los rásteres, con índice desde 1 (predeterminado 1)."
              }
            }
          },
          "percentile_contours": {
            "name": "Curvas de nivel por percentiles",
            "description": "Emite polígonos anidados que encierran las celdas más extremas de una superficie, umbralizadas por percentil de valor o por percentil de masa acumulada (volumen).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de superficie continua de entrada (densidad, idoneidad, elevación)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional del vectorial de polígonos (el controlador se deduce de su extensión). Si se omite, se almacena en memoria."
              },
              "percentiles": {
                "label": "Percentiles",
                "description": "Percentiles separados por comas en [0,100] (p. ej. \"50,90,95\"). Predeterminado \"90\"."
              },
              "mode": {
                "label": "Modo",
                "description": "'value' (predeterminado): las celdas cuyo valor esté en el percentil p o por encima. 'volume': las celdas más altas que acumulan el (100-p)% superior del valor acumulado."
              },
              "ignore_negative": {
                "label": "Ignorar negativos",
                "description": "Excluir los valores de celda negativos de la ordenación y de la salida. Predeterminado false."
              },
              "smooth": {
                "label": "Suavizar",
                "description": "Simplificar los polígonos de bordes de celda con Douglas-Peucker (tolerancia ~1,5 celdas) para suavizar el aspecto escalonado. Predeterminado false."
              },
              "band": {
                "label": "Banda",
                "description": "Banda (con índice desde 1) que se lee (predeterminado 1)."
              }
            }
          },
          "pivot_table": {
            "name": "Tabla dinámica",
            "description": "Remodela una tabla de atributos en formato largo a ancho: una fila de salida por cada combinación única de los campos de identidad, y una columna por cada valor distinto del campo pivote, rellenada desde el campo de valor. Como Tabla dinámica de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial o tabla de atributos de entrada en formato largo."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de la tabla de salida (el controlador se deduce de la extensión). Si se omite, se almacena en memoria."
              },
              "fields": {
                "label": "Campos",
                "description": "Nombre o nombres de campo separados por comas o punto y coma que identifican una fila de salida; se transfieren sin cambios."
              },
              "pivot_field": {
                "label": "Campo pivote",
                "description": "Campo cuyos valores distintos se convierten en nuevas columnas."
              },
              "value_field": {
                "label": "Campo de valor",
                "description": "Campo que proporciona los valores de las celdas."
              },
              "aggregate": {
                "label": "Agregar",
                "description": "Se aplica cuando una celda fila/columna tiene varios registros de origen: 'first' (predeterminado), 'sum', 'mean', 'min', 'max', 'count'."
              }
            }
          },
          "pmtiles_extract": {
            "name": "Extraer PMTiles",
            "description": "Extrae un subconjunto por cuadro delimitador/zoom de un archivo PMTiles en un nuevo archivo (p. ej., un mapa base sin conexión a partir de una compilación planetaria de Protomaps).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo .pmtiles de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del archivo .pmtiles de salida."
              },
              "bbox": {
                "label": "Cuadro delimitador",
                "description": "Rectángulo delimitador WGS84 como 'min_lon,min_lat,max_lon,max_lat'."
              },
              "min_zoom": {
                "label": "Zoom mínimo",
                "description": "Nivel de zoom más bajo que se incluye (predeterminado 0, para que el mapa siga siendo utilizable al alejarse)."
              },
              "max_zoom": {
                "label": "Zoom máximo",
                "description": "Nivel de zoom más alto que se incluye (predeterminado: el zoom máximo del archivo de origen)."
              },
              "max_tiles": {
                "label": "Teselas máximas",
                "description": "Abortar si la selección abarca más teselas que este valor (predeterminado 2000000)."
              },
              "url": {
                "label": "URL",
                "description": "URL PMTiles HTTP(S). Proporcione url o input; las fuentes HTTP usan solicitudes de rango de bytes (el servidor debe permitir lecturas Range entre orígenes)."
              },
              "bbox_crs": {
                "label": "CRS del cuadro delimitador",
                "description": "Código EPSG de las coordenadas del rectángulo delimitador. Predeterminado 4326 (longitud/latitud WGS84); los demás CRS se reproyectan a 4326."
              }
            }
          },
          "point_statistics": {
            "name": "Estadísticas de puntos",
            "description": "Rasteriza un estadístico de ventana móvil de un atributo de entidades puntuales: para cada celda de salida, una vecindad (círculo o rectángulo) recoge los valores del campo numérico elegido de los puntos que contiene y los reduce a media/mayoría/máximo/mediana/mínimo/minoría/rango/desviación estándar/suma/variedad. Como Estadísticas de punto de ArcGIS; complementa a line_density/heat_map (solo densidad) y a neighborhood_summary_statistics (solo vectorial).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos de entrada (Point / MultiPoint)."
              },
              "field": {
                "label": "Campo",
                "description": "Campo de atributo numérico que se resume."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida (el controlador se deduce de la extensión). Si se omite, se almacena en memoria."
              },
              "statistic": {
                "label": "Estadístico",
                "description": "Estadístico por vecindad: mean (predeterminado), majority, maximum, median, minimum, minority, range, std, sum o variety."
              },
              "neighborhood": {
                "label": "Vecindad",
                "description": "Forma de la vecindad: 'circle' (predeterminado, usa 'radius') o 'rectangle' (un cuadrado de lado 2*radius)."
              },
              "radius": {
                "label": "Radio",
                "description": "Radio de la vecindad / semilado del rectángulo (en metros para un CRS geográfico; en unidades del CRS en los demás casos). Predeterminado: el lado menor de la extensión / 20."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida (en las mismas unidades que radius). Predeterminado: radius / 5."
              },
              "epsg": {
                "label": "EPSG",
                "description": "Sustituye el código EPSG del CRS de entrada (p. ej. cuando la capa no está etiquetada). El valor 4326 activa la proyección en metros."
              }
            }
          },
          "points_to_line": {
            "name": "Puntos a línea",
            "description": "Construye entidades de polilínea a partir de puntos: una línea por cada valor distinto de line_field, con los vértices ordenados por sort_field y un indicador opcional de cierre de línea.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo vectorial de puntos de entrada (o identificador en memoria)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional del vectorial de líneas (el controlador se deduce de su extensión). Si se omite, se almacena en memoria."
              },
              "line_field": {
                "label": "Campo de línea",
                "description": "Atributo cuyos valores distintos reparten los puntos en líneas separadas (una polilínea por valor). Si se omite, todos los puntos forman una sola línea."
              },
              "sort_field": {
                "label": "Campo de ordenación",
                "description": "Atributo que fija el orden de los vértices dentro de cada línea. Los valores numéricos se ordenan numéricamente y los de texto, lexicográficamente. Si se omite, se usa el orden de las entidades de entrada."
              },
              "close_line": {
                "label": "Cerrar línea",
                "description": "Añadir el primer vértice al final de cada línea, cerrándola en un anillo. Predeterminado false."
              }
            }
          },
          "points_to_path": {
            "name": "Puntos a trayectoria",
            "description": "Conecta puntos en entidades de polilínea, ordenados por un campo y (opcionalmente) agrupados en una trayectoria por valor, con ordenación natural y cierre de trayectoria opcionales.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo vectorial de puntos de entrada (o identificador en memoria)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional del vectorial de líneas (el controlador se deduce de su extensión). Si se omite, se almacena en memoria."
              },
              "order_field": {
                "label": "Campo de orden",
                "description": "Atributo que fija el orden de conexión de los puntos dentro de cada trayecto. Los valores numéricos se ordenan numéricamente y los de texto, lexicográficamente. Si se omite, se usa el orden de las entidades de entrada."
              },
              "group_field": {
                "label": "Campo de agrupación",
                "description": "Atributo que reparte los puntos en trayectos separados (una línea por cada valor distinto). Si se omite, todos los puntos forman un solo trayecto."
              },
              "natural_sort": {
                "label": "Ordenación natural",
                "description": "Ordenar los valores de orden de texto de forma natural, para que 'a9' vaya antes que 'a10'. Predeterminado false."
              },
              "close_path": {
                "label": "Cerrar trayectoria",
                "description": "Añadir el primer vértice al final de cada trayecto, cerrándolo en un anillo. Predeterminado false."
              }
            }
          },
          "polygon_neighbors": {
            "name": "Vecinos de polígono",
            "description": "Construye una tabla de adyacencia (contigüidad) de polígonos: pares vecinos con la longitud de su frontera compartida y un conteo de contactos puntuales, como Vecinos de polígono de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de polígonos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de la tabla de salida — un CSV (extensión .csv) o una tabla vectorial sin geometría. Si se omite, se almacena en memoria."
              },
              "id_field": {
                "label": "Campo de ID",
                "description": "Campo que identifica cada polígono en la tabla. Predeterminado: el índice de la entidad."
              },
              "both_sides": {
                "label": "Ambos lados",
                "description": "Generar cada par de vecinos dos veces (src→nbr y nbr→src). Predeterminado false (una vez por par)."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Cuantiza los vértices sobre una malla de este tamaño (unidades del CRS) antes de emparejar los límites. Predeterminado 0 (coordenadas exactas)."
              }
            }
          },
          "polygon_volume": {
            "name": "Volumen de polígono",
            "description": "Volumen por polígono y área de superficie 3D de un ráster de superficie por encima/por debajo de la altura del plano de referencia de cada entidad, como Volumen de polígono de ArcGIS — la contraparte zonal de surface_volume.",
            "params": {
              "surface": {
                "label": "Superficie",
                "description": "Ráster de superficie de elevación de entrada."
              },
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de polígonos (zonas)."
              },
              "height_field": {
                "label": "Campo de altura",
                "description": "Campo de atributo que indica la elevación del plano de referencia de cada polígono."
              },
              "direction": {
                "label": "Dirección",
                "description": "Lado de cada plano que se integra: 'above' (predeterminado), 'below' o 'both'."
              },
              "band": {
                "label": "Banda",
                "description": "Banda que se lee de la superficie, con índice desde 1 (predeterminado 1)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de polígonos de salida (el controlador se deduce de la extensión). Si se omite, se almacena en memoria."
              }
            }
          },
          "porous_puff": {
            "name": "Penacho poroso",
            "description": "Advección-dispersión analítica de un vertido instantáneo de contaminante a través de aguas subterráneas (como Pulso poroso de ArcGIS): avanza el centro del pulso desde un punto de liberación a lo largo de un campo de velocidad de Darcy (magnitud+dirección, tal como produce darcy_flow), y luego evalúa la concentración gaussiana 2D del pulso en forma cerrada en coordenadas alineadas con la trayectoria, escalada por porosidad, espesor, retardo y decaimiento de primer orden.",
            "params": {
              "magnitude": {
                "label": "Magnitud",
                "description": "Ráster de magnitud de la velocidad de Darcy, tal como lo genera la salida 'output' de darcy_flow. El tamaño de celda y la extensión se toman de este ráster."
              },
              "direction": {
                "label": "Dirección",
                "description": "Ráster de dirección de flujo de Darcy (acimut en grados desde el norte, en sentido horario, en el sentido descendente del gradiente), tal como lo genera la salida 'direction' de darcy_flow. Debe estar corregistrado con 'magnitude'."
              },
              "x": {
                "label": "X",
                "description": "Coordenada X del punto de vertido (unidades del mapa, el mismo CRS que los rásteres de velocidad)."
              },
              "y": {
                "label": "Y",
                "description": "Coordenada Y del punto de vertido (unidades del mapa)."
              },
              "mass": {
                "label": "Masa",
                "description": "Masa de contaminante liberada (debe ser positiva)."
              },
              "porosity": {
                "label": "Porosidad",
                "description": "Porosidad eficaz: una constante numérica en (0, 1] o la ruta de un ráster corregistrado con 'magnitude'."
              },
              "thickness": {
                "label": "Espesor",
                "description": "Espesor del acuífero: una constante numérica positiva o la ruta de un ráster corregistrado con 'magnitude'."
              },
              "dispersivity_long": {
                "label": "Dispersividad longitudinal",
                "description": "Dispersividad longitudinal (unidades de longitud; debe ser positiva)."
              },
              "dispersivity_trans": {
                "label": "Dispersividad transversal",
                "description": "Dispersividad transversal (unidades de longitud; debe ser positiva)."
              },
              "retardation": {
                "label": "Retardo",
                "description": "Factor de retardo (predeterminado 1, debe ser >= 1)."
              },
              "decay": {
                "label": "Decaimiento",
                "description": "Constante de desintegración de primer orden (predeterminado 0, debe ser >= 0; en las mismas unidades de tiempo que 'time')."
              },
              "time": {
                "label": "Hora",
                "description": "Lista separada por comas de uno o varios tiempos transcurridos positivos. El último tiempo se escribe en 'output'; todos los tiempos (incluido el último) se recogen en la salida 'time_series'."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de concentración de salida para el último tiempo de 'time'. Si se omite, se almacena en memoria."
              },
              "band": {
                "label": "Banda",
                "description": "Banda que se lee de los rásteres de magnitud/dirección, con índice desde 1 (predeterminado 1)."
              },
              "step": {
                "label": "Paso",
                "description": "Longitud del paso de avance del centro de la nube en unidades del CRS (predeterminado: el tamaño de celda del ráster de magnitud)."
              },
              "max_steps": {
                "label": "Pasos máximos",
                "description": "Número máximo de pasos de avance por cada tiempo solicitado (predeterminado 1000)."
              }
            }
          },
          "predict_using_trend_raster": {
            "name": "Predecir con ráster de tendencia",
            "description": "Evalúa los rásteres de pendiente/intersección ajustados por generate_trend_raster en uno o más instantes, produciendo superficies predichas, como Predecir mediante ráster de tendencia de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de pendiente (tendencia) escrito por generate_trend_raster."
              },
              "intercept": {
                "label": "Intersección",
                "description": "Ráster de ordenada en el origen escrito por generate_trend_raster (su 'intercept_output'), corregistrado con el ráster de pendiente."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida para el primer tiempo predicho. Si se omite, los resultados se almacenan en memoria."
              },
              "times": {
                "label": "Tiempos",
                "description": "Tiempos separados por comas en los que se predice, en la misma escala usada para el ajuste (p. ej. '12,18,24'). Prevalecen sobre start/end/interval."
              },
              "start": {
                "label": "Inicio",
                "description": "Primer tiempo de un rango generado (se usa cuando falta 'times')."
              },
              "end": {
                "label": "Fin",
                "description": "Último tiempo de un rango generado (inclusive; se usa cuando falta 'times')."
              },
              "interval": {
                "label": "Intervalo",
                "description": "Paso entre los tiempos generados (predeterminado 1; se usa cuando falta 'times')."
              },
              "band": {
                "label": "Banda",
                "description": "Banda que se lee de cada ráster de coeficientes, con índice desde 1 (predeterminado 1)."
              }
            }
          },
          "presence_only_prediction": {
            "name": "Predicción solo con presencias",
            "description": "Modelado de idoneidad de hábitat/especies al estilo MaxEnt: ajusta un modelo logístico con regularización L1 que contrasta puntos de presencia con una muestra de fondo con semilla de rásteres explicativos (expansión de base lineal/cuadrática/bisagra), y luego predice una superficie de probabilidad de presencia más un informe de importancia de variables — como Predicción solo con presencias (MaxEnt) de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos de presencia de entrada (ocurrencias observadas)."
              },
              "explanatory": {
                "label": "Explicativa",
                "description": "Lista separada por comas de rutas de rásteres explicativos (la pila de covariables). Se muestrean en las ubicaciones de presencia y de fondo; el primer ráster define la malla de salida."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de probabilidad de presencia de salida. Si se omite, se almacena en memoria."
              },
              "report": {
                "label": "Informe",
                "description": "Ruta de salida opcional de una tabla CSV de coeficientes / importancia de variables."
              },
              "features": {
                "label": "Entidades",
                "description": "Clases de rasgos de expansión de la base separadas por comas: cualquiera de 'linear', 'quadratic', 'hinge'. Predeterminado 'linear,quadratic'."
              },
              "background": {
                "label": "Fondo",
                "description": "Número de muestras de fondo extraídas de la pila de rásteres. Predeterminado 1000 (limitado al número de celdas válidas)."
              },
              "regularization": {
                "label": "Regularización",
                "description": "Intensidad de la regularización L1 (lasso) sobre los rasgos estandarizados. Cuanto mayor, más simple el modelo. Predeterminado 0.01."
              },
              "hinge_knots": {
                "label": "Nodos de bisagra",
                "description": "Número de nodos interiores por covariable para los rasgos hinge (solo se usa cuando 'hinge' está activado). Predeterminado 10."
              },
              "seed": {
                "label": "Semilla",
                "description": "Semilla aleatoria para la muestra de fondo determinista (predeterminado 1)."
              }
            }
          },
          "propagate_displacement": {
            "name": "Propagar desplazamiento",
            "description": "Propaga el desplazamiento introducido por resolve_road_conflicts (o cualquier capa de enlaces de desplazamiento de dos puntos) a entidades cercanas interpolando los enlaces dispersos en un campo IDW suave: las entidades rígidas (edificios, parcelas) reciben una única traslación promediada, las líneas flexibles reciben una curvatura por vértice suavizada por longitud de arco, como Propagar desplazamiento de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada que se va a ajustar (cualquier tipo de geometría)."
              },
              "links": {
                "label": "Enlaces",
                "description": "Enlaces de desplazamiento: una capa de líneas de 2 vértices por enlace, primer vértice = ubicación original, último vértice = ubicación desplazada (el esquema que usan tanto la salida 'links' de resolve_road_conflicts como la entrada 'links' de rubbersheet_features)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según la extensión). Si se omite, se almacena en memoria."
              },
              "adjustment_style": {
                "label": "Estilo de ajuste",
                "description": "'auto' (predeterminado: traslación rígida para puntos y polígonos, curvado por vértice para líneas), 'preserve_orientation' (traslación rígida según el campo promediado sobre la huella) o 'solid' (traslación rígida según el campo muestreado una sola vez en el punto representativo de la entidad)."
              },
              "search_distance": {
                "label": "Distancia de búsqueda",
                "description": "Distancia máxima (unidades del CRS) a la que un enlace puede influir en un punto de muestreo; los enlaces más lejanos se ignoran. Predeterminado: sin límite (todos los enlaces contribuyen en todas partes)."
              }
            }
          },
          "pycnophylactic_interpolation": {
            "name": "Interpolación picnofiláctica",
            "description": "Interpolación areal de Tobler con conservación de masa: convierte conteos agregados por zona en una superficie de densidad suave cuyas sumas por zona coinciden exactamente con la entrada (como Interpolación areal de ArcGIS) — la alternativa suave a la suposición de densidad uniforme de apportion_polygon.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de polígonos de entrada con un campo de recuento (variable extensiva)."
              },
              "count_field": {
                "label": "Campo de conteo",
                "description": "Campo que contiene el total de cada zona (población, etc.)."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de densidad de salida (valor por celda; las sumas por zona coinciden con la entrada). Si se omite, se almacena en memoria."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida en unidades del CRS (predeterminado: la extensión / 200)."
              },
              "iterations": {
                "label": "Iteraciones",
                "description": "Número máximo de iteraciones de suavizado (predeterminado 100)."
              },
              "tolerance": {
                "label": "Tolerancia",
                "description": "Detenerse cuando el cambio máximo por celda caiga por debajo de esta fracción de la densidad media (predeterminado 0.001)."
              },
              "non_negative": {
                "label": "No negativo",
                "description": "Limitar los negativos a 0 y redistribuir para conservar la masa (predeterminado true)."
              }
            }
          },
          "radiometric_terrain_flattening": {
            "name": "Aplanamiento radiométrico del terreno",
            "description": "Elimina la señal de brillo topográfico de la retrodispersión SAR calibrada sustituyendo el área de referencia de tierra plana por el área iluminada local derivada del DEM, y marca el layover y la sombra del radar (Aplicar aplanamiento radiométrico del terreno de ArcGIS). apply_radiometric_calibration de la ronda 17 normaliza con el ángulo de incidencia del elipsoide, por lo que en terreno inclinado su sigma0/gamma0 sigue la topografía en lugar de la cobertura del suelo — habitualmente en más de 6 dB, lo que supera la diferencia bosque/suelo desnudo que debe medir.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de retrodispersión SAR calibrada (beta cero por defecto; véase 'input_calibration')."
              },
              "dem": {
                "label": "DEM",
                "description": "Modelo digital de elevaciones, corregistrado con el ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de retrodispersión con el terreno aplanado de salida. Si se omite, se almacena en memoria."
              },
              "output_scattering_area": {
                "label": "Salida de área de dispersión",
                "description": "Razón de salida entre el área iluminada real y el área de tierra plana. Se genera siempre; se almacena en memoria cuando no se indica ninguna ruta."
              },
              "output_geometry_mask": {
                "label": "Salida de máscara de geometría",
                "description": "Máscara de salida: 0 normal, 1 inversión por relieve, 2 sombra de radar. Se genera siempre; se almacena en memoria cuando no se indica ninguna ruta."
              },
              "incidence_angle": {
                "label": "Ángulo de incidencia",
                "description": "Ángulo de incidencia sobre el elipsoide en grados: una constante o la ruta de un ráster por celda. Obligatorio."
              },
              "look_azimuth": {
                "label": "Acimut de observación",
                "description": "Acimut de brújula en grados desde el objetivo hacia el sensor (predeterminado 270, es decir, una pasada ascendente con visión a la derecha). Una pasada descendente de Sentinel-1 con visión a la derecha ronda los 283."
              },
              "input_calibration": {
                "label": "Calibración de entrada",
                "description": "Lo que ya es la entrada: 'beta0' (predeterminado), 'sigma0_ellipsoid' o 'gamma0_ellipsoid'. Los dos últimos se reconvierten a beta cero usando el ángulo sobre el elipsoide antes del aplanado."
              },
              "calibration_type": {
                "label": "Tipo de calibración",
                "description": "Convención de salida: 'gamma0' (predeterminado) o 'sigma0'."
              },
              "input_units": {
                "label": "Unidades de entrada",
                "description": "'intensity' (predeterminado), 'dn', 'amplitude' o 'db'."
              },
              "output_units": {
                "label": "Unidades de salida",
                "description": "'linear' (predeterminado) o 'db'."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Multiplicador que convierte las unidades z del DEM en las unidades XY del ráster (predeterminado 1.0)."
              },
              "band": {
                "label": "Banda",
                "description": "Banda del ráster de entrada que se aplana, con índice desde 1 (predeterminado 1)."
              }
            }
          },
          "raster_domain": {
            "name": "Dominio del ráster",
            "description": "Traza el límite de la región de datos válidos de un ráster como polígonos (o polilíneas cerradas), preservando los huecos interiores sin datos (Dominio de ráster de ArcGIS). El layer_footprint_raster incluido devuelve la extensión rectangular completa, que para una escena rotada, una cuenca recortada o una tesela de mosaico irregular puede ser varias veces la cobertura real; polygonize podría hacerlo pero solo a partir de una máscara de validez 0/1 que el llamador tiene que construir primero, lo cual es toda la tarea.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster del que se quiere obtener la huella de datos válidos."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de polígonos o de líneas de salida. Si se omite, se almacena en memoria."
              },
              "geometry_type": {
                "label": "Tipo de geometría",
                "description": "'polygon' (predeterminado) o 'line' para obtener el límite como polilíneas cerradas."
              },
              "ignore_value": {
                "label": "Valor a ignorar",
                "description": "Tratar también este valor como no válido, además del valor sin datos propio del ráster (habitualmente 0 en imágenes con un borde negro)."
              },
              "min_value": {
                "label": "Valor mínimo",
                "description": "Tratar como no válidos los valores inferiores a este."
              },
              "max_value": {
                "label": "Valor máximo",
                "description": "Tratar como no válidos los valores superiores a este."
              },
              "min_area": {
                "label": "Área mínima",
                "description": "Descartar las partes de la huella menores que esta superficie, en unidades del mapa al cuadrado, lo que elimina el moteado en torno a un margen irregular."
              },
              "fill_holes": {
                "label": "Rellenar huecos",
                "description": "Descartar los huecos interiores y devolver la huella maciza (predeterminado false)."
              },
              "all_bands": {
                "label": "Todas las bandas",
                "description": "Exigir que una celda sea válida en todas las bandas y no solo en la seleccionada (predeterminado false)."
              },
              "band": {
                "label": "Banda",
                "description": "Banda que se comprueba, con índice desde 1 (predeterminado 1). Se ignora cuando se establece 'all_bands'."
              }
            }
          },
          "raster_normalize": {
            "name": "Normalizar ráster",
            "description": "Normaliza mín-máx una banda ráster al rango [0, 1].",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida. Si se omite, el resultado se almacena en memoria."
              },
              "band": {
                "label": "Banda",
                "description": "Banda que se normaliza, con índice desde 1 (predeterminado 1)."
              }
            }
          },
          "raster_to_h3": {
            "name": "Ráster a celdas H3",
            "description": "Agrega valores de bandas ráster en celdas de la malla global discreta H3 (media, suma, mínimo, máximo, conteo, mediana).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada (debe ser geográfico, longitud/latitud, EPSG:4326)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida; el controlador se deduce de su extensión (.geojson, .fgb, .parquet, ...). Si se omite, la capa se almacena en memoria."
              },
              "resolution": {
                "label": "Resolución",
                "description": "Resolución H3 de 0 (la más gruesa) a 15 (la más fina); predeterminado 8 (celdas de ~0,7 km²)."
              },
              "band": {
                "label": "Banda",
                "description": "Banda del ráster que se agrega, con índice desde 1 (predeterminado 1)."
              },
              "aggregate": {
                "label": "Agregar",
                "description": "Cómo se combinan los valores de píxel en cada celda: mean, sum, min, max, count o median (predeterminado mean)."
              }
            }
          },
          "raster_to_tiles": {
            "name": "Ráster a teselas XYZ",
            "description": "Divide un ráster en una pirámide de teselas PNG XYZ en Web Mercator (EPSG:3857) para mapas web.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada. Debe tener un CRS de origen (EPSG o WKT)."
              },
              "output_dir": {
                "label": "Directorio de salida",
                "description": "Directorio de salida para el árbol de teselas {z}/{x}/{y}.png (p. ej. /work/tiles)."
              },
              "min_zoom": {
                "label": "Zoom mínimo",
                "description": "Nivel de zoom mínimo (predeterminado: un único zoom nativo que se corresponde con la resolución del ráster)."
              },
              "max_zoom": {
                "label": "Zoom máximo",
                "description": "Nivel de zoom máximo (predeterminado: el mismo que min_zoom)."
              },
              "band": {
                "label": "Banda",
                "description": "Banda que se representa, con índice desde 1 (predeterminado 1)."
              },
              "colormap": {
                "label": "Mapa de colores",
                "description": "Mapa de color: viridis (predeterminado), magma, turbo, terrain o grayscale."
              },
              "method": {
                "label": "Método",
                "description": "Método de remuestreo para la reproyección y el muestreo: bilinear (predeterminado), nearest, cubic."
              },
              "min": {
                "label": "Mínimo",
                "description": "Valor asignado al extremo inferior del mapa de color (predeterminado: el mínimo de la banda)."
              },
              "max": {
                "label": "Máximo",
                "description": "Valor asignado al extremo superior del mapa de color (predeterminado: el máximo de la banda)."
              }
            }
          },
          "raster_to_weighted_points": {
            "name": "Ráster a puntos ponderados",
            "description": "Distribuye un número fijo de puntos a través de un ráster de modo que su densidad sea proporcional al valor de la celda, colocándolos en una retícula de Fibonacci determinista, espiral, patrón circular o de centroide (Ráster a puntos ponderados de ArcGIS). Nada en ninguno de los registros pondera por una superficie: random_sample y random_points_in_polygon son uniformes, create_spatially_balanced_points dispersa deliberadamente los puntos de forma uniforme y raster_to_vector_points emite uno por celda sin adelgazamiento ni ponderación. La asignación usa el método del mayor resto y no necesita RNG, por lo que los resultados son reproducibles en WASM.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de superficie de entrada; los valores de celda son los pesos."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de puntos de salida. Si se omite, se almacena en memoria."
              },
              "max_number_of_points": {
                "label": "Número máximo de puntos",
                "description": "Número total de puntos que se distribuyen (predeterminado 1000)."
              },
              "method": {
                "label": "Método",
                "description": "Colocación dentro de la celda: 'fibonacci_lattice' (predeterminado), 'fibonacci_spiral', 'circular' o 'centroid'."
              },
              "min_value": {
                "label": "Valor mínimo",
                "description": "Las celdas con un peso igual o inferior a este valor no reciben puntos (predeterminado 0). Los pesos negativos siempre se excluyen."
              },
              "max_points_per_cell": {
                "label": "Puntos máximos por celda",
                "description": "Limita los puntos que puede recibir una sola celda, para que una celda destacada no absorba todo el presupuesto."
              },
              "include_weight": {
                "label": "Incluir peso",
                "description": "Escribir el valor de la celda de origen en cada punto (predeterminado true)."
              },
              "band": {
                "label": "Banda",
                "description": "Banda que proporciona los pesos, con índice desde 1 (predeterminado 1)."
              }
            }
          },
          "read_geoparquet": {
            "name": "Leer GeoParquet",
            "description": "Lee un archivo GeoParquet y lo convierte a otro formato vectorial (o lo almacena en memoria).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo GeoParquet de entrada (p. ej. /work/data.parquet)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida vectorial opcional; el formato se deduce de su extensión (.geojson, .fgb, .shp, .gpkg, ...). Si se omite, la capa se almacena en memoria."
              }
            }
          },
          "reclassify_field": {
            "name": "Reclasificar campo",
            "description": "Clasifica un atributo vectorial numérico en intervalos de clase (como Reclasificar campo de ArcGIS): equal_interval, defined_interval, quantile, natural_breaks (Jenks), std_dev o geometric_interval, escribiendo un campo de clase entero más un campo opcional de valor de corte.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial (o tabla) de entrada con el campo numérico que se va a clasificar."
              },
              "field": {
                "label": "Campo",
                "description": "Nombre del campo numérico que se va a clasificar."
              },
              "output": {
                "label": "Salida",
                "description": "Capa vectorial de salida con el campo de clase añadido. Si se omite, se almacena en memoria."
              },
              "method": {
                "label": "Método",
                "description": "Método de clasificación: equal_interval, defined_interval, quantile, natural_breaks, std_dev o geometric_interval (predeterminado natural_breaks)."
              },
              "classes": {
                "label": "Clases",
                "description": "Número de clases para equal_interval/quantile/natural_breaks/geometric_interval (predeterminado 5). Lo ignoran defined_interval y std_dev, cuyo número de clases depende de los datos."
              },
              "interval": {
                "label": "Intervalo",
                "description": "Anchura de clase fija para defined_interval (obligatorio para ese método)."
              },
              "std_dev_interval": {
                "label": "Intervalo de desviación estándar",
                "description": "Tamaño del intervalo para std_dev, en unidades de desviación estándar (predeterminado 1.0; p. ej. 0.5 para bandas de media sigma)."
              },
              "class_field": {
                "label": "Campo de clase",
                "description": "Nombre del campo entero de clase que se añade (predeterminado 'class')."
              },
              "break_field": {
                "label": "Campo de ruptura",
                "description": "Si se indica, añade además un campo de coma flotante con el límite superior de la clase a la que pertenece cada entidad."
              }
            }
          },
          "reconstruct_tracks": {
            "name": "Reconstruir trayectos",
            "description": "Convierte puntos con marca de tiempo en polilíneas de trayectoria de movimiento (agrupadas por ID, ordenadas por tiempo, divididas en huecos de tiempo/distancia) con estadísticas por trayectoria, y opcionalmente encuentra ubicaciones de permanencia donde el móvil se detuvo — como Reconstruir trayectorias / Buscar ubicaciones de permanencia de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos de entrada con observaciones con marca de tiempo."
              },
              "track_field": {
                "label": "Campo de trayectoria",
                "description": "Campo que identifica cada trayectoria/objeto móvil (p. ej. el identificador de un vehículo o de un animal)."
              },
              "time_field": {
                "label": "Campo de tiempo",
                "description": "Campo que contiene la hora de cada punto: segundos numéricos o una marca de tiempo ISO-8601."
              },
              "output": {
                "label": "Salida",
                "description": "Vectorial de líneas de trayectorias de salida (el controlador se deduce de la extensión). Si se omite, se almacena en memoria."
              },
              "time_gap": {
                "label": "Hueco temporal",
                "description": "Iniciar un nuevo segmento de trayectoria cuando el intervalo temporal entre puntos supere este número de segundos. Predeterminado: sin división temporal."
              },
              "distance_gap": {
                "label": "Hueco de distancia",
                "description": "Iniciar un nuevo segmento de trayectoria cuando la distancia entre puntos supere este valor (en metros para un CRS geográfico; en unidades del CRS en los demás casos). Predeterminado: sin división por distancia."
              },
              "dwells": {
                "label": "Paradas",
                "description": "Ruta de salida opcional de los puntos correspondientes a las paradas (donde el objeto móvil se detuvo)."
              },
              "dwell_distance": {
                "label": "Distancia de parada",
                "description": "Radio máximo de una parada, en las unidades de distancia indicadas más arriba. Predeterminado 50."
              },
              "dwell_min_duration": {
                "label": "Duración mínima de parada",
                "description": "Tiempo mínimo (en segundos) que un objeto móvil debe permanecer dentro de dwell_distance para que se considere una parada. Predeterminado 300."
              }
            }
          },
          "reduce_point_density": {
            "name": "Reducir la densidad de puntos",
            "description": "Adelgaza una capa de puntos vectorial de modo que dos puntos retenidos nunca estén más cerca que un espaciado mínimo, o conserva un punto por celda de malla (Reducir densidad de puntos de ArcGIS). lidar_thin es solo para LAS y find_identical solo captura duplicados exactos, por lo que las capas densas de sondeos, GPS y sensores no podían diezmarse antes de la interpolación.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de puntos (o multipuntos) de entrada."
              },
              "method": {
                "label": "Método",
                "description": "'spacing' (predeterminado): adelgazamiento voraz por separación mínima. 'bin': conserva un punto por celda de la malla."
              },
              "min_distance": {
                "label": "Distancia mínima",
                "description": "Separación mínima entre los puntos conservados, en unidades de la capa. Obligatorio para el método 'spacing'."
              },
              "bin_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de la malla en unidades de la capa. Obligatorio para el método 'bin'."
              },
              "sort_field": {
                "label": "Campo de ordenación",
                "description": "Atributo numérico que decide qué punto gana en un conflicto. Sin él, decide el orden de entrada."
              },
              "sort_order": {
                "label": "Orden de clasificación",
                "description": "'descending' (predeterminado, gana el sort_field más alto) o 'ascending'."
              },
              "keep_field": {
                "label": "Campo a conservar",
                "description": "Atributo que marca los puntos que siempre deben conservarse (distinto de cero / verdadero / no vacío). Úselo para peligros como los sondeos de bajos."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de salida con los puntos conservados. Si se omite, se almacena en memoria."
              },
              "output_removed": {
                "label": "Salida de eliminados",
                "description": "Capa opcional que recibe los puntos descartados, para su revisión."
              }
            }
          },
          "regression_kriging": {
            "name": "Kriging de regresión",
            "description": "Kriging con deriva externa: regresa los valores de muestra sobre rásteres de covariables exhaustivos, ajusta un variograma a los residuos y suma el campo de residuos krigeado a la superficie de regresión (Predicción por regresión EBK de ArcGIS). Todas las variantes de kriging incluidas modelan la tendencia en las coordenadas o necesitan muestras puntuales secundarias; ninguna acepta rásteres de covariables, que es lo que la mayoría de la geoestadística aplicada realmente necesita.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de puntos de muestra."
              },
              "value_field": {
                "label": "Campo de valor",
                "description": "Atributo numérico que se va a predecir."
              },
              "covariates": {
                "label": "Covariables",
                "description": "Rutas de rásteres de covariables separadas por comas o punto y coma, exhaustivas sobre la malla de predicción. La primera define la malla de salida."
              },
              "variogram_model": {
                "label": "Modelo de variograma",
                "description": "Modelo de variograma de los residuos: 'spherical' (predeterminado), 'exponential' o 'gaussian'."
              },
              "lag_count": {
                "label": "Número de retardos",
                "description": "Número de intervalos de retardo usados para ajustar el variograma de los residuos (predeterminado 12)."
              },
              "max_neighbors": {
                "label": "Vecinos máximos",
                "description": "Número de muestras más próximas usadas en el sistema de kriging de cada celda (predeterminado 16)."
              },
              "bilinear": {
                "label": "Bilineal",
                "description": "Muestrear las covariables de forma bilineal en las ubicaciones de los puntos en lugar de por celda más próxima (predeterminado false)."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de predicción de salida. Si se omite, se almacena en memoria."
              },
              "output_error": {
                "label": "Salida de error",
                "description": "Ráster de error estándar de predicción (error estándar de kriging del campo de residuos). Se genera siempre."
              }
            }
          },
          "regularize_adjacent_building_footprint": {
            "name": "Regularizar huellas de edificios adyacentes",
            "description": "Regulariza un grupo de huellas de edificios adyacentes a una orientación compartida para que las paredes compartidas permanezcan paralelas y colineales (como Regularizar huella de edificio adyacente de ArcGIS) — la contraparte consistente por grupo de regularize_building_footprints por edificio, que permite que las huellas vecinas se desalineen.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de polígonos de huellas de edificios de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de los polígonos de salida. Si se omite, se almacena en memoria."
              },
              "group": {
                "label": "Grupo",
                "description": "Campo opcional que agrupa las huellas que se regularizan juntas. Sin él, los grupos se forman por adyacencia de límites."
              },
              "method": {
                "label": "Método",
                "description": "'right_angles' (predeterminado) o 'right_angles_and_diagonals'."
              },
              "tolerance": {
                "label": "Tolerancia",
                "description": "Longitud mínima de muro; las aristas más cortas se eliminan por considerarse ruido (unidades del CRS). Predeterminado 1.0."
              },
              "precision": {
                "label": "Precisión",
                "description": "Paso de malla para ajustar los desplazamientos de los muros de forma que los muros paralelos próximos queden colineales (unidades del CRS). Predeterminado: tolerance."
              },
              "adjacency_distance": {
                "label": "Distancia de adyacencia",
                "description": "Cuando no se indica un campo 'group', las huellas cuyos vértices se aproximan a esta distancia forman un mismo grupo (unidades del CRS). Predeterminado: 2 x tolerance."
              }
            }
          },
          "regularize_building_footprints": {
            "name": "Regularizar huellas de edificios",
            "description": "Normaliza polígonos ruidosos de huellas de edificios en formas regulares (paredes en ángulo recto, diagonales, de cualquier ángulo o circulares).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo vectorial de polígonos de entrada, formato detectado automáticamente (o identificador en memoria)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según su extensión). Si se omite, se almacena en memoria."
              },
              "method": {
                "label": "Método",
                "description": "Método de regularización: 'right_angles' (predeterminado), 'right_angles_and_diagonals', 'any_angle' o 'circle'."
              },
              "tolerance": {
                "label": "Tolerancia",
                "description": "Distancia máxima (en unidades del CRS) que la huella regularizada puede desviarse del límite original. Predeterminado 1.0."
              },
              "diagonal_penalty": {
                "label": "Penalización diagonal",
                "description": "Para 'right_angles_and_diagonals': con cuánta fuerza se prefieren los ángulos rectos frente a los muros de 45 grados (un muro solo pasa a ser diagonal cuando su desviación angular respecto a una diagonal, multiplicada por este factor, es menor que su desviación respecto a un eje). Predeterminado 1.5; los valores mayores producen menos diagonales."
              },
              "min_radius": {
                "label": "Radio mínimo",
                "description": "Para 'circle': radio ajustado mínimo permitido; los ajustes menores conservan la huella original. Predeterminado 0.1."
              },
              "max_radius": {
                "label": "Radio máximo",
                "description": "Para 'circle': radio ajustado máximo permitido; los ajustes mayores conservan la huella original. Sin límite si se omite."
              }
            }
          },
          "remove_overlap_multiple": {
            "name": "Eliminar solape (múltiple)",
            "description": "Reasigna cada solape entre un conjunto de polígonos a exactamente una entidad, produciendo una partición de su unión sin huecos ni solapes (división por línea central o de Thiessen), como Eliminar solape (múltiple) de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de polígonos de entrada (las entidades pueden solaparse)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de polígonos de salida (el controlador se deduce de la extensión). Si se omite, se almacena en memoria."
              },
              "method": {
                "label": "Método",
                "description": "'center_line' (asigna cada punto de solape a la entidad en la que se sitúa más al interior, predeterminado) o 'thiessen' (el centroide generador más próximo)."
              },
              "grid_resolution": {
                "label": "Resolución de malla",
                "description": "Número de celdas a lo largo del lado mayor de cada región de solape al dividirla (predeterminado 40; un valor mayor da líneas divisorias más suaves y es más lento)."
              }
            }
          },
          "remove_thermal_noise": {
            "name": "Eliminar ruido térmico",
            "description": "Resta el piso de ruido térmico aditivo del receptor a la retrodispersión SAR, eliminando el bandeado a través de la franja que domina las superficies oscuras como agua en calma, terreno inundado y sombra del radar (Eliminar ruido térmico de ArcGIS). Nada en ninguno de los registros hace esto: los filtros lee/frost/kuan/refined-lee incluidos suprimen el speckle multiplicativo, una magnitud distinta. Sin ello, un umbral de agua de Otsu se engancha a un límite de subfranja en lugar de a una línea de costa, y los cocientes de polarización cruzada se calculan a partir de un numerador que es en gran parte ruido.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de retrodispersión SAR calibrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster con el ruido eliminado de salida. Si se omite, se almacena en memoria."
              },
              "output_snr": {
                "label": "Salida de SNR",
                "description": "Relación señal-ruido de salida en dB. Se genera siempre; se almacena en memoria cuando no se indica ninguna ruta."
              },
              "noise_raster": {
                "label": "Ráster de ruido",
                "description": "Ráster de potencia de ruido por celda, corregistrado con la entrada. Prevalece sobre las otras dos formas."
              },
              "noise_profile": {
                "label": "Perfil de ruido",
                "description": "Potencias de ruido a lo largo del rango separadas por comas, interpoladas linealmente entre las columnas del ráster. Al menos dos valores."
              },
              "noise_constant": {
                "label": "Constante de ruido",
                "description": "Un único sigma cero equivalente de ruido aplicado a todas las celdas."
              },
              "noise_units": {
                "label": "Unidades de ruido",
                "description": "Unidades en las que están los valores de ruido: 'intensity' (predeterminado), 'dn', 'amplitude' o 'db'."
              },
              "input_units": {
                "label": "Unidades de entrada",
                "description": "'intensity' (predeterminado), 'dn', 'amplitude' o 'db'."
              },
              "output_units": {
                "label": "Unidades de salida",
                "description": "'linear' (predeterminado) o 'db'."
              },
              "floor_fraction": {
                "label": "Fracción de suelo",
                "description": "Las celdas que quedan en cero o por debajo se limitan a esta fracción de la potencia de ruido local (predeterminado 0.01). Mantiene finita la conversión a dB."
              },
              "band": {
                "label": "Banda",
                "description": "Banda de la que se elimina el ruido, con índice desde 1 (predeterminado 1)."
              }
            }
          },
          "render_raster_png": {
            "name": "Renderizar ráster a PNG",
            "description": "Renderiza una única banda ráster a una imagen PNG mediante un mapa de colores (los valores sin datos se vuelven transparentes).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del archivo PNG de salida (p. ej. /work/preview.png)."
              },
              "band": {
                "label": "Banda",
                "description": "Banda que se representa, con índice desde 1 (predeterminado 1)."
              },
              "colormap": {
                "label": "Mapa de colores",
                "description": "Mapa de color: viridis (predeterminado), magma, turbo, terrain o grayscale."
              },
              "min": {
                "label": "Mínimo",
                "description": "Valor asignado al extremo inferior del mapa de color (predeterminado: el mínimo de la banda)."
              },
              "max": {
                "label": "Máximo",
                "description": "Valor asignado al extremo superior del mapa de color (predeterminado: el máximo de la banda)."
              }
            }
          },
          "render_vector_png": {
            "name": "Renderizar vectorial a PNG",
            "description": "Dibuja una capa vectorial (puntos/líneas/polígonos) en una imagen de mapa PNG.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo vectorial de entrada o identificador en memoria."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del archivo PNG de salida (p. ej. /work/map.png)."
              },
              "width": {
                "label": "Ancho",
                "description": "Ancho de la imagen en píxeles (predeterminado 800)."
              },
              "height": {
                "label": "Altura",
                "description": "Alto de la imagen en píxeles (predeterminado: según la relación de aspecto de los datos)."
              },
              "fill": {
                "label": "Relleno",
                "description": "Color de relleno de polígonos y puntos como #rrggbb o #rrggbbaa (predeterminado: azul semitransparente)."
              },
              "stroke": {
                "label": "Trazo",
                "description": "Color del contorno o de la línea como #rrggbb o #rrggbbaa (predeterminado: azul oscuro)."
              },
              "stroke_width": {
                "label": "Ancho de trazo",
                "description": "Ancho del contorno o de la línea en píxeles (predeterminado 1)."
              },
              "background": {
                "label": "Fondo",
                "description": "Color de fondo como #rrggbb[aa] o 'transparent' (predeterminado transparent)."
              }
            }
          },
          "repair_geometry": {
            "name": "Reparar geometría",
            "description": "Detecta y corrige geometría de polígonos no válida — autointersecciones (mediante autounión), orientación de anillos, vértices duplicados y partes nulas/vacías — o, con check_only, informa de un código de problema por entidad. Como Reparar geometría / Comprobar geometría de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo vectorial de polígonos de entrada, formato detectado automáticamente (o un identificador en memoria)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según su extensión). Si se omite, se almacena en memoria."
              },
              "check_only": {
                "label": "Solo comprobar",
                "description": "Cuando es verdadero, no modifica la geometría: genera la entrada con las columnas 'problem_code'/'problem_desc' (como Comprobar geometría de ArcGIS). Predeterminado false."
              }
            }
          },
          "rescale_by_function": {
            "name": "Reescalar por función",
            "description": "Reescala un ráster continuo a una escala de idoneidad común mediante una función de transferencia (linear, inverse_linear, power, exponential, logarithmic, logistic, gaussian, near, small, large, symmetric_linear), como Reescalar por función de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster continuo de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida. Si se omite, el resultado se almacena en memoria."
              },
              "function": {
                "label": "Función",
                "description": "Función de transferencia: linear (predeterminado), inverse_linear, power, exponential, logarithmic, logistic, gaussian, near, small, large, symmetric_linear."
              },
              "from_scale": {
                "label": "Escala de origen",
                "description": "Extremo inferior de la escala de salida (predeterminado 0)."
              },
              "to_scale": {
                "label": "Escala de destino",
                "description": "Extremo superior de la escala de salida (predeterminado 1)."
              },
              "param1": {
                "label": "Parámetro 1",
                "description": "Primer parámetro de forma (exponente para power; pendiente para exponential/logarithmic/logistic/small/large; centro para gaussian/near). El valor predeterminado depende de la función."
              },
              "param2": {
                "label": "Parámetro 2",
                "description": "Segundo parámetro de forma (dispersión para gaussian/near). El valor predeterminado depende de la función."
              },
              "low_threshold": {
                "label": "Umbral bajo",
                "description": "Corte inferior opcional: los valores por debajo se asignan a 'value_below'."
              },
              "high_threshold": {
                "label": "Umbral alto",
                "description": "Corte superior opcional: los valores por encima se asignan a 'value_above'."
              },
              "value_below": {
                "label": "Valor por debajo",
                "description": "Valor de salida para las celdas por debajo de 'low_threshold' (predeterminado = from_scale)."
              },
              "value_above": {
                "label": "Valor por encima",
                "description": "Valor de salida para las celdas por encima de 'high_threshold' (predeterminado = to_scale)."
              },
              "band": {
                "label": "Banda",
                "description": "Banda que se reescala, con índice desde 1 (predeterminado 1)."
              }
            }
          },
          "resolve_building_conflicts": {
            "name": "Resolver conflictos de edificios",
            "description": "Desplaza, contrae u oculta huellas de edificios que entran en conflicto gráfico con barreras de carreteras simbolizadas (y entre sí) para cartografía a pequeña escala, etiquetando cada una con un estado, como Resolver conflictos de edificios de ArcGIS.",
            "params": {
              "buildings": {
                "label": "Edificios",
                "description": "Capa de polígonos de edificios de entrada."
              },
              "barriers": {
                "label": "Barreras",
                "description": "Capa de líneas de barrera (p. ej. carreteras) que los edificios deben respetar."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de edificios de salida con un campo 'status'. Si se omite, se almacena en memoria."
              },
              "barrier_width": {
                "label": "Ancho de barrera",
                "description": "Anchura simbolizada de la barrera en unidades del mapa (se aplica una zona de influencia de la mitad de este valor a cada lado). Predeterminado 0."
              },
              "gap": {
                "label": "Hueco",
                "description": "Separación mínima que debe mantenerse entre un edificio y una barrera (unidades del mapa). Predeterminado 0."
              },
              "min_size": {
                "label": "Tamaño mínimo",
                "description": "Superficie mínima del edificio (unidades del mapa²) por debajo de la cual un edificio en conflicto se oculta en lugar de reducirse. Predeterminado 0 (no ocultar nunca)."
              },
              "hide": {
                "label": "Ocultar",
                "description": "Indica si los edificios ocultos se descartan de la salida (predeterminado false: se conservan con status='hidden')."
              }
            }
          },
          "resolve_road_conflicts": {
            "name": "Resolver conflictos viarios",
            "description": "Desplaza carreteras cuyas representaciones simbolizadas (ancho dibujado) se solapan o aglomeran a una escala objetivo: las carreteras de menor jerarquía se apartan de las de mayor jerarquía con desplazamientos de vértices suavizados y con extremos fijados, emitiendo opcionalmente enlaces de desplazamiento, como Resolver conflictos de carreteras / Propagar desplazamiento de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de líneas de carreteras de entrada (LineString / MultiLineString)."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de carreteras desplazadas de salida con los campos 'status' y 'shift'. Si se omite, se almacena en memoria."
              },
              "symbol_width": {
                "label": "Ancho de símbolo",
                "description": "Anchura simbolizada fija para todas las carreteras, en unidades del mapa (o en milímetros de página cuando se establece 'scale'). Se usa cuando falta 'symbol_width_field'."
              },
              "symbol_width_field": {
                "label": "Campo de ancho de símbolo",
                "description": "Campo numérico que indica la anchura simbolizada de cada carretera (unidades del mapa, o milímetros de página cuando se establece 'scale'). Recurre a 'symbol_width' cuando falta un valor."
              },
              "hierarchy_field": {
                "label": "Campo de jerarquía",
                "description": "Campo numérico que ordena la importancia de las carreteras (un valor menor = más importante, se mantiene fija). Si falta, todas las carreteras comparten el desplazamiento por igual."
              },
              "scale": {
                "label": "Escala",
                "description": "Denominador de la escala del mapa objetivo. Cuando se establece, las anchuras de los símbolos son milímetros de página convertidos a unidades de terreno (mm * escala / 1000). Predeterminado: las anchuras se toman directamente como unidades del mapa."
              },
              "gap": {
                "label": "Hueco",
                "description": "Separación libre adicional que debe mantenerse entre las bandas de símbolos, en unidades del mapa. Predeterminado 0."
              },
              "max_iter": {
                "label": "Iteraciones máximas",
                "description": "Número máximo de iteraciones de desplazamiento. Predeterminado 50."
              },
              "pin_endpoints": {
                "label": "Fijar extremos",
                "description": "Mantener fijos el primer y el último vértice de cada carretera para preservar los cruces y la conectividad (predeterminado true)."
              },
              "links": {
                "label": "Enlaces",
                "description": "Ruta de salida opcional para los enlaces de desplazamiento (líneas de origen→destino) que puede consumir rubbersheet_features."
              }
            }
          },
          "ripleys_k": {
            "name": "K de Ripley",
            "description": "Análisis de patrones de puntos multidistancia (función K / L de Ripley) con envolventes de Monte Carlo de aleatoriedad espacial completa, para detectar agrupación o dispersión en un rango de distancias.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos de entrada (las demás geometrías usan su punto representativo, la media de sus vértices)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta CSV opcional para la tabla K/L. La tabla también se devuelve en el resultado de la herramienta."
              },
              "distance_bands": {
                "label": "Bandas de distancia",
                "description": "Número de bandas de distancia que se evalúan (predeterminado 10)."
              },
              "max_distance": {
                "label": "Distancia máxima",
                "description": "Distancia máxima que se evalúa, en unidades del CRS. Predeterminado: una cuarta parte del lado menor del rectángulo delimitador de los puntos."
              },
              "permutations": {
                "label": "Permutaciones",
                "description": "Número de simulaciones de aleatoriedad espacial completa para la envolvente de significación (predeterminado 99; 0 la desactiva)."
              },
              "weight_field": {
                "label": "Campo de peso",
                "description": "Campo numérico opcional que pondera cada punto."
              },
              "seed": {
                "label": "Semilla",
                "description": "Semilla del generador de aleatoriedad espacial completa (predeterminado 1), para obtener envolventes reproducibles."
              }
            }
          },
          "rubbersheet_features": {
            "name": "Ajustar entidades por rubbersheeting",
            "description": "Deforma una capa vectorial para alinearla con un objetivo usando enlaces de desplazamiento: una transformación afín por tramos sobre TIN de Delaunay (o IDW) que lleva los puntos de control a sus objetivos y deforma suavemente todo lo que hay entre ellos — la transformación de conflación, como Ajuste elástico de entidades de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada que se va a ajustar (cualquier tipo de geometría)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según la extensión). Si se omite, se almacena en memoria."
              },
              "links": {
                "label": "Enlaces",
                "description": "Capa de líneas opcional con los enlaces de desplazamiento (en cada línea: primer vértice = origen, último vértice = destino)."
              },
              "target": {
                "label": "Objetivo",
                "description": "Capa vectorial de destino opcional; los enlaces se generan emparejando el punto representativo de cada entidad de entrada con el destino más próximo dentro de search_distance."
              },
              "search_distance": {
                "label": "Distancia de búsqueda",
                "description": "Distancia máxima para emparejar la entrada con el destino al generar los enlaces (unidades del CRS). Obligatoria con 'target'."
              },
              "method": {
                "label": "Método",
                "description": "'linear' (TIN de Delaunay afín por tramos, predeterminado) o 'idw' (ponderación por distancia inversa)."
              },
              "power": {
                "label": "Potencia",
                "description": "Potencia de IDW para el decaimiento fuera del TIN o para method=idw. Predeterminado 2."
              }
            }
          },
          "sar_coherence": {
            "name": "Coherencia SAR",
            "description": "Calcula la magnitud de coherencia interferométrica normalizada (y opcionalmente la fase interferométrica) entre dos adquisiciones SAR complejas corregistradas sobre una ventana móvil (Calcular coherencia / Generar interferograma de ArcGIS). La coherencia mide la estabilidad de fase en lugar del brillo, por lo que detecta cambios que la diferenciación de intensidad no puede ver — colapsos, inundación bajo vegetación, cosecha, movimiento del hielo — con cualquier clima. Ninguna herramienta de ambos registros usa la fase SAR. Las entradas son pares I/Q de dos bandas y deben estar ya corregistradas.",
            "params": {
              "reference": {
                "label": "Referencia",
                "description": "Ráster SAR complejo (dos bandas: I y Q) de la primera adquisición."
              },
              "secondary": {
                "label": "Secundario",
                "description": "Ráster SAR complejo corregistrado (dos bandas: I y Q) de la segunda adquisición."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional del ráster de coherencia (magnitud, 0..1). Si se omite, se almacena en memoria."
              },
              "output_phase": {
                "label": "Salida de fase",
                "description": "Ruta de salida opcional del ráster de fase interferométrica en radianes, envuelta a (-pi, pi]."
              },
              "window_size": {
                "label": "Tamaño de ventana",
                "description": "Ventana de estimación como 'range,azimuth' en celdas (predeterminado '5,5'). El estimador está centrado, de modo que un valor par se redondea AL ALZA al siguiente tamaño impar; la ventana efectiva se devuelve como window_range/window_azimuth."
              },
              "bias_correction": {
                "label": "Corrección de sesgo",
                "description": "Corregir el sesgo al alza del estimador de coherencia con ventanas pequeñas (predeterminado true)."
              }
            }
          },
          "semivariogram_sensitivity": {
            "name": "Sensibilidad del semivariograma",
            "description": "Perturba la pepita, la meseta parcial y el alcance de un variograma ajustado, vuelve a krigear en las ubicaciones de evaluación e informa de cuánto se desplazan las predicciones y los errores estándar — la comprobación de defendibilidad estándar de un modelo de kriging (Sensibilidad del semivariograma GA de ArcGIS). La suite de kriging incluida es amplia y kriging_cross_validation mide el ajuste, pero nada mide la sensibilidad, y ambas son independientes: un modelo bien validado por validación cruzada puede seguir siendo muy frágil frente a los parámetros elegidos por el analista.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de puntos que contiene los valores medidos."
              },
              "field": {
                "label": "Campo",
                "description": "Campo numérico al que se aplica el kriging."
              },
              "locations": {
                "label": "Ubicaciones",
                "description": "Capa de puntos con las ubicaciones de predicción en las que se evalúa la sensibilidad."
              },
              "output": {
                "label": "Salida",
                "description": "Tabla con una fila por modelo perturbado. Si se omite, se almacena en memoria."
              },
              "model": {
                "label": "Modelo",
                "description": "Modelo de variograma: 'exponential' (predeterminado), 'spherical' o 'gaussian'."
              },
              "nugget_span_percent": {
                "label": "Porcentaje de rango de pepita",
                "description": "Semianchura de la perturbación de la pepita, en porcentaje (predeterminado 10)."
              },
              "partial_sill_span_percent": {
                "label": "Porcentaje de rango de meseta parcial",
                "description": "Semianchura de la perturbación de la meseta parcial, en porcentaje (predeterminado 10)."
              },
              "range_span_percent": {
                "label": "Porcentaje de rango de alcance",
                "description": "Semianchura de la perturbación del rango, en porcentaje (predeterminado 10)."
              },
              "nugget_steps": {
                "label": "Pasos de pepita",
                "description": "Número de muestras a lo largo del intervalo de la pepita (predeterminado 3; con 1 se fija en el valor ajustado)."
              },
              "partial_sill_steps": {
                "label": "Pasos de meseta parcial",
                "description": "Número de muestras a lo largo del intervalo de la meseta parcial (predeterminado 3)."
              },
              "range_steps": {
                "label": "Pasos de alcance",
                "description": "Número de muestras a lo largo del intervalo del rango (predeterminado 3)."
              },
              "lag_count": {
                "label": "Número de retardos",
                "description": "Intervalos de retardo del variograma empírico usados para el ajuste de referencia (predeterminado 12)."
              }
            }
          },
          "similarity_search": {
            "name": "Búsqueda por similitud",
            "description": "Clasifica entidades candidatas por similitud de atributos con una o más entidades de referencia a través de campos numéricos estandarizados en z (euclidiana o coseno), más/menos/ambos — como Búsqueda de similitud de ArcGIS.",
            "params": {
              "reference": {
                "label": "Referencia",
                "description": "Capa vectorial de referencia (una o varias entidades que definen el perfil con el que se compara)."
              },
              "candidates": {
                "label": "Candidatos",
                "description": "Capa vectorial de candidatos que se ordena por similitud con la referencia."
              },
              "fields": {
                "label": "Campos",
                "description": "Campo o campos numéricos separados por comas que se comparan (deben existir en ambas capas)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida (candidatos ordenados). Si se omite, se almacena en memoria."
              },
              "match_method": {
                "label": "Método de emparejamiento",
                "description": "'euclidean' (distancia estandarizada a puntuaciones z; predeterminado) o 'cosine' (similitud angular)."
              },
              "most_or_least": {
                "label": "Más o menos",
                "description": "Conservar los 'most' similares (predeterminado), los 'least' similares o 'both' extremos."
              },
              "num_results": {
                "label": "Número de resultados",
                "description": "Número de resultados que se conservan por extremo (0 = todos los candidatos). Predeterminado 10."
              }
            }
          },
          "simplify_3d_line": {
            "name": "Simplificar línea 3D",
            "description": "Reduce el número de vértices de polilíneas 3D usando una división de Douglas-Peucker que mide la desviación en tres dimensiones, preservando el perfil vertical, como Simplificar línea 3D de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de polilíneas de entrada (vértices 3D; los vértices 2D se tratan como un caso plano especial)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              },
              "tolerance": {
                "label": "Tolerancia",
                "description": "Desviación 3D máxima en unidades del mapa. Se eliminan los vértices que estén a menos de esta distancia de la cuerda."
              },
              "z_factor": {
                "label": "Factor Z",
                "description": "Multiplicador aplicado a Z antes de la prueba de distancia, para datos cuya unidad Z difiere de la de XY (predeterminado 1)."
              }
            }
          },
          "simplify_building": {
            "name": "Simplificar edificio",
            "description": "Reduce los vértices de huellas de edificios protegiendo las esquinas en ángulo recto, con un umbral de descarte por área mínima, como Simplificar edificio de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Polígonos de huellas de edificios."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              },
              "tolerance": {
                "label": "Tolerancia",
                "description": "Tolerancia de simplificación en unidades del mapa: la distancia máxima que puede desplazarse el límite."
              },
              "minimum_area": {
                "label": "Área mínima",
                "description": "Se descartan las huellas por debajo de esta superficie (predeterminado 0, se conservan todas)."
              },
              "keep_collapsed_points": {
                "label": "Conservar puntos colapsados",
                "description": "Generar un punto en el centroide de cada huella descartada por minimum_area (predeterminado false)."
              },
              "corner_tolerance": {
                "label": "Tolerancia de esquina",
                "description": "Grados dentro de los cuales un ángulo interior se considera un ángulo recto protegido (predeterminado 20)."
              }
            }
          },
          "simplify_by_circular_arcs": {
            "name": "Simplificar por arcos circulares",
            "description": "Simplifica líneas y polígonos sustituyendo secuencias de vértices por segmentos rectos y arcos circulares verdaderos, preservando las curvas de ingeniería en lugar de aproximarlas con cuerdas (Simplificar por líneas rectas y arcos circulares de ArcGIS; el modo «tangent» cubre Simplificar por segmentos tangentes). Todos los simplificadores de ambos registros solo eliminan vértices, lo que obliga a elegir entre una curva facetada y un número inaceptable de vértices en bulbos de fondos de saco, rotondas y huellas de tanques. Los círculos se ajustan por mínimos cuadrados algebraicos pero se aceptan por desviación ortogonal verdadera, de modo que la garantía de tolerancia se mantiene.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de líneas o polígonos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional. Si se omite, el resultado se almacena en memoria."
              },
              "tolerance": {
                "label": "Tolerancia",
                "description": "Desviación máxima permitida de una primitiva ajustada respecto a los vértices originales, en unidades del CRS."
              },
              "mode": {
                "label": "Modo",
                "description": "'arcs' (predeterminado; ajusta segmentos rectos y arcos circulares) o 'tangent' (solo segmentos rectos, el comportamiento de Simplificar por segmentos tangentes)."
              },
              "min_arc_angle": {
                "label": "Ángulo mínimo de arco",
                "description": "Los arcos que abarcan menos grados que este valor se generan como segmentos rectos (predeterminado 10)."
              },
              "max_radius": {
                "label": "Radio máximo",
                "description": "Los arcos con un radio mayor que este se generan como segmentos rectos (predeterminado: 1e6)."
              },
              "densify_output": {
                "label": "Densificar salida",
                "description": "Redensificar los arcos ajustados hasta una tolerancia de cuerda al escribir (predeterminado true). Cuando es falso, solo se generan los extremos del arco, de modo que la geometría por sí sola pierde la curva — lea 'output_arcs' para recuperarla."
              },
              "output_arcs": {
                "label": "Salida de arcos",
                "description": "Ruta opcional para la tabla de arcos ajustados (identificador de entidad, extremos, centro, radio, barrido con signo en grados). Si se omite, se almacena en memoria (se sigue devolviendo)."
              }
            }
          },
          "simplify_by_tangent_segments": {
            "name": "Simplificar por segmentos tangentes",
            "description": "Sustituye la geometría de curvas densificadas por la cadena mínima de segmentos rectos que se mantiene dentro de un desplazamiento perpendicular máximo, uniendo segmentos consecutivos en su intersección para que el resultado siga siendo tangente al original (Simplificar por segmentos tangentes de ArcGIS). El compañero lineal de simplify_by_circular_arcs: simplify_features (Douglas-Peucker) solo puede conservar vértices existentes y no garantiza tangencia, dejando quiebros en geometría de ingeniería, mientras que smooth_line y smooth_natural_features mueven vértices en lugar de reducirlos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Entidades de línea o polígono que se van a simplificar."
              },
              "output": {
                "label": "Salida",
                "description": "Entidades simplificadas con los campos de número de vértices añadidos. Si se omite, se almacena en memoria."
              },
              "max_offset": {
                "label": "Desplazamiento máximo",
                "description": "Desviación perpendicular máxima respecto al original, en UNIDADES DEL CRS. En EPSG:4326 son grados, así que un trabajo a escala métrica necesita aproximadamente 2e-5, no 2.0. El límite se aplica a cada línea ajustada, por lo que la cadena resultante puede superarlo ligeramente cerca de una unión donde se encuentran segmentos consecutivos."
              },
              "anchor_points": {
                "label": "Puntos de anclaje",
                "description": "Capa de puntos opcional cuyas ubicaciones deben sobrevivir como vértices (anchor_points de ArcGIS). Las series nunca se extienden a través de un ancla."
              },
              "anchor_tolerance": {
                "label": "Tolerancia de anclaje",
                "description": "Distancia dentro de la cual un vértice de entrada se considera coincidente con un punto de anclaje (unidades CRS). Predeterminado: max_offset."
              },
              "min_run": {
                "label": "Tramo mínimo",
                "description": "Número mínimo de vértices de entrada que debe abarcar una serie antes de colapsarse en un segmento (predeterminado 3). Las series más cortas se generan sin cambios."
              },
              "preserve_endpoints": {
                "label": "Conservar extremos",
                "description": "Conservar exactamente el primer y el último vértice de cada parte (predeterminado true)."
              }
            }
          },
          "simplify_shared_edges": {
            "name": "Simplificar bordes compartidos",
            "description": "Simplifica una cobertura de polígonos manteniendo coincidentes los límites compartidos entre polígonos adyacentes (sin huecos ni astillas), como Simplificar aristas compartidas de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo vectorial de polígonos de entrada, formato detectado automáticamente (o identificador en memoria)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según su extensión). Si se omite, se almacena en memoria."
              },
              "tolerance": {
                "label": "Tolerancia",
                "description": "Tolerancia de simplificación de Douglas-Peucker: la distancia máxima (en unidades CRS) que un arco simplificado puede desviarse del original. Predeterminado 1.0."
              },
              "simplify_boundary": {
                "label": "Simplificar límite",
                "description": "Simplificar también los arcos del límite exterior de la cobertura (aristas pertenecientes a un solo polígono). Predeterminado true; establecer en false para mantener el límite exterior sin cambios."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Cuantizar los vértices sobre una malla de este tamaño (unidades CRS) antes de construir la topología, de modo que los vértices compartidos casi coincidentes se traten como uno solo. Predeterminado 0 (usar las coordenadas exactamente)."
              }
            }
          },
          "slice_raster": {
            "name": "Segmentar ráster en clases",
            "description": "Clasifica un ráster continuo en N zonas ordinales (intervalo igual, área igual, cortes naturales, intervalo geométrico o desviación estándar).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster continuo de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional del ráster de zonas. Si se omite, se almacena en memoria."
              },
              "band": {
                "label": "Banda",
                "description": "Banda a clasificar, con índice desde 1 (predeterminado 1)."
              },
              "number_zones": {
                "label": "Número de zonas",
                "description": "Número de zonas de salida (predeterminado 10). Se ignora para std_dev."
              },
              "slice_type": {
                "label": "Tipo de corte",
                "description": "Método de clasificación: equal_interval, equal_area, natural_breaks, geometric_interval o std_dev (predeterminado equal_interval)."
              },
              "base_output_zone": {
                "label": "Zona base de salida",
                "description": "Identificador de zona asignado a la zona más baja (predeterminado 1)."
              },
              "class_interval_size": {
                "label": "Tamaño de intervalo de clase",
                "description": "Tamaño del intervalo de desviación estándar en unidades σ (predeterminado 1.0). Solo lo usa std_dev."
              }
            }
          },
          "smooth_natural_features": {
            "name": "Suavizar entidades naturales",
            "description": "Suaviza polígonos pixelados y líneas dentadas (salidas de ráster a vectorial) en curvas de aspecto natural mediante corte de esquinas de Chaikin, preservando el área de los polígonos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo vectorial de entrada con entidades de polígono o línea, formato detectado automáticamente (o identificador en memoria)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según su extensión). Si se omite, se almacena en memoria."
              },
              "segment_length": {
                "label": "Longitud de segmento",
                "description": "Escala del ruido en escalera que se va a eliminar, en unidades CRS — idealmente el tamaño de celda del ráster de origen. Si se omite, se detecta automáticamente a partir de la longitud mediana de las aristas de la capa."
              },
              "iterations": {
                "label": "Iteraciones",
                "description": "Iteraciones de suavizado de Chaikin (1-8); más iteraciones producen una salida más suave con más vértices. Predeterminado 3."
              },
              "preserve_area": {
                "label": "Conservar área",
                "description": "Restaurar el área original de cada polígono tras el suavizado (el recorte de esquinas encoge las formas convexas). Predeterminado true."
              }
            }
          },
          "smooth_shared_edges": {
            "name": "Suavizar bordes compartidos",
            "description": "Suaviza una cobertura de polígonos manteniendo coincidentes los límites compartidos entre polígonos adyacentes (sin huecos ni astillas), como Suavizar aristas compartidas de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo vectorial de polígonos de entrada, formato detectado automáticamente (o identificador en memoria)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según su extensión). Si se omite, se almacena en memoria."
              },
              "algorithm": {
                "label": "Algoritmo",
                "description": "Algoritmo de suavizado: 'paek' (kernel gaussiano, controlado por tolerancia; predeterminado) o 'bezier' (recorte de esquinas de Chaikin, ignora la tolerancia)."
              },
              "tolerance": {
                "label": "Tolerancia",
                "description": "Longitud de suavizado PAEK en unidades CRS: la ventana de longitud de arco sobre la que se promedian los vértices. Los valores mayores producen curvas más suaves. Predeterminado 1.0. El algoritmo 'bezier' lo ignora."
              },
              "smooth_boundary": {
                "label": "Suavizar límite",
                "description": "Suavizar también los arcos del límite exterior de la cobertura (aristas pertenecientes a un solo polígono). Predeterminado true; establecer en false para mantener el límite exterior sin cambios."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Cuantizar los vértices sobre una malla de este tamaño (unidades CRS) antes de construir la topología, de modo que los vértices compartidos casi coincidentes se traten como uno solo. Predeterminado 0 (usar las coordenadas exactamente)."
              }
            }
          },
          "snap_tracks": {
            "name": "Ajustar trayectos",
            "description": "Empareja trayectorias GPS con marca de tiempo sobre una red viaria con un programa dinámico de Viterbi (emisión = distancia de ajuste, transición = continuidad de ruta), de modo que las trayectorias emparejadas sigan una única ruta plausible en lugar de zigzaguear entre calles paralelas — como Ajustar trayectorias de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de puntos GPS de entrada con marcas de tiempo."
              },
              "network": {
                "label": "Red",
                "description": "Capa de líneas de la red viaria sobre la que ajustar."
              },
              "track_field": {
                "label": "Campo de trayectoria",
                "description": "Campo que identifica cada trayecto/objeto en movimiento."
              },
              "time_field": {
                "label": "Campo de tiempo",
                "description": "Campo que contiene la hora de cada punto (segundos numéricos o ISO-8601)."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de puntos ajustados de salida (controlador según la extensión). Si se omite, se almacena en memoria."
              },
              "search_distance": {
                "label": "Distancia de búsqueda",
                "description": "Radio de candidatos: solo se consideran las aristas de la red situadas a esta distancia de una posición. Obligatorio."
              },
              "max_candidates": {
                "label": "Candidatos máximos",
                "description": "Número máximo de aristas candidatas conservadas por posición (predeterminado 5)."
              }
            }
          },
          "solar_radiation": {
            "name": "Radiación solar",
            "description": "Radiación solar entrante (Wh/m²) sobre un DEM para un rango de fechas: directa + difusa, teniendo en cuenta pendiente/orientación, sombreado del horizonte y posición del sol a lo largo del tiempo — como Radiación solar de ráster de ArcGIS.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster de elevación de entrada (proyectado, en metros — la pendiente y el horizonte necesitan distancias reales)."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de radiación total de salida (Wh/m²). Si se omite, se almacena en memoria."
              },
              "direct_output": {
                "label": "Salida directa",
                "description": "Ráster de salida opcional para la componente de radiación directa (Wh/m²)."
              },
              "diffuse_output": {
                "label": "Salida difusa",
                "description": "Ráster de salida opcional para la componente de radiación difusa (Wh/m²)."
              },
              "start_day": {
                "label": "Día inicial",
                "description": "Primer día del año (1-365) o una fecha ISO (YYYY-MM-DD). Predeterminado 1."
              },
              "end_day": {
                "label": "Día final",
                "description": "Último día del año (1-365) o una fecha ISO. Predeterminado 365."
              },
              "day_interval": {
                "label": "Intervalo de días",
                "description": "Tomar una muestra cada tantos días a lo largo del rango (cada muestra representa ese número de días). Predeterminado: span/12 (unas 12 muestras)."
              },
              "time_step": {
                "label": "Paso de tiempo",
                "description": "Horas entre muestras de la posición del sol a lo largo de cada día. Predeterminado 0.5."
              },
              "latitude": {
                "label": "Latitud",
                "description": "Latitud en grados. Predeterminado: derivada del centro del DEM para EPSG:4326 / 3857."
              },
              "transmittivity": {
                "label": "Transmisividad",
                "description": "Transmisividad atmosférica (0-1) para una masa de aire unitaria. Predeterminado 0.6."
              },
              "diffuse_proportion": {
                "label": "Proporción difusa",
                "description": "Fracción de la irradiancia horizontal extraterrestre tratada como radiación difusa del cielo (0-1). Predeterminado 0.3."
              },
              "horizon_distance": {
                "label": "Distancia de horizonte",
                "description": "Longitud máxima del rayo de horizonte en celdas (limita el cálculo de sombras). Predeterminado 100."
              },
              "band": {
                "label": "Banda",
                "description": "Banda del DEM, con índice desde 1 (predeterminado 1)."
              }
            }
          },
          "sort_features": {
            "name": "Ordenar entidades",
            "description": "Reordena una capa vectorial por campos de atributos o a lo largo de una curva de llenado de espacio de Hilbert (ordenación espacial), como Ordenar de ArcGIS — la ordenación de Hilbert agrupa registros espacialmente cercanos para mejorar la poda en GeoParquet y la localidad en PMTiles.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Capa vectorial de salida en el nuevo orden. Si se omite, se almacena en memoria."
              },
              "method": {
                "label": "Método",
                "description": "'hilbert' (orden de curva espacial; predeterminado) o 'attribute' (según la lista 'fields')."
              },
              "fields": {
                "label": "Campos",
                "description": "modo attribute: campos separados por comas con dirección opcional, p. ej. 'pop:desc,name:asc'."
              },
              "index_field": {
                "label": "Campo de índice",
                "description": "Nombre de campo opcional para almacenar la distancia sobre la curva de Hilbert de cada entidad."
              }
            }
          },
          "space_time_kernel_density": {
            "name": "Densidad kernel espacio-temporal",
            "description": "Densidad de kernel espacio-temporal de puntos con marca de tiempo: una banda de densidad por rebanada temporal (un ráster multibanda) a partir de un kernel separable espacial (Epanechnikov/cuártico) × temporal (triangular/Epanechnikov), de modo que cada banda agrega puntos cercanos tanto en el espacio como en el tiempo, como Densidad de kernel espacio-temporal de ArcGIS. El compañero con conciencia temporal del heat_map 2D incluido.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos de entrada. Las geográficas (EPSG:4326/lon-lat sin etiquetar) usan metros de haversine; las proyectadas usan unidades CRS. Las geometrías que no son de puntos usan su primer vértice o vértice representativo."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster multibanda de salida (una banda por rebanada temporal; controlador según la extensión). Si se omite, se almacena en memoria."
              },
              "time_field": {
                "label": "Campo de tiempo",
                "description": "Campo que contiene el tiempo de cada punto: un campo numérico (en sus propias unidades) o una cadena de fecha/fecha-hora ISO-8601."
              },
              "time_step": {
                "label": "Paso de tiempo",
                "description": "Intervalo de rebanada: un número simple (time_field numérico) o una duración como '1w', '7d', '12h', '1M'. Predeterminado '1w'."
              },
              "temporal_bandwidth": {
                "label": "Ancho de banda temporal",
                "description": "Semiancho del kernel temporal, con las mismas unidades/sintaxis de duración que time_step. Predeterminado: igual a time_step."
              },
              "spatial_bandwidth": {
                "label": "Ancho de banda espacial",
                "description": "Radio del kernel espacial, en metros para entradas geográficas o en unidades CRS para las proyectadas. Predeterminado: extensión máxima / 20."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida en unidades CRS (grados para las geográficas). Predeterminado: extensión máxima / 200."
              },
              "weight_field": {
                "label": "Campo de peso",
                "description": "Campo numérico opcional que pondera cada punto. Predeterminado: cada punto cuenta como 1."
              },
              "spatial_kernel": {
                "label": "Kernel espacial",
                "description": "Forma del kernel espacial: 'epanechnikov' (predeterminado) o 'quartic'."
              },
              "temporal_kernel": {
                "label": "Kernel temporal",
                "description": "Forma del kernel temporal: 'triangular' (predeterminado) o 'epanechnikov'."
              },
              "epsg": {
                "label": "EPSG",
                "description": "EPSG con el que etiquetar el ráster de salida (predeterminado: el de la capa de entrada)."
              }
            }
          },
          "spatial_association_between_zones": {
            "name": "Asociación espacial entre zonas",
            "description": "Mide cuán fuertemente se corresponden dos rásteres categóricos de zonas mediante la medida V (homogeneidad/completitud) más puntuaciones de asociación por zona.",
            "params": {
              "zones1": {
                "label": "Zonas 1",
                "description": "Primer ráster categórico de zonas (p. ej. cobertura del suelo). Misma malla que zones2."
              },
              "zones2": {
                "label": "Zonas 2",
                "description": "Segundo ráster categórico de zonas (p. ej. ecorregiones) en la misma malla que zones1."
              },
              "output": {
                "label": "Salida",
                "description": "Tabla CSV opcional por clase de la zona 1 (clase, recuento, asociación, clase dominante de la zona 2 y su proporción). Las métricas globales siempre se devuelven en el resultado."
              },
              "band1": {
                "label": "Banda 1",
                "description": "Banda de zones1 a leer, con índice desde 1 (predeterminado 1)."
              },
              "band2": {
                "label": "Banda 2",
                "description": "Banda de zones2 a leer, con índice desde 1 (predeterminado 1)."
              }
            }
          },
          "spatial_eigenvector_filtering": {
            "name": "Filtrado por autovectores espaciales (MESF)",
            "description": "Genera autovectores de Moran (filtros espaciales) a partir de una matriz de pesos espaciales y añade las componentes autocorrelacionadas como campos de variables explicativas (MEV1, MEV2, …), como Descomponer estructura espacial / Crear variables explicativas de componente espacial de ArcGIS. Construye una matriz de conectividad simétrica (contigüidad o KNN simetrizado), la centra doblemente (M C M) y la descompone en autovalores con un solucionador cíclico de Jacobi en Rust puro; conserva los autovectores cuya I de Moran ≥ min_autocorrelation, ordenados de forma descendente y limitados a max_components.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada (puntos/líneas/polígonos; los métodos de contigüidad requieren polígonos)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta vectorial de salida — las entidades de entrada con los vectores propios conservados añadidos como MEV1, MEV2, …. Si se omite, se almacena en memoria."
              },
              "method": {
                "label": "Método",
                "description": "Conceptualización de las relaciones espaciales: 'contiguity_edges' (rook), 'contiguity_edges_corners' (queen) o 'knn' (simetrizado). Predeterminado 'contiguity_edges_corners'."
              },
              "number_of_neighbors": {
                "label": "Número de vecinos",
                "description": "Número de vecinos más próximos k para method = knn. Predeterminado 8."
              },
              "min_autocorrelation": {
                "label": "Autocorrelación mínima",
                "description": "I de Moran mínima que debe tener un vector propio para conservarse (autocorrelación espacial positiva). Predeterminado 0.25."
              },
              "max_components": {
                "label": "Componentes máximos",
                "description": "Número máximo de vectores propios a generar, tomados en orden descendente de la I de Moran. Predeterminado 15."
              }
            }
          },
          "spatial_outlier_detection": {
            "name": "Detección de valores atípicos espaciales",
            "description": "Puntúa los puntos por su factor de valor atípico local (LOF) — cuán aislado está cada punto respecto a la densidad local de sus k vecinos más cercanos — y marca los principales valores atípicos, como Detección de valores atípicos espaciales de ArcGIS. Cubre el hueco que deja la etiqueta binaria de ruido de DBSCAN.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de puntos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Puntos de salida con la puntuación LOF y el indicador de valor atípico. Si se omite, se almacena en memoria."
              },
              "neighbors": {
                "label": "Vecinos",
                "description": "Número de vecinos más próximos k (predeterminado 20)."
              },
              "percent_outlier": {
                "label": "Porcentaje de valores atípicos",
                "description": "Marcar como valores atípicos este porcentaje superior de puntos según el LOF (predeterminado 5). Se ignora si se establece 'threshold'."
              },
              "threshold": {
                "label": "Umbral",
                "description": "Corte explícito de LOF: los puntos con un LOF superior a este son valores atípicos (prevalece sobre percent_outlier)."
              }
            }
          },
          "spatially_constrained_multivariate_clustering": {
            "name": "Agrupamiento multivariante con restricción espacial",
            "description": "Particiona entidades en regiones espacialmente contiguas y homogéneas en atributos con el algoritmo SKATER (árbol de expansión mínimo sobre un grafo de contigüidad, cortado para maximizar la varianza entre clústeres), con restricciones opcionales de tamaño/balance. Cada clúster está conectado por construcción, a diferencia de multivariate_clustering. Como Agrupamiento multivariante con restricción espacial de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Entidades de polígono (o de punto) de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida para las entidades de entrada más un campo CLUSTER_ID. Si se omite, se almacena en memoria."
              },
              "analysis_fields": {
                "label": "Campos de análisis",
                "description": "Nombres de campos numéricos separados por comas o puntos y comas sobre los que agrupar."
              },
              "number_of_clusters": {
                "label": "Número de clústeres",
                "description": "Número objetivo de clústeres (predeterminado 5)."
              },
              "neighborhood": {
                "label": "Vecindad",
                "description": "'contiguity_edges' (rook, predeterminado), 'contiguity_edges_corners' (queen) o 'knn'."
              },
              "number_of_neighbors": {
                "label": "Número de vecinos",
                "description": "Número de vecinos para la vecindad 'knn' (predeterminado 8)."
              },
              "constraint": {
                "label": "Restricción",
                "description": "'none' (predeterminado), 'feature_count' o 'attribute_value'."
              },
              "constraint_field": {
                "label": "Campo de restricción",
                "description": "Campo que se suma por clúster cuando 'constraint' es 'attribute_value'."
              },
              "min_constraint": {
                "label": "Restricción mínima",
                "description": "Recuento mínimo de entidades o total del atributo por clúster; los cortes que lo incumplen se omiten."
              },
              "max_constraint": {
                "label": "Restricción máxima",
                "description": "Recuento máximo de entidades o total del atributo por clúster; los clústeres que lo superan se siguen dividiendo incluso más allá de 'number_of_clusters'."
              },
              "scale_data": {
                "label": "Escalar datos",
                "description": "Estandarizar en Z los campos de análisis antes de agrupar (predeterminado true)."
              },
              "output_table": {
                "label": "Tabla de salida",
                "description": "Ruta opcional para el resumen por clúster (medias, R cuadrado por variable, pseudo-F)."
              }
            }
          },
          "spectral_index": {
            "name": "Índice espectral",
            "description": "Calcula un índice espectral (NDVI, NDWI, NDBI, NBR, EVI, SAVI) a partir de un ráster multibanda.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster multibanda de entrada."
              },
              "index": {
                "label": "Índice",
                "description": "Índice a calcular: ndvi, ndwi, ndbi, nbr, evi o savi."
              },
              "red": {
                "label": "Rojo",
                "description": "Número de banda, con índice desde 1, para la banda roja."
              },
              "nir": {
                "label": "NIR",
                "description": "Número de banda, con índice desde 1, para la banda del infrarrojo cercano."
              },
              "green": {
                "label": "Verde",
                "description": "Número de banda, con índice desde 1, para la banda verde."
              },
              "blue": {
                "label": "Azul",
                "description": "Número de banda, con índice desde 1, para la banda azul."
              },
              "swir": {
                "label": "SWIR",
                "description": "Número de banda, con índice desde 1, para la banda del infrarrojo de onda corta."
              },
              "soil_factor": {
                "label": "Factor de suelo",
                "description": "Factor de ajuste del suelo L para SAVI (predeterminado 0.5)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del ráster de salida. Si se omite, el resultado se almacena en memoria."
              }
            }
          },
          "split_by_attributes": {
            "name": "Dividir por atributos",
            "description": "Divide una capa vectorial en un archivo de salida por cada valor único (o combinación) del campo o campos dados, como Dividir por atributos de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada."
              },
              "output_dir": {
                "label": "Directorio de salida",
                "description": "Directorio de salida; aquí se escribe un archivo por grupo (se crea si es necesario)."
              },
              "fields": {
                "label": "Campos",
                "description": "Nombre(s) de campo separados por comas por los que dividir (una clave de varios campos une los valores con '__')."
              },
              "format": {
                "label": "Formato",
                "description": "Extensión del formato de salida: geojson (predeterminado), fgb, parquet, shp."
              }
            }
          },
          "split_by_features": {
            "name": "Dividir por entidades",
            "description": "Recorta una capa de entrada contra cada zona de una capa de división poligonal, escribiendo un archivo de salida por cada valor distinto del campo de división. Las zonas que comparten un valor se disuelven primero, y las zonas vacías se omiten. Como Dividir (Análisis) de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Entidades a dividir (punto, línea o polígono)."
              },
              "split_features": {
                "label": "Dividir entidades",
                "description": "Capa de polígonos cuyas entidades definen las zonas de división."
              },
              "split_field": {
                "label": "Campo de división",
                "description": "Campo de 'split_features' que proporciona el nombre de cada salida."
              },
              "output_dir": {
                "label": "Directorio de salida",
                "description": "Directorio que recibe un archivo de salida por cada valor de división distinto."
              },
              "output_format": {
                "label": "Formato de salida",
                "description": "Extensión/controlador del archivo de salida: 'geojson' (predeterminado), 'shp', 'gpkg', 'parquet', 'csv'."
              }
            }
          },
          "split_line_at_point": {
            "name": "Dividir línea en un punto",
            "description": "Divide entidades de polilínea en las ubicaciones de entidades puntuales que caen dentro de un radio de búsqueda, insertando un nodo en cada punto ajustado y emitiendo una entidad por cada subsegmento resultante (atributos del padre conservados) — como Dividir línea en punto de ArcGIS.",
            "params": {
              "input_lines": {
                "label": "Líneas de entrada",
                "description": "Capa vectorial de polilíneas de entrada que se va a dividir."
              },
              "point_features": {
                "label": "Entidades de puntos",
                "description": "Capa vectorial de puntos (o multipuntos) cuyas ubicaciones definen los nodos de división."
              },
              "search_radius": {
                "label": "Radio de búsqueda",
                "description": "Distancia máxima, en las unidades CRS de las líneas, entre un punto y una línea para que el punto divida esa línea. Obligatorio, positivo."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de líneas de salida (controlador según la extensión). Si se omite, se almacena en memoria."
              }
            }
          },
          "split_raster": {
            "name": "Dividir ráster",
            "description": "Divide un ráster en teselas independientes por número de teselas, tamaño fijo en píxeles o entidades poligonales, con solape opcional en píxeles — como Dividir ráster de ArcGIS. Cada tesela conserva el CRS y la georreferenciación.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de entrada."
              },
              "output_dir": {
                "label": "Directorio de salida",
                "description": "Directorio de salida para los archivos de teselas (se crea si es necesario)."
              },
              "base_name": {
                "label": "Nombre base",
                "description": "Prefijo del nombre de archivo de salida (predeterminado 'tile')."
              },
              "split_method": {
                "label": "Método de división",
                "description": "'count' (malla N×M, predeterminado), 'size' (teselas de píxeles fijos) o 'polygons' (un recorte por entidad)."
              },
              "num_x": {
                "label": "Número en X",
                "description": "Número de columnas de teselas para 'count' (predeterminado 2)."
              },
              "num_y": {
                "label": "Número en Y",
                "description": "Número de filas de teselas para 'count' (predeterminado 2)."
              },
              "tile_size_x": {
                "label": "Tamaño de tesela X",
                "description": "Ancho de tesela en píxeles para 'size' (predeterminado 256)."
              },
              "tile_size_y": {
                "label": "Tamaño de tesela Y",
                "description": "Alto de tesela en píxeles para 'size' (predeterminado 256)."
              },
              "polygons": {
                "label": "Polígonos",
                "description": "Capa vectorial de polígonos para el modo 'polygons' (una tesela por entidad)."
              },
              "overlap": {
                "label": "Solape",
                "description": "Solape en píxeles añadido a cada tesela por todos los lados (predeterminado 0)."
              },
              "format": {
                "label": "Formato",
                "description": "Extensión/controlador del archivo de salida: 'tif' (predeterminado) o 'png'."
              }
            }
          },
          "stack_profile": {
            "name": "Perfil de pila",
            "description": "Muestrea varios rásteres de superficie a lo largo de la misma polilínea y emite una tabla en formato largo (LINE_ID, FIRST_DIST, FIRST_Z, SRC_ID, SRC_NAME) para que las superficies puedan compararse en sección transversal sobre un eje de distancia compartido. Como Perfil de pila de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Entidades de línea de entrada de las que obtener el perfil."
              },
              "surfaces": {
                "label": "Superficies",
                "description": "Lista de rutas de rásteres de superficie separadas por comas o puntos y comas, muestreadas en el orden indicado."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de la tabla de perfil de salida. Si se omite, se almacena en memoria."
              },
              "sample_distance": {
                "label": "Distancia de muestreo",
                "description": "Espaciado de estaciones en unidades del mapa (predeterminado: el tamaño de celda de entrada más fino)."
              },
              "line_id_field": {
                "label": "Campo de ID de línea",
                "description": "Campo opcional que proporciona LINE_ID; por defecto el índice de la entidad."
              },
              "method": {
                "label": "Método",
                "description": "Muestreo de la superficie: 'bilinear' (predeterminado) o 'nearest'."
              }
            }
          },
          "storage_capacity": {
            "name": "Capacidad de almacenamiento",
            "description": "Barre elevaciones de la superficie del agua sobre un DEM e informa del área de superficie inundada y del volumen de almacenamiento en cada nivel (la curva nivel-área-volumen) por zona de análisis o sobre todo el DEM, como Capacidad de almacenamiento de ArcGIS.",
            "params": {
              "dem": {
                "label": "DEM",
                "description": "Ráster DEM de entrada (elevaciones)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del CSV de salida (zone_id, level, elevation, area, volume)."
              },
              "zones": {
                "label": "Zonas",
                "description": "Capa de polígonos opcional; una curva de nivel-área-volumen por polígono. Si se omite, todo el DEM constituye una única zona."
              },
              "zone_id_field": {
                "label": "Campo de ID de zona",
                "description": "Campo que nombra cada zona en la salida (predeterminado: el índice de la entidad)."
              },
              "num_levels": {
                "label": "Número de niveles",
                "description": "Número de pasos de elevación entre el mínimo y el máximo de cada zona (predeterminado 20). Se ignora si se indica 'increment'."
              },
              "increment": {
                "label": "Incremento",
                "description": "Paso de elevación fijo entre niveles (unidades del mapa). Prevalece sobre 'num_levels'."
              },
              "min_elevation": {
                "label": "Elevación mínima",
                "description": "Límite inferior de elevación opcional para el barrido (predeterminado: el terreno mínimo de cada zona)."
              },
              "max_elevation": {
                "label": "Elevación máxima",
                "description": "Límite superior de elevación opcional para el barrido (predeterminado: el terreno máximo de cada zona)."
              },
              "band": {
                "label": "Banda",
                "description": "Banda del DEM, con índice desde 1 (predeterminado 1)."
              }
            }
          },
          "strip_map_index_features": {
            "name": "Entidades de índice de fajas",
            "description": "Recorre cada línea de entrada y emite una secuencia numerada de rectángulos de página rotados y solapados orientados según el rumbo local de la ruta, para atlas de mapas de franja a lo largo de una autopista, río, tubería o sendero — como Entidades de índice de mapa de franja de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de líneas de entrada que se va a indexar."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta vectorial de polígonos de salida con las páginas del índice (controlador según la extensión). Si se omite, se almacena en memoria."
              },
              "page_length": {
                "label": "Largo de página",
                "description": "Longitud de cada página a lo largo de la ruta, en unidades CRS. Obligatorio."
              },
              "page_width": {
                "label": "Ancho de página",
                "description": "Anchura de cada página en sentido transversal a la ruta, en unidades CRS. Obligatorio."
              },
              "overlap": {
                "label": "Solape",
                "description": "Fracción [0, 1) de page_length en la que se solapan las páginas consecutivas a lo largo de la ruta. Predeterminado 0."
              },
              "orientation": {
                "label": "Orientación",
                "description": "along_line (predeterminado): rota cada página según el rumbo de su cuerda local. horizontal/vertical: ajusta la rotación al eje este-oeste/norte-sur más próximo."
              },
              "start_page": {
                "label": "Página inicial",
                "description": "Primer número de página a asignar. Predeterminado 1."
              }
            }
          },
          "subdivide_polygon": {
            "name": "Subdividir polígono",
            "description": "Divide cada polígono en partes de igual área (un número fijo de partes o un área objetivo cada una) usando cortes paralelos rectos a un ángulo dado, como Subdividir polígono de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de polígonos de entrada (usar un CRS proyectado o de áreas iguales para obtener áreas realmente iguales)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de polígonos de salida (el controlador se deduce de la extensión). Si se omite, se almacena en memoria."
              },
              "method": {
                "label": "Método",
                "description": "'equal_parts' (num_parts franjas de igual área, predeterminado) o 'equal_areas' (franjas de target_area, con el resto en la última)."
              },
              "num_parts": {
                "label": "Número de partes",
                "description": "Número de partes de igual área (para method=equal_parts). Predeterminado 2."
              },
              "target_area": {
                "label": "Área objetivo",
                "description": "Área de cada parte en unidades CRS (obligatorio para method=equal_areas)."
              },
              "angle": {
                "label": "Ángulo",
                "description": "Orientación del corte en grados (0 = cortes verticales / franjas horizontales). Predeterminado 0."
              }
            }
          },
          "subset_features": {
            "name": "Subconjunto de entidades",
            "description": "Divide aleatoriamente una capa de entidades en un subconjunto de entrenamiento y su complemento (subconjunto de prueba), por porcentaje o número absoluto, usando un RNG determinista con semilla. Opcionalmente estratificado por un campo de grupo. Como Subconjunto de entidades de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada (cualquier tipo de geometría)."
              },
              "output_training": {
                "label": "Salida de entrenamiento",
                "description": "Ruta de salida del subconjunto de entrenamiento. Si se omite, se almacena en memoria."
              },
              "output_test": {
                "label": "Salida de prueba",
                "description": "Ruta de salida opcional para el subconjunto complementario (de prueba). Si se omite, el subconjunto de prueba se almacena en memoria."
              },
              "size": {
                "label": "Tamaño",
                "description": "Tamaño del subconjunto de entrenamiento: un porcentaje (0-100) o un recuento absoluto de entidades, según 'size_method' (predeterminado 50)."
              },
              "size_method": {
                "label": "Método de tamaño",
                "description": "'percentage' (predeterminado) o 'absolute'."
              },
              "seed": {
                "label": "Semilla",
                "description": "Semilla del generador de números aleatorios para una división reproducible (predeterminado: una constante fija)."
              },
              "group_field": {
                "label": "Campo de agrupación",
                "description": "Campo opcional por el que estratificar: cada grupo aporta su propia parte proporcional del subconjunto de entrenamiento."
              }
            }
          },
          "subset_multidimensional_raster": {
            "name": "Subconjunto de ráster multidimensional",
            "description": "Reduce un cubo ráster multidimensional a un subconjunto de sus rebanadas, por rango de coordenadas de dimensión, índices explícitos o un paso (Subconjunto de ráster multidimensional / Seleccionar por dimensión de ArcGIS). Todas las herramientas de cubos de la ronda 18 consumen un cubo completo, por lo que no había forma de analizar una ventana de estudio sin regenerar la entrada fuera del catálogo.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster multidimensional, o una lista separada por comas de rásteres corregistrados cuyas bandas se concatenan en un único cubo."
              },
              "dimension_values": {
                "label": "Valores de dimensión",
                "description": "Coordenadas opcionales estrictamente crecientes por rebanada (fechas, profundidades, longitudes de onda), una por rebanada. Obligatorias para 'dimension_range'."
              },
              "dimension": {
                "label": "Dimensión",
                "description": "Nombre de la dimensión, usado solo en los informes (predeterminado 'slice')."
              },
              "dimension_range": {
                "label": "Rango de dimensión",
                "description": "Rango de coordenadas inclusivo como 'min,max'. Requiere 'dimension_values'. Mutuamente excluyente con 'indices'."
              },
              "indices": {
                "label": "Índices",
                "description": "Índices de rebanada explícitos con base 0, p. ej. '0,2,5'. Mutuamente excluyente con 'dimension_range'."
              },
              "step": {
                "label": "Paso",
                "description": "Conservar una de cada N rebanadas tras aplicar los demás filtros (predeterminado 1)."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de cubo de salida, una banda por cada rebanada conservada. Si se omite, se almacena en memoria."
              }
            }
          },
          "summarize_categorical_raster": {
            "name": "Resumir ráster categórico",
            "description": "Tabula el número de celdas, el área y la proporción de cada clase de un ráster categórico, una fila por rebanada para pilas multibanda/multidimensionales, opcionalmente restringido a un área de interés (Resumir ráster categórico de ArcGIS). El raster_area incluido escribe los totales de clase de vuelta en celdas ráster en lugar de en una tabla y es solo monobanda, por lo que no puede producir la serie de área por clase y fecha que necesita el análisis de cambios de cobertura del suelo. El área de celda se integra por fila para rásteres geográficos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster categórico de entrada (de una o varias bandas)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de tabla de salida opcional. Si se omite, el resultado se almacena en memoria."
              },
              "aoi": {
                "label": "AOI",
                "description": "Capa de polígonos opcional que restringe el resumen a un área de interés."
              },
              "aoi_id_field": {
                "label": "Campo de ID de AOI",
                "description": "Campo de 'aoi' que identifica cada área; cuando se indica, el resumen se genera por cada entidad del AOI."
              },
              "area_units": {
                "label": "Unidades de área",
                "description": "Unidades de área: map_units (predeterminado), hectares o square_kilometers."
              },
              "include_nodata": {
                "label": "Incluir sin datos",
                "description": "Si es verdadero, NoData se informa como una fila de clase propia (predeterminado false)."
              },
              "bands": {
                "label": "Bandas",
                "description": "Lista de bandas separadas por comas, con índice desde 1, a resumir (predeterminado: todas las bandas)."
              }
            }
          },
          "summarize_nearby": {
            "name": "Resumir entidades cercanas",
            "description": "Crea buffers de las entidades de entrada a una o más distancias en línea recta y resume una segunda capa dentro de cada buffer: número de entidades, área intersecada (polígonos), longitud recortada (líneas) y suma/media ponderada por medida de campos numéricos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de entrada cuyas entidades se rodean con un búfer (puntos, líneas o polígonos), formato detectado automáticamente (o identificador en memoria)."
              },
              "summary_features": {
                "label": "Entidades de resumen",
                "description": "Capa vectorial a resumir dentro de cada búfer (los polígonos se resumen por área intersecada, las líneas por longitud recortada y los puntos por recuento)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según su extensión). Si se omite, se almacena en memoria."
              },
              "distances": {
                "label": "Distancias",
                "description": "Lista separada por comas de distancias de búfer en unidades CRS, p. ej. \"1000,2000,5000\". Se ordenan de forma ascendente; los duplicados y los valores no positivos se descartan."
              },
              "sum_fields": {
                "label": "Campos a sumar",
                "description": "Campos numéricos opcionales, separados por comas, de la capa de resumen que se van a agregar. Cada uno genera una columna sum_<field> y otra mean_<field> (ponderadas por área para los polígonos, por longitud para las líneas y simples para los puntos)."
              },
              "id_field": {
                "label": "Campo de ID",
                "description": "Campo opcional de la capa de entrada que identifica cada entidad de origen en la salida. Por defecto el índice de la entidad de entrada."
              }
            }
          },
          "summarize_percent_change": {
            "name": "Resumir cambio porcentual",
            "description": "Cuenta incidentes de un periodo actual y de un periodo anterior dentro de cada entidad de área e informa de la diferencia de conteo, el cambio porcentual y una clase de cambio. El cambio porcentual es nulo (clase «new») donde el conteo anterior es cero. Como Resumir cambio porcentual de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Entidades de área (sectores, secciones censales, celdas de malla) en las que resumir."
              },
              "current_features": {
                "label": "Entidades actuales",
                "description": "Entidades de punto de incidentes del periodo actual."
              },
              "previous_features": {
                "label": "Entidades anteriores",
                "description": "Entidades de punto de incidentes del periodo anterior."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida para las áreas con los campos de cambio. Si se omite, se almacena en memoria."
              },
              "search_radius": {
                "label": "Radio de búsqueda",
                "description": "Distancia opcional en unidades del mapa; los incidentes situados a esta distancia de un área también cuentan, no solo los que están dentro de ella. Tenga en cuenta que un radio positivo hace que las áreas de captación se solapen, por lo que un incidente puede ser contabilizado por más de un área (los totales del corpus que se informan siguen estando deduplicados)."
              }
            }
          },
          "summarize_within": {
            "name": "Resumir dentro de",
            "description": "Resume los atributos de una capa dentro de una capa de polígonos existente, ponderando las entidades parcialmente solapadas por área o longitud intersecada, como Resumir dentro de ArcGIS.",
            "params": {
              "polygons": {
                "label": "Polígonos",
                "description": "Capa de polígonos en la que resumir. Se conservan sus entidades y atributos."
              },
              "input": {
                "label": "Entrada",
                "description": "Capa que se resume (de puntos, líneas o polígonos)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional de los polígonos. Si se omite, el resultado se almacena en memoria."
              },
              "fields": {
                "label": "Campos",
                "description": "Pares 'field:statistic' separados por comas, p. ej. 'pop:sum,income:mean'. Estadísticos: sum, mean, min, max, stddev, count."
              },
              "keep_all": {
                "label": "Conservar todo",
                "description": "Conservar los polígonos sin entidades que los intersequen (predeterminado true). Cuando es false, los polígonos vacíos se descartan."
              },
              "shape_sum": {
                "label": "Suma de forma",
                "description": "Añadir el recuento / la longitud / el área sumados de la geometría de entrada intersecada (predeterminado true)."
              },
              "group_field": {
                "label": "Campo de agrupación",
                "description": "Campo opcional de la capa resumida; genera una fila de resumen agrupada por cada valor distinto."
              }
            }
          },
          "summary_statistics": {
            "name": "Estadísticas resumen",
            "description": "GROUP BY al estilo SQL sobre uno o más campos de caso: para cada combinación única de campos de caso, calcula una lista de agregados (campo, estadístico) (count/sum/mean/min/max/std/first/last) más un conteo de registros del grupo. La salida es una tabla de atributos pura. Sin campo de caso produce una única fila de total general (como Estadísticas de resumen de ArcGIS; solo conteo reproduce Frecuencia).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial o tabla de atributos de entrada que se va a agregar."
              },
              "statistics": {
                "label": "Estadísticas",
                "description": "Lista separada por puntos y comas o comas de pares 'field statistic' (también admite 'field:statistic'), p. ej. 'population sum; population mean; elev max'. Estadísticos: count, sum, mean, min, max, std, first, last."
              },
              "case_fields": {
                "label": "Campos de caso",
                "description": "Nombre(s) de campo de caso (GROUP BY) opcionales, separados por comas o puntos y comas. Si se omite, se genera una única fila de resumen sobre toda la tabla."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de tabla de salida opcional (controlador según su extensión; GeoParquet o CSV). Si se omite, la tabla se almacena en memoria. Columnas: los campos de caso, un 'count' de registros y, a continuación, una columna '<field>_<statistic>' por cada par solicitado."
              }
            }
          },
          "sun_shadow_volume": {
            "name": "Volumen de sombra solar",
            "description": "Extruye sólidos 3D a lo largo del vector solar hasta el suelo para producir sólidos cerrados de volumen de sombra para una fecha y hora dadas (Volumen de sombra solar de ArcGIS). shadow_image, shadow_animation y time_in_daylight trabajan todos sobre un DSM ráster y emiten rásteres, y solar_radiation calcula irradiancia — ninguno produce geometría de sombra, por lo que preguntas como «¿está sombreada esta ventana?» o «¿cuánto del espacio aéreo de esta parcela está en sombra?» no pueden responderse. La salida se compone con inside_3d, intersect_3d y union_3d.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Sólidos de edificios 3D o huellas extruidas (MultiPolygons de malla triangular con Z)."
              },
              "output": {
                "label": "Salida",
                "description": "Sólidos cerrados de volumen de sombra. Si se omite, se almacena en memoria."
              },
              "datetime": {
                "label": "Fecha y hora",
                "description": "Fecha y hora locales de la posición del sol como 'YYYY-MM-DDTHH:MM' o 'YYYY-MM-DD HH:MM'. Se toma como parámetro, nunca de un reloj, de modo que los resultados son reproducibles."
              },
              "latitude": {
                "label": "Latitud",
                "description": "Latitud en grados, utilizada para la geometría solar. Obligatoria: no puede derivarse sin un motor de proyección."
              },
              "utc_offset": {
                "label": "Desfase UTC",
                "description": "Horas de diferencia con UTC de la hora local proporcionada (predeterminado 0)."
              },
              "adjusted_for_dst": {
                "label": "Ajustado por horario de verano",
                "description": "Tratar la hora proporcionada como ajustada al horario de verano, restando una hora antes del cálculo solar (predeterminado false), igual que ArcGIS."
              },
              "ground_elevation": {
                "label": "Elevación del suelo",
                "description": "Z constante del suelo sobre la que se proyecta la sombra. Predeterminado: la Z mínima propia de cada entidad."
              },
              "max_length": {
                "label": "Longitud máxima",
                "description": "Límite de la distancia de barrido en unidades CRS, para que un sol bajo no produzca un prisma de kilómetros de longitud. Predeterminado: sin límite."
              }
            }
          },
          "surface_difference": {
            "name": "Diferencia de superficies",
            "description": "Delinea dónde una superficie está por encima, por debajo o al nivel de otra como polígonos, cada uno con su clase, área, volumen y estadísticas de diferencia (Diferencia de superficie de ArcGIS). cut_fill mide las mismas magnitudes pero emite solo un ráster de etiquetas de región y un CSV, por lo que sus regiones no tienen geometría que superponer, recortar o unir; surface_volume y polygon_volume miden contra un plano o dentro de polígonos que ya se tienen en lugar de descubrirlos.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de superficie a clasificar."
              },
              "reference": {
                "label": "Referencia",
                "description": "Superficie de referencia: la ruta de un ráster corregistrado o una elevación constante con la que comparar frente a un datum plano."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de polígonos de salida con las regiones clasificadas. Si se omite, se almacena en memoria."
              },
              "output_raster": {
                "label": "Ráster de salida",
                "description": "Ráster de salida con la diferencia con signo (entrada menos referencia). Siempre se produce; se almacena en memoria cuando no se indica ninguna ruta."
              },
              "tolerance": {
                "label": "Tolerancia",
                "description": "Las diferencias que estén dentro de este margen respecto a cero se consideran coincidentes (predeterminado 0.0)."
              },
              "min_area": {
                "label": "Área mínima",
                "description": "Descartar las regiones menores que esta área, en unidades del mapa al cuadrado."
              },
              "include_coincident": {
                "label": "Incluir coincidentes",
                "description": "Generar también polígonos para la clase sin cambios (predeterminado false). Desactivado por defecto porque en la mayoría de las escenas se trata de un único polígono de fondo enorme."
              },
              "band": {
                "label": "Banda",
                "description": "Banda de la superficie de entrada, con índice desde 1 (predeterminado 1)."
              },
              "reference_band": {
                "label": "Banda de referencia",
                "description": "Banda de la superficie de referencia, con índice desde 1 (predeterminado 1)."
              }
            }
          },
          "surface_parameters": {
            "name": "Parámetros de superficie",
            "description": "Pendiente, orientación o curvatura (media/perfil/tangencial/planta/gaussiana/casorati/torsión geodésica de contorno) a partir de un DEM mediante un ajuste local de superficie cuadrática/bicuadrática por mínimos cuadrados sobre una distancia de vecindad elegida, como Parámetros de superficie de ArcGIS — la contraparte adaptativa a la escala de las herramientas de terreno 3×3 fijas incluidas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de elevación (DEM) de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del ráster de salida opcional. Si se omite, se almacena en memoria."
              },
              "parameter": {
                "label": "Parámetro",
                "description": "Parámetro a calcular: slope (predeterminado), aspect, mean_curvature, profile_curvature, tangential_curvature, plan_curvature, gaussian_curvature, casorati_curvature, contour_geodesic_torsion."
              },
              "fit": {
                "label": "Ajuste",
                "description": "Modelo de superficie: 'quadratic' (de 6 términos, predeterminado) o 'biquadratic' (de 9 términos)."
              },
              "neighborhood_distance": {
                "label": "Distancia de vecindad",
                "description": "Radio de vecindad en unidades del mapa (predeterminado = un tamaño de celda, es decir, una ventana de 3×3)."
              },
              "neighborhood_type": {
                "label": "Tipo de vecindad",
                "description": "'fixed' (predeterminado) usa el radio completo en todas partes; 'adaptive' reduce la ventana a 1 celda junto a los huecos de datos o los bordes."
              },
              "band": {
                "label": "Banda",
                "description": "Banda (con índice desde 1) que se lee (predeterminado 1)."
              }
            }
          },
          "surface_volume": {
            "name": "Volumen de superficie",
            "description": "Integra un ráster de superficie contra un plano de referencia horizontal, informando del área 2D, el área de superficie 3D y el volumen de la porción por encima y/o por debajo del plano (como Volumen de superficie de ArcGIS). Corte/relleno de movimientos de tierra y análisis de capacidad de embalses.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de superficie de elevación de entrada."
              },
              "reference_plane": {
                "label": "Plano de referencia",
                "description": "Elevación del plano de referencia respecto al que integrar (predeterminado 0)."
              },
              "direction": {
                "label": "Dirección",
                "description": "Lado del plano que se va a integrar: 'above', 'below' o 'both' (predeterminado 'above')."
              },
              "band": {
                "label": "Banda",
                "description": "Banda (con índice desde 1) que se lee (predeterminado 1)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta CSV de salida opcional para la tabla de resultados. Si se omite, los resultados solo se devuelven en el resultado de la ejecución."
              }
            }
          },
          "table_to_geometry": {
            "name": "Tabla a geometría",
            "description": "Construye entidades de líneas o elipses a partir de campos tabulares: pares de coordenadas inicio/fin (XY a línea), origen + rumbo + distancia (Rumbo y distancia a línea) o centro + eje mayor/menor + acimut (Tabla a elipse) — con construcción de líneas planas, geodésicas y loxodrómicas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Tabla de atributos o capa vectorial de puntos de entrada."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según su extensión). Si se omite, se almacena en memoria."
              },
              "mode": {
                "label": "Modo",
                "description": "'xy_to_line', 'bearing_distance' o 'ellipse'."
              },
              "line_type": {
                "label": "Tipo de línea",
                "description": "'geodesic' (predeterminado, la ruta más corta sobre el elipsoide WGS84), 'rhumb' (rumbo constante) o 'planar' (segmentos cartesianos rectos en las unidades propias de la entrada)."
              },
              "vertex_spacing": {
                "label": "Espaciado de vértices",
                "description": "Espaciado de densificación para las líneas curvas (geodesic/rhumb) y espaciado de muestreo del contorno de la elipse, en metros para geodesic/rhumb o en unidades CRS para planar. Predeterminado: un número fijo de segmentos."
              },
              "polygon_output": {
                "label": "Salida de polígonos",
                "description": "solo para mode=ellipse: genera un Polygon relleno en lugar de un contorno de línea cerrado. Predeterminado false."
              },
              "start_x": {
                "label": "X inicial",
                "description": "mode=xy_to_line: campo que contiene la X / longitud inicial."
              },
              "start_y": {
                "label": "Y inicial",
                "description": "mode=xy_to_line: campo que contiene la Y / latitud inicial."
              },
              "end_x": {
                "label": "X final",
                "description": "mode=xy_to_line: campo que contiene la X / longitud final."
              },
              "end_y": {
                "label": "Y final",
                "description": "mode=xy_to_line: campo que contiene la Y / latitud final."
              },
              "x": {
                "label": "X",
                "description": "mode=bearing_distance/ellipse: campo que contiene la X / longitud del origen o centro."
              },
              "y": {
                "label": "Y",
                "description": "mode=bearing_distance/ellipse: campo que contiene la Y / latitud del origen o centro."
              },
              "bearing": {
                "label": "Rumbo",
                "description": "mode=bearing_distance: campo que contiene el rumbo en grados en sentido horario desde el norte."
              },
              "distance": {
                "label": "Distancia",
                "description": "mode=bearing_distance: campo que contiene la distancia de recorrido (metros para geodesic/rhumb, unidades CRS para planar)."
              },
              "major": {
                "label": "Mayor",
                "description": "mode=ellipse: campo que contiene la longitud del semieje mayor (metros para geodesic/rhumb, unidades CRS para planar)."
              },
              "minor": {
                "label": "Menor",
                "description": "mode=ellipse: campo que contiene la longitud del semieje menor (las mismas unidades que el mayor)."
              },
              "azimuth": {
                "label": "Acimut",
                "description": "mode=ellipse: campo que contiene la dirección del eje mayor en grados en sentido horario desde el norte."
              }
            }
          },
          "tabulate_intersection": {
            "name": "Tabular intersección",
            "description": "Resumen zonal vectorial sobre vectorial: reparte una capa de clases (polígonos por área, líneas por longitud intersecada o puntos por conteo) entre polígonos de zona, informando de la medida intersecada, el porcentaje de la zona y campos de suma ponderada por medida.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de polígonos de zonas, formato detectado automáticamente (o identificador en memoria)."
              },
              "class_features": {
                "label": "Entidades de clase",
                "description": "Capa vectorial de clases que se repartirá entre las zonas (los polígonos se resumen por área, las líneas por longitud intersecada y los puntos por recuento)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según su extensión). Si se omite, se almacena en memoria."
              },
              "class_field": {
                "label": "Campo de clase",
                "description": "Campo categórico opcional de la capa de clases; los resultados se agrupan por zona x este valor. Omitir para tratar todas las entidades de clase como una sola clase."
              },
              "sum_fields": {
                "label": "Campos a sumar",
                "description": "Campos numéricos opcionales, separados por comas, de la capa de clases que se repartirán en cada zona (ponderados por área para los polígonos, por longitud para las líneas y sumados para los puntos)."
              },
              "zone_field": {
                "label": "Campo de zona",
                "description": "Campo opcional que identifica cada zona en la salida. Por defecto el índice de la entidad de zona."
              }
            }
          },
          "thin_road_network": {
            "name": "Adelgazar la red viaria",
            "description": "Generaliza una red viaria para visualización a pequeña escala: oculta carreteras cortas de baja jerarquía preservando la conectividad, marcando cada carretera como visible/adelgazada (no destructivo) como Adelgazar red viaria de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial de carreteras (líneas) de entrada, con formato detectado automáticamente (o identificador en memoria)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según su extensión). Si se omite, se almacena en memoria."
              },
              "min_length": {
                "label": "Longitud mínima",
                "description": "Las vías más cortas que este valor (unidades CRS) son candidatas a eliminarse por adelgazamiento. Las vías más largas siempre se conservan."
              },
              "hierarchy_field": {
                "label": "Campo de jerarquía",
                "description": "Campo numérico opcional de clase de vía; un valor menor = más importante (se conserva durante más tiempo). Las candidatas se adelgazan empezando por el número de clase más alto."
              },
              "visibility_field": {
                "label": "Campo de visibilidad",
                "description": "Nombre del campo indicador de visibilidad de salida (1 = conservada, 0 = eliminada). Predeterminado 'visible'."
              },
              "keep_only": {
                "label": "Conservar solo",
                "description": "Si es verdadero, genera solo las vías visibles en lugar de marcarlas todas. Predeterminado false (no destructivo)."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Distancia dentro de la cual los extremos de las carreteras se tratan como el mismo cruce. Predeterminado 1e-6."
              }
            }
          },
          "tile_grid_polygons": {
            "name": "Polígonos de cuadrícula de teselas",
            "description": "Emite los límites de teselas de mapas web como polígonos para un nivel de zoom (o rango) y una extensión, cada uno con z/x/y y su quadkey (Esquema de teselado de caché de servidor de mapas a polígonos, Crear índice de teselas vectoriales, Generar esquema de teselado de caché de teselas de ArcGIS). Las herramientas de malla rectangular/hexagonal incluidas construyen mallas arbitrarias en el CRS de entrada y no pueden coincidir con el quadtree de WebMercator que usan las herramientas PMTiles y raster_to_tiles.",
            "params": {
              "zoom": {
                "label": "Zoom",
                "description": "Nivel de zoom. Usar junto con 'max_zoom' para generar una pirámide de niveles."
              },
              "max_zoom": {
                "label": "Zoom máximo",
                "description": "Zoom máximo opcional; cuando se indica, se generan todos los niveles desde 'zoom' hasta 'max_zoom'."
              },
              "extent": {
                "label": "Extensión",
                "description": "Capa ráster o vectorial opcional cuyos límites recortan la malla. Sin ella, se cubre todo el mundo en ese nivel de zoom (sujeto a 'max_tiles')."
              },
              "bbox": {
                "label": "Cuadro delimitador",
                "description": "Extensión explícita opcional como 'min_lon,min_lat,max_lon,max_lat' en grados. Prevalece sobre 'extent'."
              },
              "scheme": {
                "label": "Esquema",
                "description": "'xyz' (predeterminado, Google/OSM, y se cuenta hacia abajo desde el norte) o 'tms' (y se cuenta hacia arriba desde el sur)."
              },
              "output_crs": {
                "label": "CRS de salida",
                "description": "'EPSG:3857' (predeterminado, teselas cuadradas) o 'EPSG:4326' (cuadriláteros lon/lat)."
              },
              "max_tiles": {
                "label": "Teselas máximas",
                "description": "Límite estricto del número de teselas (predeterminado 1000000); superarlo produce un error que indica el recuento calculado."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de polígonos de salida. Si se omite, se almacena en memoria."
              }
            }
          },
          "time_series_clustering": {
            "name": "Agrupamiento de series temporales",
            "description": "Agrupa las celdas de un cubo espacio-temporal H3 por la similitud de sus series temporales (valor, perfil normalizado en z o correlación) con k-medoids determinista, de modo que los lugares que evolucionan de forma parecida se agrupen, como Agrupamiento de series temporales de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de puntos de entrada en EPSG:4326 (lon/lat) con un campo de marca de tiempo."
              },
              "time_field": {
                "label": "Campo de tiempo",
                "description": "Campo de marca de tiempo (numérico o fecha/fecha-hora ISO-8601)."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de polígonos H3 de salida con cluster_id/is_medoid. Si se omite, se almacena en memoria."
              },
              "num_clusters": {
                "label": "Número de clústeres",
                "description": "Número de clústeres k (predeterminado 4)."
              },
              "characteristic": {
                "label": "Característica",
                "description": "Distancia de series temporales: 'value' (sin procesar), 'profile' (normalizada en z, predeterminado) o 'correlation' (1 − r)."
              },
              "time_step": {
                "label": "Paso de tiempo",
                "description": "Anchura de un paso temporal: un número simple (time_field numérico) o una duración como '1w', '7d', '12h'. Predeterminado '1w'."
              },
              "value_field": {
                "label": "Campo de valor",
                "description": "Campo numérico opcional que se suma en cada intervalo. Predeterminado: el recuento de puntos por intervalo."
              },
              "resolution": {
                "label": "Resolución",
                "description": "Resolución H3 de 0 (la más gruesa) a 15 (la más fina); predeterminado 7 (celdas de ~5 km²)."
              },
              "seed": {
                "label": "Semilla",
                "description": "Semilla aleatoria para una inicialización reproducible de los medoides (predeterminado 1)."
              }
            }
          },
          "time_series_cross_correlation": {
            "name": "Correlación cruzada de series temporales",
            "description": "Correlación cruzada con retardo por celda entre dos pilas ráster espacio-temporales alineadas (como Correlación cruzada de series temporales / Correlación de ráster multidimensional de ArcGIS): para cada celda, opcionalmente elimina tendencia/estacionalidad, luego correlaciona la serie A con la serie B a través de min_lag..=max_lag e informa del mejor retardo y su correlación de Pearson, más una correlación opcional de retardo 0 y un pseudovalor p de tamaño de muestra efectivo de Pyper-Peterman. El complemento de dos variables y consciente del retardo de las herramientas de cubo de serie única generate_trend_raster / change_point_detection — nada de lo incluido relaciona dos variables a lo largo del tiempo.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Pila A: un ráster multibanda (una banda por paso temporal) O una lista separada por comas de rutas de rásteres monobanda corregistrados en orden temporal."
              },
              "secondary": {
                "label": "Secundario",
                "description": "Pila B: la misma forma y longitud que 'input' (ráster multibanda o lista de rásteres monobanda separada por comas)."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de salida con el mejor retardo (retardo entero que maximiza |correlación|). Si se omite, se almacena en memoria."
              },
              "corr_output": {
                "label": "Salida de correlación",
                "description": "Ráster de salida opcional con la correlación de Pearson (con signo) en el mejor retardo."
              },
              "corr0_output": {
                "label": "Salida de correlación 0",
                "description": "Ráster de salida opcional con la correlación en el retardo 0 (contemporánea)."
              },
              "pvalue_output": {
                "label": "Salida de valor p",
                "description": "Ráster de salida opcional con un pseudovalor p bilateral en el mejor retardo (tamaño de muestra efectivo de Pyper-Peterman + z de Fisher)."
              },
              "min_lag": {
                "label": "Retardo mínimo",
                "description": "Retardo mínimo en pasos temporales (predeterminado -6). A[t] se empareja con B[t+lag]."
              },
              "max_lag": {
                "label": "Retardo máximo",
                "description": "Retardo máximo en pasos temporales (predeterminado 6). Debe ser >= min_lag."
              },
              "detrend": {
                "label": "Eliminar tendencia",
                "description": "Si es verdadero, resta una tendencia lineal OLS por serie antes de correlacionar (predeterminado false)."
              },
              "deseasonalize": {
                "label": "Eliminar estacionalidad",
                "description": "Si es verdadero, resta un ciclo estacional aditivo por serie de periodo 'season_length' antes de correlacionar (predeterminado false)."
              },
              "season_length": {
                "label": "Longitud de la estación",
                "description": "Periodo estacional (en pasos temporales) usado cuando 'deseasonalize' es verdadero (predeterminado 12)."
              },
              "min_valid": {
                "label": "Mínimo válido",
                "description": "Número mínimo de pares válidos solapados necesarios para correlacionar en un retardo (predeterminado 5)."
              },
              "band": {
                "label": "Banda",
                "description": "Banda que se lee cuando una pila se indica como lista de rásteres monobanda separada por comas, con índice desde 1 (predeterminado 1). Se ignora en pilas multibanda."
              }
            }
          },
          "time_series_forecast": {
            "name": "Pronóstico de series temporales",
            "description": "Pronóstico por ubicación sobre un cubo espacio-temporal H3 (como Suavizado exponencial / Pronóstico por ajuste de curva de ArcGIS): pronostica la serie de cada celda hacia adelante mediante suavizado exponencial de Holt o ajustes de curva polinómica, eligiendo por celda el modelo con menor RMSE de reserva, con pronósticos del paso siguiente/final y una semianchura de confianza del 90 %. El pronóstico temporal que el trend_surface espacial incluido no puede hacer.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de puntos de entrada con eventos con marca de tiempo (long./lat.)."
              },
              "time_field": {
                "label": "Campo de tiempo",
                "description": "Campo que contiene la hora de cada punto: un número o una marca de tiempo ISO-8601."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de polígonos H3 de salida con los atributos de pronóstico. Si se omite, se almacena en memoria."
              },
              "value_field": {
                "label": "Campo de valor",
                "description": "Campo numérico que se agrega por celda (predeterminado: recuento de puntos)."
              },
              "steps": {
                "label": "Pasos",
                "description": "Número de pasos temporales que se pronostican hacia delante (predeterminado 3)."
              },
              "model": {
                "label": "Modelo",
                "description": "'auto' (el menor RMSE de validación; predeterminado), 'exp_smoothing', 'linear' o 'parabolic'."
              },
              "holdout": {
                "label": "Reserva de validación",
                "description": "Pasos temporales reservados para validar o seleccionar el modelo (predeterminado 3)."
              },
              "time_step": {
                "label": "Paso de tiempo",
                "description": "Amplitud de un paso temporal en las unidades de time_field (predeterminado 1)."
              },
              "resolution": {
                "label": "Resolución",
                "description": "Resolución H3 0..15 (predeterminado 7)."
              }
            }
          },
          "time_series_smoothing": {
            "name": "Suavizado de series temporales",
            "description": "Suaviza una serie temporal dentro de la muestra por ubicación (como Suavizado de series temporales de ArcGIS): agrupa entidades por id_field, ordena cada grupo por time_field y añade un valor suavizado mediante una media móvil hacia atrás/centrada/hacia adelante o una pasada local-lineal con ancho de banda adaptativo (LOESS). La geometría y todos los atributos originales se conservan. Complementa a time_series_forecast, que proyecta hacia adelante en lugar de suavizar la serie observada.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de entidades de entrada con observaciones marcadas con la hora."
              },
              "value_field": {
                "label": "Campo de valor",
                "description": "Campo numérico cuya serie se suaviza."
              },
              "time_field": {
                "label": "Campo de tiempo",
                "description": "Campo que ordena cada serie: un número o una marca de tiempo ISO-8601."
              },
              "id_field": {
                "label": "Campo de ID",
                "description": "Campo que identifica cada ubicación/serie. Si se omite, todas las entidades forman una sola serie."
              },
              "method": {
                "label": "Método",
                "description": "'moving_average' (predeterminado) o 'local_linear' (LOESS con ancho de banda adaptativo)."
              },
              "window": {
                "label": "Ventana",
                "description": "moving_average: número de puntos de la ventana de promediado (predeterminado 3)."
              },
              "bandwidth": {
                "label": "Ancho de banda",
                "description": "local_linear: número de puntos más próximos en el tiempo usados en cada ajuste local (predeterminado 5)."
              },
              "alignment": {
                "label": "Alineación",
                "description": "Colocación de la ventana de moving_average: 'backward', 'centered' (predeterminado) o 'forward'."
              },
              "output_field": {
                "label": "Campo de salida",
                "description": "Nombre del campo suavizado que se añade (predeterminado 'smoothed')."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de la capa de salida. Si se omite, se almacena en memoria."
              }
            }
          },
          "topo_to_raster": {
            "name": "Topo a ráster",
            "description": "Interpola un DEM hidrológicamente correcto a partir de curvas de nivel, puntos de cota y líneas de cauces opcionales mediante una relajación de curvatura mínima (placa delgada) con imposición de drenaje — como De topografía a ráster (ANUDEM) de ArcGIS. A diferencia de los interpoladores IDW/TIN/spline incluidos, no aterraza las curvas de nivel y elimina las depresiones cerradas espurias.",
            "params": {
              "contours": {
                "label": "Curvas de nivel",
                "description": "Capa vectorial de curvas de nivel de entrada (la elevación se lee de elevation_field). Se requiere al menos una de las dos: contours o points."
              },
              "points": {
                "label": "Puntos",
                "description": "Capa vectorial de puntos de cota de entrada (la elevación se lee de elevation_field)."
              },
              "streams": {
                "label": "Cauces",
                "description": "Capa vectorial de líneas de cauces opcional usada para forzar el drenaje (se incrusta en la superficie antes de eliminar los sumideros)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional del ráster DEM (el controlador se deduce de la extensión). Si se omite, se almacena en memoria."
              },
              "elevation_field": {
                "label": "Campo de elevación",
                "description": "Nombre del campo numérico de elevación en las capas de curvas de nivel y de puntos. Predeterminado: detección automática (HEIGHT/ELEV/ELEVATION/Z; en su defecto, el primer campo numérico)."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida en unidades del CRS. Predeterminado: dimensionado para que el eje más largo de la malla tenga ~400 celdas."
              },
              "tension": {
                "label": "Tensión",
                "description": "Rigidez de la superficie en [0,1]: 0 = placa delgada pura (lo más suave), 1 = membrana tensa. Predeterminado 0.35."
              },
              "iterations": {
                "label": "Iteraciones",
                "description": "Número máximo de iteraciones SOR (predeterminado 2000). La iteración se detiene antes cuando el cambio máximo por celda cae por debajo de la tolerancia."
              },
              "tolerance": {
                "label": "Tolerancia",
                "description": "Tolerancia de convergencia: se detiene cuando el mayor cambio por celda en una iteración está por debajo de este valor (unidades de elevación del CRS). Predeterminado 0.01."
              },
              "enforce_drainage": {
                "label": "Forzar drenaje",
                "description": "Eliminar los sumideros interiores espurios tras la interpolación para que el DEM drene hacia sus bordes (predeterminado true)."
              },
              "stream_burn": {
                "label": "Grabado de cauces",
                "description": "Profundidad (unidades de elevación) a la que se rebajan las celdas de cauce antes de eliminar los sumideros, para encauzar el flujo por ellas. Predeterminado 0 (automático = el 1 % del relieve cuando se proporcionan cauces)."
              }
            }
          },
          "trace_proximity_events": {
            "name": "Rastrear eventos de proximidad",
            "description": "Encuentra intervalos en los que dos trayectorias móviles estuvieron dentro de una distancia entre sí durante al menos una duración mínima (eventos de proximidad), y opcionalmente traza contactos transitivos aguas abajo desde entidades semilla, como Trazar eventos de proximidad de ArcGIS.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de puntos con marca de tiempo (use un CRS proyectado; las distancias están en unidades del mapa)."
              },
              "track_field": {
                "label": "Campo de trayectoria",
                "description": "Campo que identifica cada entidad móvil / trayectoria."
              },
              "time_field": {
                "label": "Campo de tiempo",
                "description": "Campo de marca de tiempo (segundos numéricos o ISO-8601)."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de líneas de eventos de proximidad de salida. Si se omite, se almacena en memoria."
              },
              "search_distance": {
                "label": "Distancia de búsqueda",
                "description": "Separación máxima para que dos trayectorias estén 'en proximidad' (unidades del mapa)."
              },
              "min_duration": {
                "label": "Duración mínima",
                "description": "Tiempo mínimo en proximidad para que se considere un evento: segundos o una duración como '5m', '1h' (predeterminado 0)."
              },
              "entities": {
                "label": "Entidades",
                "description": "Identificadores de trayectoria semilla separados por comas, opcionales, desde los que se rastrean los contactos posteriores (rastreo de contactos)."
              },
              "depth": {
                "label": "Profundidad",
                "description": "Número máximo de generaciones de rastreo a partir de las semillas (predeterminado: sin límite)."
              }
            }
          },
          "transform_features": {
            "name": "Transformar entidades",
            "description": "Aplica una transformación afín (desplazamiento, rotación en torno a un ancla, escala por eje, reflejo) a cada geometría de una capa vectorial.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo vectorial de entrada, formato detectado automáticamente (o identificador en memoria)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según su extensión). Si se omite, se almacena en memoria."
              },
              "dx": {
                "label": "Dx",
                "description": "Desplazamiento aplicado a X después del escalado, la reflexión y la rotación, en unidades del CRS. Predeterminado 0."
              },
              "dy": {
                "label": "Dy",
                "description": "Desplazamiento aplicado a Y después del escalado, la reflexión y la rotación, en unidades del CRS. Predeterminado 0."
              },
              "angle": {
                "label": "Ángulo",
                "description": "Rotación en sentido antihorario alrededor del ancla, en grados. Predeterminado 0."
              },
              "scale_x": {
                "label": "Escala X",
                "description": "Factor de escala respecto al ancla a lo largo de X. Predeterminado 1."
              },
              "scale_y": {
                "label": "Escala Y",
                "description": "Factor de escala respecto al ancla a lo largo de Y. Predeterminado 1."
              },
              "mirror_axis": {
                "label": "Eje de reflejo",
                "description": "Reflejar a través del ancla: NONE (predeterminado), X (invierte Y respecto al eje horizontal) o Y (invierte X respecto al eje vertical)."
              },
              "anchor": {
                "label": "Ancla",
                "description": "Pivote para el escalado, la reflexión y la rotación: CENTROID (centro del rectángulo delimitador, predeterminado), ORIGIN (0,0) o XY (usa anchor_x/anchor_y)."
              },
              "anchor_x": {
                "label": "Ancla X",
                "description": "Coordenada X del ancla; obligatoria cuando anchor=XY."
              },
              "anchor_y": {
                "label": "Ancla Y",
                "description": "Coordenada Y del ancla; obligatoria cuando anchor=XY."
              }
            }
          },
          "transform_fields": {
            "name": "Transformar campos",
            "description": "Estandariza, transforma y codifica campos de atributos (como Estandarizar/Transformar/Codificar campo de ArcGIS): puntuación z, mín-máx, robusta, log/log1p/sqrt/boxcox/inversa, agrupación por intervalo igual/cuantil/desviación estándar y codificación one-hot.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial (o tabla) de entrada con los campos que se van a transformar."
              },
              "fields": {
                "label": "Campos",
                "description": "Nombres de campo separados por comas que se transforman; se aplica la misma transformación a cada uno."
              },
              "transform": {
                "label": "Transformación",
                "description": "Transformación que se aplica: zscore, minmax, robust, log, log1p, sqrt, boxcox, inverse, bin, onehot."
              },
              "output": {
                "label": "Salida",
                "description": "Capa vectorial de salida con los campos transformados añadidos. Si se omite, se almacena en memoria."
              },
              "bins": {
                "label": "Intervalos",
                "description": "Número de clases para 'bin' (predeterminado 5)."
              },
              "bin_method": {
                "label": "Método de intervalos",
                "description": "Método de clasificación para 'bin': equal_interval (predeterminado), quantile o std_dev."
              },
              "boxcox_lambda": {
                "label": "Lambda de Box-Cox",
                "description": "Lambda fija para 'boxcox'; si se omite, se ajusta por máxima verosimilitud (búsqueda por sección áurea)."
              },
              "suffix": {
                "label": "Sufijo",
                "description": "Sufijo del nombre del campo de salida (el valor predeterminado depende de la transformación, p. ej. '_z' para zscore)."
              },
              "drop_input": {
                "label": "Descartar entrada",
                "description": "Si es verdadero, elimina el campo o los campos originales de la salida tras transformarlos (predeterminado false)."
              }
            }
          },
          "transform_route_events": {
            "name": "Transformar eventos de ruta",
            "description": "Vuelve a referenciar eventos puntuales medidos contra un sistema de rutas de origen sobre un sistema de rutas de destino: recupera el XY de cada evento a partir de su ruta y medida de origen, y luego lo reubica sobre la ruta de destino más cercana dentro de una tolerancia de clúster, emitiendo el ID de ruta y la medida de destino — como Transformar eventos de ruta de ArcGIS.",
            "params": {
              "source_events": {
                "label": "Eventos de origen",
                "description": "Capa de eventos puntuales de entrada. Cada entidad lleva un identificador de ruta (route_id_field) y una medida (measure_field)."
              },
              "source_routes": {
                "label": "Rutas de origen",
                "description": "Sistema de rutas de origen: capa de líneas cuyas entidades se identifican mediante route_id_field. Las medidas son la distancia desde el primer vértice de cada ruta."
              },
              "target_routes": {
                "label": "Rutas de destino",
                "description": "Sistema de rutas de destino: capa de líneas a la que se reubican los eventos. Los identificadores de ruta proceden de target_id_field."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de puntos de salida (el controlador se deduce de la extensión). Si se omite, el resultado se almacena en memoria."
              },
              "route_id_field": {
                "label": "Campo de ID de ruta",
                "description": "Campo que da nombre al identificador de ruta en source_events y source_routes (predeterminado 'route_id'). Si el campo no existe, se usa el índice de entidad de la ruta de origen."
              },
              "measure_field": {
                "label": "Campo de medida",
                "description": "Campo numérico de source_events que contiene la medida del sistema de origen (predeterminado 'measure')."
              },
              "target_id_field": {
                "label": "Campo de ID de destino",
                "description": "Campo que da nombre al identificador de ruta en target_routes (predeterminado: el mismo que route_id_field). Si el campo no existe, se usa el índice de entidad de la ruta de destino."
              },
              "cluster_tolerance": {
                "label": "Tolerancia de clúster",
                "description": "Distancia XY máxima (unidades del CRS) desde la ubicación recuperada del evento hasta una ruta de destino para que el evento se transfiera. 0 o su omisión significan que no hay límite (siempre se ajusta a la ruta de destino más próxima)."
              }
            }
          },
          "transpose_fields": {
            "name": "Trasponer campos",
            "description": "Remodela una tabla de atributos ancha a formato largo: cada columna de valores listada se convierte en su propia fila, etiquetada con la columna de la que procede (Transponer campos de ArcGIS). pivot_table solo va de largo a ancho, por lo que las tablas que llegan con una columna por periodo no podían alimentar las herramientas de series temporales que necesitan una fila por observación.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa vectorial o tabla de entrada."
              },
              "transpose_fields": {
                "label": "Trasponer campos",
                "description": "Columnas de valores que se despivotan, separadas por comas o punto y coma."
              },
              "value_field": {
                "label": "Campo de valor",
                "description": "Nombre de la columna de salida que contiene el valor de la celda (predeterminado 'VALUE')."
              },
              "transposed_field": {
                "label": "Campo transpuesto",
                "description": "Nombre de la columna de salida que contiene el nombre de la columna de origen (predeterminado 'FIELD')."
              },
              "field_labels": {
                "label": "Etiquetas de campo",
                "description": "Etiquetas opcionales que se escriben en 'transposed_field' en lugar de los nombres de columna originales, p. ej. '2000,2010,2020'. Deben tener la misma longitud que 'transpose_fields'."
              },
              "retain_fields": {
                "label": "Campos a conservar",
                "description": "Atributos que se copian en todas las filas de salida. Por defecto, todos los campos no traspuestos."
              },
              "drop_nulls": {
                "label": "Descartar nulos",
                "description": "Omitir las filas de salida cuyo valor sea nulo (predeterminado false)."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de salida. Si se omite, se almacena en memoria."
              }
            }
          },
          "trim_line": {
            "name": "Recortar línea",
            "description": "Elimina segmentos de línea colgantes cortos (sobrepasos y espolones) más cortos que una tolerancia de longitud, conservando las intersecciones verdaderas y las líneas largas.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo vectorial de líneas de entrada, formato detectado automáticamente (o identificador en memoria)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta opcional del vectorial de salida (controlador según su extensión). Si se omite, se almacena en memoria."
              },
              "dangle_length": {
                "label": "Longitud de extremo colgante",
                "description": "Tolerancia de longitud en unidades del CRS. Un segmento suelto más corto que este valor se recorta; los sueltos más largos se conservan. Debe ser positiva."
              },
              "keep_short": {
                "label": "Conservar cortos",
                "description": "Cuando es verdadero (predeterminado), los segmentos cortos que no están conectados por ninguno de sus extremos (aislados) se conservan; cuando es falso, también se eliminan. Los segmentos sueltos por exactamente un extremo siempre se recortan si son cortos."
              },
              "snap_tolerance": {
                "label": "Tolerancia de ajuste",
                "description": "Los extremos situados a menos de esta distancia (unidades del CRS) se consideran el mismo nodo. Predeterminado 1e-6."
              }
            }
          },
          "union_3d": {
            "name": "Unión 3D",
            "description": "Calcula el volumen combinado de sólidos 3D cerrados solapados sin contar dos veces sus intersecciones, más los volúmenes de solape por par (Unión 3D de ArcGIS). Ningún registro tiene superposición 3D, por lo que sumar cápsulas de buffer_3d o envolventes de minimum_bounding_volume cuenta hoy dos veces cada solape; polygon_volume y surface_volume solo miden contra un plano de referencia. Los volúmenes por sólido son exactos (suma de tetraedros con signo); la unión se estima por ocupación de vóxeles a una resolución informada.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Entidades sólidas 3D cerradas (MultiPolygons de malla de triángulos con Z, como los que generan buffer_3d y minimum_bounding_volume)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional de la tabla de volúmenes por grupo. Si se omite, se almacena en memoria."
              },
              "group_field": {
                "label": "Campo de agrupación",
                "description": "Campo opcional; los sólidos se unen dentro de cada valor de grupo en lugar de en toda la capa."
              },
              "output_overlap_table": {
                "label": "Tabla de solapes de salida",
                "description": "Ruta opcional para los volúmenes de solape por pares. Si se omite, se almacena en memoria (se sigue devolviendo)."
              },
              "resolution": {
                "label": "Resolución",
                "description": "Muestras de vóxel por eje usadas para estimar el volumen de la unión, de 4 a 512 (predeterminado 96). Un valor mayor es más exacto y más lento."
              }
            }
          },
          "unwrap_phase": {
            "name": "Desenvolver fase",
            "description": "Convierte la fase interferométrica enrollada en (-pi, pi] en un campo absoluto continuo mediante mínimos cuadrados ponderados, resuelto con gradiente conjugado precondicionado, con ponderación y enmascarado por coherencia opcionales (Desenrollar fase de ArcGIS). Nada en ninguno de los registros desenrolla la fase — raster_calculator no puede expresar la resolución global y los filtros de speckle incluidos suavizan en lugar de desenrollar — por lo que la salida de fase de sar_coherence y flatten_interferogram no tienen actualmente un punto final continuo.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de fase envuelta en radianes, o un interferograma I/Q de dos bandas."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de fase continua desenvuelta. Si se omite, se almacena en memoria."
              },
              "method": {
                "label": "Método",
                "description": "'least_squares_pcg' (predeterminado), que se corresponde con el método que admite ArcGIS."
              },
              "coherence": {
                "label": "Coherencia",
                "description": "Ráster de coherencia corregistrado opcional usado como pesos por arista en la resolución, de modo que los píxeles de baja coherencia influyan menos en la solución."
              },
              "coherence_threshold": {
                "label": "Umbral de coherencia",
                "description": "Enmascarar los píxeles cuya coherencia esté por debajo de este valor (predeterminado 0.3). Se ignora si no se proporciona ningún ráster de coherencia. Un enmascaramiento que divida los píxeles válidos en componentes desconectados deja a cada componente distinto del que contiene el píxel de referencia con su propia constante aditiva arbitraria."
              },
              "max_iterations": {
                "label": "Iteraciones máximas",
                "description": "Límite de iteraciones de PCG (predeterminado 500)."
              },
              "tolerance": {
                "label": "Tolerancia",
                "description": "Residuo relativo en el que se detiene la resolución (predeterminado 1e-8)."
              },
              "reference_row": {
                "label": "Fila de referencia",
                "description": "Fila del píxel fijado a cero, que determina la constante aditiva de la solución. Predeterminado: el primer píxel válido."
              },
              "reference_col": {
                "label": "Columna de referencia",
                "description": "Columna del píxel fijado. Predeterminado: el primer píxel válido."
              },
              "band": {
                "label": "Banda",
                "description": "Banda que contiene la fase, con índice desde 1. Omítala para un ráster de fase monobanda o un interferograma I/Q de dos bandas (que se detecta automáticamente); indíquela para leer la fase real de una banda concreta de una pila multibanda. Un ráster con más de dos bandas REQUIERE este parámetro, porque tres o más bandas no forman un par I/Q y adivinar devolvería una fase plausible pero incorrecta."
              }
            }
          },
          "validate_flow_direction": {
            "name": "Validar dirección de flujo",
            "description": "Informa de las celdas que hacen inutilizable un ráster de dirección de flujo — códigos que no son direcciones D8, celdas interiores sin salida, flujo hacia sin datos, flujo fuera del borde y celdas en una trayectoria de flujo circular — como una capa de puntos de problemas (Validar dirección de flujo de ArcGIS). La suite de hidrología incluida consume rásteres de punteros en todas partes (d8_flow_accumulation, watershed, basins, trace_downslope_flowpaths) pero nada valida uno, por lo que un ráster dañado por remuestreo, reclasificación o recorte produce una respuesta incorrecta plausible en lugar de un error, y un bucle de enrutamiento puede colgarse.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de dirección de flujo (puntero) que se va a comprobar."
              },
              "output": {
                "label": "Salida",
                "description": "Capa de puntos de salida, un punto por cada celda problemática. Si se omite, se almacena en memoria."
              },
              "flow_direction_type": {
                "label": "Tipo de dirección de flujo",
                "description": "'d8' (predeterminado) para códigos únicos de potencia de dos, o 'mfd' cuando un valor puede ser la suma de varias direcciones."
              },
              "report_edge_outflow": {
                "label": "Informar salida de flujo por el borde",
                "description": "Notificar las celdas cuyo flujo sale del ráster (predeterminado false). Es normal en un límite real, pero un defecto auténtico en un interior recortado."
              },
              "check_circular": {
                "label": "Comprobar circularidad",
                "description": "Detectar trayectorias de flujo circulares (predeterminado true)."
              },
              "band": {
                "label": "Banda",
                "description": "Banda que contiene las direcciones, con índice desde 1 (predeterminado 1)."
              }
            }
          },
          "vector_convert": {
            "name": "Convertir vectorial",
            "description": "Convierte un conjunto de datos vectorial a otro formato (la extensión de salida elige el controlador).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo vectorial de entrada (formato detectado automáticamente) o identificador en memoria."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida; el controlador se deduce de su extensión (.geojson, .fgb, .shp, .gpkg, .parquet, ...). Si se omite, la capa se almacena en memoria."
              }
            }
          },
          "vector_to_h3": {
            "name": "Vectorial a celdas H3",
            "description": "Agrupa una capa vectorial en celdas de la malla global discreta H3, contando las entidades por celda.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo vectorial de entrada (debe ser geográfico, longitud/latitud, EPSG:4326) o identificador en memoria."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del vectorial de salida; el controlador se deduce de su extensión (.geojson, .fgb, .parquet, ...). Si se omite, la capa se almacena en memoria."
              },
              "resolution": {
                "label": "Resolución",
                "description": "Resolución H3 de 0 (la más gruesa) a 15 (la más fina); predeterminado 8 (celdas de ~0,7 km²)."
              }
            }
          },
          "vector_to_pmtiles": {
            "name": "Vectorial a PMTiles",
            "description": "Empaqueta una capa vectorial en un único archivo PMTiles (pirámide de teselas vectoriales Mapbox).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo vectorial de entrada (GeoJSON, Shapefile, GeoPackage, FlatGeobuf, GeoParquet, ...)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del archivo PMTiles de salida (p. ej. /work/roads.pmtiles)."
              },
              "min_zoom": {
                "label": "Zoom mínimo",
                "description": "Nivel de zoom mínimo (predeterminado 0)."
              },
              "max_zoom": {
                "label": "Zoom máximo",
                "description": "Nivel de zoom máximo (predeterminado 14, máximo 18)."
              },
              "layer_name": {
                "label": "Nombre de capa",
                "description": "Nombre de la capa dentro de las teselas, usado al aplicar estilos (predeterminado: el nombre de la capa de entrada)."
              },
              "simplify": {
                "label": "Simplificar",
                "description": "Simplificar las geometrías en cada nivel de zoom (predeterminado true)."
              },
              "drop_rate": {
                "label": "Tasa de descarte",
                "description": "Ritmo al que se descartan entidades en los zooms bajos, como en tippecanoe (predeterminado: no se descarta ninguna)."
              }
            }
          },
          "voxel_isosurface": {
            "name": "Isosuperficie de vóxeles",
            "description": "Extrae una isosuperficie triangulada en uno o más valores umbral a partir de un campo de vóxeles 3D mediante tetraedros marchantes (Exportar isosuperficie de vóxel de ArcGIS). Toda la suite de curvas de nivel de ambos registros es 2D — líneas a partir de un plano; esto es el análogo volumétrico, que convierte la salida de idw_3d o de un ráster multidimensional en geometría renderizable. Emite la convención de malla triangular usada por buffer_3d y minimum_bounding_volume, de modo que los resultados alimentan directamente a inside_3d.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Campo de vóxeles como ráster multibanda: la banda k es la rebanada Z en z_min + k * z_spacing."
              },
              "values": {
                "label": "Valores",
                "description": "Valor o valores de umbral: un número, una matriz JSON de números o una cadena separada por comas. Una superficie por valor."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional para las superficies de malla de triángulos. Si se omite, se almacena en memoria."
              },
              "z_min": {
                "label": "Z mínimo",
                "description": "Coordenada Z de la primera rebanada (predeterminado 0)."
              },
              "z_spacing": {
                "label": "Espaciado Z",
                "description": "Separación vertical entre rebanadas (predeterminado 1)."
              },
              "close_boundaries": {
                "label": "Cerrar límites",
                "description": "Cerrar las superficies donde se encuentran con el borde del volumen para que el resultado delimite un sólido cerrado (predeterminado true). Se implementa recorriendo una capa adicional por debajo de la isosuperficie, de modo que la tapa queda soldada a la superficie; se sitúa entre el plano del límite y una celda más allá de él. Esto sella únicamente las caras EXTERIORES: las celdas que tocan zonas sin datos interiores se omiten, de manera que una bolsa sin datos que interseque la superficie extraída sigue dejando un borde abierto (una que quede totalmente dentro o fuera del contorno nunca llega a tocar la malla)."
              },
              "smooth": {
                "label": "Suavizar",
                "description": "Iteraciones de suavizado laplaciano aplicadas a la malla extraída (predeterminado 0)."
              }
            }
          },
          "warp_raster": {
            "name": "Deformar ráster",
            "description": "Georreferencia un ráster a partir de puntos de control terrestre (como Deformar de ArcGIS): ajusta un polinomio de orden 1/2/3 a partir de pares GCP píxel de origen → coordenada del mundo y remuestrea en una nueva malla georreferenciada (vecino más próximo/bilineal), informando de los residuos por GCP y del error RMS. La mitad ráster de la historia de conflación que rubbersheet_features vectorial ya cubre.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ráster de entrada (su malla de píxeles es el espacio de coordenadas de origen)."
              },
              "gcps": {
                "label": "Puntos de control terrestre",
                "description": "Puntos de control terrestre como cuartetos 'col,row,x,y' separados por ';' (>= 3 para el orden 1, 6 para el orden 2, 10 para el orden 3)."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster georreferenciado de salida. Si se omite, se almacena en memoria."
              },
              "transform": {
                "label": "Transformación",
                "description": "Orden del polinomio: 'poly1' (afín; predeterminado), 'poly2' o 'poly3'."
              },
              "resampling": {
                "label": "Remuestreo",
                "description": "'nearest' (predeterminado) o 'bilinear'."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida en unidades del mundo (predeterminado: el ancho de la entrada proyectado sobre la extensión de destino)."
              },
              "epsg": {
                "label": "EPSG",
                "description": "Código EPSG con el que se etiqueta el CRS de salida (opcional)."
              },
              "band": {
                "label": "Banda",
                "description": "Banda que se deforma, con índice desde 1 (predeterminado 1)."
              }
            }
          },
          "weighted_voronoi": {
            "name": "Voronoi ponderado",
            "description": "Ráster de asignación de Voronoi ponderado (áreas de mercado/dominancia): asigna cada celda al sitio con la menor distancia ponderada — multiplicativa (d/w, Apolonio), aditiva (d-w) o de potencia (d²-w²) — como Generar Voronoi ponderado de ArcGIS. La versión de sitios desiguales del voronoi_diagram no ponderado incluido.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Capa de puntos de entrada con los sitios."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de asignación de salida (índice del sitio con base 1 en cada celda). Si se omite, se almacena en memoria."
              },
              "weight_field": {
                "label": "Campo de peso",
                "description": "Campo numérico que indica el peso/atractivo de cada sitio (predeterminado: todos los sitios con peso 1)."
              },
              "weight_type": {
                "label": "Tipo de peso",
                "description": "'multiplicative' (d/w; predeterminado), 'additive' (d-w) o 'power' (d²-w²)."
              },
              "cell_size": {
                "label": "Tamaño de celda",
                "description": "Tamaño de celda de salida en unidades del CRS (predeterminado: la extensión / 400)."
              },
              "margin": {
                "label": "Margen",
                "description": "Fracción de la extensión de los sitios con la que se amplía el ráster (predeterminado 0.1)."
              },
              "epsg": {
                "label": "EPSG",
                "description": "EPSG con el que se etiqueta la salida (predeterminado: el de la capa de entrada)."
              }
            }
          },
          "write_geoparquet": {
            "name": "Escribir GeoParquet",
            "description": "Convierte un conjunto de datos vectorial (GeoJSON, Shapefile, FlatGeobuf, GeoPackage, ...) a GeoParquet, ordenado por Hilbert y comprimido con ZSTD por defecto.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo vectorial de entrada (formato detectado automáticamente) o identificador en memoria."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del archivo GeoParquet de salida (p. ej. /work/data.parquet)."
              },
              "compression": {
                "label": "Compresión",
                "description": "Compresión de columnas: zstd (predeterminado), snappy, gzip o uncompressed."
              },
              "hilbert_sort": {
                "label": "Ordenación de Hilbert",
                "description": "Ordenar las entidades a lo largo de una curva de Hilbert para favorecer la localidad espacial (predeterminado true)."
              }
            }
          },
          "write_pmtiles": {
            "name": "Ráster a PMTiles",
            "description": "Renderiza un ráster en un único archivo PMTiles (pirámide de teselas PNG en Web Mercator).",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Ruta del archivo ráster de entrada. Debe tener un CRS de origen (EPSG o WKT)."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del archivo PMTiles de salida (p. ej. /work/dem.pmtiles)."
              },
              "min_zoom": {
                "label": "Zoom mínimo",
                "description": "Nivel de zoom mínimo (predeterminado: un único zoom nativo que se corresponde con la resolución del ráster)."
              },
              "max_zoom": {
                "label": "Zoom máximo",
                "description": "Nivel de zoom máximo (predeterminado: el mismo que min_zoom)."
              },
              "band": {
                "label": "Banda",
                "description": "Banda que se representa, con índice desde 1 (predeterminado 1)."
              },
              "colormap": {
                "label": "Mapa de colores",
                "description": "Mapa de color: viridis (predeterminado), magma, turbo, terrain o grayscale."
              },
              "method": {
                "label": "Método",
                "description": "Método de remuestreo: bilinear (predeterminado), nearest, cubic."
              },
              "min": {
                "label": "Mínimo",
                "description": "Valor asignado al extremo inferior del mapa de color (predeterminado: el mínimo de la banda)."
              },
              "max": {
                "label": "Máximo",
                "description": "Valor asignado al extremo superior del mapa de color (predeterminado: el máximo de la banda)."
              }
            }
          },
          "zonal_characterization": {
            "name": "Caracterización zonal",
            "description": "Calcula estadísticas de varios rásteres de valores sobre un ráster de zonas en una sola pasada, con un estadístico por ráster y percentiles arbitrarios, como Caracterización zonal de ArcGIS.",
            "params": {
              "zones": {
                "label": "Zonas",
                "description": "Ráster de zonas; cada valor distinto define una zona."
              },
              "rasters": {
                "label": "Rásteres",
                "description": "Entradas 'path:statistic[:name]' separadas por comas, p. ej. 'dem.tif:mean,ndvi.tif:median'. Los rásteres de valores usan la banda 1. Estadísticos: mean, sum, min, max, range, stddev, median, majority, minority, variety, count, percentile."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta de salida opcional de la tabla de estadísticas. Si se omite, se almacena en memoria."
              },
              "percentile": {
                "label": "Percentil",
                "description": "Percentil (0-100) que se aplica a cualquier ráster cuyo estadístico sea 'percentile' (predeterminado 50)."
              },
              "zone_band": {
                "label": "Banda de zonas",
                "description": "Banda que se lee del ráster de zonas, con índice desde 1 (predeterminado 1)."
              },
              "ignore_nodata": {
                "label": "Ignorar sin datos",
                "description": "Omitir las celdas sin datos de los rásteres de valores (predeterminado true). Cuando es falso, cualquier valor sin datos en una zona hace que el estadístico de esa zona sea nulo."
              }
            }
          },
          "zonal_fill": {
            "name": "Relleno zonal",
            "description": "Rellena cada zona de un ráster categórico con el valor mínimo de un ráster de pesos encontrado a lo largo del límite de esa zona (como Relleno zonal de ArcGIS) — un bloque de construcción de superficies restringidas ausente en la suite incluida (fill se basa en flujo, zonal_statistics solo resume).",
            "params": {
              "zones": {
                "label": "Zonas",
                "description": "Ráster de zonas categórico (cada valor entero distinto es una zona)."
              },
              "weight": {
                "label": "Peso",
                "description": "Ráster de pesos corregistrado cuyo mínimo en el límite rellena cada zona."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de salida. Si se omite, se almacena en memoria."
              }
            }
          },
          "zonal_geometry": {
            "name": "Geometría zonal",
            "description": "Medidas geométricas por zona a partir de un ráster categórico de zonas (como Geometría zonal de ArcGIS): área, perímetro, espesor, centroide y eje mayor/menor + orientación de la elipse de desviación estándar — la contraparte de forma de zona que zonal_statistics y zonal_histogram incluidos, basados en valores, no proporcionan.",
            "params": {
              "zones": {
                "label": "Zonas",
                "description": "Ráster de zonas categórico (cada valor entero distinto es una zona)."
              },
              "output": {
                "label": "Salida",
                "description": "Ráster de salida (modo ráster) o ruta CSV (modo as_table). Si se omite, se almacena en memoria o solo se devuelve en el resultado."
              },
              "measure": {
                "label": "Medida",
                "description": "Medida en modo ráster: 'area' (predeterminado), 'perimeter', 'thickness', 'centroid_x', 'centroid_y', 'major_axis', 'minor_axis' u 'orientation'."
              },
              "as_table": {
                "label": "Como tabla",
                "description": "Cuando es verdadero, genera una fila por zona con todas las medidas en lugar de un ráster por celda (predeterminado false)."
              }
            }
          },
          "zonal_histogram": {
            "name": "Histograma zonal",
            "description": "Tabula la distribución de las celdas de un ráster de valores dentro de cada zona: conteos de clase (categórico) o frecuencias por intervalos (continuo), como una tabla cruzada zonas × clases.",
            "params": {
              "zones": {
                "label": "Zonas",
                "description": "Ruta del archivo ráster de zonas (identificadores de zona enteros/categóricos)."
              },
              "value": {
                "label": "Valor",
                "description": "Ruta del archivo ráster de valores; debe compartir la malla de 'zones'."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del CSV de salida: una fila por zona, una columna por clase o intervalo."
              },
              "mode": {
                "label": "Modo",
                "description": "'classes' (predeterminado) trata cada valor redondeado como una clase propia, para rásteres de valores enteros/categóricos. 'bins' agrupa los valores continuos en intervalos de igual anchura."
              },
              "bins": {
                "label": "Intervalos",
                "description": "Número de intervalos de igual anchura para el modo 'bins'. Predeterminado 10."
              },
              "percent": {
                "label": "Porcentaje",
                "description": "Generar el porcentaje que representa cada clase sobre las celdas válidas de la zona en lugar de recuentos de celdas brutos. Predeterminado false."
              },
              "zone_band": {
                "label": "Banda de zonas",
                "description": "Banda que se lee de 'zones', con índice desde 1. Predeterminado 1."
              },
              "value_band": {
                "label": "Banda de valores",
                "description": "Banda que se lee de 'value', con índice desde 1. Predeterminado 1."
              },
              "long_output": {
                "label": "Salida larga",
                "description": "Ruta CSV opcional para la variante en formato largo (zone,class,count,percent)."
              }
            }
          },
          "extract_cog_subset": {
            "name": "Extraer subconjunto COG",
            "description": "Extrae un subconjunto por cuadro delimitador de un GeoTIFF optimizado para la nube local o HTTP.",
            "params": {
              "input": {
                "label": "Entrada",
                "description": "Archivo COG local. Proporcione input o url."
              },
              "url": {
                "label": "URL",
                "description": "URL COG HTTP(S). Proporcione url o input; las fuentes HTTP usan solicitudes de rango de bytes."
              },
              "bbox": {
                "label": "Cuadro delimitador",
                "description": "Rectángulo delimitador como minX,minY,maxX,maxY en bbox_crs."
              },
              "bbox_crs": {
                "label": "CRS del cuadro delimitador",
                "description": "Código EPSG de las coordenadas del rectángulo delimitador."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del COG de salida."
              },
              "level": {
                "label": "Nivel",
                "description": "Nivel de vista general del COG que se lee; 0 es la resolución completa."
              },
              "resolution": {
                "label": "Resolución",
                "description": "Tamaño de píxel de salida objetivo. Usa las unidades de output_crs cuando output_crs está definido; en caso contrario, las de bbox_crs. Selecciona la vista general del COG más próxima cuando se omite level."
              },
              "output_crs": {
                "label": "CRS de salida",
                "description": "Código EPSG de salida opcional. Cuando se establece, el subconjunto se reproyecta a este CRS. Para los CRS de origen que no pueden escribirse como metadatos EPSG, el valor predeterminado es bbox_crs."
              },
              "nodata": {
                "label": "Sin datos",
                "description": "Valor NoData de salida opcional. Se usa como relleno en la reproyección y se escribe como metadato NoData de la salida."
              }
            }
          },
          "extract_wms_subset": {
            "name": "Extraer subconjunto WMS",
            "description": "Solicita un subconjunto por cuadro delimitador a un punto final GetMap de WMS y lo escribe como un COG con compresión Deflate.",
            "params": {
              "url": {
                "label": "URL",
                "description": "URL del punto de acceso WMS."
              },
              "layers": {
                "label": "Capas",
                "description": "Nombre o nombres de capa WMS, separados por comas."
              },
              "styles": {
                "label": "Estilos",
                "description": "Nombre o nombres de estilo WMS, separados por comas. Por defecto está vacío."
              },
              "bbox": {
                "label": "Cuadro delimitador",
                "description": "Rectángulo delimitador como minX,minY,maxX,maxY en bbox_crs."
              },
              "bbox_crs": {
                "label": "CRS del cuadro delimitador",
                "description": "Código EPSG de las coordenadas del rectángulo delimitador."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del COG de salida."
              },
              "resolution": {
                "label": "Resolución",
                "description": "Tamaño de píxel de salida objetivo en unidades de output_crs cuando output_crs está definido; en caso contrario, en unidades de bbox_crs."
              },
              "width": {
                "label": "Ancho",
                "description": "Ancho de la solicitud de salida en píxeles. Se usa cuando se omite resolution."
              },
              "height": {
                "label": "Altura",
                "description": "Alto de la solicitud de salida en píxeles. Se usa cuando se omite resolution."
              },
              "output_crs": {
                "label": "CRS de salida",
                "description": "Código EPSG de salida o de solicitud opcional. Predeterminado: bbox_crs."
              },
              "format": {
                "label": "Formato",
                "description": "Formato de imagen WMS. Predeterminado: image/geotiff."
              },
              "version": {
                "label": "Versión",
                "description": "Versión de WMS. Predeterminado: 1.1.1."
              },
              "nodata": {
                "label": "Sin datos",
                "description": "Valor NoData de salida opcional."
              }
            }
          },
          "extract_xyz_tile_subset": {
            "name": "Extraer subconjunto de teselas XYZ",
            "description": "Obtiene teselas ráster XYZ para un cuadro delimitador, las mosaica y escribe un COG RGB con compresión Deflate.",
            "params": {
              "url": {
                "label": "URL",
                "description": "Plantilla de URL de teselas XYZ, p. ej. https://.../{z}/{x}/{y}.png."
              },
              "zoom": {
                "label": "Zoom",
                "description": "Nivel de zoom XYZ."
              },
              "bbox": {
                "label": "Cuadro delimitador",
                "description": "Rectángulo delimitador como minX,minY,maxX,maxY en bbox_crs."
              },
              "bbox_crs": {
                "label": "CRS del cuadro delimitador",
                "description": "Código EPSG de las coordenadas del rectángulo delimitador."
              },
              "output": {
                "label": "Salida",
                "description": "Ruta del COG de salida."
              },
              "resolution": {
                "label": "Resolución",
                "description": "Tamaño de píxel de salida objetivo en unidades de output_crs. Predeterminado: la resolución nativa de las teselas."
              },
              "width": {
                "label": "Ancho",
                "description": "Ancho de salida en píxeles. Se usa cuando se omite resolution."
              },
              "height": {
                "label": "Altura",
                "description": "Alto de salida en píxeles. Se usa cuando se omite resolution."
              },
              "output_crs": {
                "label": "CRS de salida",
                "description": "Código EPSG de salida opcional. Predeterminado: bbox_crs."
              },
              "tile_size": {
                "label": "Tamaño de tesela",
                "description": "Tamaño de tesela en píxeles. Predeterminado: 256."
              },
              "subdomains": {
                "label": "Subdominios",
                "description": "Letras de subdominio opcionales para {s}, p. ej. abc."
              },
              "nodata": {
                "label": "Sin datos",
                "description": "Valor NoData de salida opcional usado para los píxeles ausentes o transparentes."
              }
            }
          }
        }
      },
      "whitebox": {
        "categories": {
          "conversion": "Conversión",
          "conversionGeometryTopology": "Conversión - Geometría y topología",
          "conversionRasterVectorConversion": "Conversión - Conversión ráster/vectorial",
          "conversionVectorTableIO": "Conversión - E/S de vectores y tablas",
          "hydrology": "Hidrología",
          "hydrologyDepressionsStorage": "Hidrología - Depresiones y almacenamiento",
          "hydrologyFlowRouting": "Hidrología - Enrutamiento de flujo",
          "hydrologyHydrologicIndices": "Hidrología - Índices hidrológicos",
          "hydrologyStreamsLongitudinalAnalysis": "Hidrología - Cauces - Análisis longitudinal",
          "hydrologyStreamsNetworkExtraction": "Hidrología - Cauces - Extracción de la red",
          "hydrologyStreamsOrderingMetrics": "Hidrología - Cauces - Métricas de orden",
          "hydrologyWatershedsBasins": "Hidrología - Cuencas hidrográficas",
          "lidarAnalysisMetrics": "LiDAR - Métricas de análisis",
          "lidarFilteringClassification": "LiDAR - Filtrado y clasificación",
          "lidarIOManagement": "LiDAR - E/S y gestión",
          "lidarInterpolationGridding": "LiDAR - Interpolación y generación de malla",
          "projectionAndGeoreferencing": "Proyección y georreferenciación",
          "raster": "Ráster",
          "rasterDistanceCost": "Ráster - Distancia y coste",
          "rasterLocalNeighborhood": "Ráster - Vecindad local",
          "rasterOverlayMath": "Ráster - Álgebra de superposición",
          "rasterReclassifyMask": "Ráster - Reclasificar y enmascarar",
          "rasterSpatialStatistics": "Ráster - Estadística espacial",
          "remoteSensingChangeDetection": "Teledetección - Detección de cambios",
          "remoteSensingClassification": "Teledetección - Clasificación",
          "remoteSensingEdgeFeatureDetection": "Teledetección - Detección de bordes y rasgos",
          "remoteSensingEnhancementContrast": "Teledetección - Realce y contraste",
          "remoteSensingFilters": "Teledetección - Filtros",
          "remoteSensingObia": "Teledetección - OBIA",
          "remoteSensingRadiometricCorrection": "Teledetección - Corrección radiométrica",
          "remoteSensingSar": "Teledetección - SAR",
          "remoteSensingSpectralAnalytics": "Teledetección - Analítica espectral",
          "remoteSensingThermalEmissivity": "Teledetección - Térmico y emisividad",
          "terrain": "Terreno",
          "terrainDerivatives": "Terreno - Derivadas",
          "terrainLandformIndices": "Terreno - Índices de formas del terreno",
          "terrainMultiscaleSignatures": "Terreno - Firmas multiescala",
          "terrainRoughnessTexture": "Terreno - Rugosidad y textura",
          "terrainVisibility": "Terreno - Visibilidad",
          "terrainWorkflowProducts": "Terreno - Productos de flujo de trabajo",
          "vector": "Vectorial",
          "vectorAttributeAnalysis": "Vectorial - Análisis de atributos",
          "vectorGeometryProcessing": "Vectorial - Procesamiento de geometría",
          "vectorLinearReferencing": "Vectorial - Referenciación lineal",
          "vectorNetworkAnalysis": "Vectorial - Análisis de redes",
          "vectorOnlineData": "Vectorial - Datos en línea",
          "vectorOverlayAnalysis": "Vectorial - Análisis de superposición",
          "vectorSamplingGridding": "Vectorial - Muestreo y generación de malla",
          "vectorShapeMetrics": "Vectorial - Métricas de forma",
          "vectorSpatialStatistics": "Vectorial - Estadística espacial"
        },
        "menuTool": {
          "calculate_transit_service_frequency": "Calcular frecuencia del servicio de tránsito",
          "excel_to_table": "Excel a tabla",
          "extract_scanned_features": "Extraer entidades escaneadas",
          "features_to_gpx": "Entidades a GPX",
          "features_to_gtfs": "Entidades a GTFS",
          "gpx_to_features": "GPX a entidades",
          "gtfs_to_features": "GTFS a entidades",
          "h3_to_vector": "Celdas H3 a polígonos",
          "h3_polyfill": "Relleno de polígonos H3",
          "kml_to_features": "KML a entidades",
          "pmtiles_extract": "Extraer PMTiles",
          "raster_to_h3": "Ráster a celdas H3",
          "write_pmtiles": "Ráster a PMTiles",
          "raster_to_tiles": "Ráster a teselas XYZ",
          "read_geoparquet": "Leer GeoParquet",
          "vector_convert": "Convertir vectorial",
          "vector_to_h3": "Vectorial a celdas H3",
          "vector_to_pmtiles": "Vectorial a PMTiles",
          "write_geoparquet": "Escribir GeoParquet",
          "fix_dangling_arcs": "Corregir arcos colgantes",
          "lines_to_polygons": "Líneas a polígonos",
          "multipart_to_singlepart": "Multiparte a parte simple",
          "polygons_to_lines": "Polígonos a líneas",
          "remove_polygon_holes": "Eliminar huecos de polígonos",
          "singlepart_to_multipart": "Parte simple a multiparte",
          "topology_rule_autofix": "Corrección automática de reglas topológicas",
          "topology_rule_validate": "Validar reglas topológicas",
          "topology_validation_report": "Informe de validación topológica",
          "convert_nodata_to_zero": "Convertir NoData a cero",
          "modify_nodata_value": "Modificar el valor NoData",
          "new_raster_from_base_raster": "Nuevo ráster a partir de ráster base",
          "new_raster_from_base_vector": "Nuevo ráster a partir de vectorial base",
          "raster_to_vector_lines": "Ráster a líneas vectoriales",
          "raster_to_vector_points": "Ráster a puntos vectoriales",
          "raster_to_vector_polygons": "Ráster a polígonos vectoriales",
          "remove_raster_polygon_holes": "Eliminar huecos de polígonos ráster",
          "set_nodata_value": "Establecer el valor NoData",
          "vector_lines_to_raster": "Líneas vectoriales a ráster",
          "vector_points_to_raster": "Puntos vectoriales a ráster",
          "vector_polygons_to_raster": "Polígonos vectoriales a ráster",
          "add_point_coordinates_to_table": "Añadir coordenadas de puntos a la tabla",
          "clean_vector": "Limpiar vectorial",
          "csv_points_to_vector": "Puntos CSV a vectorial",
          "export_table_to_csv": "Exportar tabla a CSV",
          "join_tables": "Unir tablas",
          "merge_table_with_csv": "Combinar tabla con CSV",
          "merge_vectors": "Combinar vectoriales",
          "reinitialize_attribute_table": "Reinicializar tabla de atributos",
          "vector_summary_statistics": "Estadísticas resumen vectoriales",
          "delineate_depressions": "Delimitar depresiones",
          "delineate_mounts": "Delimitar montes",
          "enforce_river_monotonicity": "Imponer monotonía fluvial",
          "extract_sinks": "Extraer sumideros",
          "fill_spill_merge": "Fill-Spill-Merge",
          "topo_to_raster": "Topo a ráster",
          "breach_depressions_least_cost": "Abrir brechas en depresiones por coste mínimo",
          "breach_single_cell_pits": "Abrir brechas en hoyos de una celda",
          "burn_streams": "Grabar cauces",
          "burn_streams_at_roads": "Grabar cauces en carreteras",
          "depth_in_sink": "Profundidad en el sumidero",
          "fill_burn": "Rellenar y grabar",
          "fill_depressions": "Rellenar depresiones",
          "fill_depressions_planchon_and_darboux": "Rellenar depresiones (Planchon y Darboux)",
          "fill_depressions_wang_and_liu": "Rellenar depresiones (Wang y Liu)",
          "fill_pits": "Rellenar hoyos",
          "flatten_lakes": "Aplanar lagos",
          "impoundment_size_index": "Índice de tamaño de embalse",
          "insert_dams": "Insertar presas",
          "raise_walls": "Levantar muros",
          "sink": "Sumidero",
          "stochastic_depression_analysis": "Análisis estocástico de depresiones",
          "topological_breach_burn": "Grabado topológico de brechas",
          "upslope_depression_storage": "Almacenamiento en depresiones aguas arriba",
          "average_flowpath_slope": "Pendiente media de la trayectoria de flujo",
          "average_upslope_flowpath_length": "Longitud media de la trayectoria de flujo aguas arriba",
          "d8_flow_accum": "Acumulación de flujo D8",
          "d8_mass_flux": "Flujo de masa D8",
          "d8_pointer": "Puntero D8",
          "dinf_flow_accum": "Acumulación de flujo D-infinito",
          "dinf_mass_flux": "Flujo de masa D-infinito",
          "dinf_pointer": "Puntero D-infinito",
          "downslope_flowpath_length": "Longitud de la trayectoria de flujo aguas abajo",
          "fd8_flow_accum": "Acumulación de flujo FD8",
          "fd8_pointer": "Puntero FD8",
          "flow_accum_full_workflow": "Flujo de trabajo completo de acumulación de flujo",
          "flow_length_diff": "Diferencia de longitud de flujo",
          "max_upslope_flowpath_length": "Longitud máxima de trayectoria de flujo aguas arriba",
          "max_upslope_value": "Valor máximo aguas arriba",
          "mdinf_flow_accum": "Acumulación de flujo MD-infinito",
          "minimal_dispersion_flow_algorithm": "Algoritmo de flujo de dispersión mínima",
          "num_inflowing_neighbours": "Número de vecinos entrantes",
          "qin_flow_accumulation": "Acumulación de flujo de Qin",
          "quinn_flow_accumulation": "Acumulación de flujo de Quinn",
          "rho8_flow_accum": "Acumulación de flujo Rho8",
          "rho8_pointer": "Puntero Rho8",
          "trace_downslope_flowpaths": "Trazar trayectorias de flujo aguas abajo",
          "depth_to_water": "Profundidad hasta el agua",
          "distance_to_outlet": "Distancia a la salida",
          "downslope_distance_to_stream": "Distancia aguas abajo hasta el cauce",
          "downslope_index": "Índice aguas abajo",
          "edge_contamination": "Contaminación de bordes",
          "elev_relative_to_watershed_min_max": "Elevación relativa al mín-máx de la cuenca",
          "elevation_above_stream": "Elevación sobre el cauce",
          "elevation_above_stream_euclidean": "Elevación sobre el cauce (euclidiana)",
          "find_noflow_cells": "Encontrar celdas sin flujo",
          "find_parallel_flow": "Encontrar flujo paralelo",
          "hydrologic_connectivity": "Conectividad hidrológica",
          "relative_stream_power_index": "Índice de potencia relativa del cauce",
          "sediment_transport_index": "Índice de transporte de sedimentos",
          "wetness_index": "Índice de humedad",
          "farthest_channel_head": "Cabecera de canal más lejana",
          "find_main_stem": "Encontrar el cauce principal",
          "length_of_upstream_channels": "Longitud de los canales aguas arriba",
          "long_profile": "Perfil longitudinal",
          "long_profile_from_points": "Perfil longitudinal desde puntos",
          "extract_streams": "Extraer cauces",
          "extract_valleys": "Extraer valles",
          "prune_vector_streams": "Podar cauces vectoriales",
          "raster_streams_to_vector": "Cauces ráster a vectorial",
          "rasterize_streams": "Rasterizar cauces",
          "remove_short_streams": "Eliminar cauces cortos",
          "repair_stream_vector_topology": "Reparar la topología vectorial de cauces",
          "river_centerlines": "Ejes de río",
          "hack_stream_order": "Orden de cauces de Hack",
          "horton_ratios": "Razones de Horton",
          "horton_stream_order": "Orden de cauces de Horton",
          "shreve_stream_magnitude": "Magnitud de cauces de Shreve",
          "strahler_order_basins": "Cuencas por orden de Strahler",
          "strahler_stream_order": "Orden de cauces de Strahler",
          "stream_link_class": "Clase de tramo de cauce",
          "stream_link_identifier": "Identificador de tramo de cauce",
          "stream_link_length": "Longitud de tramo de cauce",
          "stream_link_slope": "Pendiente de tramo de cauce",
          "stream_slope_continuous": "Pendiente continua del cauce",
          "topological_stream_order": "Orden topológico de cauces",
          "tributary_identifier": "Identificador de afluentes",
          "vector_stream_network_analysis": "Análisis de red vectorial de cauces",
          "basins": "Cuencas",
          "flood_order": "Orden de inundación",
          "hillslopes": "Laderas",
          "isobasins": "Isocuencas",
          "jenson_snap_pour_points": "Ajustar puntos de vertido (Jenson)",
          "longest_flowpath": "Trayectoria de flujo más larga",
          "max_branch_length": "Longitud máxima de ramificación",
          "snap_pour_points": "Ajustar puntos de vertido",
          "subbasins": "Subcuencas",
          "unnest_basins": "Desanidar cuencas",
          "watershed": "Cuenca hidrográfica",
          "watershed_from_raster_pour_points": "Cuenca desde puntos de vertido ráster",
          "assign_projection_lidar": "Asignar proyección a LiDAR",
          "colourize_based_on_class": "Colorear según la clase",
          "colourize_based_on_point_returns": "Colorear según los retornos del punto",
          "find_flightline_edge_points": "Encontrar puntos de borde de línea de vuelo",
          "individual_tree_detection": "Detección de árboles individuales",
          "lidar_eigenvalue_features": "Rasgos de autovalores LiDAR",
          "lidar_histogram": "Histograma LiDAR",
          "lidar_info": "Información LiDAR",
          "lidar_kappa": "Kappa LiDAR",
          "lidar_point_density": "Densidad de puntos LiDAR",
          "lidar_point_return_analysis": "Análisis de retornos de puntos LiDAR",
          "lidar_point_stats": "Estadísticas de puntos LiDAR",
          "lidar_ransac_planes": "Planos RANSAC LiDAR",
          "lidar_rooftop_analysis": "Análisis de cubiertas LiDAR",
          "normal_vectors": "Vectores normales",
          "classify_buildings_in_lidar": "Clasificar edificios en LiDAR",
          "classify_lidar": "Clasificar LiDAR",
          "classify_overlap_points": "Clasificar puntos de solape",
          "clip_lidar_to_polygon": "Recortar LiDAR con polígono",
          "erase_polygon_from_lidar": "Borrar polígono del LiDAR",
          "filter_lidar": "Filtrar LiDAR",
          "filter_lidar_by_percentile": "Filtrar LiDAR por percentil",
          "filter_lidar_by_reference_surface": "Filtrar LiDAR por superficie de referencia",
          "filter_lidar_classes": "Filtrar clases LiDAR",
          "filter_lidar_noise": "Filtrar ruido LiDAR",
          "filter_lidar_scan_angles": "Filtrar ángulos de escaneo LiDAR",
          "height_above_ground": "Altura sobre el suelo",
          "improved_ground_point_filter": "Filtro de puntos de suelo mejorado",
          "individual_tree_segmentation": "Segmentación de árboles individuales",
          "lidar_classify_subset": "Clasificar subconjunto LiDAR",
          "lidar_elevation_slice": "Corte de elevación LiDAR",
          "lidar_remove_outliers": "Eliminar valores atípicos LiDAR",
          "lidar_segmentation": "Segmentación LiDAR",
          "lidar_segmentation_based_filter": "Filtro basado en segmentación LiDAR",
          "modify_lidar": "Modificar LiDAR",
          "normalize_lidar": "Normalizar LiDAR",
          "remove_duplicates": "Eliminar duplicados",
          "ascii_to_las": "ASCII a LAS",
          "las_to_ascii": "LAS a ASCII",
          "las_to_shapefile": "LAS a shapefile",
          "lidar_colourize": "Colorear LiDAR",
          "lidar_join": "Unir LiDAR",
          "lidar_shift": "Desplazar LiDAR",
          "lidar_tile": "Teselar LiDAR",
          "lidar_tophat_transform": "Transformada de sombrero de copa LiDAR",
          "recover_flightline_info": "Recuperar información de líneas de vuelo",
          "select_tiles_by_polygon": "Seleccionar teselas por polígono",
          "sort_lidar": "Ordenar LiDAR",
          "split_lidar": "Dividir LiDAR",
          "flightline_overlap": "Solape de líneas de vuelo",
          "lidar_block_maximum": "Máximo por bloque LiDAR",
          "lidar_block_minimum": "Mínimo por bloque LiDAR",
          "lidar_construct_vector_tin": "Construir TIN vectorial LiDAR",
          "lidar_contour": "Curvas de nivel LiDAR",
          "lidar_digital_surface_model": "Modelo digital de superficie LiDAR",
          "lidar_hex_bin": "Agrupación hexagonal LiDAR",
          "lidar_hillshade": "Sombreado del relieve LiDAR",
          "lidar_idw_interpolation": "Interpolación IDW LiDAR",
          "lidar_nearest_neighbour_gridding": "Rasterización por vecino más próximo LiDAR",
          "lidar_radial_basis_function_interpolation": "Interpolación por funciones de base radial LiDAR",
          "lidar_sibson_interpolation": "Interpolación de Sibson LiDAR",
          "lidar_thin": "Adelgazar LiDAR",
          "lidar_thin_high_density": "Adelgazar LiDAR de alta densidad",
          "lidar_tile_footprint": "Huella de teselas LiDAR",
          "lidar_tin_gridding": "Rasterización TIN LiDAR",
          "build_network_topology": "Construir topología de red",
          "closest_facility_network": "Instalación más cercana en la red",
          "generate_network_nodes": "Generar nodos de red",
          "k_shortest_paths_network": "K rutas más cortas en la red",
          "location_allocation_network": "Localización-asignación en la red",
          "map_matching_v1": "Emparejamiento de mapa v1",
          "multimodal_od_cost_matrix": "Matriz de costes OD multimodal",
          "multimodal_routes_from_od": "Rutas multimodales desde OD",
          "multimodal_shortest_path": "Ruta multimodal más corta",
          "network_accessibility_metrics": "Métricas de accesibilidad de red",
          "network_centrality_metrics": "Métricas de centralidad de red",
          "network_connected_components": "Componentes conexos de la red",
          "network_node_degree": "Grado de los nodos de red",
          "network_od_cost_matrix": "Matriz de costes OD de red",
          "network_routes_from_od": "Rutas de red desde OD",
          "network_service_area": "Área de servicio de red",
          "network_topology_audit": "Auditoría de topología de red",
          "od_sensitivity_analysis": "Análisis de sensibilidad OD",
          "shortest_path_network": "Ruta más corta en la red",
          "snap_points_to_network": "Ajustar puntos a la red",
          "split_lines_at_intersections": "Dividir líneas en las intersecciones",
          "transfer_attributes": "Transferir atributos",
          "travelling_salesman_problem": "Problema del viajante",
          "vehicle_routing_cvrp": "Enrutamiento de vehículos CVRP",
          "vehicle_routing_pickup_delivery": "Enrutamiento de vehículos con recogida y entrega",
          "vehicle_routing_vrptw": "Enrutamiento de vehículos VRPTW",
          "georeference_raster_from_control_points": "Georreferenciar ráster con puntos de control",
          "orthorectification": "Ortorrectificación",
          "reproject_lidar": "Reproyectar LiDAR",
          "reproject_vector": "Reproyectar vectorial",
          "aggregate_multidimensional_raster": "Agregar ráster multidimensional",
          "analyze_changes_ccdc": "Analizar cambios con CCDC",
          "apply_radiometric_calibration": "Aplicar calibración radiométrica",
          "assign_projection_raster": "Asignar proyección a ráster",
          "band_collection_statistics": "Estadísticas de colección de bandas",
          "block_statistics": "Estadísticas por bloque",
          "boundary_clean": "Limpieza de límites",
          "cell_position_statistics": "Estadísticas de posición de celda",
          "cell_statistics": "Estadísticas de celda",
          "classification_accuracy_assessment": "Evaluación de la precisión de clasificación",
          "combine": "Combinar",
          "composite_bands": "Componer bandas",
          "compute_sar_indices": "Calcular índices SAR",
          "contour_with_barriers": "Curvas de nivel con barreras",
          "convert_sar_units": "Convertir unidades SAR",
          "coregister_rasters": "Corregistrar rásteres",
          "corridor": "Corredor",
          "cost_back_link": "Enlace inverso de coste",
          "cut_fill": "Desmonte y terraplén",
          "darcy_flow": "Flujo de Darcy",
          "dem_filter": "Filtro de MDE",
          "detect_image_anomalies": "Detectar anomalías en imágenes",
          "diffusion_interpolation_with_barriers": "Interpolación por difusión con barreras",
          "dimensional_moving_statistics": "Estadísticas móviles dimensionales",
          "empirical_bayesian_kriging": "Kriging bayesiano empírico",
          "euclidean_direction": "Dirección euclidiana",
          "expand_shrink": "Expandir / contraer",
          "extract_cog_subset": "Extraer subconjunto COG",
          "extract_ocean_winds": "Extraer vientos oceánicos",
          "extract_spectra_from_image": "Extraer espectros de la imagen",
          "extract_wms_subset": "Extraer subconjunto WMS",
          "extract_xyz_tile_subset": "Extraer subconjunto de teselas XYZ",
          "find_argument_statistics": "Encontrar estadísticas de argumento",
          "flatten_interferogram": "Aplanar interferograma",
          "focal_flow": "Flujo focal",
          "focal_statistics": "Estadísticas focales",
          "frequency_comparison": "Comparación de frecuencias",
          "fuzzy_overlay": "Superposición difusa",
          "gaussian_geostatistical_simulations": "Simulaciones geoestadísticas gaussianas",
          "multidimensional_anomaly": "Generar anomalía multidimensional",
          "generate_trend_raster": "Generar ráster de tendencia",
          "goldstein_phase_filter": "Filtro de fase de Goldstein",
          "idw_3d": "IDW 3D",
          "interpolate_from_spatiotemporal_points": "Interpolar desde puntos espacio-temporales",
          "interpolate_with_barriers": "Interpolar con barreras",
          "kernel_density_ratio": "Razón de densidad kernel",
          "kernel_interpolation_with_barriers": "Interpolación kernel con barreras",
          "landtrendr": "LandTrendr",
          "las_height_metrics": "Métricas de altura LAS",
          "line_density": "Densidad de líneas",
          "line_statistics": "Estadísticas de líneas",
          "local_polynomial_interpolation": "Interpolación polinómica local",
          "locate_regions": "Localizar regiones",
          "matched_filter_target_detection": "Detección de objetivos por filtro adaptado (CEM/ACE)",
          "maximum_likelihood_classification": "Clasificación por máxima verosimilitud",
          "merge_multidimensional_rasters": "Combinar rásteres multidimensionales",
          "multicriteria_overlay": "Superposición multicriterio",
          "multidimensional_principal_components": "Componentes principales multidimensionales",
          "multidimensional_raster_correlation": "Correlación de rásteres multidimensionales",
          "multilook": "Multilook",
          "multitemporal_coherence": "Coherencia multitemporal",
          "observer_points": "Puntos de observación",
          "optimal_interpolation": "Interpolación óptima",
          "path_distance": "Distancia de trayecto",
          "percentile_contours": "Curvas de nivel por percentiles",
          "point_statistics": "Estadísticas de puntos",
          "porous_puff": "Penacho poroso",
          "predict_using_trend_raster": "Predecir con ráster de tendencia",
          "presence_only_prediction": "Predicción solo con presencias",
          "pycnophylactic_interpolation": "Interpolación picnofiláctica",
          "radiometric_terrain_flattening": "Aplanamiento radiométrico del terreno",
          "raster_normalize": "Normalizar ráster",
          "regression_kriging": "Kriging de regresión",
          "remove_thermal_noise": "Eliminar ruido térmico",
          "render_raster_png": "Renderizar ráster a PNG",
          "reproject_raster": "Reproyectar ráster",
          "rescale_by_function": "Reescalar por función",
          "sar_coherence": "Coherencia SAR",
          "slice_raster": "Segmentar ráster en clases",
          "solar_radiation": "Radiación solar",
          "space_time_kernel_density": "Densidad kernel espacio-temporal",
          "spatial_association_between_zones": "Asociación espacial entre zonas",
          "spectral_index": "Índice espectral",
          "split_raster": "Dividir ráster",
          "storage_capacity": "Capacidad de almacenamiento",
          "subset_multidimensional_raster": "Subconjunto de ráster multidimensional",
          "summarize_categorical_raster": "Resumir ráster categórico",
          "surface_parameters": "Parámetros de superficie",
          "surface_volume": "Volumen de superficie",
          "time_series_cross_correlation": "Correlación cruzada de series temporales",
          "unwrap_phase": "Desenvolver fase",
          "warp_raster": "Deformar ráster",
          "weighted_voronoi": "Voronoi ponderado",
          "zonal_characterization": "Caracterización zonal",
          "zonal_fill": "Relleno zonal",
          "zonal_geometry": "Geometría zonal",
          "zonal_histogram": "Histograma zonal",
          "abs": "Valor absoluto",
          "aggregate_raster": "Agregar ráster",
          "anova": "ANOVA",
          "arccos": "Arcocoseno",
          "arcosh": "Arcocoseno hiperbólico",
          "arcsin": "Arcoseno",
          "arctan": "Arcotangente",
          "arsinh": "Arcoseno hiperbólico",
          "artanh": "Arcotangente hiperbólica",
          "atan2": "Atan2",
          "block_maximum": "Máximo por bloque",
          "block_minimum": "Mínimo por bloque",
          "boundary_shape_complexity": "Complejidad de la forma del límite",
          "ceil": "Redondear hacia arriba",
          "centroid_raster": "Centroide ráster",
          "clip_raster_to_polygon": "Recortar ráster con polígono",
          "clump": "Agrupar",
          "cos": "Coseno",
          "cosh": "Coseno hiperbólico",
          "create_plane": "Crear plano",
          "crispness_index": "Índice de nitidez",
          "cross_tabulation": "Tabulación cruzada",
          "cumulative_distribution": "Distribución acumulada",
          "dbscan": "DBSCAN",
          "decrement": "Decremento",
          "edge_proportion": "Proporción de borde",
          "equal_to": "Igual a",
          "erase_polygon_from_raster": "Borrar polígono del ráster",
          "exp": "Exponencial",
          "exp2": "Exponencial base 2",
          "fft_random_field": "Campo aleatorio FFT",
          "filter_raster_features_by_area": "Filtrar entidades ráster por área",
          "find_patch_edge_cells": "Encontrar celdas de borde de parche",
          "floor": "Redondear hacia abajo",
          "greater_than": "Mayor que",
          "greater_than_or_equal_to": "MayorOIgualQue",
          "heat_map": "Mapa de calor",
          "idw_interpolation": "Interpolación IDW",
          "image_autocorrelation": "Autocorrelación de imagen",
          "image_correlation": "Correlación de imágenes",
          "image_regression": "Regresión de imágenes",
          "increment": "Incremento",
          "inplace_add": "Sumar en el lugar",
          "inplace_divide": "Dividir en el lugar",
          "inplace_multiply": "Multiplicar en el lugar",
          "inplace_subtract": "Restar en el lugar",
          "integer_division": "División entera",
          "inverse_pca": "PCA inversa",
          "is_nodata": "Es NoData",
          "kappa_index": "Índice kappa",
          "ks_normality_test": "Prueba de normalidad KS",
          "less_than": "Menor que",
          "less_than_or_equal_to": "MenorOIgualQue",
          "list_unique_values_raster": "Listar valores únicos (ráster)",
          "ln": "Logaritmo natural",
          "log10": "Logaritmo base 10",
          "log2": "Logaritmo base 2",
          "map_features": "Mapear entidades",
          "max": "Máximo",
          "min": "Mínimo",
          "modified_shepard_interpolation": "Interpolación de Shepard modificada",
          "narrowness_index": "Índice de estrechez",
          "negate": "Negar",
          "nibble": "Nibble",
          "not_equal_to": "Distinto de",
          "ordinary_cokriging": "Interpolación por cokriging ordinario",
          "paired_sample_t_test": "Prueba t para muestras pareadas",
          "phi_coefficient": "Coeficiente phi",
          "principal_component_analysis": "Análisis de componentes principales",
          "print_geotiff_tags": "Imprimir etiquetas GeoTIFF",
          "quantiles": "Cuantiles",
          "radial_basis_function_interpolation": "Interpolación por funciones de base radial",
          "radius_of_gyration": "Radio de giro",
          "random_field": "Campo aleatorio",
          "random_forest_classification_fit": "Ajustar clasificación por bosque aleatorio",
          "random_forest_classification_predict": "Predecir clasificación por bosque aleatorio",
          "random_forest_regression_fit": "Ajustar regresión por bosque aleatorio",
          "random_forest_regression_predict": "Predecir regresión por bosque aleatorio",
          "random_sample": "Muestra aleatoria",
          "raster_area": "Área del ráster",
          "raster_calculator": "Calculadora ráster",
          "raster_cell_assignment": "Asignación de celdas ráster",
          "raster_histogram": "Histograma ráster",
          "raster_perimeter": "Perímetro del ráster",
          "raster_summary_stats": "Estadísticas resumen del ráster",
          "reciprocal": "Recíproco",
          "rescale_value_range": "Reescalar el rango de valores",
          "root_mean_square_error": "Error cuadrático medio",
          "round": "Redondear",
          "shape_complexity_index_raster": "Índice de complejidad de forma ráster",
          "sieve": "Tamizar",
          "sin": "Seno",
          "sinh": "Seno hiperbólico",
          "sqrt": "Raíz cuadrada",
          "square": "Cuadrado",
          "tan": "Tangente",
          "tanh": "Tangente hiperbólica",
          "tin_interpolation": "Interpolación TIN",
          "to_degrees": "A grados",
          "to_radians": "A radianes",
          "trend_surface": "Superficie de tendencia",
          "trend_surface_vector_points": "Superficie de tendencia desde puntos vectoriales",
          "truncate": "Truncar",
          "turning_bands_simulation": "Simulación por bandas rotatorias",
          "two_sample_ks_test": "Prueba KS de dos muestras",
          "wilcoxon_signed_rank_test": "Prueba de rangos con signo de Wilcoxon",
          "z_scores": "Puntuaciones Z",
          "zonal_statistics": "Estadísticas zonales",
          "buffer_raster": "Zona de influencia ráster",
          "cost_allocation": "Asignación de coste",
          "cost_distance": "Distancia de coste",
          "cost_pathway": "Trayectoria de coste",
          "euclidean_allocation": "Asignación euclidiana",
          "euclidean_distance": "Distancia euclidiana",
          "image_correlation_neighbourhood_analysis": "Análisis de vecindad por correlación de imágenes",
          "natural_neighbour_interpolation": "Interpolación por vecino natural",
          "nearest_neighbour_interpolation": "Interpolación por vecino más próximo",
          "add": "Sumar",
          "average_overlay": "Superposición por media",
          "bool_and": "Y lógico",
          "bool_not": "No lógico",
          "bool_or": "O lógico",
          "bool_xor": "O exclusivo lógico",
          "count_if": "Contar si",
          "divide": "Dividir",
          "highest_position": "Posición más alta",
          "lowest_position": "Posición más baja",
          "max_absolute_overlay": "Superposición por máximo absoluto",
          "max_overlay": "Superposición por máximo",
          "min_absolute_overlay": "Superposición por mínimo absoluto",
          "min_overlay": "Superposición por mínimo",
          "modulo": "Módulo",
          "multiply": "Multiplicar",
          "multiply_overlay": "Superposición por producto",
          "percent_equal_to": "Porcentaje igual a",
          "percent_greater_than": "Porcentaje mayor que",
          "percent_less_than": "Porcentaje menor que",
          "pick_from_list": "Elegir de una lista",
          "power": "Potencia",
          "standard_deviation_overlay": "Superposición por desviación estándar",
          "subtract": "Restar",
          "sum_overlay": "Superposición por suma",
          "update_nodata_cells": "Actualizar celdas NoData",
          "weighted_overlay": "Superposición ponderada",
          "weighted_sum": "Suma ponderada",
          "conditional_evaluation": "Evaluación condicional",
          "reclass": "Reclasificar",
          "reclass_equal_interval": "Reclasificar por intervalos iguales",
          "geographically_weighted_regression_raster": "Regresión ponderada geográficamente (ráster)",
          "getis_ord_gi_star_raster": "Gi* de Getis-Ord ráster",
          "inhomogeneous_intensity_raster": "Intensidad no homogénea (ráster)",
          "local_kriging": "Kriging local",
          "local_morans_i_lisa_raster": "I de Moran local (LISA) ráster",
          "ordinary_kriging": "Kriging ordinario",
          "simple_kriging": "Kriging simple",
          "spacetime_kriging": "Kriging espacio-temporal",
          "spatial_error_regression_raster": "Regresión con error espacial (ráster)",
          "spatial_lag_regression_raster": "Regresión con retardo espacial (ráster)",
          "universal_kriging": "Kriging universal",
          "change_vector_analysis": "Análisis de vectores de cambio",
          "image_difference_change_detection": "Detección de cambios por diferencia de imágenes",
          "pca_based_change_detection": "Detección de cambios basada en PCA",
          "post_classification_change": "Cambio posclasificación",
          "write_function_memory_insertion": "Inserción en memoria de función de escritura",
          "evaluate_training_sites": "Evaluar áreas de entrenamiento",
          "fuzzy_knn_classification": "Clasificación KNN difusa",
          "generalize_classified_raster": "Generalizar ráster clasificado",
          "generalize_with_similarity": "Generalizar por similitud",
          "k_means_clustering": "Agrupamiento K-medias",
          "knn_classification": "Clasificación KNN",
          "knn_regression": "Regresión KNN",
          "logistic_regression": "Regresión logística",
          "min_dist_classification": "Clasificación por distancia mínima",
          "modified_k_means_clustering": "Agrupamiento K-medias modificado",
          "nnd_classification": "Clasificación NND",
          "otsu_thresholding": "Umbralización de Otsu",
          "parallelepiped_classification": "Clasificación por paralelepípedos",
          "random_forest_classification": "Clasificación por bosque aleatorio",
          "random_forest_regression": "Regresión por bosque aleatorio",
          "svm_classification": "Clasificación SVM",
          "svm_regression": "Regresión SVM",
          "canny_edge_detection": "Detección de bordes de Canny",
          "corner_detection": "Detección de esquinas",
          "laplacian_filter": "Filtro laplaciano",
          "laplacian_of_gaussians_filter": "Filtro laplaciano de gaussianas",
          "prewitt_filter": "Filtro de Prewitt",
          "roberts_cross_filter": "Filtro de cruz de Roberts",
          "sobel_filter": "Filtro de Sobel",
          "balance_contrast_enhancement": "Realce de contraste equilibrado",
          "create_colour_composite": "Crear composición de color",
          "direct_decorrelation_stretch": "Estiramiento por decorrelación directa",
          "false_colour_composite": "Composición en falso color",
          "gamma_correction": "Corrección gamma",
          "gaussian_contrast_stretch": "Estiramiento de contraste gaussiano",
          "histogram_equalization": "Ecualización del histograma",
          "histogram_matching": "Ajuste de histograma",
          "histogram_matching_two_images": "Ajuste de histograma entre dos imágenes",
          "ihs_to_rgb": "IHS a RGB",
          "min_max_contrast_stretch": "Estiramiento de contraste mín-máx",
          "mosaic": "Mosaico",
          "mosaic_with_feathering": "Mosaico con difuminado",
          "normalized_difference_index": "Índice de diferencia normalizada",
          "panchromatic_sharpening": "Afinamiento pancromático",
          "percentage_contrast_stretch": "Estiramiento de contraste por porcentaje",
          "piecewise_contrast_stretch": "Estiramiento de contraste por tramos",
          "resample": "Remuestrear",
          "rgb_to_ihs": "RGB a IHS",
          "sigmoidal_contrast_stretch": "Estiramiento de contraste sigmoidal",
          "split_colour_composite": "Separar composición de color",
          "standard_deviation_contrast_stretch": "Estiramiento de contraste por desviación estándar",
          "true_colour_composite": "Composición en color verdadero",
          "adaptive_filter": "Filtro adaptativo",
          "anisotropic_diffusion_filter": "Filtro de difusión anisotrópica",
          "bilateral_filter": "Filtro bilateral",
          "closing": "Cierre",
          "conservative_smoothing_filter": "Filtro de suavizado conservador",
          "diff_of_gaussians_filter": "Filtro de diferencia de gaussianas",
          "diversity_filter": "Filtro de diversidad",
          "edge_preserving_mean_filter": "Filtro de media con preservación de bordes",
          "emboss_filter": "Filtro de relieve",
          "fast_almost_gaussian_filter": "Filtro gaussiano rápido aproximado",
          "flip_image": "Voltear imagen",
          "frangi_filter": "Filtro de Frangi",
          "gabor_filter_bank": "Banco de filtros de Gabor",
          "gaussian_filter": "Filtro gaussiano",
          "glcm_texture": "Textura GLCM",
          "guided_filter": "Filtro guiado",
          "high_pass_bilateral_filter": "Filtro bilateral de paso alto",
          "high_pass_filter": "Filtro de paso alto",
          "high_pass_median_filter": "Filtro de mediana de paso alto",
          "integral_image_transform": "Transformada de imagen integral",
          "k_nearest_mean_filter": "Filtro de media de K vecinos",
          "kuwahara_filter": "Filtro de Kuwahara",
          "lee_filter": "Filtro de Lee",
          "lidar_ground_point_filter": "Filtro de puntos de suelo LiDAR",
          "line_detection_filter": "Filtro de detección de líneas",
          "line_thinning": "Adelgazamiento de líneas",
          "majority_filter": "Filtro de mayoría",
          "maximum_filter": "Filtro de máximo",
          "mean_filter": "Filtro de media",
          "median_filter": "Filtro de mediana",
          "minimum_filter": "Filtro de mínimo",
          "non_local_means_filter": "Filtro de medias no locales",
          "olympic_filter": "Filtro olímpico",
          "opening": "Apertura",
          "percentile_filter": "Filtro de percentil",
          "range_filter": "Filtro de rango",
          "remove_spurs": "Eliminar espolones",
          "savitzky_golay_2d_filter": "Filtro Savitzky-Golay 2D",
          "scharr_filter": "Filtro de Scharr",
          "standard_deviation_filter": "Filtro de desviación estándar",
          "thicken_raster_line": "Engrosar líneas ráster",
          "tophat_transform": "Transformada de sombrero de copa",
          "total_filter": "Filtro total",
          "unsharp_masking": "Máscara de enfoque",
          "user_defined_weights_filter": "Filtro de pesos definidos por el usuario",
          "wiener_filter": "Filtro de Wiener",
          "build_object_hierarchy_multiscale": "Construir jerarquía de objetos multiescala",
          "classify_objects_ensemble_pro": "Clasificar objetos con conjunto (Pro)",
          "classify_objects_random_forest": "Clasificar objetos con bosque aleatorio",
          "classify_objects_rules_basic": "Clasificar objetos por reglas (básico)",
          "classify_objects_rules_hierarchical": "Clasificar objetos por reglas jerárquicas",
          "classify_objects_svm": "Clasificar objetos con SVM",
          "evaluate_object_classification_accuracy": "Evaluar la precisión de clasificación de objetos",
          "evaluate_segmentation_quality_pro": "Evaluar la calidad de la segmentación (Pro)",
          "image_segmentation": "Segmentación de imagen",
          "image_slider": "Deslizador de imágenes",
          "image_stack_profile": "Perfil de pila de imágenes",
          "obia_audit_report_pro": "Informe de auditoría OBIA (Pro)",
          "obia_batch_orchestrator_pro": "Orquestador de lotes OBIA (Pro)",
          "obia_pipeline_basic": "Flujo OBIA (básico)",
          "object_class_probability_maps": "Mapas de probabilidad de clase de objeto",
          "object_features_context_neighbors": "Rasgos de objeto: vecinos de contexto",
          "object_features_shape_basic": "Rasgos de objeto: forma (básico)",
          "object_features_spectral_basic": "Rasgos de objeto: espectral (básico)",
          "object_features_texture_glcm_basic": "Rasgos de objeto: textura GLCM (básico)",
          "object_features_topology_relations": "Rasgos de objeto: relaciones topológicas",
          "object_uncertainty_diagnostics_pro": "Diagnóstico de incertidumbre de objetos (Pro)",
          "objects_boundary_refinement_pro": "Refinamiento de límites de objetos (Pro)",
          "objects_enforce_min_mapping_unit": "Aplicar unidad mínima cartografiable a objetos",
          "polygons_to_segments": "Polígonos a segmentos",
          "propagate_labels_across_hierarchy": "Propagar etiquetas por la jerarquía",
          "segment_graph_felzenszwalb": "Segmentación por grafo de Felzenszwalb",
          "segment_multiresolution_hierarchical": "Segmentación multirresolución jerárquica",
          "segment_scale_parameter_optimizer": "Optimizador del parámetro de escala de segmentación",
          "segment_slic_superpixels": "Segmentación en superpíxeles SLIC",
          "segment_watershed_markers": "Segmentación por marcadores de cuencas",
          "segments_merge_small_regions": "Fusionar regiones pequeñas de segmentos",
          "segments_split_low_cohesion": "Dividir segmentos de baja cohesión",
          "segments_to_polygons": "Segmentos a polígonos",
          "brdf_normalization": "Normalización BRDF",
          "correct_vignetting": "Corregir viñeteado",
          "dark_object_subtraction": "Sustracción del objeto oscuro",
          "dn_to_toa_reflectance": "De ND a reflectancia TOA",
          "terrain_corrected_optical_analytics": "Analítica óptica corregida por terreno",
          "cloude_pottier_decomposition": "Descomposición de Cloude-Pottier",
          "enhanced_lee_filter": "Filtro de Lee mejorado",
          "freeman_durden_decomposition": "Descomposición de Freeman-Durden",
          "frost_filter": "Filtro de Frost",
          "gamma_map_filter": "Filtro Gamma MAP",
          "h_alpha_wisart_classification": "Clasificación H-Alpha Wisart",
          "kuan_filter": "Filtro de Kuan",
          "refined_lee_filter": "Filtro de Lee refinado",
          "wisart_iterative_clustering": "Agrupamiento iterativo Wisart",
          "yamaguchi_4component_decomposition": "Descomposición de Yamaguchi de 4 componentes",
          "continuum_removal": "Eliminación del continuo",
          "linear_spectral_unmixing": "Desmezcla espectral lineal",
          "minimum_noise_fraction": "Fracción de ruido mínima",
          "spectral_angle_mapper": "Mapeador de ángulo espectral",
          "spectral_library_matching": "Coincidencia con biblioteca espectral",
          "land_surface_temperature_single_channel": "Temperatura de superficie por canal único",
          "land_surface_temperature_split_window": "Temperatura de superficie por ventana dividida",
          "ndvi_based_emissivity": "Emisividad basada en NDVI",
          "assess_route": "Evaluar ruta",
          "breakline_mapping": "Cartografía de líneas de ruptura",
          "convergence_index": "Índice de convergencia",
          "dem_void_filling": "Relleno de vacíos del MDE",
          "deviation_from_mean_elevation": "Desviación respecto a la elevación media",
          "difference_from_mean_elevation": "Diferencia respecto a la elevación media",
          "directional_relief": "Relieve direccional",
          "elev_above_pit": "Elevación sobre el hoyo",
          "elev_above_pit_dist": "Distancia de elevación sobre el hoyo",
          "elevation_percentile": "Percentil de elevación",
          "embankment_mapping": "Cartografía de terraplenes",
          "exposure_towards_wind_flux": "Exposición al flujo del viento",
          "feature_preserving_smoothing": "Suavizado con preservación de rasgos",
          "feature_preserving_smoothing_multiscale": "Suavizado multiescala con preservación de rasgos",
          "fetch_analysis": "Análisis de fetch",
          "fill_missing_data": "Rellenar datos faltantes",
          "find_ridges": "Encontrar crestas",
          "hillshade": "Sombreado del relieve",
          "hypsometrically_tinted_hillshade": "Sombreado del relieve con tintado hipsométrico",
          "local_hypsometric_analysis": "Análisis hipsométrico local",
          "low_points_on_headwater_divides": "Puntos bajos en divisorias de cabecera",
          "map_off_terrain_objects": "Cartografiar objetos ajenos al terreno",
          "max_downslope_elev_change": "Cambio máximo de elevación aguas abajo",
          "max_upslope_elev_change": "Cambio máximo de elevación aguas arriba",
          "min_downslope_elev_change": "Cambio mínimo de elevación aguas abajo",
          "multidirectional_hillshade": "Sombreado multidireccional",
          "num_downslope_neighbours": "Número de vecinos aguas abajo",
          "num_upslope_neighbours": "Número de vecinos aguas arriba",
          "profile": "Perfil",
          "remove_off_terrain_objects": "Eliminar objetos ajenos al terreno",
          "ridge_and_valley_vectors": "Vectores de crestas y valles",
          "slope_vs_aspect_plot": "Gráfico de pendiente frente a orientación",
          "slope_vs_elev_plot": "Gráfico de pendiente frente a elevación",
          "smooth_vegetation_residual": "Suavizar el residuo de vegetación",
          "surface_area_ratio": "Razón de superficie",
          "topographic_hachures": "Normales topográficas",
          "accumulation_curvature": "Curvatura de acumulación",
          "aspect": "Orientación",
          "casorati_curvature": "Curvatura de Casorati",
          "curvedness": "Curvidad",
          "difference_curvature": "Curvatura de diferencia",
          "gaussian_curvature": "Curvatura gaussiana",
          "generating_function": "Función generatriz",
          "horizontal_excess_curvature": "Curvatura de exceso horizontal",
          "maximal_curvature": "Curvatura máxima",
          "mean_curvature": "Curvatura media",
          "minimal_curvature": "Curvatura mínima",
          "plan_curvature": "Curvatura de plano",
          "principal_curvature_direction": "Dirección de la curvatura principal",
          "profile_curvature": "Curvatura de perfil",
          "relative_aspect": "Orientación relativa",
          "ring_curvature": "Curvatura de anillo",
          "rotor": "Rotor",
          "shape_index": "Índice de forma",
          "slope": "Pendiente",
          "tangential_curvature": "Curvatura tangencial",
          "total_curvature": "Curvatura total",
          "unsphericity": "No esfericidad",
          "vertical_excess_curvature": "Curvatura de exceso vertical",
          "elev_relative_to_min_max": "Elevación relativa al mín-máx",
          "geomorphons": "Geomorfones",
          "hypsometric_analysis": "Análisis hipsométrico",
          "multiscale_topographic_position_class": "Clase de posición topográfica multiescala",
          "pennock_landform_classification": "Clasificación de formas del terreno de Pennock",
          "percent_elev_range": "Porcentaje del rango de elevación",
          "relative_topographic_position": "Posición topográfica relativa",
          "max_anisotropy_dev": "Desviación de anisotropía máxima",
          "max_anisotropy_dev_signature": "Firma de desviación de anisotropía máxima",
          "max_difference_from_mean": "Diferencia máxima respecto a la media",
          "max_elev_dev_signature": "Firma de desviación máxima de elevación",
          "max_elevation_deviation": "Desviación máxima de elevación",
          "multiscale_curvatures": "Curvaturas multiescala",
          "multiscale_elevated_index": "Índice multiescala de elevación",
          "multiscale_elevation_percentile": "Percentil de elevación multiescala",
          "multiscale_low_lying_index": "Índice multiescala de zonas bajas",
          "multiscale_roughness": "Rugosidad multiescala",
          "multiscale_roughness_signature": "Firma de rugosidad multiescala",
          "multiscale_std_dev_normals": "Desviación estándar multiescala de las normales",
          "multiscale_std_dev_normals_signature": "Firma de desviación estándar multiescala de las normales",
          "multiscale_topographic_position_image": "Imagen de posición topográfica multiescala",
          "topographic_position_animation": "Animación de posición topográfica",
          "average_normal_vector_angular_deviation": "Desviación angular media del vector normal",
          "circular_variance_of_aspect": "Varianza circular de la orientación",
          "edge_density": "Densidad de bordes",
          "ruggedness_index": "Índice de escabrosidad",
          "spherical_std_dev_of_normals": "Desviación estándar esférica de las normales",
          "standard_deviation_of_slope": "Desviación estándar de la pendiente",
          "average_horizon_distance": "Distancia media al horizonte",
          "horizon_angle": "Ángulo del horizonte",
          "horizon_area": "Área del horizonte",
          "openness": "Apertura",
          "shadow_animation": "Animación de sombras",
          "shadow_image": "Imagen de sombras",
          "sky_view_factor": "Factor de vista del cielo",
          "skyline_analysis": "Análisis de la línea del horizonte",
          "time_in_daylight": "Tiempo con luz diurna",
          "viewshed": "Cuenca visual",
          "visibility_index": "Índice de visibilidad",
          "topo_render": "Representación topográfica",
          "add_surface_information": "Añadir información de superficie",
          "add_z_information": "Añadir información Z",
          "adjust_3d_z": "Ajustar Z en 3D",
          "adjust_stream_to_raster": "Ajustar cauce al ráster",
          "aggregate_points": "Agregar puntos",
          "aggregate_polygons": "Agregar polígonos",
          "align_features": "Alinear entidades",
          "apportion_polygon": "Repartir polígono",
          "areal_interpolation": "Interpolación areal",
          "assign_projection_vector": "Asignar proyección a vectorial",
          "attribute_uncertainty": "Incertidumbre de atributos",
          "bivariate_spatial_association": "Asociación espacial bivariada",
          "buffer_3d": "Zona de influencia 3D",
          "build_balanced_zones": "Construir zonas equilibradas",
          "build_seamlines": "Construir líneas de unión",
          "calculate_adjacent_fields": "Calcular campos adyacentes",
          "calculate_central_meridian_and_parallels": "Calcular meridiano central y paralelos",
          "calculate_composite_index": "Calcular índice compuesto",
          "calculate_distance_band": "Calcular banda de distancia",
          "calculate_end_time": "Calcular hora de fin",
          "calculate_grid_convergence_angle": "Calcular ángulo de convergencia de cuadrícula",
          "calculate_missing_z_values": "Calcular valores Z faltantes",
          "calculate_motion_statistics": "Calcular estadísticas de movimiento",
          "calculate_polygon_main_angle": "Calcular ángulo principal del polígono",
          "calculate_rates": "Calcular tasas",
          "calculate_transformation_errors": "Calcular errores de transformación",
          "calculate_utm_zone": "Calcular zona UTM",
          "cartogram": "Cartograma",
          "causal_inference_analysis": "Análisis de inferencia causal",
          "cell_records_to_sectors": "Registros de celda a sectores",
          "central_feature": "Entidad central / media direccional lineal",
          "change_point_detection": "Detección de puntos de cambio",
          "collapse_dual_lines_to_centerline": "Colapsar líneas dobles a eje central",
          "collapse_hydro_polygon": "Colapsar polígono hidrográfico",
          "collapse_road_detail": "Colapsar detalle viario",
          "collect_events": "Recopilar eventos",
          "colocation_analysis": "Análisis de colocalización",
          "color_polygons": "Colorear polígonos",
          "compare_spatial_weights": "Comparar pesos espaciales",
          "compute_accuracy_for_object_detection": "Calcular precisión de detección de objetos",
          "construct_sight_lines": "Construir líneas de visión",
          "contiguous_cartogram": "Cartograma contiguo",
          "contour_list": "Lista de curvas de nivel",
          "convert_coordinate_notation": "Convertir notación de coordenadas",
          "cost_connectivity": "Conectividad de coste",
          "count_overlapping_features": "Contar entidades superpuestas",
          "create_accuracy_assessment_points": "Crear puntos de evaluación de precisión",
          "create_cartographic_partitions": "Crear particiones cartográficas",
          "create_overpass": "Crear paso elevado",
          "create_routes": "Crear rutas",
          "create_spatial_sampling_locations": "Crear ubicaciones de muestreo espacial",
          "create_spatially_balanced_points": "Crear puntos espacialmente equilibrados",
          "create_underpass": "Crear paso inferior",
          "cul_de_sac_masks": "Máscaras de fondos de saco",
          "delineate_built_up_areas": "Delimitar áreas urbanizadas",
          "dendrogram": "Dendrograma",
          "densify_sampling_network": "Densificar la red de muestreo",
          "detect_bright_ocean_objects": "Detectar objetos brillantes en el océano",
          "detect_dark_ocean_areas": "Detectar áreas oscuras del océano",
          "detect_feature_changes": "Detectar cambios en entidades",
          "detect_graphic_conflict": "Detectar conflicto gráfico",
          "detect_incidents": "Detectar incidentes",
          "dice": "Dividir en dados",
          "difference_3d": "Diferencia 3D",
          "dimension_reduction": "Reducción de dimensiones",
          "directional_distribution": "Distribución direccional",
          "directional_trend": "Tendencia direccional",
          "disperse_markers": "Dispersar marcadores",
          "dissolve_route_events": "Disolver eventos de ruta",
          "edgematch_features": "Emparejar entidades en los bordes",
          "eighty_twenty_analysis": "Análisis ochenta-veinte",
          "eliminate_polygon_part": "Eliminar parte de polígono",
          "eliminate_polygons": "Eliminar polígonos",
          "emerging_hot_spot_analysis": "Análisis de puntos calientes emergentes",
          "enclose_multipatch": "Encerrar multiparche",
          "estimate_time_to_event": "Estimar tiempo hasta el evento",
          "evaluate_bin_sizes": "Evaluar tamaños de bin",
          "evaluate_variable_influence": "Evaluar la influencia de las variables",
          "exploratory_interpolation": "Interpolación exploratoria",
          "exploratory_regression": "Regresión exploratoria",
          "extract_locations_from_text": "Extraer ubicaciones de texto",
          "extract_water_sar": "Extraer agua (SAR)",
          "extrude_between": "Extruir entre",
          "feature_outline_masks": "Máscaras de contorno de entidades",
          "feature_to_line": "Entidad a línea",
          "feature_vertices_to_points": "Vértices de entidad a puntos",
          "features_to_kml": "Entidades a KML",
          "fence_diagram": "Diagrama de vallas",
          "fill_missing_values": "Rellenar valores faltantes",
          "find_dwell_locations": "Encontrar lugares de permanencia",
          "find_identical": "Encontrar idénticos",
          "find_meeting_locations": "Encontrar lugares de encuentro",
          "find_space_time_matches": "Encontrar coincidencias espacio-temporales",
          "flip_line": "Invertir línea",
          "forest_based_forecast": "Pronóstico basado en bosques",
          "generalized_linear_regression": "Regresión lineal generalizada",
          "generate_breach_lines": "Generar líneas de brecha",
          "generate_near_table": "Generar tabla de proximidad",
          "generate_network_swm": "Generar SWM de red",
          "generate_od_links": "Generar enlaces origen-destino",
          "generate_points_along_3d_lines": "Generar puntos a lo largo de líneas 3D",
          "generate_spatial_weights_matrix": "Generar matriz de pesos espaciales",
          "generate_subset_polygons": "Generar polígonos de subconjunto",
          "generate_transects_along_lines": "Generar transectos a lo largo de líneas",
          "geodetic_densify": "Densificar geodésicamente",
          "geographically_weighted_regression": "Regresión ponderada geográficamente",
          "geotagged_photos_to_points": "Fotos geoetiquetadas a puntos",
          "graphic_buffer": "Zona de influencia gráfica",
          "grid_index_features": "Entidades de índice de cuadrícula",
          "group_by_proximity": "Agrupar por proximidad",
          "hdbscan": "Agrupamiento HDBSCAN",
          "getis_ord_general_g": "Agrupamiento alto/bajo (G general de Getis-Ord)",
          "hot_spot_analysis_comparison": "Comparación de análisis de puntos calientes",
          "identify_narrow_polygons": "Identificar polígonos estrechos",
          "incremental_spatial_autocorrelation": "Autocorrelación espacial incremental",
          "inside_3d": "Dentro en 3D",
          "integrate": "Integrar",
          "interpolate_shape": "Interpolar forma",
          "intersect_3d": "Intersecar en 3D",
          "intersect_3d_line_with_surface": "Intersecar línea 3D con superficie",
          "intersecting_layers_masks": "Máscaras de capas que se intersecan",
          "intervisibility": "Intervisibilidad",
          "is_closed_3d": "Está cerrado en 3D",
          "line_of_sight": "Línea de visión",
          "local_bivariate_relationships": "Relaciones bivariadas locales",
          "local_outlier_analysis": "Análisis local de valores atípicos",
          "locate_lines_along_routes": "Localizar líneas a lo largo de rutas",
          "median_center": "Centro mediano",
          "merge_divided_roads": "Combinar carreteras divididas",
          "merge_lines_by_pseudo_node": "Combinar líneas por pseudonodo",
          "minimum_bounding_volume": "Volumen mínimo envolvente",
          "multipatch_footprint": "Huella de multiparche",
          "multipatch_to_mesh": "Multiparche a malla",
          "multiple_ring_buffer": "Zona de influencia de anillos múltiples",
          "mgwr": "Regresión ponderada geográficamente multiescala",
          "multivariate_clustering": "Agrupamiento multivariante",
          "near_3d": "Proximidad 3D",
          "neighborhood_summary_statistics": "Estadísticas resumen de vecindad",
          "non_maximum_suppression": "Supresión de no máximos",
          "optics_clustering": "Agrupamiento OPTICS",
          "optimal_corridor_connections": "Conexiones óptimas de corredor",
          "optimal_path_as_line": "Ruta óptima como línea",
          "optimized_hot_spot_analysis": "Análisis optimizado de puntos calientes",
          "optimized_outlier_analysis": "Análisis optimizado de valores atípicos",
          "pairwise_comparison_weights": "Pesos por comparación por pares",
          "pivot_table": "Tabla dinámica",
          "points_to_line": "Puntos a línea",
          "points_to_path": "Puntos a trayectoria",
          "polygon_neighbors": "Vecinos de polígono",
          "polygon_volume": "Volumen de polígono",
          "propagate_displacement": "Propagar desplazamiento",
          "raster_domain": "Dominio del ráster",
          "raster_to_weighted_points": "Ráster a puntos ponderados",
          "reclassify_field": "Reclasificar campo",
          "reconstruct_tracks": "Reconstruir trayectos",
          "reduce_point_density": "Reducir la densidad de puntos",
          "regularize_adjacent_building_footprint": "Regularizar huellas de edificios adyacentes",
          "regularize_building_footprints": "Regularizar huellas de edificios",
          "remove_overlap_multiple": "Eliminar solape (múltiple)",
          "render_vector_png": "Renderizar vectorial a PNG",
          "repair_geometry": "Reparar geometría",
          "resolve_building_conflicts": "Resolver conflictos de edificios",
          "resolve_road_conflicts": "Resolver conflictos viarios",
          "ripleys_k": "K de Ripley",
          "rubbersheet_features": "Ajustar entidades por rubbersheeting",
          "semivariogram_sensitivity": "Sensibilidad del semivariograma",
          "similarity_search": "Búsqueda por similitud",
          "simplify_3d_line": "Simplificar línea 3D",
          "simplify_building": "Simplificar edificio",
          "simplify_by_circular_arcs": "Simplificar por arcos circulares",
          "simplify_by_tangent_segments": "Simplificar por segmentos tangentes",
          "simplify_shared_edges": "Simplificar bordes compartidos",
          "smooth_natural_features": "Suavizar entidades naturales",
          "smooth_shared_edges": "Suavizar bordes compartidos",
          "snap_tracks": "Ajustar trayectos",
          "sort_features": "Ordenar entidades",
          "spatial_eigenvector_filtering": "Filtrado por autovectores espaciales (MESF)",
          "spatial_outlier_detection": "Detección de valores atípicos espaciales",
          "spatially_constrained_multivariate_clustering": "Agrupamiento multivariante con restricción espacial",
          "split_by_attributes": "Dividir por atributos",
          "split_by_features": "Dividir por entidades",
          "split_line_at_point": "Dividir línea en un punto",
          "stack_profile": "Perfil de pila",
          "strip_map_index_features": "Entidades de índice de fajas",
          "subdivide_polygon": "Subdividir polígono",
          "subset_features": "Subconjunto de entidades",
          "summarize_nearby": "Resumir entidades cercanas",
          "summarize_percent_change": "Resumir cambio porcentual",
          "summarize_within": "Resumir dentro de",
          "summary_statistics": "Estadísticas resumen",
          "sun_shadow_volume": "Volumen de sombra solar",
          "surface_difference": "Diferencia de superficies",
          "table_to_geometry": "Tabla a geometría",
          "tabulate_intersection": "Tabular intersección",
          "thin_road_network": "Adelgazar la red viaria",
          "tile_grid_polygons": "Polígonos de cuadrícula de teselas",
          "time_series_clustering": "Agrupamiento de series temporales",
          "time_series_forecast": "Pronóstico de series temporales",
          "time_series_smoothing": "Suavizado de series temporales",
          "trace_proximity_events": "Rastrear eventos de proximidad",
          "transform_features": "Transformar entidades",
          "transform_fields": "Transformar campos",
          "transform_route_events": "Transformar eventos de ruta",
          "transpose_fields": "Trasponer campos",
          "trim_line": "Recortar línea",
          "union_3d": "Unión 3D",
          "validate_flow_direction": "Validar dirección de flujo",
          "voxel_isosurface": "Isosuperficie de vóxeles",
          "buffer_vector": "Zona de influencia vectorial",
          "directional_variogram": "Análisis de variograma direccional",
          "estimate_variogram": "Estimar variograma",
          "fit_variogram": "Ajustar modelo de variograma",
          "add_field": "Añadir campo",
          "add_geometry_attributes": "Añadir atributos de geometría",
          "attribute_correlation": "Correlación de atributos",
          "attribute_histogram": "Histograma de atributos",
          "attribute_scattergram": "Diagrama de dispersión de atributos",
          "delete_field": "Eliminar campo",
          "extract_by_attribute": "Extraer por atributo",
          "field_calculator": "Calculadora de campos",
          "filter_vector_features_by_area": "Filtrar entidades vectoriales por área",
          "list_unique_values": "Listar valores únicos",
          "rename_field": "Renombrar campo",
          "centroid_vector": "Centroide vectorial",
          "concave_hull": "Envolvente cóncava",
          "densify_features": "Densificar entidades",
          "eliminate_coincident_points": "Eliminar puntos coincidentes",
          "extend_vector_lines": "Extender líneas vectoriales",
          "merge_line_segments": "Fusionar segmentos de línea",
          "minimum_bounding_box": "Rectángulo mínimo envolvente",
          "minimum_bounding_circle": "Círculo mínimo envolvente",
          "minimum_bounding_envelope": "Envolvente mínima",
          "minimum_convex_hull": "Envolvente convexa mínima",
          "polygonize": "Poligonizar",
          "representative_point_vector": "Punto representativo vectorial",
          "simplify_features": "Simplificar entidades",
          "smooth_vectors": "Suavizar vectores",
          "snap_endnodes": "Ajustar nodos finales",
          "split_vector_lines": "Dividir líneas vectoriales",
          "split_with_lines": "Dividir con líneas",
          "locate_points_along_routes": "Localizar puntos a lo largo de rutas",
          "points_along_lines": "Puntos a lo largo de líneas",
          "route_calibrate": "Calibrar ruta",
          "route_event_lines_from_layer": "Líneas de eventos de ruta desde capa",
          "route_event_lines_from_table": "Líneas de eventos de ruta desde tabla",
          "route_event_merge": "Fusionar eventos de ruta",
          "route_event_overlay": "Superponer eventos de ruta",
          "route_event_points_from_layer": "Puntos de eventos de ruta desde capa",
          "route_event_points_from_table": "Puntos de eventos de ruta desde tabla",
          "route_event_split": "Dividir eventos de ruta",
          "route_measure_qa": "Control de calidad de medidas de ruta",
          "route_recalibrate": "Recalibrar ruta",
          "snap_events_to_routes": "Ajustar eventos a rutas",
          "download_osm_vector": "Descargar vectorial de OSM",
          "clip": "Recortar",
          "difference": "Diferencia",
          "dissolve": "Disolver",
          "erase": "Borrar",
          "identity": "Identidad",
          "intersect": "Intersecar",
          "line_intersections": "Intersecciones de líneas",
          "line_polygon_clip": "Recorte de líneas por polígono",
          "near": "Proximidad",
          "select_by_location": "Seleccionar por ubicación",
          "spatial_join": "Unión espacial",
          "symmetrical_difference": "Diferencia simétrica",
          "union": "Unión",
          "update": "Actualizar",
          "construct_vector_tin": "Construir TIN vectorial",
          "contours_from_points": "Curvas de nivel desde puntos",
          "contours_from_raster": "Curvas de nivel desde ráster",
          "extract_nodes": "Extraer nodos",
          "extract_raster_values_at_points": "Extraer valores ráster en puntos",
          "find_lowest_or_highest_points": "Encontrar los puntos más bajos o más altos",
          "hexagonal_grid_from_raster_base": "Malla hexagonal desde base ráster",
          "hexagonal_grid_from_vector_base": "Malla hexagonal desde base vectorial",
          "layer_footprint_raster": "Huella de capa ráster",
          "layer_footprint_vector": "Huella de capa vectorial",
          "medoid": "Medoide",
          "random_points_in_polygon": "Puntos aleatorios en polígono",
          "rectangular_grid_from_raster_base": "Malla rectangular desde base ráster",
          "rectangular_grid_from_vector_base": "Malla rectangular desde base vectorial",
          "vector_hex_binning": "Agrupación hexagonal vectorial",
          "voronoi_diagram": "Diagrama de Voronoi",
          "compactness_ratio": "Razón de compacidad",
          "deviation_from_regional_direction": "Desviación de la dirección regional",
          "elongation_ratio": "Razón de elongación",
          "hole_proportion": "Proporción de huecos",
          "linearity_index": "Índice de linealidad",
          "narrowness_index_vector": "Índice de estrechez vectorial",
          "patch_orientation": "Orientación del parche",
          "perimeter_area_ratio": "Razón perímetro-área",
          "polygon_area": "Área del polígono",
          "polygon_long_axis": "Eje mayor del polígono",
          "polygon_perimeter": "Perímetro del polígono",
          "polygon_short_axis": "Eje menor del polígono",
          "related_circumscribing_circle": "Círculo circunscrito relacionado",
          "shape_complexity_index_vector": "Índice de complejidad de forma vectorial",
          "envelope_test": "Prueba de envolvente",
          "getis_ord_gi_star": "Gi* de Getis-Ord",
          "global_morans_i": "I de Moran global",
          "hotspot_vs_process": "Punto caliente frente a proceso",
          "inhomogeneous_baseline": "Línea base no homogénea",
          "local_morans_i_lisa": "I de Moran local (LISA)",
          "nearest_neighbour_index": "Índice del vecino más próximo",
          "point_pattern_envelope": "Envolvente del patrón de puntos",
          "point_process_residuals": "Residuos del proceso puntual",
          "point_process_residuals_comparison": "Comparación de residuos de procesos puntuales",
          "quadrat_count_test": "Prueba de conteo por cuadrantes",
          "ripleys_k_function": "Función K de Ripley",
          "ripleys_k_test": "Prueba K de Ripley",
          "spatial_error_regression": "Regresión con error espacial",
          "spatial_lag_regression": "Regresión con retardo espacial"
        },
        "menuSubcategory": {
          "geolibre_wasm": "GeoLibre (WASM)",
          "geometry_topology": "Geometría y topología",
          "raster_vector_conversion": "Conversión ráster/vectorial",
          "vector_table_i_o": "E/S de vectores y tablas",
          "depressions_storage": "Depresiones y almacenamiento",
          "flow_routing": "Enrutamiento de flujo",
          "hydrologic_indices": "Índices hidrológicos",
          "streams_longitudinal_analysis": "Cauces - Análisis longitudinal",
          "streams_network_extraction": "Cauces - Extracción de la red",
          "streams_ordering_metrics": "Cauces - Métricas de orden",
          "watersheds_basins": "Cuencas hidrográficas",
          "analysis_metrics": "Métricas de análisis",
          "filtering_classification": "Filtrado y clasificación",
          "i_o_management": "E/S y gestión",
          "interpolation_gridding": "Interpolación y generación de malla",
          "network_analysis": "Análisis de redes",
          "general": "General",
          "distance_cost": "Distancia y coste",
          "local_neighborhood": "Vecindad local",
          "overlay_math": "Álgebra de superposición",
          "reclassify_mask": "Reclasificar y enmascarar",
          "spatial_statistics": "Estadística espacial",
          "change_detection": "Detección de cambios",
          "classification": "Clasificación",
          "edge_feature_detection": "Detección de bordes y rasgos",
          "enhancement_contrast": "Realce y contraste",
          "filters": "Filtros",
          "obia": "OBIA",
          "radiometric_correction": "Corrección radiométrica",
          "sar": "SAR",
          "spectral_analytics": "Analítica espectral",
          "thermal_emissivity": "Térmico y emisividad",
          "derivatives": "Derivadas",
          "landform_indices": "Índices de formas del terreno",
          "multiscale_signatures": "Firmas multiescala",
          "roughness_texture": "Rugosidad y textura",
          "visibility": "Visibilidad",
          "workflow_products": "Productos de flujo de trabajo",
          "attribute_analysis": "Análisis de atributos",
          "geometry_processing": "Procesamiento de geometría",
          "linear_referencing": "Referenciación lineal",
          "online_data": "Datos en línea",
          "overlay_analysis": "Análisis de superposición",
          "sampling_gridding": "Muestreo y generación de malla",
          "shape_metrics": "Métricas de forma"
        }
      }
    }
  }
}
