Sentinel-2 Collection 1 f2e266565f2241768016a5c1240b425e

Keywords: data used; sentinel-2, datasets; sentinel-2 Collection 1

Aperçu

Sentinel-2 est une mission d’observation de la Terre du programme européen Copernicus qui acquiert systématiquement des images optiques à haute résolution spatiale (jusqu’à 10 m pour certaines bandes). La mission repose sur une constellation de deux satellites identiques sur la même orbite, espacés de 180° pour une couverture et une transmission de données optimales. Ensemble, ils couvrent toutes les surfaces terrestres de la Terre, les grandes îles, les eaux intérieures et côtières tous les 3 à 5 jours.

Digital Earth Africa fournit des données de réflectance de surface « Sentinelle-2, niveau 2A <https://earth.esa.int/web/sentinel/technical-guides/sentinel-2-msi/level-2a-processing> » (traitées au niveau 2A à l’aide de l’algorithme Sen2Cor). La réflectance de surface fournit des ensembles de données optiques standardisés en utilisant des modèles physiques robustes pour corriger les variations des valeurs de radiance de l’image dues aux propriétés atmosphériques, ainsi qu’à la géométrie du soleil et du capteur, ce qui donne lieu à un produit Analysis Ready Data (ARD). L’ARD vous permet d’analyser les données de réflectance de surface telles quelles sans avoir à appliquer de corrections supplémentaires. La pile de grilles de réflectance de surface résultante est cohérente dans l’espace et le temps, ce qui est essentiel pour identifier et quantifier les changements environnementaux.

Digital Earth Africa Sentinel-2 Level-2A Surface Reflectance Collection 1 is the Sentinel-2 product processed for enhanced calibration and consistent time series between Sentinel-2A and Sentinel-2B.

Sentinel-2A and Sentinel-2B satellite sensors are stored together under a single product name: 's2_l2a_c1'

Détails importants :

  • Produit de réflectance de surface (Niveau 2A)

    • Plage de mise à l’échelle SR valide : « 1 - 10 000 (0 signifie aucune donnée) »

  • SCL utilisé comme bande de qualité de pixel

  • Période : 2017 – aujourd’hui

  • Résolution spatiale : 10, 20 et 60 m

  • Offset: -1000

Note: For a detailed description of DE Africa’s Sentinel-2 archive, see DE Africa’s Sentinel-2 technical docs and for Processing of S2 S2 Processing

Description

In this notebook we will load Sentinel-2 Collection 1 data using two methods. Firstly, we will use dc.load() to return a time series of satellite images. Secondly, we will load a time series using the load_ard() function, which is a wrapper function around the dc.load module. This function will load all the images from Sentinel-2 and apply a cloud mask. The returned xarray.Dataset will contain analysis ready images with the cloudy and invalid pixels masked out.

Les sujets abordés comprennent :

  1. Inspecting the Sentinel-2 Collection 1 product and measurements available in the datacube

  2. Utilisation de la fonction native « dc.load() » pour charger les données Sentinel-2

  3. Utilisation de la fonction wrapper load_ard() pour charger une série temporelle masquée en nuage et en qualité pixel


Commencer

Pour exécuter cette analyse, exécutez toutes les cellules du bloc-notes, en commençant par la cellule « Charger les packages ».

Charger des paquets

[1]:
import datacube

from deafrica_tools.datahandling import load_ard
from deafrica_tools.plotting import rgb

Se connecter au datacube

[2]:
dc = datacube.Datacube(app='Sentinel-2')

Produits et mesures disponibles

Liste des produits

Nous pouvons utiliser la fonctionnalité « list_products » de Datacube pour inspecter les produits Sentinel-2 de DE Africa disponibles dans le Datacube. Le tableau ci-dessous indique les noms des produits que nous utiliserons pour charger les données, une brève description des données et l’instrument satellite qui a acquis les données.

[3]:
# List Sentinel-2 products available in DE Africa
dc_products = dc.list_products()
display_columns = ['name', 'description']
dc_products[dc_products.name.str.contains(
    's2_l2a').fillna(
        False)][display_columns].set_index('name')
[3]:
description
name
s2_l2a Sentinel-2a and Sentinel-2b imagery, processed...
s2_l2a_c1 ESA Sentinel-2A and Sentinel-2B Collection 1 L...

Liste des mesures

We can further inspect the data available for the Sentinel-2 c1 using datacube’s list_measurements functionality. The table below lists each of the measurements available in the data.

