stac

DuckDB extension for reading data from SpatioTemporal Asset Catalogs (STAC) using SQL.

Maintainer(s): ahuarte47

Installing and Loading

INSTALL stac FROM community;
LOAD stac;

Example

-- Read the content of a static STAC catalog and return the first 2 items:
SELECT
collection, id
FROM
STAC_Read('https://raw.githubusercontent.com/radiantearth/stac-spec/refs/heads/master/examples/catalog.json')
LIMIT 2
;
┌───────────────┬────────────────────────────────────────────────────────────────┬─────────────────────────────────┐
collection │ id │ bbox │
varcharvarchar │ stac_bbox │
├───────────────┼────────────────────────────────────────────────────────────────┼─────────────────────────────────┤
│ sentinel2_l2a │ S2A_OPER_MSI_L2A_TL_EPAE_20190527T094026_A020508_T46VCQ_N02.12 │ { │
│ │ │ 'minx': 90.63571493952938, │
│ │ │ 'miny': 91.27015715015226, │
│ │ │ 'maxx': 62.12379856857608, │
│ │ │ 'maxy': 62.96338922674105
│ │ │ } │
├───────────────┼────────────────────────────────────────────────────────────────┼─────────────────────────────────┤
│ sentinel2_l2a │ S2A_OPER_MSI_L2A_TL_MTI__20190518T203951_A020386_T24XWM_N02.12 │ { │
│ │ │ 'minx': -39.0008444956852, │
│ │ │ 'miny': -34.13214411127818, │
│ │ │ 'maxx': 77.42853163431232, │
│ │ │ 'maxy': 78.37301671070006
│ │ │ } │
└───────────────┴────────────────────────────────────────────────────────────────┴─────────────────────────────────┘
-- Search for items in a STAC catalog using the STAC API - Item Search endpoint:
SELECT
collection, id, bbox
FROM
STAC_Search(
'https://earth-search.aws.element84.com/v0/search',
collections := ['sentinel-s2-l2a-cogs'],
datetime := '2021-09-30/2021-10-30',
bbox := [-1.695007724869786, 42.788757186108654, -1.604482013650674, 42.84244150196227]
)
;
┌──────────────────────┬──────────────────────────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
collection │ id │ bbox │
varcharvarchar │ stac_bbox │
├──────────────────────┼──────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ sentinel-s2-l2a-cogs │ S2B_30TWN_20211030_0_L2A │ {'minx': -3.0002344509650487, 'miny': 42.356331534440834, 'maxx': -1.6455652046460576, 'maxy': 43.35284638738093} │
│ sentinel-s2-l2a-cogs │ S2B_30TXN_20211030_0_L2A │ {'minx': -1.7857005522228677, 'miny': 42.335791505536065, 'maxx': -0.4124765189393069, 'maxy': 43.3461908738427} │
│ sentinel-s2-l2a-cogs │ S2A_30TWN_20211025_0_L2A │ {'minx': -3.0002344509650487, 'miny': 42.356331534440834, 'maxx': -1.6455652046460576, 'maxy': 43.35284638738093} │
│ sentinel-s2-l2a-cogs │ S2A_30TXN_20211025_0_L2A │ {'minx': -1.7857005522228677, 'miny': 42.335791505536065, 'maxx': -0.4124765189393069, 'maxy': 43.3461908738427} │
│ sentinel-s2-l2a-cogs │ S2B_30TWN_20211020_0_L2A │ {'minx': -3.0002344509650487, 'miny': 42.356331534440834, 'maxx': -1.6455652046460576, 'maxy': 43.35284638738093} │
│ sentinel-s2-l2a-cogs │ S2A_30TXN_20211015_0_L2A │ {'minx': -1.7857005522228677, 'miny': 42.335791505536065, 'maxx': -0.4124765189393069, 'maxy': 43.3461908738427} │
│ sentinel-s2-l2a-cogs │ S2B_30TXN_20210930_0_L2A │ {'minx': -1.7857005522228677, 'miny': 42.335791505536065, 'maxx': -0.4124765189393069, 'maxy': 43.3461908738427} │
└──────────────────────┴──────────────────────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

About stac

A DuckDB extension for reading data from SpatioTemporal Asset Catalogs (STAC) using SQL.

The extension exposes STAC catalogs as relational tables, following the GeoParquet STAC specification.

Each row represents a single STAC item. Almost all item fields are mapped to columns; nested JSON structures are preserved as Parquet structs where possible, but item properties are promoted to the top level for easier filtering and querying.

The extension provides two table functions to read STAC catalogs:

  • STAC_Read: Reads the content of a SpatioTemporal Asset Catalog (STAC) catalog from the given URL or JSON file and returns it as a table.

    SELECT * FROM STAC_Read('https://example.com/stac/collection.json');
  • STAC_Search:

    Searches the content of a SpatioTemporal Asset Catalog (STAC) catalog based on the given STAC API - Item Search filtering criteria (https://api.stacspec.org/v1.0.0/item-search/) and returns matching items as a table.

    The url parameter specifies the base URL of the STAC API - Item Search endpoint to query.

    The optional parameters allow filtering by different criteria:

    • collections: A list of collection IDs to filter the search results.
    • ids: A list of item IDs to filter the search results.
    • bbox: A bounding box to filter items by spatial intersection, specified as an array of four floats representing the minimum longitude, minimum latitude, maximum longitude, and maximum latitude.
    • intersects: A geometry object (EPSG:4326) to filter items by spatial intersection.
    • datetime: A string representing a temporal range to filter the search results, specified in the format “start_datetime/end_datetime” (e.g., “2021-01-01T00:00:00Z/2021-12-31T23:59:59Z”).
    • max_items: An integer specifying the maximum number of items to return in each result page.
    SELECT
    *
    FROM
    STAC_Search(
    'https://earth-search.aws.element84.com/v0/search',
    collections := ['sentinel-s2-l2a-cogs'],
    datetime := '2021-09-30/2021-10-30',
    intersects := ST_MakeEnvelope(-1.695007724869786, 42.788757186108654, -1.604482013650674, 42.84244150196227)::GEOMETRY('EPSG::4326')
    )
    ;
    SELECT
    *
    FROM
    STAC_Search(
    'https://earth-search.aws.element84.com/v0/search',
    collections := ['sentinel-s2-l2a-cogs'],
    datetime := '2021-09-30/2021-10-30',
    bbox := [-1.695007724869786, 42.788757186108654, -1.604482013650674, 42.84244150196227]
    )
    ;

Added Functions

function_name function_type description comment examples
STAC_Read table NULL [
SELECT * FROM STAC_Read('https://example.com/stac/collection.json');
] |

| STAC_Search | table | | NULL | [ SELECT * FROM STAC_Search(‘https://example.com/stac/collection.json’, collections:=‘my_collection’, bbox:=[-180, -90, 180, 90], max_items:=10); ] |

Overloaded Functions

This extension does not add any function overloads.

Added Types

type_name type_size logical_type type_category internal
STAC_ASSET 0 STRUCT COMPOSITE true
STAC_BBOX 0 STRUCT COMPOSITE true
STAC_LINK 0 STRUCT COMPOSITE true

Added Settings

This extension does not add any settings.