q30·advanced

How much carbon is locked in this forest, and where is it densest?

biospherecarbonforestryclimate Datasets: 3 30–60 min
Find the data for your area

Draw a rectangle to pick your area of interest, then see what NASA data covers it (live, here in your browser) or download a ready-to-run notebook with your AOI pre-filled. The notebook runs in any Python environment — it needs a free Earthdata Login to fetch the data.

Current AOI: -63.2, -10.2 → -62.2, -9.2 (Rondônia, Brazilian Amazon)

A forest stores carbon mostly in wood — trunks and big branches — so the question is really "how much woody mass is standing here?" NASA's **GEDI** instrument fired [lidar](/glossary/lidar/) pulses from the International Space Station and measured the height and structure of the canopy below, then turned that structure into above-ground biomass density in tonnes per hectare. Roughly half of that biomass is carbon, so a biomass map is a carbon map. **Verified locally.** For a 1°×1° block of Rondônia in the Brazilian Amazon (9.2–10.2 °S), GEDI L4A `agbd` (quality-filtered shots only) had a **median of 142.4 Mg/ha** across 10,054 good laser footprints — dense tropical forest, with the top 10% of shots above ~317 Mg/ha where the canopy is tallest and least disturbed. GEDI gives you *samples along its orbit tracks*, not a wall-to-wall picture, so the honest read is "the typical and the densest spots we sampled," not "every hectare."

How much carbon is locked in this forest, and where is it densest?

A forest stores carbon mostly in wood — trunks and big branches — so the question is really “how much woody mass is standing here?” NASA’s GEDI instrument fired lidar pulses from the International Space Station and measured the height and structure of the canopy below, then turned that structure into above-ground biomass density in tonnes per hectare. Roughly half of that biomass is carbon, so a biomass map is a carbon map.

Verified locally. For a 1°×1° block of Rondônia in the Brazilian Amazon (9.2–10.2 °S), GEDI L4A agbd (quality-filtered shots only) had a median of 142.4 Mg/ha across 10,054 good laser footprints — dense tropical forest, with the top 10% of shots above ~317 Mg/ha where the canopy is tallest and least disturbed. GEDI gives you samples along its orbit tracks, not a wall-to-wall picture, so the honest read is “the typical and the densest spots we sampled,” not “every hectare.”

What you can answer

  • The typical biomass of a forest — the median of quality agbd shots over your area, in Mg/ha (multiply by ~0.47 for an above-ground carbon estimate)
  • Where the densest, tallest forest is — high-agbd footprints cluster in intact, undisturbed stands; map them to find the carbon-richest patches
  • How biomass varies across a landscape — compare riverine, upland, and edge forest by pooling shots within each zone
  • A degradation / regrowth gradient — low-biomass shots near roads and clearings versus high-biomass interior forest tell a disturbance story
  • Optical context for each shot — pair footprints with HLSL30 30 m imagery to see whether a low reading is a clearing, a road, or genuinely short forest

What you can NOT answer with these datasets alone

  • Total carbon for the whole area — GEDI samples along tracks; you have footprints, not a gap-free map. Wall-to-wall totals need a gridded product or a model that interpolates between shots.
  • Below-ground or soil carbonagbd is above-ground woody biomass only; roots and soil (often the larger pool in some ecosystems) are not measured here
  • Change over a single season — biomass moves slowly; GEDI’s value is the multi-year structural sample, not a month-to-month signal
  • Exact carbon — the ~0.47 carbon fraction is a convention; species and wood density vary, and agbd itself carries per-shot uncertainty (see the agbd_se field)
  • Cloud-covered or very steep terrain reliablylidar returns degrade on slopes and the quality flag drops many such shots, so coverage is uneven

Code template (Python, cloud-direct)

Verified locally. GEDI_L4A_AGB_Density_V2_1_2056, variable agbd, is an HDF5 file with per-beam groups BEAM0000BEAM1011. Keep shots where l4_quality_flag == 1 and agbd > 0, clip to your bounding box with lat_lowestmode/lon_lowestmode, and report the median Mg/ha.

import os, re, warnings, earthaccess, h5py, numpy as np
warnings.filterwarnings("ignore", category=FutureWarning)

# load Earthdata creds from .env without `source` (passwords can break the shell)
for line in open(".env"):
    m = re.match(r'\s*(?:export\s+)?([A-Z0-9_]+)\s*=\s*(.*)\s*$', line)
    if m: os.environ.setdefault(m.group(1), m.group(2).strip().strip('"').strip("'"))
earthaccess.login(strategy="environment")   # free Earthdata Login

W, S, E, N = -63.2, -10.2, -62.2, -9.2      # Rondônia, Brazilian Amazon
granules = earthaccess.search_data(
    short_name="GEDI_L4A_AGB_Density_V2_1_2056",
    temporal=("2020-06-01", "2022-06-30"),
    bounding_box=(W, S, E, N),
)

vals = []
for g in granules[:8]:                       # try a few until one has good shots
    f = h5py.File(earthaccess.open([g])[0], "r")
    for beam in [k for k in f.keys() if k.startswith("BEAM")]:
        grp = f[beam]
        if "agbd" not in grp or "l4_quality_flag" not in grp:
            continue
        agbd = grp["agbd"][:]
        qf   = grp["l4_quality_flag"][:]
        lat  = grp["lat_lowestmode"][:]
        lon  = grp["lon_lowestmode"][:]
        keep = (qf == 1) & (agbd > 0) & (lat >= S) & (lat <= N) & (lon >= W) & (lon <= E)
        vals.append(agbd[keep])
    f.close()

allv = np.concatenate(vals)
print("quality shots:", allv.size)
print("median AGBD:", round(float(np.median(allv)), 1), "Mg/ha")   # ~142.4 over the AOI
print("dense (90th pct):", round(float(np.percentile(allv, 90)), 1), "Mg/ha")
# carbon ≈ biomass × 0.47 ; the densest footprints (lon/lat of high-agbd shots) mark the carbon-richest stands
How a scientist answers this
Parameters
Above-ground biomass density (`agbd`, Mg/ha) from GEDI L4A spaceborne lidar (GEDI_L4A_AGB_Density_V2_1_2056, ~25 m footprints), quality-filtered (l4_quality_flag = 1, degrade_flag = 0, sensitivity high), with HLSL30 30 m optical for landscape context; an above-ground carbon estimate uses the ~0.47 carbon fraction of biomass.
Method
Pool quality-filtered GEDI footprints within the area of interest and summarize the `agbd` distribution (median and upper percentiles) rather than a wall-to-wall mean, since GEDI samples along orbit tracks; stratify shots by terrain/zone (riverine, upland, edge) to compare and map the densest, tallest, least-disturbed stands.
Validation
Report the number of good shots (flag few-sample grids), carry GEDI's per-shot biomass uncertainty (`agbd_se`), and cross-check magnitudes against published regional biomass maps or field plots; note GEDI's coverage gaps and that it is sampling, not a complete coverage.
In plain EnglishAdd up the wood the lidar measured across thousands of laser hits, report the typical and the densest spots you actually sampled, and convert biomass to carbon at about half.

Make it yours → Set the area-of-interest box, the quality filters, and the percentiles or zone definitions in the notebook to match your forest.

Run the core method · no login

The robust trend (Theil–Sen + Mann–Kendall) at the heart of this question — runnable on synthetic data, right here. The full earthaccess code template further down does it on real NASA data (needs an Earthdata login).

editable · runs in your browser

Datasets used