You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sedona.apache.org by ji...@apache.org on 2025/01/30 05:42:14 UTC

(sedona) branch master updated: [SEDONA-704] Add the STAC datasource reader (#1775)

This is an automated email from the ASF dual-hosted git repository.

jiayu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sedona.git


The following commit(s) were added to refs/heads/master by this push:
     new 8c3b6db007 [SEDONA-704] Add the STAC datasource reader (#1775)
8c3b6db007 is described below

commit 8c3b6db0077cee142a1f127f16564bd4967e1db3
Author: Feng Zhang <fe...@wherobots.com>
AuthorDate: Wed Jan 29 21:42:08 2025 -0800

    [SEDONA-704] Add the STAC datasource reader (#1775)
    
    * [SEDONA-704] Add the STAC datasource reader
    
    * fix issues for scala 2.13
    
    * fix unit tests in spark 3.4.0
    
    * refactor stac tests to remove dependency on creating a spark sesssion
    
    * clean up print in tests
    
    * remove prints from all unit tests
---
 docs/api/sql/Stac.md                               |  155 +
 ...org.apache.spark.sql.sources.DataSourceRegister |    1 +
 .../org/apache/sedona/spark/SedonaContext.scala    |   23 +-
 .../execution/datasource/stac/TemporalFilter.scala |   68 +
 .../spark/sql/sedona_sql/io/stac/StacBatch.scala   |  264 +
 .../sql/sedona_sql/io/stac/StacDataSource.scala    |  116 +
 .../sql/sedona_sql/io/stac/StacPartition.scala     |   24 +
 .../sedona_sql/io/stac/StacPartitionReader.scala   |  229 +
 .../spark/sql/sedona_sql/io/stac/StacScan.scala    |  118 +
 .../sql/sedona_sql/io/stac/StacScanBuilder.scala   |   41 +
 .../spark/sql/sedona_sql/io/stac/StacTable.scala   |  261 +
 .../spark/sql/sedona_sql/io/stac/StacUtils.scala   |  225 +
 .../SpatialFilterPushDownForGeoParquet.scala       |    2 +-
 .../SpatialTemporalFilterPushDownForStacScan.scala |  163 +
 .../datasource_stac/collection-items.json          | 7204 ++++++++++++++++++++
 .../test/resources/datasource_stac/collection.json |  142 +
 .../test/resources/datasource_stac/core-item.json  |  125 +
 .../resources/datasource_stac/extended-item.json   |  210 +
 .../datasource_stac/nested/nested-collection.json  |  130 +
 .../datasource_stac/nested/nested-item.json        |   55 +
 .../datasource_stac/nested/nested-items.json       |  110 +
 .../resources/datasource_stac/simple-item.json     |   83 +
 .../sql/sedona_sql/io/stac/StacBatchTest.scala     |  103 +
 .../sedona_sql/io/stac/StacDataSourceTest.scala    |  209 +
 .../io/stac/StacPartitionReaderTest.scala          |  100 +
 .../sql/sedona_sql/io/stac/StacTableTest.scala     |   73 +
 .../sql/sedona_sql/io/stac/StacUtilsTest.scala     |  594 ++
 27 files changed, 10819 insertions(+), 9 deletions(-)

diff --git a/docs/api/sql/Stac.md b/docs/api/sql/Stac.md
new file mode 100644
index 0000000000..98909e025b
--- /dev/null
+++ b/docs/api/sql/Stac.md
@@ -0,0 +1,155 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ -->
+
+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:
+
+```python
+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:
+
+```python
+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:
+
+```python
+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)
+
++------------+--------------------+-------+--------------------+--------------------+--------------------+-----+-----------+--------------------+--------------+------------+--------------------+--------------------+-----------+-----------+-------------+-------+----+--------------------+--------------------+--------------------+
+|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
+
+```sql
+SELECT id, datetime as dt, geometry, bbox FROM STAC_TABLE
+```
+
+## SQL Select With Temporal Filter
+
+```sql
+  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
+
+```sql
+  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
diff --git a/spark/common/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister b/spark/common/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister
index b664d1db50..162e44369f 100644
--- a/spark/common/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister
+++ b/spark/common/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister
@@ -1,3 +1,4 @@
 org.apache.spark.sql.sedona_sql.io.raster.RasterFileFormat
 org.apache.spark.sql.sedona_sql.io.geojson.GeoJSONFileFormat
 org.apache.sedona.sql.datasources.spider.SpiderDataSource
+org.apache.spark.sql.sedona_sql.io.stac.StacDataSource
diff --git a/spark/common/src/main/scala/org/apache/sedona/spark/SedonaContext.scala b/spark/common/src/main/scala/org/apache/sedona/spark/SedonaContext.scala
index 000f1beaa4..fe2926fc51 100644
--- a/spark/common/src/main/scala/org/apache/sedona/spark/SedonaContext.scala
+++ b/spark/common/src/main/scala/org/apache/sedona/spark/SedonaContext.scala
@@ -24,11 +24,8 @@ import org.apache.sedona.sql.RasterRegistrator
 import org.apache.sedona.sql.UDF.UdfRegistrator
 import org.apache.sedona.sql.UDT.UdtRegistrator
 import org.apache.spark.serializer.KryoSerializer
-import org.apache.spark.sql.sedona_sql.optimization.SpatialFilterPushDownForGeoParquet
-
-import org.apache.spark.sql.sedona_sql.optimization.ExtractGeoStatsFunctions
+import org.apache.spark.sql.sedona_sql.optimization.{ExtractGeoStatsFunctions, SpatialFilterPushDownForGeoParquet, SpatialTemporalFilterPushDownForStacScan}
 import org.apache.spark.sql.sedona_sql.strategy.geostats.EvalGeoStatsFunctionStrategy
-
 import org.apache.spark.sql.sedona_sql.strategy.join.JoinQueryDetector
 import org.apache.spark.sql.{SQLContext, SparkSession}
 
@@ -40,6 +37,12 @@ class InternalApi(
     extends StaticAnnotation
 
 object SedonaContext {
+
+  private def customOptimizationsWithSession(sparkSession: SparkSession) =
+    Seq(
+      new SpatialFilterPushDownForGeoParquet(sparkSession),
+      new SpatialTemporalFilterPushDownForStacScan(sparkSession))
+
   def create(sqlContext: SQLContext): SQLContext = {
     create(sqlContext.sparkSession)
     sqlContext
@@ -60,10 +63,14 @@ object SedonaContext {
     if (!sparkSession.experimental.extraStrategies.exists(_.isInstanceOf[JoinQueryDetector])) {
       sparkSession.experimental.extraStrategies ++= Seq(new JoinQueryDetector(sparkSession))
     }
-    if (!sparkSession.experimental.extraOptimizations.exists(
-        _.isInstanceOf[SpatialFilterPushDownForGeoParquet])) {
-      sparkSession.experimental.extraOptimizations ++= Seq(
-        new SpatialFilterPushDownForGeoParquet(sparkSession))
+
+    customOptimizationsWithSession(sparkSession).foreach { opt =>
+      if (!sparkSession.experimental.extraOptimizations.exists {
+          case _: opt.type => true
+          case _ => false
+        }) {
+        sparkSession.experimental.extraOptimizations ++= Seq(opt)
+      }
     }
 
     // Support geostats functions
diff --git a/spark/common/src/main/scala/org/apache/spark/sql/execution/datasource/stac/TemporalFilter.scala b/spark/common/src/main/scala/org/apache/spark/sql/execution/datasource/stac/TemporalFilter.scala
new file mode 100644
index 0000000000..e5bfc947ac
--- /dev/null
+++ b/spark/common/src/main/scala/org/apache/spark/sql/execution/datasource/stac/TemporalFilter.scala
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.spark.sql.execution.datasource.stac
+
+import java.time.LocalDateTime
+
+/* A temporal filter that can be pushed down to the STAC data source.
+ * It wraps a [[TemporalFilter]] and provides a simple string representation.
+ * @param temporalFilter
+ */
+trait TemporalFilter {
+  def evaluate(columns: Map[String, LocalDateTime]): Boolean
+  def simpleString: String
+}
+
+object TemporalFilter {
+
+  case class AndFilter(left: TemporalFilter, right: TemporalFilter) extends TemporalFilter {
+    override def evaluate(columns: Map[String, LocalDateTime]): Boolean = {
+      left.evaluate(columns) && right.evaluate(columns)
+    }
+
+    override def simpleString: String = s"(${left.simpleString}) AND (${right.simpleString})"
+  }
+
+  case class OrFilter(left: TemporalFilter, right: TemporalFilter) extends TemporalFilter {
+    override def evaluate(columns: Map[String, LocalDateTime]): Boolean =
+      left.evaluate(columns) || right.evaluate(columns)
+    override def simpleString: String = s"(${left.simpleString}) OR (${right.simpleString})"
+  }
+
+  case class LessThanFilter(columnName: String, value: LocalDateTime) extends TemporalFilter {
+    override def evaluate(columns: Map[String, LocalDateTime]): Boolean = {
+      columns.get(columnName).exists(_ isBefore value)
+    }
+    override def simpleString: String = s"$columnName < $value"
+  }
+
+  case class GreaterThanFilter(columnName: String, value: LocalDateTime) extends TemporalFilter {
+    override def evaluate(columns: Map[String, LocalDateTime]): Boolean = {
+      columns.get(columnName).exists(_ isAfter value)
+    }
+    override def simpleString: String = s"$columnName > $value"
+  }
+
+  case class EqualFilter(columnName: String, value: LocalDateTime) extends TemporalFilter {
+    override def evaluate(columns: Map[String, LocalDateTime]): Boolean = {
+      columns.get(columnName).exists(_ isEqual value)
+    }
+    override def simpleString: String = s"$columnName = $value"
+  }
+}
diff --git a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/io/stac/StacBatch.scala b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/io/stac/StacBatch.scala
new file mode 100644
index 0000000000..98cb35ee07
--- /dev/null
+++ b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/io/stac/StacBatch.scala
@@ -0,0 +1,264 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.spark.sql.sedona_sql.io.stac
+
+import com.fasterxml.jackson.databind.{JsonNode, ObjectMapper}
+import org.apache.spark.sql.connector.read.{Batch, InputPartition, PartitionReaderFactory}
+import org.apache.spark.sql.execution.datasource.stac.TemporalFilter
+import org.apache.spark.sql.execution.datasources.parquet.{GeoParquetSpatialFilter, GeometryFieldMetaData}
+import org.apache.spark.sql.sedona_sql.io.stac.StacUtils.getNumPartitions
+import org.apache.spark.sql.types.StructType
+
+import java.time.LocalDateTime
+import java.time.format.DateTimeFormatterBuilder
+import java.time.temporal.ChronoField
+import scala.jdk.CollectionConverters._
+
+/**
+ * The `StacBatch` class represents a batch of partitions for reading data in the SpatioTemporal
+ * Asset Catalog (STAC) data source. It implements the `Batch` interface from Apache Spark's data
+ * source API.
+ *
+ * This class provides methods to plan input partitions and create a partition reader factory,
+ * which are necessary for batch data processing.
+ */
+case class StacBatch(
+    stacCollectionUrl: String,
+    stacCollectionJson: String,
+    schema: StructType,
+    opts: Map[String, String],
+    spatialFilter: Option[GeoParquetSpatialFilter],
+    temporalFilter: Option[TemporalFilter])
+    extends Batch {
+
+  val mapper = new ObjectMapper()
+
+  /**
+   * Plans the input partitions for reading data from the STAC data source.
+   *
+   * @return
+   *   An array of input partitions for reading STAC data.
+   */
+  override def planInputPartitions(): Array[InputPartition] = {
+    val stacCollectionBasePath = StacUtils.getStacCollectionBasePath(stacCollectionUrl)
+
+    // Initialize the itemLinks array
+    val itemLinks = scala.collection.mutable.ArrayBuffer[String]()
+
+    // Start the recursive collection of item links
+    collectItemLinks(stacCollectionBasePath, stacCollectionJson, itemLinks)
+
+    // Handle when the number of items is less than 1
+    if (itemLinks.isEmpty) {
+      return Array.empty[InputPartition]
+    }
+
+    val numPartitions = getNumPartitions(
+      itemLinks.length,
+      opts.getOrElse("numPartitions", "-1").toInt,
+      opts.getOrElse("maxPartitionItemFiles", "-1").toInt,
+      opts.getOrElse("defaultParallelism", "1").toInt)
+
+    // Handle when the number of items is less than the number of partitions
+    if (itemLinks.length < numPartitions) {
+      return itemLinks.zipWithIndex.map { case (item, index) =>
+        StacPartition(index, Array(item), new java.util.HashMap[String, String]())
+      }.toArray
+    }
+
+    // Determine how many items to put in each partition
+    val partitionSize = Math.ceil(itemLinks.length.toDouble / numPartitions).toInt
+
+    // Group the item links into partitions
+    itemLinks
+      .grouped(partitionSize)
+      .zipWithIndex
+      .map { case (items, index) =>
+        // Create a StacPartition for each group of items
+        StacPartition(index, items.toArray, new java.util.HashMap[String, String]())
+      }
+      .toArray
+  }
+
+  /**
+   * Recursively processes collections and collects item links.
+   *
+   * @param collectionBasePath
+   *   The base path of the STAC collection.
+   * @param collectionJson
+   *   The JSON string representation of the STAC collection.
+   * @param itemLinks
+   *   The list of item links to populate.
+   */
+  private def collectItemLinks(
+      collectionBasePath: String,
+      collectionJson: String,
+      itemLinks: scala.collection.mutable.ArrayBuffer[String]): Unit = {
+    // Parse the JSON string into a JsonNode (tree representation of JSON)
+    val rootNode: JsonNode = mapper.readTree(collectionJson)
+
+    // Extract item links from the "links" array
+    val linksNode = rootNode.get("links")
+    val iterator = linksNode.elements()
+    while (iterator.hasNext) {
+      val linkNode = iterator.next()
+      val rel = linkNode.get("rel").asText()
+      val href = linkNode.get("href").asText()
+
+      // item links are identified by the "rel" value of "item" or "items"
+      if (rel == "item" || rel == "items") {
+        // need to handle relative paths and local file paths
+        val itemUrl = if (href.startsWith("http") || href.startsWith("file")) {
+          href
+        } else {
+          collectionBasePath + href
+        }
+        itemLinks += itemUrl // Add the item URL to the list
+      } else if (rel == "child") {
+        val childUrl = if (href.startsWith("http") || href.startsWith("file")) {
+          href
+        } else {
+          collectionBasePath + href
+        }
+        // Recursively process the linked collection
+        val linkedCollectionJson = StacUtils.loadStacCollectionToJson(childUrl)
+        val nestedCollectionBasePath = StacUtils.getStacCollectionBasePath(childUrl)
+        val collectionFiltered =
+          filterCollection(linkedCollectionJson, spatialFilter, temporalFilter)
+
+        if (!collectionFiltered) {
+          collectItemLinks(nestedCollectionBasePath, linkedCollectionJson, itemLinks)
+        }
+      }
+    }
+  }
+
+  /**
+   * Filters a collection based on the provided spatial and temporal filters.
+   *
+   * @param collectionJson
+   *   The JSON string representation of the STAC collection.
+   * @param spatialFilter
+   *   The spatial filter to apply to the collection.
+   * @param temporalFilter
+   *   The temporal filter to apply to the collection.
+   * @return
+   *   `true` if the collection is filtered out, `false` otherwise.
+   */
+  def filterCollection(
+      collectionJson: String,
+      spatialFilter: Option[GeoParquetSpatialFilter],
+      temporalFilter: Option[TemporalFilter]): Boolean = {
+
+    val mapper = new ObjectMapper()
+    val rootNode: JsonNode = mapper.readTree(collectionJson)
+
+    // Filter based on spatial extent
+    val spatialFiltered = spatialFilter match {
+      case Some(filter) =>
+        val extentNode = rootNode.path("extent").path("spatial").path("bbox")
+        if (extentNode.isMissingNode) {
+          false
+        } else {
+          val bbox = extentNode
+            .elements()
+            .asScala
+            .map { bboxNode =>
+              val minX = bboxNode.get(0).asDouble()
+              val minY = bboxNode.get(1).asDouble()
+              val maxX = bboxNode.get(2).asDouble()
+              val maxY = bboxNode.get(3).asDouble()
+              (minX, minY, maxX, maxY)
+            }
+            .toList
+
+          !bbox.exists { case (minX, minY, maxX, maxY) =>
+            val geometryTypes = Seq("Polygon")
+            val bbox = Seq(minX, minY, maxX, maxY)
+
+            val geometryFieldMetaData = GeometryFieldMetaData(
+              encoding = "WKB",
+              geometryTypes = geometryTypes,
+              bbox = bbox,
+              crs = None,
+              covering = None)
+
+            filter.evaluate(Map("geometry" -> geometryFieldMetaData))
+          }
+        }
+      case None => false
+    }
+
+    // Filter based on temporal extent
+    val temporalFiltered = temporalFilter match {
+      case Some(filter) =>
+        val extentNode = rootNode.path("extent").path("temporal").path("interval")
+        if (extentNode.isMissingNode) {
+          // if extent is missing, we assume the collection is not filtered
+          true
+        } else {
+          // parse the temporal intervals
+          val formatter = new DateTimeFormatterBuilder()
+            .appendPattern("yyyy-MM-dd'T'HH:mm:ss")
+            .optionalStart()
+            .appendFraction(ChronoField.MILLI_OF_SECOND, 0, 3, true)
+            .optionalEnd()
+            .appendPattern("'Z'")
+            .toFormatter()
+
+          val intervals = extentNode
+            .elements()
+            .asScala
+            .map { intervalNode =>
+              val start = LocalDateTime.parse(intervalNode.get(0).asText(), formatter)
+              val end = LocalDateTime.parse(intervalNode.get(1).asText(), formatter)
+              (start, end)
+            }
+            .toList
+
+          // check if the filter evaluates to true for any of the interval start or end times
+          !intervals.exists { case (start, end) =>
+            filter.evaluate(Map("datetime" -> start)) ||
+            filter.evaluate(Map("datetime" -> end))
+          }
+        }
+      // if the collection is not filtered, return false
+      case None => false
+    }
+
+    spatialFiltered || temporalFiltered
+  }
+
+  /**
+   * Creates a partition reader factory for reading data from the STAC data source.
+   *
+   * @return
+   *   A partition reader factory for reading STAC data.
+   */
+  override def createReaderFactory(): PartitionReaderFactory = { (partition: InputPartition) =>
+    {
+      new StacPartitionReader(
+        partition.asInstanceOf[StacPartition],
+        schema,
+        opts,
+        spatialFilter,
+        temporalFilter)
+    }
+  }
+}
diff --git a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/io/stac/StacDataSource.scala b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/io/stac/StacDataSource.scala
new file mode 100644
index 0000000000..ac64b8393b
--- /dev/null
+++ b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/io/stac/StacDataSource.scala
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.spark.sql.sedona_sql.io.stac
+
+import StacUtils.{inferStacSchema, updatePropertiesPromotedSchema}
+import org.apache.spark.sql.SparkSession
+import org.apache.spark.sql.connector.catalog.{Table, TableProvider}
+import org.apache.spark.sql.connector.expressions.Transform
+import org.apache.spark.sql.sedona_sql.UDT.GeometryUDT
+import org.apache.spark.sql.sedona_sql.io.geojson.GeoJSONUtils
+import org.apache.spark.sql.sources.DataSourceRegister
+import org.apache.spark.sql.types.StructType
+import org.apache.spark.sql.util.CaseInsensitiveStringMap
+
+import java.util
+import java.util.concurrent.ConcurrentHashMap
+import scala.jdk.CollectionConverters._
+
+/**
+ * The `StacDataSource` class is responsible for enabling the reading of SpatioTemporal Asset
+ * Catalogs (STAC) as tables in Apache Spark. It allows integrating geospatial metadata from local
+ * or remote STAC catalog sources into Spark for processing.
+ *
+ * This class implements Apache Spark's `TableProvider` interface to define how STAC data sources
+ * are converted into Spark tables, and the `DataSourceRegister` interface to provide a custom
+ * short name for easier data source loading.
+ */
+class StacDataSource() extends TableProvider with DataSourceRegister {
+
+  // Cache to store inferred schemas
+  private val schemaCache = new ConcurrentHashMap[Map[String, String], StructType]()
+
+  /**
+   * Returns the short name of this data source, which can be used in Spark SQL queries for
+   * loading the data source. For example:
+   *
+   * `spark.read.format("stac").load(...)`
+   *
+   * @return
+   *   The string identifier for this data source, "stac".
+   */
+  override def shortName(): String = "stac"
+
+  /**
+   * Infers and returns the schema of the STAC data source. This implementation checks if a local
+   * cache of the processed STAC collection exists. If not, it processes the STAC collection and
+   * saves it as a GeoJson file. The schema is then inferred from this GeoJson file.
+   *
+   * @param opts
+   *   Mapping of data source options, which should include either 'url' or 'service'.
+   * @return
+   *   The inferred schema of the STAC data source table.
+   * @throws IllegalArgumentException
+   *   If neither 'url' nor 'service' are provided.
+   */
+  override def inferSchema(opts: CaseInsensitiveStringMap): StructType = {
+    val optsMap = opts.asCaseSensitiveMap().asScala.toMap
+
+    // Check if the schema is already cached
+    val fullSchema = schemaCache.computeIfAbsent(optsMap, _ => inferStacSchema(optsMap))
+    val updatedGeometrySchema = GeoJSONUtils.updateGeometrySchema(fullSchema, GeometryUDT)
+    updatePropertiesPromotedSchema(updatedGeometrySchema)
+  }
+
+  /**
+   * Provides a table implementation for the STAC data source based on the input schema and
+   * configuration properties. This method supports loading STAC catalogs either from a local file
+   * system or from a remote HTTP/HTTPS endpoint.
+   *
+   * @param schema
+   *   The schema of the table, ignored as the schema is pre-defined.
+   * @param partitioning
+   *   Unused, but represents potential transformations (partitioning) in Spark.
+   * @param properties
+   *   A map of properties to configure the data source. Must include either "path" for local file
+   *   access or "service" for HTTP access.
+   * @return
+   *   An instance of `StacTable`, wrapping the parsed STAC catalog JSON data.
+   * @throws IllegalArgumentException
+   *   If neither "url" nor "service" are provided.
+   */
+  override def getTable(
+      schema: StructType,
+      partitioning: Array[Transform],
+      properties: util.Map[String, String]): Table = {
+    val opts = new CaseInsensitiveStringMap(properties)
+
+    val optsMap: Map[String, String] = opts.asCaseSensitiveMap().asScala.toMap ++ Map(
+      "sessionLocalTimeZone" -> SparkSession.active.sessionState.conf.sessionLocalTimeZone,
+      "columnNameOfCorruptRecord" -> SparkSession.active.sessionState.conf.columnNameOfCorruptRecord,
+      "defaultParallelism" -> SparkSession.active.sparkContext.defaultParallelism.toString,
+      "maxPartitionItemFiles" -> SparkSession.active.conf
+        .get("spark.wherobots.stac.load.maxPartitionItemFiles", "0"),
+      "numPartitions" -> SparkSession.active.conf
+        .get("spark.wherobots.stac.load.numPartitions", "-1"))
+    val stacCollectionJsonString = StacUtils.loadStacCollectionToJson(optsMap)
+
+    new StacTable(stacCollectionJson = stacCollectionJsonString, opts = optsMap)
+  }
+}
diff --git a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/io/stac/StacPartition.scala b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/io/stac/StacPartition.scala
new file mode 100644
index 0000000000..5589bd9bad
--- /dev/null
+++ b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/io/stac/StacPartition.scala
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.spark.sql.sedona_sql.io.stac
+
+import org.apache.spark.sql.connector.read.InputPartition
+
+case class StacPartition(index: Int, items: Array[String], opts: java.util.Map[String, String])
+    extends InputPartition
diff --git a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/io/stac/StacPartitionReader.scala b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/io/stac/StacPartitionReader.scala
new file mode 100644
index 0000000000..4929087db5
--- /dev/null
+++ b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/io/stac/StacPartitionReader.scala
@@ -0,0 +1,229 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.spark.sql.sedona_sql.io.stac
+
+import com.fasterxml.jackson.databind.ObjectMapper
+import org.apache.hadoop.conf.Configuration
+import org.apache.spark.sql.catalyst.InternalRow
+import org.apache.spark.sql.catalyst.json.JSONOptionsInRead
+import org.apache.spark.sql.connector.read.PartitionReader
+import org.apache.spark.sql.execution.datasource.stac.TemporalFilter
+import org.apache.spark.sql.execution.datasources.PartitionedFile
+import org.apache.spark.sql.execution.datasources.json.JsonDataSource
+import org.apache.spark.sql.execution.datasources.parquet.GeoParquetSpatialFilter
+import org.apache.spark.sql.sedona_sql.io.geojson.{GeoJSONUtils, SparkCompatUtil}
+import org.apache.spark.sql.sedona_sql.io.stac.StacUtils.{buildOutDbRasterFields, promotePropertiesToTop}
+import org.apache.spark.sql.types.{StringType, StructType}
+
+import java.io.{File, PrintWriter}
+import java.lang.reflect.Constructor
+import scala.io.Source
+
+class StacPartitionReader(
+    partition: StacPartition,
+    schema: StructType,
+    opts: Map[String, String],
+    spatialFilter: Option[GeoParquetSpatialFilter],
+    temporalFilter: Option[TemporalFilter])
+    extends PartitionReader[InternalRow] {
+
+  private val itemsIterator = partition.items.iterator
+  private var currentItem: String = _
+  private var currentFile: File = _
+  private var featureIterator: Iterator[InternalRow] = Iterator.empty
+  private val mapper = new ObjectMapper()
+
+  override def next(): Boolean = {
+    if (featureIterator.hasNext) {
+      true
+    } else if (itemsIterator.hasNext) {
+      currentItem = itemsIterator.next()
+      if (currentItem.startsWith("http://") || currentItem.startsWith("https://") || currentItem
+          .startsWith("file://")) {
+        val url = new java.net.URL(currentItem)
+
+        // Download the file to a local temp file
+        val tempFile = File.createTempFile("stac_item_", ".json")
+        val writer = new PrintWriter(tempFile)
+        try {
+          val fileContent = Source.fromURL(url).mkString
+          val rootNode = mapper.readTree(fileContent)
+          val nodeType = rootNode.get("type").asText()
+
+          nodeType match {
+            case "Feature" =>
+              // Write the content as a single line JSON
+              val content = mapper.writeValueAsString(rootNode)
+              writer.write(content)
+            case "FeatureCollection" =>
+              // Write each feature in the features array to a multi-line JSON file
+              val features = rootNode.get("features")
+              val featureIterator = features.elements()
+              while (featureIterator.hasNext) {
+                val feature = featureIterator.next()
+                val content = mapper.writeValueAsString(feature)
+                writer.write(content)
+                writer.write("\n")
+              }
+            case _ =>
+              throw new IllegalArgumentException(s"Unsupported type for item: $nodeType")
+          }
+
+        } finally {
+          writer.close()
+        }
+        checkAndDeleteTempFile(currentFile)
+        currentFile = tempFile
+      } else {
+        throw new IllegalArgumentException(s"Unsupported protocol for item: $currentItem")
+      }
+
+      // Parse the current file and extract features
+      featureIterator = if (currentFile.exists()) {
+
+        val parsedOptions = new JSONOptionsInRead(
+          opts,
+          opts.getOrElse("sessionLocalTimeZone", "UTC"),
+          opts.getOrElse("columnNameOfCorruptRecord", "_corrupt_record"))
+        val dataSource = JsonDataSource(parsedOptions)
+
+        val alteredSchema = GeoJSONUtils.updateGeometrySchema(schema, StringType)
+
+        val parser = SparkCompatUtil.constructJacksonParser(
+          alteredSchema,
+          parsedOptions,
+          allowArrayAsStructs = true)
+
+        val rows = SparkCompatUtil
+          .readFile(
+            dataSource,
+            new Configuration(),
+            createPartitionedFile(currentFile),
+            parser,
+            schema)
+
+        rows.map(row => {
+          val geometryConvertedRow = GeoJSONUtils.convertGeoJsonToGeometry(row, alteredSchema)
+          val rasterAddedRow = buildOutDbRasterFields(geometryConvertedRow, alteredSchema)
+          val propertiesPromotedRow = promotePropertiesToTop(rasterAddedRow, alteredSchema)
+          propertiesPromotedRow
+        })
+      } else {
+        Iterator.empty
+      }
+
+      next()
+    } else {
+      false
+    }
+  }
+
+  override def get(): InternalRow = {
+    featureIterator.next()
+  }
+
+  override def close(): Unit = {
+    checkAndDeleteTempFile(currentFile)
+  }
+
+  private def checkAndDeleteTempFile(file: File): Unit = {
+    // Delete the local file if it was downloaded to tmp
+    if (file != null && file.exists() && file.getAbsolutePath.startsWith(
+        System.getProperty("java.io.tmpdir"))) {
+      file.delete()
+    }
+  }
+
+  /**
+   * Create a PartitionedFile instance using reflection. The constructor parameters differ between
+   * these versions, so we need to handle both cases. For Spark 3.4 and below, the constructor has
+   * 7 parameters, while for Spark 3.5 and above, it has 8 parameters. Additionally, the type of
+   * the second parameter may be `SparkPath` in some cases, which requires special handling.
+   *
+   * @param currentFile
+   *   The file to create the PartitionedFile for.
+   * @return
+   *   The created PartitionedFile instance.
+   * @throws NoSuchMethodException
+   *   If no suitable constructor is found.
+   */
+  def createPartitionedFile(currentFile: File): PartitionedFile = {
+    val partitionedFileClass =
+      Class.forName("org.apache.spark.sql.execution.datasources.PartitionedFile")
+    val constructors = partitionedFileClass.getConstructors
+    val constructor = constructors
+      .find(_.getParameterCount == 7)
+      .getOrElse(
+        constructors
+          .find(_.getParameterCount == 8)
+          .getOrElse(
+            throw new NoSuchMethodException("No constructor with 7 or 8 parameters found")))
+
+    val params = if (constructor.getParameterCount == 7) {
+      val secondParamType = constructor.getParameterTypes()(1)
+      if (secondParamType.getName == "org.apache.spark.paths.SparkPath") {
+        Array(
+          null,
+          createSparkPath(currentFile.getPath),
+          java.lang.Long.valueOf(0L),
+          java.lang.Long.valueOf(currentFile.length()),
+          Array.empty[String],
+          java.lang.Long.valueOf(0L),
+          java.lang.Long.valueOf(0L))
+      } else {
+        Array(
+          null,
+          currentFile.getPath,
+          java.lang.Long.valueOf(0L),
+          java.lang.Long.valueOf(currentFile.length()),
+          Array.empty[String],
+          java.lang.Long.valueOf(0L),
+          java.lang.Long.valueOf(0L))
+      }
+    } else {
+      Array(
+        null,
+        createSparkPath(currentFile.getPath),
+        java.lang.Long.valueOf(0L),
+        java.lang.Long.valueOf(currentFile.length()),
+        Array.empty[String],
+        java.lang.Long.valueOf(0L),
+        java.lang.Long.valueOf(0L),
+        null)
+    }
+
+    constructor.newInstance(params: _*).asInstanceOf[PartitionedFile]
+  }
+
+  /**
+   * Create a SparkPath instance using reflection. This is needed to support both Spark 3.3 and
+   * below and Spark 3.4 and above.
+   *
+   * @param pathString
+   *   The path to create the SparkPath for.
+   * @return
+   *   The created SparkPath instance.
+   */
+  def createSparkPath(pathString: String): Object = {
+    val sparkPathClass = Class.forName("org.apache.spark.paths.SparkPath")
+    val constructor: Constructor[_] = sparkPathClass.getDeclaredConstructor(classOf[String])
+    constructor.setAccessible(true) // Make the private constructor accessible
+    constructor.newInstance(pathString).asInstanceOf[Object]
+  }
+}
diff --git a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/io/stac/StacScan.scala b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/io/stac/StacScan.scala
new file mode 100644
index 0000000000..2edf082912
--- /dev/null
+++ b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/io/stac/StacScan.scala
@@ -0,0 +1,118 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.spark.sql.sedona_sql.io.stac
+
+import org.apache.spark.sql.connector.read.{Batch, Scan}
+import org.apache.spark.sql.execution.datasource.stac.TemporalFilter
+import org.apache.spark.sql.execution.datasources.parquet.GeoParquetSpatialFilter
+import org.apache.spark.sql.internal.connector.SupportsMetadata
+import org.apache.spark.sql.sedona_sql.io.stac.StacUtils.{getFullCollectionUrl, inferStacSchema}
+import org.apache.spark.sql.types.StructType
+
+class StacScan(stacCollectionJson: String, opts: Map[String, String])
+    extends Scan
+    with SupportsMetadata {
+
+  // The spatial filter to be pushed down to the data source
+  var spatialFilter: Option[GeoParquetSpatialFilter] = None
+
+  // The temporal filter to be pushed down to the data source
+  var temporalFilter: Option[TemporalFilter] = None
+
+  /**
+   * Returns the schema of the data to be read.
+   *
+   * The schema is statically defined in the `StacTable` object.
+   */
+  override def readSchema(): StructType = {
+    val url = opts.get("path")
+    val service = opts.get("service")
+
+    if (url == null && service == null) {
+      throw new IllegalArgumentException("Either 'path' or 'service' must be provided")
+    }
+
+    inferStacSchema(opts)
+  }
+
+  /**
+   * Returns a `Batch` instance for reading the data in batch mode.
+   *
+   * The `StacBatch` class provides the implementation for the batch reading.
+   *
+   * @return
+   *   A `Batch` instance for batch-based data processing.
+   */
+  override def toBatch: Batch = {
+    val stacCollectionUrl = getFullCollectionUrl(opts)
+    StacBatch(
+      stacCollectionUrl,
+      stacCollectionJson,
+      readSchema(),
+      opts,
+      spatialFilter,
+      temporalFilter)
+  }
+
+  /**
+   * Sets the spatial predicates to be pushed down to the data source.
+   *
+   * @param combinedSpatialFilter
+   *   The combined spatial filter to be pushed down.
+   */
+  def setSpatialPredicates(combinedSpatialFilter: GeoParquetSpatialFilter) = {
+    spatialFilter = Some(combinedSpatialFilter)
+  }
+
+  /**
+   * Sets the temporal predicates to be pushed down to the data source.
+   *
+   * @param combineTemporalFilter
+   *   The combined temporal filter to be pushed down.
+   */
+  def setTemporalPredicates(combineTemporalFilter: TemporalFilter) = {
+    temporalFilter = Some(combineTemporalFilter)
+  }
+
+  /**
+   * Returns metadata about the data to be read.
+   *
+   * The metadata includes information about the pushed filters.
+   *
+   * @return
+   *   A map of metadata key-value pairs.
+   */
+  override def getMetaData(): Map[String, String] = {
+    Map(
+      "PushedSpatialFilters" -> spatialFilter.map(_.toString).getOrElse("None"),
+      "PushedTemporalFilters" -> temporalFilter.map(_.toString).getOrElse("None"))
+  }
+
+  /**
+   * Returns a description of the data to be read.
+   *
+   * The description includes the metadata information.
+   *
+   * @return
+   *   A string description of the data to be read.
+   */
+  override def description(): String = {
+    super.description() + " " + getMetaData().mkString(", ")
+  }
+}
diff --git a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/io/stac/StacScanBuilder.scala b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/io/stac/StacScanBuilder.scala
new file mode 100644
index 0000000000..ebaab87dda
--- /dev/null
+++ b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/io/stac/StacScanBuilder.scala
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.spark.sql.sedona_sql.io.stac
+
+import org.apache.spark.sql.connector.read.{Scan, ScanBuilder}
+
+/**
+ * The `StacScanBuilder` class represents the builder for creating a `Scan` instance in the
+ * SpatioTemporal Asset Catalog (STAC) data source.
+ *
+ * This class is responsible for assembling the scan operation for reading STAC data. It acts as a
+ * bridge between Spark's data source API and the specific implementation of the STAC data read
+ * operation.
+ */
+class StacScanBuilder(stacCollectionJson: String, opts: Map[String, String]) extends ScanBuilder {
+
+  /**
+   * Builds and returns a `Scan` instance. The `Scan` defines the schema and batch reading methods
+   * for STAC data.
+   *
+   * @return
+   *   A `Scan` instance that defines how to read STAC data.
+   */
+  override def build(): Scan = new StacScan(stacCollectionJson, opts)
+}
diff --git a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/io/stac/StacTable.scala b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/io/stac/StacTable.scala
new file mode 100644
index 0000000000..bd536f6de6
--- /dev/null
+++ b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/io/stac/StacTable.scala
@@ -0,0 +1,261 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.spark.sql.sedona_sql.io.stac
+
+import org.apache.spark.sql.connector.catalog.{SupportsRead, Table, TableCapability}
+import org.apache.spark.sql.connector.read.ScanBuilder
+import org.apache.spark.sql.sedona_sql.UDT.GeometryUDT
+import org.apache.spark.sql.sedona_sql.io.geojson.GeoJSONUtils
+import org.apache.spark.sql.sedona_sql.io.stac.StacUtils.{inferStacSchema, updatePropertiesPromotedSchema}
+import org.apache.spark.sql.types._
+import org.apache.spark.sql.util.CaseInsensitiveStringMap
+
+import java.util.concurrent.ConcurrentHashMap
+
+/**
+ * The `StacTable` class represents a table in the SpatioTemporal Asset Catalog (STAC) data
+ * source.
+ *
+ * This class implements the `Table` and `SupportsRead` interfaces to integrate with Apache
+ * Spark's data source API, providing support for reading data from STAC.
+ *
+ * @constructor
+ *   Creates a new instance of the `StacTable` class.
+ */
+class StacTable(stacCollectionJson: String, opts: Map[String, String])
+    extends Table
+    with SupportsRead {
+
+  // Cache to store inferred schemas
+  private val schemaCache = new ConcurrentHashMap[Map[String, String], StructType]()
+
+  /**
+   * Returns the name of the table.
+   *
+   * @return
+   *   The name of the table as a string.
+   */
+  override def name(): String = "stac"
+
+  /**
+   * Defines the schema of the STAC table.
+   *
+   * @return
+   *   The schema as a StructType.
+   */
+  override def schema(): StructType = {
+    // Check if the schema is already cached
+    val fullSchema = schemaCache.computeIfAbsent(opts, _ => inferStacSchema(opts))
+    val updatedGeometrySchema = GeoJSONUtils.updateGeometrySchema(fullSchema, GeometryUDT)
+    updatePropertiesPromotedSchema(updatedGeometrySchema)
+  }
+
+  /**
+   * Indicates the capabilities supported by the STAC table, specifically batch read.
+   *
+   * @return
+   *   A set of table capabilities.
+   */
+  override def capabilities(): java.util.Set[TableCapability] =
+    java.util.EnumSet.of(TableCapability.BATCH_READ)
+
+  /**
+   * Creates a new scan builder for reading data from the STAC table.
+   *
+   * @param options
+   *   The configuration options for the scan.
+   * @return
+   *   A new instance of ScanBuilder.
+   */
+  override def newScanBuilder(options: CaseInsensitiveStringMap): ScanBuilder =
+    new StacScanBuilder(stacCollectionJson, opts)
+}
+
+object StacTable {
+
+  /**
+   * Defines the schema of the STAC table, which supports various fields including collection
+   * information, asset details, geometries, and more. The schema is based on the STAC
+   * specification version 1.1.0.
+   */
+  val SCHEMA_V1_1_0: StructType = StructType(
+    Seq(
+      StructField("stac_version", StringType, nullable = false),
+      StructField("stac_extensions", ArrayType(StringType), nullable = true),
+      StructField("type", StringType, nullable = false),
+      StructField("id", StringType, nullable = false),
+      StructField("bbox", ArrayType(DoubleType), nullable = true),
+      StructField(
+        "geometry",
+        StructType(
+          Seq(
+            StructField("type", StringType, nullable = true),
+            StructField("coordinates", ArrayType(ArrayType(DoubleType)), nullable = true))),
+        nullable = true),
+      StructField(
+        "properties",
+        StructType(Seq(
+          StructField("title", StringType, nullable = true),
+          StructField("description", StringType, nullable = true),
+          StructField("datetime", TimestampType, nullable = true),
+          StructField("start_datetime", TimestampType, nullable = true),
+          StructField("end_datetime", TimestampType, nullable = true),
+          StructField("created", TimestampType, nullable = true),
+          StructField("updated", TimestampType, nullable = true),
+          StructField("platform", StringType, nullable = true),
+          StructField("instruments", ArrayType(StringType), nullable = true),
+          StructField("constellation", StringType, nullable = true),
+          StructField("mission", StringType, nullable = true),
+          StructField("gsd", DoubleType, nullable = true))),
+        nullable = false),
+      StructField("collection", StringType, nullable = true),
+      StructField(
+        "links",
+        ArrayType(StructType(Seq(
+          StructField("rel", StringType, nullable = true),
+          StructField("href", StringType, nullable = true),
+          StructField("type", StringType, nullable = true),
+          StructField("title", StringType, nullable = true)))),
+        nullable = false),
+      StructField(
+        "assets",
+        MapType(
+          StringType,
+          StructType(Seq(
+            StructField("href", StringType, nullable = true),
+            StructField("type", StringType, nullable = true),
+            StructField("title", StringType, nullable = true),
+            StructField("roles", ArrayType(StringType), nullable = true)))),
+        nullable = false)))
+
+  /**
+   * Defines the schema of the STAC table, which supports various fields including collection
+   * information, asset details, geometries, and more. The schema is based on the STAC
+   * specification version 1.0.0.
+   */
+  val SCHEMA_V1_0_0: StructType = StructType(
+    Seq(
+      StructField("stac_version", StringType, nullable = false),
+      StructField("stac_extensions", ArrayType(StringType), nullable = true),
+      StructField("type", StringType, nullable = false),
+      StructField("id", StringType, nullable = false),
+      StructField("bbox", ArrayType(DoubleType), nullable = true),
+      StructField(
+        "geometry",
+        StructType(
+          Seq(
+            StructField("type", StringType, nullable = true),
+            StructField("coordinates", ArrayType(ArrayType(DoubleType)), nullable = true))),
+        nullable = true),
+      StructField(
+        "properties",
+        StructType(Seq(
+          StructField("title", StringType, nullable = true),
+          StructField("description", StringType, nullable = true),
+          StructField("datetime", TimestampType, nullable = true),
+          StructField("start_datetime", TimestampType, nullable = true),
+          StructField("end_datetime", TimestampType, nullable = true),
+          StructField("created", TimestampType, nullable = true),
+          StructField("updated", TimestampType, nullable = true),
+          StructField("platform", StringType, nullable = true),
+          StructField("instruments", ArrayType(StringType), nullable = true),
+          StructField("constellation", StringType, nullable = true),
+          StructField("mission", StringType, nullable = true),
+          StructField("gsd", DoubleType, nullable = true))),
+        nullable = true),
+      StructField("collection", StringType, nullable = true),
+      StructField(
+        "links",
+        ArrayType(StructType(Seq(
+          StructField("rel", StringType, nullable = true),
+          StructField("href", StringType, nullable = true),
+          StructField("type", StringType, nullable = true),
+          StructField("title", StringType, nullable = true)))),
+        nullable = true),
+      StructField(
+        "assets",
+        MapType(
+          StringType,
+          StructType(Seq(
+            StructField("href", StringType, nullable = true),
+            StructField("type", StringType, nullable = true),
+            StructField("title", StringType, nullable = true),
+            StructField("roles", ArrayType(StringType), nullable = true)))),
+        nullable = true)))
+
+  val SCHEMA_GEOPARQUET: StructType = StructType(
+    Seq(
+      StructField("stac_version", StringType, nullable = false),
+      StructField("stac_extensions", ArrayType(StringType), nullable = true),
+      StructField("type", StringType, nullable = false),
+      StructField("id", StringType, nullable = false),
+      StructField("bbox", ArrayType(DoubleType), nullable = true),
+      StructField(
+        "geometry",
+        StructType(
+          Seq(
+            StructField("type", StringType, nullable = true),
+            StructField("coordinates", ArrayType(ArrayType(DoubleType)), nullable = true))),
+        nullable = true),
+      StructField("datetime", TimestampType, nullable = true),
+      StructField("collection", StringType, nullable = true),
+      StructField(
+        "links",
+        ArrayType(StructType(Seq(
+          StructField("rel", StringType, nullable = true),
+          StructField("href", StringType, nullable = true),
+          StructField("type", StringType, nullable = true),
+          StructField("title", StringType, nullable = true)))),
+        nullable = false)))
+
+  def addAssetStruct(schema: StructType, name: String): StructType = {
+    val assetStruct = StructType(
+      Seq(
+        StructField("href", StringType, nullable = true),
+        StructField("roles", ArrayType(StringType), nullable = true),
+        StructField("title", StringType, nullable = true),
+        StructField("type", StringType, nullable = true)))
+
+    val updatedFields = schema.fields.map {
+      case StructField("assets", existingStruct: StructType, nullable, metadata) =>
+        StructField(
+          "assets",
+          StructType(existingStruct.fields :+ StructField(name, assetStruct, nullable = true)),
+          nullable,
+          metadata)
+      case other => other
+    }
+
+    if (!schema.fieldNames.contains("assets")) {
+      StructType(
+        updatedFields :+ StructField(
+          "assets",
+          StructType(Seq(StructField(name, assetStruct, nullable = true))),
+          nullable = true))
+    } else {
+      StructType(updatedFields)
+    }
+  }
+
+  def addAssetsStruct(schema: StructType, names: Array[String]): StructType = {
+    names.foldLeft(schema) { (currentSchema, name) =>
+      addAssetStruct(currentSchema, name)
+    }
+  }
+}
diff --git a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/io/stac/StacUtils.scala b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/io/stac/StacUtils.scala
new file mode 100644
index 0000000000..4e148422bf
--- /dev/null
+++ b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/io/stac/StacUtils.scala
@@ -0,0 +1,225 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.spark.sql.sedona_sql.io.stac
+
+import com.fasterxml.jackson.databind.ObjectMapper
+import com.fasterxml.jackson.module.scala.DefaultScalaModule
+import org.apache.spark.sql.SparkSession
+import org.apache.spark.sql.catalyst.InternalRow
+import org.apache.spark.sql.catalyst.util.ArrayBasedMapData
+import org.apache.spark.sql.types.{MapType, StringType, StructField, StructType}
+
+import scala.io.Source
+
+object StacUtils {
+
+  // Function to load JSON from URL or service
+  def loadStacCollectionToJson(opts: Map[String, String]): String = {
+    val urlFull: String = getFullCollectionUrl(opts)
+
+    loadStacCollectionToJson(urlFull)
+  }
+
+  def getFullCollectionUrl(opts: Map[String, String]) = {
+    val url = opts.getOrElse(
+      "path",
+      opts.getOrElse(
+        "service",
+        throw new IllegalArgumentException("Either 'path' or 'service' must be provided")))
+    val urlFinal = if (url.matches("^[a-zA-Z][a-zA-Z0-9+.-]*://.*")) url else s"file://$url"
+    urlFinal
+  }
+
+  // Function to load JSON from URL or service
+  def loadStacCollectionToJson(url: String): String = {
+    if (url.startsWith("s3://") || url.startsWith("s3a://")) {
+      SparkSession.active.read.textFile(url).collect().mkString("\n")
+    } else {
+      Source.fromURL(url).mkString
+    }
+  }
+
+  // Function to get the base URL from the collection URL or service
+  def getStacCollectionBasePath(opts: Map[String, String]): String = {
+    val ref = opts.getOrElse(
+      "path",
+      opts.getOrElse(
+        "service",
+        throw new IllegalArgumentException("Either 'path' or 'service' must be provided")))
+    getStacCollectionBasePath(ref)
+  }
+
+  // Function to get the base URL from the collection URL or service
+  def getStacCollectionBasePath(collectionUrl: String): String = {
+    val urlPattern = "(https?://[^/]+/|http://[^/]+/).*".r
+    val filePattern = "(file:///.*/|/.*/).*".r
+
+    collectionUrl match {
+      case urlPattern(baseUrl) => baseUrl
+      case filePattern(basePath) =>
+        if (basePath.startsWith("file://")) basePath else s"file://$basePath"
+      case _ => throw new IllegalArgumentException(s"Invalid URL or file path: $collectionUrl")
+    }
+  }
+
+  /**
+   * Infer the schema of the STAC data source table.
+   *
+   * This method checks if a cached schema exists for the given data source options. If not, it
+   * processes the STAC collection and saves it as a GeoJson file. The schema is then inferred
+   * from this GeoJson file.
+   *
+   * @param opts
+   *   Mapping of data source options, which should include either 'url' or 'service'.
+   * @return
+   *   The inferred schema of the STAC data source table.
+   * @throws IllegalArgumentException
+   *   If neither 'url' nor 'service' are provided.
+   */
+  def inferStacSchema(opts: Map[String, String]): StructType = {
+    val stacCollectionJsonString = loadStacCollectionToJson(opts)
+
+    // Create the ObjectMapper
+    val mapper = new ObjectMapper()
+    mapper.registerModule(DefaultScalaModule)
+
+    // Parse the STAC collection JSON
+    val collection = mapper.readTree(stacCollectionJsonString)
+
+    // Extract the stac_version
+    val stacVersion = collection.get("stac_version").asText()
+
+    // Return the corresponding schema based on the stac_version
+    stacVersion match {
+      case "1.0.0" => StacTable.SCHEMA_V1_0_0
+      case version if version.matches("1\\.[1-9]\\d*\\.\\d*") => StacTable.SCHEMA_V1_1_0
+      // Add more cases here for other versions if needed
+      case _ => throw new IllegalArgumentException(s"Unsupported STAC version: $stacVersion")
+    }
+  }
+
+  /**
+   * Promote the properties field to the top level of the row.
+   */
+  def promotePropertiesToTop(row: InternalRow, schema: StructType): InternalRow = {
+    val propertiesIndex = schema.fieldIndex("properties")
+    val propertiesStruct = schema("properties").dataType.asInstanceOf[StructType]
+    val propertiesRow = row.getStruct(propertiesIndex, propertiesStruct.fields.length)
+
+    val newValues = schema.fields.zipWithIndex.foldLeft(Seq.empty[Any]) {
+      case (acc, (field, index)) if field.name == "properties" =>
+        acc ++ propertiesStruct.fields.zipWithIndex.map { case (propField, propIndex) =>
+          propertiesRow.get(propIndex, propField.dataType)
+        }
+      case (acc, (_, index)) =>
+        acc :+ row.get(index, schema(index).dataType)
+    }
+
+    InternalRow.fromSeq(newValues)
+  }
+
+  def updatePropertiesPromotedSchema(schema: StructType): StructType = {
+    val propertiesIndex = schema.fieldIndex("properties")
+    val propertiesStruct = schema("properties").dataType.asInstanceOf[StructType]
+
+    val newFields = schema.fields.foldLeft(Seq.empty[StructField]) {
+      case (acc, StructField("properties", _, _, _)) =>
+        acc ++ propertiesStruct.fields
+      case (acc, other) =>
+        acc :+ other
+    }
+
+    StructType(newFields)
+  }
+
+  /**
+   * Builds the output row with the raster field in the assets map.
+   *
+   * @param row
+   *   The input row.
+   * @param schema
+   *   The schema of the input row.
+   * @return
+   *   The output row with the raster field in the assets map.
+   */
+  def buildOutDbRasterFields(row: InternalRow, schema: StructType): InternalRow = {
+    val newValues = new Array[Any](schema.fields.length)
+
+    schema.fields.zipWithIndex.foreach {
+      case (StructField("assets", MapType(StringType, valueType: StructType, _), _, _), index) =>
+        val assetsMap = row.getMap(index)
+        if (assetsMap != null) {
+          val updatedAssets = assetsMap
+            .keyArray()
+            .array
+            .zip(assetsMap.valueArray().array)
+            .map { case (key, value) =>
+              val assetRow = value.asInstanceOf[InternalRow]
+              if (assetRow != null) {
+                key -> assetRow
+              } else {
+                key -> null
+              }
+            }
+            .toMap
+          newValues(index) = ArrayBasedMapData(updatedAssets)
+        } else {
+          newValues(index) = null
+        }
+      case (_, index) =>
+        newValues(index) = row.get(index, schema.fields(index).dataType)
+    }
+
+    InternalRow.fromSeq(newValues)
+  }
+
+  /**
+   * Returns the number of partitions to use for reading the data.
+   *
+   * The number of partitions is determined based on the number of items, the number of partitions
+   * requested, the maximum number of item files per partition, and the default parallelism.
+   *
+   * @param itemCount
+   *   The number of items in the collection.
+   * @param numPartitions
+   *   The number of partitions requested.
+   * @param maxPartitionItemFiles
+   *   The maximum number of item files per partition.
+   * @param defaultParallelism
+   *   The default parallelism.
+   * @return
+   *   The number of partitions to use for reading the data.
+   */
+  def getNumPartitions(
+      itemCount: Int,
+      numPartitions: Int,
+      maxPartitionItemFiles: Int,
+      defaultParallelism: Int): Int = {
+    if (numPartitions > 0) {
+      numPartitions
+    } else {
+      val maxSplitFiles = if (maxPartitionItemFiles > 0) {
+        Math.min(maxPartitionItemFiles, Math.ceil(itemCount.toDouble / defaultParallelism).toInt)
+      } else {
+        Math.ceil(itemCount.toDouble / defaultParallelism).toInt
+      }
+      Math.max(1, Math.ceil(itemCount.toDouble / maxSplitFiles).toInt)
+    }
+  }
+}
diff --git a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/optimization/SpatialFilterPushDownForGeoParquet.scala b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/optimization/SpatialFilterPushDownForGeoParquet.scala
index ba0ecf8a40..7ef96ac970 100644
--- a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/optimization/SpatialFilterPushDownForGeoParquet.scala
+++ b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/optimization/SpatialFilterPushDownForGeoParquet.scala
@@ -92,7 +92,7 @@ class SpatialFilterPushDownForGeoParquet(sparkSession: SparkSession) extends Rul
     lr.relation.isInstanceOf[HadoopFsRelation] &&
       lr.relation.asInstanceOf[HadoopFsRelation].fileFormat.isInstanceOf[GeoParquetFileFormatBase]
 
-  private def translateToGeoParquetSpatialFilters(
+  def translateToGeoParquetSpatialFilters(
       predicates: Seq[Expression]): Seq[GeoParquetSpatialFilter] = {
     val pushableColumn = PushableColumn(nestedPredicatePushdownEnabled = false)
     predicates.flatMap { predicate =>
diff --git a/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/optimization/SpatialTemporalFilterPushDownForStacScan.scala b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/optimization/SpatialTemporalFilterPushDownForStacScan.scala
new file mode 100644
index 0000000000..566d368d69
--- /dev/null
+++ b/spark/common/src/main/scala/org/apache/spark/sql/sedona_sql/optimization/SpatialTemporalFilterPushDownForStacScan.scala
@@ -0,0 +1,163 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.spark.sql.sedona_sql.optimization
+
+import org.apache.spark.sql.SparkSession
+import org.apache.spark.sql.catalyst.expressions.{And, EqualTo, Expression, GreaterThan, GreaterThanOrEqual, LessThan, LessThanOrEqual, Literal, Or, SubqueryExpression}
+import org.apache.spark.sql.catalyst.plans.logical.{Filter, LogicalPlan}
+import org.apache.spark.sql.connector.catalog.CatalogV2Implicits.parseColumnPath
+import org.apache.spark.sql.execution.datasource.stac.TemporalFilter
+import org.apache.spark.sql.execution.datasource.stac.TemporalFilter.{AndFilter => TemporalAndFilter}
+import org.apache.spark.sql.execution.datasources.parquet.GeoParquetSpatialFilter.{AndFilter => SpatialAndFilter}
+import org.apache.spark.sql.execution.datasources.v2.DataSourceV2ScanRelation
+import org.apache.spark.sql.execution.datasources.{DataSourceStrategy, PushableColumn, PushableColumnBase}
+import org.apache.spark.sql.sedona_sql.io.stac.StacScan
+import org.apache.spark.sql.sedona_sql.optimization.ExpressionUtils.splitConjunctivePredicates
+import org.apache.spark.sql.types.TimestampType
+
+import java.time.{Instant, LocalDateTime, ZoneOffset}
+
+/*
+ * This class is responsible for pushing down spatial filters to the STAC data source.
+ * It extends and reuses the `SpatialFilterPushDownForGeoParquet` class, which is responsible for pushing down
+ */
+class SpatialTemporalFilterPushDownForStacScan(sparkSession: SparkSession)
+    extends SpatialFilterPushDownForGeoParquet(sparkSession) {
+
+  /**
+   * Pushes down spatial filters to the STAC data source.
+   *
+   * @param plan
+   *   The logical plan to optimize.
+   * @return
+   *   The optimized logical plan with spatial filters pushed down to the STAC data source.
+   */
+  override def apply(plan: LogicalPlan): LogicalPlan = {
+    val enableSpatialFilterPushDown =
+      sparkSession.conf.get("spark.sedona.stac.spatialFilterPushDown", "true").toBoolean
+    if (!enableSpatialFilterPushDown) plan
+    else {
+      plan transform {
+        case filter @ Filter(condition, lr: DataSourceV2ScanRelation) if isStacScanRelation(lr) =>
+          val filters = splitConjunctivePredicates(condition)
+          val normalizedFilters = DataSourceStrategy.normalizeExprs(filters, lr.output)
+          val (_, normalizedFiltersWithoutSubquery) =
+            normalizedFilters.partition(SubqueryExpression.hasSubquery)
+          // reuse the `translateToGeoParquetSpatialFilters` method from the `SpatialFilterPushDownForGeoParquet` class
+          val spatialFilters =
+            translateToGeoParquetSpatialFilters(normalizedFiltersWithoutSubquery)
+          if (!spatialFilters.isEmpty) {
+            val combinedSpatialFilter = spatialFilters.reduce(SpatialAndFilter)
+            val scan = lr.scan.asInstanceOf[StacScan]
+            // set the spatial predicates in the STAC scan
+            scan.setSpatialPredicates(combinedSpatialFilter)
+            filter.copy()
+          }
+          val temporalFilters =
+            translateToTemporalFilters(normalizedFiltersWithoutSubquery)
+          if (!temporalFilters.isEmpty) {
+            val combinedTemporalFilter = temporalFilters.reduce(TemporalAndFilter)
+            val scan = lr.scan.asInstanceOf[StacScan]
+            // set the spatial predicates in the STAC scan
+            scan.setTemporalPredicates(combinedTemporalFilter)
+            filter.copy()
+          }
+          filter.copy()
+      }
+    }
+  }
+
+  private def isStacScanRelation(lr: DataSourceV2ScanRelation): Boolean =
+    lr.scan.isInstanceOf[StacScan]
+
+  def translateToTemporalFilters(predicates: Seq[Expression]): Seq[TemporalFilter] = {
+    val pushableColumn = PushableColumn(nestedPredicatePushdownEnabled = true)
+    predicates.flatMap { predicate =>
+      translateToTemporalFilter(predicate, pushableColumn)
+    }
+  }
+
+  private def translateToTemporalFilter(
+      predicate: Expression,
+      pushableColumn: PushableColumnBase): Option[TemporalFilter] = {
+    predicate match {
+      case And(left, right) =>
+        val temporalFilterLeft = translateToTemporalFilter(left, pushableColumn)
+        val temporalFilterRight = translateToTemporalFilter(right, pushableColumn)
+        (temporalFilterLeft, temporalFilterRight) match {
+          case (Some(l), Some(r)) => Some(TemporalFilter.AndFilter(l, r))
+          case (Some(l), None) => Some(l)
+          case (None, Some(r)) => Some(r)
+          case _ => None
+        }
+
+      case Or(left, right) =>
+        for {
+          temporalFilterLeft <- translateToTemporalFilter(left, pushableColumn)
+          temporalFilterRight <- translateToTemporalFilter(right, pushableColumn)
+        } yield TemporalFilter.OrFilter(temporalFilterLeft, temporalFilterRight)
+
+      case LessThan(pushableColumn(name), Literal(v, TimestampType)) =>
+        Some(
+          TemporalFilter
+            .LessThanFilter(
+              unquote(name),
+              LocalDateTime
+                .ofInstant(Instant.ofEpochMilli(v.asInstanceOf[Long] / 1000), ZoneOffset.UTC)))
+
+      case LessThanOrEqual(pushableColumn(name), Literal(v, TimestampType)) =>
+        Some(
+          TemporalFilter
+            .LessThanFilter(
+              unquote(name),
+              LocalDateTime
+                .ofInstant(Instant.ofEpochMilli(v.asInstanceOf[Long] / 1000), ZoneOffset.UTC)))
+
+      case GreaterThan(pushableColumn(name), Literal(v, TimestampType)) =>
+        Some(
+          TemporalFilter
+            .GreaterThanFilter(
+              unquote(name),
+              LocalDateTime
+                .ofInstant(Instant.ofEpochMilli(v.asInstanceOf[Long] / 1000), ZoneOffset.UTC)))
+
+      case GreaterThanOrEqual(pushableColumn(name), Literal(v, TimestampType)) =>
+        Some(
+          TemporalFilter
+            .GreaterThanFilter(
+              unquote(name),
+              LocalDateTime
+                .ofInstant(Instant.ofEpochMilli(v.asInstanceOf[Long] / 1000), ZoneOffset.UTC)))
+
+      case EqualTo(pushableColumn(name), Literal(v, TimestampType)) =>
+        Some(
+          TemporalFilter
+            .EqualFilter(
+              unquote(name),
+              LocalDateTime
+                .ofInstant(Instant.ofEpochMilli(v.asInstanceOf[Long] / 1000), ZoneOffset.UTC)))
+
+      case _ => None
+    }
+  }
+
+  private def unquote(name: String): String = {
+    parseColumnPath(name).mkString(".")
+  }
+}
diff --git a/spark/common/src/test/resources/datasource_stac/collection-items.json b/spark/common/src/test/resources/datasource_stac/collection-items.json
new file mode 100644
index 0000000000..fe42d2d4e2
--- /dev/null
+++ b/spark/common/src/test/resources/datasource_stac/collection-items.json
@@ -0,0 +1,7204 @@
+{
+  "type": "FeatureCollection",
+  "stac_version": "1.0.0",
+  "stac_extensions": [],
+  "context": {
+    "limit": 10,
+    "matched": 21436719,
+    "returned": 10
+  },
+  "numberMatched": 21436719,
+  "numberReturned": 10,
+  "features": [
+    {
+      "type": "Feature",
+      "stac_version": "1.0.0",
+      "id": "S2B_T28UEC_20250110T120355_L2A",
+      "properties": {
+        "created": "2025-01-10T16:22:52.618Z",
+        "platform": "sentinel-2b",
+        "constellation": "sentinel-2",
+        "instruments": [
+          "msi"
+        ],
+        "eo:cloud_cover": 26.967385,
+        "proj:epsg": 32628,
+        "proj:centroid": {
+          "lat": 52.31849,
+          "lon": -13.53342
+        },
+        "mgrs:utm_zone": 28,
+        "mgrs:latitude_band": "U",
+        "mgrs:grid_square": "EC",
+        "grid:code": "MGRS-28UEC",
+        "view:azimuth": 118.315984493439,
+        "view:incidence_angle": 3.15096590200837,
+        "view:sun_azimuth": 166.250646673544,
+        "view:sun_elevation": 15.2125487342296,
+        "s2:tile_id": "S2B_OPER_MSI_L2A_TL_2BPS_20250110T154043_A040990_T28UEC_N05.11",
+        "s2:degraded_msi_data_percentage": 0.0045,
+        "s2:nodata_pixel_percentage": 99.030858,
+        "s2:saturated_defective_pixel_percentage": 0,
+        "s2:cloud_shadow_percentage": 0,
+        "s2:vegetation_percentage": 0.000342,
+        "s2:not_vegetated_percentage": 0.000342,
+        "s2:water_percentage": 73.031932,
+        "s2:unclassified_percentage": 0,
+        "s2:medium_proba_clouds_percentage": 13.981807,
+        "s2:high_proba_clouds_percentage": 12.049599,
+        "s2:thin_cirrus_percentage": 0.935978,
+        "s2:snow_ice_percentage": 0,
+        "s2:product_type": "S2MSI2A",
+        "s2:processing_baseline": "05.11",
+        "s2:product_uri": "S2B_MSIL2A_20250110T120359_N0511_R066_T28UEC_20250110T154043.SAFE",
+        "s2:generation_time": "2025-01-10T15:40:43.000000Z",
+        "s2:datatake_id": "GS2B_20250110T120359_040990_N05.11",
+        "s2:datatake_type": "INS-NOBS",
+        "s2:datastrip_id": "S2B_OPER_MSI_L2A_DS_2BPS_20250110T154043_S20250110T120355_N05.11",
+        "s2:reflectance_conversion_factor": 1.03425891111326,
+        "datetime": "2025-01-10T12:07:02.966000Z",
+        "earthsearch:payload_id": "roda-sentinel-2-c1-l2a/workflow-sentinel-2-c1-l2a-to-stac/212b523557c5336ebe1c078fc29a2069",
+        "storage:platform": "AWS",
+        "storage:region": "us-west-2",
+        "storage:requester_pays": false,
+        "processing:software": {
+          "sentinel-2-c1-l2a-to-stac": "v2024.02.01"
+        },
+        "updated": "2025-01-10T16:22:52.618Z"
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [-13.8282447208263, 52.3446542644649],
+            [-13.7600637715014, 52.3345986073346],
+            [-13.3911071072422, 52.2712256131467],
+            [-13.3886306359678, 52.3394760649279],
+            [-13.8282447208263, 52.3446542644649]
+          ]
+        ]
+      },
+      "links": [
+        {
+          "rel": "self",
+          "type": "application/geo+json",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a/items/S2B_T28UEC_20250110T120355_L2A"
+        },
+        {
+          "rel": "canonical",
+          "href": "s3://e84-earth-search-sentinel-data/sentinel-2-c1-l2a/28/U/EC/2025/1/S2B_T28UEC_20250110T120355_L2A/S2B_T28UEC_20250110T120355_L2A.json",
+          "type": "application/json"
+        },
+        {
+          "rel": "via",
+          "href": "s3://sentinel-s2-l2a/tiles/28/U/EC/2025/1/10/0/metadata.xml",
+          "type": "application/xml",
+          "title": "Granule Metadata in Sinergize RODA Archive"
+        },
+        {
+          "rel": "parent",
+          "type": "application/json",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a"
+        },
+        {
+          "rel": "collection",
+          "type": "application/json",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a"
+        },
+        {
+          "rel": "root",
+          "type": "application/json",
+          "href": "https://earth-search.aws.element84.com/v1"
+        },
+        {
+          "rel": "thumbnail",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a/items/S2B_T28UEC_20250110T120355_L2A/thumbnail"
+        }
+      ],
+      "assets": {
+        "red": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EC/2025/1/S2B_T28UEC_20250110T120355_L2A/B04.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red - 10m",
+          "eo:bands": [
+            {
+              "name": "B04",
+              "common_name": "red",
+              "center_wavelength": 0.665,
+              "full_width_half_max": 0.038
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 499980, 0, -10, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "122032a6cbfd123d742d90e53162ae4660586361a5ef85e13429946aa77953065cf5",
+          "file:size": 2357747,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "green": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EC/2025/1/S2B_T28UEC_20250110T120355_L2A/B03.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Green - 10m",
+          "eo:bands": [
+            {
+              "name": "B03",
+              "common_name": "green",
+              "center_wavelength": 0.56,
+              "full_width_half_max": 0.045
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 499980, 0, -10, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "122033b3a77113b9fa9931115939f8c3738d00a9b73b0e499d23e21da0bef4696be7",
+          "file:size": 2371586,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "blue": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EC/2025/1/S2B_T28UEC_20250110T120355_L2A/B02.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Blue - 10m",
+          "eo:bands": [
+            {
+              "name": "B02",
+              "common_name": "blue",
+              "center_wavelength": 0.49,
+              "full_width_half_max": 0.098
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 499980, 0, -10, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220f68f82bf174b37fc0e5c195c2bb19ed0a2e7d4aa1117636eace4199f49a83845",
+          "file:size": 2396700,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "visual": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EC/2025/1/S2B_T28UEC_20250110T120355_L2A/TCI.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "True color image",
+          "eo:bands": [
+            {
+              "name": "B04",
+              "common_name": "red",
+              "center_wavelength": 0.665,
+              "full_width_half_max": 0.038
+            },
+            {
+              "name": "B03",
+              "common_name": "green",
+              "center_wavelength": 0.56,
+              "full_width_half_max": 0.045
+            },
+            {
+              "name": "B02",
+              "common_name": "blue",
+              "center_wavelength": 0.49,
+              "full_width_half_max": 0.098
+            }
+          ],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 10
+            },
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 10
+            },
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 10
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 499980, 0, -10, 5800020],
+          "file:checksum": "122083fa02d60e11ee92c40028343320794d6b341bfeb88a50b47b317226c3cd45dc",
+          "file:size": 3097977,
+          "roles": [
+            "visual"
+          ]
+        },
+        "nir": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EC/2025/1/S2B_T28UEC_20250110T120355_L2A/B08.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "NIR 1 - 10m",
+          "eo:bands": [
+            {
+              "name": "B08",
+              "common_name": "nir",
+              "center_wavelength": 0.842,
+              "full_width_half_max": 0.145
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 499980, 0, -10, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "122063993cadf2b23b6b877c29387a416c9400d2cbe94092c66dfeea6d6f3851f99c",
+          "file:size": 2368644,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "swir22": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EC/2025/1/S2B_T28UEC_20250110T120355_L2A/B12.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "SWIR 2.2μm - 20m",
+          "eo:bands": [
+            {
+              "name": "B12",
+              "common_name": "swir22",
+              "center_wavelength": 2.19,
+              "full_width_half_max": 0.242
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12208c9c4478d4bbb29ce1fd8b233fec7262d91de3535ab7623dca8821d17ce2b92c",
+          "file:size": 629724,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "rededge2": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EC/2025/1/S2B_T28UEC_20250110T120355_L2A/B06.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red Edge 2 - 20m",
+          "eo:bands": [
+            {
+              "name": "B06",
+              "common_name": "rededge",
+              "center_wavelength": 0.74,
+              "full_width_half_max": 0.018
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12202676f8075b28a063e89a9d461f31f8ac6e9a53e4c54091e218b681c8e74fa41f",
+          "file:size": 638352,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "rededge3": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EC/2025/1/S2B_T28UEC_20250110T120355_L2A/B07.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red Edge 3 - 20m",
+          "eo:bands": [
+            {
+              "name": "B07",
+              "common_name": "rededge",
+              "center_wavelength": 0.783,
+              "full_width_half_max": 0.028
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220d44985e336e4999bc99a3d0d6affd8ea0ce1cf89698fe5727a4495dd43a0664c",
+          "file:size": 639056,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "rededge1": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EC/2025/1/S2B_T28UEC_20250110T120355_L2A/B05.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red Edge 1 - 20m",
+          "eo:bands": [
+            {
+              "name": "B05",
+              "common_name": "rededge",
+              "center_wavelength": 0.704,
+              "full_width_half_max": 0.019
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220f4c994b1ae1c5c8c46d95e862e3888199f703615e01f69b86063885f00bfda19",
+          "file:size": 638484,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "swir16": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EC/2025/1/S2B_T28UEC_20250110T120355_L2A/B11.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "SWIR 1.6μm - 20m",
+          "eo:bands": [
+            {
+              "name": "B11",
+              "common_name": "swir16",
+              "center_wavelength": 1.61,
+              "full_width_half_max": 0.143
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12204553e83bb568a301ed89a19976ce706da96e62da25cd98a30bf47c788c63fdff",
+          "file:size": 626909,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "wvp": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EC/2025/1/S2B_T28UEC_20250110T120355_L2A/WVP.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Water Vapour (WVP)",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "unit": "cm",
+              "scale": 0.001,
+              "offset": 0
+            }
+          ],
+          "file:checksum": "12204701f12f0a40fbe11da4652e3c66a17355edbe9ede6d7cfb6ccbbf2db9aa95cd",
+          "file:size": 98743,
+          "roles": [
+            "data"
+          ]
+        },
+        "nir08": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EC/2025/1/S2B_T28UEC_20250110T120355_L2A/B8A.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "NIR 2 - 20m",
+          "eo:bands": [
+            {
+              "name": "B8A",
+              "common_name": "nir08",
+              "center_wavelength": 0.865,
+              "full_width_half_max": 0.033
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220bf5827bf5efdb2e488c95d707d2f3f56ac524578e6f8b7e0bbff01c2bd051cd0",
+          "file:size": 639283,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "scl": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EC/2025/1/S2B_T28UEC_20250110T120355_L2A/SCL.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Scene classification map (SCL)",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 20
+            }
+          ],
+          "file:checksum": "1220cfbbc94375ef0b9d9c2844eb52cae66a47b996aa960e104edfe170fa07d70897",
+          "file:size": 78184,
+          "roles": [
+            "data"
+          ]
+        },
+        "aot": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EC/2025/1/S2B_T28UEC_20250110T120355_L2A/AOT.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Aerosol optical thickness (AOT)",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.001,
+              "offset": 0
+            }
+          ],
+          "file:checksum": "122075bb84c0519c39937be4e010d502a7973f907792da5c78f0aa0f19e920ae871b",
+          "file:size": 99487,
+          "roles": [
+            "data"
+          ]
+        },
+        "coastal": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EC/2025/1/S2B_T28UEC_20250110T120355_L2A/B01.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Coastal - 60m",
+          "eo:bands": [
+            {
+              "name": "B01",
+              "common_name": "coastal",
+              "center_wavelength": 0.443,
+              "full_width_half_max": 0.027
+            }
+          ],
+          "gsd": 60,
+          "proj:shape": [1830, 1830],
+          "proj:transform": [60, 0, 499980, 0, -60, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 60,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12205a2e22580d4ee310b6a7ec8b72b7a75b0bfa3b4c46806a7338b3ad03ccdea04a",
+          "file:size": 82752,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "nir09": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EC/2025/1/S2B_T28UEC_20250110T120355_L2A/B09.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "NIR 3 - 60m",
+          "eo:bands": [
+            {
+              "name": "B09",
+              "common_name": "nir09",
+              "center_wavelength": 0.945,
+              "full_width_half_max": 0.026
+            }
+          ],
+          "gsd": 60,
+          "proj:shape": [1830, 1830],
+          "proj:transform": [60, 0, 499980, 0, -60, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 60,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12203b837e2b511157325bc14d889e3826661156f93ac206408d0b0e442f17cc388e",
+          "file:size": 84972,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "cloud": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EC/2025/1/S2B_T28UEC_20250110T120355_L2A/CLD_20m.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Cloud Probabilities",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 20
+            }
+          ],
+          "file:checksum": "12206f6d9989064b0614512729c79f4292df9c9355550924b42a34703756474e1cf1",
+          "file:size": 120955,
+          "roles": [
+            "data",
+            "cloud"
+          ]
+        },
+        "snow": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EC/2025/1/S2B_T28UEC_20250110T120355_L2A/SNW_20m.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Snow Probabilities",
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 20
+            }
+          ],
+          "file:checksum": "1220646fd31cc898948d16da2d3fa3672ec809f579a0181870342d5a73f19cf1db37",
+          "file:size": 53931,
+          "roles": [
+            "data",
+            "snow-ice"
+          ]
+        },
+        "preview": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EC/2025/1/S2B_T28UEC_20250110T120355_L2A/L2A_PVI.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "True color preview",
+          "eo:bands": [
+            {
+              "name": "B04",
+              "common_name": "red",
+              "center_wavelength": 0.665,
+              "full_width_half_max": 0.038
+            },
+            {
+              "name": "B03",
+              "common_name": "green",
+              "center_wavelength": 0.56,
+              "full_width_half_max": 0.045
+            },
+            {
+              "name": "B02",
+              "common_name": "blue",
+              "center_wavelength": 0.49,
+              "full_width_half_max": 0.098
+            }
+          ],
+          "file:checksum": "1220eb97564652f39ae6ab53224b027c7eb549c7de4692cd76cb0805b6c854b28839",
+          "file:size": 8059,
+          "roles": [
+            "overview"
+          ]
+        },
+        "granule_metadata": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EC/2025/1/S2B_T28UEC_20250110T120355_L2A/metadata.xml",
+          "type": "application/xml",
+          "file:checksum": "122054cadc787eb9b6700b86b7275aa389d20aa862537769fcd7bd54be08556d3d01",
+          "file:size": 257414,
+          "roles": [
+            "metadata"
+          ]
+        },
+        "tileinfo_metadata": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EC/2025/1/S2B_T28UEC_20250110T120355_L2A/tileInfo.json",
+          "type": "application/json",
+          "file:checksum": "12200096a9fdb71ede656661a29442dec78f1269d0c233f5bd8ac1a74f14f3e0e484",
+          "file:size": 1581,
+          "roles": [
+            "metadata"
+          ]
+        },
+        "product_metadata": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EC/2025/1/S2B_T28UEC_20250110T120355_L2A/product_metadata.xml",
+          "type": "application/xml",
+          "file:checksum": "1220edf7135e20824122846daebe157b450efaef6c8d92cf2c9a6300f312cd787cca",
+          "file:size": 54686,
+          "roles": [
+            "metadata"
+          ]
+        },
+        "thumbnail": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EC/2025/1/S2B_T28UEC_20250110T120355_L2A/L2A_PVI.jpg",
+          "type": "image/jpeg",
+          "title": "Thumbnail of preview image",
+          "file:checksum": "1220b306fe70acae95183a812673cf9e80ca7056bf626f21271dd471e9cda23dcf26",
+          "file:size": 3156,
+          "roles": [
+            "thumbnail"
+          ]
+        }
+      },
+      "bbox": [-13.828245, 52.271226, -13.388631, 52.344654],
+      "stac_extensions": [
+        "https://stac-extensions.github.io/eo/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/file/v2.1.0/schema.json",
+        "https://stac-extensions.github.io/grid/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/mgrs/v1.0.0/schema.json",
+        "https://stac-extensions.github.io/processing/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/projection/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/raster/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/sentinel-2/v1.0.0/schema.json",
+        "https://stac-extensions.github.io/storage/v1.0.0/schema.json",
+        "https://stac-extensions.github.io/view/v1.0.0/schema.json"
+      ],
+      "collection": "sentinel-2-c1-l2a"
+    },
+    {
+      "type": "Feature",
+      "stac_version": "1.0.0",
+      "id": "S2B_T28UFC_20250110T120355_L2A",
+      "properties": {
+        "created": "2025-01-10T16:24:04.511Z",
+        "platform": "sentinel-2b",
+        "constellation": "sentinel-2",
+        "instruments": [
+          "msi"
+        ],
+        "eo:cloud_cover": 41.692412,
+        "proj:epsg": 32628,
+        "proj:centroid": {
+          "lat": 52.21432,
+          "lon": -12.53367
+        },
+        "mgrs:utm_zone": 28,
+        "mgrs:latitude_band": "U",
+        "mgrs:grid_square": "FC",
+        "grid:code": "MGRS-28UFC",
+        "view:azimuth": 245.523494629745,
+        "view:incidence_angle": 3.70536620607632,
+        "view:sun_azimuth": 167.617359597172,
+        "view:sun_elevation": 15.4317023114617,
+        "s2:tile_id": "S2B_OPER_MSI_L2A_TL_2BPS_20250110T154043_A040990_T28UFC_N05.11",
+        "s2:degraded_msi_data_percentage": 0,
+        "s2:nodata_pixel_percentage": 81.846112,
+        "s2:saturated_defective_pixel_percentage": 0,
+        "s2:cloud_shadow_percentage": 0,
+        "s2:vegetation_percentage": 0.000018,
+        "s2:not_vegetated_percentage": 0,
+        "s2:water_percentage": 58.30757,
+        "s2:unclassified_percentage": 0,
+        "s2:medium_proba_clouds_percentage": 17.302617,
+        "s2:high_proba_clouds_percentage": 22.928596,
+        "s2:thin_cirrus_percentage": 1.4612,
+        "s2:snow_ice_percentage": 0,
+        "s2:product_type": "S2MSI2A",
+        "s2:processing_baseline": "05.11",
+        "s2:product_uri": "S2B_MSIL2A_20250110T120359_N0511_R066_T28UFC_20250110T154043.SAFE",
+        "s2:generation_time": "2025-01-10T15:40:43.000000Z",
+        "s2:datatake_id": "GS2B_20250110T120359_040990_N05.11",
+        "s2:datatake_type": "INS-NOBS",
+        "s2:datastrip_id": "S2B_OPER_MSI_L2A_DS_2BPS_20250110T154043_S20250110T120355_N05.11",
+        "s2:reflectance_conversion_factor": 1.03425891111326,
+        "datetime": "2025-01-10T12:07:01.074000Z",
+        "earthsearch:payload_id": "roda-sentinel-2-c1-l2a/workflow-sentinel-2-c1-l2a-to-stac/8e97d11f28adbcdd059cd9db6b9de885",
+        "storage:platform": "AWS",
+        "storage:region": "us-west-2",
+        "storage:requester_pays": false,
+        "processing:software": {
+          "sentinel-2-c1-l2a-to-stac": "v2024.02.01"
+        },
+        "updated": "2025-01-10T16:24:04.511Z"
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [-13.5321014711154, 52.3413459269826],
+            [-13.5336220434666, 52.2953748622493],
+            [-11.9440745611458, 51.9931444540663],
+            [-11.9222573449227, 52.3103583189958],
+            [-13.5321014711154, 52.3413459269826]
+          ]
+        ]
+      },
+      "links": [
+        {
+          "rel": "self",
+          "type": "application/geo+json",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a/items/S2B_T28UFC_20250110T120355_L2A"
+        },
+        {
+          "rel": "canonical",
+          "href": "s3://e84-earth-search-sentinel-data/sentinel-2-c1-l2a/28/U/FC/2025/1/S2B_T28UFC_20250110T120355_L2A/S2B_T28UFC_20250110T120355_L2A.json",
+          "type": "application/json"
+        },
+        {
+          "rel": "via",
+          "href": "s3://sentinel-s2-l2a/tiles/28/U/FC/2025/1/10/0/metadata.xml",
+          "type": "application/xml",
+          "title": "Granule Metadata in Sinergize RODA Archive"
+        },
+        {
+          "rel": "parent",
+          "type": "application/json",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a"
+        },
+        {
+          "rel": "collection",
+          "type": "application/json",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a"
+        },
+        {
+          "rel": "root",
+          "type": "application/json",
+          "href": "https://earth-search.aws.element84.com/v1"
+        },
+        {
+          "rel": "thumbnail",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a/items/S2B_T28UFC_20250110T120355_L2A/thumbnail"
+        }
+      ],
+      "assets": {
+        "red": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/FC/2025/1/S2B_T28UFC_20250110T120355_L2A/B04.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red - 10m",
+          "eo:bands": [
+            {
+              "name": "B04",
+              "common_name": "red",
+              "center_wavelength": 0.665,
+              "full_width_half_max": 0.038
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 600000, 0, -10, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "122035c6d5cbc12a70c69fc6525d5fca8037dff9239727a85394e2f6e31cb50e3cef",
+          "file:size": 37808553,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "green": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/FC/2025/1/S2B_T28UFC_20250110T120355_L2A/B03.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Green - 10m",
+          "eo:bands": [
+            {
+              "name": "B03",
+              "common_name": "green",
+              "center_wavelength": 0.56,
+              "full_width_half_max": 0.045
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 600000, 0, -10, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12201bc6e8ad7c6cbf3ed5ff4b3e6d2e63b98cd5940ff0484c7999003388ecdaeeeb",
+          "file:size": 38001328,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "blue": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/FC/2025/1/S2B_T28UFC_20250110T120355_L2A/B02.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Blue - 10m",
+          "eo:bands": [
+            {
+              "name": "B02",
+              "common_name": "blue",
+              "center_wavelength": 0.49,
+              "full_width_half_max": 0.098
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 600000, 0, -10, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220b3c02b381f6250bde6d1c40512fb5c248739fab60714b0ed457adfe8bc4b2129",
+          "file:size": 38281234,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "visual": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/FC/2025/1/S2B_T28UFC_20250110T120355_L2A/TCI.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "True color image",
+          "eo:bands": [
+            {
+              "name": "B04",
+              "common_name": "red",
+              "center_wavelength": 0.665,
+              "full_width_half_max": 0.038
+            },
+            {
+              "name": "B03",
+              "common_name": "green",
+              "center_wavelength": 0.56,
+              "full_width_half_max": 0.045
+            },
+            {
+              "name": "B02",
+              "common_name": "blue",
+              "center_wavelength": 0.49,
+              "full_width_half_max": 0.098
+            }
+          ],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 10
+            },
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 10
+            },
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 10
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 600000, 0, -10, 5800020],
+          "file:checksum": "12204ff1bdc12c9c16461e1e3a7e17ed3a47bbb0465a1006d2473c4eb341e4232f37",
+          "file:size": 43688315,
+          "roles": [
+            "visual"
+          ]
+        },
+        "nir": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/FC/2025/1/S2B_T28UFC_20250110T120355_L2A/B08.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "NIR 1 - 10m",
+          "eo:bands": [
+            {
+              "name": "B08",
+              "common_name": "nir",
+              "center_wavelength": 0.842,
+              "full_width_half_max": 0.145
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 600000, 0, -10, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220efaaa2b724427b0d9d2a36fde08e20abd94f0dde2c92ebc3cc54b8b818fb3fbd",
+          "file:size": 38093188,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "swir22": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/FC/2025/1/S2B_T28UFC_20250110T120355_L2A/B12.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "SWIR 2.2μm - 20m",
+          "eo:bands": [
+            {
+              "name": "B12",
+              "common_name": "swir22",
+              "center_wavelength": 2.19,
+              "full_width_half_max": 0.242
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 600000, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12208c918c9e07cde5d1a0f7582e66329ed068927ecd5f87359efe22f278a578ecb5",
+          "file:size": 10084992,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "rededge2": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/FC/2025/1/S2B_T28UFC_20250110T120355_L2A/B06.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red Edge 2 - 20m",
+          "eo:bands": [
+            {
+              "name": "B06",
+              "common_name": "rededge",
+              "center_wavelength": 0.74,
+              "full_width_half_max": 0.018
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 600000, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220d6ab4c1b664e7e40d8dbc0b589f967c807f9fdc57a26466472f528976c085874",
+          "file:size": 10346975,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "rededge3": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/FC/2025/1/S2B_T28UFC_20250110T120355_L2A/B07.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red Edge 3 - 20m",
+          "eo:bands": [
+            {
+              "name": "B07",
+              "common_name": "rededge",
+              "center_wavelength": 0.783,
+              "full_width_half_max": 0.028
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 600000, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220c8ca8579f2636deafb9de4798957c6c29d0fa9f7e27161f9e193082951c88c5a",
+          "file:size": 10344767,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "rededge1": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/FC/2025/1/S2B_T28UFC_20250110T120355_L2A/B05.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red Edge 1 - 20m",
+          "eo:bands": [
+            {
+              "name": "B05",
+              "common_name": "rededge",
+              "center_wavelength": 0.704,
+              "full_width_half_max": 0.019
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 600000, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12208ed42d02383e816d27d156887fa8ed671c2da73acc32fb622cc81ef767a5850a",
+          "file:size": 10361731,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "swir16": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/FC/2025/1/S2B_T28UFC_20250110T120355_L2A/B11.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "SWIR 1.6μm - 20m",
+          "eo:bands": [
+            {
+              "name": "B11",
+              "common_name": "swir16",
+              "center_wavelength": 1.61,
+              "full_width_half_max": 0.143
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 600000, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12200ea27f0c2a0293ca9ba18cf9065ed2a3bebe106370a083d0fd5867bbf8069346",
+          "file:size": 10076269,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "wvp": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/FC/2025/1/S2B_T28UFC_20250110T120355_L2A/WVP.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Water Vapour (WVP)",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 600000, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "unit": "cm",
+              "scale": 0.001,
+              "offset": 0
+            }
+          ],
+          "file:checksum": "1220e988a55b07c65489fb136ac2e87c754824341aa39435abf2162336def50a3463",
+          "file:size": 120608,
+          "roles": [
+            "data"
+          ]
+        },
+        "nir08": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/FC/2025/1/S2B_T28UFC_20250110T120355_L2A/B8A.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "NIR 2 - 20m",
+          "eo:bands": [
+            {
+              "name": "B8A",
+              "common_name": "nir08",
+              "center_wavelength": 0.865,
+              "full_width_half_max": 0.033
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 600000, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "122044588afb918873ed2c6a1a7fc302c6227579cec72e71c72444e51ff34089da56",
+          "file:size": 10362876,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "scl": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/FC/2025/1/S2B_T28UFC_20250110T120355_L2A/SCL.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Scene classification map (SCL)",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 600000, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 20
+            }
+          ],
+          "file:checksum": "12206ad27bd37d2e7386ba6d0c2d6b5de04cbb9ad06000cff2a8fa81ce353f0b24c4",
+          "file:size": 420519,
+          "roles": [
+            "data"
+          ]
+        },
+        "aot": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/FC/2025/1/S2B_T28UFC_20250110T120355_L2A/AOT.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Aerosol optical thickness (AOT)",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 600000, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.001,
+              "offset": 0
+            }
+          ],
+          "file:checksum": "1220db700e3012812070a263beea2838d3647844e4bd4234420280942c68b847e492",
+          "file:size": 142297,
+          "roles": [
+            "data"
+          ]
+        },
+        "coastal": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/FC/2025/1/S2B_T28UFC_20250110T120355_L2A/B01.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Coastal - 60m",
+          "eo:bands": [
+            {
+              "name": "B01",
+              "common_name": "coastal",
+              "center_wavelength": 0.443,
+              "full_width_half_max": 0.027
+            }
+          ],
+          "gsd": 60,
+          "proj:shape": [1830, 1830],
+          "proj:transform": [60, 0, 600000, 0, -60, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 60,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220758926402c8bc702c574e19a3edbdc2a9711017c13e52075afc6cfdddaf2a52e",
+          "file:size": 1206892,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "nir09": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/FC/2025/1/S2B_T28UFC_20250110T120355_L2A/B09.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "NIR 3 - 60m",
+          "eo:bands": [
+            {
+              "name": "B09",
+              "common_name": "nir09",
+              "center_wavelength": 0.945,
+              "full_width_half_max": 0.026
+            }
+          ],
+          "gsd": 60,
+          "proj:shape": [1830, 1830],
+          "proj:transform": [60, 0, 600000, 0, -60, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 60,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12202747d0e7b18642c93285c3acdd13780ba63fc3937f3ba1456ed9b857566f7181",
+          "file:size": 1261903,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "cloud": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/FC/2025/1/S2B_T28UFC_20250110T120355_L2A/CLD_20m.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Cloud Probabilities",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 600000, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 20
+            }
+          ],
+          "file:checksum": "12205d6e64c391bbe597e37aa0c9b3d5ab81d80390a2fd66ff8d36fc906069df0984",
+          "file:size": 1501376,
+          "roles": [
+            "data",
+            "cloud"
+          ]
+        },
+        "snow": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/FC/2025/1/S2B_T28UFC_20250110T120355_L2A/SNW_20m.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Snow Probabilities",
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 600000, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 20
+            }
+          ],
+          "file:checksum": "12202a673ea9c389b334d6a5bbcf6700845107fe73852bf22833c50b53642b9dd49c",
+          "file:size": 53931,
+          "roles": [
+            "data",
+            "snow-ice"
+          ]
+        },
+        "preview": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/FC/2025/1/S2B_T28UFC_20250110T120355_L2A/L2A_PVI.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "True color preview",
+          "eo:bands": [
+            {
+              "name": "B04",
+              "common_name": "red",
+              "center_wavelength": 0.665,
+              "full_width_half_max": 0.038
+            },
+            {
+              "name": "B03",
+              "common_name": "green",
+              "center_wavelength": 0.56,
+              "full_width_half_max": 0.045
+            },
+            {
+              "name": "B02",
+              "common_name": "blue",
+              "center_wavelength": 0.49,
+              "full_width_half_max": 0.098
+            }
+          ],
+          "file:checksum": "1220132208c1e4422dfdde88a04d6f52425c455bef66af0351605e2c05521d1c1b30",
+          "file:size": 57507,
+          "roles": [
+            "overview"
+          ]
+        },
+        "granule_metadata": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/FC/2025/1/S2B_T28UFC_20250110T120355_L2A/metadata.xml",
+          "type": "application/xml",
+          "file:checksum": "1220306690a016b2b6caed07114c113a9b989cb29efb92bda3e31e7ff29c51799fcd",
+          "file:size": 502351,
+          "roles": [
+            "metadata"
+          ]
+        },
+        "tileinfo_metadata": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/FC/2025/1/S2B_T28UFC_20250110T120355_L2A/tileInfo.json",
+          "type": "application/json",
+          "file:checksum": "122051ce84f2407d3a34458f82d94356c968afd65153d5e826278221962d8bbe9b3d",
+          "file:size": 1674,
+          "roles": [
+            "metadata"
+          ]
+        },
+        "product_metadata": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/FC/2025/1/S2B_T28UFC_20250110T120355_L2A/product_metadata.xml",
+          "type": "application/xml",
+          "file:checksum": "1220dce37ab88abf5d29cd31f1753966c4e7bda509523d5ce5cc5e15878cea96c75f",
+          "file:size": 55550,
+          "roles": [
+            "metadata"
+          ]
+        },
+        "thumbnail": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/FC/2025/1/S2B_T28UFC_20250110T120355_L2A/L2A_PVI.jpg",
+          "type": "image/jpeg",
+          "title": "Thumbnail of preview image",
+          "file:checksum": "122094252c5c1668db3d539b946f87167780a67844fe61f32c83baf41c53fae255c8",
+          "file:size": 11406,
+          "roles": [
+            "thumbnail"
+          ]
+        }
+      },
+      "bbox": [-13.533622, 51.993144, -11.922257, 52.341346],
+      "stac_extensions": [
+        "https://stac-extensions.github.io/eo/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/file/v2.1.0/schema.json",
+        "https://stac-extensions.github.io/grid/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/mgrs/v1.0.0/schema.json",
+        "https://stac-extensions.github.io/processing/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/projection/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/raster/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/sentinel-2/v1.0.0/schema.json",
+        "https://stac-extensions.github.io/storage/v1.0.0/schema.json",
+        "https://stac-extensions.github.io/view/v1.0.0/schema.json"
+      ],
+      "collection": "sentinel-2-c1-l2a"
+    },
+    {
+      "type": "Feature",
+      "stac_version": "1.0.0",
+      "id": "S2B_T28UDD_20250110T120355_L2A",
+      "properties": {
+        "created": "2025-01-10T16:23:17.223Z",
+        "platform": "sentinel-2b",
+        "constellation": "sentinel-2",
+        "instruments": [
+          "msi"
+        ],
+        "eo:cloud_cover": 45.573676,
+        "proj:epsg": 32628,
+        "proj:centroid": {
+          "lat": 52.78244,
+          "lon": -14.96778
+        },
+        "mgrs:utm_zone": 28,
+        "mgrs:latitude_band": "U",
+        "mgrs:grid_square": "DD",
+        "grid:code": "MGRS-28UDD",
+        "view:azimuth": 111.363270762582,
+        "view:incidence_angle": 11.2176659476937,
+        "view:sun_azimuth": 164.877643157552,
+        "view:sun_elevation": 14.1102990134553,
+        "s2:tile_id": "S2B_OPER_MSI_L2A_TL_2BPS_20250110T154043_A040990_T28UDD_N05.11",
+        "s2:degraded_msi_data_percentage": 0,
+        "s2:nodata_pixel_percentage": 91.37699,
+        "s2:saturated_defective_pixel_percentage": 0,
+        "s2:cloud_shadow_percentage": 0,
+        "s2:vegetation_percentage": 0.000846,
+        "s2:not_vegetated_percentage": 0,
+        "s2:water_percentage": 54.425478,
+        "s2:unclassified_percentage": 0,
+        "s2:medium_proba_clouds_percentage": 12.064364,
+        "s2:high_proba_clouds_percentage": 32.520658,
+        "s2:thin_cirrus_percentage": 0.988655,
+        "s2:snow_ice_percentage": 0,
+        "s2:product_type": "S2MSI2A",
+        "s2:processing_baseline": "05.11",
+        "s2:product_uri": "S2B_MSIL2A_20250110T120359_N0511_R066_T28UDD_20250110T154043.SAFE",
+        "s2:generation_time": "2025-01-10T15:40:43.000000Z",
+        "s2:datatake_id": "GS2B_20250110T120359_040990_N05.11",
+        "s2:datatake_type": "INS-NOBS",
+        "s2:datastrip_id": "S2B_OPER_MSI_L2A_DS_2BPS_20250110T154043_S20250110T120355_N05.11",
+        "s2:reflectance_conversion_factor": 1.03425891111326,
+        "datetime": "2025-01-10T12:06:59.248000Z",
+        "earthsearch:payload_id": "roda-sentinel-2-c1-l2a/workflow-sentinel-2-c1-l2a-to-stac/af0f2bf0eea44a4ea693a69087331d8e",
+        "storage:platform": "AWS",
+        "storage:region": "us-west-2",
+        "storage:requester_pays": false,
+        "processing:software": {
+          "sentinel-2-c1-l2a-to-stac": "v2024.02.01"
+        },
+        "updated": "2025-01-10T16:23:17.223Z"
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [-14.883934957153, 53.249560984131],
+            [-15.191183625645, 52.5424009271242],
+            [-14.8562491296129, 52.4966018865447],
+            [-14.8537381455861, 53.2495277635177],
+            [-14.883934957153, 53.249560984131]
+          ]
+        ]
+      },
+      "links": [
+        {
+          "rel": "self",
+          "type": "application/geo+json",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a/items/S2B_T28UDD_20250110T120355_L2A"
+        },
+        {
+          "rel": "canonical",
+          "href": "s3://e84-earth-search-sentinel-data/sentinel-2-c1-l2a/28/U/DD/2025/1/S2B_T28UDD_20250110T120355_L2A/S2B_T28UDD_20250110T120355_L2A.json",
+          "type": "application/json"
+        },
+        {
+          "rel": "via",
+          "href": "s3://sentinel-s2-l2a/tiles/28/U/DD/2025/1/10/0/metadata.xml",
+          "type": "application/xml",
+          "title": "Granule Metadata in Sinergize RODA Archive"
+        },
+        {
+          "rel": "parent",
+          "type": "application/json",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a"
+        },
+        {
+          "rel": "collection",
+          "type": "application/json",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a"
+        },
+        {
+          "rel": "root",
+          "type": "application/json",
+          "href": "https://earth-search.aws.element84.com/v1"
+        },
+        {
+          "rel": "thumbnail",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a/items/S2B_T28UDD_20250110T120355_L2A/thumbnail"
+        }
+      ],
+      "assets": {
+        "red": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/DD/2025/1/S2B_T28UDD_20250110T120355_L2A/B04.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red - 10m",
+          "eo:bands": [
+            {
+              "name": "B04",
+              "common_name": "red",
+              "center_wavelength": 0.665,
+              "full_width_half_max": 0.038
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 399960, 0, -10, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "122054a5a778414a5dcf84cedb25f35f7d742e6f7a3a90a39f9f0efb8aa73997ee3d",
+          "file:size": 17308393,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "green": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/DD/2025/1/S2B_T28UDD_20250110T120355_L2A/B03.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Green - 10m",
+          "eo:bands": [
+            {
+              "name": "B03",
+              "common_name": "green",
+              "center_wavelength": 0.56,
+              "full_width_half_max": 0.045
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 399960, 0, -10, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "122057746c62fa7de4da7c715ed1f9a32daf2a756aeffadb091cd885884fb4bbaa2d",
+          "file:size": 17453898,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "blue": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/DD/2025/1/S2B_T28UDD_20250110T120355_L2A/B02.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Blue - 10m",
+          "eo:bands": [
+            {
+              "name": "B02",
+              "common_name": "blue",
+              "center_wavelength": 0.49,
+              "full_width_half_max": 0.098
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 399960, 0, -10, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220f66c150b7d0072381550f6daf7bbd2845705d3b7459db07f4c99359e35561598",
+          "file:size": 17687244,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "visual": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/DD/2025/1/S2B_T28UDD_20250110T120355_L2A/TCI.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "True color image",
+          "eo:bands": [
+            {
+              "name": "B04",
+              "common_name": "red",
+              "center_wavelength": 0.665,
+              "full_width_half_max": 0.038
+            },
+            {
+              "name": "B03",
+              "common_name": "green",
+              "center_wavelength": 0.56,
+              "full_width_half_max": 0.045
+            },
+            {
+              "name": "B02",
+              "common_name": "blue",
+              "center_wavelength": 0.49,
+              "full_width_half_max": 0.098
+            }
+          ],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 10
+            },
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 10
+            },
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 10
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 399960, 0, -10, 5900040],
+          "file:checksum": "12201b16ef75a69922ab923ef55e87362bc0e8e12c25aa7131d1db37d20c12978c16",
+          "file:size": 17154534,
+          "roles": [
+            "visual"
+          ]
+        },
+        "nir": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/DD/2025/1/S2B_T28UDD_20250110T120355_L2A/B08.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "NIR 1 - 10m",
+          "eo:bands": [
+            {
+              "name": "B08",
+              "common_name": "nir",
+              "center_wavelength": 0.842,
+              "full_width_half_max": 0.145
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 399960, 0, -10, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220d6c16cc1335ba85c3cde38b65161d43120f6f210a29e5ac3bd29992f10db0061",
+          "file:size": 17347684,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "swir22": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/DD/2025/1/S2B_T28UDD_20250110T120355_L2A/B12.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "SWIR 2.2μm - 20m",
+          "eo:bands": [
+            {
+              "name": "B12",
+              "common_name": "swir22",
+              "center_wavelength": 2.19,
+              "full_width_half_max": 0.242
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 399960, 0, -20, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220fadc97c30a1a1471f272b5eb1b62bca1c09a010cc7bf2218a782df05f7844592",
+          "file:size": 4577358,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "rededge2": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/DD/2025/1/S2B_T28UDD_20250110T120355_L2A/B06.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red Edge 2 - 20m",
+          "eo:bands": [
+            {
+              "name": "B06",
+              "common_name": "rededge",
+              "center_wavelength": 0.74,
+              "full_width_half_max": 0.018
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 399960, 0, -20, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220a79316d379277821cc95628beee1bb62d33db354f26aa7693126d19237dfbc99",
+          "file:size": 4788245,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "rededge3": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/DD/2025/1/S2B_T28UDD_20250110T120355_L2A/B07.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red Edge 3 - 20m",
+          "eo:bands": [
+            {
+              "name": "B07",
+              "common_name": "rededge",
+              "center_wavelength": 0.783,
+              "full_width_half_max": 0.028
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 399960, 0, -20, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220cad9f61dc28368c2db5efb069e2948bdd433476a4ba1e8744035abe07910d4b7",
+          "file:size": 4801599,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "rededge1": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/DD/2025/1/S2B_T28UDD_20250110T120355_L2A/B05.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red Edge 1 - 20m",
+          "eo:bands": [
+            {
+              "name": "B05",
+              "common_name": "rededge",
+              "center_wavelength": 0.704,
+              "full_width_half_max": 0.019
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 399960, 0, -20, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220a6c66252a5437bb34de51dcee0552c8c102cbe62839037b7b509bd3d53cb6476",
+          "file:size": 4819787,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "swir16": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/DD/2025/1/S2B_T28UDD_20250110T120355_L2A/B11.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "SWIR 1.6μm - 20m",
+          "eo:bands": [
+            {
+              "name": "B11",
+              "common_name": "swir16",
+              "center_wavelength": 1.61,
+              "full_width_half_max": 0.143
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 399960, 0, -20, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12209d4fb63d60fdbb1a60cbc1e7489affee9c45556fc06cebbf01bf9c82bfd98f34",
+          "file:size": 4580867,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "wvp": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/DD/2025/1/S2B_T28UDD_20250110T120355_L2A/WVP.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Water Vapour (WVP)",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 399960, 0, -20, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "unit": "cm",
+              "scale": 0.001,
+              "offset": 0
+            }
+          ],
+          "file:checksum": "122023974cded5bb589228df181ca430c8c9873a298e40e6abeda080b716042c135c",
+          "file:size": 120033,
+          "roles": [
+            "data"
+          ]
+        },
+        "nir08": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/DD/2025/1/S2B_T28UDD_20250110T120355_L2A/B8A.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "NIR 2 - 20m",
+          "eo:bands": [
+            {
+              "name": "B8A",
+              "common_name": "nir08",
+              "center_wavelength": 0.865,
+              "full_width_half_max": 0.033
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 399960, 0, -20, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220952b926daeefadbbf02d6abb78c13adb3cb6daf998d0ce3ee3932c51fdfa3c07",
+          "file:size": 4791768,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "scl": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/DD/2025/1/S2B_T28UDD_20250110T120355_L2A/SCL.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Scene classification map (SCL)",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 399960, 0, -20, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 20
+            }
+          ],
+          "file:checksum": "1220a6ef3402bad56ffe7bcfe50f81b1ada6ce752623c3b2437896c5f7abaf52f82a",
+          "file:size": 184466,
+          "roles": [
+            "data"
+          ]
+        },
+        "aot": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/DD/2025/1/S2B_T28UDD_20250110T120355_L2A/AOT.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Aerosol optical thickness (AOT)",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 399960, 0, -20, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.001,
+              "offset": 0
+            }
+          ],
+          "file:checksum": "12204118b1e0a9d86bfe943e2af1de7e7cbfdde5bce35cd19597d3cad795906ff15a",
+          "file:size": 133584,
+          "roles": [
+            "data"
+          ]
+        },
+        "coastal": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/DD/2025/1/S2B_T28UDD_20250110T120355_L2A/B01.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Coastal - 60m",
+          "eo:bands": [
+            {
+              "name": "B01",
+              "common_name": "coastal",
+              "center_wavelength": 0.443,
+              "full_width_half_max": 0.027
+            }
+          ],
+          "gsd": 60,
+          "proj:shape": [1830, 1830],
+          "proj:transform": [60, 0, 399960, 0, -60, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 60,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220c57b36366bb26cff43ba58f29db4d2e7da27ad9793fe9fb1c37c25f1af4af5e4",
+          "file:size": 562940,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "nir09": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/DD/2025/1/S2B_T28UDD_20250110T120355_L2A/B09.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "NIR 3 - 60m",
+          "eo:bands": [
+            {
+              "name": "B09",
+              "common_name": "nir09",
+              "center_wavelength": 0.945,
+              "full_width_half_max": 0.026
+            }
+          ],
+          "gsd": 60,
+          "proj:shape": [1830, 1830],
+          "proj:transform": [60, 0, 399960, 0, -60, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 60,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220eeed3e0cebbb75aa936744142ace9c12dd6a82f5ba3acebcde9c97ddbb9f932a",
+          "file:size": 577302,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "cloud": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/DD/2025/1/S2B_T28UDD_20250110T120355_L2A/CLD_20m.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Cloud Probabilities",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 399960, 0, -20, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 20
+            }
+          ],
+          "file:checksum": "1220410f661fbe8e0a4220db2d2e14d9e8b0d148466c6e42745218e1a82561af8d60",
+          "file:size": 523213,
+          "roles": [
+            "data",
+            "cloud"
+          ]
+        },
+        "snow": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/DD/2025/1/S2B_T28UDD_20250110T120355_L2A/SNW_20m.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Snow Probabilities",
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 399960, 0, -20, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 20
+            }
+          ],
+          "file:checksum": "1220b71d1bd3c5b571cbded0862e4f4785ad1517371019d7a93177f3156c2ecebea7",
+          "file:size": 53931,
+          "roles": [
+            "data",
+            "snow-ice"
+          ]
+        },
+        "preview": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/DD/2025/1/S2B_T28UDD_20250110T120355_L2A/L2A_PVI.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "True color preview",
+          "eo:bands": [
+            {
+              "name": "B04",
+              "common_name": "red",
+              "center_wavelength": 0.665,
+              "full_width_half_max": 0.038
+            },
+            {
+              "name": "B03",
+              "common_name": "green",
+              "center_wavelength": 0.56,
+              "full_width_half_max": 0.045
+            },
+            {
+              "name": "B02",
+              "common_name": "blue",
+              "center_wavelength": 0.49,
+              "full_width_half_max": 0.098
+            }
+          ],
+          "file:checksum": "1220bfa6a79b1279b8892a2a9297157d630645b78a29e97179329fb723a4c9f47654",
+          "file:size": 25349,
+          "roles": [
+            "overview"
+          ]
+        },
+        "granule_metadata": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/DD/2025/1/S2B_T28UDD_20250110T120355_L2A/metadata.xml",
+          "type": "application/xml",
+          "file:checksum": "122011626ced3f3137673cce60b87bcf1a209ad4ac5db04feb55806e90e3ea5f5701",
+          "file:size": 105054,
+          "roles": [
+            "metadata"
+          ]
+        },
+        "tileinfo_metadata": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/DD/2025/1/S2B_T28UDD_20250110T120355_L2A/tileInfo.json",
+          "type": "application/json",
+          "file:checksum": "122083498a89e0c8f200b5222497bad130a56c06ef24ef7c3ba3e236267aa963011b",
+          "file:size": 1535,
+          "roles": [
+            "metadata"
+          ]
+        },
+        "product_metadata": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/DD/2025/1/S2B_T28UDD_20250110T120355_L2A/product_metadata.xml",
+          "type": "application/xml",
+          "file:checksum": "1220007c793944fcc6a5856a609c3d7a90a7981441c0c68bcc8e42d6da314802db15",
+          "file:size": 54651,
+          "roles": [
+            "metadata"
+          ]
+        },
+        "thumbnail": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/DD/2025/1/S2B_T28UDD_20250110T120355_L2A/L2A_PVI.jpg",
+          "type": "image/jpeg",
+          "title": "Thumbnail of preview image",
+          "file:checksum": "1220e9c0f4836898f69022ec8dc67ae68ac26e772723680385d5606261fcff8d3b9a",
+          "file:size": 5672,
+          "roles": [
+            "thumbnail"
+          ]
+        }
+      },
+      "bbox": [-15.191184, 52.496602, -14.853738, 53.249561],
+      "stac_extensions": [
+        "https://stac-extensions.github.io/eo/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/file/v2.1.0/schema.json",
+        "https://stac-extensions.github.io/grid/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/mgrs/v1.0.0/schema.json",
+        "https://stac-extensions.github.io/processing/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/projection/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/raster/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/sentinel-2/v1.0.0/schema.json",
+        "https://stac-extensions.github.io/storage/v1.0.0/schema.json",
+        "https://stac-extensions.github.io/view/v1.0.0/schema.json"
+      ],
+      "collection": "sentinel-2-c1-l2a"
+    },
+    {
+      "type": "Feature",
+      "stac_version": "1.0.0",
+      "id": "S2B_T28UGC_20250110T120355_L2A",
+      "properties": {
+        "created": "2025-01-10T16:24:15.582Z",
+        "platform": "sentinel-2b",
+        "constellation": "sentinel-2",
+        "instruments": [
+          "msi"
+        ],
+        "eo:cloud_cover": 70.551813,
+        "proj:epsg": 32628,
+        "proj:centroid": {
+          "lat": 52.10021,
+          "lon": -11.44977
+        },
+        "mgrs:utm_zone": 28,
+        "mgrs:latitude_band": "U",
+        "mgrs:grid_square": "GC",
+        "grid:code": "MGRS-28UGC",
+        "view:azimuth": 288.991145822068,
+        "view:incidence_angle": 8.88645376535856,
+        "view:sun_azimuth": 168.984702494377,
+        "view:sun_elevation": 15.6474414959517,
+        "s2:tile_id": "S2B_OPER_MSI_L2A_TL_2BPS_20250110T154043_A040990_T28UGC_N05.11",
+        "s2:degraded_msi_data_percentage": 0.0257,
+        "s2:nodata_pixel_percentage": 70.794016,
+        "s2:saturated_defective_pixel_percentage": 0,
+        "s2:cloud_shadow_percentage": 0,
+        "s2:vegetation_percentage": 0.000011,
+        "s2:not_vegetated_percentage": 0.000125,
+        "s2:water_percentage": 29.44805,
+        "s2:unclassified_percentage": 0,
+        "s2:medium_proba_clouds_percentage": 19.48228,
+        "s2:high_proba_clouds_percentage": 50.357151,
+        "s2:thin_cirrus_percentage": 0.712383,
+        "s2:snow_ice_percentage": 0,
+        "s2:product_type": "S2MSI2A",
+        "s2:processing_baseline": "05.11",
+        "s2:product_uri": "S2B_MSIL2A_20250110T120359_N0511_R066_T28UGC_20250110T154043.SAFE",
+        "s2:generation_time": "2025-01-10T15:40:43.000000Z",
+        "s2:datatake_id": "GS2B_20250110T120359_040990_N05.11",
+        "s2:datatake_type": "INS-NOBS",
+        "s2:datastrip_id": "S2B_OPER_MSI_L2A_DS_2BPS_20250110T154043_S20250110T120355_N05.11",
+        "s2:reflectance_conversion_factor": 1.03425891111326,
+        "datetime": "2025-01-10T12:06:59.032000Z",
+        "earthsearch:payload_id": "roda-sentinel-2-c1-l2a/workflow-sentinel-2-c1-l2a-to-stac/b262a7540f8c30c340c7c4d8c2b08a7b",
+        "storage:platform": "AWS",
+        "storage:region": "us-west-2",
+        "storage:requester_pays": false,
+        "processing:software": {
+          "sentinel-2-c1-l2a-to-stac": "v2024.02.01"
+        },
+        "updated": "2025-01-10T16:24:15.582Z"
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [-12.0663701781865, 52.3140284614992],
+            [-12.0854674480038, 52.0229565808749],
+            [-11.0571384840821, 51.7940576782695],
+            [-10.8034742021281, 52.2758584353317],
+            [-12.0663701781865, 52.3140284614992]
+          ]
+        ]
+      },
+      "links": [
+        {
+          "rel": "self",
+          "type": "application/geo+json",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a/items/S2B_T28UGC_20250110T120355_L2A"
+        },
+        {
+          "rel": "canonical",
+          "href": "s3://e84-earth-search-sentinel-data/sentinel-2-c1-l2a/28/U/GC/2025/1/S2B_T28UGC_20250110T120355_L2A/S2B_T28UGC_20250110T120355_L2A.json",
+          "type": "application/json"
+        },
+        {
+          "rel": "via",
+          "href": "s3://sentinel-s2-l2a/tiles/28/U/GC/2025/1/10/0/metadata.xml",
+          "type": "application/xml",
+          "title": "Granule Metadata in Sinergize RODA Archive"
+        },
+        {
+          "rel": "parent",
+          "type": "application/json",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a"
+        },
+        {
+          "rel": "collection",
+          "type": "application/json",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a"
+        },
+        {
+          "rel": "root",
+          "type": "application/json",
+          "href": "https://earth-search.aws.element84.com/v1"
+        },
+        {
+          "rel": "thumbnail",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a/items/S2B_T28UGC_20250110T120355_L2A/thumbnail"
+        }
+      ],
+      "assets": {
+        "red": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/GC/2025/1/S2B_T28UGC_20250110T120355_L2A/B04.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red - 10m",
+          "eo:bands": [
+            {
+              "name": "B04",
+              "common_name": "red",
+              "center_wavelength": 0.665,
+              "full_width_half_max": 0.038
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 699960, 0, -10, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12201cd9c10ddd829fac7b1648dd387ad4fbb1bca16f50c5e3c4fefe23407a9c4011",
+          "file:size": 58207551,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "green": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/GC/2025/1/S2B_T28UGC_20250110T120355_L2A/B03.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Green - 10m",
+          "eo:bands": [
+            {
+              "name": "B03",
+              "common_name": "green",
+              "center_wavelength": 0.56,
+              "full_width_half_max": 0.045
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 699960, 0, -10, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220451b51412527a211547b7f1fb65618ab70152c0b5876a28710d82c7afb07228e",
+          "file:size": 58118240,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "blue": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/GC/2025/1/S2B_T28UGC_20250110T120355_L2A/B02.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Blue - 10m",
+          "eo:bands": [
+            {
+              "name": "B02",
+              "common_name": "blue",
+              "center_wavelength": 0.49,
+              "full_width_half_max": 0.098
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 699960, 0, -10, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "122029c3cfa284c85df6ebfaa6b0225ca33c147c2666175b9faab17d726468c25684",
+          "file:size": 58042746,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "visual": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/GC/2025/1/S2B_T28UGC_20250110T120355_L2A/TCI.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "True color image",
+          "eo:bands": [
+            {
+              "name": "B04",
+              "common_name": "red",
+              "center_wavelength": 0.665,
+              "full_width_half_max": 0.038
+            },
+            {
+              "name": "B03",
+              "common_name": "green",
+              "center_wavelength": 0.56,
+              "full_width_half_max": 0.045
+            },
+            {
+              "name": "B02",
+              "common_name": "blue",
+              "center_wavelength": 0.49,
+              "full_width_half_max": 0.098
+            }
+          ],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 10
+            },
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 10
+            },
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 10
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 699960, 0, -10, 5800020],
+          "file:checksum": "1220569a22ecc77cb50b68399d0587f0d4b6d7912694d646593166e712e03088fe8a",
+          "file:size": 42064723,
+          "roles": [
+            "visual"
+          ]
+        },
+        "nir": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/GC/2025/1/S2B_T28UGC_20250110T120355_L2A/B08.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "NIR 1 - 10m",
+          "eo:bands": [
+            {
+              "name": "B08",
+              "common_name": "nir",
+              "center_wavelength": 0.842,
+              "full_width_half_max": 0.145
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 699960, 0, -10, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "122086b8c7c05c080220c58c7837aa5cb177148c998ed3e20bcbc82b5f4483c08de2",
+          "file:size": 58822385,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "swir22": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/GC/2025/1/S2B_T28UGC_20250110T120355_L2A/B12.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "SWIR 2.2μm - 20m",
+          "eo:bands": [
+            {
+              "name": "B12",
+              "common_name": "swir22",
+              "center_wavelength": 2.19,
+              "full_width_half_max": 0.242
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 699960, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220923638898bfc9c9f7146c955a4a57585779d374044ba21a7158e9810629894c4",
+          "file:size": 16095523,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "rededge2": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/GC/2025/1/S2B_T28UGC_20250110T120355_L2A/B06.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red Edge 2 - 20m",
+          "eo:bands": [
+            {
+              "name": "B06",
+              "common_name": "rededge",
+              "center_wavelength": 0.74,
+              "full_width_half_max": 0.018
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 699960, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12200d043c3f0dcbee9be9b5e6c1bc5885ecaebb32730b97758c7a058f824b30ae00",
+          "file:size": 17051737,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "rededge3": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/GC/2025/1/S2B_T28UGC_20250110T120355_L2A/B07.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red Edge 3 - 20m",
+          "eo:bands": [
+            {
+              "name": "B07",
+              "common_name": "rededge",
+              "center_wavelength": 0.783,
+              "full_width_half_max": 0.028
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 699960, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12201496c6d8c6a667ce1068dcb750ce1ac590966a54524102be8fcfa41c1c97b95d",
+          "file:size": 17021702,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "rededge1": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/GC/2025/1/S2B_T28UGC_20250110T120355_L2A/B05.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red Edge 1 - 20m",
+          "eo:bands": [
+            {
+              "name": "B05",
+              "common_name": "rededge",
+              "center_wavelength": 0.704,
+              "full_width_half_max": 0.019
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 699960, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220943299479e9fc7167e046c58922a0cd43468693b4e14a8086ebba2643c7501a1",
+          "file:size": 17061778,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "swir16": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/GC/2025/1/S2B_T28UGC_20250110T120355_L2A/B11.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "SWIR 1.6μm - 20m",
+          "eo:bands": [
+            {
+              "name": "B11",
+              "common_name": "swir16",
+              "center_wavelength": 1.61,
+              "full_width_half_max": 0.143
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 699960, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220fa82c7aa49224096f09453a532e579f12fb83c7b57eb5efb3e01d7f86d87309f",
+          "file:size": 16432588,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "wvp": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/GC/2025/1/S2B_T28UGC_20250110T120355_L2A/WVP.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Water Vapour (WVP)",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 699960, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "unit": "cm",
+              "scale": 0.001,
+              "offset": 0
+            }
+          ],
+          "file:checksum": "1220819c7233d673f986b8d77c116ec375ed68ac1f9d11665a3edfe513c73d26805e",
+          "file:size": 133428,
+          "roles": [
+            "data"
+          ]
+        },
+        "nir08": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/GC/2025/1/S2B_T28UGC_20250110T120355_L2A/B8A.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "NIR 2 - 20m",
+          "eo:bands": [
+            {
+              "name": "B8A",
+              "common_name": "nir08",
+              "center_wavelength": 0.865,
+              "full_width_half_max": 0.033
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 699960, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "122008817be7d0e498c3ca35dc04ec5299db2f686150c71ac4e4d6c2219896656f68",
+          "file:size": 17052752,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "scl": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/GC/2025/1/S2B_T28UGC_20250110T120355_L2A/SCL.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Scene classification map (SCL)",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 699960, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 20
+            }
+          ],
+          "file:checksum": "12201be991eef66b3ee9fb9993040702d74dc890ee3bc5f13767c779dfbbe49f3004",
+          "file:size": 645587,
+          "roles": [
+            "data"
+          ]
+        },
+        "aot": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/GC/2025/1/S2B_T28UGC_20250110T120355_L2A/AOT.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Aerosol optical thickness (AOT)",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 699960, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.001,
+              "offset": 0
+            }
+          ],
+          "file:checksum": "1220633bfaa1c34b320443dbb216a3479c1e75b634b9785145005de6cf6130d864b9",
+          "file:size": 201548,
+          "roles": [
+            "data"
+          ]
+        },
+        "coastal": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/GC/2025/1/S2B_T28UGC_20250110T120355_L2A/B01.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Coastal - 60m",
+          "eo:bands": [
+            {
+              "name": "B01",
+              "common_name": "coastal",
+              "center_wavelength": 0.443,
+              "full_width_half_max": 0.027
+            }
+          ],
+          "gsd": 60,
+          "proj:shape": [1830, 1830],
+          "proj:transform": [60, 0, 699960, 0, -60, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 60,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12207141b1f48d8faf012d0acb1beebbf23b5c3df7c4b9a167d8d73ef7d15ebff353",
+          "file:size": 2012692,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "nir09": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/GC/2025/1/S2B_T28UGC_20250110T120355_L2A/B09.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "NIR 3 - 60m",
+          "eo:bands": [
+            {
+              "name": "B09",
+              "common_name": "nir09",
+              "center_wavelength": 0.945,
+              "full_width_half_max": 0.026
+            }
+          ],
+          "gsd": 60,
+          "proj:shape": [1830, 1830],
+          "proj:transform": [60, 0, 699960, 0, -60, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 60,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12202e70675c4b9ab5a47692cd176acea1f68e5d1c435edda8e5c97c66bb775ddb0d",
+          "file:size": 2032167,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "cloud": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/GC/2025/1/S2B_T28UGC_20250110T120355_L2A/CLD_20m.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Cloud Probabilities",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 699960, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 20
+            }
+          ],
+          "file:checksum": "1220f14c816e5e28cba274f817a6a1a078ca93a33b79f8c6b5d2805f13f302df01a6",
+          "file:size": 2676520,
+          "roles": [
+            "data",
+            "cloud"
+          ]
+        },
+        "snow": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/GC/2025/1/S2B_T28UGC_20250110T120355_L2A/SNW_20m.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Snow Probabilities",
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 699960, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 20
+            }
+          ],
+          "file:checksum": "122074b684a20156d8958e2cc54b9b3740f5217f825466c66d10e8df379e946e5a96",
+          "file:size": 53931,
+          "roles": [
+            "data",
+            "snow-ice"
+          ]
+        },
+        "preview": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/GC/2025/1/S2B_T28UGC_20250110T120355_L2A/L2A_PVI.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "True color preview",
+          "eo:bands": [
+            {
+              "name": "B04",
+              "common_name": "red",
+              "center_wavelength": 0.665,
+              "full_width_half_max": 0.038
+            },
+            {
+              "name": "B03",
+              "common_name": "green",
+              "center_wavelength": 0.56,
+              "full_width_half_max": 0.045
+            },
+            {
+              "name": "B02",
+              "common_name": "blue",
+              "center_wavelength": 0.49,
+              "full_width_half_max": 0.098
+            }
+          ],
+          "file:checksum": "1220f1f49f585c5c9d162e3fde0c6524393af24d0f98bd94008bf153e0d1f0d84545",
+          "file:size": 66287,
+          "roles": [
+            "overview"
+          ]
+        },
+        "granule_metadata": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/GC/2025/1/S2B_T28UGC_20250110T120355_L2A/metadata.xml",
+          "type": "application/xml",
+          "file:checksum": "1220cd75a8a624f29c0f31c90df9f791b916a3e495ea7c087b579e2e09770559a655",
+          "file:size": 351063,
+          "roles": [
+            "metadata"
+          ]
+        },
+        "tileinfo_metadata": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/GC/2025/1/S2B_T28UGC_20250110T120355_L2A/tileInfo.json",
+          "type": "application/json",
+          "file:checksum": "1220d1c9a251b350d7c950c3be70977893a5b2c10c2e124fb0b66093ed644cab670e",
+          "file:size": 1607,
+          "roles": [
+            "metadata"
+          ]
+        },
+        "product_metadata": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/GC/2025/1/S2B_T28UGC_20250110T120355_L2A/product_metadata.xml",
+          "type": "application/xml",
+          "file:checksum": "12208208152cf7b8ff0461a8f98b958c6b601c8d7e2b0daf2a6da54fcee0188d250d",
+          "file:size": 55288,
+          "roles": [
+            "metadata"
+          ]
+        },
+        "thumbnail": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/GC/2025/1/S2B_T28UGC_20250110T120355_L2A/L2A_PVI.jpg",
+          "type": "image/jpeg",
+          "title": "Thumbnail of preview image",
+          "file:checksum": "12204514017e6fc351907beb978f8bf0d1e782b2f3f48280443825827d0e5218ff1f",
+          "file:size": 13689,
+          "roles": [
+            "thumbnail"
+          ]
+        }
+      },
+      "bbox": [-12.085467, 51.794058, -10.803474, 52.314028],
+      "stac_extensions": [
+        "https://stac-extensions.github.io/eo/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/file/v2.1.0/schema.json",
+        "https://stac-extensions.github.io/grid/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/mgrs/v1.0.0/schema.json",
+        "https://stac-extensions.github.io/processing/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/projection/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/raster/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/sentinel-2/v1.0.0/schema.json",
+        "https://stac-extensions.github.io/storage/v1.0.0/schema.json",
+        "https://stac-extensions.github.io/view/v1.0.0/schema.json"
+      ],
+      "collection": "sentinel-2-c1-l2a"
+    },
+    {
+      "type": "Feature",
+      "stac_version": "1.0.0",
+      "id": "S2B_T29ULT_20250110T120355_L2A",
+      "properties": {
+        "created": "2025-01-10T16:24:35.264Z",
+        "platform": "sentinel-2b",
+        "constellation": "sentinel-2",
+        "instruments": [
+          "msi"
+        ],
+        "eo:cloud_cover": 76.681787,
+        "proj:epsg": 32629,
+        "proj:centroid": {
+          "lat": 52.11257,
+          "lon": -11.37077
+        },
+        "mgrs:utm_zone": 29,
+        "mgrs:latitude_band": "U",
+        "mgrs:grid_square": "LT",
+        "grid:code": "MGRS-29ULT",
+        "view:azimuth": 289.739549819918,
+        "view:incidence_angle": 9.25309699449269,
+        "view:sun_azimuth": 169.170970252047,
+        "view:sun_elevation": 15.6313798177967,
+        "s2:tile_id": "S2B_OPER_MSI_L2A_TL_2BPS_20250110T154043_A040990_T29ULT_N05.11",
+        "s2:degraded_msi_data_percentage": 0.0281,
+        "s2:nodata_pixel_percentage": 71.433568,
+        "s2:saturated_defective_pixel_percentage": 0,
+        "s2:cloud_shadow_percentage": 0,
+        "s2:vegetation_percentage": 0.000012,
+        "s2:not_vegetated_percentage": 0.000186,
+        "s2:water_percentage": 23.318014,
+        "s2:unclassified_percentage": 0,
+        "s2:medium_proba_clouds_percentage": 35.262308,
+        "s2:high_proba_clouds_percentage": 41.088226,
+        "s2:thin_cirrus_percentage": 0.331256,
+        "s2:snow_ice_percentage": 0,
+        "s2:product_type": "S2MSI2A",
+        "s2:processing_baseline": "05.11",
+        "s2:product_uri": "S2B_MSIL2A_20250110T120359_N0511_R066_T29ULT_20250110T154043.SAFE",
+        "s2:generation_time": "2025-01-10T15:40:43.000000Z",
+        "s2:datatake_id": "GS2B_20250110T120359_040990_N05.11",
+        "s2:datatake_type": "INS-NOBS",
+        "s2:datastrip_id": "S2B_OPER_MSI_L2A_DS_2BPS_20250110T154043_S20250110T120355_N05.11",
+        "s2:reflectance_conversion_factor": 1.03425891111326,
+        "datetime": "2025-01-10T12:06:58.560000Z",
+        "earthsearch:payload_id": "roda-sentinel-2-c1-l2a/workflow-sentinel-2-c1-l2a-to-stac/cc5f14a543c20f0fbb2d8a793a17b244",
+        "storage:platform": "AWS",
+        "storage:region": "us-west-2",
+        "storage:requester_pays": false,
+        "processing:software": {
+          "sentinel-2-c1-l2a-to-stac": "v2024.02.01"
+        },
+        "updated": "2025-01-10T16:24:35.264Z"
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [-11.9341865273641, 52.3140146232143],
+            [-11.9127080253672, 51.9863614962068],
+            [-11.0571957464118, 51.7939912466001],
+            [-10.7711148716862, 52.3371889236931],
+            [-11.9341865273641, 52.3140146232143]
+          ]
+        ]
+      },
+      "links": [
+        {
+          "rel": "self",
+          "type": "application/geo+json",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a/items/S2B_T29ULT_20250110T120355_L2A"
+        },
+        {
+          "rel": "canonical",
+          "href": "s3://e84-earth-search-sentinel-data/sentinel-2-c1-l2a/29/U/LT/2025/1/S2B_T29ULT_20250110T120355_L2A/S2B_T29ULT_20250110T120355_L2A.json",
+          "type": "application/json"
+        },
+        {
+          "rel": "via",
+          "href": "s3://sentinel-s2-l2a/tiles/29/U/LT/2025/1/10/0/metadata.xml",
+          "type": "application/xml",
+          "title": "Granule Metadata in Sinergize RODA Archive"
+        },
+        {
+          "rel": "parent",
+          "type": "application/json",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a"
+        },
+        {
+          "rel": "collection",
+          "type": "application/json",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a"
+        },
+        {
+          "rel": "root",
+          "type": "application/json",
+          "href": "https://earth-search.aws.element84.com/v1"
+        },
+        {
+          "rel": "thumbnail",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a/items/S2B_T29ULT_20250110T120355_L2A/thumbnail"
+        }
+      ],
+      "assets": {
+        "red": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/LT/2025/1/S2B_T29ULT_20250110T120355_L2A/B04.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red - 10m",
+          "eo:bands": [
+            {
+              "name": "B04",
+              "common_name": "red",
+              "center_wavelength": 0.665,
+              "full_width_half_max": 0.038
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 300000, 0, -10, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12203e227546657330900c61d6557c4750c3262eb5eeb70edd161878f0db44cd933f",
+          "file:size": 56941462,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "green": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/LT/2025/1/S2B_T29ULT_20250110T120355_L2A/B03.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Green - 10m",
+          "eo:bands": [
+            {
+              "name": "B03",
+              "common_name": "green",
+              "center_wavelength": 0.56,
+              "full_width_half_max": 0.045
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 300000, 0, -10, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "122025246795e56b26d4f7d9fc31b995680db8d55ba9ad507ebc922be4509769f6c9",
+          "file:size": 56786069,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "blue": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/LT/2025/1/S2B_T29ULT_20250110T120355_L2A/B02.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Blue - 10m",
+          "eo:bands": [
+            {
+              "name": "B02",
+              "common_name": "blue",
+              "center_wavelength": 0.49,
+              "full_width_half_max": 0.098
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 300000, 0, -10, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "122039d4d6a228946d25de5f8480487f6c492398ed7d8a2c991648d04d3cd85a9935",
+          "file:size": 56623575,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "visual": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/LT/2025/1/S2B_T29ULT_20250110T120355_L2A/TCI.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "True color image",
+          "eo:bands": [
+            {
+              "name": "B04",
+              "common_name": "red",
+              "center_wavelength": 0.665,
+              "full_width_half_max": 0.038
+            },
+            {
+              "name": "B03",
+              "common_name": "green",
+              "center_wavelength": 0.56,
+              "full_width_half_max": 0.045
+            },
+            {
+              "name": "B02",
+              "common_name": "blue",
+              "center_wavelength": 0.49,
+              "full_width_half_max": 0.098
+            }
+          ],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 10
+            },
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 10
+            },
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 10
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 300000, 0, -10, 5800020],
+          "file:checksum": "122010e77d3a354175a4f00e427377412b14cb594c0ef55f2744eee10062fc94494d",
+          "file:size": 36438161,
+          "roles": [
+            "visual"
+          ]
+        },
+        "nir": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/LT/2025/1/S2B_T29ULT_20250110T120355_L2A/B08.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "NIR 1 - 10m",
+          "eo:bands": [
+            {
+              "name": "B08",
+              "common_name": "nir",
+              "center_wavelength": 0.842,
+              "full_width_half_max": 0.145
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 300000, 0, -10, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12203493df70a2489aae8e8c51256ab1b149136d0399aeff8bb521944d0a373ffb8e",
+          "file:size": 57557157,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "swir22": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/LT/2025/1/S2B_T29ULT_20250110T120355_L2A/B12.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "SWIR 2.2μm - 20m",
+          "eo:bands": [
+            {
+              "name": "B12",
+              "common_name": "swir22",
+              "center_wavelength": 2.19,
+              "full_width_half_max": 0.242
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 300000, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12207a1e16f696777c391dc53358b0a0892061539000855005f8cffb5ef1a00659c4",
+          "file:size": 15781560,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "rededge2": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/LT/2025/1/S2B_T29ULT_20250110T120355_L2A/B06.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red Edge 2 - 20m",
+          "eo:bands": [
+            {
+              "name": "B06",
+              "common_name": "rededge",
+              "center_wavelength": 0.74,
+              "full_width_half_max": 0.018
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 300000, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12203277ff67ac82a6260dd05378d0880c66af3280495382175f61b0b152cb72e671",
+          "file:size": 16820810,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "rededge3": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/LT/2025/1/S2B_T29ULT_20250110T120355_L2A/B07.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red Edge 3 - 20m",
+          "eo:bands": [
+            {
+              "name": "B07",
+              "common_name": "rededge",
+              "center_wavelength": 0.783,
+              "full_width_half_max": 0.028
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 300000, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220ce612d9136bc91eb41bc1ac94486ce6c46c6fd80f6a3c2370bb165b54e22d264",
+          "file:size": 16799086,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "rededge1": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/LT/2025/1/S2B_T29ULT_20250110T120355_L2A/B05.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red Edge 1 - 20m",
+          "eo:bands": [
+            {
+              "name": "B05",
+              "common_name": "rededge",
+              "center_wavelength": 0.704,
+              "full_width_half_max": 0.019
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 300000, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220f90ef2d43a3d5a38ccfa2dc7bbcebef1241ee73f8cd34f016f9fd1dd4195050c",
+          "file:size": 16823874,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "swir16": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/LT/2025/1/S2B_T29ULT_20250110T120355_L2A/B11.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "SWIR 1.6μm - 20m",
+          "eo:bands": [
+            {
+              "name": "B11",
+              "common_name": "swir16",
+              "center_wavelength": 1.61,
+              "full_width_half_max": 0.143
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 300000, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12206eaa8e87752b95598c4ad90eaead667c44881553ded86b19479eda4aa18b47fc",
+          "file:size": 16192304,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "wvp": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/LT/2025/1/S2B_T29ULT_20250110T120355_L2A/WVP.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Water Vapour (WVP)",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 300000, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "unit": "cm",
+              "scale": 0.001,
+              "offset": 0
+            }
+          ],
+          "file:checksum": "1220549c7f1f9556aa87f2e9e2306077af27a4871edd6f23a7b7483a945def3a3eb9",
+          "file:size": 134178,
+          "roles": [
+            "data"
+          ]
+        },
+        "nir08": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/LT/2025/1/S2B_T29ULT_20250110T120355_L2A/B8A.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "NIR 2 - 20m",
+          "eo:bands": [
+            {
+              "name": "B8A",
+              "common_name": "nir08",
+              "center_wavelength": 0.865,
+              "full_width_half_max": 0.033
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 300000, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12207d766a2efd3de74d5956711abca5765dd5734ca28672459eb4deb45421228eb7",
+          "file:size": 16836512,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "scl": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/LT/2025/1/S2B_T29ULT_20250110T120355_L2A/SCL.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Scene classification map (SCL)",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 300000, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 20
+            }
+          ],
+          "file:checksum": "1220cef0ac90be0d43aa4a3a7f4e32f86304227b58c4e1d6f12398f02ede7d0f1916",
+          "file:size": 661235,
+          "roles": [
+            "data"
+          ]
+        },
+        "aot": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/LT/2025/1/S2B_T29ULT_20250110T120355_L2A/AOT.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Aerosol optical thickness (AOT)",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 300000, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.001,
+              "offset": 0
+            }
+          ],
+          "file:checksum": "12206d45dd57516e4491befa01b0fdc88fb8b4ac6672e9b61e302b6f8f42bc5979de",
+          "file:size": 198595,
+          "roles": [
+            "data"
+          ]
+        },
+        "coastal": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/LT/2025/1/S2B_T29ULT_20250110T120355_L2A/B01.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Coastal - 60m",
+          "eo:bands": [
+            {
+              "name": "B01",
+              "common_name": "coastal",
+              "center_wavelength": 0.443,
+              "full_width_half_max": 0.027
+            }
+          ],
+          "gsd": 60,
+          "proj:shape": [1830, 1830],
+          "proj:transform": [60, 0, 300000, 0, -60, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 60,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220ddc842e5e2933d01235e0bb88ea63c867ce228316a0c5277f7cbf6f1b3221769",
+          "file:size": 1991573,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "nir09": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/LT/2025/1/S2B_T29ULT_20250110T120355_L2A/B09.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "NIR 3 - 60m",
+          "eo:bands": [
+            {
+              "name": "B09",
+              "common_name": "nir09",
+              "center_wavelength": 0.945,
+              "full_width_half_max": 0.026
+            }
+          ],
+          "gsd": 60,
+          "proj:shape": [1830, 1830],
+          "proj:transform": [60, 0, 300000, 0, -60, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 60,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220225bec7e6941aba12271c19bbe8d9c5c14ea3fc71262b2d4b75880c53ac1ee39",
+          "file:size": 2016382,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "cloud": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/LT/2025/1/S2B_T29ULT_20250110T120355_L2A/CLD_20m.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Cloud Probabilities",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 300000, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 20
+            }
+          ],
+          "file:checksum": "1220a755be67c7393e95e506909fdcfd568f6d43a6fa42cbccfc5232584d02d1eaa4",
+          "file:size": 2162795,
+          "roles": [
+            "data",
+            "cloud"
+          ]
+        },
+        "snow": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/LT/2025/1/S2B_T29ULT_20250110T120355_L2A/SNW_20m.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Snow Probabilities",
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 300000, 0, -20, 5800020],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 20
+            }
+          ],
+          "file:checksum": "122099280d6b49f45f813f5c9a54c08d31cae51069d59d9558d551878d41e7dab826",
+          "file:size": 370705,
+          "roles": [
+            "data",
+            "snow-ice"
+          ]
+        },
+        "preview": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/LT/2025/1/S2B_T29ULT_20250110T120355_L2A/L2A_PVI.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "True color preview",
+          "eo:bands": [
+            {
+              "name": "B04",
+              "common_name": "red",
+              "center_wavelength": 0.665,
+              "full_width_half_max": 0.038
+            },
+            {
+              "name": "B03",
+              "common_name": "green",
+              "center_wavelength": 0.56,
+              "full_width_half_max": 0.045
+            },
+            {
+              "name": "B02",
+              "common_name": "blue",
+              "center_wavelength": 0.49,
+              "full_width_half_max": 0.098
+            }
+          ],
+          "file:checksum": "12204c088e206ddaf24ab7fcba7afb6b533fab045b82c4272f76aa21f56f3c4af391",
+          "file:size": 60549,
+          "roles": [
+            "overview"
+          ]
+        },
+        "granule_metadata": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/LT/2025/1/S2B_T29ULT_20250110T120355_L2A/metadata.xml",
+          "type": "application/xml",
+          "file:checksum": "12201c67cbc583f92626907c855af5e64967e8c9137a7c1c633f260c38900e5b8f6e",
+          "file:size": 350629,
+          "roles": [
+            "metadata"
+          ]
+        },
+        "tileinfo_metadata": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/LT/2025/1/S2B_T29ULT_20250110T120355_L2A/tileInfo.json",
+          "type": "application/json",
+          "file:checksum": "12205a7be274328fa33fbbb3aa6c6c482371a65b51770862aaafe3c67fcc4860ab32",
+          "file:size": 1568,
+          "roles": [
+            "metadata"
+          ]
+        },
+        "product_metadata": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/LT/2025/1/S2B_T29ULT_20250110T120355_L2A/product_metadata.xml",
+          "type": "application/xml",
+          "file:checksum": "1220d52627f80e6fe4575c7128c6971309760e7f6097a1c1965ffb298cc4bebefb83",
+          "file:size": 55102,
+          "roles": [
+            "metadata"
+          ]
+        },
+        "thumbnail": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/LT/2025/1/S2B_T29ULT_20250110T120355_L2A/L2A_PVI.jpg",
+          "type": "image/jpeg",
+          "title": "Thumbnail of preview image",
+          "file:checksum": "1220360fbeaa6ce13b08877966ad223cdaf36a8bae092899879eba5da47e1dcf3523",
+          "file:size": 13517,
+          "roles": [
+            "thumbnail"
+          ]
+        }
+      },
+      "bbox": [-11.934187, 51.793991, -10.771115, 52.337189],
+      "stac_extensions": [
+        "https://stac-extensions.github.io/eo/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/file/v2.1.0/schema.json",
+        "https://stac-extensions.github.io/grid/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/mgrs/v1.0.0/schema.json",
+        "https://stac-extensions.github.io/processing/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/projection/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/raster/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/sentinel-2/v1.0.0/schema.json",
+        "https://stac-extensions.github.io/storage/v1.0.0/schema.json",
+        "https://stac-extensions.github.io/view/v1.0.0/schema.json"
+      ],
+      "collection": "sentinel-2-c1-l2a"
+    },
+    {
+      "type": "Feature",
+      "stac_version": "1.0.0",
+      "id": "S2B_T29UMU_20250110T120355_L2A",
+      "properties": {
+        "created": "2025-01-10T16:22:10.669Z",
+        "platform": "sentinel-2b",
+        "constellation": "sentinel-2",
+        "instruments": [
+          "msi"
+        ],
+        "eo:cloud_cover": 99.851912,
+        "proj:epsg": 32629,
+        "proj:centroid": {
+          "lat": 53.11473,
+          "lon": -10.41947
+        },
+        "mgrs:utm_zone": 29,
+        "mgrs:latitude_band": "U",
+        "mgrs:grid_square": "MU",
+        "grid:code": "MGRS-29UMU",
+        "view:azimuth": 295.133344244557,
+        "view:incidence_angle": 11.4258216022895,
+        "view:sun_azimuth": 170.514168318609,
+        "view:sun_elevation": 14.876218695379,
+        "s2:tile_id": "S2B_OPER_MSI_L2A_TL_2BPS_20250110T154043_A040990_T29UMU_N05.11",
+        "s2:degraded_msi_data_percentage": 0,
+        "s2:nodata_pixel_percentage": 97.318125,
+        "s2:saturated_defective_pixel_percentage": 0,
+        "s2:cloud_shadow_percentage": 0,
+        "s2:vegetation_percentage": 0,
+        "s2:not_vegetated_percentage": 0.001979,
+        "s2:water_percentage": 0.146106,
+        "s2:unclassified_percentage": 0,
+        "s2:medium_proba_clouds_percentage": 9.566632,
+        "s2:high_proba_clouds_percentage": 90.11963,
+        "s2:thin_cirrus_percentage": 0.165652,
+        "s2:snow_ice_percentage": 0,
+        "s2:product_type": "S2MSI2A",
+        "s2:processing_baseline": "05.11",
+        "s2:product_uri": "S2B_MSIL2A_20250110T120359_N0511_R066_T29UMU_20250110T154043.SAFE",
+        "s2:generation_time": "2025-01-10T15:40:43.000000Z",
+        "s2:datatake_id": "GS2B_20250110T120359_040990_N05.11",
+        "s2:datatake_type": "INS-NOBS",
+        "s2:datastrip_id": "S2B_OPER_MSI_L2A_DS_2BPS_20250110T154043_S20250110T120355_N05.11",
+        "s2:reflectance_conversion_factor": 1.03425891111326,
+        "datetime": "2025-01-10T12:06:38.977000Z",
+        "earthsearch:payload_id": "roda-sentinel-2-c1-l2a/workflow-sentinel-2-c1-l2a-to-stac/d7d4c025f2d4f3b3e51a14d9d98f1575",
+        "storage:platform": "AWS",
+        "storage:region": "us-west-2",
+        "storage:requester_pays": false,
+        "processing:software": {
+          "sentinel-2-c1-l2a-to-stac": "v2024.02.01"
+        },
+        "updated": "2025-01-10T16:22:10.669Z"
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [-10.4990442948644, 53.2401920169908],
+            [-10.4859475114454, 52.8611868644894],
+            [-10.2734217675276, 53.242816076468],
+            [-10.4990442948644, 53.2401920169908]
+          ]
+        ]
+      },
+      "links": [
+        {
+          "rel": "self",
+          "type": "application/geo+json",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a/items/S2B_T29UMU_20250110T120355_L2A"
+        },
+        {
+          "rel": "canonical",
+          "href": "s3://e84-earth-search-sentinel-data/sentinel-2-c1-l2a/29/U/MU/2025/1/S2B_T29UMU_20250110T120355_L2A/S2B_T29UMU_20250110T120355_L2A.json",
+          "type": "application/json"
+        },
+        {
+          "rel": "via",
+          "href": "s3://sentinel-s2-l2a/tiles/29/U/MU/2025/1/10/0/metadata.xml",
+          "type": "application/xml",
+          "title": "Granule Metadata in Sinergize RODA Archive"
+        },
+        {
+          "rel": "parent",
+          "type": "application/json",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a"
+        },
+        {
+          "rel": "collection",
+          "type": "application/json",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a"
+        },
+        {
+          "rel": "root",
+          "type": "application/json",
+          "href": "https://earth-search.aws.element84.com/v1"
+        },
+        {
+          "rel": "thumbnail",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a/items/S2B_T29UMU_20250110T120355_L2A/thumbnail"
+        }
+      ],
+      "assets": {
+        "red": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/MU/2025/1/S2B_T29UMU_20250110T120355_L2A/B04.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red - 10m",
+          "eo:bands": [
+            {
+              "name": "B04",
+              "common_name": "red",
+              "center_wavelength": 0.665,
+              "full_width_half_max": 0.038
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 399960, 0, -10, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220d309c47c8b7acb6ae4c1e17ec394013535cc1013c9c9735d1f83e257272bb3aa",
+          "file:size": 5111486,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "green": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/MU/2025/1/S2B_T29UMU_20250110T120355_L2A/B03.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Green - 10m",
+          "eo:bands": [
+            {
+              "name": "B03",
+              "common_name": "green",
+              "center_wavelength": 0.56,
+              "full_width_half_max": 0.045
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 399960, 0, -10, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12207891e5d0515df9add88bbe4bd1fe100fbcaf720e34972134abc213b78c02b076",
+          "file:size": 5100143,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "blue": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/MU/2025/1/S2B_T29UMU_20250110T120355_L2A/B02.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Blue - 10m",
+          "eo:bands": [
+            {
+              "name": "B02",
+              "common_name": "blue",
+              "center_wavelength": 0.49,
+              "full_width_half_max": 0.098
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 399960, 0, -10, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12202be80f386072c1c9af35f23f2dad5abb0ea0670c275a50bee9fa47a65a97437b",
+          "file:size": 5092633,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "visual": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/MU/2025/1/S2B_T29UMU_20250110T120355_L2A/TCI.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "True color image",
+          "eo:bands": [
+            {
+              "name": "B04",
+              "common_name": "red",
+              "center_wavelength": 0.665,
+              "full_width_half_max": 0.038
+            },
+            {
+              "name": "B03",
+              "common_name": "green",
+              "center_wavelength": 0.56,
+              "full_width_half_max": 0.045
+            },
+            {
+              "name": "B02",
+              "common_name": "blue",
+              "center_wavelength": 0.49,
+              "full_width_half_max": 0.098
+            }
+          ],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 10
+            },
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 10
+            },
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 10
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 399960, 0, -10, 5900040],
+          "file:checksum": "1220101e3fd7208a1cb7deec2cb6d8d27db55beeefe9e348787feb9cf0d8ddc67da8",
+          "file:size": 562065,
+          "roles": [
+            "visual"
+          ]
+        },
+        "nir": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/MU/2025/1/S2B_T29UMU_20250110T120355_L2A/B08.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "NIR 1 - 10m",
+          "eo:bands": [
+            {
+              "name": "B08",
+              "common_name": "nir",
+              "center_wavelength": 0.842,
+              "full_width_half_max": 0.145
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 399960, 0, -10, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "122012b1bd512d34f36373af0856da95c7f8a4bd87e3608736484c5244e4159d3012",
+          "file:size": 5187449,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "swir22": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/MU/2025/1/S2B_T29UMU_20250110T120355_L2A/B12.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "SWIR 2.2μm - 20m",
+          "eo:bands": [
+            {
+              "name": "B12",
+              "common_name": "swir22",
+              "center_wavelength": 2.19,
+              "full_width_half_max": 0.242
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 399960, 0, -20, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12208f7d6fe1f69da7d1e94610dece34be45ea32a49e47577c644090eaf0bcb22611",
+          "file:size": 1596928,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "rededge2": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/MU/2025/1/S2B_T29UMU_20250110T120355_L2A/B06.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red Edge 2 - 20m",
+          "eo:bands": [
+            {
+              "name": "B06",
+              "common_name": "rededge",
+              "center_wavelength": 0.74,
+              "full_width_half_max": 0.018
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 399960, 0, -20, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220ca6df763e9ae2c033cb78bdcea27ad9d8885ff4bede1413576bb66ff28de366b",
+          "file:size": 1669812,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "rededge3": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/MU/2025/1/S2B_T29UMU_20250110T120355_L2A/B07.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red Edge 3 - 20m",
+          "eo:bands": [
+            {
+              "name": "B07",
+              "common_name": "rededge",
+              "center_wavelength": 0.783,
+              "full_width_half_max": 0.028
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 399960, 0, -20, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "122050956255cbee8d0801242c316be3c8dca2018b9be3c555a49df3919a991396c4",
+          "file:size": 1666645,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "rededge1": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/MU/2025/1/S2B_T29UMU_20250110T120355_L2A/B05.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red Edge 1 - 20m",
+          "eo:bands": [
+            {
+              "name": "B05",
+              "common_name": "rededge",
+              "center_wavelength": 0.704,
+              "full_width_half_max": 0.019
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 399960, 0, -20, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220a29376f79d03afef311addd6ae68b447fec13192e4c96dc19cb6875bf47abc43",
+          "file:size": 1670391,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "swir16": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/MU/2025/1/S2B_T29UMU_20250110T120355_L2A/B11.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "SWIR 1.6μm - 20m",
+          "eo:bands": [
+            {
+              "name": "B11",
+              "common_name": "swir16",
+              "center_wavelength": 1.61,
+              "full_width_half_max": 0.143
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 399960, 0, -20, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220792a6aa646da0a6da7185b9571185672519b6c5619d0184c2c7f33a512cf58fd",
+          "file:size": 1619071,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "wvp": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/MU/2025/1/S2B_T29UMU_20250110T120355_L2A/WVP.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Water Vapour (WVP)",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 399960, 0, -20, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "unit": "cm",
+              "scale": 0.001,
+              "offset": 0
+            }
+          ],
+          "file:checksum": "122096a7ec83f826c2d64ddfffdf0de254ab329380fe27a62a5316684905d3d2fb57",
+          "file:size": 105171,
+          "roles": [
+            "data"
+          ]
+        },
+        "nir08": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/MU/2025/1/S2B_T29UMU_20250110T120355_L2A/B8A.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "NIR 2 - 20m",
+          "eo:bands": [
+            {
+              "name": "B8A",
+              "common_name": "nir08",
+              "center_wavelength": 0.865,
+              "full_width_half_max": 0.033
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 399960, 0, -20, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12200d824dc3b6cc3b2a25a1f4418439599f9855bf56a45e0743366b5bf79fe6e430",
+          "file:size": 1673352,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "scl": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/MU/2025/1/S2B_T29UMU_20250110T120355_L2A/SCL.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Scene classification map (SCL)",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 399960, 0, -20, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 20
+            }
+          ],
+          "file:checksum": "1220b1b8d5243264af9a9a6c20e3c60bbc1cf405376b735d78cf80aa23b526237b68",
+          "file:size": 81560,
+          "roles": [
+            "data"
+          ]
+        },
+        "aot": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/MU/2025/1/S2B_T29UMU_20250110T120355_L2A/AOT.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Aerosol optical thickness (AOT)",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 399960, 0, -20, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.001,
+              "offset": 0
+            }
+          ],
+          "file:checksum": "12204f80ce4edb419f177e533dba4ac913145de59cc8e384be1455217e2fed4e25e0",
+          "file:size": 113778,
+          "roles": [
+            "data"
+          ]
+        },
+        "coastal": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/MU/2025/1/S2B_T29UMU_20250110T120355_L2A/B01.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Coastal - 60m",
+          "eo:bands": [
+            {
+              "name": "B01",
+              "common_name": "coastal",
+              "center_wavelength": 0.443,
+              "full_width_half_max": 0.027
+            }
+          ],
+          "gsd": 60,
+          "proj:shape": [1830, 1830],
+          "proj:transform": [60, 0, 399960, 0, -60, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 60,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220708a0c79160b88446637eeeee0bb16b66b7553f6472b29b65275dd5c0944ff14",
+          "file:size": 204521,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "nir09": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/MU/2025/1/S2B_T29UMU_20250110T120355_L2A/B09.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "NIR 3 - 60m",
+          "eo:bands": [
+            {
+              "name": "B09",
+              "common_name": "nir09",
+              "center_wavelength": 0.945,
+              "full_width_half_max": 0.026
+            }
+          ],
+          "gsd": 60,
+          "proj:shape": [1830, 1830],
+          "proj:transform": [60, 0, 399960, 0, -60, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 60,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12209c228a60e2ae567cfe920c25213db4ea1d78a90de769f0e8dc1f1d946db2538a",
+          "file:size": 212847,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "cloud": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/MU/2025/1/S2B_T29UMU_20250110T120355_L2A/CLD_20m.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Cloud Probabilities",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 399960, 0, -20, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 20
+            }
+          ],
+          "file:checksum": "1220a3f9f026bd5025f82f3adf0f6c2b419771977a89dd84da2726802de5492beb6f",
+          "file:size": 90369,
+          "roles": [
+            "data",
+            "cloud"
+          ]
+        },
+        "snow": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/MU/2025/1/S2B_T29UMU_20250110T120355_L2A/SNW_20m.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Snow Probabilities",
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 399960, 0, -20, 5900040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 20
+            }
+          ],
+          "file:checksum": "1220a94513ceac58211fe15df962a282ba81af3b7a6c86448fdd158af7e5a72571d7",
+          "file:size": 77916,
+          "roles": [
+            "data",
+            "snow-ice"
+          ]
+        },
+        "preview": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/MU/2025/1/S2B_T29UMU_20250110T120355_L2A/L2A_PVI.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "True color preview",
+          "eo:bands": [
+            {
+              "name": "B04",
+              "common_name": "red",
+              "center_wavelength": 0.665,
+              "full_width_half_max": 0.038
+            },
+            {
+              "name": "B03",
+              "common_name": "green",
+              "center_wavelength": 0.56,
+              "full_width_half_max": 0.045
+            },
+            {
+              "name": "B02",
+              "common_name": "blue",
+              "center_wavelength": 0.49,
+              "full_width_half_max": 0.098
+            }
+          ],
+          "file:checksum": "1220a918fb0a9713c7662bea5d722e61ea704c8f72df11172c45b6faa37709bf0ba7",
+          "file:size": 5132,
+          "roles": [
+            "overview"
+          ]
+        },
+        "granule_metadata": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/MU/2025/1/S2B_T29UMU_20250110T120355_L2A/metadata.xml",
+          "type": "application/xml",
+          "file:checksum": "1220688e99c289650d08535e4526f0b30b9f827f967e201a550181d5ba95cbd06706",
+          "file:size": 101884,
+          "roles": [
+            "metadata"
+          ]
+        },
+        "tileinfo_metadata": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/MU/2025/1/S2B_T29UMU_20250110T120355_L2A/tileInfo.json",
+          "type": "application/json",
+          "file:checksum": "12209891f3af981af6621dedc4fb99d9b1e69346d48bb303bd5dd0d3c3c38798b74d",
+          "file:size": 1482,
+          "roles": [
+            "metadata"
+          ]
+        },
+        "product_metadata": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/MU/2025/1/S2B_T29UMU_20250110T120355_L2A/product_metadata.xml",
+          "type": "application/xml",
+          "file:checksum": "1220b390185e418500d3d7c46dfd44f6f490cb6771c5c2b11c8ddd909345efa0b488",
+          "file:size": 54497,
+          "roles": [
+            "metadata"
+          ]
+        },
+        "thumbnail": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/MU/2025/1/S2B_T29UMU_20250110T120355_L2A/L2A_PVI.jpg",
+          "type": "image/jpeg",
+          "title": "Thumbnail of preview image",
+          "file:checksum": "1220ad716bb6e2c9c8aeec0e64984b21d504b7fcad9c6fb68ee4c7fbd1e86a76ca48",
+          "file:size": 3202,
+          "roles": [
+            "thumbnail"
+          ]
+        }
+      },
+      "bbox": [-10.499044, 52.861187, -10.273422, 53.242816],
+      "stac_extensions": [
+        "https://stac-extensions.github.io/eo/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/file/v2.1.0/schema.json",
+        "https://stac-extensions.github.io/grid/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/mgrs/v1.0.0/schema.json",
+        "https://stac-extensions.github.io/processing/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/projection/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/raster/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/sentinel-2/v1.0.0/schema.json",
+        "https://stac-extensions.github.io/storage/v1.0.0/schema.json",
+        "https://stac-extensions.github.io/view/v1.0.0/schema.json"
+      ],
+      "collection": "sentinel-2-c1-l2a"
+    },
+    {
+      "type": "Feature",
+      "stac_version": "1.0.0",
+      "id": "S2B_T28UEG_20250110T120355_L2A",
+      "properties": {
+        "created": "2025-01-10T16:24:42.505Z",
+        "platform": "sentinel-2b",
+        "constellation": "sentinel-2",
+        "instruments": [
+          "msi"
+        ],
+        "eo:cloud_cover": 100,
+        "proj:epsg": 32628,
+        "proj:centroid": {
+          "lat": 55.38441,
+          "lon": -13.58014
+        },
+        "mgrs:utm_zone": 28,
+        "mgrs:latitude_band": "U",
+        "mgrs:grid_square": "EG",
+        "grid:code": "MGRS-28UEG",
+        "view:azimuth": 107.206073425202,
+        "view:incidence_angle": 10.2725275481198,
+        "view:sun_azimuth": 166.291906822544,
+        "view:sun_elevation": 11.6956433007712,
+        "s2:tile_id": "S2B_OPER_MSI_L2A_TL_2BPS_20250110T154043_A040990_T28UEG_N05.11",
+        "s2:degraded_msi_data_percentage": 0,
+        "s2:nodata_pixel_percentage": 65.152574,
+        "s2:saturated_defective_pixel_percentage": 0,
+        "s2:cloud_shadow_percentage": 0,
+        "s2:vegetation_percentage": 0,
+        "s2:not_vegetated_percentage": 0,
+        "s2:water_percentage": 0,
+        "s2:unclassified_percentage": 0,
+        "s2:medium_proba_clouds_percentage": 1.233756,
+        "s2:high_proba_clouds_percentage": 98.766243,
+        "s2:thin_cirrus_percentage": 0,
+        "s2:snow_ice_percentage": 0,
+        "s2:product_type": "S2MSI2A",
+        "s2:processing_baseline": "05.11",
+        "s2:product_uri": "S2B_MSIL2A_20250110T120359_N0511_R066_T28UEG_20250110T154043.SAFE",
+        "s2:generation_time": "2025-01-10T15:40:43.000000Z",
+        "s2:datatake_id": "GS2B_20250110T120359_040990_N05.11",
+        "s2:datatake_type": "INS-NOBS",
+        "s2:datastrip_id": "S2B_OPER_MSI_L2A_DS_2BPS_20250110T154043_S20250110T120355_N05.11",
+        "s2:reflectance_conversion_factor": 1.03425891111326,
+        "datetime": "2025-01-10T12:06:13.388000Z",
+        "earthsearch:payload_id": "roda-sentinel-2-c1-l2a/workflow-sentinel-2-c1-l2a-to-stac/3f433637e07c4b2600b19a2e7741e644",
+        "storage:platform": "AWS",
+        "storage:region": "us-west-2",
+        "storage:requester_pays": false,
+        "processing:software": {
+          "sentinel-2-c1-l2a-to-stac": "v2024.02.01"
+        },
+        "updated": "2025-01-10T16:24:42.505Z"
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [-13.6265322920318, 55.9380706206949],
+            [-14.1026482225707, 54.9557969721861],
+            [-13.2860297382675, 54.9470270219076],
+            [-13.2427407104991, 55.933193717984],
+            [-13.6265322920318, 55.9380706206949]
+          ]
+        ]
+      },
+      "links": [
+        {
+          "rel": "self",
+          "type": "application/geo+json",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a/items/S2B_T28UEG_20250110T120355_L2A"
+        },
+        {
+          "rel": "canonical",
+          "href": "s3://e84-earth-search-sentinel-data/sentinel-2-c1-l2a/28/U/EG/2025/1/S2B_T28UEG_20250110T120355_L2A/S2B_T28UEG_20250110T120355_L2A.json",
+          "type": "application/json"
+        },
+        {
+          "rel": "via",
+          "href": "s3://sentinel-s2-l2a/tiles/28/U/EG/2025/1/10/0/metadata.xml",
+          "type": "application/xml",
+          "title": "Granule Metadata in Sinergize RODA Archive"
+        },
+        {
+          "rel": "parent",
+          "type": "application/json",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a"
+        },
+        {
+          "rel": "collection",
+          "type": "application/json",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a"
+        },
+        {
+          "rel": "root",
+          "type": "application/json",
+          "href": "https://earth-search.aws.element84.com/v1"
+        },
+        {
+          "rel": "thumbnail",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a/items/S2B_T28UEG_20250110T120355_L2A/thumbnail"
+        }
+      ],
+      "assets": {
+        "red": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EG/2025/1/S2B_T28UEG_20250110T120355_L2A/B04.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red - 10m",
+          "eo:bands": [
+            {
+              "name": "B04",
+              "common_name": "red",
+              "center_wavelength": 0.665,
+              "full_width_half_max": 0.038
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 499980, 0, -10, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220b9d353ff3c5b32a6a6b9d7373a4a23e53977ca4a2a53c331a33f42db253bf1d9",
+          "file:size": 60381704,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "green": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EG/2025/1/S2B_T28UEG_20250110T120355_L2A/B03.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Green - 10m",
+          "eo:bands": [
+            {
+              "name": "B03",
+              "common_name": "green",
+              "center_wavelength": 0.56,
+              "full_width_half_max": 0.045
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 499980, 0, -10, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "122069bc8ca3f9e02a5d9cc9ccfaa346b82fbc43d49b5733ef8c0c442cd7c1029e95",
+          "file:size": 60566679,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "blue": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EG/2025/1/S2B_T28UEG_20250110T120355_L2A/B02.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Blue - 10m",
+          "eo:bands": [
+            {
+              "name": "B02",
+              "common_name": "blue",
+              "center_wavelength": 0.49,
+              "full_width_half_max": 0.098
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 499980, 0, -10, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220e79da24993985cbba76d10c1921e9e623c42efbe0dfeef64e64541abec1cabc3",
+          "file:size": 61289399,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "visual": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EG/2025/1/S2B_T28UEG_20250110T120355_L2A/TCI.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "True color image",
+          "eo:bands": [
+            {
+              "name": "B04",
+              "common_name": "red",
+              "center_wavelength": 0.665,
+              "full_width_half_max": 0.038
+            },
+            {
+              "name": "B03",
+              "common_name": "green",
+              "center_wavelength": 0.56,
+              "full_width_half_max": 0.045
+            },
+            {
+              "name": "B02",
+              "common_name": "blue",
+              "center_wavelength": 0.49,
+              "full_width_half_max": 0.098
+            }
+          ],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 10
+            },
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 10
+            },
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 10
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 499980, 0, -10, 6200040],
+          "file:checksum": "122088b33cf108ade9b4c26653c73e36729cd15ac949ded66e021c33e23c027e5c0a",
+          "file:size": 2404937,
+          "roles": [
+            "visual"
+          ]
+        },
+        "nir": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EG/2025/1/S2B_T28UEG_20250110T120355_L2A/B08.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "NIR 1 - 10m",
+          "eo:bands": [
+            {
+              "name": "B08",
+              "common_name": "nir",
+              "center_wavelength": 0.842,
+              "full_width_half_max": 0.145
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 499980, 0, -10, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220669b38f781482a19c416b172d75902376262b840cd11d4f2c0485c0483264f1a",
+          "file:size": 61404018,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "swir22": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EG/2025/1/S2B_T28UEG_20250110T120355_L2A/B12.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "SWIR 2.2μm - 20m",
+          "eo:bands": [
+            {
+              "name": "B12",
+              "common_name": "swir22",
+              "center_wavelength": 2.19,
+              "full_width_half_max": 0.242
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "122007f0ada73a0dfc1ea5c01b7cef273f3a621e567ff8cac3d230b0f9b98dc7d377",
+          "file:size": 17601586,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "rededge2": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EG/2025/1/S2B_T28UEG_20250110T120355_L2A/B06.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red Edge 2 - 20m",
+          "eo:bands": [
+            {
+              "name": "B06",
+              "common_name": "rededge",
+              "center_wavelength": 0.74,
+              "full_width_half_max": 0.018
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12200d4476aa9543d440f22ef65eb48baaf15d0246f02061e48ef2bf58b0802ef7ca",
+          "file:size": 19136948,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "rededge3": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EG/2025/1/S2B_T28UEG_20250110T120355_L2A/B07.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red Edge 3 - 20m",
+          "eo:bands": [
+            {
+              "name": "B07",
+              "common_name": "rededge",
+              "center_wavelength": 0.783,
+              "full_width_half_max": 0.028
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12202f084ef5aba2af0dd40f435b33d219b893acabbc9e921d86b1a94bf112230669",
+          "file:size": 19261255,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "rededge1": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EG/2025/1/S2B_T28UEG_20250110T120355_L2A/B05.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red Edge 1 - 20m",
+          "eo:bands": [
+            {
+              "name": "B05",
+              "common_name": "rededge",
+              "center_wavelength": 0.704,
+              "full_width_half_max": 0.019
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220969140f9d7e9cc58cf32e457f566f4c340273427ffb8dddb2f683d150835ad6c",
+          "file:size": 19065317,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "swir16": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EG/2025/1/S2B_T28UEG_20250110T120355_L2A/B11.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "SWIR 1.6μm - 20m",
+          "eo:bands": [
+            {
+              "name": "B11",
+              "common_name": "swir16",
+              "center_wavelength": 1.61,
+              "full_width_half_max": 0.143
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220914df8e59a4a35b02a50c7a491dc3ca9a1cae1f4ae2d84a7e0255f997be7f78f",
+          "file:size": 18069457,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "wvp": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EG/2025/1/S2B_T28UEG_20250110T120355_L2A/WVP.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Water Vapour (WVP)",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "unit": "cm",
+              "scale": 0.001,
+              "offset": 0
+            }
+          ],
+          "file:checksum": "1220737f0c96ba09ebf59029954c78d1a0a402c1053743ebff2525838d83a1511a38",
+          "file:size": 95845,
+          "roles": [
+            "data"
+          ]
+        },
+        "nir08": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EG/2025/1/S2B_T28UEG_20250110T120355_L2A/B8A.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "NIR 2 - 20m",
+          "eo:bands": [
+            {
+              "name": "B8A",
+              "common_name": "nir08",
+              "center_wavelength": 0.865,
+              "full_width_half_max": 0.033
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "122011dd8b6bdb5f241dd736b2d504b45e34c42749a53368505a15fc6ef2affb2090",
+          "file:size": 19513705,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "scl": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EG/2025/1/S2B_T28UEG_20250110T120355_L2A/SCL.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Scene classification map (SCL)",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 20
+            }
+          ],
+          "file:checksum": "1220a5d8882157abc3181bb1a6a46d7c64fc4c9d024b75e6d74fc16ab0e83c904c5c",
+          "file:size": 121275,
+          "roles": [
+            "data"
+          ]
+        },
+        "aot": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EG/2025/1/S2B_T28UEG_20250110T120355_L2A/AOT.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Aerosol optical thickness (AOT)",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.001,
+              "offset": 0
+            }
+          ],
+          "file:checksum": "1220c6e200980d8d0b7d7f2e6646d494b790d40a5cbfe0cdc31df7cf1a4576456fa2",
+          "file:size": 173930,
+          "roles": [
+            "data"
+          ]
+        },
+        "coastal": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EG/2025/1/S2B_T28UEG_20250110T120355_L2A/B01.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Coastal - 60m",
+          "eo:bands": [
+            {
+              "name": "B01",
+              "common_name": "coastal",
+              "center_wavelength": 0.443,
+              "full_width_half_max": 0.027
+            }
+          ],
+          "gsd": 60,
+          "proj:shape": [1830, 1830],
+          "proj:transform": [60, 0, 499980, 0, -60, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 60,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "122086a4aeabc9e17edd3c8951f13de11c1ed3857bb33fa3cb97e68a9d0100147924",
+          "file:size": 2249862,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "nir09": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EG/2025/1/S2B_T28UEG_20250110T120355_L2A/B09.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "NIR 3 - 60m",
+          "eo:bands": [
+            {
+              "name": "B09",
+              "common_name": "nir09",
+              "center_wavelength": 0.945,
+              "full_width_half_max": 0.026
+            }
+          ],
+          "gsd": 60,
+          "proj:shape": [1830, 1830],
+          "proj:transform": [60, 0, 499980, 0, -60, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 60,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220199c59b4af3b328f6aeb6d39fc7ceb285748f594cf5c955cd0a8f4942cba3781",
+          "file:size": 1916080,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "cloud": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EG/2025/1/S2B_T28UEG_20250110T120355_L2A/CLD_20m.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Cloud Probabilities",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 20
+            }
+          ],
+          "file:checksum": "122076cefbddfb96e123b42521059ea8dca0c458e3394688c0f886fb43c33d907402",
+          "file:size": 231288,
+          "roles": [
+            "data",
+            "cloud"
+          ]
+        },
+        "snow": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EG/2025/1/S2B_T28UEG_20250110T120355_L2A/SNW_20m.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Snow Probabilities",
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 20
+            }
+          ],
+          "file:checksum": "12209a39c5a396b02efa2a98f06213d63ee40227e1d292883e792279df61c431e8ae",
+          "file:size": 53931,
+          "roles": [
+            "data",
+            "snow-ice"
+          ]
+        },
+        "preview": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EG/2025/1/S2B_T28UEG_20250110T120355_L2A/L2A_PVI.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "True color preview",
+          "eo:bands": [
+            {
+              "name": "B04",
+              "common_name": "red",
+              "center_wavelength": 0.665,
+              "full_width_half_max": 0.038
+            },
+            {
+              "name": "B03",
+              "common_name": "green",
+              "center_wavelength": 0.56,
+              "full_width_half_max": 0.045
+            },
+            {
+              "name": "B02",
+              "common_name": "blue",
+              "center_wavelength": 0.49,
+              "full_width_half_max": 0.098
+            }
+          ],
+          "file:checksum": "122075dc35d66b6d9a941a1277a77f576ba3b7bd5c0a325d60641feefa4812bc1124",
+          "file:size": 8431,
+          "roles": [
+            "overview"
+          ]
+        },
+        "granule_metadata": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EG/2025/1/S2B_T28UEG_20250110T120355_L2A/metadata.xml",
+          "type": "application/xml",
+          "file:checksum": "1220c4312c4f5ad1f1c757186808c99ec2a552cf2874bc7740e635da2b3538bbfbfb",
+          "file:size": 276748,
+          "roles": [
+            "metadata"
+          ]
+        },
+        "tileinfo_metadata": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EG/2025/1/S2B_T28UEG_20250110T120355_L2A/tileInfo.json",
+          "type": "application/json",
+          "file:checksum": "122071fa608aa4046865213a5eac7e5d35d24204e73c393ef5ddaea518918a91e35f",
+          "file:size": 1518,
+          "roles": [
+            "metadata"
+          ]
+        },
+        "product_metadata": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EG/2025/1/S2B_T28UEG_20250110T120355_L2A/product_metadata.xml",
+          "type": "application/xml",
+          "file:checksum": "12205fd1335176b336218ed5c4e5f7930ae15d28a2944d592d89b1ca962b84f9b0ee",
+          "file:size": 54707,
+          "roles": [
+            "metadata"
+          ]
+        },
+        "thumbnail": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/U/EG/2025/1/S2B_T28UEG_20250110T120355_L2A/L2A_PVI.jpg",
+          "type": "image/jpeg",
+          "title": "Thumbnail of preview image",
+          "file:checksum": "1220659ac78ac2c72c27ef4b3d2f06306fa35ba128b539ce99a12e601e3b5dba16cd",
+          "file:size": 4633,
+          "roles": [
+            "thumbnail"
+          ]
+        }
+      },
+      "bbox": [-14.102648, 54.947027, -13.242741, 55.938071],
+      "stac_extensions": [
+        "https://stac-extensions.github.io/eo/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/file/v2.1.0/schema.json",
+        "https://stac-extensions.github.io/grid/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/mgrs/v1.0.0/schema.json",
+        "https://stac-extensions.github.io/processing/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/projection/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/raster/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/sentinel-2/v1.0.0/schema.json",
+        "https://stac-extensions.github.io/storage/v1.0.0/schema.json",
+        "https://stac-extensions.github.io/view/v1.0.0/schema.json"
+      ],
+      "collection": "sentinel-2-c1-l2a"
+    },
+    {
+      "type": "Feature",
+      "stac_version": "1.0.0",
+      "id": "S2B_T28VEH_20250110T120355_L2A",
+      "properties": {
+        "created": "2025-01-10T16:23:30.675Z",
+        "platform": "sentinel-2b",
+        "constellation": "sentinel-2",
+        "instruments": [
+          "msi"
+        ],
+        "eo:cloud_cover": 99.301517,
+        "proj:epsg": 32628,
+        "proj:centroid": {
+          "lat": 56.15644,
+          "lon": -13.37486
+        },
+        "mgrs:utm_zone": 28,
+        "mgrs:latitude_band": "V",
+        "mgrs:grid_square": "EH",
+        "grid:code": "MGRS-28VEH",
+        "view:azimuth": 111.841329557221,
+        "view:incidence_angle": 11.1233547024194,
+        "view:sun_azimuth": 166.296128019016,
+        "view:sun_elevation": 10.8177386822595,
+        "s2:tile_id": "S2B_OPER_MSI_L2A_TL_2BPS_20250110T154043_A040990_T28VEH_N05.11",
+        "s2:degraded_msi_data_percentage": 0,
+        "s2:nodata_pixel_percentage": 88.483912,
+        "s2:saturated_defective_pixel_percentage": 0,
+        "s2:cloud_shadow_percentage": 0,
+        "s2:vegetation_percentage": 0,
+        "s2:not_vegetated_percentage": 0,
+        "s2:water_percentage": 0.698481,
+        "s2:unclassified_percentage": 0,
+        "s2:medium_proba_clouds_percentage": 42.502564,
+        "s2:high_proba_clouds_percentage": 44.748831,
+        "s2:thin_cirrus_percentage": 12.050124,
+        "s2:snow_ice_percentage": 0,
+        "s2:product_type": "S2MSI2A",
+        "s2:processing_baseline": "05.11",
+        "s2:product_uri": "S2B_MSIL2A_20250110T120359_N0511_R066_T28VEH_20250110T154043.SAFE",
+        "s2:generation_time": "2025-01-10T15:40:43.000000Z",
+        "s2:datatake_id": "GS2B_20250110T120359_040990_N05.11",
+        "s2:datatake_type": "INS-NOBS",
+        "s2:datastrip_id": "S2B_OPER_MSI_L2A_DS_2BPS_20250110T154043_S20250110T120355_N05.11",
+        "s2:reflectance_conversion_factor": 1.03425891111326,
+        "datetime": "2025-01-10T12:06:00.902000Z",
+        "earthsearch:payload_id": "roda-sentinel-2-c1-l2a/workflow-sentinel-2-c1-l2a-to-stac/11834873512e6300f7681a47b13878fd",
+        "storage:platform": "AWS",
+        "storage:region": "us-west-2",
+        "storage:requester_pays": false,
+        "processing:software": {
+          "sentinel-2-c1-l2a-to-stac": "v2024.02.01"
+        },
+        "updated": "2025-01-10T16:23:30.675Z"
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [-13.2483259551958, 55.8448624735234],
+            [-13.206223668266, 56.7743145359432],
+            [-13.6700421061974, 55.8501437572837],
+            [-13.2483259551958, 55.8448624735234]
+          ]
+        ]
+      },
+      "links": [
+        {
+          "rel": "self",
+          "type": "application/geo+json",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a/items/S2B_T28VEH_20250110T120355_L2A"
+        },
+        {
+          "rel": "canonical",
+          "href": "s3://e84-earth-search-sentinel-data/sentinel-2-c1-l2a/28/V/EH/2025/1/S2B_T28VEH_20250110T120355_L2A/S2B_T28VEH_20250110T120355_L2A.json",
+          "type": "application/json"
+        },
+        {
+          "rel": "via",
+          "href": "s3://sentinel-s2-l2a/tiles/28/V/EH/2025/1/10/0/metadata.xml",
+          "type": "application/xml",
+          "title": "Granule Metadata in Sinergize RODA Archive"
+        },
+        {
+          "rel": "parent",
+          "type": "application/json",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a"
+        },
+        {
+          "rel": "collection",
+          "type": "application/json",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a"
+        },
+        {
+          "rel": "root",
+          "type": "application/json",
+          "href": "https://earth-search.aws.element84.com/v1"
+        },
+        {
+          "rel": "thumbnail",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a/items/S2B_T28VEH_20250110T120355_L2A/thumbnail"
+        }
+      ],
+      "assets": {
+        "red": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/V/EH/2025/1/S2B_T28VEH_20250110T120355_L2A/B04.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red - 10m",
+          "eo:bands": [
+            {
+              "name": "B04",
+              "common_name": "red",
+              "center_wavelength": 0.665,
+              "full_width_half_max": 0.038
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 499980, 0, -10, 6300000],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12209a078d936edd1a7e1bcdf766e8fcf55431b60f65328965b08f0af871af8464eb",
+          "file:size": 23470320,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "green": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/V/EH/2025/1/S2B_T28VEH_20250110T120355_L2A/B03.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Green - 10m",
+          "eo:bands": [
+            {
+              "name": "B03",
+              "common_name": "green",
+              "center_wavelength": 0.56,
+              "full_width_half_max": 0.045
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 499980, 0, -10, 6300000],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220d798375df0fc4cd2f16f037408fecb24b72f372f1658c733d3a7d522dd3eac07",
+          "file:size": 23549627,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "blue": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/V/EH/2025/1/S2B_T28VEH_20250110T120355_L2A/B02.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Blue - 10m",
+          "eo:bands": [
+            {
+              "name": "B02",
+              "common_name": "blue",
+              "center_wavelength": 0.49,
+              "full_width_half_max": 0.098
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 499980, 0, -10, 6300000],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12207470ebca173e6c56435c6e9a2da0013603294d304b7e2a12803a97029c1269b0",
+          "file:size": 23446317,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "visual": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/V/EH/2025/1/S2B_T28VEH_20250110T120355_L2A/TCI.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "True color image",
+          "eo:bands": [
+            {
+              "name": "B04",
+              "common_name": "red",
+              "center_wavelength": 0.665,
+              "full_width_half_max": 0.038
+            },
+            {
+              "name": "B03",
+              "common_name": "green",
+              "center_wavelength": 0.56,
+              "full_width_half_max": 0.045
+            },
+            {
+              "name": "B02",
+              "common_name": "blue",
+              "center_wavelength": 0.49,
+              "full_width_half_max": 0.098
+            }
+          ],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 10
+            },
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 10
+            },
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 10
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 499980, 0, -10, 6300000],
+          "file:checksum": "12207b390449b17d0cebbbd6b2de54203a94e925ac96ce54aa5b34583674c0113e89",
+          "file:size": 21770593,
+          "roles": [
+            "visual"
+          ]
+        },
+        "nir": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/V/EH/2025/1/S2B_T28VEH_20250110T120355_L2A/B08.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "NIR 1 - 10m",
+          "eo:bands": [
+            {
+              "name": "B08",
+              "common_name": "nir",
+              "center_wavelength": 0.842,
+              "full_width_half_max": 0.145
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 499980, 0, -10, 6300000],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12205b740b77c08f48ce13ee908590a25d361e72d47ade71fa055c9d268534e04223",
+          "file:size": 23641591,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "swir22": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/V/EH/2025/1/S2B_T28VEH_20250110T120355_L2A/B12.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "SWIR 2.2μm - 20m",
+          "eo:bands": [
+            {
+              "name": "B12",
+              "common_name": "swir22",
+              "center_wavelength": 2.19,
+              "full_width_half_max": 0.242
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 6300000],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "122085f33db31d5fbed707c061c7df0cc929dcc7b861df99561166b57bd6600e84ab",
+          "file:size": 6241149,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "rededge2": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/V/EH/2025/1/S2B_T28VEH_20250110T120355_L2A/B06.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red Edge 2 - 20m",
+          "eo:bands": [
+            {
+              "name": "B06",
+              "common_name": "rededge",
+              "center_wavelength": 0.74,
+              "full_width_half_max": 0.018
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 6300000],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220eb01170f6a76786fd032101911244c117c5ca2a43fb2a8162327246afaccfe09",
+          "file:size": 6636232,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "rededge3": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/V/EH/2025/1/S2B_T28VEH_20250110T120355_L2A/B07.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red Edge 3 - 20m",
+          "eo:bands": [
+            {
+              "name": "B07",
+              "common_name": "rededge",
+              "center_wavelength": 0.783,
+              "full_width_half_max": 0.028
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 6300000],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220577312552117447a506afcc312f45302506b7b184048c7da1c7e4c0dd514db9c",
+          "file:size": 6676498,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "rededge1": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/V/EH/2025/1/S2B_T28VEH_20250110T120355_L2A/B05.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red Edge 1 - 20m",
+          "eo:bands": [
+            {
+              "name": "B05",
+              "common_name": "rededge",
+              "center_wavelength": 0.704,
+              "full_width_half_max": 0.019
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 6300000],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220c33490a3ec481d86db0f85ecea1d741794cc12424dba366d2f606f8e5b23588a",
+          "file:size": 6631667,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "swir16": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/V/EH/2025/1/S2B_T28VEH_20250110T120355_L2A/B11.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "SWIR 1.6μm - 20m",
+          "eo:bands": [
+            {
+              "name": "B11",
+              "common_name": "swir16",
+              "center_wavelength": 1.61,
+              "full_width_half_max": 0.143
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 6300000],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "122072b1ed47a63d6dc0bf1ac50432268e594262a2d2b451397c0ebbdabbadd88cff",
+          "file:size": 6317373,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "wvp": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/V/EH/2025/1/S2B_T28VEH_20250110T120355_L2A/WVP.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Water Vapour (WVP)",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 6300000],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "unit": "cm",
+              "scale": 0.001,
+              "offset": 0
+            }
+          ],
+          "file:checksum": "12209a8982ff57262f14ebd82f32666904914fb550aabe6a6ddf554350fac7c2136d",
+          "file:size": 95845,
+          "roles": [
+            "data"
+          ]
+        },
+        "nir08": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/V/EH/2025/1/S2B_T28VEH_20250110T120355_L2A/B8A.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "NIR 2 - 20m",
+          "eo:bands": [
+            {
+              "name": "B8A",
+              "common_name": "nir08",
+              "center_wavelength": 0.865,
+              "full_width_half_max": 0.033
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 6300000],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220efe682a3aa1a20332f77390e4f53fbcd1b16f32f694fb3b352f8410919e5955b",
+          "file:size": 6716668,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "scl": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/V/EH/2025/1/S2B_T28VEH_20250110T120355_L2A/SCL.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Scene classification map (SCL)",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 6300000],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 20
+            }
+          ],
+          "file:checksum": "122017b19cbd43088542594dd2b1d2f70313da1a2ecfb5a4e29f20bd1bc3da1f7815",
+          "file:size": 222714,
+          "roles": [
+            "data"
+          ]
+        },
+        "aot": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/V/EH/2025/1/S2B_T28VEH_20250110T120355_L2A/AOT.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Aerosol optical thickness (AOT)",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 6300000],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.001,
+              "offset": 0
+            }
+          ],
+          "file:checksum": "1220246803d9849a422405163a49896d7106184d4e9ec6691fc49ac83816517f0509",
+          "file:size": 138722,
+          "roles": [
+            "data"
+          ]
+        },
+        "coastal": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/V/EH/2025/1/S2B_T28VEH_20250110T120355_L2A/B01.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Coastal - 60m",
+          "eo:bands": [
+            {
+              "name": "B01",
+              "common_name": "coastal",
+              "center_wavelength": 0.443,
+              "full_width_half_max": 0.027
+            }
+          ],
+          "gsd": 60,
+          "proj:shape": [1830, 1830],
+          "proj:transform": [60, 0, 499980, 0, -60, 6300000],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 60,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "122090dcd8bdb5db4777e23fbd9a863b3475caccea2632e6f082c1a40e7c0d7c615f",
+          "file:size": 801606,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "nir09": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/V/EH/2025/1/S2B_T28VEH_20250110T120355_L2A/B09.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "NIR 3 - 60m",
+          "eo:bands": [
+            {
+              "name": "B09",
+              "common_name": "nir09",
+              "center_wavelength": 0.945,
+              "full_width_half_max": 0.026
+            }
+          ],
+          "gsd": 60,
+          "proj:shape": [1830, 1830],
+          "proj:transform": [60, 0, 499980, 0, -60, 6300000],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 60,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220cb7d707d19dfdd20a6619f08f7f55e7becb8c164c73fc1ba0924ac0f50518bf6",
+          "file:size": 716309,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "cloud": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/V/EH/2025/1/S2B_T28VEH_20250110T120355_L2A/CLD_20m.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Cloud Probabilities",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 6300000],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 20
+            }
+          ],
+          "file:checksum": "12201cea1fb6f01083885b59b8c36f635d80e32062c28e214bc65e25e272e2eb73d8",
+          "file:size": 603026,
+          "roles": [
+            "data",
+            "cloud"
+          ]
+        },
+        "snow": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/V/EH/2025/1/S2B_T28VEH_20250110T120355_L2A/SNW_20m.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Snow Probabilities",
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 6300000],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 20
+            }
+          ],
+          "file:checksum": "12206d5fa18554952bea897b5e8ffe90c64ae6ba98d31744de65c4e269ca0e913bbd",
+          "file:size": 53931,
+          "roles": [
+            "data",
+            "snow-ice"
+          ]
+        },
+        "preview": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/V/EH/2025/1/S2B_T28VEH_20250110T120355_L2A/L2A_PVI.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "True color preview",
+          "eo:bands": [
+            {
+              "name": "B04",
+              "common_name": "red",
+              "center_wavelength": 0.665,
+              "full_width_half_max": 0.038
+            },
+            {
+              "name": "B03",
+              "common_name": "green",
+              "center_wavelength": 0.56,
+              "full_width_half_max": 0.045
+            },
+            {
+              "name": "B02",
+              "common_name": "blue",
+              "center_wavelength": 0.49,
+              "full_width_half_max": 0.098
+            }
+          ],
+          "file:checksum": "12205adc705f4f9892cbca80a870037a9ab732ec8c93ab91639a7c9477e000d1764a",
+          "file:size": 31910,
+          "roles": [
+            "overview"
+          ]
+        },
+        "granule_metadata": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/V/EH/2025/1/S2B_T28VEH_20250110T120355_L2A/metadata.xml",
+          "type": "application/xml",
+          "file:checksum": "1220e635711170fce5974513ea062f6739b962681828dd8d1db23b026072abb6064e",
+          "file:size": 185550,
+          "roles": [
+            "metadata"
+          ]
+        },
+        "tileinfo_metadata": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/V/EH/2025/1/S2B_T28VEH_20250110T120355_L2A/tileInfo.json",
+          "type": "application/json",
+          "file:checksum": "1220d7a2e8b29cf19d297e4c685b7cd4a8a82399f0e8d6b063c1d40b9978a734f008",
+          "file:size": 1510,
+          "roles": [
+            "metadata"
+          ]
+        },
+        "product_metadata": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/V/EH/2025/1/S2B_T28VEH_20250110T120355_L2A/product_metadata.xml",
+          "type": "application/xml",
+          "file:checksum": "12200362284af62323155e23089028e143ef902c4f19f040a4341fb1ab723056e132",
+          "file:size": 54677,
+          "roles": [
+            "metadata"
+          ]
+        },
+        "thumbnail": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/28/V/EH/2025/1/S2B_T28VEH_20250110T120355_L2A/L2A_PVI.jpg",
+          "type": "image/jpeg",
+          "title": "Thumbnail of preview image",
+          "file:checksum": "1220d058912bbb7875f8b023701f44852a6a18f09d9062bb2a0476acb44e06e62ab1",
+          "file:size": 7597,
+          "roles": [
+            "thumbnail"
+          ]
+        }
+      },
+      "bbox": [-13.670042, 55.844862, -13.206224, 56.774315],
+      "stac_extensions": [
+        "https://stac-extensions.github.io/eo/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/file/v2.1.0/schema.json",
+        "https://stac-extensions.github.io/grid/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/mgrs/v1.0.0/schema.json",
+        "https://stac-extensions.github.io/processing/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/projection/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/raster/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/sentinel-2/v1.0.0/schema.json",
+        "https://stac-extensions.github.io/storage/v1.0.0/schema.json",
+        "https://stac-extensions.github.io/view/v1.0.0/schema.json"
+      ],
+      "collection": "sentinel-2-c1-l2a"
+    },
+    {
+      "type": "Feature",
+      "stac_version": "1.0.0",
+      "id": "S2B_T29UNB_20250110T120355_L2A",
+      "properties": {
+        "created": "2025-01-10T16:22:47.191Z",
+        "platform": "sentinel-2b",
+        "constellation": "sentinel-2",
+        "instruments": [
+          "msi"
+        ],
+        "eo:cloud_cover": 58.027476,
+        "proj:epsg": 32629,
+        "proj:centroid": {
+          "lat": 55.76895,
+          "lon": -8.89008
+        },
+        "mgrs:utm_zone": 29,
+        "mgrs:latitude_band": "U",
+        "mgrs:grid_square": "NB",
+        "grid:code": "MGRS-29UNB",
+        "view:azimuth": 296.213391314926,
+        "view:incidence_angle": 11.2885323247034,
+        "view:sun_azimuth": 171.888242896347,
+        "view:sun_elevation": 12.3330462371241,
+        "s2:tile_id": "S2B_OPER_MSI_L2A_TL_2BPS_20250110T154043_A040990_T29UNB_N05.11",
+        "s2:degraded_msi_data_percentage": 0,
+        "s2:nodata_pixel_percentage": 94.879043,
+        "s2:saturated_defective_pixel_percentage": 0,
+        "s2:cloud_shadow_percentage": 0,
+        "s2:vegetation_percentage": 0,
+        "s2:not_vegetated_percentage": 0.000454,
+        "s2:water_percentage": 41.972074,
+        "s2:unclassified_percentage": 0,
+        "s2:medium_proba_clouds_percentage": 19.25049,
+        "s2:high_proba_clouds_percentage": 1.270002,
+        "s2:thin_cirrus_percentage": 37.50698,
+        "s2:snow_ice_percentage": 0,
+        "s2:product_type": "S2MSI2A",
+        "s2:processing_baseline": "05.11",
+        "s2:product_uri": "S2B_MSIL2A_20250110T120359_N0511_R066_T29UNB_20250110T154043.SAFE",
+        "s2:generation_time": "2025-01-10T15:40:43.000000Z",
+        "s2:datatake_id": "GS2B_20250110T120359_040990_N05.11",
+        "s2:datatake_type": "INS-NOBS",
+        "s2:datastrip_id": "S2B_OPER_MSI_L2A_DS_2BPS_20250110T154043_S20250110T120355_N05.11",
+        "s2:reflectance_conversion_factor": 1.03425891111326,
+        "datetime": "2025-01-10T12:05:52.609000Z",
+        "earthsearch:payload_id": "roda-sentinel-2-c1-l2a/workflow-sentinel-2-c1-l2a-to-stac/b708c4badc2109a13b89da40305c2ef8",
+        "storage:platform": "AWS",
+        "storage:region": "us-west-2",
+        "storage:requester_pays": false,
+        "processing:software": {
+          "sentinel-2-c1-l2a-to-stac": "v2024.02.01"
+        },
+        "updated": "2025-01-10T16:22:47.191Z"
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [-9.00030421811058, 55.9457254173272],
+            [-9.00030013314029, 55.4158504628607],
+            [-8.66964406830726, 55.9452826258813],
+            [-9.00030421811058, 55.9457254173272]
+          ]
+        ]
+      },
+      "links": [
+        {
+          "rel": "self",
+          "type": "application/geo+json",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a/items/S2B_T29UNB_20250110T120355_L2A"
+        },
+        {
+          "rel": "canonical",
+          "href": "s3://e84-earth-search-sentinel-data/sentinel-2-c1-l2a/29/U/NB/2025/1/S2B_T29UNB_20250110T120355_L2A/S2B_T29UNB_20250110T120355_L2A.json",
+          "type": "application/json"
+        },
+        {
+          "rel": "via",
+          "href": "s3://sentinel-s2-l2a/tiles/29/U/NB/2025/1/10/0/metadata.xml",
+          "type": "application/xml",
+          "title": "Granule Metadata in Sinergize RODA Archive"
+        },
+        {
+          "rel": "parent",
+          "type": "application/json",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a"
+        },
+        {
+          "rel": "collection",
+          "type": "application/json",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a"
+        },
+        {
+          "rel": "root",
+          "type": "application/json",
+          "href": "https://earth-search.aws.element84.com/v1"
+        },
+        {
+          "rel": "thumbnail",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a/items/S2B_T29UNB_20250110T120355_L2A/thumbnail"
+        }
+      ],
+      "assets": {
+        "red": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/NB/2025/1/S2B_T29UNB_20250110T120355_L2A/B04.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red - 10m",
+          "eo:bands": [
+            {
+              "name": "B04",
+              "common_name": "red",
+              "center_wavelength": 0.665,
+              "full_width_half_max": 0.038
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 499980, 0, -10, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220e789936a2387f8dc7e6aabb0968bae1a6e9f84523186412e9929641effdaa361",
+          "file:size": 10027685,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "green": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/NB/2025/1/S2B_T29UNB_20250110T120355_L2A/B03.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Green - 10m",
+          "eo:bands": [
+            {
+              "name": "B03",
+              "common_name": "green",
+              "center_wavelength": 0.56,
+              "full_width_half_max": 0.045
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 499980, 0, -10, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "122063893492f1d7288fc4035b468681f4553f2887f3c74655a4c84aaf6516a37f00",
+          "file:size": 10190327,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "blue": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/NB/2025/1/S2B_T29UNB_20250110T120355_L2A/B02.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Blue - 10m",
+          "eo:bands": [
+            {
+              "name": "B02",
+              "common_name": "blue",
+              "center_wavelength": 0.49,
+              "full_width_half_max": 0.098
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 499980, 0, -10, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "122058f51b3925cec6f1e94cb2e1ba55cac8ae0b1c98fe7df627e0f0843da4b1ecd4",
+          "file:size": 10515581,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "visual": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/NB/2025/1/S2B_T29UNB_20250110T120355_L2A/TCI.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "True color image",
+          "eo:bands": [
+            {
+              "name": "B04",
+              "common_name": "red",
+              "center_wavelength": 0.665,
+              "full_width_half_max": 0.038
+            },
+            {
+              "name": "B03",
+              "common_name": "green",
+              "center_wavelength": 0.56,
+              "full_width_half_max": 0.045
+            },
+            {
+              "name": "B02",
+              "common_name": "blue",
+              "center_wavelength": 0.49,
+              "full_width_half_max": 0.098
+            }
+          ],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 10
+            },
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 10
+            },
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 10
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 499980, 0, -10, 6200040],
+          "file:checksum": "1220bad96fa28f2414eccd6c5b23831d905d7df22fd3bd24267446eaf3630d3972ea",
+          "file:size": 14154510,
+          "roles": [
+            "visual"
+          ]
+        },
+        "nir": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/NB/2025/1/S2B_T29UNB_20250110T120355_L2A/B08.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "NIR 1 - 10m",
+          "eo:bands": [
+            {
+              "name": "B08",
+              "common_name": "nir",
+              "center_wavelength": 0.842,
+              "full_width_half_max": 0.145
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 499980, 0, -10, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220e5b6a275b9c649ab2288243d5824eeebda0808e51f6a8a40a69903c690b2fbde",
+          "file:size": 10111553,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "swir22": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/NB/2025/1/S2B_T29UNB_20250110T120355_L2A/B12.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "SWIR 2.2μm - 20m",
+          "eo:bands": [
+            {
+              "name": "B12",
+              "common_name": "swir22",
+              "center_wavelength": 2.19,
+              "full_width_half_max": 0.242
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "122026ec8ebcfa8c2d83b76bef0e7b3496ed3c1d39f87fab9e11a8ed939b4c01636c",
+          "file:size": 2437631,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "rededge2": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/NB/2025/1/S2B_T29UNB_20250110T120355_L2A/B06.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red Edge 2 - 20m",
+          "eo:bands": [
+            {
+              "name": "B06",
+              "common_name": "rededge",
+              "center_wavelength": 0.74,
+              "full_width_half_max": 0.018
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220dd58b9912f585b50907e6526958402a7283bdf9420db9b9efb8407d6b0d36da1",
+          "file:size": 2593728,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "rededge3": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/NB/2025/1/S2B_T29UNB_20250110T120355_L2A/B07.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red Edge 3 - 20m",
+          "eo:bands": [
+            {
+              "name": "B07",
+              "common_name": "rededge",
+              "center_wavelength": 0.783,
+              "full_width_half_max": 0.028
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "122009281ca55d8aa3bccfd8fc14d334e3fda9ed2d0083bf9e6e1c9a9799c23ab1eb",
+          "file:size": 2605950,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "rededge1": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/NB/2025/1/S2B_T29UNB_20250110T120355_L2A/B05.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red Edge 1 - 20m",
+          "eo:bands": [
+            {
+              "name": "B05",
+              "common_name": "rededge",
+              "center_wavelength": 0.704,
+              "full_width_half_max": 0.019
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220e4b4d1744e36c8113ac5a208d79b122c4d41d6484fe43a060a306c633949d678",
+          "file:size": 2596301,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "swir16": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/NB/2025/1/S2B_T29UNB_20250110T120355_L2A/B11.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "SWIR 1.6μm - 20m",
+          "eo:bands": [
+            {
+              "name": "B11",
+              "common_name": "swir16",
+              "center_wavelength": 1.61,
+              "full_width_half_max": 0.143
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12203738cfcacf2d49ff3ee15807d2d85fc84b3074196aa3bd7cd5ff4ec5906143b1",
+          "file:size": 2403501,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "wvp": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/NB/2025/1/S2B_T29UNB_20250110T120355_L2A/WVP.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Water Vapour (WVP)",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "unit": "cm",
+              "scale": 0.001,
+              "offset": 0
+            }
+          ],
+          "file:checksum": "1220b4f370a63b84c6d603d295d249fcb26089f11d09a85567594f2f12507533daed",
+          "file:size": 109472,
+          "roles": [
+            "data"
+          ]
+        },
+        "nir08": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/NB/2025/1/S2B_T29UNB_20250110T120355_L2A/B8A.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "NIR 2 - 20m",
+          "eo:bands": [
+            {
+              "name": "B8A",
+              "common_name": "nir08",
+              "center_wavelength": 0.865,
+              "full_width_half_max": 0.033
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12208c9a6417984eccfdd754b8dc7d6e5041c475412fa297ce8650d58394cace8190",
+          "file:size": 2590780,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "scl": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/NB/2025/1/S2B_T29UNB_20250110T120355_L2A/SCL.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Scene classification map (SCL)",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 20
+            }
+          ],
+          "file:checksum": "1220c31980a5d07ba12b22daec798def163f4c63a5e2ff830a44c4ed49091da75d35",
+          "file:size": 112713,
+          "roles": [
+            "data"
+          ]
+        },
+        "aot": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/NB/2025/1/S2B_T29UNB_20250110T120355_L2A/AOT.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Aerosol optical thickness (AOT)",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.001,
+              "offset": 0
+            }
+          ],
+          "file:checksum": "1220d0ded0020d1500a07a3ceb31efefb0b7e06474d74223f4a30d714bfdfa26faf7",
+          "file:size": 123669,
+          "roles": [
+            "data"
+          ]
+        },
+        "coastal": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/NB/2025/1/S2B_T29UNB_20250110T120355_L2A/B01.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Coastal - 60m",
+          "eo:bands": [
+            {
+              "name": "B01",
+              "common_name": "coastal",
+              "center_wavelength": 0.443,
+              "full_width_half_max": 0.027
+            }
+          ],
+          "gsd": 60,
+          "proj:shape": [1830, 1830],
+          "proj:transform": [60, 0, 499980, 0, -60, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 60,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "122002f9d96b4938ef7381d908139deffbc922903f7e59cba1c43f746f55dca19b66",
+          "file:size": 306561,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "nir09": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/NB/2025/1/S2B_T29UNB_20250110T120355_L2A/B09.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "NIR 3 - 60m",
+          "eo:bands": [
+            {
+              "name": "B09",
+              "common_name": "nir09",
+              "center_wavelength": 0.945,
+              "full_width_half_max": 0.026
+            }
+          ],
+          "gsd": 60,
+          "proj:shape": [1830, 1830],
+          "proj:transform": [60, 0, 499980, 0, -60, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 60,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220df4b77e33fe71a118c587ddde0e8b1db4a2507dc246c3c7678330e2a40b9acd9",
+          "file:size": 322261,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "cloud": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/NB/2025/1/S2B_T29UNB_20250110T120355_L2A/CLD_20m.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Cloud Probabilities",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 20
+            }
+          ],
+          "file:checksum": "1220a3d40b111608fa4ca822a1eaf45d94e7c122e942b8378374484cdd907401f755",
+          "file:size": 116319,
+          "roles": [
+            "data",
+            "cloud"
+          ]
+        },
+        "snow": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/NB/2025/1/S2B_T29UNB_20250110T120355_L2A/SNW_20m.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Snow Probabilities",
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 499980, 0, -20, 6200040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 20
+            }
+          ],
+          "file:checksum": "1220ad48781d7c7fd26e277f85a5cb6e9c786d4f4231a494a77954790b7c993e4a2a",
+          "file:size": 53931,
+          "roles": [
+            "data",
+            "snow-ice"
+          ]
+        },
+        "preview": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/NB/2025/1/S2B_T29UNB_20250110T120355_L2A/L2A_PVI.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "True color preview",
+          "eo:bands": [
+            {
+              "name": "B04",
+              "common_name": "red",
+              "center_wavelength": 0.665,
+              "full_width_half_max": 0.038
+            },
+            {
+              "name": "B03",
+              "common_name": "green",
+              "center_wavelength": 0.56,
+              "full_width_half_max": 0.045
+            },
+            {
+              "name": "B02",
+              "common_name": "blue",
+              "center_wavelength": 0.49,
+              "full_width_half_max": 0.098
+            }
+          ],
+          "file:checksum": "1220fe64e947665671aa18aaaa003c9aee5c29fe8cc23ecb611255003623f6d33aac",
+          "file:size": 19984,
+          "roles": [
+            "overview"
+          ]
+        },
+        "granule_metadata": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/NB/2025/1/S2B_T29UNB_20250110T120355_L2A/metadata.xml",
+          "type": "application/xml",
+          "file:checksum": "1220c3421f3b8734d926d99797954bdbb5043e5e2a8f985f84c3a1f8a66cbc0db831",
+          "file:size": 103367,
+          "roles": [
+            "metadata"
+          ]
+        },
+        "tileinfo_metadata": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/NB/2025/1/S2B_T29UNB_20250110T120355_L2A/tileInfo.json",
+          "type": "application/json",
+          "file:checksum": "12208512e1fe6787eaaad288dae43ad3c0c5cc17ce96eca14a5a7038c7b592215753",
+          "file:size": 1483,
+          "roles": [
+            "metadata"
+          ]
+        },
+        "product_metadata": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/NB/2025/1/S2B_T29UNB_20250110T120355_L2A/product_metadata.xml",
+          "type": "application/xml",
+          "file:checksum": "1220e04a251e328f357ce7c5c94372db4eb36ade7254870d997547795ed3087b7c3d",
+          "file:size": 54565,
+          "roles": [
+            "metadata"
+          ]
+        },
+        "thumbnail": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/U/NB/2025/1/S2B_T29UNB_20250110T120355_L2A/L2A_PVI.jpg",
+          "type": "image/jpeg",
+          "title": "Thumbnail of preview image",
+          "file:checksum": "1220df8bda6af78d169612f7fb7dff03dea50a780a19c124b033df1ed036db158db4",
+          "file:size": 4219,
+          "roles": [
+            "thumbnail"
+          ]
+        }
+      },
+      "bbox": [-9.000304, 55.41585, -8.669644, 55.945725],
+      "stac_extensions": [
+        "https://stac-extensions.github.io/eo/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/file/v2.1.0/schema.json",
+        "https://stac-extensions.github.io/grid/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/mgrs/v1.0.0/schema.json",
+        "https://stac-extensions.github.io/processing/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/projection/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/raster/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/sentinel-2/v1.0.0/schema.json",
+        "https://stac-extensions.github.io/storage/v1.0.0/schema.json",
+        "https://stac-extensions.github.io/view/v1.0.0/schema.json"
+      ],
+      "collection": "sentinel-2-c1-l2a"
+    },
+    {
+      "type": "Feature",
+      "stac_version": "1.0.0",
+      "id": "S2B_T29VPE_20250110T120355_L2A",
+      "properties": {
+        "created": "2025-01-10T16:23:15.779Z",
+        "platform": "sentinel-2b",
+        "constellation": "sentinel-2",
+        "instruments": [
+          "msi"
+        ],
+        "eo:cloud_cover": 11.435952,
+        "proj:epsg": 32629,
+        "proj:centroid": {
+          "lat": 58.41245,
+          "lon": -7.14589
+        },
+        "mgrs:utm_zone": 29,
+        "mgrs:latitude_band": "V",
+        "mgrs:grid_square": "PE",
+        "grid:code": "MGRS-29VPE",
+        "view:azimuth": 297.497570529651,
+        "view:incidence_angle": 11.1788806985056,
+        "view:sun_azimuth": 173.432089910917,
+        "view:sun_elevation": 9.7935341997534,
+        "s2:tile_id": "S2B_OPER_MSI_L2A_TL_2BPS_20250110T154043_A040990_T29VPE_N05.11",
+        "s2:degraded_msi_data_percentage": 0,
+        "s2:nodata_pixel_percentage": 92.532736,
+        "s2:saturated_defective_pixel_percentage": 0,
+        "s2:cloud_shadow_percentage": 0,
+        "s2:vegetation_percentage": 0,
+        "s2:not_vegetated_percentage": 0.000044,
+        "s2:water_percentage": 88.564003,
+        "s2:unclassified_percentage": 0,
+        "s2:medium_proba_clouds_percentage": 1.015978,
+        "s2:high_proba_clouds_percentage": 0.477642,
+        "s2:thin_cirrus_percentage": 9.942332,
+        "s2:snow_ice_percentage": 0,
+        "s2:product_type": "S2MSI2A",
+        "s2:processing_baseline": "05.11",
+        "s2:product_uri": "S2B_MSIL2A_20250110T120359_N0511_R066_T29VPE_20250110T154043.SAFE",
+        "s2:generation_time": "2025-01-10T15:40:43.000000Z",
+        "s2:datatake_id": "GS2B_20250110T120359_040990_N05.11",
+        "s2:datatake_type": "INS-NOBS",
+        "s2:datastrip_id": "S2B_OPER_MSI_L2A_DS_2BPS_20250110T154043_S20250110T120355_N05.11",
+        "s2:reflectance_conversion_factor": 1.03425891111326,
+        "datetime": "2025-01-10T12:05:06.060000Z",
+        "earthsearch:payload_id": "roda-sentinel-2-c1-l2a/workflow-sentinel-2-c1-l2a-to-stac/e2bcd39fde0f241cb4b72e32d0fab57c",
+        "storage:platform": "AWS",
+        "storage:region": "us-west-2",
+        "storage:requester_pays": false,
+        "processing:software": {
+          "sentinel-2-c1-l2a-to-stac": "v2024.02.01"
+        },
+        "updated": "2025-01-10T16:23:15.779Z"
+      },
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [-7.27777230636626, 58.629120925364],
+            [-7.30877351638107, 57.985540520195],
+            [-6.85111741280027, 58.6227000712756],
+            [-7.27777230636626, 58.629120925364]
+          ]
+        ]
+      },
+      "links": [
+        {
+          "rel": "self",
+          "type": "application/geo+json",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a/items/S2B_T29VPE_20250110T120355_L2A"
+        },
+        {
+          "rel": "canonical",
+          "href": "s3://e84-earth-search-sentinel-data/sentinel-2-c1-l2a/29/V/PE/2025/1/S2B_T29VPE_20250110T120355_L2A/S2B_T29VPE_20250110T120355_L2A.json",
+          "type": "application/json"
+        },
+        {
+          "rel": "via",
+          "href": "s3://sentinel-s2-l2a/tiles/29/V/PE/2025/1/10/0/metadata.xml",
+          "type": "application/xml",
+          "title": "Granule Metadata in Sinergize RODA Archive"
+        },
+        {
+          "rel": "parent",
+          "type": "application/json",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a"
+        },
+        {
+          "rel": "collection",
+          "type": "application/json",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a"
+        },
+        {
+          "rel": "root",
+          "type": "application/json",
+          "href": "https://earth-search.aws.element84.com/v1"
+        },
+        {
+          "rel": "thumbnail",
+          "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a/items/S2B_T29VPE_20250110T120355_L2A/thumbnail"
+        }
+      ],
+      "assets": {
+        "red": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/V/PE/2025/1/S2B_T29VPE_20250110T120355_L2A/B04.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red - 10m",
+          "eo:bands": [
+            {
+              "name": "B04",
+              "common_name": "red",
+              "center_wavelength": 0.665,
+              "full_width_half_max": 0.038
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 600000, 0, -10, 6500040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220afcf1c0cb6d8ba2a05279e4a67c5c3e15915f1840af95899154c282e389af636",
+          "file:size": 13978420,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "green": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/V/PE/2025/1/S2B_T29VPE_20250110T120355_L2A/B03.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Green - 10m",
+          "eo:bands": [
+            {
+              "name": "B03",
+              "common_name": "green",
+              "center_wavelength": 0.56,
+              "full_width_half_max": 0.045
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 600000, 0, -10, 6500040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "122089e64eb2d9546aff1732cd91675186f1d02cc709b24f1541e2be3c1890aca965",
+          "file:size": 14234068,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "blue": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/V/PE/2025/1/S2B_T29VPE_20250110T120355_L2A/B02.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Blue - 10m",
+          "eo:bands": [
+            {
+              "name": "B02",
+              "common_name": "blue",
+              "center_wavelength": 0.49,
+              "full_width_half_max": 0.098
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 600000, 0, -10, 6500040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220cf37736e3df661528f6bbe9ca0a835cf8d2781c2549e65057fcfaa47b6c07c8b",
+          "file:size": 13792914,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "visual": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/V/PE/2025/1/S2B_T29VPE_20250110T120355_L2A/TCI.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "True color image",
+          "eo:bands": [
+            {
+              "name": "B04",
+              "common_name": "red",
+              "center_wavelength": 0.665,
+              "full_width_half_max": 0.038
+            },
+            {
+              "name": "B03",
+              "common_name": "green",
+              "center_wavelength": 0.56,
+              "full_width_half_max": 0.045
+            },
+            {
+              "name": "B02",
+              "common_name": "blue",
+              "center_wavelength": 0.49,
+              "full_width_half_max": 0.098
+            }
+          ],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 10
+            },
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 10
+            },
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 10
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 600000, 0, -10, 6500040],
+          "file:checksum": "1220e1a8602049d4fb2d7e3682a0510a08b0b15e43f0ce758de8d594011941a7f255",
+          "file:size": 20039038,
+          "roles": [
+            "visual"
+          ]
+        },
+        "nir": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/V/PE/2025/1/S2B_T29VPE_20250110T120355_L2A/B08.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "NIR 1 - 10m",
+          "eo:bands": [
+            {
+              "name": "B08",
+              "common_name": "nir",
+              "center_wavelength": 0.842,
+              "full_width_half_max": 0.145
+            }
+          ],
+          "gsd": 10,
+          "proj:shape": [10980, 10980],
+          "proj:transform": [10, 0, 600000, 0, -10, 6500040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 10,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220e00f1a4bc6109c2c0d887962fd3f7cd4b0a83739f1ebba147e40de73ba6e541c",
+          "file:size": 14086891,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "swir22": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/V/PE/2025/1/S2B_T29VPE_20250110T120355_L2A/B12.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "SWIR 2.2μm - 20m",
+          "eo:bands": [
+            {
+              "name": "B12",
+              "common_name": "swir22",
+              "center_wavelength": 2.19,
+              "full_width_half_max": 0.242
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 600000, 0, -20, 6500040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220ad59be9557ef198922b6fb613b6ed28f469a57a2719868cd6b498cb7a9119a36",
+          "file:size": 3440114,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "rededge2": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/V/PE/2025/1/S2B_T29VPE_20250110T120355_L2A/B06.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red Edge 2 - 20m",
+          "eo:bands": [
+            {
+              "name": "B06",
+              "common_name": "rededge",
+              "center_wavelength": 0.74,
+              "full_width_half_max": 0.018
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 600000, 0, -20, 6500040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "122015fe200e3e96f760b07dd5a085148560c4822f9a9907784f397e1a8f9c7840f9",
+          "file:size": 3555878,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "rededge3": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/V/PE/2025/1/S2B_T29VPE_20250110T120355_L2A/B07.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red Edge 3 - 20m",
+          "eo:bands": [
+            {
+              "name": "B07",
+              "common_name": "rededge",
+              "center_wavelength": 0.783,
+              "full_width_half_max": 0.028
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 600000, 0, -20, 6500040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220e5beec733f2675a692cdb0a1c4029712965030cfac0afa9ef2a9cb23184210f8",
+          "file:size": 3620180,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "rededge1": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/V/PE/2025/1/S2B_T29VPE_20250110T120355_L2A/B05.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Red Edge 1 - 20m",
+          "eo:bands": [
+            {
+              "name": "B05",
+              "common_name": "rededge",
+              "center_wavelength": 0.704,
+              "full_width_half_max": 0.019
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 600000, 0, -20, 6500040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12201da5a52ba45a38f0e61f58490bfa7a9e650d5afa08b7f8350850715edb74a35b",
+          "file:size": 3561439,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "swir16": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/V/PE/2025/1/S2B_T29VPE_20250110T120355_L2A/B11.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "SWIR 1.6μm - 20m",
+          "eo:bands": [
+            {
+              "name": "B11",
+              "common_name": "swir16",
+              "center_wavelength": 1.61,
+              "full_width_half_max": 0.143
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 600000, 0, -20, 6500040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12203f8f3d0c9672452094c2de1bc2d045b16216074ef10c8c50f2de4cf85fd62f20",
+          "file:size": 3339112,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "wvp": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/V/PE/2025/1/S2B_T29VPE_20250110T120355_L2A/WVP.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Water Vapour (WVP)",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 600000, 0, -20, 6500040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "unit": "cm",
+              "scale": 0.001,
+              "offset": 0
+            }
+          ],
+          "file:checksum": "1220cfc4488c1c1f04f077f62aab5a1f1aed5c8246e32e31c15bffbcdf8a575aaefe",
+          "file:size": 113489,
+          "roles": [
+            "data"
+          ]
+        },
+        "nir08": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/V/PE/2025/1/S2B_T29VPE_20250110T120355_L2A/B8A.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "NIR 2 - 20m",
+          "eo:bands": [
+            {
+              "name": "B8A",
+              "common_name": "nir08",
+              "center_wavelength": 0.865,
+              "full_width_half_max": 0.033
+            }
+          ],
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 600000, 0, -20, 6500040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12207fa89e2f2e5509cb3bb46a5798bf3d10bfc77e0db99b4099705e7ba414a673d4",
+          "file:size": 3571061,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "scl": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/V/PE/2025/1/S2B_T29VPE_20250110T120355_L2A/SCL.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Scene classification map (SCL)",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 600000, 0, -20, 6500040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 20
+            }
+          ],
+          "file:checksum": "12207e6a0165b890c165ff479833371ffd58e090f76ab592ad6eee4315671ae49481",
+          "file:size": 134774,
+          "roles": [
+            "data"
+          ]
+        },
+        "aot": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/V/PE/2025/1/S2B_T29VPE_20250110T120355_L2A/AOT.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Aerosol optical thickness (AOT)",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 600000, 0, -20, 6500040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 20,
+              "scale": 0.001,
+              "offset": 0
+            }
+          ],
+          "file:checksum": "12203c6ac06eb7a3d9d51ec7681002b16eae54e57856d7b28f14770cbf31fb882782",
+          "file:size": 118913,
+          "roles": [
+            "data"
+          ]
+        },
+        "coastal": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/V/PE/2025/1/S2B_T29VPE_20250110T120355_L2A/B01.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Coastal - 60m",
+          "eo:bands": [
+            {
+              "name": "B01",
+              "common_name": "coastal",
+              "center_wavelength": 0.443,
+              "full_width_half_max": 0.027
+            }
+          ],
+          "gsd": 60,
+          "proj:shape": [1830, 1830],
+          "proj:transform": [60, 0, 600000, 0, -60, 6500040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 60,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "12204dcef553ab0c337169780220b31ec9b1a24d778438cc90c9eae23a08dc7a1fb3",
+          "file:size": 371951,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "nir09": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/V/PE/2025/1/S2B_T29VPE_20250110T120355_L2A/B09.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "NIR 3 - 60m",
+          "eo:bands": [
+            {
+              "name": "B09",
+              "common_name": "nir09",
+              "center_wavelength": 0.945,
+              "full_width_half_max": 0.026
+            }
+          ],
+          "gsd": 60,
+          "proj:shape": [1830, 1830],
+          "proj:transform": [60, 0, 600000, 0, -60, 6500040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint16",
+              "spatial_resolution": 60,
+              "scale": 0.0001,
+              "offset": -0.1
+            }
+          ],
+          "file:checksum": "1220fd8f1fb2de99745bc4fbda52099ee12f21cc147f02b6ff946c6422a88bf0fedd",
+          "file:size": 360501,
+          "roles": [
+            "data",
+            "reflectance"
+          ]
+        },
+        "cloud": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/V/PE/2025/1/S2B_T29VPE_20250110T120355_L2A/CLD_20m.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Cloud Probabilities",
+          "gsd": 20,
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 600000, 0, -20, 6500040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 20
+            }
+          ],
+          "file:checksum": "122054a47012552753b4e55a873394377da8c2e1264c613cdb9fcf92e8a4dfc7fbc7",
+          "file:size": 89971,
+          "roles": [
+            "data",
+            "cloud"
+          ]
+        },
+        "snow": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/V/PE/2025/1/S2B_T29VPE_20250110T120355_L2A/SNW_20m.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "Snow Probabilities",
+          "proj:shape": [5490, 5490],
+          "proj:transform": [20, 0, 600000, 0, -20, 6500040],
+          "raster:bands": [
+            {
+              "nodata": 0,
+              "data_type": "uint8",
+              "spatial_resolution": 20
+            }
+          ],
+          "file:checksum": "1220bd2dd2207c60d18109116b1a1725ac526fd6101b1ce16e8c352b0c58b0d89b22",
+          "file:size": 53931,
+          "roles": [
+            "data",
+            "snow-ice"
+          ]
+        },
+        "preview": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/V/PE/2025/1/S2B_T29VPE_20250110T120355_L2A/L2A_PVI.tif",
+          "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+          "title": "True color preview",
+          "eo:bands": [
+            {
+              "name": "B04",
+              "common_name": "red",
+              "center_wavelength": 0.665,
+              "full_width_half_max": 0.038
+            },
+            {
+              "name": "B03",
+              "common_name": "green",
+              "center_wavelength": 0.56,
+              "full_width_half_max": 0.045
+            },
+            {
+              "name": "B02",
+              "common_name": "blue",
+              "center_wavelength": 0.49,
+              "full_width_half_max": 0.098
+            }
+          ],
+          "file:checksum": "122065d3085676567c18174d812abb82f2823a98b2442d3013b3a2ab05af3ae5d892",
+          "file:size": 23139,
+          "roles": [
+            "overview"
+          ]
+        },
+        "granule_metadata": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/V/PE/2025/1/S2B_T29VPE_20250110T120355_L2A/metadata.xml",
+          "type": "application/xml",
+          "file:checksum": "1220c057f7cfd0855e31ead555fe7f3adc705757a2ed7ba69b6ec90f392c6d9afb77",
+          "file:size": 104646,
+          "roles": [
+            "metadata"
+          ]
+        },
+        "tileinfo_metadata": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/V/PE/2025/1/S2B_T29VPE_20250110T120355_L2A/tileInfo.json",
+          "type": "application/json",
+          "file:checksum": "122085c2343946f211d76226554f92b456be62783d29a427f4e9f81fd47d9baa492e",
+          "file:size": 1481,
+          "roles": [
+            "metadata"
+          ]
+        },
+        "product_metadata": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/V/PE/2025/1/S2B_T29VPE_20250110T120355_L2A/product_metadata.xml",
+          "type": "application/xml",
+          "file:checksum": "1220ec3afeb78300267b27f5a3707163883d208fc20b23bb0feacc85f1ad69b9a5d3",
+          "file:size": 54561,
+          "roles": [
+            "metadata"
+          ]
+        },
+        "thumbnail": {
+          "href": "https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/29/V/PE/2025/1/S2B_T29VPE_20250110T120355_L2A/L2A_PVI.jpg",
+          "type": "image/jpeg",
+          "title": "Thumbnail of preview image",
+          "file:checksum": "1220e2bff46670175ca4680698e6f65659767c331ed35c51865fdc46267bd4096960",
+          "file:size": 3710,
+          "roles": [
+            "thumbnail"
+          ]
+        }
+      },
+      "bbox": [-7.308774, 57.985541, -6.851117, 58.629121],
+      "stac_extensions": [
+        "https://stac-extensions.github.io/eo/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/file/v2.1.0/schema.json",
+        "https://stac-extensions.github.io/grid/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/mgrs/v1.0.0/schema.json",
+        "https://stac-extensions.github.io/processing/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/projection/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/raster/v1.1.0/schema.json",
+        "https://stac-extensions.github.io/sentinel-2/v1.0.0/schema.json",
+        "https://stac-extensions.github.io/storage/v1.0.0/schema.json",
+        "https://stac-extensions.github.io/view/v1.0.0/schema.json"
+      ],
+      "collection": "sentinel-2-c1-l2a"
+    }
+  ],
+  "links": [
+    {
+      "rel": "next",
+      "title": "Next page of Items",
+      "method": "GET",
+      "type": "application/geo+json",
+      "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a/items?collections=sentinel-2-c1-l2a&next=2025-01-10T12%3A05%3A06.060000Z%2CS2B_T29VPE_20250110T120355_L2A%2Csentinel-2-c1-l2a"
+    },
+    {
+      "rel": "root",
+      "type": "application/json",
+      "href": "https://earth-search.aws.element84.com/v1"
+    },
+    {
+      "rel": "self",
+      "type": "application/geo+json",
+      "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a/items"
+    },
+    {
+      "rel": "collection",
+      "type": "application/json",
+      "href": "https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a"
+    }
+  ]
+}
diff --git a/spark/common/src/test/resources/datasource_stac/collection.json b/spark/common/src/test/resources/datasource_stac/collection.json
new file mode 100644
index 0000000000..4fbe98d46b
--- /dev/null
+++ b/spark/common/src/test/resources/datasource_stac/collection.json
@@ -0,0 +1,142 @@
+{
+  "id": "simple-collection",
+  "type": "Collection",
+  "stac_extensions": [
+    "https://stac-extensions.github.io/eo/v2.0.0/schema.json",
+    "https://stac-extensions.github.io/projection/v2.0.0/schema.json",
+    "https://stac-extensions.github.io/view/v1.0.0/schema.json"
+  ],
+  "stac_version": "1.1.0",
+  "description": "A simple collection demonstrating core catalog fields with links to a couple of items",
+  "title": "Simple Example Collection",
+  "keywords": [
+    "simple",
+    "example",
+    "collection"
+  ],
+  "providers": [
+    {
+      "name": "Remote Data, Inc",
+      "description": "Producers of awesome spatiotemporal assets",
+      "roles": [
+        "producer",
+        "processor"
+      ],
+      "url": "http://remotedata.io"
+    }
+  ],
+  "extent": {
+    "spatial": {
+      "bbox": [
+        [
+          172.91173669923782,
+          1.3438851951615003,
+          172.95469614953714,
+          1.3690476620161975
+        ]
+      ]
+    },
+    "temporal": {
+      "interval": [
+        [
+          "2020-12-11T22:38:32.125Z",
+          "2020-12-14T18:02:31.437Z"
+        ]
+      ]
+    }
+  },
+  "license": "CC-BY-4.0",
+  "summaries": {
+    "platform": [
+      "cool_sat1",
+      "cool_sat2"
+    ],
+    "constellation": [
+      "ion"
+    ],
+    "instruments": [
+      "cool_sensor_v1",
+      "cool_sensor_v2"
+    ],
+    "gsd": {
+      "minimum": 0.512,
+      "maximum": 0.66
+    },
+    "eo:cloud_cover": {
+      "minimum": 1.2,
+      "maximum": 1.2
+    },
+    "proj:cpde": [
+      "EPSG:32659"
+    ],
+    "view:sun_elevation": {
+      "minimum": 54.9,
+      "maximum": 54.9
+    },
+    "view:off_nadir": {
+      "minimum": 3.8,
+      "maximum": 3.8
+    },
+    "view:sun_azimuth": {
+      "minimum": 135.7,
+      "maximum": 135.7
+    },
+    "statistics": {
+      "type": "object",
+      "properties": {
+        "vegetation": {
+          "description": "Percentage of pixels that are detected as vegetation, e.g. forests, grasslands, etc.",
+          "minimum": 0,
+          "maximum": 100
+        },
+        "water": {
+          "description": "Percentage of pixels that are detected as water, e.g. rivers, oceans and ponds.",
+          "minimum": 0,
+          "maximum": 100
+        },
+        "urban": {
+          "description": "Percentage of pixels that detected as urban, e.g. roads and buildings.",
+          "minimum": 0,
+          "maximum": 100
+        }
+      }
+    }
+  },
+  "links": [
+    {
+      "rel": "root",
+      "href": "./collection.json",
+      "type": "application/json",
+      "title": "Simple Example Collection"
+    },
+    {
+      "rel": "item",
+      "href": "./simple-item.json",
+      "type": "application/geo+json",
+      "title": "Simple Item"
+    },
+    {
+      "rel": "item",
+      "href": "./core-item.json",
+      "type": "application/geo+json",
+      "title": "Core Item"
+    },
+    {
+      "rel": "item",
+      "href": "./extended-item.json",
+      "type": "application/geo+json",
+      "title": "Extended Item"
+    },
+    {
+      "rel": "self",
+      "href": "https://raw.githubusercontent.com/radiantearth/stac-spec/v1.1.0/examples/collection.json",
+      "type": "application/json"
+    },
+    {
+      "rel": "child",
+      "href": "./nested/nested-collection.json",
+      "type": "application/json",
+      "title": "Nested Collection"
+    }
+  ]
+}
diff --git a/spark/common/src/test/resources/datasource_stac/core-item.json b/spark/common/src/test/resources/datasource_stac/core-item.json
new file mode 100644
index 0000000000..e151b1353c
--- /dev/null
+++ b/spark/common/src/test/resources/datasource_stac/core-item.json
@@ -0,0 +1,125 @@
+{
+  "stac_version": "1.1.0",
+  "stac_extensions": [],
+  "type": "Feature",
+  "id": "20201211_223832_CS2",
+  "bbox": [
+    172.91173669923782,
+    1.3438851951615003,
+    172.95469614953714,
+    1.3690476620161975
+  ],
+  "geometry": {
+    "type": "Polygon",
+    "coordinates": [
+      [
+        [
+          172.91173669923782,
+          1.3438851951615003
+        ],
+        [
+          172.95469614953714,
+          1.3438851951615003
+        ],
+        [
+          172.95469614953714,
+          1.3690476620161975
+        ],
+        [
+          172.91173669923782,
+          1.3690476620161975
+        ],
+        [
+          172.91173669923782,
+          1.3438851951615003
+        ]
+      ]
+    ]
+  },
+  "properties": {
+    "title": "Core Item",
+    "description": "A sample STAC Item that includes examples of all common metadata",
+    "datetime": null,
+    "start_datetime": "2020-12-11T22:38:32.125Z",
+    "end_datetime": "2020-12-11T22:38:32.327Z",
+    "created": "2020-12-12T01:48:13.725Z",
+    "updated": "2020-12-12T01:48:13.725Z",
+    "platform": "cool_sat1",
+    "instruments": [
+      "cool_sensor_v1"
+    ],
+    "constellation": "ion",
+    "mission": "collection 5624",
+    "gsd": 0.512
+  },
+  "collection": "simple-collection",
+  "links": [
+    {
+      "rel": "collection",
+      "href": "./collection.json",
+      "type": "application/json",
+      "title": "Simple Example Collection"
+    },
+    {
+      "rel": "root",
+      "href": "./collection.json",
+      "type": "application/json",
+      "title": "Simple Example Collection"
+    },
+    {
+      "rel": "parent",
+      "href": "./collection.json",
+      "type": "application/json",
+      "title": "Simple Example Collection"
+    },
+    {
+      "rel": "alternate",
+      "type": "text/html",
+      "href": "http://remotedata.io/catalog/20201211_223832_CS2/index.html",
+      "title": "HTML version of this STAC Item"
+    }
+  ],
+  "assets": {
+    "analytic": {
+      "href": "https://storage.googleapis.com/open-cogs/stac-examples/20201211_223832_CS2_analytic.tif",
+      "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+      "title": "4-Band Analytic",
+      "roles": [
+        "data"
+      ]
+    },
+    "thumbnail": {
+      "href": "https://storage.googleapis.com/open-cogs/stac-examples/20201211_223832_CS2.jpg",
+      "title": "Thumbnail",
+      "type": "image/png",
+      "roles": [
+        "thumbnail"
+      ]
+    },
+    "visual": {
+      "href": "https://storage.googleapis.com/open-cogs/stac-examples/20201211_223832_CS2.tif",
+      "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+      "title": "3-Band Visual",
+      "roles": [
+        "visual"
+      ]
+    },
+    "udm": {
+      "href": "https://storage.googleapis.com/open-cogs/stac-examples/20201211_223832_CS2_analytic_udm.tif",
+      "title": "Unusable Data Mask",
+      "type": "image/tiff; application=geotiff"
+    },
+    "json-metadata": {
+      "href": "http://remotedata.io/catalog/20201211_223832_CS2/extended-metadata.json",
+      "title": "Extended Metadata",
+      "type": "application/json",
+      "roles": [
+        "metadata"
+      ]
+    },
+    "ephemeris": {
+      "href": "http://cool-sat.com/catalog/20201211_223832_CS2/20201211_223832_CS2.EPH",
+      "title": "Satellite Ephemeris Metadata"
+    }
+  }
+}
diff --git a/spark/common/src/test/resources/datasource_stac/extended-item.json b/spark/common/src/test/resources/datasource_stac/extended-item.json
new file mode 100644
index 0000000000..b5f3a0a9df
--- /dev/null
+++ b/spark/common/src/test/resources/datasource_stac/extended-item.json
@@ -0,0 +1,210 @@
+{
+  "stac_version": "1.1.0",
+  "stac_extensions": [
+    "https://stac-extensions.github.io/eo/v2.0.0/schema.json",
+    "https://stac-extensions.github.io/projection/v2.0.0/schema.json",
+    "https://stac-extensions.github.io/scientific/v1.0.0/schema.json",
+    "https://stac-extensions.github.io/view/v1.0.0/schema.json",
+    "https://stac-extensions.github.io/remote-data/v1.0.0/schema.json"
+  ],
+  "type": "Feature",
+  "id": "20201211_223832_CS2",
+  "bbox": [
+    172.91173669923782,
+    1.3438851951615003,
+    172.95469614953714,
+    1.3690476620161975
+  ],
+  "geometry": {
+    "type": "Polygon",
+    "coordinates": [
+      [
+        [
+          172.91173669923782,
+          1.3438851951615003
+        ],
+        [
+          172.95469614953714,
+          1.3438851951615003
+        ],
+        [
+          172.95469614953714,
+          1.3690476620161975
+        ],
+        [
+          172.91173669923782,
+          1.3690476620161975
+        ],
+        [
+          172.91173669923782,
+          1.3438851951615003
+        ]
+      ]
+    ]
+  },
+  "properties": {
+    "title": "Extended Item",
+    "description": "A sample STAC Item that includes a variety of examples from the stable extensions",
+    "keywords": [
+      "extended",
+      "example",
+      "item"
+    ],
+    "datetime": "2020-12-14T18:02:31.437000Z",
+    "created": "2020-12-15T01:48:13.725Z",
+    "updated": "2020-12-15T01:48:13.725Z",
+    "platform": "cool_sat2",
+    "instruments": [
+      "cool_sensor_v2"
+    ],
+    "gsd": 0.66,
+    "eo:cloud_cover": 1.2,
+    "eo:snow_cover": 0,
+    "statistics": {
+      "vegetation": 12.57,
+      "water": 1.23,
+      "urban": 26.2
+    },
+    "proj:code": "EPSG:32659",
+    "proj:shape": [
+      5558,
+      9559
+    ],
+    "proj:transform": [
+      0.5,
+      0,
+      712710,
+      0,
+      -0.5,
+      151406,
+      0,
+      0,
+      1
+    ],
+    "view:sun_elevation": 54.9,
+    "view:off_nadir": 3.8,
+    "view:sun_azimuth": 135.7,
+    "rd:type": "scene",
+    "rd:anomalous_pixels": 0.14,
+    "rd:earth_sun_distance": 1.014156,
+    "rd:sat_id": "cool_sat2",
+    "rd:product_level": "LV3A",
+    "sci:doi": "10.5061/dryad.s2v81.2/27.2"
+  },
+  "collection": "simple-collection",
+  "links": [
+    {
+      "rel": "collection",
+      "href": "./collection.json",
+      "type": "application/json",
+      "title": "Simple Example Collection"
+    },
+    {
+      "rel": "root",
+      "href": "./collection.json",
+      "type": "application/json",
+      "title": "Simple Example Collection"
+    },
+    {
+      "rel": "parent",
+      "href": "./collection.json",
+      "type": "application/json",
+      "title": "Simple Example Collection"
+    },
+    {
+      "rel": "alternate",
+      "type": "text/html",
+      "href": "http://remotedata.io/catalog/20201211_223832_CS2/index.html",
+      "title": "HTML version of this STAC Item"
+    }
+  ],
+  "assets": {
+    "analytic": {
+      "href": "https://storage.googleapis.com/open-cogs/stac-examples/20201211_223832_CS2_analytic.tif",
+      "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+      "title": "4-Band Analytic",
+      "roles": [
+        "data"
+      ],
+      "bands": [
+        {
+          "name": "band1",
+          "eo:common_name": "blue",
+          "eo:center_wavelength": 0.47,
+          "eo:full_width_half_max": 70
+        },
+        {
+          "name": "band2",
+          "eo:common_name": "green",
+          "eo:center_wavelength": 0.56,
+          "eo:full_width_half_max": 80
+        },
+        {
+          "name": "band3",
+          "eo:common_name": "red",
+          "eo:center_wavelength": 0.645,
+          "eo:full_width_half_max": 90
+        },
+        {
+          "name": "band4",
+          "eo:common_name": "nir",
+          "eo:center_wavelength": 0.8,
+          "eo:full_width_half_max": 152
+        }
+      ]
+    },
+    "thumbnail": {
+      "href": "https://storage.googleapis.com/open-cogs/stac-examples/20201211_223832_CS2.jpg",
+      "title": "Thumbnail",
+      "type": "image/png",
+      "roles": [
+        "thumbnail"
+      ]
+    },
+    "visual": {
+      "href": "https://storage.googleapis.com/open-cogs/stac-examples/20201211_223832_CS2.tif",
+      "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+      "title": "3-Band Visual",
+      "roles": [
+        "visual"
+      ],
+      "bands": [
+        {
+          "name": "band3",
+          "eo:common_name": "red",
+          "eo:center_wavelength": 0.645,
+          "eo:full_width_half_max": 90
+        },
+        {
+          "name": "band2",
+          "eo:common_name": "green",
+          "eo:center_wavelength": 0.56,
+          "eo:full_width_half_max": 80
+        },
+        {
+          "name": "band1",
+          "eo:common_name": "blue",
+          "eo:center_wavelength": 0.47,
+          "eo:full_width_half_max": 70
+        }
+      ]
+    },
+    "udm": {
+      "href": "https://storage.googleapis.com/open-cogs/stac-examples/20201211_223832_CS2_analytic_udm.tif",
+      "title": "Unusable Data Mask",
+      "type": "image/tiff; application=geotiff"
+    },
+    "json-metadata": {
+      "href": "http://remotedata.io/catalog/20201211_223832_CS2/extended-metadata.json",
+      "title": "Extended Metadata",
+      "type": "application/json",
+      "roles": [
+        "metadata"
+      ]
+    },
+    "ephemeris": {
+      "href": "http://cool-sat.com/catalog/20201211_223832_CS2/20201211_223832_CS2.EPH",
+      "title": "Satellite Ephemeris Metadata"
+    }
+  }
+}
\ No newline at end of file
diff --git a/spark/common/src/test/resources/datasource_stac/nested/nested-collection.json b/spark/common/src/test/resources/datasource_stac/nested/nested-collection.json
new file mode 100644
index 0000000000..eac6a0ea84
--- /dev/null
+++ b/spark/common/src/test/resources/datasource_stac/nested/nested-collection.json
@@ -0,0 +1,130 @@
+{
+  "id": "nested-collection",
+  "type": "Collection",
+  "stac_extensions": [
+    "https://stac-extensions.github.io/eo/v2.0.0/schema.json",
+    "https://stac-extensions.github.io/projection/v2.0.0/schema.json",
+    "https://stac-extensions.github.io/view/v1.0.0/schema.json"
+  ],
+  "stac_version": "1.1.0",
+  "description": "A nested collection demonstrating core catalog fields with links to an item and items",
+  "title": "Nested Example Collection",
+  "keywords": [
+    "nested",
+    "example",
+    "collection"
+  ],
+  "providers": [
+    {
+      "name": "Remote Data, Inc",
+      "description": "Producers of awesome spatiotemporal assets",
+      "roles": [
+        "producer",
+        "processor"
+      ],
+      "url": "http://remotedata.io"
+    }
+  ],
+  "extent": {
+    "spatial": {
+      "bbox": [
+        [
+          17.91173669923782,
+          10.3438851951615003,
+          17.95469614953714,
+          10.3690476620161975
+        ]
+      ]
+    },
+    "temporal": {
+      "interval": [
+        [
+          "2020-12-11T22:38:32.125Z",
+          "2020-12-14T18:02:31.437Z"
+        ]
+      ]
+    }
+  },
+  "license": "CC-BY-4.0",
+  "summaries": {
+    "platform": [
+      "cool_sat1",
+      "cool_sat2"
+    ],
+    "constellation": [
+      "ion"
+    ],
+    "instruments": [
+      "cool_sensor_v1",
+      "cool_sensor_v2"
+    ],
+    "gsd": {
+      "minimum": 0.512,
+      "maximum": 0.66
+    },
+    "eo:cloud_cover": {
+      "minimum": 1.2,
+      "maximum": 1.2
+    },
+    "proj:cpde": [
+      "EPSG:32659"
+    ],
+    "view:sun_elevation": {
+      "minimum": 54.9,
+      "maximum": 54.9
+    },
+    "view:off_nadir": {
+      "minimum": 3.8,
+      "maximum": 3.8
+    },
+    "view:sun_azimuth": {
+      "minimum": 135.7,
+      "maximum": 135.7
+    },
+    "statistics": {
+      "type": "object",
+      "properties": {
+        "vegetation": {
+          "description": "Percentage of pixels that are detected as vegetation, e.g. forests, grasslands, etc.",
+          "minimum": 0,
+          "maximum": 100
+        },
+        "water": {
+          "description": "Percentage of pixels that are detected as water, e.g. rivers, oceans and ponds.",
+          "minimum": 0,
+          "maximum": 100
+        },
+        "urban": {
+          "description": "Percentage of pixels that detected as urban, e.g. roads and buildings.",
+          "minimum": 0,
+          "maximum": 100
+        }
+      }
+    }
+  },
+  "links": [
+    {
+      "rel": "root",
+      "href": "./nested-collection.json",
+      "type": "application/json",
+      "title": "Nested Example Collection"
+    },
+    {
+      "rel": "item",
+      "href": "./nested-item.json",
+      "type": "application/geo+json",
+      "title": "Nested Item"
+    },
+    {
+      "rel": "items",
+      "href": "./nested-items.json",
+      "type": "application/geo+json",
+      "title": "Nested Items"
+    },
+    {
+      "rel": "self",
+      "href": "https://raw.githubusercontent.com/radiantearth/stac-spec/v1.1.0/examples/nested-collection.json",
+      "type": "application/json"
+    }
+  ]
+}
diff --git a/spark/common/src/test/resources/datasource_stac/nested/nested-item.json b/spark/common/src/test/resources/datasource_stac/nested/nested-item.json
new file mode 100644
index 0000000000..1a26b4f400
--- /dev/null
+++ b/spark/common/src/test/resources/datasource_stac/nested/nested-item.json
@@ -0,0 +1,55 @@
+{
+  "id": "nested-item",
+  "type": "Feature",
+  "stac_version": "1.1.0",
+  "stac_extensions": [
+    "https://stac-extensions.github.io/eo/v2.0.0/schema.json",
+    "https://stac-extensions.github.io/projection/v2.0.0/schema.json",
+    "https://stac-extensions.github.io/view/v1.0.0/schema.json"
+  ],
+  "bbox": [
+    17.91173669923782,
+    10.3438851951615003,
+    17.95469614953714,
+    10.3690476620161975
+  ],
+  "geometry": {
+    "type": "Polygon",
+    "coordinates": [
+      [
+        [17.91173669923782, 10.3438851951615003],
+        [17.95469614953714, 10.3438851951615003],
+        [17.95469614953714, 10.3690476620161975],
+        [17.91173669923782, 10.3690476620161975],
+        [17.91173669923782, 10.3438851951615003]
+      ]
+    ]
+  },
+  "properties": {
+    "title": "Nested Item",
+    "description": "A sample STAC nested Item that includes examples of all common metadata",
+    "datetime": "2020-12-12T00:00:00Z",
+    "eo:cloud_cover": 1.2,
+    "proj:epsg": 32659,
+    "view:sun_elevation": 54.9,
+    "view:off_nadir": 3.8,
+    "view:sun_azimuth": 135.7
+  },
+  "assets": {
+    "visual": {
+      "href": "https://e84-earth-search-sentinel-data.s3/example/visual.tif",
+      "title": "Visual asset",
+      "type": "image/tiff; application=geotiff",
+      "roles": ["visual"]
+    }
+  },
+  "links": [
+    {
+      "rel": "collection",
+      "href": "./nested-collection.json",
+      "type": "application/json",
+      "title": "Nested Example Collection"
+    }
+  ]
+}
+
diff --git a/spark/common/src/test/resources/datasource_stac/nested/nested-items.json b/spark/common/src/test/resources/datasource_stac/nested/nested-items.json
new file mode 100644
index 0000000000..1c05033775
--- /dev/null
+++ b/spark/common/src/test/resources/datasource_stac/nested/nested-items.json
@@ -0,0 +1,110 @@
+{
+  "type": "FeatureCollection",
+  "stac_version": "1.1.0",
+  "stac_extensions": [
+    "https://stac-extensions.github.io/eo/v2.0.0/schema.json",
+    "https://stac-extensions.github.io/projection/v2.0.0/schema.json",
+    "https://stac-extensions.github.io/view/v1.0.0/schema.json"
+  ],
+  "type": "FeatureCollection",
+  "features": [
+    {
+      "stac_version": "1.1.0",
+      "id": "nested-item-1",
+      "type": "Feature",
+      "bbox": [
+        17.91173669923782,
+        10.3438851951615003,
+        17.95469614953714,
+        10.3690476620161975
+      ],
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [17.91173669923782, 10.3438851951615003],
+            [17.95469614953714, 10.3438851951615003],
+            [17.95469614953714, 10.3690476620161975],
+            [17.91173669923782, 10.3690476620161975],
+            [17.91173669923782, 10.3438851951615003]
+          ]
+        ]
+      },
+      "properties": {
+        "title": "Nested Item 1",
+        "description": "A sample STAC nested Item that includes examples of all common metadata",
+        "datetime": "2020-12-12T00:00:00Z",
+        "eo:cloud_cover": 1.2,
+        "proj:epsg": 32659,
+        "view:sun_elevation": 54.9,
+        "view:off_nadir": 3.8,
+        "view:sun_azimuth": 135.7
+      },
+      "assets": {
+        "visual": {
+          "href": "http://e84-earth-search-sentinel-data.s3/example/visual1.tif",
+          "title": "Visual asset 1",
+          "type": "image/tiff; application=geotiff",
+          "roles": ["visual"]
+        }
+      },
+      "links": [
+        {
+          "rel": "collection",
+          "href": "./nested-collection.json",
+          "type": "application/json",
+          "title": "Nested Example Collection"
+        }
+      ]
+    },
+    {
+      "stac_version": "1.1.0",
+      "id": "nested-item-2",
+      "type": "Feature",
+      "bbox": [
+        17.91173669923782,
+        10.3438851951615003,
+        17.95469614953714,
+        10.3690476620161975
+      ],
+      "geometry": {
+        "type": "Polygon",
+        "coordinates": [
+          [
+            [17.91173669923782, 10.3438851951615003],
+            [17.95469614953714, 10.3438851951615003],
+            [17.95469614953714, 10.3690476620161975],
+            [17.91173669923782, 10.3690476620161975],
+            [17.91173669923782, 10.3438851951615003]
+          ]
+        ]
+      },
+      "properties": {
+        "title": "Nested Item 2",
+        "description": "A sample STAC nested Item that includes examples of all common metadata",
+        "datetime": "2020-12-13T00:00:00Z",
+        "eo:cloud_cover": 1.2,
+        "proj:epsg": 32659,
+        "view:sun_elevation": 54.9,
+        "view:off_nadir": 3.8,
+        "view:sun_azimuth": 135.7
+      },
+      "assets": {
+        "visual": {
+          "href": "http://e84-earth-search-sentinel-data.s3/example/visual2.tif",
+          "title": "Visual asset 2",
+          "type": "image/tiff; application=geotiff",
+          "roles": ["visual"]
+        }
+      },
+      "links": [
+        {
+          "rel": "collection",
+          "href": "./nested-collection.json",
+          "type": "application/json",
+          "title": "Nested Example Collection"
+        }
+      ]
+    }
+  ]
+}
diff --git a/spark/common/src/test/resources/datasource_stac/simple-item.json b/spark/common/src/test/resources/datasource_stac/simple-item.json
new file mode 100644
index 0000000000..277b973462
--- /dev/null
+++ b/spark/common/src/test/resources/datasource_stac/simple-item.json
@@ -0,0 +1,83 @@
+{
+  "stac_version": "1.1.0",
+  "stac_extensions": [],
+  "type": "Feature",
+  "id": "20201211_223832_CS2",
+  "bbox": [
+    172.91173669923782,
+    1.3438851951615003,
+    172.95469614953714,
+    1.3690476620161975
+  ],
+  "geometry": {
+    "type": "Polygon",
+    "coordinates": [
+      [
+        [
+          172.91173669923782,
+          1.3438851951615003
+        ],
+        [
+          172.95469614953714,
+          1.3438851951615003
+        ],
+        [
+          172.95469614953714,
+          1.3690476620161975
+        ],
+        [
+          172.91173669923782,
+          1.3690476620161975
+        ],
+        [
+          172.91173669923782,
+          1.3438851951615003
+        ]
+      ]
+    ]
+  },
+  "properties": {
+    "title": "Simple Item ",
+    "description": "A sample STAC nested Item that includes examples of some metadata",
+    "datetime": "2020-12-11T22:38:32.125000Z"
+  },
+  "collection": "simple-collection",
+  "links": [
+    {
+      "rel": "collection",
+      "href": "./collection.json",
+      "type": "application/json",
+      "title": "Simple Example Collection"
+    },
+    {
+      "rel": "root",
+      "href": "./collection.json",
+      "type": "application/json",
+      "title": "Simple Example Collection"
+    },
+    {
+      "rel": "parent",
+      "href": "./collection.json",
+      "type": "application/json",
+      "title": "Simple Example Collection"
+    }
+  ],
+  "assets": {
+    "visual": {
+      "href": "https://storage.googleapis.com/open-cogs/stac-examples/20201211_223832_CS2.tif",
+      "type": "image/tiff; application=geotiff; profile=cloud-optimized",
+      "title": "3-Band Visual",
+      "roles": [
+        "visual"
+      ]
+    },
+    "thumbnail": {
+      "href": "https://storage.googleapis.com/open-cogs/stac-examples/20201211_223832_CS2.jpg",
+      "title": "Thumbnail",
+      "type": "image/jpeg",
+      "roles": [
+        "thumbnail"
+      ]
+    }
+  }
+}
diff --git a/spark/common/src/test/scala/org/apache/spark/sql/sedona_sql/io/stac/StacBatchTest.scala b/spark/common/src/test/scala/org/apache/spark/sql/sedona_sql/io/stac/StacBatchTest.scala
new file mode 100644
index 0000000000..0765b3950f
--- /dev/null
+++ b/spark/common/src/test/scala/org/apache/spark/sql/sedona_sql/io/stac/StacBatchTest.scala
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.spark.sql.sedona_sql.io.stac
+
+import org.apache.sedona.sql.TestBaseScala
+import org.apache.spark.sql.connector.read.InputPartition
+import org.apache.spark.sql.types.StructType
+
+import scala.io.Source
+import scala.collection.mutable
+
+class StacBatchTest extends TestBaseScala {
+
+  def loadJsonFromResource(resourceFilePath: String): String = {
+    Source.fromResource(resourceFilePath).getLines().mkString("\n")
+  }
+
+  def getAbsolutePathOfResource(resourceFilePath: String): String = {
... 1069 lines suppressed ...