[general]
name=LVT4U
qgisMinimumVersion=3.16
qgisMaximumVersion=4.99
description=All-in-one GIS toolkit: thematic maps, lot labels, MBTiles (multi-layer + canvas export), KML/KMZ, basemaps, font conversion, CRS tools (batch set), map layouts, Excel-to-GIS, EUDR export, topology fix, CAD converter, and satellite image download.
version=2.7.117
author=Loc Vu Trung
email=locvutrung@gmail.com

about=LVT4U is a comprehensive QGIS plugin suite for Vietnamese forestry, land management, and international compliance workflows.

    Key Features:
    * Thematic Map - Generate categorized/graduated maps from attribute data
    * Lot Labels - Create parcel labels for cadastral maps
    * MBTiles - Export map tiles for offline mobile use
    * KML/KMZ - Convert layers to Google Earth format with styled popups
    * Excel to GIS - Import Excel/CSV spreadsheets as GIS layers
    * Basemap - Load Google Maps, Satellite, Hybrid, OpenStreetMap tiles
    * Font Converter - Convert between Unicode, TCVN3, and VNI encodings
    * CRS Tools - Transform coordinates with VN-2000 province support
    * Map Layout - Template-driven A5-A0 print/slide layouts with grid
    * EUDR Export - Generate GeoJSON compliant with EU Regulation 2023/1115
    * Satellite Downloader - Download Sentinel-2, Landsat 8/9, SAR, MODIS imagery
    * CAD Converter - DWG/DXF/DGN to Shapefile with VN-2000 support
    * Disclaimer - Full Terms of Use (bilingual VI/EN) on every version install

    Built with cartographic science and Vietnamese national standards (BTNMT/TCVN).
    Supports Vietnamese, English, Lao and Indonesian interface.

tracker=https://github.com/locvutrunglvt/LVT-QGIS/issues
repository=https://github.com/locvutrunglvt/LVT-QGIS
homepage=https://lvtfield.lvtcenter.it.com

tags=vietnam,forestry,thematic,layout,kml,kmz,eudr,mbtiles,crs,vn2000,basemap,font,cadastral,excel,topology,topofix,flycam,satellite,sentinel,landsat,ndvi,cad,dwg,shapefile,coordinate,vietnamese,tt16,tcvn,sync,disclaimer,classification,overlay,renderer

category=Vector
icon=icon.png

experimental=False
deprecated=False

hasProcessingProvider=no
server=False

