Sentinel-5P Tropomi Niveau-2#

Mots-clés données utilisées ; sentinel-5P,:index:jeux de données ; sentinel-5P

Aperçu#

Sentinel-5P est un satellite d’observation de la Terre lancé en 2017 et exploité par l’Agence spatiale européenne dans le cadre du programme Copernicus. Il a été développé en tant que mission précurseur de la future mission Sentinel-5 afin d’assurer la continuité des observations atmosphériques à la suite de missions européennes antérieures.

L’objectif principal de Sentinel-5P est de fournir des mesures globales en temps quasi réel de la composition atmosphérique et de la qualité de l’air. Ses données soutiennent la recherche scientifique, la surveillance environnementale et la mise en œuvre de politiques liées à la pollution de l’air, au changement climatique, à l’appauvrissement de la couche d’ozone et à la santé humaine. La mission produit des ensembles de données qui permettent aux scientifiques de suivre les polluants et les gaz traces spatialement et temporellement à travers le globe.

Sentinel-5P transporte un seul instrument — TROPOMI (Tropospheric Monitoring Instrument) — qui mesure le rayonnement solaire réfléchi par l’atmosphère et la surface de la Terre dans les bandes spectrales ultraviolettes, visibles, proches infrarouges et infrarouges à ondes courtes. À partir de ces mesures, les valeurs de concentration de divers gaz traces et les propriétés des aérosols sont extraites. Par rapport aux instruments précédents, TROPOMI offre une résolution spatiale sans précédent, permettant la détection de sources d’émission telles que la pollution urbaine, le brûlage de la biomasse et les activités industrielles.

Les produits de niveau 2 sont des ensembles de données géophysiques dérivés des luminances mesurées et convertis en variables physiquement significatives telles que les concentrations de gaz et les propriétés des aérosols. Chaque produit traite d’une composante atmosphérique spécifique liée à la qualité de l’air, à la météo et aux processus climatiques.

Les produits Sentinel-5P TROPOMI de niveau 2 et leurs fonctions#

  1. L’indice d’aérosol UV (UVAI) détecte la présence de particules d’aérosol absorbant la lumière telles que la fumée, la poussière et les cendres volcaniques dans l’atmosphère, contribuant ainsi à surveiller la pollution de l’air et le transport transfrontalier d’aérosols.

  2. Le taux de mélange moyen par colonne du méthane (CH₄) mesure la concentration moyenne de méthane dans l’atmosphère et est utilisé pour identifier les principales sources d’émission de gaz à effet de serre et soutenir la recherche sur le changement climatique.

  3. La fraction nuageuse quantifie la proportion de chaque pixel satellite couvert par des nuages, ce qui est essentiel pour corriger les extractions de gaz traces et analyser les schémas de couverture nuageuse.

  4. L’albédo des nuages représente la quantité de lumière solaire réfléchie par les nuages et aide à évaluer leur effet de refroidissement ou de réchauffement sur le système climatique de la Terre.

  5. La pression au sommet des nuages indique la hauteur des nuages et est utilisée pour étudier la structure atmosphérique, les systèmes météorologiques et les impacts radiatifs des nuages.

  6. La colonne totale de monoxyde de carbone (CO) mesure la concentration de CO dans l’atmosphère, servant d’indicateur des processus de combustion tels que le brûlage de la biomasse, l’activité industrielle et les émissions du trafic.

  7. La colonne totale de formaldéhyde (HCHO) est utilisée pour détecter les émissions de la végétation et des activités humaines et sert d’indicateur des composés organiques volatils (COV) qui contribuent à la formation d’ozone.

  8. La colonne totale de dioxyde d’azote (NO₂) mesure le NO₂ atmosphérique total, y compris les contributions stratosphériques et de surface, et est utilisée dans l’évaluation de la pollution et les études de chimie atmosphérique.

  9. Le dioxyde d’azote troposphérique (NO₂) isole les niveaux de NO₂ au niveau de la surface qui reflètent directement la pollution urbaine provenant des véhicules, des centrales électriques et des industries.

  10. La colonne totale d’ozone (O₃) mesure l’épaisseur totale de la couche d’ozone et est essentielle pour surveiller l’exposition au rayonnement ultraviolet et la santé atmosphérique.

  11. La colonne totale de dioxyde de soufre (SO₂) détecte les traces de SO₂ émises par les centrales électriques et les volcans et est utilisée dans la réglementation de la qualité de l’air et la surveillance des catastrophes.

Ce notebook montre comment chaque produit Sentinel-5P TROPOMI peut être accédé et chargé via la plateforme Digital Earth Africa (DE Africa).


Description#

Ce cahier couvrira les sujets suivants :

  1. Inspection des produits et des mesures disponibles dans le datacube

  2. Chargement des jeux de données Sentinel-5P_*.

  3. 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 numpy as np
