Alteration mapping

Research question 2a: Can alteration zones be read from satellite alone, without a ground-truthed spectral library?

Short answer: Yes for a relative anomaly, no for a mineral identity — and the gap between those two is the whole story.

Band ratios are relative and self-referential: they compare a scene to itself, so they flag where alteration is stronger than average with no calibrated library and no ground spectra. That is enough for a screening layer. It is not enough to name a mineral, and it is certainly not enough to call a pixel gold-bearing.

1. Assemblage first: orogenic, not epithermal

Most "alteration mapping with satellite" tutorials are built around epithermal gold systems, whose advanced-argillic halos carry alunite, kaolinite, and dickite — minerals with sharp, separable Al-OH absorptions near 2.16–2.20 µm that ASTER maps beautifully. That is the canonical story. It is the wrong story for a greenstone belt.

Orogenic (mesothermal / lode) gold forms deeper, in metamorphosed greenstone, along shears and faults. Its alteration assemblage is:

Halo zone Minerals Diagnostic absorption Sensor that can see it
Phyllic / sericitic (proximal) sericite, muscovite, illite Al-OH ~2200 nm ASTER SWIR b5–b7; HSI; S2 only coarsely
Propylitic / carbonate (distal, listwaenite) chlorite, epidote, calcite / dolomite / ankerite Mg-OH / carbonate ~2300–2350 nm ASTER SWIR b7–b9; HSI; not S2
Silicification quartz TIR emissivity minimum ~9 µm (no SWIR feature) ASTER TIR (post-2008 OK); HSI: no
Gossan / sulphide (oxidised) Fe-oxides Fe³⁺ VNIR S2 / Landsat — see iron-oxide arm

Two consequences for this analysis: the carbonate / Mg-OH 2300–2350 nm feature is at least as important as the Al-OH feature (carbonate alteration and listwaenite are classic orogenic-gold vectors), and silica has no shortwave feature at all — it shows only as a TIR emissivity low, which ASTER's surviving TIR detector can read.

Getting the assemblage wrong is the most common way these analyses go silently wrong.


2. Why band ratios need no calibrated library

A spectral library is needed when you want to match a pixel's full spectrum to a named mineral — shape-fitting against reference curves. That is identity, and it requires calibrated, continuum-removed reflectance compared to known endmembers.

A band ratio asks a smaller, library-free question: within this one scene, is band X relatively brighter or darker than band Y at this pixel?

Ratios give you a relative alteration anomaly map for free, with no library and no ground truth. What they cannot give you is which mineral — that ceiling is set by how many, and how narrow, the sensor's SWIR bands are.


3. Sentinel-2: a coarse proxy and its hard limit

S2 was designed for vegetation and land cover, not geology. In the SWIR it has only two bands, both at 20 m:

B11  ~1610 nm  (1565–1655)
B12  ~2190 nm  (2100–2280)

The standard relative clay/hydroxyl ratio is B11 / B12 — the two-SWIR-band analogue of the Landsat TM 5/7 clay ratio. It works, but note what B12's window swallows:

The diagnostic Al-OH (~2200 nm, sericite) and Mg-OH/carbonate (~2300–2350 nm, chlorite/ankerite) absorptions both fall inside the single wide B12 band. B11/B12 therefore collapses sericite, chlorite, clay, and carbonate into one undifferentiated hydroxyl number. It cannot separate the proximal Al-OH halo from the distal carbonate halo — the exact distinction that matters for orogenic gold.

Implemented indices

Index Formula Keys on Honest read
Clay / hydroxyl B11 / B12 relative SWIR hydroxyl anomaly coarse, undifferentiated; clay-rich laterite lights up like real alteration
Ferric–clay composite B04 / B11 plotted against B11/B12 two relative axes side by side lets the holder eyeball "iron-ish vs clay-ish" without fusing into one ambiguous score

Bands fetched: B04, B08, B11, B12, SCL. B04 and B08 build the NDVI vegetation mask; SCL removes cloud, shadow, cirrus, saturated, and no-data pixels (classes 0, 1, 3, 8, 9, 10).

