[general]
name=RasterViz
qgisMinimumVersion=3.0
qgisMaximumVersion=3.99
description=Scientific raster & vector visualization plugin for QGIS — styled after rasterio.show(), with interactive GUI controls for colormap selection, percentile/minmax stretch, pointed colorbar, discrete class mapping, RGB composite, vector overlays, web basemaps, and histogram analysis. Zero third-party Python dependencies.
version=1.4.5
author=Defani Arman Alfitriansyah
email=defaniarman@gmail.com
about=RasterViz provides publication-quality raster and vector visualization directly within QGIS. The plugin replicates the rendering aesthetics of rasterio.show() through a fully interactive Qt5 GUI. Key capabilities include: multi-layer raster + vector project panel; single-band continuous rendering with configurable colormap and stretch (percentile, min-max, manual); discrete/classified raster rendering via per-class color and label assignment with automatic gridcode scanning; RGB three-band composite with independent per-band stretch; vector overlay support (Shapefile, GeoPackage, GeoJSON, KML/KMZ) with single or categorized symbology; web basemaps (Esri, OpenStreetMap, CartoDB, OpenTopoMap, NASA GIBS, and more) drawn behind your layers; pointed colorbar with configurable geometry, orientation, and extend style; coordinate tick formatting in DMS, DM, Decimal Degree, or native UTM/meter; north arrow and scale bar; real-time live preview backed by a cached NumPy array; and export to PNG (300 DPI), SVG, TIFF, and PDF. Raster and vector reading are 100%% QGIS-native (QgsRasterLayer/QgsVectorLayer) — no rasterio, geopandas, or fiona required. Vector rendering uses QGIS's own feature-request pipeline (spatial filtering, reprojection, and on-the-fly simplification) so large files such as a nationwide administrative-boundary layer stay smooth. Web basemaps are also 100%% QGIS-native: a native QgsRasterLayer XYZ connection (the same scheme QuickMapServices uses) rendered through QGIS's own map-render pipeline (QgsMapRendererCustomPainterJob) — no contextily or any other third-party package needed. RasterViz has zero third-party Python dependencies. Built with PyQGIS, NumPy, Matplotlib (Qt5Agg backend), and PyQt5.
tracker=https://github.com/Defani/QRasterVIZ
repository=https://github.com/Defani/QRasterVIZ
homepage=https://github.com/Defani/QRasterVIZ
hasProcessingProvider=no
tags=raster, visualization, colormap, legend, colorbar, remote sensing, ndvi, rgb composite, stretch, mangrove, biomass, sentinel-2, landsat, classification, discrete, vector, basemap, xyz tiles, shapefile, geopackage
category=Raster
icon=icon.png
experimental=False
deprecated=False
changelog=Version 1.4.5 (2026): Fixed the 10 "Try, Except, Pass"/"Try, Except, Continue" findings (Bandit B110/B112) that were blocking the QGIS Plugin Repository's automated security scan. Every bare `except Exception: pass`/`continue` across basemap_io.py, dialog.py, raster_io.py, and vector_io.py — all guarding genuinely optional/non-fatal fallback paths (older PyQGIS API without a given setter, a rendering-speed optimisation that can't be applied, a single feature that fails to reproject, etc.) — now logs the caught exception via QgsMessageLog instead of silently discarding it, so failures are visible in the QGIS log panel without changing any runtime behaviour.
  Version 1.4.4 (2026): Fixed a basemap/overlay misalignment (basemap looked "shifted" a little compared to the raster/vector layers on top of it, or compared to the same layer in QGIS's own canvas). basemap_io.py's render told matplotlib the basemap image covered the raw requested extent, but QgsMapSettings actually renders a slightly different, aspect-corrected extent (QgsMapSettings.visibleExtent()) whenever the output pixel size's aspect ratio doesn't exactly match the requested extent's aspect ratio — which is almost always the case. The basemap now uses that actually-rendered extent for imshow(), so it lines up exactly with the raster/vector data drawn on top, matching QGIS's own canvas.
  Version 1.4.3 (2026): The right-hand panel (Data/Layers/Display/Basemap/Title & Font/Geometry/Colorbar tabs) had a hard `setMaximumWidth(300)` that stopped the splitter handle from being dragged wider — removed that cap, so the panel can now be resized to whatever width the user wants. Note: individual fields inside the panel (combo boxes, line edits, spin boxes) are still capped at 185px wide by design so they don't stretch oddly; dragging the panel wider just gives them more breathing room, it doesn't stretch the fields themselves.
  Version 1.4.2 (2026): Performance — the per-pixel no-data mask loop in raster_io.py's block decoder now checks the block's own `hasNoData()` flag first and skips the O(width x height) Python loop entirely when the block has no no-data pixels at all (the common case for most rendered previews), instead of always looping over every pixel. This is a CPU-side fix, not GPU/OpenCL: RasterViz's pixel reading, stretching, and rendering are plain NumPy/QGIS-native/Matplotlib and were never on a code path QGIS's own OpenCL acceleration setting (used only by a handful of Processing algorithms like Hillshade/Slope/Viewshed) would touch.
  Version 1.4.1 (2026): UI overhaul — every control panel (Data Source, Vector Symbology, Display, Title & Font, Geometry, Colorbar) is now organised into clearly labelled group boxes by function (e.g. "North Arrow", "Scale Bar", "Map Frame", "Legend — Position & Size") instead of one long mixed list per tab. Removed every in-app UI icon (toolbar/tab/list-item icons and the icons.py glyph module); buttons, tabs, and the layers list now use plain text/labels only, with a "[Raster]"/"[Vector]" text tag replacing the old layer-type icon. Standardised control heights/padding across combo boxes, spin boxes, line edits, and buttons for a more comfortable, consistent click/tap target size.
  Version 1.4.0 (2026): Replaced the contextily-based web basemap engine with a 100%% QGIS-native one — basemaps are now fetched, stitched, and reprojected by QGIS itself via a native QgsRasterLayer XYZ connection (the same URI scheme QuickMapServices uses) rendered through QgsMapRendererCustomPainterJob, instead of the contextily pip package. RasterViz now has ZERO third-party Python dependencies; the "Install Dependencies" button/dialog and one-time first-run notice have been removed since there is nothing left to install. All basemaps from 1.3.1 are still available with the same names, and the per-(provider, CRS, view) basemap cache still works the same way.
  Version 1.3.1 (2026): Fixed a layout bug that left a large empty gap above "Legend Layout Settings" in the Colorbar tab (Qt was sizing that area to its tallest sub-tab even while the shorter one was showing); narrowed the right-hand settings panel further. The "Install Dependencies" dialog now falls back automatically to installing into the plugin's own folder when a Python build has user site-packages disabled (previously failed outright with "User site-packages are disabled for this Python"). Basemap tiles are now cached per (provider, CRS, view) so re-rendering after an unrelated control change (title, font, decimals, ...) reuses the already-fetched/stitched/warped basemap image instead of re-fetching it from the network every time.
  Version 1.3.0 (2026): Raster and vector engines are now 100%% QGIS-native — rasterio, geopandas, and fiona are no longer needed at all (raster via QgsRasterLayer/dataProvider().block(), vector via QgsVectorLayer/OGR). Vector rendering now goes through QGIS's own QgsFeatureRequest pipeline (destination-CRS reprojection, view-extent spatial filtering, and on-the-fly simplification), fixing slow/heavy redraws with large nationwide vector files. Added a working in-app "Install Dependencies" dialog (Plugins > RasterViz > Install Dependencies, plus a header button and a one-time first-run notice) that installs contextily directly into QGIS's own Python with a background worker thread, progress bar, and clear error messages — no terminal/OSGeo4W Shell needed. Removed the qtawesome dependency entirely, replaced by a small built-in SVG icon set. Removed the custom dark-mode toggle and forced font/stylesheet; the UI now follows QGIS's own active theme and font. Narrowed the right-hand vertical tab strip (Display / Title & Font / Geometry / Colorbar) to fit its icon+label instead of the style's default wide padding.
  Version 1.2.0 (2026): Rebuilt on the multi-layer engine from the standalone RasterViz edition. Adds a unified raster+vector layer panel, vector overlay support (Shapefile, GeoPackage, GeoJSON, KML/KMZ) with single/categorized symbology, web basemap layer (Esri, OSM, CartoDB, OpenTopoMap, NASA GIBS, and more) via contextily, an expanded colormap library, north arrow and scale bar, and a raster backend switched to rasterio for consistent multi-format reading (GeoTIFF, IMG, VRT, NetCDF, HDF). Optional dependencies (rasterio, geopandas, fiona, contextily, qtawesome) degrade gracefully with an in-app notice if missing.
  Version 1.1.0 (2026): Initial public release. Includes single-band continuous rendering, discrete/classified rendering, RGB composite, customizable pointed colorbar, coordinate tick formatting (DMS, DM, DD, UTM), and live preview via cached NumPy array. Export to PNG, SVG, TIFF, PDF supported.
