PlanX Suitability Lab

End-to-end raster MCDA pipeline for land suitability modeling — from data harmonization through multi-method weighting and composition to uncertainty quantification, explainability diagnostics, and decision-ready reporting.

v1.6.4 68 algorithms 6 analytical groups QGIS 3.28 – 4.99 GPL-3.0

Overview & Analytical Philosophy

PlanX Suitability Lab is a raster-based Multi-Criteria Decision Analysis (MCDA) processing provider for QGIS. It implements the complete suitability modeling workflow — from raw data harmonization through criterion weighting, multi-method composition, uncertainty quantification, and explainability diagnostics — as a single, auditable pipeline of Processing Toolbox algorithms.

68
Processing Algorithms
6
Analytical Groups
4
Weighting Methods
5
Composition Methods
30+
Reporting Tools

Every algorithm operates inside the QGIS Processing framework, making all analyses deterministic, repeatable, and batch-scriptable. The plugin produces GeoTIFF rasters with LZW compression and tiling for all spatial outputs, vector tables for weight and diagnostic results, and structured HTML/Markdown/text reports for decision documentation. Methods are selected from the peer-reviewed MCDA literature and implemented with NumPy/GDAL block-wise processing for memory efficiency on large rasters.

Design principle. Suitability Lab follows a prepare → weight → compose → test → explain → decide pipeline. Each stage produces outputs that feed the next, but every stage is also independently usable — an analyst with pre-harmonized rasters and pre-derived weights can enter directly at the composition stage. The Synthetic Pipeline Runner exercises the full pipeline on generated sample data for verification and learning.

Quick Start

New user path. (1) Run Synthetic Pipeline Runner to generate sample rasters and exercise the full pipeline automatically. (2) Study the generated outputs to understand the data flow. (3) Replace synthetic inputs with your own rasters, starting from Data Harmonizer to align CRS/extent/resolution. (4) Derive weights via AHP (expert judgment), Entropy (data-driven), or Weight Consolidator (combine multiple sources). (5) Compose suitability via WLC (baseline), OWA (risk-attitude), or TOPSIS (benefit/cost criteria). (6) Test stability with Monte Carlo and explain drivers with GeoShapley-lite.

MCDA Pipeline

1
Core
Harmonize, Rasterize, Normalize
2
Weights
AHP, Entropy, PCA, CRITIC
3
Compose
WLC, OWA, TOPSIS, VIKOR, Ensemble
4
Test
Monte Carlo, Cross-scenario
5
Explain
GeoShapley, Sensitivity, Contribution
6
Decide
Reports, Playbooks, Scorecards

Composition Method Comparison

WLC — Weighted Linear Combination

Compensatory, full trade-off between criteria. Best baseline model. Weakness on one criterion can be fully offset by strength on another. Simplest, most widely used MCDA method.

OWA — Ordered Weighted Averaging

Risk-attitude control via order weights. Descending = optimistic (high scores dominate); Ascending = pessimistic (low scores constrain). AND-ness / OR-ness continuum between WLC and min/max.

TOPSIS — Technique for Order Preference

Distance to ideal and anti-ideal points in normalized criterion space. Handles benefit and cost criteria explicitly. Best when the "closest to ideal, farthest from worst" framing matches the decision context.

VIKOR — Compromise Ranking

Group utility and individual regret minimization with a compromise weight v. Produces S (utility), R (regret), and Q (compromise) metrics. Designed for conflicting criteria where a consensus compromise is sought.

Ensemble — Multi-Method Fusion

Arithmetic mean of two or more composition outputs. Reduces method-specific bias. Use when no single method is clearly superior and methodological triangulation strengthens the planning case.

Core

Data Preparation

Foundation tools that harmonize, convert, and normalize input data into analysis-ready raster criterion layers. Every MCDA pipeline starts here — misaligned rasters produce silently wrong suitability scores.

🔧

Core: Data Harmonizer