# research/mineral-prospecting/alteration-mapping/s2_alteration.py
import folia

# fetch S2 L2A bands over the claim AOI
ds = folia.fetch(
    "@esa/sentinel-2/l2a",
    aoi=AOI_GEOJSON,
    bands=["B04", "B08", "B11", "B12", "SCL"],
    date_range=("2023-01-01", "2024-12-31"),
    cloud_cover_max=20,
)

# relative clay/hydroxyl ratio (library-free, self-referential)
clay_hydroxyl = ds["B11"] / ds["B12"]

# vegetation mask (suppress false positives over dense canopy)
ndvi = (ds["B08"] - ds["B04"]) / (ds["B08"] + ds["B04"])
clay_hydroxyl = clay_hydroxyl.where(ndvi < 0.4)
S2 B11/B12 clay-hydroxyl ratio over the claim AOI. Warmer colours indicate stronger relative hydroxyl signal.
S2 B11/B12 clay-hydroxyl ratio. A relative anomaly only — sericite, chlorite, and carbonate are indistinguishable at this spectral resolution.
S2 two-axis composite: red channel = B04/B11 ferric proxy, green channel = B11/B12 clay proxy.
S2 ferric–clay composite. Red = iron-rich pixels (B04/B11); green = clay/hydroxyl-rich pixels (B11/B12). Overlap indicates gossan-over-alteration candidates worth ground-checking.
S2 alteration summary composite over the full claim outline.
S2 alteration summary with claim boundary overlaid. Use this as a screening layer to prioritise field traverses, not as a mineral map.

The S2 answer to Q2a: yes, you get a free, always-available, library-free screening layer for clay/hydroxyl alteration. It is coarse and ambiguous — a "look here first," never a mineral map. This is the floor; ASTER and imaging spectroscopy are the ceiling.


4. ASTER: the right multispectral tool (pre-2008 SWIR only)

ASTER's six SWIR bands at 30 m were designed to straddle exactly the orogenic alteration features S2 blurs together:

ASTER SWIR band centres (µm):
  b4 1.65   b5 2.165   b6 2.205   b7 2.26   b8 2.33   b9 2.395
                        └─Al-OH──┘           └──Mg-OH / carbonate──┘
ASTER's SWIR detector failed in approximately April 2008. Every ASTER scene acquired after that date is SWIR-blind. All ratios below require a pre-2008 scene. The VNIR (b1–b3) and TIR (b10–b14) detectors survived and remain usable on modern acquisitions, but they do not resolve the 2–2.4 µm alteration features.

Al-OH / phyllic index (proximal sericite halo)

Rowan and Mars (2003) phyllic ratio: b5 / b6 — high where the b6 trough marks the Al-OH absorption at 2.205 µm. Variants include b7 / b6 and (b5 + b7) / b6.

Carbonate / Mg-OH / chlorite index (distal halo, listwaenite)

Rowan and Mars (2003) carbonate index: (b6 + b9) / (b7 + b8) — high over the 2.3–2.35 µm carbonate/Mg-OH absorption straddled by b8. A related index, b8 / b9, targets Mg-OH and chlorite more specifically.

These are relative ratios, not mineral maps — the same logic as §2.

# research/mineral-prospecting/alteration-mapping/aster_alteration.py
import numpy as np
import rasterio
from rasterio.windows import from_bounds
import folia

# folia: discovery and URL signing (ASTER SWIR is one 6-band COG, not per-band)
# folia.fetch() returns only band 1 of a multiband COG, so we sign then read
# directly via rasterio — see implementation note below
items = folia.catalog.items_for_aoi(
    "@nasa/aster/l1t",
    aoi=AOI_GEOJSON,
    date_range=("2000-01-01", "2008-01-01"),
)
swir_url = folia.catalog._sign_url(items[0].assets["SWIR"].href)

with rasterio.open(swir_url) as src:
    window = from_bounds(*AOI_BOUNDS_UTM, transform=src.transform)
    # bands 1–6 of the SWIR COG = ASTER b4–b9 in order
    arr = src.read(window=window).astype(float)
    arr[arr == 0] = np.nan          # mask DN=0 no-data

