Global Forest Change Explained
On this page
Problem statement
The Hansen/UMD Global Forest Change dataset (GFC) is the most cited map of forest loss on Earth, and it is regularly quoted as a deforestation map. It is not quite one. It maps stand-replacement disturbance of tree cover — any event that removes most of the canopy of a 30 m pixel — whether caused by clearing for cattle, logging of a plantation, a wildfire or a storm. It records the year of the first such event only, it maps gain only for 2000–2012, and its method has been improved several times, so early and late years are not measured quite the same way.
Knowing what the layers say, and what they cannot, prevents the most common misreadings.
Quick answer
| Layer | Meaning | Values |
|---|---|---|
treecover2000 |
canopy closure of vegetation > 5 m tall, year 2000 | 0–100 % |
lossyear |
year of stand-replacement loss, 2001 onward | 0 = none, 1–24 = 2001–2024 |
gain |
tree cover gain 2000–2012 | 0/1 |
datamask |
land, water, no data | 0/1/2 |
import numpy as np, rasterio
from rasterio.windows import from_bounds
W, S, E, N = -63.0, -10.8, -62.5, -10.3
def read(layer, v):
with rasterio.open(f"/vsicurl/https://storage.googleapis.com/earthenginepartners-hansen/"
f"{v}/Hansen_{v}_{layer}_10S_070W.tif") as src:
win = from_bounds(W, S, E, N, src.transform)
return src.read(1, window=win), src.window_transform(win)
tc, tf = read("treecover2000", "GFC-2024-v1.12")
ly24, _ = read("lossyear", "GFC-2024-v1.12")
gain, _ = read("gain", "GFC-2024-v1.12")
px_ha = (abs(tf.a) * 111_320 * np.cos(np.radians(-10.55))) * (abs(tf.e) * 110_574) / 1e4
f = tc > 30
print(f"forest 2000 (>30%): {f.sum() * px_ha:,.0f} ha")
print(f"loss 2001–2024 on that forest: {(f & (ly24 > 0)).sum() * px_ha:,.0f} ha")
print(f"loss on pixels below the threshold: {(~f & (ly24 > 0)).sum() * px_ha:,.0f} ha")
print(f"gain 2000–2012: {(gain == 1).sum() * px_ha:,.0f} ha, "
f"of which later lost again: {((gain == 1) & (ly24 > 12)).sum() * px_ha:,.0f} ha")
forest 2000 (>30%): 139,689 ha
loss 2001–2024 on that forest: 61,306 ha
loss on pixels below the threshold: 3,520 ha
gain 2000–2012: 2,183 ha, of which later lost again: 716 ha
Most of the loss falls on forest — 61,306 ha of the 139,689 ha standing in 2000 — but 3,520 ha falls on pixels below the 30% threshold. Loss occurs on pixels below any forest threshold — sparse trees in pastures and regrowth being cleared again — which is why a baseline has to be applied before calling loss deforestation.
Disturbance not deforestation, one loss per pixel, a pinned version
1. Treat loss as disturbance, not deforestation
A lost pixel had most of its canopy removed in that year. Deforestation (permanent conversion) is one cause; plantation harvest, fire and wind are others. Attributing causes needs separate driver data.
2. Remember loss is recorded once
A pixel lost in 2005, regrown and cleared again in 2020 shows only 2005. Repeated clearing of regrowth is invisible after the first event.
3. Do not compute net change
Gain is a single flag for 2000–2012, with no year. It cannot be subtracted from loss for 2001–2024.
4. Pin the version
Each annual release (GFC-2023-v1.11, GFC-2024-v1.12, …) extends the record and can reprocess earlier years. Results from different versions for the same year can differ.
5. Read the documented method changes
The data providers note that detection improved over time — notably through updated Landsat inputs and algorithm changes around 2011–2013 — and caution against reading trends across those changes uncritically.
Two releases over the same Rondônia years
The data used on this page
Two releases of the Hansen/UMD Global Forest Change layers for tile 10S 070W (Rondônia, Brazil), GFC-2023-v1.11 and GFC-2024-v1.12, each read by window straight from Google Cloud Storage with read() from the quick answer: a 0.5° box, 63.0–62.5° W, 10.8–10.3° S. Nothing is downloaded whole. The setup only opens the two loss-year files and prints their grid, which is the same in both releases.
import rasterio
for v in ("GFC-2023-v1.11", "GFC-2024-v1.12"):
with rasterio.open(f"/vsicurl/https://storage.googleapis.com/earthenginepartners-hansen/"
f"{v}/Hansen_{v}_lossyear_10S_070W.tif") as src:
print(f"{v}: {src.width:,} x {src.height:,} px, {src.res[0] * 3600:.1f} arc-seconds, {src.crs}")
GFC-2023-v1.11: 40,000 x 40,000 px, 0.9 arc-seconds, EPSG:4326
GFC-2024-v1.12: 40,000 x 40,000 px, 0.9 arc-seconds, EPSG:4326
Example 1 — two releases, the same years
ly23, _ = read("lossyear", "GFC-2023-v1.11")
print(f"{'year':<6}{'v1.11 ha':>10}{'v1.12 ha':>10}{'diff':>8}")
for y in (2005, 2010, 2015, 2020, 2022, 2023):
a = (f & (ly23 == y - 2000)).sum() * px_ha
b = (f & (ly24 == y - 2000)).sum() * px_ha
print(f"{y:<6}{a:>10,.0f}{b:>10,.0f}{(b - a) / a if a else 0:>8.1%}")
same = (ly23 == ly24)
print(f"pixels with identical loss year in both versions: {same.mean():.2%}")
year v1.11 ha v1.12 ha diff
2005 2,560 2,560 0.0%
2010 530 530 0.0%
2015 949 949 0.0%
2020 2,014 2,014 0.0%
2022 3,991 3,991 0.0%
2023 1,240 1,240 0.0%
pixels with identical loss year in both versions: 99.32%
In this window the two releases agree exactly for every year they share; the 0.68% of pixels that differ are the 2024 losses that v1.11 does not contain. That is the good case, and it is not guaranteed: releases that reprocess earlier years change their numbers, and a figure quoted from one release will then not match another. Checking two releases against each other, as here, takes one extra read. Cite the version either way.
Example 2 — the time of loss within a pixel's history
first = ly24[f & (ly24 > 0)]
print(f"lost pixels by period: 2001–08 {np.mean(first <= 8):.0%}, 2009–16 "
f"{np.mean((first > 8) & (first <= 16)):.0%}, 2017–24 {np.mean(first > 16):.0%}")
print("a pixel cleared twice is counted only in its first period")
lost pixels by period: 2001–08 62%, 2009–16 12%, 2017–24 26%
a pixel cleared twice is counted only in its first period
The dataset answers "when did this pixel first lose its canopy". Later clearing of regrowth on the same pixel adds nothing to the record.
Example 3 — loss outside the forest baseline
for t in (10, 30, 50):
below = (tc <= t) & (ly24 > 0)
print(f"loss on pixels with 2000 canopy ≤ {t}%: {below.sum() * px_ha:,.0f} ha")
loss on pixels with 2000 canopy ≤ 10%: 2,636 ha
loss on pixels with 2000 canopy ≤ 30%: 3,520 ha
loss on pixels with 2000 canopy ≤ 50%: 4,924 ha
These are pixels whose 2000 canopy was sparse — pasture trees, young regrowth — and whose trees were later removed. Whether that is "deforestation" depends on the forest definition, which is exactly why the baseline has to be explicit.
Why disturbance, why gain is limited
Why disturbance and not deforestation
The algorithm detects a sharp drop in canopy in the Landsat time series. It cannot tell whether the land will stay cleared. In the Amazon most loss is conversion to pasture; in boreal forests and plantations most is harvest or fire followed by regrowth. The same layer means different things in different biomes.
Why gain is limited
Detecting gain requires a canopy to grow tall enough to be seen, which takes years; the original analysis mapped it for 2000–2012 only. Later datasets model regrowth separately, with their own definitions.
Why trends need caution
The data are consistent enough for spatial patterns and broad trends. Year-to-year differences, especially across periods where the method or input imagery changed, include measurement change as well as real change. The providers flag this, and careful analyses compare like periods or use independent sample-based estimates for trends.
Loss year zero, water and tile naming
- Loss year 0 means "no loss detected", not "no data".
- Water has tree cover 0 and should be excluded using
datamask. - Tile naming refers to the top-left corner.
- Primary humid tropical forest (Turubanova et al.) is a companion layer for the tropics.
- Drivers of loss (Curtis et al., updated datasets) classify loss by dominant cause at coarser resolution.
Internal links
- How to read Hansen Global Forest Change data — reading the layers
- Forest loss and gain misread — the fix guide for gain and repeated loss
- Forest loss trend not comparable over time — versions and method changes
- Forest definitions explained — thresholds on tree cover
- Land cover products explained — other forest maps
- Deforestation rates explained — from loss to rates
FAQ
What does the Hansen lossyear layer show?
The year of stand-replacement loss of tree cover (minus 2000) for each 30 m pixel; 0 means no loss detected.
Is Hansen forest loss the same as deforestation?
No. It includes plantation harvest, fire and natural disturbance; deforestation is permanent conversion.
Can I calculate net forest change?
No. Gain covers only 2000–2012 and has no year.
Why do numbers differ between dataset versions?
Each release reprocesses recent years and may improve methods. Cite the version you used.
Can a pixel be lost twice?
Only the first loss is recorded.
Are annual trends reliable?
Broadly, with caution across known method changes; compare like periods.