Read this before interpreting any result
Methodology
The central caveat
SandWatch does not detect “illegal mining.” No verified, adjudicated register of illegal extraction sites exists anywhere, and none is used here. What is actually studied is whether physical disturbance signatures visible in Sentinel-2 imagery — exposed sediment, altered water extent, channel change — correlate with independently reported extraction activity at real river reaches. A disturbance signature can equally arise from floods, construction, agriculture, or natural channel migration, and extraction itself can be legal, licensed, informally tolerated, or contested depending on jurisdiction.
Label-confidence hierarchy
Labels are never merged across these tiers:
- Level A — externally verified, adjudicated sites. Not available to this project.
- Level B — expert manual annotation. Not used as a label; only an informal single-annotator usability check (is the river visible, is the scene cloud-free) feeds into the pipeline.
- Level C — weak/proxy labels from documented press, NGO, or academic reports. This is the label source used for every result on this site.
- Level D — unlabeled imagery, used only for context, never for evaluation.
A Level-C “no report found” label is a weak negative, not a verified absence of extraction — absence of press coverage is not evidence of absence.
Data sources
Imagery: Sentinel-2 L2A, fetched as windowed Cloud-Optimized GeoTIFF reads (not full scenes) from the public AWS sentinel-cogs bucket via the Element84 Earth Search STAC API — no account or API key required. River geometry: live OpenStreetMap data via the Overpass API, clipped to a coarse reach-scale window around a real, already-public anchor town named in the source reporting (never a precise site coordinate). Every scene actually used, with its real scene ID, date, and cloud cover, is listed on the Data page.
Feature extraction
For each reach, the least-cloudy available real scene is selected in a recent window (Nov 2024–Apr 2025) and a baseline window (Nov 2018–Apr 2019). Pixels flagged as cloud/shadow/snow by the Sentinel-2 Scene Classification Layer are excluded. At each sample point inside the buffered river-corridor polygon (not the bounding box), NDVI, NDWI, MNDWI, and a bare-soil index are computed for both dates, along with their temporal differences.
Spatial evaluation
Evaluation uses leave-one-river-out cross-validation: every fold holds out one entire river reach, and no point from that reach appears in training for that fold. This is enforced structurally, not just checked after the fact — see src/sandwatch/splits.py and its tests in the source repository. A random per-point split would leak, since points within a reach share a scene, a date, and a label.
With only seven reaches, each fold’s test set carries a single label value, so per-fold precision/recall are not separately meaningful — results are reported pooled across folds, with explicit small-sample caveats throughout.
What this project cannot claim
- Not the first satellite-based sand-mining detection system — see the literature review.
- Not verified detection of illegal activity — no located prior work has this either.
- Not a statistically powerful generalization result — n=7 reaches is small.
- Not proof that the two comparison reaches have zero extraction — only that no report was found.