b4, b5, b6, b7, b8, b9 = arr[0], arr[1], arr[2], arr[3], arr[4], arr[5]

aloh      = b5 / b6                      # Al-OH / phyllic (sericite)
carbonate = (b6 + b9) / (b7 + b8)       # carbonate / Mg-OH
mgoh      = b8 / b9                      # Mg-OH / chlorite
Multiband COG reader gap. folia.fetch() returns only band 1 of a multiband COG. ASTER ships its SWIR data as a single 6-band COG, so the script uses folia for discovery and URL signing, then performs the windowed multiband read directly via rasterio. This is a genuine reader gap for multiband COGs, consistent with the known Python/TS COG-reader divergence in the platform. A ticket to handle multiband reads natively is warranted if multiband COGs become common.
ASTER b5/b6 Al-OH ratio (2005-11-13 scene). Warmer colours indicate stronger sericite/muscovite anomaly.
ASTER b5/b6 Al-OH ratio, 2005-11-13. Relative sericite/muscovite anomaly — the proximal phyllic halo. Where this overlaps a mapped structure, it is a credible alteration vector.
ASTER (b6+b9)/(b7+b8) carbonate/Mg-OH index. Warmer colours indicate stronger carbonate or Mg-OH signal.
ASTER (b6+b9)/(b7+b8) carbonate/Mg-OH index. Distal halo proxy — carbonate alteration and listwaenite are classic orogenic-gold pathfinders at this wavelength.
ASTER b8/b9 Mg-OH/chlorite index over the claim AOI.
ASTER b8/b9 Mg-OH/chlorite index. Chlorite is the distal propylitic mineral in this assemblage; elevated values at the claim margin warrant cross-checking against the structural lineament layer.

ASTER's ceiling: even six SWIR bands discriminate mineral groups (Al-OH vs Mg-OH/carbonate), not species (muscovite vs illite vs phengite). For an arbitrary claim, a usable pre-2008 SWIR scene is roughly a coin-flip; this claim is fortunate.


5. Pre-2008 ASTER coverage of this claim

aster_alteration.py queries @nasa/aster/l1t on the Microsoft Planetary Computer, whose ASTER subset spans approximately 2000–2006 — entirely within the usable SWIR window. Five pre-2008 scenes intersect the AOI, all carrying the SWIR asset. The 2005-11-13 scene was selected and processed.

Date Scene ID
2000-08-22 AST_L1T_00308222000082657_20150411060450
2001-06-27 AST_L1T_00306272001204859_20170807204458
2003-01-26 AST_L1T_00301262003081917_20150426232615
2003-11-19 AST_L1T_00311192003081243_20150502022320
2005-11-13 AST_L1T_00311132005204014_20170801221104 (used)

Outputs are relative Al-OH and carbonate/Mg-OH anomaly ratios written to outputs/aster_*.tif and outputs/aster_coverage.json. They are not mineral maps. The right next step is to overlay the Al-OH and carbonate highs on the structure-lineaments layer and the holder's field notes — alteration on a mapped structure is a far stronger vector than alteration in isolation.


6. Imaging spectroscopy: the true ceiling, and EMIT coverage

The honest top of the ladder is imaging spectroscopy: hundreds of contiguous narrow bands that resolve the shape of the 2200 nm and 2300–2350 nm features well enough to identify sericite vs chlorite vs carbonate by spectral-feature fitting.

EMIT (NASA, on the ISS, approximately 285 bands at 7.5 nm, 60 m) images within approximately ±52° latitude. emit_coverage_check.py queries @nasa/emit/l2a-reflectance via the open STAC browse API (no download).

# research/mineral-prospecting/alteration-mapping/emit_coverage_check.py
import folia

items = folia.catalog.search(
    "@nasa/emit/l2a-reflectance",
    aoi=AOI_GEOJSON,
    date_range=("2022-01-01", "2026-12-31"),
)
# prints granule ids, dates, cloud fraction
# writes outputs/emit_coverage.json
# no byte download — EMIT L2A is behind Earthdata Login