[4]:
dc_measurements = dc.list_measurements()
dc_measurements.loc['s2_l2a_c1']
[4]:
name dtype units nodata aliases flags_definition add_offset scale_factor
measurement
coastal coastal uint16 1 0 [band_01, coastal_aerosol, B01] NaN -1000.0 NaN
blue blue uint16 1 0 [band_02, B02] NaN -1000.0 NaN
green green uint16 1 0 [band_03, B03] NaN -1000.0 NaN
red red uint16 1 0 [band_04, B04] NaN -1000.0 NaN
rededge1 rededge1 uint16 1 0 [band_05, red_edge_1, B05] NaN -1000.0 NaN
rededge2 rededge2 uint16 1 0 [band_06, red_edge_2, B06] NaN -1000.0 NaN
rededge3 rededge3 uint16 1 0 [band_07, red_edge_3, B07] NaN -1000.0 NaN
nir nir uint16 1 0 [band_08, nir_1, B08] NaN -1000.0 NaN
nir08 nir08 uint16 1 0 [band_8a, nir_narrow, nir_2, B8A] NaN -1000.0 NaN
nir09 nir09 uint16 1 0 [band_09, water_vapour, B09] NaN -1000.0 NaN
swir16 swir16 uint16 1 0 [band_11, swir_1, swir_16, B11] NaN -1000.0 NaN
swir22 swir22 uint16 1 0 [band_12, swir_2, swir_22, B12] NaN -1000.0 NaN
scl scl uint8 1 0 [mask, qa, SCL] {'qa': {'bits': [0, 1, 2, 3, 4, 5, 6, 7], 'val... NaN NaN
aot aot uint16 1 0 [aerosol_optical_thickness, AOT] NaN NaN NaN
wvp wvp uint16 1 0 [scene_average_water_vapour, WVP] NaN NaN NaN
cloud cloud uint8 1 0 [cloud_probabilities, CLD] NaN NaN NaN
snow snow uint8 1 0 [snow_probabilities, snow_ice, SNW] NaN NaN NaN

Charger les données Sentinel-2 à l’aide de dc.load()

Maintenant que nous savons quels produits et mesures sont disponibles pour les produits, nous pouvons charger des données à partir du datacube en utilisant « dc.load ».

In the example below, we will load data from Sentinel-2 Collection 1 from the Cape of Good Hope, SA in January 2018. We will load data from three spectral satellite bands, as well as cloud masking data ('SCL'). By specifying output_crs='EPSG:6933' and resolution=(-10, 10), we request that datacube reproject our data to the African Albers coordinate reference system (CRS), with 10 x 10 m pixels. Finally, group_by='solar_day' ensures that overlapping images taken within seconds of each other as the satellite passes over are combined into a single time step in the data.

Remarque : pour une discussion plus générale sur la manière de charger des données à l’aide du datacube, reportez-vous au bloc-notes « Introduction au chargement des données <../Beginners_guide/03_Loading_data.ipynb> ».

Remarque : sachez que le réglage de « résolution » sur la résolution la plus élevée disponible (c’est-à-dire « résolution = (-10, 10) ») sous-échantillonnera les bandes de résolution plus grossières de 20 m et 60 m, ce qui peut introduire des artéfacts indésirables dans votre analyse. Il est généralement recommandé de régler « résolution » pour qu’elle corresponde à la bande de résolution la plus basse analysée. Par exemple, si votre analyse utilise à la fois les bandes de résolution de 10 m et de 20 m, définissez « résolution = (-20, 20) ».

[5]:
#Store the measurements in the bands variable
bands = ['red', 'green', 'blue', 'scl']

# load data
ds_load = dc.load(product="s2_l2a_c1",
             measurements = bands,
             y=(-34.31, -34.36),
              x=(18.44, 18.50),
              time=("2018-01", "2018-01"),
             resolution=(-10, 10),
             output_crs='EPSG:6933',
             group_by="solar_day",
             )
[6]:
ds_load
[6]:
<xarray.Dataset> Size: 11MB
Dimensions:      (time: 5, y: 529, x: 580)
Coordinates:
  * time         (time) datetime64[ns] 40B 2018-01-01T08:49:43.522000 ... 201...
  * y            (y) float64 4kB -4.126e+06 -4.126e+06 ... -4.131e+06 -4.131e+06
  * x            (x) float64 5kB 1.779e+06 1.779e+06 ... 1.785e+06 1.785e+06
    spatial_ref  int32 4B 6933
Data variables:
    red          (time, y, x) uint16 3MB 10976 11016 11072 ... 1251 1254 1222
    green        (time, y, x) uint16 3MB 11080 11160 11264 ... 1276 1357 1311
    blue         (time, y, x) uint16 3MB 11656 11656 11680 ... 1290 1382 1394
    scl          (time, y, x) uint8 2MB 9 9 9 9 9 9 9 9 9 ... 6 6 6 6 6 6 6 6 6
Attributes:
    crs:           EPSG:6933
    grid_mapping:  spatial_ref

Note: When using the dc.load function, Sentinel-2 Collection 1 data includes an offset of -1000, which is applied to the values to store them as integers. To retrieve the correct surface values, this offset must be added back. The cell below demonstrates how to apply this correction.

[7]:
offset_value = dc_measurements.loc['s2_l2a_c1'].filter(items=bands, axis='index').add_offset.fillna(0)
ds_load = ds_load + offset_value
[8]:
ds_load
[8]:
<xarray.Dataset> Size: 49MB
Dimensions:      (time: 5, y: 529, x: 580)
Coordinates:
  * time         (time) datetime64[ns] 40B 2018-01-01T08:49:43.522000 ... 201...
  * y            (y) float64 4kB -4.126e+06 -4.126e+06 ... -4.131e+06 -4.131e+06
  * x            (x) float64 5kB 1.779e+06 1.779e+06 ... 1.785e+06 1.785e+06
    spatial_ref  int32 4B 6933
Data variables:
    red          (time, y, x) float64 12MB 9.976e+03 1.002e+04 ... 254.0 222.0
    green        (time, y, x) float64 12MB 1.008e+04 1.016e+04 ... 357.0 311.0
    blue         (time, y, x) float64 12MB 1.066e+04 1.066e+04 ... 382.0 394.0
    scl          (time, y, x) float64 12MB 9.0 9.0 9.0 9.0 ... 6.0 6.0 6.0 6.0

Tracé des données Sentinel-2

Nous pouvons tracer les données que nous avons chargées à l’aide de la fonction RVB. Par défaut, la fonction tracera les données sous forme d’image en vraies couleurs à l’aide des bandes « rouge », « verte » et « bleue ».

[9]:
rgb(ds_load, index=[1,2])
../../../_images/sandbox_notebooks_Datasets_Sentinel_2_20_0.png

Charger Sentinel-2 en utilisant load_ard

Cette fonction chargera les images de Sentinel-2 et appliquera un masque de qualité nuage/pixel. Le résultat est un ensemble de données prêt à être analysé, exempt de nuages, d’ombres de nuages et de données manquantes.

Vous pouvez trouver plus d’informations sur cette fonction dans le bloc-notes Using load ard.

Note: For load_ard function, the offset is already handled internally, so no additional correction is needed.

[10]:
ds = load_ard(dc=dc,
              products=["s2_l2a_c1"],
              measurements=['red', 'green', 'blue', 'SCL'],
              y=(-34.31, -34.36),
              x=(18.44, 18.50),
              time=("2018-01", "2018-01"),
              resolution=(-10, 10),
              output_crs='EPSG:6933',
              group_by="solar_day"
             )

ds
Using pixel quality parameters for Sentinel 2
Finding datasets
    s2_l2a_c1
Applying pixel quality/cloud mask
Re-scaling Sentinel-2 C1 data
Loading 5 time steps
/opt/venv/lib/python3.12/site-packages/rasterio/warp.py:387: NotGeoreferencedWarning: Dataset has no geotransform, gcps, or rpcs. The identity matrix will be returned.
  dest = _reproject(
[10]:
<xarray.Dataset> Size: 20MB
Dimensions:      (time: 5, y: 529, x: 580)
Coordinates:
  * time         (time) datetime64[ns] 40B 2018-01-01T08:49:43.522000 ... 201...
  * y            (y) float64 4kB -4.126e+06 -4.126e+06 ... -4.131e+06 -4.131e+06
  * x            (x) float64 5kB 1.779e+06 1.779e+06 ... 1.785e+06 1.785e+06
    spatial_ref  int32 4B 6933
Data variables:
    red          (time, y, x) float32 6MB nan nan nan nan ... 251.0 254.0 222.0
    green        (time, y, x) float32 6MB nan nan nan nan ... 276.0 357.0 311.0
    blue         (time, y, x) float32 6MB nan nan nan nan ... 290.0 382.0 394.0
    SCL          (time, y, x) uint8 2MB 9 9 9 9 9 9 9 9 9 ... 6 6 6 6 6 6 6 6 6
Attributes:
    crs:           EPSG:6933
    grid_mapping:  spatial_ref

Ci-dessous, nous traçons les données Sentinel-2 masquées par les nuages.

Remarque : dans l’image de gauche, notez que le masque de nuages Sentinel-2 (bande « SCL ») ne parvient pas à identifier une grande partie de la couverture nuageuse. Dans l’image de droite, une partie du littoral blanc et lumineux a été classée à tort comme nuage. Il s’agit de limitations connues du masque de nuages Sentinel-2, et les utilisateurs doivent en tenir compte lors de la réalisation d’analyses.

[11]:
rgb(ds, index=[1,2])
../../../_images/sandbox_notebooks_Datasets_Sentinel_2_24_0.png

Informations Complémentaires

Licence : Le code de ce carnet est sous licence Apache, version 2.0 <https://www.apache.org/licenses/LICENSE-2.0>. Les données de Digital Earth Africa sont sous licence Creative Commons par attribution 4.0 <https://creativecommons.org/licenses/by/4.0/>.

Contact : Si vous avez besoin d’aide, veuillez poster une question sur le canal Slack Open Data Cube <http://slack.opendatacube.org/>`__ ou sur le GIS Stack Exchange en utilisant la balise open-data-cube (vous pouvez consulter les questions posées précédemment ici). Si vous souhaitez signaler un problème avec ce bloc-notes, vous pouvez en déposer un sur Github.

Version de Datacube compatible :

[12]:
print(datacube.__version__)
1.8.20

Dernier test :

[13]:
from datetime import datetime
datetime.today().strftime('%Y-%m-%d')
[13]:
'2025-06-04'