data_harmonizer
Aligns multiple rasters to a common grid — identical CRS, extent, pixel size, and nodata value. The essential preprocessing step before any multi-criteria overlay. Uses GDAL Warp (gdal:warpreproject) to reproject and resample each input; the first result is duplicated as a preview via gdal:translate. All outputs use Float32 with LZW compression.
Parameters
ParameterTypeDefaultDescription
INPUT_RASTERSMultiple RastersRasters to align
SNAP_RASTERRaster (opt)Reference for CRS, extent, resolution
TARGET_EXTENTExtent (opt)Override target extent
TARGET_RESDouble0.0Target resolution; ≤0 inherits from snap/first raster
RESAMPLINGEnumNearestNearest / Bilinear / Cubic
NODATADouble−9999Output nodata value
OUTPUT_RASTERRasterPreview of first aligned result
OUTPUT_DIRFolderDirectory for all aligned GeoTIFFs
OUTPUT_MANIFESTFile (txt)Text manifest listing all outputs
🖼️

Core: Rasterizer

rasterizer
Converts vector layers to raster criterion surfaces. Supports field-based burn values, fixed-value burns, and multi-ring distance buffering. Uses GDAL Rasterize with configurable resolution inherited from a snap raster. Essential when criteria originate as vector data (road networks, water bodies, zoning polygons).
Parameters
ParameterTypeDefaultDescription
INPUTVector LayerVector to rasterize
FIELDField (opt)Attribute field for burn value
SNAP_RASTERRasterGrid geometry reference
OUTPUTRasterOutput raster
📏

Core: Proximity Builder

proximity_builder
Generates Euclidean distance rasters from vector features using GDAL Proximity. Converts discrete features (roads, transit stops, water bodies) into continuous proximity surfaces suitable as MCDA criteria. Supports configurable max distance and fixed-value burn-in for the feature cells themselves.
Parameters
ParameterTypeDefaultDescription
INPUTVector LayerSource features
SNAP_RASTERRasterGrid geometry reference
MAX_DISTANCEDouble0Max distance (0 = no limit)
OUTPUTRasterDistance raster
📐

Core: Normalizer

normalizer
Transforms criterion rasters to a common 0–100 scale using min-max or z-score normalization, with optional benefit/cost direction handling. Cost criteria (where lower values are better, e.g., distance to hazard) are inverted so that 100 always represents the most suitable condition. Block-wise processing for memory efficiency.
Parameters
ParameterTypeDefaultDescription
INPUTRasterCriterion raster to normalize
MODEEnumMin-MaxMin-Max (0-100) / Z-Score
DIRECTIONEnumBenefitBenefit (higher=better) / Cost (lower=better)
OUTPUTRasterNormalized raster
xnorm = 100 · (xxmin) / (xmaxxmin)   (benefit);   xnorm = 100 · (xmaxx) / (xmaxxmin)   (cost)
🚫

Core: Constraint Builder

constraint_builder
Creates binary 0/1 constraint masks from vector or raster inputs. Constraint cells (0) exclude areas from suitability scoring — protected areas, water bodies, steep slopes, legal exclusions. Passing cells (1) allow the suitability model to operate. Supports union (any constraint excludes) and intersection (all constraints must pass) logic.
Parameters
ParameterTypeDefaultDescription
INPUT_LAYERSMultiple LayersConstraint layers (vector or raster)
SNAP_RASTERRasterGrid geometry reference
LOGICEnumUnionUnion (any excludes) / Intersection
OUTPUTRasterBinary 0/1 constraint mask
MCDA theory. Constraints differ from criteria: criteria are continuous trade-offs (a worse score on one can be offset by a better score on another), while constraints are binary exclusions (no trade-off is possible). The Constraint Builder enforces this distinction by producing a strict 0/1 mask that multiplies the suitability score to zero in excluded cells.
🧪

Core: Synthetic Sample Raster

synthetic_sample_raster
Generates a single synthetic criterion raster with controlled spatial structure (random noise + distance-decay gradient from a corner) for testing and demonstration. Configurable size (rows/cols), resolution, and random seed for reproducibility.
⚙️

Core: Synthetic Pipeline Runner

synthetic_pipeline_runner
Exercises the full Suitability Lab pipeline on auto-generated synthetic data: creates sample rasters, normalizes them, derives weights via Entropy and AHP, consolidates weights, runs WLC/OWA/TOPSIS/VIKOR/Ensemble composition, and produces reports. The fastest way to verify that the plugin is working correctly and to understand the data flow between stages. All outputs are placed in a configurable output directory.
Educational use. Designed for workshops and self-paced learning. Run this first, study the outputs, then replace each stage with your own data. The pipeline is transparent — every intermediate file is saved and can be inspected.
Weights

Criterion Weighting

Methods for deriving criterion importance weights. The choice of weighting method is often more consequential than the choice of composition method — different weight sets can produce qualitatively different suitability maps from the same criteria.