Seven EMIT L2A granules intersect the AOI (2024–2026); three are cloud-free:

Date Cloud cover Granule ID
2024-02-23 0 % EMIT_L2A_RFL_001_20240223T115131_2405408_006
2024-03-02 4 % EMIT_L2A_RFL_001_20240302T084202_2406206_006
2024-05-02 0 % EMIT_L2A_RFL_001_20240502T083431_2412305_056
2024-11-04 0 % EMIT_L2A_RFL_001_20241104T065732_2430904_013
2024-11-12 100 % EMIT_L2A_RFL_001_20241112T132436_2431708_041
2025-01-15 83 % EMIT_L2A_RFL_001_20250115T120359_2501507_030
2026-03-02 100 % EMIT_L2A_RFL_001_20260302T074345_2606105_019
This is a coverage check only — no reflectance data was downloaded. EMIT L2A reflectance is netCDF behind Earthdata Login. Pulling and subsetting the reflectance cube and running continuum-removal and diagnostic-feature shape-fitting is the real next step (authentication required, deliberately out of scope here). Granule counts and dates are written to outputs/emit_coverage.json.

PRISMA (ASI) and EnMAP (DLR) would also resolve this assemblage. Both are tasked sensors (you request an acquisition; archives are thin and partly access-gated) and neither exposes an open STAC catalog to probe the way EMIT does. They are named here as the true tool, not a fetchable layer.


7. EMIT hyperspectral: the alteration ceiling, tested

The coverage check in §6 is only a promise. Here it is cashed: one real EMIT L2A reflectance granule, pulled over the claim, orthorectified, and run through continuum-removal band-depth mapping at the orogenic alteration features. The granule is EMIT_L2A_RFL_001_20240223T115131_2405408_006 (NASA EMIT on the ISS, 2024-02-23, 0% cloud, ~60 m pixels, 240 of 285 bands kept after dropping water-vapor/detector windows). It was the lowest-cloud of the seven intersecting granules.

The honest headline is a caveat, and that caveat is the result.

The 300 ha AOI is 100% vegetated (NDVI 0.49 to 0.82, median 0.73, on this late-wet-season scene). There is no exposed bare rock in any of the ~3000 EMIT pixels. The deep, scene-wide absorption near 2300 nm that a naive run would report everywhere as "Mg-OH / carbonate alteration" is canopy ligno-cellulose, not mineralogy: its band depth correlates with NDVI at r = +0.73. Reading it as chlorite or carbonate or listwaenite would be a silent failure. We do not report it as a mineral. Vegetation-dominated pixels are flagged as their own class, and the 2300 nm signal is withheld.
EMIT NDVI over the claim AOI, 2024-02-23. The entire scene is high-NDVI vegetation.
EMIT NDVI, 2024-02-23. The entire AOI is vegetated (median 0.73); not one pixel is bare ground. This is the confound, shown first, because it drives the loud 2300 nm signal that a careless run would mistake for carbonate alteration.

The one feature whose band depth was decoupled from NDVI (r = -0.03) in the wet scene is a faint Al-OH absorption near 2200 nm, shallow (mean depth 0.04, max 0.11) and concentrated in the NW corner of the AOI at about 3% of pixels. At the time of the wet-season analysis, its vegetation-independence made it a candidate sub-canopy white-mica signal. The dry-season check in the subsection below resolved that question: it is a soil/litter artifact. The figure below shows the wet-season signal as it appeared before that check.

EMIT Al-OH band depth near 2200 nm. Shallow signal concentrated in the NW corner.
EMIT Al-OH band depth (~2200 nm), wet season (2024-02-23). Shallow and concentrated NW. This was the wet-scene feature that appeared vegetation-independent; the dry-season check (2024-11-04) showed it to be a bright-soil and dry-litter artifact, not white mica. Retained for transparency and cross-scene comparison.
No pixel here is "this is sericite." The Al-OH feature is shallow and unsupervised, with no ground truth to calibrate it. The dry-season analysis (subsection below) showed the feature does not hold up as mineralogy: its minimum pins at the analysis-window edge in 69 % of dry-scene pixels, true two-sided absorptions decreased rather than increased, and the NW anomaly shifted away from the white-mica diagnostic position. It is retained on the map for transparency.

