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/104/src/coincident/io/download.py:27: 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"],
)
gf_gliht.head()
assets bbox collection geometry id links stac_extensions stac_version type datetime end_datetime start_datetime storage:schemes dayofyear
0 {'001/GLDSMT_SERC_CalTarps_31July2017_am_l0s0/... {'xmin': -76.5520244, 'ymin': 38.8724263, 'xma... GLDSMT_001 POLYGON ((-76.55112 38.87243, -76.54378 38.872... GLDSMT_SERC_CalTarps_31July2017_am_l0s0 [{'href': 'https://cmr.earthdata.nasa.gov/stac... [https://stac-extensions.github.io/storage/v2.... 1.1.0 Feature 2017-07-31 04:00:00+00:00 2017-08-01 03:59:59+00:00 2017-07-31 04:00:00+00:00 {'aws': {'bucket': 'lp-prod-protected', 'platf... 212
1 {'001/GLDSMT_SERC_CalTarps_31July2017_am_l2s0/... {'xmin': -76.5530933, 'ymin': 38.8733421, 'xma... GLDSMT_001 POLYGON ((-76.55206 38.87334, -76.54427 38.873... GLDSMT_SERC_CalTarps_31July2017_am_l2s0 [{'href': 'https://cmr.earthdata.nasa.gov/stac... [https://stac-extensions.github.io/storage/v2.... 1.1.0 Feature 2017-07-31 04:00:00+00:00 2017-08-01 03:59:59+00:00 2017-07-31 04:00:00+00:00 {'aws': {'bucket': 'lp-prod-protected', 'platf... 212
2 {'001/GLDSMT_SERC_CalTarps_31July2017_am_l8s0/... {'xmin': -76.5533652, 'ymin': 38.869171, 'xmax... GLDSMT_001 POLYGON ((-76.55199 38.86917, -76.5442 38.8692... GLDSMT_SERC_CalTarps_31July2017_am_l8s0 [{'href': 'https://cmr.earthdata.nasa.gov/stac... [https://stac-extensions.github.io/storage/v2.... 1.1.0 Feature 2017-07-31 04:00:00+00:00 2017-08-01 03:59:59+00:00 2017-07-31 04:00:00+00:00 {'aws': {'bucket': 'lp-prod-protected', 'platf... 212
3 {'001/GLDSMT_SERC_CalTarps_31July2017_am_l4s0/... {'xmin': -76.5531537, 'ymin': 38.8686178, 'xma... GLDSMT_001 POLYGON ((-76.55157 38.86862, -76.54333 38.868... GLDSMT_SERC_CalTarps_31July2017_am_l4s0 [{'href': 'https://cmr.earthdata.nasa.gov/stac... [https://stac-extensions.github.io/storage/v2.... 1.1.0 Feature 2017-07-31 04:00:00+00:00 2017-08-01 03:59:59+00:00 2017-07-31 04:00:00+00:00 {'aws': {'bucket': 'lp-prod-protected', 'platf... 212
4 {'001/GLDSMT_SERC_CalTarps_31July2017_am_l6s0/... {'xmin': -76.5534253, 'ymin': 38.8695516, 'xma... GLDSMT_001 POLYGON ((-76.55182 38.86955, -76.54119 38.869... GLDSMT_SERC_CalTarps_31July2017_am_l6s0 [{'href': 'https://cmr.earthdata.nasa.gov/stac... [https://stac-extensions.github.io/storage/v2.... 1.1.0 Feature 2017-07-31 04:00:00+00:00 2017-08-01 03:59:59+00:00 2017-07-31 04:00:00+00:00 {'aws': {'bucket': 'lp-prod-protected', 'platf... 212
gf_gliht.explore(column="id")
Make this Notebook Trusted to load map: File -> Trust Notebook

Note that the The search coincident searches the NASA G-LiHT ‘GLDSMT_001’ STAC catalog by default, which is a tiled DSM product. There are many other G-LiHT products available to search as seen below. That being said, not all G-LiHT flights will have all of the below products available.

Here’s a quick look at all of the available G-LiHT STAC collections (for CHM, DSM, DTM, Radiance, etc. products):

import pystac_client 
stac = pystac_client.Client.open('https://cmr.earthdata.nasa.gov/stac/LPCLOUD')
cols = list(stac.get_all_collections())
[c.id for c in cols if c.id.startswith('GL')]
['GLORTHO_001',
 'GLCHMK_001',
 'GLCHMT_001',
 'GLDSMT_001',
 'GLDTMK_001',
 'GLDTMT_001',
 'GLHYANC_001',
 'GLRADS_001',
 'GLREFL_001',
 'GLHYVI_001',
 'GLLIDARPC_001',
 'GLMETRICS_001',
 'GLTRAJECTORY_001',
 'GLanCE30_001']

If you want to search any of these additional collections, just run:

gliht_custom = coincident.datasets.nasa.GLiHT(collections=['GLLIDARPC_001'])
gf = coincident.search.search(
    dataset=gliht_custom,
    ...
)

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/34fce4107d6affc06af7539bee265aaffbbaabb6b8ede0daec80d966383f6e3f.png
gf_noaa = coincident.search.search(dataset="noaa", intersects=aoi, datetime=[date])
gf_noaa
id name title start_datetime end_datetime geometry
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...
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...
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...
3 9554 9554 2018 WA DNR Lidar: Yakima Basin North, WA 2018-07-24 2018-08-06 POLYGON ((-120.54498 47.17468, -120.54089 47.1...
4 9605 9605 2018 USFS Lidar: Tieton Basin, WA 2018-07-16 2018-07-18 POLYGON ((-121.19459 46.37311, -121.15364 46.3...
5 9673 9673 2018 USFS Lidar: Methow Basin, WA 2018-07-19 2018-10-11 POLYGON ((-120.03089 48.2396, -120.05499 48.25...
6 8932 8932 2018 OLC Lidar: Morrow County, OR 2018-10-03 2018-11-15 MULTIPOLYGON (((-119.43372 45.91931, -119.5142...
7 9211 9211 2018 - 2019 USGS Lidar: Washington FEMA QL2 2018-08-05 2019-05-06 MULTIPOLYGON (((-117.22388 47.26031, -117.2282...
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
id name title start_datetime end_datetime geometry
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...
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...
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])
/home/docs/checkouts/readthedocs.org/user_builds/coincident/checkouts/104/.pixi/envs/dev/lib/python3.12/site-packages/geopandas/array.py:403: 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 535 ms, sys: 348 ms, total: 883 ms
Wall time: 2.21 s
gf_neon
id title start_datetime end_datetime product_url geometry
0 ABBY Abby Road NEON 2018-07-01 2018-07-31 https://data.neonscience.org/api/v0/data/DP3.3... POLYGON ((-122.40863 45.74603, -122.40854 45.7...
1 WREF Wind River Experimental Forest NEON 2018-07-01 2018-07-31 https://data.neonscience.org/api/v0/data/DP3.3... POLYGON ((-122.09926 45.79801, -122.09911 45.8...
m = gf_noaa.explore(color="blue")
gf_ncalm.explore(m=m, color="black")
gf_neon.explore(m=m, color="deeppink")
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, 13)
assets bbox collection geometry id links stac_extensions stac_version type datetime end_datetime start_datetime dayofyear
0 {'30/LVIS2_ABoVE2017_0630_R1803_071020': {'hre... {'xmin': -133.60073, 'ymin': 67.25842, 'xmax':... ABLVIS2_1 POLYGON ((-133.56719 67.45062, -133.57194 67.4... SC:ABLVIS2.001:129489615 [{'href': 'https://cmr.earthdata.nasa.gov/stac... [] 1.1.0 Feature 2017-06-30 19:43:40.438000+00:00 2017-06-30 19:47:54.433000+00:00 2017-06-30 19:43:40.438000+00:00 181
1 {'30/LVIS2_ABoVE2017_0630_R1803_071274': {'hre... {'xmin': -133.84509, 'ymin': 67.41616, 'xmax':... ABLVIS2_1 POLYGON ((-133.69928 67.44517, -133.74165 67.4... SC:ABLVIS2.001:129489178 [{'href': 'https://cmr.earthdata.nasa.gov/stac... [] 1.1.0 Feature 2017-06-30 19:47:54.433000+00:00 2017-06-30 19:49:17.458000+00:00 2017-06-30 19:47:54.433000+00:00 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, 13)
assets bbox collection geometry id links stac_extensions stac_version type datetime end_datetime start_datetime dayofyear
0 {'20/LVIS2_Gabon2016_0220_R1808_038024': {'hre... {'xmin': 9.78612, 'ymin': -0.17711, 'xmax': 10... AFLVIS2_1 POLYGON ((9.78612 0.16789, 9.78612 0.16429, 9.... SC:AFLVIS2.001:138345559 [{'href': 'https://cmr.earthdata.nasa.gov/stac... [] 1.1.0 Feature 2016-02-20 10:33:44.015000+00:00 2016-02-20 10:43:39.524000+00:00 2016-02-20 10:33:44.015000+00:00 51
1 {'20/LVIS2_Gabon2016_0220_R1808_038619': {'hre... {'xmin': 10.19384, 'ymin': -0.83624, 'xmax': 1... AFLVIS2_1 POLYGON ((10.19743 -0.15792, 10.19743 -0.1615,... SC:AFLVIS2.001:138348873 [{'href': 'https://cmr.earthdata.nasa.gov/stac... [] 1.1.0 Feature 2016-02-20 10:43:39.525000+00:00 2016-02-20 10:58:47.545000+00:00 2016-02-20 10:43:39.525000+00:00 51
gf_lvis_af.explore(column="datetime", cmap="inferno")
Make this Notebook Trusted to load map: File -> Trust Notebook