Change Detection & Spatio-temporal Analysis
Purpose: separate real surface change from the four great impostors —
misregistration, radiometric drift, phenology, and classification error.
Every method below exists to control one of them; skipping the controls
produces confident maps of nothing.
Preconditions (where change detection is won or lost)
Preconditions 1 and 2 are checked here but established elsewhere. When
either fails, the owning skill leads and this skill resumes once comparable
observations exist. Precondition 3 is this skill's own problem and is never a
reason to route away.
- Co-registration: sub-pixel alignment between dates (AROSICS or
manual tie-points). Half a pixel of shift creates edge-shaped phantom
change everywhere. Verify: flicker-compare crisp features. For elevation
surfaces or point clouds, vertical datum agreement, co-registration and
the vertical-accuracy budget belong to
point-cloud-lidar — a datum
offset is not subsidence.
- Radiometric consistency: same processing level (surface
reflectance), same sensor, same processing baseline. If any of the three
differ, this is a harmonization problem, not a thresholding one: hand it
to
remote-sensing-analysis (HLS for Landsat↔Sentinel-2, relative
normalization with PIFs, BOA_ADD_OFFSET across the Sentinel-2 2022
baseline change).
- Same season / phenological stage for bi-temporal work — a May vs
September pair "detects" summer. If season can't be matched, use
composites or time-series methods instead.
- Cloud/shadow masks intersected across dates; analyze only mutually
valid pixels and report that coverage %.
Method selection
| Situation |
Method |
| Two dates, continuous "how much" |
Index differencing (ΔNDVI, ΔNBR...) with statistical thresholding |
| Two dates, categorical "from-what-to-what" |
Post-classification comparison (only with strong classifiers) |
| Two dates, multivariate robust |
Change vector analysis (CVA); MAD/iMAD for sensor-robust detection |
| Dense stack, gradual + abrupt |
Trend + break analysis (BFAST/LandTrendr/CCDC family; at archive scale → google-earth-engine) |
| Structure change (buildings) |
DL bi-temporal segmentation (siamese U-Net) → geo-deep-learning |
| SAR pairs (clouds, disasters) |
Log-ratio of calibrated backscatter + speckle handling |
| Vector vintages (parcels, buildings) |
Geometry+attribute diff with tolerance (below) |
Thresholding — never eyeball it
Difference images need a defensible threshold: μ ± k·σ on the difference
histogram (report k), Otsu when bimodal, or supervised thresholds
calibrated on labeled change/no-change samples. Deliver the histogram with
the chosen cut marked. Sensitivity: report changed-area at k-0.5 and
k+0.5; if the story flips, the detection is fragile — say so.
Post-classification comparison (PCC) — handle with care
PCC error compounds: two 90%-accurate maps yield ≤ ~81% change accuracy,
and biased errors create systematic false transitions. Rules:
- Use ONE classifier trained on both dates' imagery (same legend, same
features) rather than two independent legacy maps.
- Build the full transition matrix (from-class → to-class areas), not
just a change/no-change binary — impossible transitions (water→forest
in 1 year) are your error detector.
- Apply a minimum mapping unit consistent across dates before differencing.
Time-series (dense stack) analysis
- Build a gap-filled, cloud-masked index stack (xarray, time dimension).
- Decompose trend + seasonality + breaks; per-pixel linear trends need
significance testing (Mann-Kendall + Sen's slope for monotonic trends —
and FDR correction across millions of pixels, or your "greening map" is
noise).
- Label break DATES, not just presence — timing is usually the analytic
payload (when did clearing start?).
- Validate detected breaks against known events (fires, construction
permits, disaster dates) wherever records exist.
Vector change audit (two vintages of the same layer)
- Match features by stable ID if it exists; else spatial matching with IoU
threshold (report it).
- Classify: added / removed / geometry-changed (area delta > tolerance) /
attribute-changed. Tolerances absorb digitization jitter — 1-2 m for
cadastre-grade, more for digitized-from-imagery.
- Sum area deltas by class and reconcile totals; unexplained residual =
matching bugs.
Accuracy assessment (the deliverable's spine)
Change is rare, so random sampling wastes effort on stable pixels — use
stratified sampling (strata: change/no-change or per-transition) with
good-practice area estimation (Olofsson et al. protocol): report
user's/producer's accuracy per stratum AND area estimates with
confidence intervals adjusted for map error. A raw pixel count of the
change map is a biased area estimate — always say the adjusted number.
Reporting template
## Change: <phenomenon>, <T1> → <T2 or period>
- Data: <sensor/level>, co-registration RMSE: <px>, valid overlap: <%>
- Method: <...> threshold/params: <...> (sensitivity: <stable/fragile>)
- Transitions: <matrix or top-5 list with areas ± CI>
- Accuracy: stratified n=<>, UA/PA per class, adjusted areas ± CI
- Impostor controls: season <matched?>, radiometry <harmonized?>
Pitfalls checklist
- Phantom edge-change from misregistration.
- Seasonal difference sold as land cover change.
- PCC with two independently produced legacy maps.
- Threshold chosen "because it looked right", no sensitivity.
- Raw changed-pixel counts reported as area (no error-adjusted estimate).
- Trend maps without multiple-testing control.
- SAR change on unfiltered linear-power images.
Execution contract
- Workflow: define the change question; harmonize extent, season, radiometry, resolution, and registration; select method; estimate change; validate; report uncertainty.
- Decision rules: use direct differencing only for comparable continuous signals, post-classification comparison for stable class legends, and time-series methods when a dense temporal stack exists.
- Verification protocol: quantify co-registration, valid overlap, threshold sensitivity, transition accounting, and accuracy-adjusted area with confidence intervals.
- Failure modes: reject causal change claims when season, sensor, clouds, registration, or independent map errors can explain the signal.
- Deliverables: change map, transition or trend table, parameter record, validation sample and metrics, adjusted-area estimate, and limitations.
- Source freshness: consult the authoritative source registry before using version-sensitive products or APIs and record the checked date.
1---2name: change-detection3description: Change analysis, once the observations are comparable. Not for cases whose blocker is comparability itself: mixed sensors, product levels or processing baselines to remote-sensing-analysis, undocumented vertical datums to point-cloud-lidar, multi-decade archive trends over large areas to google-earth-engine. Matching product level does not prove comparability. Otherwise invoke for what, where or how much changed: two-scene comparison, deforestation, urban growth, disaster damage, parcel-change audits, bi-temporal differencing, post-classification comparison, adjusted area, break detection in a series in hand (BFAST/LandTrendr/CCDC). Seasonal mismatch is this skill's own confounder; a documented datum with a stated accuracy budget is settled comparability. Keep both.4license: MIT5---67# Change Detection & Spatio-temporal Analysis89Purpose: separate real surface change from the four great impostors —10misregistration, radiometric drift, phenology, and classification error.11Every method below exists to control one of them; skipping the controls12produces confident maps of nothing.1314## Preconditions (where change detection is won or lost)1516Preconditions 1 and 2 are *checked* here but *established* elsewhere. When17either fails, the owning skill leads and this skill resumes once comparable18observations exist. Precondition 3 is this skill's own problem and is never a19reason to route away.20211. **Co-registration**: sub-pixel alignment between dates (AROSICS or22 manual tie-points). Half a pixel of shift creates edge-shaped phantom23 change everywhere. Verify: flicker-compare crisp features. For elevation24 surfaces or point clouds, vertical datum agreement, co-registration and25 the vertical-accuracy budget belong to `point-cloud-lidar` — a datum26 offset is not subsidence.272. **Radiometric consistency**: same processing level (surface28 reflectance), same sensor, same processing baseline. If any of the three29 differ, this is a harmonization problem, not a thresholding one: hand it30 to `remote-sensing-analysis` (HLS for Landsat↔Sentinel-2, relative31 normalization with PIFs, `BOA_ADD_OFFSET` across the Sentinel-2 202232 baseline change).333. **Same season / phenological stage** for bi-temporal work — a May vs34 September pair "detects" summer. If season can't be matched, use35 composites or time-series methods instead.364. **Cloud/shadow masks intersected across dates**; analyze only mutually37 valid pixels and report that coverage %.3839## Method selection4041| Situation | Method |42|---|---|43| Two dates, continuous "how much" | Index differencing (ΔNDVI, ΔNBR...) with statistical thresholding |44| Two dates, categorical "from-what-to-what" | Post-classification comparison (only with strong classifiers) |45| Two dates, multivariate robust | Change vector analysis (CVA); MAD/iMAD for sensor-robust detection |46| Dense stack, gradual + abrupt | Trend + break analysis (BFAST/LandTrendr/CCDC family; at archive scale → `google-earth-engine`) |47| Structure change (buildings) | DL bi-temporal segmentation (siamese U-Net) → `geo-deep-learning` |48| SAR pairs (clouds, disasters) | Log-ratio of calibrated backscatter + speckle handling |49| Vector vintages (parcels, buildings) | Geometry+attribute diff with tolerance (below) |5051## Thresholding — never eyeball it5253Difference images need a defensible threshold: μ ± k·σ on the difference54histogram (report k), Otsu when bimodal, or supervised thresholds55calibrated on labeled change/no-change samples. Deliver the histogram with56the chosen cut marked. Sensitivity: report changed-area at k-0.5 and57k+0.5; if the story flips, the detection is fragile — say so.5859## Post-classification comparison (PCC) — handle with care6061PCC error compounds: two 90%-accurate maps yield ≤ ~81% change accuracy,62and biased errors create systematic false transitions. Rules:6364- Use ONE classifier trained on both dates' imagery (same legend, same65 features) rather than two independent legacy maps.66- Build the full **transition matrix** (from-class → to-class areas), not67 just a change/no-change binary — impossible transitions (water→forest68 in 1 year) are your error detector.69- Apply a minimum mapping unit consistent across dates before differencing.7071## Time-series (dense stack) analysis7273- Build a gap-filled, cloud-masked index stack (xarray, time dimension).74- Decompose trend + seasonality + breaks; per-pixel linear trends need75 significance testing (Mann-Kendall + Sen's slope for monotonic trends —76 and FDR correction across millions of pixels, or your "greening map" is77 noise).78- Label break DATES, not just presence — timing is usually the analytic79 payload (when did clearing start?).80- Validate detected breaks against known events (fires, construction81 permits, disaster dates) wherever records exist.8283## Vector change audit (two vintages of the same layer)8485- Match features by stable ID if it exists; else spatial matching with IoU86 threshold (report it).87- Classify: added / removed / geometry-changed (area delta > tolerance) /88 attribute-changed. Tolerances absorb digitization jitter — 1-2 m for89 cadastre-grade, more for digitized-from-imagery.90- Sum area deltas by class and reconcile totals; unexplained residual =91 matching bugs.9293## Accuracy assessment (the deliverable's spine)9495Change is rare, so random sampling wastes effort on stable pixels — use96**stratified sampling** (strata: change/no-change or per-transition) with97good-practice area estimation (Olofsson et al. protocol): report98user's/producer's accuracy per stratum AND **area estimates with99confidence intervals** adjusted for map error. A raw pixel count of the100change map is a biased area estimate — always say the adjusted number.101102## Reporting template103104```105## Change: <phenomenon>, <T1> → <T2 or period>106- Data: <sensor/level>, co-registration RMSE: <px>, valid overlap: <%>107- Method: <...> threshold/params: <...> (sensitivity: <stable/fragile>)108- Transitions: <matrix or top-5 list with areas ± CI>109- Accuracy: stratified n=<>, UA/PA per class, adjusted areas ± CI110- Impostor controls: season <matched?>, radiometry <harmonized?>111```112113## Pitfalls checklist114115- Phantom edge-change from misregistration.116- Seasonal difference sold as land cover change.117- PCC with two independently produced legacy maps.118- Threshold chosen "because it looked right", no sensitivity.119- Raw changed-pixel counts reported as area (no error-adjusted estimate).120- Trend maps without multiple-testing control.121- SAR change on unfiltered linear-power images.122123## Execution contract124125- **Workflow:** define the change question; harmonize extent, season, radiometry, resolution, and registration; select method; estimate change; validate; report uncertainty.126- **Decision rules:** use direct differencing only for comparable continuous signals, post-classification comparison for stable class legends, and time-series methods when a dense temporal stack exists.127- **Verification protocol:** quantify co-registration, valid overlap, threshold sensitivity, transition accounting, and accuracy-adjusted area with confidence intervals.128- **Failure modes:** reject causal change claims when season, sensor, clouds, registration, or independent map errors can explain the signal.129- **Deliverables:** change map, transition or trend table, parameter record, validation sample and metrics, adjusted-area estimate, and limitations.130- **Source freshness:** consult [the authoritative source registry](references/authoritative-sources.md) before using version-sensitive products or APIs and record the checked date.