The vegetation-aware classification reports vegetation-dominated for 96.6% of pixels, a faint sub-canopy Al-OH anomaly for 3.4%, and chlorite/carbonate, kaolinite, and mixed alteration at exactly 0%. The apparent carbonate signal was attributed to canopy and withheld. The 3.4% Al-OH class was later identified as a soil/litter artifact by the dry-season check.

EMIT vegetation-aware alteration classification. Almost entirely vegetation-dominated, with a small NW cluster.
EMIT vegetation-aware classification, wet season. Almost the whole scene is vegetation-dominated; the small NW cluster is the Al-OH anomaly that the dry-season check subsequently identified as a soil/litter artifact rather than a mineral signal. No carbonate, chlorite, or kaolinite class is asserted in either scene.

Why this still matters. EMIT did not hand back a mineral map; the canopy denied that, and the dry-season check confirmed the denial. What EMIT did do, and what Sentinel-2's single wide B12 band and ASTER's broad SWIR ratios physically cannot, is resolve feature shapes finely enough to diagnose why a signal is not mineralogy. The negative result is only diagnosable at this precision because EMIT separates feature position and shape, not just band depth. That diagnostic capability is the ceiling the lower rungs lack, and it is what made the across-season negative a defensible conclusion rather than an open question.

The documented follow-up after the wet-season analysis was a dry-season scene. Two further 0%-cloud granules existed (2024-05-02 and 2024-11-04); the November granule was pulled and analysed. It did not reveal alteration mineralogy. TETRACORDER was not run: the gating conditions (bare or sparse ground with absorptions decoupled from NDVI) were not met, and invoking it cold on a litter-dominated surface would have produced unsupported mineral labels. See the subsection below for the full dry-season analysis.

The full method, granule choice, and every caveat are in research/mineral-prospecting/emit-hyperspectral/README.md.

Dry-season check: the hint was an artifact

The §7 result carries one named caveat: the 2024-02-23 granule is peak wet-season, and the faint NW Al-OH signal that survived the vegetation test could still be a canopy-masked sericite halo rather than a true absence. The obvious lever was a dry-season acquisition: miombo woodland is leaf-off roughly May to October, so a November granule might expose ground and reveal real alteration mineralogy the canopy hid.

The driest available cloud-free granule (EMIT_L2A_RFL_001_20241104T065732_2430904_013, 2024-11-04, 0 % cloud over the AOI) was pulled and run through the identical granule-agnostic pipeline. Full comparison: research/mineral-prospecting/emit-hyperspectral/COMPARISON.md.

The dry scene exposed materially more ground. NDVI median fell from 0.73 to 0.58; 506 pixels (16.6 %) dropped below NDVI 0.40 (sparse vegetation), where the wet scene had zero. For the first time there were genuinely exposed pixels: 49 below NDVI 0.30 with SWIR(2000 nm) reflectance ~0.30, confirming bright substrate, not shadow. The leaf-off experiment worked as a vegetation lever.

It did not decouple a mineral signal from vegetation. Three independent diagnostics show that the Al-OH "depth" strengthening over bare ground is a continuum-removal artifact of bright dry soil and non-photosynthetic vegetation (litter, senescent leaves), not a localized 2200 nm absorption:

