Additional Aerial LiDAR Datasets#

This notebook will highlight the additional aerial LiDAR datasets besides USGS 3dep that are available in the coincident package and how to grab those datasets’ footprints using spatial and temporal search parameters.

Other Supported Catalogs:

  • NASA G-LiHT

  • NOAA Coastal LiDAR

  • NCALM LiDAR

  • NEON LiDAR

import coincident
import geopandas as gpd
/home/docs/checkouts/readthedocs.org/user_builds/coincident/checkouts/stable/src/coincident/io/download.py:25: TqdmExperimentalWarning: Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)
  from tqdm.autonotebook import tqdm
%matplotlib inline
# %config InlineBackend.figure_format = 'retina'

NASA G-LiHT#

Access the NASA CMR STAC catalog for the NASA G-LiHT project (Goddard LiDAR, Hyperspectral, and Thermal Imager)

aoi = gpd.read_file(
    "https://raw.githubusercontent.com/unitedstates/districts/refs/heads/gh-pages/states/MD/shape.geojson"
)
aoi = aoi.simplify(0.01)
aoi.explore()
Make this Notebook Trusted to load map: File -> Trust Notebook
gf_gliht = coincident.search.search(
    dataset="gliht",
    intersects=aoi,
    datetime=["2017"],
)
print(f"Found {len(gf_gliht)} G-LiHT Items")
print(f"G-LiHT collections: {gf_gliht.collection.unique()}")
# Select one collection, like Canopy Height (CHM) or Digital Terrain Model (DTM)
gf_gliht = gf_gliht[gf_gliht.collection == "GLCHMT_001"]
gf_gliht.explore(column="id")
Found 69 G-LiHT Items
G-LiHT collections: ['GLCHMT_001', 'GLDTMT_001', 'GLDSMT_001', 'GLLIDARPC_001']
Categories (4, str): ['GLCHMT_001', 'GLDTMT_001', 'GLDSMT_001', 'GLLIDARPC_001']
Make this Notebook Trusted to load map: File -> Trust Notebook

OpenTopography API#

coincident supports the use of the OpenTopo /otCatalog API to access additional aerial LiDAR data.

opentopo datasets currently supported includes the NOAA Coastal LiDAR Catalog and NCALM Aerial LiDAR Catalog.

Note

The NCALM Aerial LiDAR Catalog also includes user-submitted flights

