Sentinel-2
Produits utilisés : s2_l2a
Mots-clés : données utilisées ; sentinel-2, ensembles de données ; sentinel-2
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.
Les capteurs satellites Sentinel-2A et Sentinel-2B sont regroupés sous un seul nom de produit : « “s2_l2a »
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
Remarque : pour une description détaillée des archives Sentinel-2 de DE Africa, consultez les « documents techniques Sentinel-2 » de DE Africa <https://docs.digitalearthafrica.org/en/latest/data_specs/Sentinel-2_Level-2A_specs.html>.
Description
Dans ce bloc-notes, nous allons charger les données Sentinel-2 en utilisant deux méthodes. Tout d’abord, nous utiliserons dc.load()
pour renvoyer une série temporelle d’images satellites. Ensuite, nous chargerons une série temporelle en utilisant la fonction load_ard()
, qui est une fonction wrapper autour du module dc.load. Cette fonction chargera toutes les images de Sentinel-2 et appliquera un masque de nuage. Le xarray.Dataset renvoyé contiendra des images prêtes à être analysées avec les pixels nuageux et invalides masqués.
Les sujets abordés comprennent :
Inspection du produit Sentinel-2 et des mesures disponibles dans le datacube
Utilisation de la fonction native « dc.load() » pour charger les données Sentinel-2
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... |
Liste des mesures
Nous pouvons examiner plus en détail les données disponibles pour Sentinel-2 en utilisant la fonctionnalité « list_measurements » de Datacube. Le tableau ci-dessous répertorie chacune des mesures disponibles dans les données.
[4]:
dc_measurements = dc.list_measurements()
dc_measurements.loc['s2_l2a']
[4]:
name | dtype | units | nodata | aliases | flags_definition | |
---|---|---|---|---|---|---|
measurement | ||||||
B01 | B01 | uint16 | 1 | 0.0 | [band_01, coastal_aerosol] | NaN |
B02 | B02 | uint16 | 1 | 0.0 | [band_02, blue] | NaN |
B03 | B03 | uint16 | 1 | 0.0 | [band_03, green] | NaN |
B04 | B04 | uint16 | 1 | 0.0 | [band_04, red] | NaN |
B05 | B05 | uint16 | 1 | 0.0 | [band_05, red_edge_1] | NaN |
B06 | B06 | uint16 | 1 | 0.0 | [band_06, red_edge_2] | NaN |
B07 | B07 | uint16 | 1 | 0.0 | [band_07, red_edge_3] | NaN |
B08 | B08 | uint16 | 1 | 0.0 | [band_08, nir, nir_1] | NaN |
B8A | B8A | uint16 | 1 | 0.0 | [band_8a, nir_narrow, nir_2] | NaN |
B09 | B09 | uint16 | 1 | 0.0 | [band_09, water_vapour] | NaN |
B11 | B11 | uint16 | 1 | 0.0 | [band_11, swir_1, swir_16] | NaN |
B12 | B12 | uint16 | 1 | 0.0 | [band_12, swir_2, swir_22] | NaN |
SCL | SCL | uint8 | 1 | 0.0 | [mask, qa] | {'qa': {'bits': [0, 1, 2, 3, 4, 5, 6, 7], 'val... |
AOT | AOT | uint16 | 1 | 0.0 | [aerosol_optical_thickness] | NaN |
WVP | WVP | uint16 | 1 | 0.0 | [scene_average_water_vapour] | 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 ».
Dans l’exemple ci-dessous, nous allons charger des données de Sentinel-2 depuis le Cap de Bonne-Espérance, en Afrique du Sud, en janvier 2018. Nous allons charger des données provenant de trois bandes spectrales de satellites, ainsi que des données de masquage des nuages ('SCL''`). En spécifiant ``output_crs='EPSG:6933'
et resolution=(-10, 10)
, nous demandons à Datacube de reprojeter nos données dans le système de référence de coordonnées d’Albers africain (CRS), avec des pixels de 10 x 10 m. Enfin, group_by='solar_day'
garantit que les images superposées prises à quelques secondes d’intervalle lors du passage du satellite sont combinées en un seul pas de temps dans les données.
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]:
# load data
ds = dc.load(product="s2_l2a",
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",
)
print(ds)
<xarray.Dataset>
Dimensions: (time: 7, y: 529, x: 580)
Coordinates:
* time (time) datetime64[ns] 2018-01-01T08:42:22 ... 2018-01-31T08:...
* y (y) float64 -4.126e+06 -4.126e+06 ... -4.131e+06 -4.131e+06
* x (x) float64 1.779e+06 1.779e+06 ... 1.785e+06 1.785e+06
spatial_ref int32 6933
Data variables:
red (time, y, x) uint16 10584 10648 10696 10696 ... 76 130 218 168
green (time, y, x) uint16 10896 10920 11080 11080 ... 122 138 284 256
blue (time, y, x) uint16 11672 11680 11680 11680 ... 107 142 244 298
SCL (time, y, x) uint8 9 9 9 9 9 9 9 9 9 9 ... 6 6 6 6 6 6 6 6 6 6
Attributes:
crs: EPSG:6933
grid_mapping: spatial_ref
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 ».
[6]:
rgb(ds, index=[1,2])

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.
[7]:
ds = load_ard(dc=dc,
products=["s2_l2a"],
measurements=['red', 'green', 'blue'],
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",
dtype='native'
)
print(ds)
Using pixel quality parameters for Sentinel 2
Finding datasets
s2_l2a
Applying pixel quality/cloud mask
Loading 7 time steps
/usr/local/lib/python3.10/dist-packages/rasterio/warp.py:344: NotGeoreferencedWarning: Dataset has no geotransform, gcps, or rpcs. The identity matrix will be returned.
_reproject(
<xarray.Dataset>
Dimensions: (time: 7, y: 529, x: 580)
Coordinates:
* time (time) datetime64[ns] 2018-01-01T08:42:22 ... 2018-01-31T08:...
* y (y) float64 -4.126e+06 -4.126e+06 ... -4.131e+06 -4.131e+06
* x (x) float64 1.779e+06 1.779e+06 ... 1.785e+06 1.785e+06
spatial_ref int32 6933
Data variables:
red (time, y, x) uint16 0 0 0 0 0 0 0 0 ... 69 67 95 76 130 218 168
green (time, y, x) uint16 0 0 0 0 0 0 0 ... 149 153 122 138 284 256
blue (time, y, x) uint16 0 0 0 0 0 0 0 ... 162 137 107 142 244 298
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.
[8]:
rgb(ds, index=[1,2])

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 :
[9]:
print(datacube.__version__)
1.8.15
Dernier test :
[10]:
from datetime import datetime
datetime.today().strftime('%Y-%m-%d')
[10]:
'2023-08-11'