⚖️

Weights: AHP Weights

ahp_weights
Computes criterion weights from pairwise comparisons using Saaty's Analytic Hierarchy Process eigenvalue method. Accepts a square reciprocal matrix in JSON format with Saaty's 1–9 scale. Returns weights (summing to 1), consistency ratio (CR), and a CR acceptability flag (CR ≤ 0.10).
Parameters
ParameterTypeDefaultDescription
MATRIX_JSONString (multi-line)[[1,2,3],[0.5,1,2],[0.333,0.5,1]]Pairwise comparison matrix (Saaty scale)
OUTPUTVector TableWeights table (criterion_id, weight, cr, cr_ok)
A w = λmax w    CI = (λmaxn) / (n − 1)    CR = CI / RI(n)
Saaty scale: 1=equal, 3=moderate, 5=strong, 7=very strong, 9=extreme importance. Reciprocals (1/3, 1/5, etc.) for inverse judgments. CR ≤ 0.10 indicates acceptable consistency; higher values suggest the expert judgments contain contradictions that should be reviewed.
Saaty, T.L. (1980). The Analytic Hierarchy Process. McGraw-Hill. · Saaty, T.L. (2008). "Decision making with the analytic hierarchy process." International Journal of Services Sciences 1(1): 83–98.
📊

Weights: PCA Weights

pca_weights
Derives weights from Principal Component Analysis of the criterion correlation structure. The first principal component's loadings are used as weights — criteria that covary strongly with the dominant axis of variation receive higher weight. Handles degenerate (constant) criteria gracefully.
wi = |loadingi,PC1| / Σj |loadingj,PC1|
When to use. PCA weights are data-driven and objective — they reflect which criteria carry the most variance in your study area. Use when you want the data structure to drive weights, not expert judgment. Caveat: PCA weights depend on the study area extent; a different boundary may produce different weights.
📈

Weights: Entropy Weights

entropy_weights
Computes objective criterion weights using Shannon information entropy. Criteria with greater value contrast (more discriminating power) receive higher weight; near-uniform criteria are down-weighted. Samples up to ~8,000 cells on a regular grid for computational efficiency.
ej =k Σi pij ln(pij)    dj = 1 − ej    wj = dj / Σ dj
Shannon, C.E. (1948). "A Mathematical Theory of Communication." Bell System Technical Journal 27(3): 379–423. · Hwang, C.L. & Yoon, K. (1981). Multiple Attribute Decision Making. Springer.
🔬

Weights: CRITIC Weights

critic_weights
CRiteria Importance Through Intercriteria Correlation (CRITIC). Derives weights from both the contrast intensity (standard deviation) of each criterion and the conflict (1 − correlation) between criteria. Criteria with high variance AND low correlation with other criteria receive the highest weights — they contribute unique, discriminating information.
Cj = σj · Σk (1 − rjk)    wj = Cj / Σ Cj
Diakoulaki, D., Mavrotas, G. & Papayannakis, L. (1995). "Determining objective weights in multiple criteria problems: The CRITIC method." Computers & Operations Research 22(7): 763–770.
🔗

Weights: Weight Consolidator

weight_consolidator
Combines multiple weight sets (e.g., AHP from stakeholder group A, Entropy from the data, PCA from regional variation) into a single consolidated weight vector using configurable aggregation: arithmetic mean, geometric mean, or weighted average with user-specified source weights. Produces a table with individual source weights and the consolidated result.
Stakeholder reconciliation. When different expert groups produce different AHP matrices, the Consolidator can average their weight vectors (arithmetic mean) or find a compromise (geometric mean, which is the proper method for ratio-scale judgments per Saaty).
📦

Weights: Scenario Weight Pack

scenario_weight_pack
Bundles multiple weight configurations into a scenario pack for systematic comparison. Define up to N scenarios, each with its own weight vector, label, and description. The pack output feeds directly into the Compose tools for parallel suitability modeling under different weighting assumptions — essential for sensitivity analysis and stakeholder negotiation.
📋

Weights: Weight Consensus Audit

weight_consensus_audit
Measures the agreement between multiple weight vectors using rank correlation (Spearman), Euclidean distance, and cosine similarity. Identifies which criteria drive disagreement between weighting approaches or stakeholder groups. Produces an HTML report with a pairwise agreement matrix and per-criterion variance analysis.
Compose

Suitability Models