# first, we'll search for NOAA Coastal LiDAR missions in Washington
# we'll inspect 2018 arbitrarily
aoi = gpd.read_file(
    "https://raw.githubusercontent.com/unitedstates/districts/refs/heads/gh-pages/states/WA/shape.geojson"
)
date = "2018"
aoi.plot();
../_images/8ce82c802581fdb3277852be2d192e4a27c48a07b953dd0a3a628fc65c4fa913.png
gf_noaa = coincident.search.search(dataset="noaa", intersects=aoi, datetime=[date])
gf_noaa.head(3)
id name title start_datetime end_datetime geometry collection
0 9536 9536 2018 WA DNR Lidar: Green River Watershed, WA 2018-11-11 2018-11-12 POLYGON ((-121.82611 47.3587, -121.85992 47.33... NOAA
1 9546 9546 2018 WA DNR Topobathy Lidar: Tacoma Water Serv... 2018-05-27 2018-05-28 POLYGON ((-121.7511 47.32611, -121.77838 47.30... NOAA
2 9549 9549 2017 WA DNR Lidar: Tacoma Water Service Area -... 2017-12-05 2018-11-12 POLYGON ((-122.37958 47.06531, -122.37311 47.0... NOAA
gf_noaa.explore(column="title", cmap="Set1")
Make this Notebook Trusted to load map: File -> Trust Notebook
# now, let's see if there were any NCALM missions from the same year
gf_ncalm = coincident.search.search(dataset="ncalm", intersects=aoi, datetime=[date])
gf_ncalm.head()
id name title start_datetime end_datetime geometry collection
0 OTLAS.072019.6339.1 WA18_Wall High-Resolution Mapping of Goat Rock Volcano, WA 2018-09-19 2018-09-20 POLYGON ((-121.46701 46.48376, -121.45914 46.4... NCALM
1 OTLAS.112018.26910.1 OR18_Roering Eagle Creek Fire Area in the Columbia River Go... 2018-05-03 2018-05-06 MULTIPOLYGON (((-122.12419 45.58219, -121.9854... NCALM
gf_ncalm.explore(column="id", cmap="Set3")
Make this Notebook Trusted to load map: File -> Trust Notebook

NEON API#

We also support the use of the NEON Python API.

Warning

Searching large areas and/or large time periods in the NEON catalog will take a long time due to the limited spatiotemporal search supported by the API.

%%time
gf_neon = coincident.search.search(dataset="neon", intersects=aoi, datetime=[date])
gf_neon.head()
/home/docs/checkouts/readthedocs.org/user_builds/coincident/checkouts/stable/.pixi/envs/docs/lib/python3.14/site-packages/geopandas/array.py:411: UserWarning: Geometry is in a geographic CRS. Results from 'sjoin_nearest' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.

  warnings.warn(
CPU times: user 562 ms, sys: 341 ms, total: 903 ms
Wall time: 2.08 s
id title start_datetime end_datetime product_url geometry collection
0 ABBY Abby Road NEON 2018-07-01 2018-07-31 https://data.neonscience.org/api/v0/data/DP3.3... POLYGON ((-122.40844 45.76403, -122.40835 45.7... NEON
1 WREF Wind River Experimental Forest NEON 2018-07-01 2018-07-31 https://data.neonscience.org/api/v0/data/DP3.3... POLYGON ((-122.09882 45.82501, -122.09868 45.8... NEON
gf_merged = gpd.pd.concat([gf_noaa, gf_ncalm, gf_neon], ignore_index=True)
gf_merged.explore(column="collection", tiles="CartoDB positron", cmap="tab10")
Make this Notebook Trusted to load map: File -> Trust Notebook

NASA LVIS#

Currently, only a select number of LVIS flghts are supported due to the limited amount of LVIS products hosted on STAC catalogs:

Warning

Searching highly complex multi-polygons might break the STAC search, so simplifying your polygon before searching is recommended.

# first, let's look at the ABoVE product in Canada
aoi = gpd.read_file(
    "https://gist.githubusercontent.com/M1r1k/d5731bf39e1dfda5b53b4e4c560d968d/raw/c774258085ddc11776591ce95f2240d0fd0657a2/canada_provinces.geo.json"
)
aoi = aoi[aoi["name"] == "Yukon"].reset_index(drop=True)
# reduce complexity of multipolygon input
aoi.geometry = aoi.geometry.convex_hull
gf_lvis_ab = coincident.search.search(dataset="ablvis2_1", intersects=aoi)
print(gf_lvis_ab.shape)
gf_lvis_ab.head(2)
(120, 14)
type stac_version stac_extensions id storage:schemes end_datetime links assets collection datetime start_datetime bbox geometry dayofyear
0 Feature 1.1.0 [https://stac-extensions.github.io/storage/v2.... LVIS2_ABoVE2017_0630_R1803_071020.TXT {'aws': {'type': 'aws-s3', 'platform': 'https:... 2017-06-30 19:47:54.433000+00:00 [{'href': 'https://cmr.earthdata.nasa.gov/clou... {'gov/nsidc-cumulus-prod-protected/LVIS/ABLVIS... ABLVIS2_1 2017-06-30 19:43:40.438000+00:00 2017-06-30 19:43:40.438000+00:00 {'xmin': -133.60073, 'ymin': 67.25842, 'xmax':... POLYGON ((-133.56719 67.45062, -133.57194 67.4... 181
1 Feature 1.1.0 [https://stac-extensions.github.io/storage/v2.... LVIS2_ABoVE2017_0630_R1803_071274.TXT {'aws': {'type': 'aws-s3', 'platform': 'https:... 2017-06-30 19:49:17.458000+00:00 [{'href': 'https://cmr.earthdata.nasa.gov/clou... {'metadata': {'href': 'https://cmr.earthdata.n... ABLVIS2_1 2017-06-30 19:47:54.433000+00:00 2017-06-30 19:47:54.433000+00:00 {'xmin': -133.84509, 'ymin': 67.41616, 'xmax':... POLYGON ((-133.69928 67.44517, -133.74165 67.4... 181
m = aoi.explore(color="gray")
gf_lvis_ab.clip(aoi).explore(m=m, column="datetime", cmap="inferno")
Make this Notebook Trusted to load map: File -> Trust Notebook
# now, let's look at AfriSAR LiDAR
# this polygon is already simplified
aoi = gpd.read_file(
    "https://raw.githubusercontent.com/glynnbird/countriesgeojson/refs/heads/master/gabon.geojson"
)
gf_lvis_af = coincident.search.search(
    dataset="aflvis2_1", intersects=aoi, datetime=["2016-02-20"]
)
print(gf_lvis_af.shape)
gf_lvis_af.head(2)
(17, 14)
type stac_version stac_extensions id storage:schemes end_datetime links assets collection datetime start_datetime bbox geometry dayofyear
0 Feature 1.1.0 [https://stac-extensions.github.io/storage/v2.... LVIS2_Gabon2016_0220_R1808_038024.TXT {'aws': {'type': 'aws-s3', 'platform': 'https:... 2016-02-20 10:43:39.524000+00:00 [{'href': 'https://cmr.earthdata.nasa.gov/clou... {'gov/nsidc-cumulus-prod-protected/LVIS/AFLVIS... AFLVIS2_1 2016-02-20 10:33:44.015000+00:00 2016-02-20 10:33:44.015000+00:00 {'xmin': 9.78612, 'ymin': -0.17711, 'xmax': 10... POLYGON ((9.78612 0.16789, 9.78612 0.16429, 9.... 51
1 Feature 1.1.0 [https://stac-extensions.github.io/storage/v2.... LVIS2_Gabon2016_0220_R1808_038619.TXT {'aws': {'type': 'aws-s3', 'platform': 'https:... 2016-02-20 10:58:47.545000+00:00 [{'href': 'https://cmr.earthdata.nasa.gov/clou... {'metadata': {'href': 'https://cmr.earthdata.n... AFLVIS2_1 2016-02-20 10:43:39.525000+00:00 2016-02-20 10:43:39.525000+00:00 {'xmin': 10.19384, 'ymin': -0.83624, 'xmax': 1... POLYGON ((10.19743 -0.15792, 10.19743 -0.1615,... 51
gf_lvis_af.explore(column="datetime", cmap="inferno")
Make this Notebook Trusted to load map: File -> Trust Notebook