Core features
Designed for repeatable, defensible land change reporting.
Analysis outputs
- Area by class per year (per-class counts/area across each input raster)
- Interval change accounting (gain/loss per class, changed vs. total pixels)
- Transition matrices per interval
- Transition matrix for first vs. last year
- Top transitions ranking (largest class-to-class conversions)
- Change intensity metrics (interval + annualized intensity)
- Change frequency raster (counts how often each pixel changes across years)
- Change hotspots (kernel density heatmap) per interval
- Optional interactive charts for matrices and change metrics (HTML)
Workflow
Simple inputs, strong validation, structured outputs.
- Load annual rasters and optionally an AOI.
- Run validation: CRS, grid alignment, NoData, and class ranges.
- Export CSV, GeoTIFF, and HTML reports to your output folder.
Outputs
Quantitative tables plus spatial context for each interval.
CSV
- Area by class per year
- Net/gross change per interval
- Transition matrices and top transitions
- Change intensity per interval
GeoTIFF
- Change frequency raster
- Change hotspot heatmaps
HTML
- Interactive charts for CSV outputs
- Sankey diagram across intervals
Methodological notes
Formulas follow the implementation used in the plugin.
Show formulas and definitions
Notation
\( \Omega_t \) denotes the set of pixels that are valid at year \( t \) after NoData filtering and any optional AOI masking are applied. All summations are taken only over these valid pixels.
\( L_t(p) \) is the categorical class label assigned to pixel \( p \) at time \( t \). This label is an integer class ID derived directly from the input rasters.
\( A_{px} \) is the area represented by a single pixel in the units selected by the user (pixels, square meters, or square kilometers). It converts counts of pixels into physical area.
\( \mathbf{1}[\cdot] \) is the indicator function, which evaluates to 1 when the stated condition is true and 0 otherwise. It allows class membership and change conditions to be expressed as sums.
Area by class (year \( t \))
This expression counts the number of valid pixels that belong to class \( k \) at time \( t \). In practice, it is the histogram count of class IDs computed over the valid portion of the raster.
The pixel count is then converted to an areal measure by multiplying by the area represented by a single pixel. This yields class area in the user-selected units.
The proportional share of class \( k \) is computed by dividing by the total number of valid pixels across all classes and converting to a percentage. This supports consistent comparisons across years.
Interval change accounting (\( t_0 \rightarrow t_1 \))
The analysis uses only pixels that are valid in both years. This ensures that changes are evaluated on a comparable pixel set and are not driven by NoData or masking differences.
The total number of pixels in this intersection provides the denominator for interval-level change statistics.
This counts all pixels whose class label differs between \( t_0 \) and \( t_1 \). It is the fundamental measure of change for the interval.
Gain measures how many pixels transition into class \( k \) during the interval. Only pixels that actually changed are counted as gains.
Loss measures how many pixels leave class \( k \) during the interval. Together with gains, it captures gross turnover of each class.
Net change is the balance between gains and losses. A positive value indicates expansion of class \( k \), while a negative value indicates contraction.
Gross change reflects total class turnover irrespective of direction. It highlights dynamic classes even when net change is small.
Transition matrix (\( t_0 \rightarrow t_1 \))
Each matrix cell counts the number of pixels moving from class \( i \) to class \( j \) over the interval. The diagonal entries represent persistence, where a pixel remains in the same class.
Top transitions
The total change sum excludes the diagonal of the transition matrix, so it reflects only pixels that switched classes.
Each transition’s share of total change is computed as a percentage, allowing the largest class-to-class conversions to be ranked.
Transition magnitudes are also expressed in area units to make the rankings interpretable in spatial terms.
Change intensity
Interval intensity represents the fraction of valid pixels that changed within the interval, offering a normalized measure that is comparable across different study areas.
The annualized intensity divides interval intensity by the number of years between observations, yielding an average per-year change rate.
Change frequency raster (all years)
This raster counts how many times each pixel changes across the entire time series. It provides a spatial summary of repeated change events.
The value is computed only if pixel \( p \) is valid in all years; otherwise the output is set to -1 to indicate insufficient data.
Change hotspots (per interval)
All changed pixels are converted into point events with unit weight, representing discrete change locations.
A kernel density surface is then computed using a radius of 1000 map units and a pixel size equal to the raster resolution, producing a smooth hotspot intensity raster.
Charts
Interactive HTML charts are direct visualizations of the tabular outputs. They do not introduce new calculations, so they remain consistent with the reported metrics.
Gallery
Quick look at inputs, validation, and outputs.
Built for reliability
Input checks cover CRS, extent, resolution, grid alignment, value ranges, and NoData handling. Output units can be pixels, square meters, or square kilometers.
Validation checklist
- CRS, pixel size, extent, and dimensions
- Grid alignment and data type warnings
- Per-raster class ranges and AOI coverage
Get the plugin
Install from QGIS Plugin Manager or clone the repo.
Author: Mukesh Ray