[general]
name=GeoInterpolation Analyst
qgisMinimumVersion=3.28
qgisMaximumVersion=4.99
description=Exploratory spatial data analysis, geostatistics, and advanced spatial interpolation (IDW, RBF, Ordinary Kriging) with LOOCV cross-validation optimization, plus GeoKriging Analyst (Beta), a full 11-step guided geostatistics workflow with 6 variogram models (all from gstat's real catalog), outlier detection, 3 interpolation-area modes (points/mask/custom), resolution/area reporting and contour-line generation (major/minor levels, Surfer-style), now also available as a standalone Post-Processing tool for the raster output of any interpolation method. / Análisis exploratorio de datos, geoestadística e interpolación espacial con LOOCV, más GeoKriging Analyst (Beta), un flujo guiado completo de 11 pasos con 6 modelos de variograma (todos del catálogo real de gstat), detección de outliers, 3 modos de área de interpolación (puntos/máscara/personalizada), reporte de resolución y área, y generación de curvas de nivel (maestras/intermedias, estilo Surfer), ahora también disponible como herramienta independiente de Post-Procesamiento para el raster resultante de cualquier método de interpolación.
version=1.8.4
author=GEOMATICA
email=nino@geomatica.pe
about=QGIS plugin for exploratory data analysis, Voronoi (Thiessen) polygons, and advanced spatial interpolation methods (IDW, RBF, Ordinary Kriging) with automated Leave-One-Out Cross-Validation (LOOCV) hyperparameter optimization. Includes GeoKriging Analyst (Beta), a new and separate guided tool (Preparar-Explorar-Estructura espacial-Smart Model-Validar-Seleccionar-Interpolar-Calidad-Resultados-Informe-Curvas de Nivel) for transparent, defensible variogram modeling, model selection, final interpolation, contour-line generation and reporting (HTML/PDF/Excel), with 6 variogram models, all from gstat's real catalog. In Post-Processing there is now also a standalone 'Curvas de Nivel (raster)' tool that generates the same contour lines and styling from the raster produced by IDW, RBF, Ordinary Kriging, GeoKriging Analyst, or any other raster loaded in the project. / Plugin para análisis estadístico de datos espaciales, polígonos de Voronoi e interpolación espacial avanzada (IDW, RBF, Kriging Ordinario) con optimización mediante validación cruzada (LOOCV). Incluye GeoKriging Analyst (Beta), una herramienta nueva y separada con flujo guiado completo (Preparar-Explorar-Estructura espacial-Smart Model-Validar-Seleccionar-Interpolar-Calidad-Resultados-Informe-Curvas de Nivel) para un modelamiento de variograma, selección de modelo, interpolación final, generación de curvas de nivel y generación de informes (HTML/PDF/Excel) transparente y defendible, con 6 modelos de variograma, todos del catálogo real de gstat. En Post-Procesamiento ahora también hay una herramienta independiente 'Curvas de Nivel (raster)' que genera las mismas curvas y simbología a partir del raster de IDW, RBF, Kriging Ordinario, GeoKriging Analyst, o cualquier otro raster cargado en el proyecto.
tracker=https://github.com/Ninobravo55/Geointerpolation_analyst/issues
repository=https://github.com/Ninobravo55/Geointerpolation_analyst
category=Analysis
changelog=1.8.4: Reorganizacion interna de archivos, sin cambios de funcionalidad ni de comportamiento para el usuario final (todas las herramientas, menus y dialogos quedan identicos). El plugin pasaba de tener sus ~20 modulos Python sueltos en la carpeta raiz a 3 subpaquetes por función: core/ (motores compartidos: smart_kriging_engine.py, contour_tools.py, interpolation_metrics.py, statistics_engine.py, field_type_compat.py), algorithms/ (los 9 algoritmos de Processing y su provider.py), y ui/ (los 3 dialogos y el archivo .ui). icon.png se mueve a resources/icon.png (metadata.txt actualiza icon=resources/icon.png). En la raiz solo quedan los archivos que QGIS exige ahi (__init__.py, metadata.txt) mas los dos puntos de entrada (geointerpolation_analyst.py, plugin_stub.py), README.md y LICENSE. Se actualizaron los ~20 imports relativos afectados por el traslado (p.ej. 'from .interpolation_metrics import ...' pasa a 'from ..core.interpolation_metrics import ...' en los algoritmos que quedaron en un subpaquete distinto al de sus dependencias) y las 3 rutas que resuelven icon.png/el .ui via os.path.dirname(__file__), que cambian de profundidad al moverse los archivos que las usan. Se corrige ademas un 'except Exception: pass' real en geokriging_analyst_dialog.py (limpieza del directorio temporal al presionar 'Reiniciar todo') detectado por el validador de plugins.qgis.org ('Try, Except, Pass detected'): ahora registra la excepcion con el mismo helper _log_warning() que ya usa el resto del archivo desde la v1.7.0, en vez de tragarla en silencio; no cambia el comportamiento (la limpieza sigue sin interrumpir al usuario si falla). Los otros 3 bloques except...pass del proyecto no se tocaron porque ya usan tipos de excepcion acotados (OSError/PermissionError, TypeError/ValueError, etc.) en vez de 'Exception' generico, que es lo que ese validador especifico señala. Verificado con py_compile de los 24 modulos, una resolucion estatica (AST) de cada import relativo contra la nueva estructura de carpetas (confirma que los ~32 imports internos apuntan a un modulo y un nombre que realmente existen ahi), y un barrido AST de todo el arbol que confirma que no queda ningun 'except Exception: pass' (ni 'except: pass' desnudo) sin loguear; igual que en versiones anteriores, no hay una instalacion real de QGIS en este entorno para confirmar la carga end-to-end del plugin, asi que se recomienda una instalacion de prueba antes de publicar. Se corrigen tambien 2 problemas mas detectados por el validador de plugins.qgis.org al subir esta version: (1) F811 (redefinicion de nombre no usado) en kriging_algorithm.py -- 'QgsProcessingParameterExtent' estaba importado 2 veces en el mismo bloque 'from qgis.core import (...)' (bug preexistente a esta reorganizacion, no introducido por ella), se saca la segunda; (2) 14 enums sin calificar detectados por el analizador de compatibilidad Qt6 del validador, mismo tipo de hallazgo que ya se habia corregido parcialmente en la v1.7.0 pero con otros 14 casos que quedaron sin tocar entonces: Qgis.Warning -> Qgis.MessageLevel.Warning (4 casos: __init__.py x2, geokriging_analyst_dialog.py, contour_tools.py), QgsProcessingAlgorithm.FlagNoThreading -> .Flag.FlagNoThreading (5 casos: kriging_algorithm.py, kriging_variogram.py, inverse_boxcox_algorithm.py, idw_loocv_algorithm.py, rbf_loocv_algorithm.py), QgsFeatureSink.FastInsert -> .Flag.FastInsert (1 caso, reclassify_polygonize_algorithm.py), QgsProcessingParameterNumber.Integer -> .Type.Integer (2 casos, mismo archivo) y QgsVectorFileWriter.NoError -> .WriterError.NoError (2 casos: idw_loocv_algorithm.py, rbf_loocv_algorithm.py); la forma calificada ya la usaba el resto del plugin desde la v1.7.0 (ver QgsVectorFileWriter.WriterError.NoError en geointerpolation_analyst.py y QgsProcessingParameterNumber.Type.Integer en kriging_variogram.py/contour_algorithm.py), asi que estos 14 eran los rezagados. Verificado con py_compile y pyflakes (0 avisos F8xx) sobre los 24 modulos y un barrido con regex/grep confirmando que no queda ninguna forma sin calificar de estos 5 enums en todo el arbol. / 1.8.3: Se corrige un bug real reportado por un usuario que podía dejar QGIS entero sin soporte de Python ("No se pudo cargar PyQGIS"), no solo este plugin. __init__.py detecta y borra copias de numpy/scipy duplicadas en la carpeta de perfil de QGIS (shadowean a las que QGIS ya trae incluidas y rompen su import con errores de import circular). El problema: 'numpy' casi siempre YA está cargado en el proceso quando esta limpieza corre, porque qgis.core lo importa al arrancar QGIS, antes que el classFactory de cualquier plugin -- en Windows un archivo/DLL en uso no se puede borrar, así que ese borrado fallaba silenciosamente (solo quedaba en el panel de mensajes de QGIS) y el aviso que SÍ veía el usuario decía igual "se limpiaron paquetes conflictivos, reiniciá QGIS", dando a entender que la corrección había quedado completa. El usuario reinició confiando en ese mensaje y en el reinicio siguiente QGIS ya no pudo cargar PyQGIS en absoluto, porque la copia de numpy (la que de verdad importa) seguía intacta y además estaba incompleta/incompatible. Ahora __init__.py distingue lo que sí se pudo limpiar de lo que quedó sin poder limpiarse (comprobando antes de intentar el borrado si el paquete ya está en sys.modules, en vez de intentar un borrado condenado a fallar) y, si algo queda sin limpiar, el plugin nunca dice "reiniciá y listo": muestra automáticamente (apenas carga, sin que el usuario tenga que buscar el menú) instrucciones de borrado manual con la ruta absoluta exacta, con prioridad sobre cualquier otro aviso. Verificado reproduciendo el escenario exacto del usuario (numpy ya importado, scipy no) con un perfil de QGIS simulado. / 1.8.2: Cuando faltan dependencias, el plugin ya no se queda solo con un aviso pasivo en la barra de mensajes de QGIS que el usuario tiene que notar y luego ir a buscar manualmente el menú 'Instalar Dependencias' (varios usuarios lo interpretaban como "el plugin está roto" en vez de "hay un paso de instalación pendiente"). Ahora, apenas termina de cargar el stub liviano (plugin_stub.py), se ofrece automáticamente instalar lo que falta con un QMessageBox de Sí/No -- no una instalación silenciosa, porque pip descarga paquetes de internet y modifica el entorno Python del usuario, así que se pide confirmación en vez de arrancar sin avisar -- y si acepta se abre directo el instalador (install_deps_dialog.py, ya existía desde antes) con el progreso en pantalla. Si dice que no, el aviso en la barra de mensajes y las opciones del menú siguen disponibles para reintentarlo cuando quiera. Mismo tratamiento para el otro caso que usa este stub (limpieza de numpy/scipy duplicados que pide reinicio de QGIS): el aviso de reinicio ahora también aparece automáticamente en vez de esperar a que el usuario lo abra desde el menú. Ninguno de estos cambios afecta el caso normal (dependencias ya instaladas): ahí __init__.py carga directo el plugin completo, sin pasar por este stub. / 1.8.1: Se corrige una regresión real introducida por la v1.8.0 que rompía el plugin en QGIS 3.28-3.37 (el rango explícitamente soportado, ver qgisMinimumVersion=3.28 en esta version): la v1.8.0 reemplazo 'QgsField(nombre, QVariant.Double)' por 'QgsField(nombre, QMetaType.Type.Double)' en 3 archivos (geointerpolation_analyst.py, idw_loocv_algorithm.py, rbf_loocv_algorithm.py) para arreglar QGIS 4.x, pero el overload de QgsField que acepta QMetaType.Type recien se agrego en QGIS 3.38 -- en 3.28 a 3.37 esa llamada lanza en tiempo de ejecucion 'TypeError: QgsField(): arguments did not match any overloaded call, argument 2 has unexpected type Type' (mismo error ya reportado en otro plugin de QGIS sobre 3.34.4, ver github.com/coolzhao/Geo-SAM/issues/60), rompiendo 'Análisis Estadístico > capa espacial' y las capas de residuos de IDW/RBF con LOOCV en cualquier instalacion de QGIS anterior a 3.38. Se corrige con un modulo nuevo (field_type_compat.py) que elige en tiempo de ejecucion QVariant.Type si esta disponible (QGIS 3.0 hasta el ultimo release con PyQt5 -- sigue funcionando ahi, solo deprecado desde 3.38, no removido) y QMetaType.Type unicamente si QVariant ya no existe (PyQt6 / QGIS 4.x), en vez de asumir un solo enum para todo el rango soportado; verificado con una simulacion de ambos escenarios (modulos qgis.PyQt.QtCore falsos con y sin QVariant) ya que este entorno no tiene una instalacion real de QGIS. Se corrigen ademas dos bugs menores encontrados en la misma revision: (1) el mensaje final de 'Interpolación IDW con LOOCV' escribia literalmente el texto '{html_path}' en vez de la ruta real, por un f-string con llaves dobles de mas (idw_loocv_algorithm.py); (2) en 'Transformación Inversa Box-Cox', los píxeles fuera del dominio de la formula (λ·Y+1 ≤ 0) se filtraban comparando el valor ya transformado contra el centinela de NoData en vez de usar la mascara de dominio ya calculada -- funcionaba en la practica pero podia perder en silencio un pixel valido si su resultado coincidia por casualidad con el valor de NoData del raster de entrada; ahora usa la mascara directamente. / 1.8.0: Compatibilidad con QGIS 4.x (Qt6), pedido explicito: se agrega qgisMaximumVersion=4.99 en metadata.txt para que el plugin aparezca listado tanto en QGIS 3.x como en QGIS 4.x (no se sube qgisMinimumVersion -- seguir soportando 3.x no cuesta nada porque los cambios de codigo son compatibles con ambas ramas). Se corrigen 3 rupturas reales de Qt6 que iban mas alla de los enums de la v1.7.0: (1) QVariant fue eliminado de la API publica de PyQt6 -- el import 'from qgis.PyQt.QtCore import QVariant' rompia la carga completa de geointerpolation_analyst.py, idw_loocv_algorithm.py, rbf_loocv_algorithm.py y kriging_algorithm.py bajo QGIS 4.x (no solo una funcion, el modulo entero fallaba al importarse); se reemplaza por QMetaType.Type (Double/Int/QString), que ademas es la forma no-deprecada del constructor de QgsField desde la v3.38 de QGIS. (2) QAction se movio de QtWidgets a QtGui en Qt6; se agrega un import con fallback (intenta QtGui, si falla usa QtWidgets) en geointerpolation_analyst.py y plugin_stub.py para funcionar sin cambios en ambas ramas. (3) Advertencia de alcance: igual que el resto de este proyecto, no hay una instalacion real de QGIS 4.x/PyQt6 en este entorno para confirmar que el plugin carga de punta a punta -- estos 3 cambios se verificaron contra la documentacion oficial de PyQt6/QGIS 4.0 (QVariant removido de PyQt6, QMetaType.Type como reemplazo documentado desde QGIS 3.38, QAction reubicado a QtGui) y no se agrego el flag 'supportsQt6', que la propia documentacion de QGIS marca como removido y sin efecto. Se recomienda una instalacion de prueba en QGIS 4.x real antes de publicar. / 1.7.0: Curvas de nivel disponibles tambien como herramienta independiente de Processing ('Post-Procesamiento > Curvas de Nivel (raster)'), que acepta el raster de CUALQUIER metodo de interpolacion del plugin (IDW, RBF, Kriging Ordinario, GeoKriging Analyst) o cualquier otro raster cargado en QGIS -- mismo criterio de niveles y misma simbologia (menores finas / maestras gruesas etiquetadas con su cota) que ya usaba GeoKriging Analyst en su pestana '11 Curvas de Nivel', ahora compartidos en un solo modulo (contour_tools.py) en vez de duplicados. Changelog reorganizado a una linea por version anterior (historial completo de cada release en GitHub) para que sea legible desde el dialogo de complementos de QGIS. Ademas, los bloques 'except Exception: pass' detectados por el linter (silenciaban fallas de widgets/etiquetado/logo opcionales sin dejar rastro) ahora registran la excepcion en el panel de mensajes de QGIS en vez de tragarla en silencio, sin cambiar el comportamiento -- esas operaciones siguen sin interrumpir al usuario si fallan. Se corrigen ademas 9 enums sin calificar detectados por el linter (QgsProcessingParameterNumber.Double/Integer, QgsMapLayerProxyModel.PointLayer/PolygonLayer, QgsFieldProxyModel.Numeric, QgsUnitTypes.DistanceMeters) por su forma calificada (.Type.Double, .Filter.PointLayer, .DistanceUnit.DistanceMeters, etc.), requerida por PyQt6 en QGIS 3.40+; el resto del plugin ya usaba la forma calificada, estos eran los unicos rezagados. / 1.6.0: Nueva pestana '11 Curvas de Nivel' en GeoKriging Analyst: genera curvas menores/mayores del raster de prediccion con estadistica real, histograma y sugerencia automatica de niveles, estilo Surfer. / 1.5.2: Catalogo de variograma de GeoKriging Analyst reducido a los 6 modelos reales de gstat (se quitan Quadratic, Cubic y Rational Quadratic, que no eran de esa fuente). / 1.5.1: Rediseno del informe de GeoKriging Analyst (HTML/PDF/Excel): tabla LOOCV completa en los 3 formatos, cobertura de todas las etapas del flujo, identidad visual de marca y logo cargable. / 1.5.0: GeoKriging Analyst: deteccion de outliers (IQR/Z-score), invalidacion automatica de resultados al cambiar Box-Cox/outliers, 3 modos de area de interpolacion (puntos/mascara/personalizada) y reporte de resolucion/area. / 1.4.0: GeoKriging Analyst completo: variograma logaritmico y pestanas Interpolar/Calidad/Resultados/Informe. Corrige un bug numerico grave del LOOCV (predicciones absurdas sin error visible) en Kriging, Variograma y RBF. / 1.3.0: Nueva herramienta GeoKriging Analyst (Beta): flujo guiado de geoestadistica (Proyecto-Explorar-Estructura espacial-Smart Model-Validar-Seleccionar), separado de las herramientas de Processing existentes. / 1.2.0: Correcciones de validacion extendidas a IDW y RBF; corrige fuga de datos en el LOOCV de IDW. / 1.1.0: Correcciones de validacion en Kriging Ordinario (NSE vs R2 de Pearson, deteccion de coordenadas duplicadas, diagnostico de calibracion de incertidumbre). / 1.0.1: Reorganizacion del menu principal y empaquetado.
tags=statistics, analysis, interpolation, idw, rbf, kriging, geostatistics, voronoi, loocv
homepage=https://github.com/Ninobravo55/Geointerpolation_analyst
icon=resources/icon.png