Multi-criteria composition engines that combine weighted, normalized criterion rasters into a single suitability score surface. Each method embodies a different decision philosophy. Run multiple methods and compare outputs — convergence across methods strengthens the planning case; divergence signals criteria or weights that need closer inspection.

Compose: WLC Suitability

wlc_suitability
Weighted Linear Combination — the foundational MCDA composition method. Each normalized criterion raster (0–100) is multiplied by its weight and summed. An optional binary constraint mask zeroes excluded cells. Chunk-aware block processing for memory efficiency on arbitrarily large rasters. Output: Float32 GeoTIFF, 0–100, LZW compressed.
Parameters
ParameterTypeDefaultDescription
INPUT_RASTERSMultiple RastersCriterion rasters (max 6, normalized 0–100)
WEIGHTS_CSVStringWeights as CSV (e.g. 0.4,0.3,0.3)
CONSTRAINTRaster (opt)Binary 0/1 constraint mask
BLOCKInteger256Block size in pixels (64–2048)
OUTPUTRasterWLC suitability raster (Float32, 0–100)
Si = Ci · Σj wj · xij    where Ci ∈ {0,1} is the constraint mask
Compensatory nature. WLC allows full trade-off: a very poor score on one criterion can be fully offset by excellent scores on others. This is appropriate when criteria are genuinely substitutable. When a minimum threshold must be met on every criterion, use OWA with ascending order weights instead.
Malczewski, J. (2000). "On the Use of Weighted Linear Combination Method in GIS." International Journal of Geographical Information Science 14(6): 567–590.
🎚️

Compose: OWA Suitability

owa_suitability
Ordered Weighted Averaging — extends WLC with a second weight vector (order weights) that controls risk attitude. Per cell, criterion values are sorted; criteria weights are reordered to match; the result is the weighted combination of sorted values. Descending order → optimistic (high scores dominate); Ascending → pessimistic (low scores constrain). The AND-ness/OR-ness continuum spans from WLC (neutral) to MIN (fully risk-averse) to MAX (fully risk-taking).
Parameters
ParameterTypeDefaultDescription
INPUT_RASTERSMultiple RastersCriterion rasters (max 6, normalized 0–100)
CRITERIA_WEIGHTSStringCriteria weights CSV
ORDER_WEIGHTSStringOrder weights CSV
SORT_MODEEnumDescendingDescending (optimistic) / Ascending (pessimistic)
CONSTRAINTRaster (opt)Binary constraint mask
BLOCKInteger256Block size (64–2048)
OUTPUTRasterOWA suitability raster
Yager, R.R. (1988). "On Ordered Weighted Averaging Aggregation Operators in Multicriteria Decisionmaking." IEEE Transactions on Systems, Man, and Cybernetics 18(1): 183–190. · Malczewski, J. (2006). "Ordered weighted averaging with fuzzy quantifiers: GIS-based multicriteria evaluation." Computers, Environment and Urban Systems 30(4): 437–455.
🎯

Compose: TOPSIS Suitability

