Within the Copernicus Data Space Ecosystem there are two STAC catalogues available:
1. Production catalogue available here: https://radiantearth.github.io/stac-browser/#/external/catalogue.dataspace.copernicus.eu/stac
2. Development catalogue available here: https://radiantearth.github.io/stac-browser/#/external/pgstac.demo.cloudferro.com
Sentinel-2 attributes to be discussed on 29.04.2024
Sentinel-2 Odata attributes | data type | to be removed | target STAC extension | STAC Counterpart | Description | Example STAC | Example Odata |
mediaContentType | StringAttribute | X | X | X | application/octet-stream | ||
Id | StringAttribute | X | X | X | Odata internal id | X | 3e3b9d1a-18d5-43b8-83d8-564587ec3070 |
Name | StringAttribute | id (core STAC attribute) | s2:product_uri | product name. STAC "id" is without .SAFE | S2A_MSIL2A_20240308T100841_N0510_R022_T33UVR_20240308T143352.SAFE | S2B_MSIL2A_20240419T001429_N0510_R116_T56NNG_20240419T013152.SAFE | |
ContentType | StringAttribute | core STAC attribute | type | differs between Odata and STAC | image/jp2 | application/octet-stream | |
ContentLength | IntegerAttribute | file | file:size | in bytes | 720970508 | 720970508 | |
OriginDate | DateTimeOffsetAttribute | core STAC attribute | datetime | 2024-03-08T14:33:52.000000Z | 2024-04-19T02:13:20.000Z | ||
PublicationDate | DateTimeOffsetAttribute | core STAC attribute | published | 2024-03-08T14:33:52.000000Z | 2024-04-19T02:20:17.555Z | ||
ModificationDate | DateTimeOffsetAttribute | core STAC attribute | updated | 2024-03-08T14:33:52.000000Z | 2024-04-19T02:21:14.300Z | ||
Checksum | Checksum | file | file:checksum | Blake3/MD5 in Odata vs Multihash in STAC | |||
ContentDate.Start | DateTimeOffsetAttribute | core STAC attribute | start_datetime | the same as end_datetime | 2024-03-08T10:08:41.024Z | 2024-04-19T00:14:29.024Z | |
ContentDate.End | DateTimeOffsetAttribute | core STAC attribute | end_datetime | the same as start_datetime | 2024-03-08T10:08:41.024Z | 2024-04-19T00:14:29.024Z | |
Footprint | X | X | |||||
GeoFootprint | core STAC attribute | geometry | "geometry":{"type":"Polygon","coordinates":[[[13.588086,50.543732],[15.13777,50.552211],[15.134971,49.564676],[13.616763,49.556488],[13.588086,50.543732]]]} | "GeoFootprint":{"type":"Polygon","coordinates":[[[153.9866661847601,0.945453049017732],[153.9866661847601,0.945453049017732]]]} | |||
origin | StringAttribute | processing | processing:facility | ESA | |||
tileId | StringAttribute | mgrs | mgrs:utm_zone mgrs:grid_square mgrs:latitude_band | mgrs extention requires 3 fields where Odata just one | 33 | 56NNG | |
cloudCover | DoubleAttribute | eo | eo:cloud_cover | 15.0 | 14.583966 | ||
datastripId | StringAttribute | eof:s2_datastrip_id | s2:datastrip_id | S2A_OPER_MSI_L2A_DS_2APS_20240308T143352_S20240308T101546_N05.10 | S2B_OPER_MSI_L2A_DS_2BPS_20240419T013152_S20240419T001424_N05.10 | ||
orbitNumber | IntegerAttribute | sat | sat:absolute_orbit | 45493 | 37179 | ||
sourceProduct | StringAttribute | X | not needed as it is part of the tracebility and is redundant | S2B_OPER_MSI_L2A_TL_2BPS_20240419T013152_A037179_T56NNG_N05.10 S2B_OPER_MSI_L2A_DS_2BPS_20240419T013152_S20240419T001424_N05.10 | |||
processingDate | DateTimeOffsetAttribute | created | s2:generation_time | 2024-03-08T15:36:50.000Z | 2024-04-19T01:31:52+00:00 | ||
productGroupId | StringAttribute | eof:s2_datatake_id | s2:datatake_id | GS2A_20240308T100841_045493_N05.10 | GS2B_20240419T001429_037179_N05.10 | ||
operationalMode | StringAttribute | X | eof:s2_datatake_type | s2:datatake_type | INS-NOBS | INS-NOBS | |
processingLevel | StringAttribute | processing | processing:level | L2A | S2MSI2A | ||
processorVersion | StringAttribute | processing:version (PR) | s2:processing_baseline | 05.10 | 5.1 | ||
granuleIdentifier | StringAttribute | eof:s2_tile_id | s2:tile_id | S2A_OPER_MSI_L2A_TL_2APS_20240308T143352_A045493_T33UVR_N05.10 | S2B_OPER_MSI_L2A_TL_2BPS_20240419T013152_A037179_T56NNG_N05.10 | ||
platformShortName | StringAttribute | core STAC attribute | constellation | sentinel-2 | SENTINEL-2 | ||
instrumentShortName | StringAttribute | core STAC attribute | instruments | MSI | MSI | ||
relativeOrbitNumber | IntegerAttribute | sat | sat:relative_orbit | 22 | 116 | ||
sourceProductOriginDate | StringAttribute | X | X | 2024-04-19T02:13:20Z 2024-04-19T01:32:14Z | |||
platformSerialIdentifier | StringAttribute | core STAC attribute | platform | sentinel-2a | B | ||
productType | StringAttribute | to be moved to core STAC | s2:product_type | S2MSI2A | S2MSI2A | ||
beginningDateTime | DateTimeOffsetAttribute | core STAC attribute | start_datetime | 2024-03-08T14:33:52.000000Z | 2024-04-19T00:14:29.024Z | ||
endingDateTime | DateTimeOffsetAttribute | core STAC attribute | end_datetime | 2024-03-08T14:33:52.000000Z | 2024-04-19T00:14:29.024Z | ||
Sentinel-2 STAC extension attributes | data type | to be removed | target extension | PR | Description | Example | |
s2:reflectance_conversion_factor | number | Reflectance Conversion Factor | 1.01707999697991 | ||||
s2:water_percentage | number | Water Percentage | 10 | ||||
s2:snow_ice_percentage | number | Snow and Ice Percentage | 10 | ||||
s2:vegetation_percentage | number | Vegetation Percentage | 10 | ||||
s2:thin_cirrus_percentage | number | Thin Cirrus Percentage | 10 | ||||
s2:cloud_shadow_percentage | number | Cloud Shadow Percentage | 10 | ||||
s2:nodata_pixel_percentage | number | No Data Pixel Percentage | 1e-05 | ||||
s2:unclassified_percentage | number | Unclassified Percentage | 0 | ||||
s2:dark_features_percentage | number | Dark Features Percentage | 10 | ||||
s2:not_vegetated_percentage | number | Not Vegetated Percentage | 10 | ||||
s2:degraded_msi_data_percentage | number | Degraded MSI Data Percentage | 0.0206 | ||||
s2:high_proba_clouds_percentage | number | High Probability Clouds Percentage | 10 | ||||
s2:medium_proba_clouds_percentage | number | Medium Probability Clouds Percentage | 10 | ||||
s2:saturated_defective_pixel_percentage | number | Saturated Defective Pixel Percentage | 0 |
STAC Sentinel extensions
A priority should be to update the STAC Sentinel extensions to be less extensive at least. The plan is to find spaces in the general STAC community for these fields.
As a first step, we need to identify which fields are actually relevant to the general public.
General fields
For descriptions of the fields, please refer to the Sentinel extensions or the stactools-package implementations.
Field name | Data Type | Relevant to general public? | Potential future extension or field | Comments |
Multi-Mission | ||||
s1:processing_datetime s2:generation_time | date-time | Yes | processing:datetime (PR) created in assets | |
s1:datatake_id s2:datatake_id | string | Yes | externalIds? | |
s2:product_type s3:product_type s5p:product_type | string | No? | What's the difference between name and type? Can it be just one property, e.g. the name? | |
s3:product_name s5p:product_name | string | Yes? | ||
s1:product_timeliness s3:processing_timeliness | string | ? | Can we find a common set of values for this? | |
Sentinel-1 | ||||
s1:instrument_configuration_ID | string | No? | ||
s1:orbit_source | string | No? | ||
s1:product_identifier | string | ? | externalIds? | |
s1:resolution | string | No? | ||
s1:slice_number | string | No | ||
s1:total_slices | string | No | ||
Sentinel-2 | ||||
s2:tile_id | string | Yes? | externalIds? MGRS: tile_id ? | |
s2:product_uri | string | Yes? | as a normal STAC Link | |
s2:datastrip_id | string | Yes? | externalIds? | |
s2:datatake_type | string | ? | ||
s2:processing_baseline | string | Yes? | processing:version (PR) | |
s2:reflectance_conversion_factor | number | ? | ||
s2:degraded_msi_data_percentage | number | No? | ||
Sentinel-3 | ||||
s3:gsd | various | No? | gsd as a single value? | |
s3:lrm_mode | number | altm:ins_type | ||
s3:sar_mode | number | altm:ins_mode | ||
Sentinel-3 (Asset-level properties) | ||||
s3:spatial_resolution (in assets) | [number] | ? | raster:spatial_resolution as a single value? | |
s3:altimetry_bands (in assets) | [Altimetry Band Object] | ? | bands in STAC 1.1 | |
Sentinel-5 | ||||
s5p:processing_mode | string | ? | ||
s5p:collection_identifier | string | ? | ||
s5p:spatial_resolution | [number] | ? | raster:spatial_resolution as a single value? | |
Sentinel-5 Container Objects | ||||
s5p:aer_ai | Aer Ai Object | Flatten into top-level properties | None | |
s5p:aer_lh | Aer Lh Object | Flatten into top-level properties | None | |
s5p:ch4 | CH4 Object | Flatten into top-level properties | None | |
s5p:cloud | Cloud Object | Flatten into top-level properties | None | |
s5p:co | CO Object | Flatten into top-level properties | None | |
s5p:hcho | HCHO Object | Flatten into top-level properties | None | |
s5p:no2 | NO2 Object | Flatten into top-level properties | None | |
s5p:npbd3 | NPBD Object | Flatten into top-level properties | None | |
s5p:npbd6 | NPBD Object | Flatten into top-level properties | None | |
s5p:npbd7 | NPBD Object | Flatten into top-level properties | None | |
s5p:o3 | O2 Object | Flatten into top-level properties | None | |
s5p:o3_tcl | O3 TCL Object | Flatten into top-level properties | None | |
s5p:so2 | SO2 Object | Flatten into top-level properties | None | |
Sentinel 5P Container Object Fields These fields appear in at least one of the Sentinel-5 Container Objects above. | ||||
input_band | string / [string] | No? | ||
irradiance_accompanied | string | No? | ||
geolocation_grid_from_band | integer | No? | ||
cloud_mode | string | No? | ||
shape_ccd | [integer] | No? | ||
shape_csa | [integer] | No? | ||
stratosphere_start_datetime | string | ? | ||
stratosphere_end_datetime | string | ? | ||
troposphere_start_datetime | string | ? | ||
troposphere_end_datetime | string | ? | ||
input_orbits | [integer] | No? | ||
input_files | [string] | No? | ||
analysed_s5p_band | integer | No? | ||
VIIRS_band | [integer] | No? | ||
number_of_scaled_fov | integer | No? |
Percentages
Field name | Relevant to general public? | Potential future extension or field | Comments |
General and Other | |||
s3:land | ? | ||
s2:unclassified_percentage | ? | ||
Clouds | |||
s2:cloud_shadow_percentage | ? | ||
s2:high_proba_clouds_percentage | ? | ||
s2:medium_proba_clouds_percentage | ? | ||
s2:thin_cirrus_percentage | ? | ||
Water and Coastal | |||
s2:water_percentage | ? | ||
s3:closed_sea | ? | ||
s3:fresh_inland_water | ? | ||
s3:open_ocean | ? | ||
s3:saline_water | ? | ||
s3:tidal_region | ? | ||
s3:coastal | ? | ||
s3:continental_ice | ? | ||
Unusable | |||
s2:nodata_pixel_percentage | Yes | ||
s3:bright | ? | ||
s3:dubious_samples | ? | ||
s3:duplicated | ? | ||
s3:invalid | ? | ||
s3:out_of_range | ? | ||
s2:dark_features_percentage | ? | ||
s3:saturated s2:saturated_defective_pixel_percentage | ? | ||
Vegetation | |||
s2:vegetation_percentage | ? | ||
s2:not_vegetated_percentage | ? |
Depending on the asset structure, some percentages may be provided as a classification percentages as proposed in https://github.com/stac-extensions/classification/pull/49
Deprecated
For completeness, the following fields did exist in the past and are already deprecated in favor of existing STAC fields:
Field name | Data Type | New field name |
s2:granule_id | string | Removed |
s2:mgrs_tile | string | mgrs:* |
s2:mean_solar_zenith | number | view:sun_azimuth |
s2:mean_solar_azimuth | number | view:sun_elevation |
s2:snow_ice_percentage s3:snow_or_ice | number | eo:snow_cover |
s1:shape | [integer] | proj:shape |
s1:processing_level | string | processing:level |
s5p:shape | [integer] | proj:shape |
s3:shape (in assets) | [integer] | proj:shape |
CDSE querables attributes for Sentinel-2 L1C
CDSE STAC development roadmap
0. Simplify the geofootprint which is the largest attribute in the STAC response and slows down spatial querying (especially relevant for S-3 and S5P) ← to be provided by the Bureau d'Etude
1. Disable the overview displaying on items/assets level for selected collections e.g. Senitnel-3 where overviews generated in satellite projection is not displayed correctly.
2. [Done at the collection level] Implement the CEOS-ARD extension for Level-2 and Level-3 products https://github.com/stac-extensions/ceos-ard First would be the Sentinel-2 L2A (stac item example https://github.com/stac-extensions/ceos-ard/blob/main/examples/optical-sr/item.json), then Sentinel-3 and Sentinel-5P products. There is no CEOS ARD for radar data yet. Currently it is only for CEOS ARD PFSes (so surface reflectance and temperature, and aquatic reflectance)
3. Populate the development catalogue with the Sentinel-2 L1C and L2A products and make the online version of the catalogue publicly available for testing
4. Add new collections based on the on the stac-tools for Sentinel-1 (https://github.com/stactools-packages/sentinel1), Sentinel-3 (https://github.com/stactools-packages/sentinel3), Sentinel-5P (https://github.com/stactools-packages/sentinel5p) These collections will conform to the new Sentinel's extensions: https://github.com/stac-extensions/sentinel-1 , https://github.com/stac-extensions/sentinel-3 , https://github.com/stac-extensions/sentinel-5p
4. Update ASAP current "more generic" extensions: EO, SAR, etc. Add new Sentinel collections excluding the Sentinel specific extensions.
5. [In progress] Migrate some generic attributes from platform specific extension to more general extensions such as eo and sar. The rest of missions specific attributes (red crosses) should be maintained in the mission specific extensions not in the EOPF extension: https://github.com/CS-SI/eopf-stac-extension
7. Add to STAC Functionality of online/offline products. Add on demand product generation (url-s)
Missing STAC API functionalities to be potentially implemented in new STAC extensions
- Hiding entire extensions in the https://github.com/stac-api-extensions/fields This could mimic the Odata $expand option for advanced, ESA internal extensions.
- Hiding items and assets within a Collection by an AOI
- User levels and permissions to filter the Json response for general & expert CDSE users.
Modification of current STAC extensions:
- Add processing:version and processing:datetime: https://github.com/stac-extensions/processing/pull/32
- Deprecate s1:processing_datetime in favor of processing:datetime: https://github.com/stac-extensions/sentinel-1/pull/1
- Deprecate baseline and generation time: https://github.com/stac-extensions/sentinel-2/pull/14
- Deprecate snow/ice cover: https://github.com/stac-extensions/sentinel-2/pull/13
Various issues related to population of the STAC catalogue:
- NaN values in the Sentinel-2 viewing geometry: https://esa-cams.atlassian.net/browse/GSANOM-15086
Coordination desk reply:This product is absolutely normal with respect to the current IPF implementation. It is really small as only few pixels from the datastrip intersect this tile as you can see in the CDSE and QGIS screenshots attached (the rainbow effect visible for the TCI displayed in QGIS is normal, and due to the fact that the different spectral bands do not share exactly the same footprint).
A consequence of this very limited intersection between the tile footprint and the datastrip footprint is that we get only NaN viewing incidence values for several bands in the tile metadata, resulting in NaN mean viewing incidence values for these bands. This is because the grid on which the viewing incidence values are computed is very coarse (5 km x 5 km). Then this behaviour could happen sometimes for this kind of products (with limited intersection between the tile and the datastrip), and did happen before.