Diagnostic 1 — the Al-OH minimum pins at the analysis-window short edge. In the dry scene 69 % of pixels have the continuum-removed Al-OH minimum at 2123 nm, the window's short edge (vs 22 % in the wet scene). The bare-pixel mean spectrum declines monotonically from 2004 nm through ~2200 nm with no localized minimum. A broad downhill slope places its "minimum" at the window edge by default; that is a brightness/slope artifact, not a feature.
Diagnostic 2 — true two-sided 2200 nm absorptions decreased. A real absorption recovers on both sides of its minimum. Counting pixels whose continuum-removed spectrum rises by more than 0.01 on both the short and long side of the 2200 nm minimum: 69 % in the wet scene, 43 % in the dry scene. Exposing bright dry substrate/litter replaced weak-but-real sub-canopy absorptions with broad featureless slopes; the count fell rather than rose.
Diagnostic 3 — the NW hint shifted shorter and dissolved rather than firming up. If the faint NW white-mica signal were a canopy-masked sericite halo, the dry scene should sharpen it toward the 2200 nm white-mica diagnostic. Instead the NW Al-OH minimum position shifted from a mean of 2155 nm (wet) to 2134 nm (dry), moving away from the white-mica diagnostic and toward the window edge. The hint did not sharpen; it dissolved.

The Mg-OH/carbonate signal told the same story: its NDVI correlation weakened from r = +0.73 to +0.31 as the canopy thinned, but it never decoupled into a mineral. Over the 49 genuinely bare pixels the Mg-OH depth was lower than the scene average, and its position stayed near 2307 nm (the litter/ligno-cellulose slope, not the ~2335 nm carbonate or chlorite diagnostic). No carbonate or chlorite story emerged in either scene.

TETRACORDER was correctly not run. The gating rule requires bare or sparse ground with absorptions decoupled from NDVI. The dry scene meets the first condition (49 bare pixels) but fails the second: the apparent Al-OH decoupling (r = -0.76) is the brightness/slope artifact diagnosed above, not a real absorption. Running TETRACORDER here would have forced it onto the only available path (single splib07 reference, the port's weaker variant) over a 97 %-vegetated, litter-dominated surface it was never validated on, labelling the ~45 artifact pixels with discrete mineral names that carry no validation basis. Band-depth plus feature-position plus two-sided shape analysis is the defensible method, and it is precisely what caught the artifact.

The verdict across both seasons: no alteration mineralogy detected in either the wet or the dry scene. The original faint NW phyllic hint is not corroborated; it is best understood as the bright-soil/dry-litter artifact the dry scene exposed. The Al-OH figure above (§7) is retained for transparency and to show the raw wet-season signal, but it should be read as an artifact now identified as such, not as a sericite indicator.

The confirmed negative across both seasons is itself a strong result: it is not a wet-season accident. The remaining lever for this site is finer-resolution true bare-rock exposure (mine faces, road cuts, stripped ground) or in-situ field spectra and samples that can calibrate a library. Structure (DEM) remains the robust free layer.


8. Literature


9. The honest answer

You can map an alteration anomaly from satellite alone with no spectral library, because band ratios are relative, self-referential contrasts that need no calibrated endmembers. What you cannot do with free Sentinel-2 is identify the alteration mineral: its two coarse SWIR bands fuse the Al-OH (2200 nm) and carbonate/Mg-OH (2300–2350 nm) features into one undifferentiated number. Real mineral discrimination needs more SWIR resolution: ASTER's six SWIR bands (available here on five pre-2008 scenes) separate the Al-OH and carbonate halos into distinct relative indices; and imaging spectroscopy — EMIT resolves feature shapes finely enough to diagnose why an apparent signal is or is not mineralogy.

Over this site, EMIT delivered a confirmed negative across both the wet (2024-02-23) and dry (2024-11-04) seasons. No alteration mineralogy was detected in either scene. The faint wet-scene Al-OH anomaly in the NW corner was shown by the dry-season analysis to be a bright-soil and dry-litter artifact. That diagnosis was only possible because EMIT resolved feature position and shape; the same signal would have been unresolvable at ASTER's spectral sampling, let alone Sentinel-2's. The confirmed negative is itself the result, and it is a stronger result than an unverified hint.

Across all three sensors, the output is a where-to-walk-first layer to be cross-checked against mapped structures and ground samples. No pixel — S2, ASTER, or EMIT — should be read as "this is sericite." None of them should be read as "this is gold."