{"name": "GeoForest Tools", "package_name": "GeoForest_Tools", "version": "2.1.2", "experimental": false, "qgis_min": "3.28.0", "qgis_max": "4.99.0", "downloads": 87, "uploaded_by": "geomaticape2030", "upload_datetime": "2026-07-11T20:46:29.360660", "changelog": "2.1.2: Correcci\u00f3n de bugs en active_fire_algorithm y mapbiomas_internacional_algorithm:\n\nactive_fire_algorithm.py (Puntos activos Incendio - FIRMS): Fix TypeError al generar el gr\u00e1fico de barras de incendios por d\u00eda. QGIS interpretaba los valores del campo Fecha_str como objetos QDate en lugar de string al leerlos desde la capa vectorial temporal. Ahora se convierte expl\u00edcitamente v\u00eda hasattr/toString('yyyy-MM-dd') antes de pasarlos a pandas/matplotlib, evitando el error \"unsupported operand type(s) for -: 'QDate' and 'float'\".\n\nmapbiomas_internacional_algorithm.py (MapBiomas Cobertura Internacional): Fix de error \"Cannot convert 'nan' to double\" al calcular el campo area_ha. gdal_polygonize puede generar pol\u00edgonos con geometr\u00eda nula/vac\u00eda en bordes y p\u00edxeles nodata. Se a\u00f1adi\u00f3 un paso native:removenullgeometries (REMOVE_EMPTY=True) antes del fieldcalculator, y se cambi\u00f3 la f\u00f3rmula a coalesce($area, 0) / 10000 como salvaguarda adicional.\n\n2.1.1: Auditor\u00eda y refactor por fases \u2014 ver detalle agrupado por \u00e1rea:\n\nArquitectura y plugin.py: refactor de plugin.py (425\u2192175 l\u00edneas). NUEVO utils/action_registry.py con tabla declarativa de las 26 herramientas del men\u00fa (9 categor\u00edas), reemplaza ~24 bloques de QAction y 22 m\u00e9todos run_X casi id\u00e9nticos por un \u00fanico enrutador gen\u00e9rico. NUEVO utils/dependencies.py: fuente \u00fanica de verdad para las 8 dependencias de runtime, reemplaza las dos listas hardcodeadas y desincronizadas que exist\u00edan en plugin.py. Migrado dynamic_world_algorithm.py a la base reutilizable GeeRasterAlgorithm (5to algoritmo migrado tras evaluar los 22 restantes y descartar migraci\u00f3n forzada donde no calzaba el contrato de \"una imagen \u2192 un raster\"). Fix en geobosques_provider.loadAlgorithms \u2014 antes un solo algoritmo roto al importar abortaba el registro de los 26; ahora cada uno se carga aislado v\u00eda tabla _ALGORITHM_SPECS, con log individual de fallos en el panel de mensajes de QGIS. Eliminado core/session/ (GEESession) \u2014 wrapper singleton sin ning\u00fan uso real en el plugin ni menci\u00f3n en README/docs de migraci\u00f3n; toda inicializaci\u00f3n de GEE ya pasaba por utils/gee_init.py, que sigue siendo la \u00fanica ruta.\n\nManejo de errores: fix de manejo de errores en dynamic_world_algorithm.build_export_image \u2014 el except envolv\u00eda la llamada a GEE y tragaba silenciosamente cualquier error que no fuera \"0 im\u00e1genes\" (timeout de red, cuota excedida), ahora se propaga el error real. Fix funcional en gbif_occurrences \u2014 el except capturaba urllib.error.HTTPError, excepci\u00f3n que requests nunca lanza, por lo que el manejo diferenciado 4xx/5xx nunca se ejecutaba (corregido con requests.exceptions.HTTPError); eliminado objeto urllib.request.Request muerto. Corregido en gee_auth_dialog.start_auth() un try/except con un 'pass' que nunca pod\u00eda disparar ImportError \u2014 el mensaje de \"instala earthengine-api\" nunca se mostraba antes de lanzar la tarea de autenticaci\u00f3n, el fallo solo aparec\u00eda despu\u00e9s, de forma m\u00e1s confusa, dentro de GEEAuthTask.\n\nCompatibilidad QGIS3/QGIS4 (Qt5/Qt6): corregido en gee_auth_dialog.py el uso directo de Qt.AlignCenter y QFrame.StyledPanel (namespaces planos que PyQt6/QGIS4 no expone) por ALIGN_CENTER de utils/qt_compat.py, que ya resolv\u00eda este caso pero no se usaba aqu\u00ed. Documentado como riesgo pendiente de verificaci\u00f3n real en QGIS4 (no corregido sin evidencia concluyente): QgsProcessingParameterDateTime.Date usado en 5 algoritmos podr\u00eda requerir QgsProcessingParameterDateTime.Type.Date en versiones recientes de la API de QGIS.\n\nReportes y gr\u00e1ficos: fix de threading en geobosques_charts.py y glcluc_charts.py \u2014 faltaba matplotlib.use(\"Agg\") antes de importar pyplot, patr\u00f3n ya aplicado en gfw_charts.py y early_warning_charts.py para evitar crashes intermitentes al graficar fuera del hilo principal de QGIS; MIGRATION_v2.0.md afirmaba que se hab\u00eda aplicado a \"los 12 m\u00f3dulos que generan gr\u00e1ficos\" pero estos dos quedaron sin el fix. Consolidados en ambos archivos los imports de os/pandas/matplotlib.pyplot/numpy/datetime que se reimportaban localmente dentro de cada m\u00e9todo. Eliminadas variables muertas: 'ax' en geobosques_charts.generate_perdida_charts, 'ax' en gfw_charts (mismo patr\u00f3n), y 'bars' en glcluc_charts.generate_altura_charts. Limpieza en mapbiomas_c3_algorithm.py \u2014 eliminada la variable vlayer (QgsVectorLayer creada con costo real de I/O y nunca usada) e imports muertos de requests y download_or_export. Nota: el reporte original en docs/MIGRATION_v2.0.md suger\u00eda que \"la capa no se carga en QGIS\" en mapbiomas_c3; verificado que es impreciso \u2014 el resultado final s\u00ed se carga v\u00eda vlayer_final, lo que sobraba era una instancia intermedia sin uso. Agregado rasterio a requirements.txt (se usaba en dnbr_algorithm y se verificaba en check_dependencies pero no estaba declarado).\n\nInternacionalizaci\u00f3n: NUEVO docs/I18N_PENDING.md \u2014 el c\u00f3digo ya usa self.tr() consistentemente en los 26 algoritmos y en gui/, pero faltan los archivos .ts/.qm reales (requieren herramientas de Qt Linguist no generables en este ciclo de auditor\u00eda; documentado el procedimiento exacto a seguir). Corregido en plugin.py::run_deps() un mensaje de QMessageBox que estaba hardcodeado sin pasar por self.tr(), inconsistente con el resto del plugin.\n\nDocumentaci\u00f3n: README.md reescrito para reflejar el estado real verificado contra el c\u00f3digo \u2014 compatibilidad QGIS 3.28-4.x (antes dec\u00eda \"QGIS 3.x\"), las 8 dependencias de requirements.txt (antes mencionaba solo 3), e inventario completo de las 26 herramientas en sus 9 categor\u00edas (antes solo describ\u00eda el producto GEOBOSQUES original).\n\nHallazgos documentados pero NO corregidos en este ciclo (requieren alcance y decisi\u00f3n aparte): inventario de pyflakes con ~50 hallazgos en 15+ archivos no auditados a este nivel de detalle (imports muertos repetidos de download_or_export en 6 algoritmos, bloque de imports duplicado en geobosques_algorithm.py, variables sin uso varias); 5 algoritmos (mapbiomas_c3, gedi_canopy, gedi_l2b, gedi_l4b y posibles otros) con bucles for sobre getFeatures() que no verifican feedback.isCanceled() ni reportan progreso granular; generaci\u00f3n de PDF nunca existi\u00f3 en el plugin (no es una regresi\u00f3n, el plan de trabajo original asum\u00eda que s\u00ed).\n\n2.1.0: AOI unificado \u2014 etiquetas \"Opci\u00f3n 1/2\" consistentes en los 21 algoritmos. Detecci\u00f3n de proyecci\u00f3n en build_aoi v\u00eda parameterAsExtentCrs del canvas. estimate_pixels() en AOIResult para decisi\u00f3n pre-descarga. NUEVO grid_downloader.py: descarga local por grilla adaptiva (reemplaza ~140 l\u00edneas duplicadas). download_or_export() en export_router como punto de entrada \u00fanico (Local/Drive/GCS).\n2.1.0: AOI unificado \u2014 etiquetas \"Opci\u00f3n 1/2\" consistentes en los 21 algoritmos. Detecci\u00f3n de proyecci\u00f3n en build_aoi v\u00eda parameterAsExtentCrs del canvas. estimate_pixels() en AOIResult para decisi\u00f3n pre-descarga. NUEVO grid_downloader.py: descarga local por grilla adaptiva (reemplaza ~140 l\u00edneas duplicadas). download_or_export() en export_router como punto de entrada \u00fanico (Local/Drive/GCS).\n2.0.9: Fix missing import requests in gbif_occurrences.\n2.0.8: Minor updates and bug fixes.\n2.0.2: Less strict geometry validation (removes isGeosValid() that rejected valid geometries).\n2.0.1: QGIS 3.x/4.x compatibility fix in aoi_builder. Replacement of urllib with requests in gbif_occurrences.\n2.0: Architecture consolidation. Reusable base GeeRasterAlgorithm. Adoption of export_router. Fixes in GLCLUC. Improved matplotlib backend. Tests and CI.\n1.2: Elimination of duplication in AOI and GEE init. Qt5/Qt6 compatibility layer.\n1.1: Code optimization and improvements in export to Google Drive/GCS. Integration of Global Forest Watch (GFW) and GLCLUC 2020.\n1.0: Initial release with integration to GEOBOSQUES.", "external_deps": null, "download_url": "https://plugins.qgis.org/plugins/GeoForest_Tools/version/2.1.2/download/"}