topsis_suitability
Technique for Order Preference by Similarity to Ideal Solution. Three-pass algorithm: (1) vector normalization across all valid cells, (2) identify ideal-best and ideal-worst points per criterion (benefit criteria: max=ideal; cost criteria: min=ideal), (3) per-cell Euclidean distances d⁺ and d⁻, closeness coefficient = d⁻/(d⁺+d⁻) scaled to 0–100. Handles benefit and cost criteria explicitly via the impacts CSV.
Ci = di / (di+ + di)    di+ = √Σj wj(vijvj+
Hwang, C.L. & Yoon, K. (1981). Multiple Attribute Decision Making: Methods and Applications. Springer. · Opricovic, S. & Tzeng, G.H. (2004). "Compromise solution by MCDM methods." European Journal of Operational Research 156(2): 445–455.
🤝

Compose: VIKOR Suitability

vikor_suitability
VIseKriterijumska Optimizacija I Kompromisno Resenje — compromise ranking method that balances group utility (majority rule) against individual regret (minority protection). Produces three metrics: S (weighted Manhattan distance = group utility), R (maximum weighted Chebyshev distance = individual regret), and Q (compromise index with weight v, default 0.5). Lower values are better for all three.
Si = Σj wj(xj*xij)/(xj*xj)    Ri = maxj [wj(xj*xij)/(xj*xj)]
Opricovic, S. (1998). Multicriteria Optimization of Civil Engineering Systems. PhD Thesis, University of Belgrade.
🔀

Compose: Ensemble Suitability

ensemble_suitability
Fuses two or more suitability rasters (e.g., WLC + TOPSIS + VIKOR) into a single ensemble surface via arithmetic mean. Reduces method-specific bias — if WLC, TOPSIS, and VIKOR all score a cell highly, confidence is higher than if only one method does. Output is a consensus suitability raster (0–100) with disagreement metrics.
Methodological triangulation. Ensemble suitability is not "averaging away uncertainty" — it's surfacing areas where methods agree (robust zones) vs. where they disagree (fragile zones). Use the Scenario Disagreement Attention tool to map the disagreement explicitly.
📉

Compose: Opportunity Loss Map

opportunity_loss_map
Computes the per-cell difference between the maximum possible suitability score (given the criteria and constraints) and the achieved score under the chosen weights. Identifies locations where a different weighting scheme could substantially improve the suitability rating — candidate zones for sensitivity testing or stakeholder negotiation.
Li = SimaxSi    where Simax is the best possible score at cell i under any weight vector
📍

Compose: Candidate Site Extractor

candidate_site_extractor
Extracts contiguous zones of high suitability as candidate site polygons. Applies a suitability threshold (e.g., ≥75), minimum area filter, and optional constraint overlay. Output is a vector polygon layer with mean suitability, area, and perimeter metrics per candidate site — ready for field verification or stakeholder review.
🗺️

Compose: Priority Zoning from Suitability

priority_zoning_from_suitability
Classifies a continuous suitability raster into discrete priority zones (e.g., Tier 1/2/3/Excluded) using user-defined thresholds or quantile breaks. Produces a categorized integer raster and a zone-area summary table. Bridges the gap between continuous suitability scores and the discrete zoning categories that planning decisions require.

Compose: Scenario Consensus Zone

scenario_consensus_zone
Identifies spatial zones where multiple scenarios agree on high suitability — the "no-regret" areas that are robust to weighting assumptions. Also identifies zones of persistent low suitability and zones where scenarios diverge. Essential for defensible planning: actions in consensus zones are easier to justify than actions in contested zones.
⚠️

Compose: Scenario Disagreement Attention

scenario_disagreement_attention
Maps the per-cell standard deviation, range, or coefficient of variation across multiple scenario suitability rasters. High disagreement flags areas where the suitability rating is sensitive to weighting assumptions — these are priority zones for stakeholder dialogue, additional data collection, or conservative decision thresholds.

Compose: Decision Quadrant Map

decision_quadrant_map
Classifies every cell into a 2×2 decision quadrant based on two suitability dimensions (e.g., environmental suitability × economic suitability, or suitability × feasibility). Quadrants: High-High (priority action), High-Low (trade-off zone), Low-High (trade-off zone), Low-Low (exclusion). Produces a 4-class categorical raster with area statistics.

Compose: Intervention Conflict Matrix

intervention_conflict_matrix
Evaluates spatial conflicts between competing land-use interventions by overlaying their suitability rasters. Produces a conflict intensity raster and a pairwise conflict matrix showing where high suitability for intervention A coincides with high suitability for intervention B — zones requiring strategic trade-off decisions.
🔴

Compose: Risk-Opportunity Matrix Map

risk_opportunity_matrix_map
Combines a suitability (opportunity) surface with an uncertainty or hazard (risk) surface into a 4-class risk-opportunity matrix: High Opportunity / Low Risk (safe investment), High / High (risky investment), Low / Low (low priority), Low / High (avoid). Standard decision-support visualization for planning under uncertainty.
💔

Compose: Regret Fragility Map

regret_fragility_map
Computes the minimax regret — how much suitability is "left on the table" if the chosen scenario turns out to be suboptimal — per cell. For each cell, regret = max score across scenarios − score under the chosen scenario. High-regret zones are fragile to scenario choice; low-regret zones are robust. Essential for decisions under deep uncertainty.
Loomes, G. & Sugden, R. (1982). "Regret Theory: An Alternative Theory of Rational Choice Under Uncertainty." The Economic Journal 92(368): 805–824.
🛡️

Compose: Uncertainty-Adjusted Suitability

uncertainty_adjusted_suitability
Down-weights suitability scores by their Monte Carlo stability index. Cells with high suitability but low stability (high uncertainty) receive a penalty; cells with high suitability AND high stability retain their score. Produces a risk-adjusted suitability surface suitable for conservative planning decisions.
Sadj = S · (stability / 100)    or equivalently: suitability scaled by confidence
🔍

Compose: Scenario Comparator

scenario_comparator
Side-by-side comparison of up to 6 suitability scenarios with difference rasters, transition matrices (how cells change class between scenarios), and per-scenario area statistics. The comprehensive scenario comparison workbench — use this to understand how weighting assumptions reshape the suitability landscape before committing to a recommendation.
Uncertainty

Uncertainty Quantification

🎲

Uncertainty: Monte Carlo Suitability

montecarlo_suitability
Quantifies suitability uncertainty through chunk-based Monte Carlo simulation with Gaussian perturbation. Each cell's base suitability value is perturbed over N iterations (default 300) with configurable noise sigma (default 0.08 relative). Produces six output rasters: mean, standard deviation, 5th percentile, median, 95th percentile, and stability index (100 minus the P95–P05 spread). Fixed random seed (42) ensures reproducibility.
Parameters
ParameterTypeDefaultDescription
INPUTRasterSuitability raster (0–100)
ITERInteger300Simulation iterations (≥20)
SIGMADouble0.08Noise sigma (0–0.5, relative to value)
BLOCKInteger256Block size in pixels (64–2048)
OUT_MEANRasterMean suitability across iterations
OUT_STDRasterStandard deviation
OUT_P05Raster5th percentile
OUT_P50RasterMedian (50th percentile)
OUT_P95Raster95th percentile
OUT_STABRasterStability index (0–100, higher = more stable)
simt = base · (1 + N(0, σ))   clipped to [0, 100]    stability = 100 − (P95P05)
Interpretation. Stability ≥ 90: highly robust (perturbation barely changes the score). Stability 70–90: moderately robust. Stability < 70: fragile — the suitability score is sensitive to small changes in criteria values or weights. Fragile high-suitability cells are risky for irreversible land-use commitments.
XAI

Explainability

Explainable AI tools that decompose suitability scores to show which criteria drive the result at each location. Essential for transparent planning: a suitability map without explanation is a black box; with per-criterion contribution maps, every pixel's score can be justified.

📊

XAI: Global Sensitivity Analysis

global_sensitivity
One-at-a-time (OAT) sensitivity analysis: varies each criterion weight by ±Δ (default ±20%) while holding others constant, recomputes the suitability surface, and measures the spatial correlation (Spearman) and mean absolute deviation between original and perturbed outputs. Identifies which criteria the suitability model is most sensitive to — those with the highest influence on the output.
Interpretation. If perturbing criterion A's weight by ±20% changes the suitability map dramatically (low Spearman correlation, high MAD), criterion A is a critical driver — its weight must be defended with strong evidence. If criterion B's perturbation barely changes the output, its weight is less consequential and can be set with less precision.
🔍

XAI: Local Contribution Map

local_contribution
Decomposes each cell's suitability score into per-criterion contributions: contributionj = wj × xij. Produces one raster per criterion showing that criterion's contribution to the total score at every cell. The dominant criterion (highest contribution) can be mapped as a categorical raster showing "which criterion most drives the suitability score here."
Si = Σj cij    where cij = wj · xij is criterion j's contribution at cell i
🧮

XAI: GeoShapley-lite Approximation

xai_geoshapley_lite
Per-cell linear attribution of suitability deviation from a sampled global baseline, approximating a first-order Shapley decomposition. A global baseline (mean) is estimated per criterion from a random sample of valid overlapping cells (default 2,000). Each cell's attribution = Σi weighti × (criterioni − baselinei). Output raster: −100 to +100; positive = local conditions exceed the regional average, negative = they fall below. Avoids the exponential cost (2ⁿ) of exact Shapley computation while preserving marginal-contribution interpretability.
Shapley connection. In cooperative game theory, Shapley values fairly allocate a coalition's total payoff to individual players based on their marginal contributions across all possible coalitions. GeoShapley-lite treats each criterion as a "player" and the suitability score as the "payoff," using the global mean as the baseline coalition value. The first-order approximation (linear around the mean) captures the dominant attribution structure at a fraction of the computational cost.
Shapley, L.S. (1953). "A Value for n-Person Games." In Contributions to the Theory of Games II, Princeton, 307–317. · Lundberg, S.M. & Lee, S.-I. (2017). "A Unified Approach to Interpreting Model Predictions." NeurIPS 30.
Reporting

Reporting & Decision Support

Comprehensive reporting, auditing, and decision-support tools that transform raster suitability outputs into structured evidence for planning decisions. These tools bridge the gap between analytical outputs and the documents, scorecards, and narratives that planning processes require.

📄

Reporting: Suitability HTML Report

suitability_html_report
Generates a comprehensive HTML diagnostic report for a suitability raster: class-area distribution, descriptive statistics, spatial fragmentation metrics, constraint-impact summary, and per-criterion contribution breakdown. The primary reporting artifact for a single suitability model run.

Reporting: Numerical QA Check

numerical_qa_check
Validates raster numerical integrity: checks for valid data types (Float32), nodata consistency, value range compliance (0–100 for normalized criteria), and statistical summary coherence. Catches silent data corruption before it propagates into suitability models.
📊

Reporting: Beta Evidence Report

beta_evidence_report
Produces a structured evidence table linking each criterion to its data source, normalization method, weight derivation, and sensitivity rank. Designed to support the "evidence base" section of planning reports — every modeling choice is documented and traceable.
📝

Reporting: Scenario Markdown Brief

scenario_markdown_brief
Generates a Markdown briefing document per scenario: scenario name, weight vector, composition method, suitability class distribution, top candidate sites, uncertainty summary, and one-paragraph narrative interpretation. Ready for inclusion in planning documents or stakeholder packets.
📋

Reporting: Executive KPI Snapshot

executive_kpi_snapshot
Condenses multi-scenario suitability results into a one-page executive summary: total suitable area, top-5 candidate sites, method agreement score, stability index, dominant criteria, and a plain-language recommendation flag. Designed for decision-maker briefings.
📘

Reporting: Action Playbook Generator

action_playbook_generator
Translates suitability analysis into a phased action plan: Tier 1 zones → immediate action (0–2 years), Tier 2 → medium-term (2–5 years), Tier 3 → monitoring (5+ years). Includes implementation considerations, data confidence notes, and monitoring indicators per phase. The bridge from analysis to implementation.
🚦

Reporting: Deployment Readiness Gate

deployment_readiness_gate
Go/no-go checklist for suitability model deployment: data completeness, weight consensus, uncertainty thresholds, constraint coverage, method agreement, and documentation completeness. Each gate is scored pass/partial/fail with remediation suggestions. Prevents premature or under-documented models from reaching decision stages.
🎯

Reporting: Actionability Scorecard

actionability_scorecard
Scores each candidate site on actionability dimensions: suitability score, stability, parcel contiguity, infrastructure proximity, constraint clearance, and stakeholder alignment (when provided). Produces a ranked table with a composite actionability index — which sites are not just suitable, but ready to act on.
🏆

Reporting: Scenario Selection Recommender

scenario_selection_recommender
Recommends a preferred scenario from a set of alternatives using multi-metric ranking: suitability coverage, stability, regret minimization, method agreement, and policy alignment. Applies configurable weights to each metric and produces a ranked recommendation with justification text.
🌊

Reporting: Implementation Wave Planner

implementation_wave_planner
Structures candidate sites into sequential implementation waves based on suitability, contiguity, and infrastructure proximity. Wave 1 = highest suitability + lowest uncertainty + best connected. Wave 2 = high suitability + moderate uncertainty. Wave 3 = monitoring zone. Produces a wave map and phased timeline table.
📖

Reporting: Release Narrative Builder

release_narrative_builder
Generates a structured narrative document explaining the suitability analysis in plain language: what was analyzed, which methods were used, what the results show, where the certain and uncertain zones are, and what the recommended next steps are. Designed for public consultation and non-technical stakeholder communication.

Methodological Notes

Raster Alignment Requirement

All MCDA composition methods require perfectly aligned input rasters — identical CRS, extent, pixel size, and origin. A single misaligned raster will produce silently wrong suitability scores because GDAL reads values at offset locations. The Data Harmonizer enforces alignment; always run it before composing. The Numerical QA Check verifies alignment post-hoc.

Normalization and Direction

All criteria must be normalized to a common 0–100 scale before composition, with consistent direction: 100 = most suitable, 0 = least suitable. For cost criteria (distance to hazard, slope steepness, pollution concentration), the Normalizer inverts values so that low raw values → high normalized scores. Failing to invert a cost criterion will create a suitability map where hazardous areas appear "most suitable."

Weights vs. Order Weights

In OWA, criteria weights (wj) express the relative importance of each criterion (they sum to 1 and attach to specific criteria). Order weights (vk) express risk attitude (they sum to 1 and attach to sorted criterion values, not to specific criteria). The OWA operator nests WLC as a special case: when all order weights equal 1/n, OWA = WLC. When order weights = [1,0,0,...], OWA = MAX (fully optimistic). When order weights = [0,0,...,1], OWA = MIN (fully pessimistic).

Block-Wise Processing

All composition tools use configurable block-wise processing (default 256×256 pixel blocks) via GDAL's ReadAsArray/WriteArray. This keeps memory usage constant regardless of raster size — a 50,000×50,000 cell raster uses the same RAM as a 500×500 raster. Increase block size for faster processing on machines with ample RAM; decrease for memory-constrained environments.

The Constraint vs. Criterion Distinction

This is the most important conceptual distinction in MCDA for land suitability. Criteria are continuous: a lower score on one can be compensated by a higher score on another. Constraints are binary: no compensation is possible. A protected forest is not "less suitable" for development — it is excluded. The Constraint Builder enforces this by producing a strict 0/1 mask. Never include constraint layers as criteria with zero weight — they will still allow non-zero suitability in excluded cells due to the compensatory math.

Reproducibility

All stochastic tools (Monte Carlo, GeoShapley-lite sampling, K-Means initialization in PCA) use fixed random seeds. Monte Carlo uses seed 42. GeoShapley-lite uses seed 42 for its random sample. This ensures that re-running the same tool on the same inputs produces bitwise-identical outputs — essential for auditable planning evidence. To vary the stochastic component (e.g., for a different Monte Carlo draw), change the seed by adjusting the sigma or sample size slightly, or modify the source code seed constant.

Academic References

The following works inform the methodological choices in PlanX Suitability Lab. Each algorithm cites the specific references most relevant to its implementation.

Diakoulaki, D., Mavrotas, G. & Papayannakis, L. (1995). "Determining objective weights in multiple criteria problems: The CRITIC method." Computers & Operations Research 22(7): 763–770.

Eastman, J.R. (2012). IDRISI Selva Manual. Clark Labs, Clark University.

Hwang, C.L. & Yoon, K. (1981). Multiple Attribute Decision Making: Methods and Applications. Springer.

Jankowski, P. & Richard, L. (1994). "Integration of GIS-based suitability analysis and multicriteria evaluation in a spatial decision support system." Environment and Planning B 21(3): 323–340.

Lundberg, S.M. & Lee, S.-I. (2017). "A Unified Approach to Interpreting Model Predictions." Advances in Neural Information Processing Systems 30.

Malczewski, J. (1999). GIS and Multicriteria Decision Analysis. Wiley.

Malczewski, J. (2000). "On the Use of Weighted Linear Combination Method in GIS." International Journal of Geographical Information Science 14(6): 567–590.

Malczewski, J. (2006). "GIS-based multicriteria decision analysis: a survey of the literature." International Journal of Geographical Information Science 20(7): 703–726.

Malczewski, J. & Rinner, C. (2015). Multicriteria Decision Analysis in Geographic Information Science. Springer.

Opricovic, S. (1998). Multicriteria Optimization of Civil Engineering Systems. PhD Thesis, University of Belgrade.

Opricovic, S. & Tzeng, G.H. (2004). "Compromise solution by MCDM methods: A comparative analysis of VIKOR and TOPSIS." European Journal of Operational Research 156(2): 445–455.

Saaty, T.L. (1980). The Analytic Hierarchy Process. McGraw-Hill.

Saaty, T.L. (2008). "Decision making with the analytic hierarchy process." International Journal of Services Sciences 1(1): 83–98.

Shannon, C.E. (1948). "A Mathematical Theory of Communication." Bell System Technical Journal 27(3): 379–423.

Shapley, L.S. (1953). "A Value for n-Person Games." In Contributions to the Theory of Games II, Princeton University Press, 307–317.

Yager, R.R. (1988). "On Ordered Weighted Averaging Aggregation Operators in Multicriteria Decisionmaking." IEEE Transactions on Systems, Man, and Cybernetics 18(1): 183–190.

Yoon, K. (1987). "A Reconciliation Among Discrete Compromise Solutions." Journal of the Operational Research Society 38(3): 277–286.