How much carbon is locked in this forest, and where is it densest?
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.
-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
agbdshots over your area, in Mg/ha (multiply by ~0.47 for an above-ground carbon estimate) - Where the densest, tallest forest is — high-
agbdfootprints 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 carbon —
agbdis 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
agbditself carries per-shot uncertainty (see theagbd_sefield) - Cloud-covered or very steep terrain reliably — lidar 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, variableagbd, is an HDF5 file with per-beam groupsBEAM0000…BEAM1011. Keep shots wherel4_quality_flag == 1andagbd > 0, clip to your bounding box withlat_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 standsMake it yours → Set the area-of-interest box, the quality filters, and the percentiles or zone definitions in the notebook to match your forest.
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).