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.

What Global Forest Change loss includes and excludes. loss is stand-replacement, any causeeventrecorded as loss?noteclearing for pasture or cropsyesdeforestationplantation harvestyesnot deforestationstand-replacing fire, windyescause not recordedselective logging, degradationmostly nocanopy stayssecond clearing of regrowthnoonly the first year keptAttributing a cause needs separate driver data spatialworkflow.io
Loss is stand-replacement disturbance of any cause.

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.

Annual loss on forest above 30% canopy for the same years in GFC-2023-v1.11 and GFC-2024-v1.12 in the Rondônia window. loss, ha, two releases2005 · v1.112,5602005 · v1.122,5602015 · v1.119492015 · v1.129492022 · v1.113,9912022 · v1.123,991020004000Identical here for every shared year; only 2024 is new — check, do not assume spatialworkflow.io
The same years, two releases: cite the version.

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.

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.

What to state with any number taken from Global Forest Change. a GFC number needs thesethe releasee.g. GFC-2024-v1.12the canopy threshold30% here: 139,689 ha of forestloss on the baseline only3,520 ha fell on non-forest pixelsloss, not deforestationunless drivers were checkedloss minus gain as "net"different periods, different methodsForest in 2000 above 30% canopy, loss 2001–24: 61,306 ha in the window spatialworkflow.io
Four things a Global Forest Change figure needs next to it, and one it must never be.

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.

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.

Broadly, with caution across known method changes; compare like periods.