The STAC data source allows you to read data from a SpatioTemporal Asset Catalog (STAC) API. The data source supports reading STAC items and collections.
Usage¶
To use the STAC data source, you can load a STAC catalog into a Sedona DataFrame using the stac format. The path can be either a local STAC collection JSON file or an HTTP/HTTPS endpoint to retrieve the collection JSON file.
You can load a STAC collection from a local collection file:
df = sedona.read.format("stac").load("/user/stac_collection.json")
df.printSchema()
df.show()
You can load a STAC collection from a s3 collection file object:
df = sedona.read.format("stac").load("s3a://example.com/stac_bucket/stac_collection.json")
df.printSchema()
df.show()
You can also load a STAC collection from an HTTP/HTTPS endpoint:
df = sedona.read.format("stac").load("https://earth-search.aws.element84.com/v1/collections/sentinel-2-pre-c1-l2a")
df.printSchema()
df.show()
output:
root
|-- stac_version: string (nullable = false)
|-- stac_extensions: array (nullable = true)
| |-- element: string (containsNull = true)
|-- type: string (nullable = false)
|-- id: string (nullable = false)
|-- bbox: array (nullable = true)
| |-- element: double (containsNull = true)
|-- geometry: geometry (nullable = true)
|-- title: string (nullable = true)
|-- description: string (nullable = true)
|-- datetime: timestamp (nullable = true)
|-- start_datetime: timestamp (nullable = true)
|-- end_datetime: timestamp (nullable = true)
|-- created: timestamp (nullable = true)
|-- updated: timestamp (nullable = true)
|-- platform: string (nullable = true)
|-- instruments: array (nullable = true)
| |-- element: string (containsNull = true)
|-- constellation: string (nullable = true)
|-- mission: string (nullable = true)
|-- gsd: double (nullable = true)
|-- collection: string (nullable = true)
|-- links: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- rel: string (nullable = true)
| | |-- href: string (nullable = true)
| | |-- type: string (nullable = true)
| | |-- title: string (nullable = true)
|-- assets: map (nullable = true)
| |-- key: string
| |-- value: struct (valueContainsNull = true)
| | |-- href: string (nullable = true)
| | |-- type: string (nullable = true)
| | |-- title: string (nullable = true)
| | |-- roles: array (nullable = true)
| | | |-- element: string (containsNull = true)
| | |-- rast: raster (nullable = true)
+------------+--------------------+-------+--------------------+--------------------+--------------------+-----+-----------+--------------------+--------------+------------+--------------------+--------------------+-----------+-----------+-------------+-------+----+--------------------+--------------------+--------------------+
|stac_version| stac_extensions| type| id| bbox| geometry|title|description| datetime|start_datetime|end_datetime| created| updated| platform|instruments|constellation|mission| gsd| collection| links| assets|
+------------+--------------------+-------+--------------------+--------------------+--------------------+-----+-----------+--------------------+--------------+------------+--------------------+--------------------+-----------+-----------+-------------+-------+----+--------------------+--------------------+--------------------+
| 1.0.0|[https://stac-ext...|Feature|S2B_T21NYC_202212...|[-55.202493, 1.71...|POLYGON ((-55.201...| NULL| NULL|2022-12-05 14:11:...| NULL| NULL|2024-05-01 21:13:...|2024-05-01 21:13:...|sentinel-2b| [msi]| sentinel-2| NULL|NULL|sentinel-2-pre-c1...|[{self, https://e...|{red -> {https://...|
| 1.0.0|[https://stac-ext...|Feature|S2B_T21NZC_202212...|[-54.30394, 1.719...|POLYGON ((-54.302...| NULL| NULL|2022-12-05 14:11:...| NULL| NULL|2024-05-03 00:39:...|2024-05-03 00:39:...|sentinel-2b| [msi]| sentinel-2| NULL|NULL|sentinel-2-pre-c1...|[{self, https://e...|{red -> {https://...|
| 1.0.0|[https://stac-ext...|Feature|S2B_T22NBH_202212...|[-53.698196, 2.63...|POLYGON ((-53.698...| NULL| NULL|2022-12-05 14:11:...| NULL| NULL|2024-05-03 00:26:...|2024-05-03 00:26:...|sentinel-2b| [msi]| sentinel-2| NULL|NULL|sentinel-2-pre-c1...|[{self, https://e...|{red -> {https://...|
| 1.0.0|[https://stac-ext...|Feature|S2B_T21NYD_202212...|[-55.201423, 2.62...|POLYGON ((-55.199...| NULL| NULL|2022-12-05 14:11:...| NULL| NULL|2024-05-01 21:10:...|2024-05-01 21:10:...|sentinel-2b| [msi]| sentinel-2| NULL|NULL|sentinel-2-pre-c1...|[{self, https://e...|{red -> {https://...|
| 1.0.0|[https://stac-ext...|Feature|S2B_T21NZD_202212...|[-54.302336, 2.62...|POLYGON ((-54.299...| NULL| NULL|2022-12-05 14:11:...| NULL| NULL|2024-05-03 00:12:...|2024-05-03 00:12:...|sentinel-2b| [msi]| sentinel-2| NULL|NULL|sentinel-2-pre-c1...|[{self, https://e...|{red -> {https://...|
| 1.0.0|[https://stac-ext...|Feature|S2B_T22NBJ_202212...|[-53.700535, 2.63...|POLYGON ((-53.700...| NULL| NULL|2022-12-05 14:11:...| NULL| NULL|2024-05-03 00:30:...|2024-05-03 00:30:...|sentinel-2b| [msi]| sentinel-2| NULL|NULL|sentinel-2-pre-c1...|[{self, https://e...|{red -> {https://...|
| 1.0.0|[https://stac-ext...|Feature|S2B_T21NYE_202212...|[-55.199906, 3.52...|POLYGON ((-55.197...| NULL| NULL|2022-12-05 14:11:...| NULL| NULL|2024-05-01 21:24:...|2024-05-01 21:24:...|sentinel-2b| [msi]| sentinel-2| NULL|NULL|sentinel-2-pre-c1...|[{self, https://e...|{red -> {https://...|
| 1.0.0|[https://stac-ext...|Feature|S2B_T21NZE_202212...|[-54.300062, 3.52...|POLYGON ((-54.296...| NULL| NULL|2022-12-05 14:11:...| NULL| NULL|2024-05-03 00:14:...|2024-05-03 00:14:...|sentinel-2b| [msi]| sentinel-2| NULL|NULL|sentinel-2-pre-c1...|[{self, https://e...|{red -> {https://...|
| 1.0.0|[https://stac-ext...|Feature|S2B_T22NBK_202212...|[-53.703548, 3.52...|POLYGON ((-53.703...| NULL| NULL|2022-12-05 14:11:...| NULL| NULL|2024-05-03 00:32:...|2024-05-03 00:32:...|sentinel-2b| [msi]| sentinel-2| NULL|NULL|sentinel-2-pre-c1...|[{self, https://e...|{red -> {https://...|
| 1.0.0|[https://stac-ext...|Feature|S2B_T21NYF_202212...|[-55.197941, 4.42...|POLYGON ((-55.195...| NULL| NULL|2022-12-05 14:11:...| NULL| NULL|2024-05-01 21:43:...|2024-05-01 21:43:...|sentinel-2b| [msi]| sentinel-2| NULL|NULL|sentinel-2-pre-c1...|[{self, https://e...|{red -> {https://...|
+------------+--------------------+-------+--------------------+--------------------+--------------------+-----+-----------+--------------------+--------------+------------+--------------------+--------------------+-----------+-----------+-------------+-------+----+--------------------+--------------------+--------------------+
Filter Pushdown¶
The STAC data source supports predicate pushdown for spatial and temporal filters. The data source can push down spatial and temporal filters to the underlying data source to reduce the amount of data that needs to be read.
Spatial Filter Pushdown¶
Spatial filter pushdown allows the data source to apply spatial predicates (e.g., st_contains, st_intersects) directly at the data source level, reducing the amount of data transferred and processed.
Temporal Filter Pushdown¶
Temporal filter pushdown allows the data source to apply temporal predicates (e.g., BETWEEN
, >=
, <=
) directly at the data source level, similarly reducing the amount of data transferred and processed.
Examples¶
Here are some examples demonstrating how to query a STAC data source that is loaded into a table named STAC_TABLE
.
SQL Select Without Filters¶
SELECT id, datetime as dt, geometry, bbox FROM STAC_TABLE
SQL Select With Temporal Filter¶
SELECT id, datetime as dt, geometry, bbox
FROM STAC_TABLE
WHERE datetime BETWEEN '2020-01-01' AND '2020-12-13'
In this example, the data source will push down the temporal filter to the underlying data source.
SQL Select With Spatial Filter¶
SELECT id, geometry
FROM STAC_TABLE
WHERE st_contains(ST_GeomFromText('POLYGON((17 10, 18 10, 18 11, 17 11, 17 10))'), geometry)
In this example, the data source will push down the spatial filter to the underlying data source.
References¶
-
STAC Specification: https://stacspec.org/
-
STAC Browser: https://github.com/radiantearth/stac-browser
-
STAC YouTube Video: https://www.youtube.com/watch?v=stac-video