changelog=
    2.7.117 - fix(classify): Fix critical bug where new fields could not be created
            - Root cause 1: type_name was guessed from field name instead of ftype parameter
            - Root cause 2: _set_compact crashed on cmb_field.currentField() (QComboBox has no such method)
            - Fix: Robust dual-attempt QgsField construction with post-commit verification
            - Fix: Specific error dialog shows reason (read-only, format, locked file)
    2.7.116 - feat(classify): Polygon Overlay Style panel for satellite basemap classification
            - Outline-only mode (no fill) with border color/width control per classification step
            - Settings persist between tool opens; Reset button restores factory defaults
            - fix(kml): KML Merge per-layer configs no longer lost when adding/refreshing layers
            - Root cause: set_layers() cleared _layer_keys before pruning stale states
    2.7.115 - feat(classify): Click-Classify Tool - manual field assessment on satellite imagery
            - Click polygon to cycle through classification steps (0/1/2/3 or custom values)
            - Rule-based renderer updates live on each click
            - Compact mini-toolbar mode during active classification
            - Auto-save or manual-save modes; restore original renderer on stop
    2.7.99 - feat(landsat): auto natural color stretch after download
           - Convert 16-bit SR 8-bit GDT_Byte with per-band 2%% clip
           - Stretch [mean-2sigma, mean+2.5sigma] to [0,255], LZW compressed
           - Image looks natural immediately when loaded in QGIS
           - Skipped for index products (NDVI/EVI: float output)
    2.7.98 - fix(landsat): _translate calls _make_vsicurl (PC sign API)
    2.7.93 - fix(satellite): create satellite_dl/i18n.py - fixes ModuleNotFoundError on open
           - fix(disclaimer): bump version forces re-show on update (version-based QSettings key)
    2.7.92 - (internal build)
    2.7.91 - feat(sync): remove LVTField/VPS sync tab - Google Drive only
           - Delete _create_vps_tab, all _vps_* methods (~1000 lines removed)
           - Remove vps_client import from sync/dialog.py
           - Sync dialog now shows 2 tabs only: Google + Xuat file
    2.7.67 - fix(i18n): Toolbar fully bilingual EN/VI - 6 buttons + all dropdown section headers
           - fix: _make_dropdown() section headers now wrapped in tr() for live translation
           - i18n: +17 toolbar translations (Basemap, Import Data, Map Editing, Convert, Thematic, Help)
    2.7.66 - feat(i18n): Full bilingual EN/VI Menu, Toolbar, Layer Compare - no QGIS restart needed
           - feat: language_signals.language_changed signal enables instant retranslation across all UI
           - feat(layer_compare): _retranslate_ui() wired to live language switching
           - fix: _section() menu headers now use tr(), all menu strings English-keyed
    2.7.65 - fix(layer_compare): NameError 'job' closure capture fixed (default-arg j=job)
           - fix(layer_compare): tool deactivation no longer kills overlay (zoom/pan safe)
           - fix: LayerCompareDialog stop logic guarded against double-call
    2.7.56 - fix(lint): fix E999 kml syntax, B105 secret rename, noqa for W503/E203 3rd-party
    2.7.55 - Security: fix XML parsing (defusedxml/nosec), MD5 usedforsecurity=False
           - Security: remove EXIF.exe binary, rename _DEFAULT_PASSWORD constant
           - Security: add nosec B310 to urlopen calls (all HTTPS to trusted VPS)
           - Style: fix PEP8 issues (E241, E302, E303, W293, F401, E741, E722)
           - Build: ZIP excludes .pyc/__pycache__/scripts/bin (QGIS policy compliant)
    2.7.53 - Disclaimer: Full bilingual Terms of Use (VI/EN) on every version install
           - About dialog: Added Terms of Use tab with per-module accuracy table
           - Menu: Added 'Terms of Use' item in Reference group
           - Disclaimer logic: Version-based QSettings key (shows on each update)
           - metadata.txt: Fixed double-encoded UTF-8 mojibake in about/changelog
    2.7.52 - KML Scale Visibility: filter features by QGIS map scale denominator
           - KML Accuracy: switched to native:reprojectlayer (eliminates 1-5m drift)
           - Disclaimer: First-run bilingual dialog with accept/decline on plugin activation
    2.7.31 - KML->SHP: Auto-load converted output layer(s) into QGIS after conversion
           - FSC Harvest: Add Vertex Markers UI (show vertices, min dist, max count)
           - FSC Harvest: Floating coordinate table (STT|X|Y) in map layout preview
    2.7.20 - NEW: Coordinate Table Export (TT16/2025 Mau 03, 04, 05)
           - Feature: Dual coordinates (VN-2000 projected + WGS84 geographic DMS)
           - Feature: Auto-detect CRS and kinh tuyen truc from layer
           - Feature: Excel export with openpyxl (formulas, styled headers)
    2.7.15 - Sync: 7 new auxiliary collections (form_fields, gps_tracks, trees, plots...)
           - Sync: Auxiliary push/pull checkboxes in sync dialog
    2.7.14 - Sync: Bug fix - auxiliary collection methods added to vps_client
    2.7.13 - Sync: Merged push + pull into single 'Sync' button (Google Drive + LVTField)
           - Sync: Dialog handles conflict/duplicate on sync (push + pull in one action)
           - Sync: QGIS reads JSON from LVTField app on Google Drive
           - Sync: Stable IDs (md5 hash) on push - no duplicate records
    2.7.12 - Flycam: Added exifread library for RAW (.DNG, DJI) image support
           - Sync: Auto-refresh connection token for LVTField accounts
    2.7.11 - FIX: KML Config Load - fixed JSON config not applying to UI on load
    2.7.9  - Metadata: qgisMaximumVersion raised from 3.99 -> 4.99
    2.7.7  - KML: Merged SHP->KML into unified multi-layer export (removed duplicate tab)
           - KML: Conditional Polygon Colors - color polygons by field condition
           - KML: Config Save/Load/Reset for SHP->KML tab
           - MBTiles: Multi-layer export - select multiple layers into one MBTiles
           - MBTiles: Canvas -> MBTiles - export full editing canvas extent
           - CRS Tools: Batch Set CRS - set CRS for all layers at once
           - Metadata: Compatible QGIS 3.16 -> 4.99
    2.7.6  - FIX: KML Export crash on QGIS 3.32 (Python 3.9 f-string backslash)
           - Compatible Python 3.9 - 3.12+
    2.7.5  - FIX: Satellite search 403 Forbidden - switched from OData to STAC API
           - Satellite: historical image search (multi-year) without auth
           - FIX: Layer Editor - QgsSingleSymbolRenderer UnboundLocalError
    2.7.4  - CAD -> SHP Converter: DWG + DXF + DGN -> Shapefile
           - DXF/DGN: Direct read via GDAL OGR (all versions)
           - DWG: supports R2000 directly, AutoCAD 2010+ via QGIS Import
           - DGN: supports Microstation DGN v7/v8
           - GPKG: direct read GeoPackage (from QGIS DWG Import)
           - VN-2000 (34 zones) + custom CRS + WGS84
           - Scan CAD layers, expand blocks, split SHP by geometry type
           - Bilingual Vietnamese/English, progress per-layer
    2.7.2  - NEW: GPKG WAL Checkpoint - flush SQLite WAL before export/copy
           - NEW: OneDrive Safety - retry logic for locked files, detect dehydrated files
           - NEW: Pre-flight Validation - check project before export
           - NEW: Per-Layer Export Config - select layers via checkbox in Sync tab
           - NEW: Two-Level Progress - show 'Layer X/N: name' in progress bar
           - Fix: MBTiles - use processingRegistry() instead of algorithmHelp()
           - Fix: KML/KMZ - streaming write (reduce RAM), merge 2 Placemarks into 1
    2.7.1  - Fix: Reset button now refreshes layer list from current project
           - Fix: KML _reset_config() calls _load_current_layers()
           - Fix: MBTiles _reset_defaults() calls _refresh_layers()
    2.7.0  - Compatibility: Full QGIS 3.16 -> 4.x support (Python 3.9+)
           - Feature: WkbCompat shim - QgsWkbTypes replaced with compat layer
           - Fix: 10 multiline f-string expressions collapsed for Python 3.9 compat
           - Fix: 18 files migrated from QgsWkbTypes to WkbCompat (QGIS 4.x ready)
           - Metadata: qgisMaximumVersion raised from 3.99 -> 4.99
           - Verified: 0 compile errors, 0 Python 3.10+ syntax across 100+ files
    2.6.9  - Fix: Lint cleanup for QGIS Plugin Repository compliance
    2.6.8  - Fix: Package Map (GPKG) - GPKG source layers packaged correctly
           - Fix: Package Map (GPKG) - MapInfo TAB files recognized and converted
           - Fix: Camera Trap - Red screen eliminated (rubber band cleanup)
           - Feature: Camera Trap - Clear drawn area button added
    2.6.3  - Flycam: Merge View/Update tabs into Import tab (4->2 tabs, cleaner UI)
           - Flycam: Photo renderer uses QML style (ImportPhotos approach)
           - Flycam: MapTip shows photo name + thumbnail on hover
    2.6.2  - Fix: Satellite search/download broken - API URLs had spaces (404 errors)
           - Fix: Copernicus OData, STAC, AUTH endpoints restored
    2.6.1  - Fix: Download crash when COG not yet uploaded to AWS S3
           - Feature: HEAD request URL check before GDAL download
           - Feature: True Color fallback when TCI.tif unavailable
    2.6.0  - Fix: Satellite Downloader - Multi-satellite download now works for all 5 types
           - Feature: NDVI/EVI/NDWI index computation (numpy + GDAL) for S2/L8/L9
           - Fix: Band selection correctly maps display names to STAC asset keys
    2.5.0  - Feature: Multi-satellite support (S2, L8, L9, S1, MODIS)
           - Feature: STAC search engine for MODIS (Element84 API)
           - Feature: stac_download_batch worker with GDAL crop
    2.3.0  - New: Satellite Downloader - download imagery (free via Copernicus + AWS)
           - Feature: Sentinel-2 L2A, Landsat 8/9, Sentinel-1 SAR, MODIS NDVI support
           - Feature: Band composites (True Color, False Color, NDVI, SWIR, Agriculture)
           - Feature: Cloud masking, AOI from QGIS layer or map extent
    2.2.18 - Map Layout: Legend now available in Slide mode
    2.2.17 - New: Merge SHP -> KML - combine multiple SHP into single KML/KMZ
           - Feature: Per-type field union from all loaded SHP files
           - Feature: Full bilingual UI (Vietnamese/English)
    2.2.15 - New: Flycam Photos module - import geotagged drone photos as GIS layers
           - Feature: EXIF + DJI XMP GPS/altitude/azimuth extraction
           - Feature: Interactive PhotoViewer with zoom, pan, rotate, filters
           - Feature: 6 output formats (GPKG, SHP, GeoJSON, CSV, KML, TAB)
    2.2.12 - Fix: Font Converter - CRS not applied to output (was using source CRS)
           - Improvement: Positional scan algorithm replaces text.replace() chain
    2.2.11 - New: TopoFix module - 11 topology check & fix algorithms
           - Feature: Duplicates, Invalid, Multipart, Overlaps, Gaps detection
           - Feature: Background QThread processing with progress bar
    2.2.10 - New: Layer Editor module - manage, rename, group, style layers
           - Feature: Auto-group layers by geometry (Polygon/Line/Point/Raster)
    2.2.0  - KML/KMZ to SHP: complete rewrite with geometry-type-split strategy
           - First-run language selection dialog on initial install
    2.0.7  - Restore 12 missing TCVN codes (39-47, 89-91): total 110 codes
    2.0.2  - Fixed ALL num_codes to match TCVN 11565 Appendix E
    2.0.0  - TT16/2023 migration: dual-standard support
           - New ldlr_tt16.json: 55 official TT16 codes with color mapping
    1.9.0  - Comprehensive plugin suite with 10 integrated modules
    1.0.0  - Initial release: umbrella plugin framework