import xarray as xr
import pandas as pd
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_5P")

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-5')]
[3]:
name description license default_crs default_resolution
name
s5p_tropomi_l2_aer_ai s5p_tropomi_l2_aer_ai Sentinel-5p TROPOMI Level 2 UV Aerosol Index. CC-BY-4.0 EPSG:4326 Resolution(x=0.01, y=-0.01)
s5p_tropomi_l2_ch4 s5p_tropomi_l2_ch4 Sentinel-5P TROPOMI Level 2 Methane (CH4) colu... CC-BY-4.0 EPSG:4326 Resolution(x=0.01, y=-0.01)
s5p_tropomi_l2_cloud s5p_tropomi_l2_cloud Sentinel-5p TROPOMI Level 2 Cloud fraction, al... CC-BY-4.0 EPSG:4326 Resolution(x=0.01, y=-0.01)
s5p_tropomi_l2_co s5p_tropomi_l2_co Sentinel-5p TROPOMI Level 2 Carbon Monoxide (C... CC-BY-4.0 EPSG:4326 Resolution(x=0.01, y=-0.01)
s5p_tropomi_l2_hcho s5p_tropomi_l2_hcho Sentinel-5p TROPOMI Level 2 Formaldehyde (HCHO... CC-BY-4.0 EPSG:4326 Resolution(x=0.01, y=-0.01)
s5p_tropomi_l2_no2 s5p_tropomi_l2_no2 Sentinel-5p TROPOMI Level 2 Nitrogen Dioxide (... CC-BY-4.0 EPSG:4326 Resolution(x=0.01, y=-0.01)
s5p_tropomi_l2_o3 s5p_tropomi_l2_o3 Sentinel-5p TROPOMI Level 2 Ozone (O3) total c... CC-BY-4.0 EPSG:4326 Resolution(x=0.01, y=-0.01)
s5p_tropomi_l2_so2 s5p_tropomi_l2_so2 Sentinel-5p TROPOMI Level 2 Sulfur Dioxide (SO... CC-BY-4.0 EPSG:4326 Resolution(x=0.01, y=-0.01)

Liste des mesures#

Nous pouvons inspecter plus en détail les données disponibles pour le produit terrestre Sentinel-5P à l’aide de la fonctionnalité list_measurements du datacube.

Pour récupérer les informations de mesure d’un produit listé ci-dessus, veuillez sélectionner le produit en spécifiant son nom. Par exemple, nous utiliserons s5p_tropomi_l2_aer_ai.

[4]:
product = "s5p_tropomi_l2_so2"

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
SO2 SO2 float32 mol/m^2 -9999.0 NaN NaN 0.0 1.0
dataMask dataMask uint8 1 255.0 NaN NaN 0.0 1.0

Résumé des mesures#

Les produits Sentinel-5P TROPOMI Niveau-2 sont fournis en tant que variables purement géophysiques, ce qui signifie que les valeurs sont déjà livrées dans des unités scientifiques standard telles que mol/m², Pascals, Parties par milliard ou des indices sans unité, sans nécessiter de facteurs d’échelle ou de décalages supplémentaires. Chaque produit représente une propriété atmosphérique différente, de sorte que les plages numériques attendues varient en fonction de la quantité physique mesurée — par exemple, les colonnes totales de gaz traces tombent généralement dans de faibles concentrations molaires, tandis que les variables relatives aux nuages sont rapportées sous forme de fractions sans dimension entre 0 et 1. Comprendre ces unités et leurs plages de valeurs typiques est important pour interpréter l’amplitude et le comportement de chaque paramètre atmosphérique, identifier des événements anormaux et effectuer des comparaisons régionales ou temporelles cohérentes. Le tableau ci-dessous résume les unités, les plages de données typiques et les exigences en matière d’échelle/décalage pour tous les produits Sentinel-5P Niveau-2 utilisés dans cette étude.

Produit

Unités

Gamme typique

Échelle/Décalage

Indice d’aérosol UV (UVAI)

Sans unité

-1 à 5

Non

Taux de mélange moyen par colonne du méthane (CH₄)

Parties par milliard (PPB)

1600 à 2000

Non

Fraction nuageuse

Sans unité (0–1)

0 à 1

Non

Albédo des nuages

Sans unité (0–1)

0,05 à 0,8

Non

Pression au sommet des nuages

Pascals

1000 à 110000

Non

Colonne totale de monoxyde de carbone (CO)

mol/m²

0 à 0,1

Non

Colonne totale de formaldéhyde (HCHO)

mol/m²

0 à 0,001

Non

Colonne totale de dioxyde d’azote (NO₂)

mol/m²

0 à 0,0003

Non

Colonne de NO₂ troposphérique

mol/m²

0 à 0,0003

Non

Colonne totale d’ozone (O₃)

mol/m²

0 à 0,36

Non

Colonne totale de dioxyde de soufre (SO₂)

mol/m²

0 à 0,01

Non

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 :

  1. 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.

  2. 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 123056bdb3884d87a38fa662f1742b0f 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 bloc-notes pour la première fois, conservez les paramètres par défaut ci-dessous. Cela permettra de démontrer le fonctionnement de l’analyse et de fournir des résultats significatifs.

L’exemple se concentre sur le Highveld de Mpumalanga en Afrique du Sud. Il combine des émissions industrielles massives, une production d’électricité intense, des zones minières riches en méthane, le brûlage de la biomasse, de la poussière et la production d’ozone photochimique — ce qui signifie que chaque gaz atmosphérique mesuré par S5P apparaît avec des signaux forts et clairs. La région reste observable pendant la majeure partie de l’année, la période d’août à octobre offrant le scénario multi-gaz le plus riche. Le Highveld de Mpumalanga sert donc de site de démonstration idéal pour les forces des produits de niveau 2 de Sentinel-5P dans des conditions environnementales complexes et dynamiques.

Pour exécuter le notebook pour une zone différente, assurez-vous que les données TROPOMI de Sentinel-5 Precursor sont disponibles pour la zone choisie en utilisant le DEAfrica Explorer.

[6]:
# Method 1: Specify the latitude, longitude, and buffer)
aoi = define_area(lat=-25.6, lon=29.3, buffer=1)
# 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]:
Make this Notebook Trusted to load map: File -> Trust Notebook

Accéder aux données Sentinel 5P via DE Africa#

Maintenant que nous savons quels produits et mesures sont disponibles pour le produit, nous pouvons charger les données depuis le datacube en utilisant dc.load. Nous chargerons les données des bandes spectrales du satellite. En spécifiant output_crs='EPSG:4326' et resolution=(-0.01, 0.01), nous chargeons les données dans leur projection et résolution d’origine. 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 une seule étape temporelle dans les données. La requête définie ci-dessous sera utilisée pour tous les autres produits.

[8]:
time_start = '2023-07-18'
time_end = '2023-07-19'
query = {
    'x': (lon_range),
    'y': (lat_range),
    'time':(time_start, time_end),
    'output_crs': 'EPSG:4326',
    'resolution': (-0.01, 0.01)}

1. Indice d’aérosol UV Sentinel-5P TROPOMI Niveau 2#

L’indice d’aérosol UV Sentinel-5P TROPOMI de niveau 2 (UVAI) est un indicateur dérivé par satellite du TROPOMI de Sentinel-5 Precursor qui met en évidence la présence d’aérosols absorbant la lumière (tels que la poussière du désert, la fumée des incendies de forêt et les cendres volcaniques) dans l’atmosphère en comparant le rayonnement ultraviolet mesuré avec ce qui serait attendu d’une atmosphère moléculaire claire. L’UVAI est utilisé pour détecter et suivre rapidement les panaches d’aérosols, soutenir la surveillance de la qualité de l’air et la réponse aux risques (par exemple, tempêtes de poussière et éruptions), évaluer le transport transfrontalier de la pollution et étudier l’influence des aérosols sur le bilan radiatif et le climat de la Terre.

[9]:
ds_aer_ai = dc.load(product='s5p_tropomi_l2_aer_ai',
                group_by="solar_day",
                **query)

ds_aer_ai
[9]:
<xarray.Dataset> Size: 723kB
Dimensions:         (time: 2, latitude: 200, longitude: 200)
Coordinates:
  * time            (time) datetime64[ns] 16B 2023-07-18T05:57:16.500000 2023...
  * latitude        (latitude) float64 2kB -24.61 -24.62 ... -26.59 -26.59
  * longitude       (longitude) float64 2kB 28.3 28.32 28.32 ... 30.29 30.29
    spatial_ref     int32 4B 4326
Data variables:
    AER_AI_340_380  (time, latitude, longitude) float32 320kB -0.1253 ... -0....
    AER_AI_354_388  (time, latitude, longitude) float32 320kB -0.1178 ... 0.0...
    dataMask        (time, latitude, longitude) uint8 80kB 1 1 1 1 1 ... 1 1 1 1
Attributes:
    crs:           EPSG:4326
    grid_mapping:  spatial_ref

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.

[10]:
ds_aer_ai = ds_aer_ai.where(ds_aer_ai.dataMask == 1)

Visualisation de la bande#

Les paires de longueurs d’onde 340–380 nm (AER_AI_340_380) et 354–388 nm (AER_AI_354_388) sont les deux combinaisons spectrales utilisées par Sentinel-5P/TROPOMI pour calculer l’indice d’aérosol UV. La paire 340–380 nm est une configuration héritée alignée sur des instruments antérieurs tels qu’OMI, ce qui la rend utile pour la continuité historique et l’analyse des tendances des aérosols à long terme. En revanche, la paire 354–388 nm est optimisée pour les caractéristiques radiométriques de TROPOMI et produit des récupérations UVAI plus stables et moins bruitées, en particulier au-dessus de surfaces brillantes comme les déserts, ce qui en fait le produit opérationnel recommandé pour la plupart des applications. En substance, les deux paires de longueurs d’onde détectent les aérosols absorbants, mais le 354–388 nm est mieux adapté à l’étalonnage de TROPOMI et offre de meilleures performances pour un usage scientifique et de surveillance. La cellule ci-dessous visualise l’une des bandes disponibles ; la bande AER_AI_354_388 sera utilisée. Il s’agit du produit d’indice d’aérosol UV recommandé pour Sentinel-5P TROPOMI car il est optimisé pour les bandes spectrales de l’instrument et fournit une surveillance des aérosols plus stable et prise en charge opérationnellement. La bande AER_AI_340_380 est principalement conservée pour la comparaison historique avec d’anciennes missions satellitaires.

[11]:
ds_aer_ai['AER_AI_354_388'].plot(robust=True, col="time")
[11]:
<xarray.plot.facetgrid.FacetGrid at 0x7f6125d9be90>
../../../_images/sandbox_notebooks_Datasets_Sentinel_5P_28_1.png

2. Sentinel-5P TROPOMI Niveau-2 Taux de mélange moyen par colonne du méthane (CH₄)#

Le taux de mélange moyen par colonne du méthane (CH₄) de Sentinel-5P TROPOMI Niveau-2 est un produit satellitaire issu du Sentinel-5 Precursor’s TROPOMI qui mesure la quantité moyenne de méthane dans l’atmosphère en analysant la lumière solaire infrarouge à ondes courtes réfléchie. Il est utilisé pour détecter et cartographier les points chauds d’émission de méthane, quantifier les sources régionales provenant des opérations pétrolières et gazières, de l’agriculture et des zones humides, surveiller les tendances d’un gaz à effet de serre majeur et soutenir les politiques climatiques et les efforts d’atténuation.

[12]:
ds_l2_ch4 = dc.load(product='s5p_tropomi_l2_ch4',
                    group_by="solar_day",
                    **query)

ds_l2_ch4
[12]:
<xarray.Dataset> Size: 403kB
Dimensions:      (time: 2, latitude: 200, longitude: 200)
Coordinates:
  * time         (time) datetime64[ns] 16B 2023-07-18T05:57:16.500000 2023-07...
  * latitude     (latitude) float64 2kB -24.61 -24.62 -24.62 ... -26.59 -26.59
  * longitude    (longitude) float64 2kB 28.3 28.32 28.32 ... 30.27 30.29 30.29
    spatial_ref  int32 4B 4326
Data variables:
    CH4          (time, latitude, longitude) float32 320kB 1.871e+03 ... nan
    dataMask     (time, latitude, longitude) uint8 80kB 1 1 1 1 1 ... 0 0 0 0 0
Attributes:
    crs:           EPSG:4326
    grid_mapping:  spatial_ref

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.

[13]:
ds_l2_ch4 = ds_l2_ch4.where(ds_l2_ch4.dataMask == 1)

Visualisation de la bande#

Le méthane (CH₄) est un puissant gaz à effet de serre émis par les zones humides, le bétail, la production pétrolière et gazière, les décharges et les rizières. Sentinel-5P mesure le CH₄ en parties par milliard (PPB). Il joue un rôle majeur dans le réchauffement climatique et les réactions chimiques atmosphériques.

[14]:
ds_l2_ch4['CH4'].plot(robust=True, col="time")
[14]:
<xarray.plot.facetgrid.FacetGrid at 0x7f6124f67890>
../../../_images/sandbox_notebooks_Datasets_Sentinel_5P_34_1.png

3. Fraction, albédo, pression au sommet des nuages Sentinel-5p TROPOMI Niveau 2#

La fraction de nuages, l’albédo des nuages et la pression au sommet des nuages du niveau 2 de Sentinel-5P TROPOMI sont des produits atmosphériques de TROPOMI (Sentinel-5 Precursor) qui décrivent la couverture nuageuse, la luminosité et la hauteur pour chaque pixel satellite, dérivés des mesures du rayonnement solaire réfléchi. Ces paramètres nuageux sont utilisés pour améliorer la précision de la récupération des gaz traces (en corrigeant la contamination par les nuages), pour étudier la distribution des nuages et leurs effets radiatifs, et pour soutenir l’analyse météorologique et climatique en quantifiant l’influence des nuages sur le bilan énergétique et la structure atmosphérique de la Terre.

[15]:
ds_l2_cloud = dc.load(product='s5p_tropomi_l2_cloud',
                    group_by="solar_day",
                      **query)

ds_l2_cloud
[15]:
<xarray.Dataset> Size: 2MB
Dimensions:                  (time: 2, latitude: 200, longitude: 200)
Coordinates:
  * time                     (time) datetime64[ns] 16B 2023-07-18T05:57:16.50...
  * latitude                 (latitude) float64 2kB -24.61 -24.62 ... -26.59
  * longitude                (longitude) float64 2kB 28.3 28.32 ... 30.29 30.29
    spatial_ref              int32 4B 4326
Data variables:
    CLOUD_BASE_PRESSURE      (time, latitude, longitude) float32 320kB 6.278e...
    CLOUD_TOP_PRESSURE       (time, latitude, longitude) float32 320kB 5.527e...
    CLOUD_BASE_HEIGHT        (time, latitude, longitude) float32 320kB 4.128e...
    CLOUD_TOP_HEIGHT         (time, latitude, longitude) float32 320kB 5.128e...
    CLOUD_OPTICAL_THICKNESS  (time, latitude, longitude) float32 320kB 3.105 ...
    CLOUD_FRACTION           (time, latitude, longitude) float32 320kB 0.1183...
    dataMask                 (time, latitude, longitude) uint8 80kB 1 1 ... 0 0
Attributes:
    crs:           EPSG:4326
    grid_mapping:  spatial_ref

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 dont la valeur du masque de données est de 1.

[16]:
ds_l2_cloud = ds_l2_cloud.where(ds_l2_cloud.dataMask == 1)

Visualisation de la bande#

La pression à la base des nuages est exprimée en Pascals et varie généralement de 1 000 à 110 000, indiquant le niveau de pression à la base de la couche nuageuse. La pression au sommet des nuages est mesurée en Pascals et tombe généralement entre 1 000 et 110 000, les valeurs les plus faibles représentant des sommets de nuages plus élevés. La hauteur de la base des nuages est donnée en mètres (m) et s’étend généralement de 0 à 20 000, marquant l’altitude de la limite inférieure du nuage. La hauteur du sommet des nuages est également en mètres (m) et varie couramment de 0 à 20 000, capturant l’altitude de la partie la plus élevée du nuage. L’épaisseur optique des nuages est un indice sans unité variant généralement de 0 à 250. La fraction nuageuse est une valeur sans unité comprise entre 0 et 1, représentant la proportion du pixel satellite couverte par les nuages. Pour la visualisation, la bande CLOUD_FRACTION sera utilisée. Pour visualiser l’une des autres bandes, remplacez simplement CLOUD_FRACTION par le nom de la bande souhaitée dans la liste ci-dessus.

[17]:
ds_l2_cloud['CLOUD_FRACTION'].plot(robust=True, col="time")
[17]:
<xarray.plot.facetgrid.FacetGrid at 0x7f612430f8f0>
../../../_images/sandbox_notebooks_Datasets_Sentinel_5P_40_1.png

4. Colonne totale de monoxyde de carbone (CO) de Sentinel-5p TROPOMI niveau 2#

La colonne totale de monoxyde de carbone (CO) de Sentinel-5P TROPOMI niveau 2 est un produit de composition atmosphérique de TROPOMI (Sentinel-5 Precursor) qui mesure la quantité de CO verticalement intégrée dans l’atmosphère en analysant le rayonnement infrarouge à ondes courtes réfléchi. Elle est utilisée pour suivre la pollution liée à la combustion provenant de sources telles que les feux de biomasse, l’industrie et les transports, pour surveiller le transport à longue distance des panaches de pollution et pour soutenir l’évaluation de la qualité de l’air et les études de chimie atmosphérique.

[18]:
ds_l2_co = dc.load(product='s5p_tropomi_l2_co',
                    group_by="solar_day",
                      **query)

ds_l2_co
[18]:
<xarray.Dataset> Size: 403kB
Dimensions:      (time: 2, latitude: 200, longitude: 200)
Coordinates:
  * time         (time) datetime64[ns] 16B 2023-07-18T05:57:16.500000 2023-07...
  * latitude     (latitude) float64 2kB -24.61 -24.62 -24.62 ... -26.59 -26.59
  * longitude    (longitude) float64 2kB 28.3 28.32 28.32 ... 30.27 30.29 30.29
    spatial_ref  int32 4B 4326
Data variables:
    CO           (time, latitude, longitude) float32 320kB 0.02195 ... nan
    dataMask     (time, latitude, longitude) uint8 80kB 1 1 1 1 1 ... 0 0 0 0 0
Attributes:
    crs:           EPSG:4326
    grid_mapping:  spatial_ref

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 dont la valeur du masque de données est de 1.

[19]:
ds_l2_co = ds_l2_co.where(ds_l2_co.dataMask == 1)

Visualisation de la bande#

Le monoxyde de carbone (CO) est produit par la combustion incomplète des véhicules, les feux de forêt et les brûlages domestiques, et il sert de traceur pour la pollution et l’activité des incendies. Il est mesuré en mol/m², avec des valeurs typiques comprises entre 0 et 0,1 mol/m², augmentant lors d’événements d’incendie intenses. Certains événements (feux de forêt) peuvent entraîner le dépassement de ces limites.

[20]:
ds_l2_co['CO'].plot(robust=True, col="time")
[20]:
<xarray.plot.facetgrid.FacetGrid at 0x7f612445c830>
../../../_images/sandbox_notebooks_Datasets_Sentinel_5P_46_1.png

5. Colonne totale de formaldéhyde (HCHO) de Sentinel-5p TROPOMI niveau 2#

La colonne totale de formaldéhyde (HCHO) de Sentinel-5P TROPOMI niveau 2 est un produit de composition atmosphérique de TROPOMI (Sentinel-5 Precursor) qui mesure la concentration verticalement intégrée de formaldéhyde dans l’atmosphère à l’aide d’observations spectrales ultraviolettes. Elle est utilisée comme indicateur des émissions de composés organiques volatils (COV) afin d’identifier les zones urbaines polluées, les régions de brûlage de biomasse et les sources biogéniques provenant de la végétation, ainsi que pour soutenir les études sur la formation de l’ozone et la dynamique de la qualité de l’air.

[21]:
ds_l2_hcho = dc.load(product='s5p_tropomi_l2_hcho',
                    group_by="solar_day",
                      **query)

ds_l2_hcho
[21]:
<xarray.Dataset> Size: 403kB
Dimensions:      (time: 2, latitude: 200, longitude: 200)
Coordinates:
  * time         (time) datetime64[ns] 16B 2023-07-18T05:57:16.500000 2023-07...
  * latitude     (latitude) float64 2kB -24.61 -24.62 -24.62 ... -26.59 -26.59
  * longitude    (longitude) float64 2kB 28.3 28.32 28.32 ... 30.27 30.29 30.29
    spatial_ref  int32 4B 4326
Data variables:
    HCHO         (time, latitude, longitude) float32 320kB 3.575e-05 ... 0.00...
    dataMask     (time, latitude, longitude) uint8 80kB 1 1 1 1 1 ... 1 1 1 1 1
Attributes:
    crs:           EPSG:4326
    grid_mapping:  spatial_ref

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 dont la valeur du masque de données est de 1.

[22]:
ds_l2_hcho = ds_l2_hcho.where(ds_l2_hcho.dataMask == 1)

Visualisation de la bande#

Le formaldéhyde (HCHO) est formé par l’oxydation de composés organiques volatils provenant de la végétation, des activités humaines et du brûlage de biomasse, ce qui en fait un indicateur utile de la chimie produisant de l’ozone. Sentinel-5P rapporte le HCHO en mol/m², variant généralement de 0 à 0,001 mol/m², en fonction de l’activité des incendies et des émissions biogéniques. Certains événements (feux de forêt) peuvent entraîner le dépassement de ces limites.

[23]:
ds_l2_hcho['HCHO'].plot(robust=True, col="time")
[23]:
<xarray.plot.facetgrid.FacetGrid at 0x7f612430d2b0>
../../../_images/sandbox_notebooks_Datasets_Sentinel_5P_52_1.png

6. Colonnes totale et troposphérique de dioxyde d’azote (NO2) de Sentinel-5p TROPOMI niveau 2#

Les colonnes totale et troposphérique de dioxyde d’azote (NO₂) de Sentinel-5P TROPOMI niveau 2 sont des produits atmosphériques de TROPOMI (Sentinel-5 Precursor) qui mesurent la quantité de dioxyde d’azote verticalement intégrée pour l’ensemble de l’atmosphère (colonne totale) et spécifiquement au sein de la troposphère (colonne troposphérique) à l’aide de données spectrales visibles et ultraviolettes. Ces produits sont utilisés pour surveiller la pollution de l’air au niveau du sol causée par les véhicules, les centrales électriques et l’industrie, pour évaluer les tendances de la qualité de l’air et l’exposition de la population, et pour soutenir la réglementation environnementale et la gestion de la pollution urbaine.

[24]:
ds_l2_no2 = dc.load(product='s5p_tropomi_l2_no2',
                    group_by="solar_day",
                      **query)

ds_l2_no2
[24]:
<xarray.Dataset> Size: 403kB
Dimensions:      (time: 2, latitude: 200, longitude: 200)
Coordinates:
  * time         (time) datetime64[ns] 16B 2023-07-18T05:57:16.500000 2023-07...
  * latitude     (latitude) float64 2kB -24.61 -24.62 -24.62 ... -26.59 -26.59
  * longitude    (longitude) float64 2kB 28.3 28.32 28.32 ... 30.27 30.29 30.29
    spatial_ref  int32 4B 4326
Data variables:
    NO2          (time, latitude, longitude) float32 320kB 2.239e-05 ... 0.00...
    dataMask     (time, latitude, longitude) uint8 80kB 1 1 1 1 1 ... 1 1 1 1 1
Attributes:
    crs:           EPSG:4326
    grid_mapping:  spatial_ref

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 dont la valeur du masque de données est de 1.

[25]:
ds_l2_no2 = ds_l2_no2.where(ds_l2_no2.dataMask == 1)

Visualisation de la bande#

Le dioxyde d’azote (NO₂) est un polluant atmosphérique majeur produit principalement par les véhicules, les centrales électriques et la combustion industrielle, contribuant à la formation de smog et d’ozone. Il est mesuré en mol/m², allant de 0 à 0,0003 mol/m². Parfois, les pics de valeur pour les villes polluées peuvent atteindre deux ou trois fois la valeur supérieure.

[26]:
ds_l2_no2['NO2'].plot(robust=True, col="time")
[26]:
<xarray.plot.facetgrid.FacetGrid at 0x7f612414cce0>
../../../_images/sandbox_notebooks_Datasets_Sentinel_5P_58_1.png

7. Colonne totale d’ozone (O3) de Sentinel-5p TROPOMI niveau 2#

La colonne totale d’ozone (O₃) de Sentinel-5P TROPOMI niveau 2 est un produit de composition atmosphérique de TROPOMI (Sentinel-5 Precursor) qui mesure la quantité totale d’ozone dans toute l’atmosphère en analysant le rayonnement ultraviolet et visible absorbé par les molécules d’ozone. Elle est utilisée pour surveiller la couche d’ozone, évaluer l’exposition aux rayonnements ultraviolets nocifs, suivre les tendances à long terme de l’ozone et soutenir les accords environnementaux internationaux liés à la protection de l’atmosphère.

[27]:
ds_l2_o3 = dc.load(product='s5p_tropomi_l2_o3',
                    group_by="solar_day",
                      **query)

ds_l2_o3
[27]:
<xarray.Dataset> Size: 403kB
Dimensions:      (time: 2, latitude: 200, longitude: 200)
Coordinates:
  * time         (time) datetime64[ns] 16B 2023-07-18T05:57:16.500000 2023-07...
  * latitude     (latitude) float64 2kB -24.61 -24.62 -24.62 ... -26.59 -26.59
  * longitude    (longitude) float64 2kB 28.3 28.32 28.32 ... 30.27 30.29 30.29
    spatial_ref  int32 4B 4326
Data variables:
    O3           (time, latitude, longitude) float32 320kB 0.1133 ... 0.1192
    dataMask     (time, latitude, longitude) uint8 80kB 1 1 1 1 1 ... 1 1 1 1 1
Attributes:
    crs:           EPSG:4326
    grid_mapping:  spatial_ref

Masquage#

[28]:
ds_l2_o3 = ds_l2_o3.where(ds_l2_o3.dataMask == 1)

Visualisation de la bande#

L’ozone (O₃) protège la vie dans la stratosphère en absorbant les rayons ultraviolets, mais devient un polluant nocif lorsqu’il est présent près de la surface. Sentinel-5P mesure l’ozone en mol/m², avec des valeurs de colonne typiques allant de 0 à 0,36 mol/m².

[29]:
ds_l2_o3['O3'].plot(robust=True, col="time")
[29]:
<xarray.plot.facetgrid.FacetGrid at 0x7f611ca7bd40>
../../../_images/sandbox_notebooks_Datasets_Sentinel_5P_64_1.png

8. Sentinel-5p TROPOMI Niveau 2 Colonne totale de dioxyde de soufre (SO2)#

La colonne totale de dioxyde de soufre (SO₂) de Sentinel-5P TROPOMI niveau 2 est un produit atmosphérique de TROPOMI (Sentinel-5 Precursor) qui mesure la quantité verticalement intégrée de dioxyde de soufre dans l’atmosphère à l’aide d’observations spectrales de l’ultraviolet. Elle est utilisée pour détecter les émissions des centrales électriques, des raffineries de pétrole et des fonderies, pour surveiller les éruptions volcaniques en temps quasi réel, et pour évaluer la contribution de la pollution par le soufre à la dégradation de la qualité de l’air et à la formation de pluies acides.

[30]:
ds_l2_so2 = dc.load(product='s5p_tropomi_l2_so2',
                    group_by="solar_day",
                      **query)

ds_l2_so2
[30]:
<xarray.Dataset> Size: 403kB
Dimensions:      (time: 2, latitude: 200, longitude: 200)
Coordinates:
  * time         (time) datetime64[ns] 16B 2023-07-18T05:57:16.500000 2023-07...
  * latitude     (latitude) float64 2kB -24.61 -24.62 -24.62 ... -26.59 -26.59
  * longitude    (longitude) float64 2kB 28.3 28.32 28.32 ... 30.27 30.29 30.29
    spatial_ref  int32 4B 4326
Data variables:
    SO2          (time, latitude, longitude) float32 320kB -0.0003887 ... 0.0...
    dataMask     (time, latitude, longitude) uint8 80kB 1 1 1 1 1 ... 1 1 1 1 1
Attributes:
    crs:           EPSG:4326
    grid_mapping:  spatial_ref

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 dont la valeur du masque de données est de 1.

[31]:
ds_l2_so2 = ds_l2_so2.where(ds_l2_so2.dataMask == 1)

Visualisation de la bande#

Le dioxyde de soufre (SO₂) est un polluant rejeté par les volcans, les centrales électriques au charbon, les raffineries et les activités de fusion, et il contribue aux pluies acides et aux problèmes respiratoires. Sentinel-5P rapporte le SO₂ en mol/m², avec des valeurs de 0 à 0,01 mol/m² ou plus lors d’éruptions volcaniques explosives qui peuvent dépasser 0,35 mol/m², et le bruit instrumental peut produire des valeurs négatives.

[32]:
ds_l2_so2['SO2'].plot(robust=True, col="time")
[32]:
<xarray.plot.facetgrid.FacetGrid at 0x7f611c90ca70>
../../../_images/sandbox_notebooks_Datasets_Sentinel_5P_70_1.png

Calcul de la masse totale de gaz atmosphérique (en tonnes) à partir des données de Sentinel-5P TROPOMI#

Les produits Sentinel-5P TROPOMI Niveau-2 fournissent des mesures des gaz traces atmosphériques sous forme de densités de colonne verticale en unités de mol/m² et Parties par milliard (PPB). Ces valeurs représentent le nombre de moles d’un gaz contenues dans une colonne atmosphérique au-dessus de chaque pixel satellite.

Pourquoi calculer en tonnes ?#

L’expression des quantités de gaz en tonnes fournit une métrique intuitive et pertinente pour les politiques pour :

  • Évaluer les sources d’émissions (zones urbaines, industrielles, brûlage de biomasse, zones humides)

  • Quantifier la charge atmosphérique lors des épisodes de pollution

  • Comparer différents gaz sur une même échelle

  • Rapporter des métriques basées sur la masse pour les cadres climatiques et de qualité de l’air

  • Soutenir les évaluations environnementales des ODD et de l’Agenda 2063 de l’UA

La conversion des colonnes de gaz traces en valeurs de masse physiquement significatives permet aux chercheurs et aux décideurs de traduire les observations satellites en informations exploitables.


Masses moléculaires utilisées dans la conversion#

La masse moléculaire détermine le poids en grammes d’une mole de gaz :

Gaz

Masse moléculaire (g/mol)

CH₄ (Méthane)

16,04

CO (Monoxyde de carbone)

28,01

NO₂ (Dioxyde d’azote)

46,005

SO₂ (Dioxyde de soufre)

64,066

HCHO (Formaldéhyde)

30,026

O₃ (Ozone)

48,00

Ces valeurs sont fournies à la fonction de conversion afin que tout produit de gaz Sentinel-5P puisse être traité de manière cohérente.


La fonction ci-dessous effectue la conversion complète des données de colonne de gaz de niveau 2 de Sentinel-5P TROPOMI (fournies en mol/m²) en masse atmosphérique totale exprimée en tonnes pour votre zone d’intérêt (AOI).

Pour exécuter le calcul, il vous suffit de fournir :

  1. La variable de colonne de gaz de votre jeu de données

    • Exemples : no2_tropospheric_column, co_column, so2_column, hcho_column, ozone_total_vertical_column,

    • Parce que ch4_column est en ppb, il doit être converti en une quantité de colonne appropriée (par exemple, mol/m²) avant d’être converti en tonnes.

  2. La masse moléculaire du gaz (en g/mol)

La fonction effectue automatiquement les opérations suivantes :

  • Calcule la superficie des pixels à partir de la grille de latitude/longitude

  • Applique un masquage des nuages si nécessaire

  • Convertit mol/m² → mol → grammes → tonnes

  • Fait la somme de tous les pixels valides

Cela vous permet de transformer les densités de colonnes observées par satellite en une métrique physique significative (tonnes) pour l’analyse environnementale, les études climatiques, le suivi des émissions et la production de rapports.

[33]:
def compute_tonnes_timeseries(ds, molecular_weight):
    """
    Computes total atmospheric mass (tonnes) for every timestep in a Sentinel-5P
    Dataset or DataArray. Automatically detects the gas variable if needed.
    Returns a DataFrame with 'timestep' and 'tonnes' columns.
    """

    # -------------------------------------------------------
    # Case 1: Input is a DataArray
    # -------------------------------------------------------
    if isinstance(ds, xr.DataArray):
        gas_da_all = ds

    # -------------------------------------------------------
    # Case 2: Input is a Dataset
    # -------------------------------------------------------
    elif isinstance(ds, xr.Dataset):
        non_dimension_vars = [
            v for v in ds.data_vars
            if v not in ["latitude", "longitude", "time", "dataMask"]
        ]

        if len(non_dimension_vars) != 1:
            raise ValueError(f"Could not detect gas variable. Found: {non_dimension_vars}")

        gas_var = non_dimension_vars[0]
        gas_da_all = ds[gas_var]

    else:
        raise TypeError("Input must be an xarray Dataset or DataArray")

    R = 6371000  # Earth radius
    results = []

    # -------------------------------------------------------
    # Loop over timesteps
    # -------------------------------------------------------
    for idx, t in enumerate(gas_da_all.time.values):
        da = gas_da_all.isel(time=idx)

        # Apply dataMask if available
        if isinstance(ds, xr.Dataset) and "dataMask" in ds:
            da = da.where(ds["dataMask"].isel(time=idx) == 1)

        lat = da.latitude
        lon = da.longitude

        # Compute resolution
        dlat = np.abs(lat.diff("latitude").mean().item())
        dlon = np.abs(lon.diff("longitude").mean().item())

        # Convert to radians
        lat_rad = np.deg2rad(lat)
        dlat_rad = np.deg2rad(dlat)
        dlon_rad = np.deg2rad(dlon)

        # Pixel area (1-D latitude)
        area_1d = R**2 * np.cos(lat_rad) * dlat_rad * dlon_rad
        area_da = xr.DataArray(area_1d, coords={"latitude": lat}, dims=["latitude"])

        # Expand to full grid
        area_full = area_da.broadcast_like(da)

        # mol/m² → mol → grams → tonnes
        mol_per_pixel = da * area_full
        grams_per_pixel = mol_per_pixel * molecular_weight
        tonnes_per_pixel = grams_per_pixel / 1e6

        total_tonnes = tonnes_per_pixel.sum(skipna=True).item()

        results.append([pd.to_datetime(t), total_tonnes])

    # -------------------------------------------------------
    # Return a DataFrame with headers
    # -------------------------------------------------------
    df = pd.DataFrame(results, columns=["timestep", "tonnes"])
    df["tonnes"] = df["tonnes"].apply(lambda x: f"{x:,.0f}")
    return df

Dans la cellule ci-dessous, nous démontrons comment calculer la masse atmosphérique totale de la colonne totale de monoxyde de carbone (CO) sur la zone d’intérêt (AOI) sélectionnée en utilisant les données Sentinel-5P TROPOMI Niveau-2 du jeu de données CO déjà chargé ci-dessus. Le calcul applique la fonction de conversion définie précédemment, qui transforme en masse totale (tonnes) en combinant la surface du pixel et le poids moléculaire, avec un masquage des nuages optionnel. Ce flux de travail quantifie le monoxyde de carbone total présent dans l’AOI, et la même approche peut être appliquée à d’autres produits de gaz traces Sentinel-5P en fournissant la variable de gaz pertinente et le poids moléculaire. Note : Le méthane (CH4) étant rapporté en ppb, une étape de conversion supplémentaire sera incluse pour le convertir en mol/m² avant de calculer les tonnes. Le dataMask indique si un pixel contient une récupération de gaz valide, tandis que le produit s5p_tropomi_l2_cloud fournit des informations sur les nuages — spécifiquement la cloud_fraction — que nous utilisons pour exclure les pixels où la contamination nuageuse réduirait la précision des mesures de gaz atmosphériques. Un seuil de nuages de 0,3 est recommandé car il élimine efficacement les pixels où la contamination nuageuse commence à dégrader de manière significative la précision de la récupération des gaz tout en préservant suffisamment d’observations par ciel clair pour une analyse fiable.

[34]:
cloud_mask = ds_l2_cloud['CLOUD_FRACTION'] < 0.3
[35]:
mask_CO = ds_l2_co['CO'].where(cloud_mask)

Visualisation de la colonne totale de CO après suppression des pixels contaminés par les nuages#

Le graphique ci-dessous montre les valeurs de la colonne totale de CO sur la zone d’intérêt (AOI) après l’application d’un filtre de fraction nuageuse pour supprimer les pixels présentant une contamination nuageuse excessive. Les récupérations de monoxyde de carbone par Sentinel-5P peuvent être fortement affectées par la couverture nuageuse, nous ne conservons donc que les pixels où cloud_fraction < 0.3. Cela garantit que la visualisation reflète des observations de monoxyde de carbone plus claires et plus fiables pour la période de 2 jours sélectionnée.

[36]:
mask_CO.plot(robust=True, col="time")
[36]:
<xarray.plot.facetgrid.FacetGrid at 0x7f611c82cf50>
../../../_images/sandbox_notebooks_Datasets_Sentinel_5P_79_1.png
[37]:
CO_tonnes_ts = compute_tonnes_timeseries(
    mask_CO,
    molecular_weight=28.01,
)

CO_tonnes_ts
[37]:
timestep tonnes
0 2023-07-18 05:57:16.500 12,055
1 2023-07-19 05:47:43.500 977

Conclusion#

Grâce à Digital Earth Africa, les données de Sentinel-5 Precursor et de son instrument TROPOMI transforment l’accès aux informations atmosphériques à travers l’Afrique en rendant les ensembles de données sur la qualité de l’air et le climat facilement disponibles et simples d’utilisation. DE Africa élimine les barrières techniques liées aux données satellites en offrant un accès ouvert, un traitement cloud et des produits prêts pour l’analyse, permettant ainsi aux chercheurs et aux gouvernements de surveiller la pollution, les gaz à effet de serre et l’ozone sans infrastructure spécialisée. Cela soutient directement les objectifs de développement durable des Nations Unies et l’Agenda 2063 de l’Union africaine en renforçant la gouvernance environnementale, la planification de la santé publique, l’action climatique et la coopération régionale, aidant les pays à concevoir des politiques éclairées pour une Afrique plus saine et plus résiliente.


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

[38]:
print(datacube.__version__)
1.9.13

Dernier test :

[39]:
from datetime import datetime
datetime.today().strftime('%Y-%m-%d')
[39]:
'2026-02-25'