Skip to content

L2A — Ground Elevation & Canopy Height

Version 2 — User Guide · ATBD Version 3 — User Guide · Data dictionary

Overview

GEDI L2A provides ground elevation, canopy height metrics, and relative height (RH) metrics for each GEDI footprint. Data is organized by 8 beams.

Quick Start

using SpaceAltimetry, DataFrames

g = granule("GEDI02_A_2020257225350_O09946_02_T08506_02_004_02_V003.h5")
t = table(g)
df = DataFrame(t)

Default Columns

Column HDF5 Path Type
longitude lon_lowestmode Float64
latitude lat_lowestmode Float64
height elev_lowestmode Float32
height_error elevation_bin0_error Float32
datetime delta_time DateTime
intensity energy_total Float32
sensitivity sensitivity Float32
surface surface_flag Bool
quality l2a_quality_flag_rel3 Bool
nmodes num_detectedmodes UInt8
sun_angle solar_elevation Float32
height_reference digital_elevation_model Float32
strong_beam attribute —

Default Tracks

SpaceAltimetry.default_tracks(g)
("BEAM0000", "BEAM0001", "BEAM0010", "BEAM0011", "BEAM0101", "BEAM0110", "BEAM1000", "BEAM1011")

Canopy Heights

Use gedi_l2a_canopy_variables(g) to read highest return instead of lowest mode:

t = table(g; variables=gedi_l2a_canopy_variables(g))

Passing the granule picks the quality flag of its product version; without it the version 3 flag is used.

This reads elev_highestreturn / lon_highestreturn / lat_highestreturn.

Quality Filtering

filtered = t |>
    GEDI.Quality() |>
    GEDI.Sensitivity(gt = 0.9) |>
    collect

The GEDI.Quality filter auto-loads the receive assessment, stale/degrade, amplitude, and selected algorithm fields required by the full points(g; filtered=true) predicate. The optional GEDI.Sensitivity filter keeps gt < sensitivity <= 1.0; gt defaults to 0.9.

Version 3

Version 3 (PGE 004, filenames ending in _V003.h5) is the default since it was released in 2026. It is read with the same schema as version 2, with these differences (GEDI Level 2 User Guide V3.0, section 7.1):

version 2 version 3
quality column quality_flag l2a_quality_flag_rel3: the version 2 conditions plus sensitivity_a2 > 0.95 over land (> 0.98 in tropical forest) and elev_highestreturn − digital_elevation_model < 150 m. The version 2 flag is still in the file as l2a_quality_flag_rel2.
algorithm setting groups 1–6 1, 2, 5, 10
GEDI.Quality algorithm checks rx_processing_aN/{rx_algrunflag, zcross, toploc} of the selected group l2_algrunflag, which combines the same checks and adds 0 < sensitivity < 1
gs = search(:GEDI, :GEDI02_A; extent = extent)                # version 3 (default)
gs2 = search(:GEDI, :GEDI02_A; version = 2, extent = extent)  # version 2

selected_algorithm in version 3

In version 3 files, selected_algorithm keeps the version 2 valid_range of 1–6, but shots also use group 10. Because nodata masking honours valid_range, those shots read as missing when you add selected_algorithm as a column. GEDI.Quality uses l2_algrunflag instead, so it is not affected.