Skip to content

Changelog

Unreleased

New features

  • GEDI L2A version 3 (released 2026). granule, table, points, GEDI.Quality and search work with version 3 files:

    • the quality column reads l2a_quality_flag_rel3, which replaces the version 2 quality_flag;
    • GEDI.Quality reads l2_algrunflag for the selected-algorithm checks, because version 3 has algorithm setting groups 1, 2, 5 and 10 instead of 1–6;
    • gedi_l2a_canopy_variables(g) takes the granule to pick the right quality flag.
    • gedi_version, gedi_algorithms and gedi_quality_path describe the layout of a GEDI granule.

Breaking

  • search(:GEDI, ...) returns GEDI version 3 granules by default; pass version = 2 for version 2.
  • gedi_l2a_canopy_variables() without a granule reads the version 3 quality flag; pass the granule (gedi_l2a_canopy_variables(g)) to match its version.

Fixed

  • search(:GEDI, ...; id = ...) found no version 3 granules, because CMR keeps the .h5 extension in version 3 producer ids.
  • points(g::GEDI_Granule; filtered = true) ignored rx_algrunflag, and could keep shots whose selected algorithm it did not read.

v0.5.1

Fixed

  • Rename the Makie extension file to ext/SpaceAltimetryMakieExt.jl to match its [extensions] entry. In v0.5.0, loading SpaceAltimetry together with Makie failed with Missing source file for ... SpaceAltimetryMakieExt (#112).

v0.5.0

New features

  • Composable operations on tables: Filter and Transform types that can be chained lazily with |> (e.g. table(g) |> ICESat.Quality() |> InExtent(ext) |> DataFrame), so the required HDF5 columns are read in one pass. The eager form filter(op, t) and map(op, t) also works.
  • Generic operations: ToEGM2008 (geoid conversion) and InExtent(extent).
  • Operations for a single mission live in exported mission modules (#107):

    • ICESat.Quality, ICESat.SaturationCorrect and ICESat.TopexToWGS84
    • ICESat2.Quality for ATL03, ATL06 and ATL08
    • GEDI.Quality (the full L2A composite quality filter) and GEDI.Sensitivity([gt=0.9])
    • New H5Table system: generic, lazy HDF5-to-table reader that handles dimension flattening, nodata masking (missing), and transforms automatically.
    • explore(granule) opens an interactive terminal browser for inspecting HDF5 contents and selecting variables.
    • table(g; variables=) keyword allows reading custom variable sets instead of only the built-in defaults.
    • table(g; tracks=) keyword for filtering specific beams/tracks.
    • Variables now support transforms: ToDateTime, ToBool, InvertBool, SliceRow.
    • Attributes (track-level metadata like strong_beam, detector_id) are now included as constant columns.
    • Pre-built alternative schemas: atl08_canopy_variables(), gedi_l2a_canopy_variables().
    • Documentation rewrite following the Diátaxis framework (tutorials, guides, topics, reference).

Breaking

  • The package is renamed from SpaceLiDAR to SpaceAltimetry and has a new UUID (#105). Install it with Pkg.add("SpaceAltimetry") and load it with using SpaceAltimetry. SpaceLiDAR is still exported as an alias of the module, so code that qualifies names as SpaceLiDAR.xxx keeps working.
  • table(granule) is now the recommended interface; points() remains available for compatibility (see migration guide).
  • Fill values are now missing instead of NaN.
  • Removed deprecated granule_from_file (use granule) and granules_from_folder (use granules).
  • Removed deprecated find (use search).
  • Removed deprecated write_granule_urls! (use write_urls).
  • Removed the deprecated bbox keyword on search; use extent instead.
  • points/lines no longer accept a NamedTuple for bbox; pass an Extents.Extent (e.g. convert(Extent, (min_x=..., min_y=..., max_x=..., max_y=...))).

Changed

  • Column types resolved at read time via transforms (e.g., delta_time becomes DateTime).
  • All products now use the shared H5Table infrastructure instead of per-product hardcoded readers.
  • CI dependency bumps (actions/checkout v7, codecov-action v7, julia-actions/setup-julia v3, julia-actions/cache v3).

v0.4.2

Fixed

  • Fix download! to create directories and normalize paths (#95).
  • Update Makie compat to 0.24 (#93).
  • Bump CategoricalArrays compat to 1.
  • CI dependency bumps (actions/checkout v6, stefanzweifel/git-auto-commit-action v7).

v0.4.1

Fixed

  • Fix ICESat-2 search after data migration to EarthData Cloud.

v0.4.0

New features

  • New types Table and PartitionedTable, which support the Tables.jl interface. This prevents allocating code like reduce(vcat, DataFrame.(points(granule))) to get a DataFrame. You can now just call DataFrame(table).
  • Reduced allocations in retrieving point data.
  • Introduced before and after keywords in search, to search by date(ranges).
  • sync utility with aria2c for incremental folder updates.
  • Makie extension for plotting (plot(granules)).
  • search(granule, :OtherProduct) for cross-product granule lookup.
  • id keyword in search for fetching specific granules.

Fixed

  • Empty (filtered) granules could result in Vector{BitVector} columns, which have been changed to Vector{Bool}.
  • GEDI search after migration to LPCLOUD.

Breaking

  • points now return either a Table or a PartitionedTable instead of NamedTuple or Vector{NamedTuple}. The old behaviour can be regained by calling parent on these tables.
  • Removed number_of_returns and return_number from ICESat-2 ATL08 canopy output.

Deprecated

  • Renamed granule_from_file to granule
  • Renamed granules_from_file to granules
  • Renamed write_granule_urls! to write_urls

Changed

  • Most of the search functionality has been moved out to the more generic EarthData.jl.
  • Updated ICESat-2 from version 5 to version 6.

v0.3.0

  • GeoInterface, Extents support
  • Bounding box using Extent subsetting on all points functions
  • find renamed to search
  • search now takes the product as a Symbol and accepts a s3::Bool parameter.
  • Stricter checking of arguments in search
  • MultiPolygon extents of granules are now returned in the polygons field in granules from search.
  • Removed bbox field on granules.
  • download(granule) now works on AWS S3 urls
  • donwload(granule) now creates temporary files and renames after successful download
  • ICESat-2 ATL08 v5 points function now supports 20 m resolution by passing highres::Bool parameter.

v0.2.2

  • Fixed ICESat-2 download (please remove n5eil01u.ecs.nsidc.org from your .netrc file)
  • Linked to Zenodo for DOI citations

v0.2.1

  • Unified bounds of granules
  • Fixed getcoord for Point and added Point(x, y, z) constructor
  • Updated utils to make use of DataFrames with correct column names

v0.2.0

Warning

This is a breaking release

  • Many of the column names have changed to be more descriptive.
  • Documentation and docstring improvements.
  • Tables support, you can now do DataFrame(granule), without having to call points(granule).
  • Memory use improvements, by using SentinelArray of FillArray under the hood.
  • Dropped S3, GeoArrays and LAS/LAZ support.
  • Added GeoInterface support for lines/points and dropped GeoDataFrames
  • Expanded test coverage.

v0.1.6

v0.1.5

  • Support for ICESat-2 ATL06
  • Update search to use v5 for ICESat-2 by default

v0.1.4

  • Compatibility fixes

v0.1.3

  • Added interpolation for GeoArrays
  • Added FOSS4G notebook