Sentinel-3 OLCI Land#
Produits utilisés : s3_olci_l2_lfr
Mots-clés data used; sentinel-3,:index:datasets; sentinel-3
Aperçu#
Le produit Sentinel-3 OLCI de niveau 2 terrestre à pleine résolution (OL_2_LFR) fournit des observations corrigées des effets atmosphériques et des paramètres biophysiques dérivés de l’instrument de mesure de la couleur des océans et des terres (OLCI) à bord des satellites Sentinel-3A et 3B. Le produit fournit des mesures cohérentes de l’état de la végétation et des propriétés atmosphériques à une résolution de 300 m avec une fréquence de revisite d’environ un jour avec les deux satellites combinés, ce qui le rend précieux pour un large éventail d’applications environnementales et agricoles, notamment :
Surveillance de la santé et du stress de la végétation
Alerte précoce à la sécheresse et évaluations de la sécurité alimentaire
Modélisation des processus de surface terrestre et des écosystèmes
Analyse de l’état des cultures et études de la productivité agricole
Surveillance de la phénologie et de la dynamique saisonnière
Études climatiques et atmosphériques (via la vapeur d’eau intégrée)
Cartographie à long terme de la couverture terrestre et des changements
Les algorithmes et les approches d’extraction ont été développés par l’Agence spatiale européenne (ESA) et ses partenaires, assurant la continuité avec l’héritage de MERIS et améliorant les performances spectrales et radiométriques. La validation s’appuie sur des mesures au sol et des inter-comparaisons avec d’autres produits satellitaires. Plus d’informations sur le produit sont disponibles dans le guide de l’utilisateur terrestre d’OLCI et les documents de base théorique des algorithmes (ATBDs). ***
Description#
Ce cahier couvrira les sujets suivants :
Inspection des produits et des mesures disponibles dans le datacube
Chargement des données Sentinel-3 OLCI.
Tracer les résultats
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#
Importez les packages Python utilisés pour l’analyse.
[1]:
%matplotlib inline
import datacube
import geopandas as gpd
from odc.geo.geom import Geometry
from deafrica_tools.plotting import display_map
from deafrica_tools.areaofinterest import define_area
Se connecter au datacube#
Connectez-vous au datacube pour que nous puissions accéder aux données de DE Africa.
[2]:
dc = datacube.Datacube(app="Sentinel_3")
Liste des produits#
Nous pouvons utiliser la fonctionnalité list_products du datacube pour inspecter les produits de DE Africa disponibles. Le tableau ci-dessous montre les noms de 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]:
dc.list_products().loc[dc.list_products()['description'].str.contains('Sentinel-3')]
[3]:
| name | description | license | default_crs | default_resolution | |
|---|---|---|---|---|---|
| name | |||||
| s3_ol_2_wfr_nrt | s3_ol_2_wfr_nrt | Sentinel-3 Level 2 Water Full Resolution (WFR)... | CC-BY-4.0 | EPSG:4326 | (-0.003, 0.003) |
| s3_olci_l2_lfr | s3_olci_l2_lfr | Sentinel-3 OLCI L2 LAND | CC-BY-4.0 | EPSG:4326 | (-0.003, 0.003) |
Veuillez choisir le produit en spécifiant son nom, avec le produit s3_olci_l2_lfr
[4]:
product = "s3_olci_l2_lfr"
Liste des mesures#
Nous pouvons inspecter plus en détail les données disponibles pour le produit terrestre Sentinel-3 s3_olci_l2_lfr en utilisant la fonctionnalité list_measurements de datacube. Le tableau ci-dessous répertorie chacune des mesures disponibles dans les données.
[5]:
measurements = dc.list_measurements()
measurements.loc[product]
[5]:
| name | dtype | units | nodata | aliases | flags_definition | add_offset | scale_factor | |
|---|---|---|---|---|---|---|---|---|
| measurement | ||||||||
| GIFAPAR | GIFAPAR | uint16 | 1 | 65535 | [GI-FAPAR] | NaN | 0.0 | 10000.0 |
| IWV_L | IWV_L | uint8 | kg/m² | 255 | [water_vapour] | NaN | 0.0 | 1.0 |
| OTCI | OTCI | uint16 | 1 | 65535 | [chlorophyll] | NaN | 0.0 | 10000.0 |
| RC681 | RC681 | uint16 | 1 | 65535 | NaN | NaN | 0.0 | 10000.0 |
| RC865 | RC865 | uint16 | 1 | 65535 | NaN | NaN | 0.0 | 10000.0 |
| LQSF | LQSF | float32 | 1 | -1 | NaN | NaN | 0.0 | 1.0 |
| dataMask | dataMask | uint8 | 1 | 255 | [mask] | NaN | 0.0 | 1.0 |
Le produit Sentinel-3 Land comporte sept mesures :
Mesure |
Description |
Application |
|---|---|---|
GIFAPAR (Green Instantaneous FAPAR) |
Fraction du rayonnement photosynthétiquement actif absorbé (composante verte) au moment de l’observation. Indique l’absorption d’énergie photosynthétique. |
Surveillance de la productivité de la végétation, alerte précoce à la sécheresse, évaluation de l’état des cultures et des forêts. |
IWV_L (Vapeur d’eau intégrée – Terre) |
Teneur en vapeur d’eau intégrée sur la colonne au-dessus de chaque pixel. |
Modélisation du climat, études d’évapotranspiration, analyse du stress de la végétation. |
OTCI (Indice de chlorophylle terrestre OLCI) |
Indice sensible à la teneur en chlorophylle de la canopée dérivé des bandes spectrales OLCI. |
Détection du stress des cultures, études du fonctionnement de la canopée, surveillance de la dynamique de la biomasse. |
RC681 (Réflectance Rectifiée 681 nm) |
Réflectance de surface corrigée des effets atmosphériques dans la bande rouge (681 nm). |
Données d’entrée pour les indices de végétation et l’extraction de paramètres biophysiques. |
RC865 (Réflectance Rectifiée 865 nm) |
Réflectance de surface corrigée des effets atmosphériques dans la bande proche infrarouge (865 nm). |
Utilisé avec RC681 pour le GIFAPAR ; surveillance de la végétation et modélisation de l’activité photosynthétique. |
LQSF (Indicateurs de qualité des terres et de science) |
Informations de qualité et de classification par pixel (terre/eau/nuage/neige). |
Masquage des pixels invalides, filtrage des nuages/neige, garantissant une analyse robuste des séries temporelles. |
dataMask |
Masque binaire indiquant les observations valides vs invalides. |
Exclusion des valeurs manquantes/invalides, garantissant une analyse de données fiable. |
Paramètres d’analyse#
La cellule suivante définit les paramètres qui définissent la zone d’intérêt sur laquelle effectuer l’analyse. #### Sélectionner l’emplacement Pour définir la zone d’intérêt, deux méthodes sont disponibles :
En spécifiant la latitude, la longitude et la zone tampon, ou en séparant les zones tampons de latitude et de longitude, cette méthode vous permet de définir une zone d’intérêt autour d’un point central. Vous pouvez saisir la latitude centrale, la longitude centrale et une valeur de zone tampon en degrés pour créer une zone carrée autour du point central. Par exemple, « lat = 10.338 », « lon = -1.055 » et « buffer = 0.1 » sélectionneront une zone avec un rayon de 0,1 degré carré autour du point avec les coordonnées « (10.338, -1.055) ».
Vous pouvez également fournir des valeurs de tampon distinctes pour la latitude et la longitude d’une zone rectangulaire. Par exemple, « lat = 10.338 », « lon = -1.055 » et « lat_buffer = 0.1 » et « lon_buffer = 0.08 » sélectionneront une zone rectangulaire s’étendant sur 0,1 degré au nord et au sud et 0,08 degré à l’est et à l’ouest à partir du point « (10.338, -1.055) ».
Pour des temps de chargement raisonnables, définissez la mémoire tampon sur « 0,1 » ou moins.
By uploading a polygon as a
GeoJSON or Esri Shapefile. If you choose this option, you will need to upload the geojson or ESRI shapefile into the Sandbox using Upload Files button
in the top left corner of the Jupyter Notebook interface. ESRI shapefiles must be uploaded with all the related files (.cpg, .dbf, .shp, .shx). Once uploaded, you can use the shapefile or geojson to define the area of interest. Remember to update the code to call the file you have uploaded.
Pour utiliser l’une de ces méthodes, vous pouvez décommenter la ligne de code concernée et commenter l’autre. Pour commenter une ligne, ajoutez le symbole "#" avant le code que vous souhaitez commenter. Par défaut, la première option qui définit l’emplacement à l’aide de la latitude, de la longitude et du tampon est utilisée.
Si vous exécutez le notebook pour la première fois, conservez les paramètres par défaut ci-dessous. Cela démontrera le fonctionnement de l’analyse et fournira des résultats significatifs. L’exemple couvre une ceinture centrale du bassin du Congo (forêt ombrophile de plaine sempervirente) en République démocratique du Congo (RDC), dans la partie nord-est du pays — au sein de la province de la Tshopo. Cette région se caractérise par une couverture nuageuse fréquente et dense, de sorte qu’elle est souvent difficile à surveiller efficacement avec des missions optiques ayant une fréquence de revisite plus faible, telles que les missions Sentinel et Landsat.
Pour exécuter le notebook pour une zone différente, assurez-vous que les données Sentinel-3 OLCI Land sont disponibles pour la zone choisie à l’aide de DEAfrica Explorer.
[6]:
# Method 1: Specify the latitude, longitude, and buffer)
aoi = define_area(lat=1.066, lon=26.455, buffer=0.9)
# Method 2: Use a polygon as a GeoJSON or Esri Shapefile.
# aoi = define_area(vector_path='aoi.shp')
#Create a geopolygon and geodataframe of the area of interest
geopolygon = Geometry(aoi["features"][0]["geometry"], crs="epsg:4326")
geopolygon_gdf = gpd.GeoDataFrame(geometry=[geopolygon], crs=geopolygon.crs)
# Get the latitude and longitude range of the geopolygon
lat_range = (geopolygon_gdf.total_bounds[1], geopolygon_gdf.total_bounds[3])
lon_range = (geopolygon_gdf.total_bounds[0], geopolygon_gdf.total_bounds[2])
[7]:
display_map(x=lon_range, y=lat_range)
[7]:
Charger le jeu de données Sentinel-3 à l’aide de dc.load()#
Maintenant que nous savons quels produits et mesures sont disponibles pour le produit, nous pouvons charger les données à partir du datacube à l’aide de dc.load. Nous chargerons les données des bandes spectrales des satellites. En spécifiant output_crs='EPSG:4326' et resolution=(-0.003, -0.003), nous demandons au datacube de reprojeter nos données dans le système de coordonnées géographiques mondial (CRS), avec des pixels de 300 x 300 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. Nous pouvons voir que la requête renvoie huit pas de temps puisque nous avons interrogé les huit premiers jours d’avril 2025.
[8]:
query = {
'x': (lon_range),
'y': (lat_range),
'time':('2025-04-01', '2025-04-30'),
'output_crs': 'EPSG:4326',
'resolution': (-0.003, 0.003)}
ds_S3 = dc.load(product=product,
group_by="solar_day",
**query)
ds_S3
[8]:
<xarray.Dataset> Size: 152MB
Dimensions: (time: 30, latitude: 601, longitude: 601)
Coordinates:
* time (time) datetime64[ns] 240B 2025-04-01T04:00:49 ... 2025-04-3...
* latitude (latitude) float64 5kB 1.966 1.964 1.96 ... 0.1695 0.1665
* longitude (longitude) float64 5kB 25.56 25.56 25.56 ... 27.35 27.35 27.36
spatial_ref int32 4B 4326
Data variables:
GIFAPAR (time, latitude, longitude) uint16 22MB 0 6732 6969 ... 0 0 0
IWV_L (time, latitude, longitude) uint8 11MB 0 44 43 43 ... 0 0 0 0
OTCI (time, latitude, longitude) uint16 22MB 0 24311 24823 ... 0 0 0
RC681 (time, latitude, longitude) uint16 22MB 0 383 372 376 ... 0 0 0
RC865 (time, latitude, longitude) uint16 22MB 0 3549 3667 ... 0 0 0
LQSF (time, latitude, longitude) float32 43MB 8.0 1.678e+07 ... 8.0
dataMask (time, latitude, longitude) uint8 11MB 0 1 1 1 1 ... 1 0 0 0 0
Attributes:
crs: EPSG:4326
grid_mapping: spatial_ref⚠️ Note : Certaines bandes terrestres de Sentinel-3 OLCI sont stockées sous forme d’entiers avec un facteur d’échelle (ex. 0,0001) ou un décalage (ex. 1000) appliqué. Cette mise à l’échelle est utilisée pour stocker efficacement les valeurs au format entier. Pour obtenir les valeurs de surface correctes, l’échelle ou le décalage doit être inversé. L’exemple ci-dessous montre comment appliquer cette correction. Dans ce cas, un facteur d’échelle de 10 000 s’applique à plusieurs mesures de Sentinel-3 comme indiqué dans la sortie de la section Liste des mesures ci-dessus. Nous pouvons soit diviser les valeurs par 10 000, soit les multiplier par 0,0001, comme ci-dessous.
Masquage#
Avant la visualisation, nous utilisons la bande dataMask pour masquer les valeurs affectées par les nuages ou d’autres problèmes. Le code ci-dessous conserve les données pour les pixels où la valeur du masque de données est de 1.
[9]:
ds_S3 = ds_S3.where(ds_S3.dataMask == 1)
La cellule ci-dessous visualise la fraction de rayonnement photosynthétiquement actif absorbé (composante verte) au moment de l’observation, qui représente l’absorption d’énergie photosynthétique. Les valeurs varient de 0 à 1.
[10]:
(ds_S3['GIFAPAR'].isel(time=[0, 2, 9, 15])*0.0001).plot(robust=True, col="time", col_wrap=4);
La cellule ci-dessous visualise l’indice de chlorophylle terrestre OLCI (OTCI), un indice sensible à la teneur en chlorophylle de la canopée dérivé des bandes spectrales OLCI. Il fournit des informations sur la santé de la végétation et l’activité photosynthétique.
[11]:
(ds_S3.isel(time=[0, 2, 9, 15])['OTCI']*0.0001).plot(robust=True, col="time", col_wrap=4)
[11]:
<xarray.plot.facetgrid.FacetGrid at 0x7fa00b306d80>
La cellule ci-dessous visualise la réflectance de surface corrigée des effets atmosphériques dans la bande rouge (681 nm). Cette mesure est utilisée dans les indices de végétation et l’extraction de paramètres biophysiques,
[12]:
(ds_S3.isel(time=[0, 2, 9, 15])['RC681']*0.0001).plot(robust=True, col="time", col_wrap=4)
[12]:
<xarray.plot.facetgrid.FacetGrid at 0x7fa0011924e0>
La cellule ci-dessous visualise la réflectance de surface corrigée des effets atmosphériques dans la bande proche infrarouge (865 nm). Cette mesure, utilisée aux côtés de la bande rouge (681 nm), soutient la surveillance de la végétation et la modélisation de l’activité photosynthétique,
[13]:
(ds_S3.isel(time=[0, 2, 9, 15])['RC865']*0.0001).plot(robust=True, col="time", col_wrap=4)
[13]:
<xarray.plot.facetgrid.FacetGrid at 0x7fa00b349f70>
La cellule ci-dessous visualise la teneur en vapeur d’eau intégrée sur la colonne au-dessus de chaque pixel. Ce paramètre représente la quantité totale de vapeur d’eau dans l’atmosphère, exprimée en kg/m².
[14]:
(ds_S3.isel(time=[0, 2, 9, 15])['IWV_L']).plot(robust=True, col="time", col_wrap=4)
[14]:
<xarray.plot.facetgrid.FacetGrid at 0x7fa00b4be180>
Informations Complémentaires#
Licence Le code de ce notebook 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 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 DE Africa <https://digitalearthafrica.slack.com/> ou sur le GIS Stack Exchange <https://gis.stackexchange.com/questions/ask?tags=open-data-cube> en utilisant la balise open-data-cube (vous pouvez consulter les questions posées précédemment `ici <https://gis.stackexchange.com/questions/tagged/open-data-
Si vous souhaitez signaler un problème avec ce notebook, vous pouvez en déposer un sur Github.
Version de Datacube compatible
[15]:
print(datacube.__version__)
1.8.20
Dernier test :
[16]:
from datetime import datetime
datetime.today().strftime('%Y-%m-%d')
[16]:
'2025-09-16'