Landsat Surface Temperature
Mots-clés données utilisées ; landsat 8, données utilisées ; landsat 7, données utilisées ; landsat 5, ensembles de données ; landsat 8, ensembles de données ; landsat 7, ensembles de données ; landsat 5, température de surface
Aperçu
Le programme de satellites Landsat <https://www.nasa.gov/mission_pages/landsat/overview/index.html> de l’Institut d’études géologiques des États-Unis (USGS) capture des images du continent africain depuis plus de 30 ans. Ces données sont très utiles pour les études de cartographie terrestre et côtière. La mission Landsat collecte non seulement des données sur la réflectance de surface, mais également sur la température de surface.
La température de surface mesure la température de surface de la Terre (en Kelvin) et constitue un paramètre géophysique important dans les études de bilan énergétique mondial et la modélisation hydrologique. La température de surface est également utile pour surveiller la santé des cultures et de la végétation, ainsi que les événements de chaleur extrême tels que les catastrophes naturelles (par exemple, les éruptions volcaniques, les incendies de forêt) et les effets d’îlot de chaleur urbain.
Le produit de température de surface est généré à partir de :
Collection Landsat 2 Bandes infrarouges thermiques de niveau 1
Réflectivité du sommet de l’atmosphère (TOA)
Température de luminosité TOA
Données de la base de données d’émissivité mondiale (GED) du radiomètre spatial avancé à émission et réflexion thermiques (ASTER)
Données de l’indice de végétation par différence normalisée (NDVI) ASTER
Profils atmosphériques de hauteur géopotentielle, d’humidité spécifique et de température de l’air extraits de :
Acquisitions de 2000 à aujourd’hui : Modèle du Goddard Earth Observing System (GEOS), version 5, équipes d’instruments de traitement avancé (FP-IT)
Acquisitions de 1982 à 1999 : Analyse rétrospective de l’ère moderne pour la recherche et les applications version 2 (MERRA-2)
Pour plus d’informations et de mises en garde sur le produit, visitez la présentation des produits scientifiques Landsat et la page Web « Landsat Surface Temperature » <https://www.usgs.gov/core-science-systems/nli/landsat/landsat-collection-2-surface-temperature#:~:text=Landsat%20surface%20temperature%20measures%20the,balance%20studies%20and%20hydrologic%20modeling.>.
Détails importants :
Produit de température de surface
Plage de mise à l’échelle native : « 1 - 65 535 » (« 0 » signifie « aucune donnée »)
Pour obtenir les valeurs de température de surface, convertissez les valeurs en Kelvin en utilisant « ds = ds * 0,00341802 + 149,0 »
L’utilisation de « dc.load » chargera les données dans la plage de mise à l’échelle native « 1 - 65 535 », tandis que l’utilisation de « load_ard » convertira en Kelvin
L’alignement natif des pixels est « centre »
Période : 1984 – aujourd’hui
Résolution spatiale : 30 x 30 m
Le produit de température de surface est fourni avec un échantillonnage spatial de 30 m, cependant, les capteurs thermiques varient en termes de réponse spectrale, de sensibilité et de résolution.
Pour une description détaillée des archives Landsat de DE Africa, consultez la documentation sur les spécifications techniques de la température de surface Landsat de DE Africa <https://docs.digitalearthafrica.org/en/latest/data_specs/Landsat_C2_ST_specs.html>`__.
Description
Ce bloc-notes montre comment charger et utiliser le produit Température de surface terrestre du jeu de données Landsat Collection 2. Les sujets abordés incluent :
Température de surface de charge et filtre avec évaluation de la qualité
Comparer la température moyenne de surface à la température quotidienne de l’air à 2 mètres de hauteur de l’ERA5
Inspecter les caractéristiques de la surface du terrain concerné
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]:
%matplotlib inline
import datacube
import numpy as np
import xarray as xr
import matplotlib.pyplot as plt
from deafrica_tools.load_era5 import load_era5
from deafrica_tools.datahandling import load_ard, mostcommon_crs
from deafrica_tools.plotting import rgb
Se connecter au datacube
[2]:
dc = datacube.Datacube(app="Landsat_Surface_Temperature")
Produits et mesures disponibles
Liste des produits
Nous pouvons utiliser la fonctionnalité « list_products » de Datacube pour inspecter les produits Landsat 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.
Nous pouvons rechercher des données de température de surface de la collection Landsat 2 en utilisant le terme de recherche « _st ». « st » signifie « température de surface ». Le datacube est sensible à la casse, il faut donc saisir le texte en minuscules.
[3]:
# List Landsat products available in DE Africa
dc_products = dc.list_products()
display_columns = ['name', 'description']
dc_products[dc_products.name.str.contains(
'_st').fillna(
False)][display_columns].set_index('name')
[3]:
| description | |
|---|---|
| name | |
| ls5_st | USGS Landsat 5 Collection 2 Level-2 Surface Te... |
| ls7_st | USGS Landsat 7 Collection 2 Level-2 Surface Te... |
| ls8_st | USGS Landsat 8 Collection 2 Level-2 Surface Te... |
| ls9_st | USGS Landsat 9 Collection 2 Level-2 Surface Te... |
Liste des mesures
Nous pouvons examiner plus en détail les données disponibles pour chaque produit Landsat à l’aide de la fonctionnalité « list_measurements » de Datacube. Le tableau ci-dessous répertorie chacune des mesures disponibles dans les données.
Notez que les produits de température de surface de Landsat 8 sont générés avec un algorithme différent de ceux de Landsat 5 et 7. Ils ont donc des mesures de sortie différentes.
[4]:
dc_measurements = dc.list_measurements()
dc_measurements.loc['ls8_st']
[4]:
| name | dtype | units | nodata | aliases | flags_definition | add_offset | scale_factor | |
|---|---|---|---|---|---|---|---|---|
| measurement | ||||||||
| ST_B10 | ST_B10 | uint16 | Kelvin | 0.0 | [band_10, st, surface_temperature] | NaN | NaN | NaN |
| ST_TRAD | ST_TRAD | int16 | W/(m2.sr.μm) | -9999.0 | [trad, thermal_radiance] | NaN | NaN | NaN |
| ST_URAD | ST_URAD | int16 | W/(m2.sr.μm) | -9999.0 | [urad, upwell_radiance] | NaN | NaN | NaN |
| ST_DRAD | ST_DRAD | int16 | W/(m2.sr.μm) | -9999.0 | [drad, downwell_radiance] | NaN | NaN | NaN |
| ST_ATRAN | ST_ATRAN | int16 | 1 | -9999.0 | [atran, atmospheric_transmittance] | NaN | NaN | NaN |
| ST_EMIS | ST_EMIS | int16 | 1 | -9999.0 | [emis, emissivity] | NaN | NaN | NaN |
| ST_EMSD | ST_EMSD | int16 | 1 | -9999.0 | [emsd, emissivity_stddev] | NaN | NaN | NaN |
| ST_CDIST | ST_CDIST | int16 | Kilometers | -9999.0 | [cdist, cloud_distance] | NaN | NaN | NaN |
| QA_PIXEL | QA_PIXEL | uint16 | bit_index | 1.0 | [pq, pixel_quality] | {'snow': {'bits': 5, 'values': {'0': 'not_high... | NaN | NaN |
| QA_RADSAT | QA_RADSAT | uint16 | bit_index | 0.0 | [radsat, radiometric_saturation] | {'nir_saturation': {'bits': 4, 'values': {'0':... | NaN | NaN |
| ST_QA | ST_QA | int16 | Kelvin | -9999.0 | [st_qa, surface_temperature_quality] | NaN | NaN | NaN |
Charger la température de surface Landsat à 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 les données de température de surface de Landsat 8 pour la Namibie, sur certaines parties de 2018 et 2019. Tout d’abord, nous allons configurer les paramètres de notre chargement de données : latitude et longitude, heure et mesures de bande.
En spécifiant « output_crs=”EPSG:32633”`` et « resolution=(-30, 30) ``, nous demandons à Datacube de reprojeter nos données vers le système de référence de coordonnées (CRS) souhaité, avec des pixels de 30 x 30 m.
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> ».
[5]:
# Define the analysis region (Lat-Lon box)
# High Energy Stereoscopic System site near Windhoek Namibia
lat = (-23.275, -23.265)
lon = (16.495, 16.505)
# Define the time window
time = ('2018-07-01', '2019-05-31')
# Load land surface temperature and quality assessment
# We can use the alias names to call the bands
measurements = ['surface_temperature', 'surface_temperature_quality']
[6]:
data = dc.load(product='ls8_st',
x=lon,
y=lat,
time=time,
measurements = measurements,
output_crs = 'EPSG:32633',
resolution = (-30, 30))
print(data)
<xarray.Dataset> Size: 116kB
Dimensions: (time: 21, y: 38, x: 36)
Coordinates:
* time (time) datetime64[ns] 168B 2018-07-14T08:50:...
* y (y) float64 304B -2.574e+06 ... -2.575e+06
* x (x) float64 288B 6.529e+05 ... 6.54e+05
spatial_ref int32 4B 32633
Data variables:
surface_temperature (time, y, x) uint16 57kB 37333 37339 ... 44213
surface_temperature_quality (time, y, x) int16 57kB 636 636 635 ... 176 172
Attributes:
crs: EPSG:32633
grid_mapping: spatial_ref
Tracé des données Landsat à partir de dc.load
Nous pouvons tracer les données que nous avons chargées pour chaque pas de temps et les inspecter.
[7]:
data.surface_temperature.plot.imshow(col='time', col_wrap=10, cmap='coolwarm');
Notez que l’échelle de température de surface est très grande. Cela est dû au fait que les données chargées avec « dc.load » n’ont pas été mises à l’échelle en fonction du facteur d’échelle et des décalages déterminés par l’USGS. Le chargement des données avec « load_ard » effectue cette mise à l’échelle automatiquement, pour donner la température en Kelvin.
Charger Landsat en utilisant load_ard
load_ard applique la mise à l’échelle linéaire et le décalage qui convertissent les données natives chargées en valeurs réelles de température de surface. load_ard concaténera et triera en outre les observations par heure et appliquera un masque de nuage. Le résultat est un ensemble de données prêt à être analysé, beaucoup plus facile à utiliser.
Dans l’exemple ci-dessous, nous chargeons les données Landsat 8 pour la même heure et le même endroit que ci-dessus. Nous appellerons cet ensemble de données « ds » pour le distinguer de l’ensemble de données précédemment chargé. Notez qu’un masque de nuages a maintenant été appliqué. « load_ard » convertit également les données de température en Kelvin.
Vous pouvez trouver plus d’informations sur la fonction load_ard dans le bloc-notes Using load ard.
[8]:
ds = load_ard(dc=dc,
products=['ls8_st'],
x=lon,
y=lat,
time=time,
measurements = measurements,
output_crs = 'EPSG:32633',
resolution = (-30, 30))
print(ds)
Using pixel quality parameters for USGS Collection 2
Finding datasets
ls8_st
Applying pixel quality/cloud mask
Re-scaling Landsat C2 data
Loading 21 time steps
/opt/venv/lib/python3.12/site-packages/deafrica_tools/datahandling.py:565: FutureWarning: In a future version of xarray the default value for compat will change from compat='no_conflicts' to compat='override'. This is likely to lead to different results when combining overlapping variables with the same name. To opt in to new defaults and get rid of these warnings now use `set_options(use_new_combine_kwarg_defaults=True) or set compat explicitly.
ds = xr.merge([ds_data, ds_masks])
<xarray.Dataset> Size: 231kB
Dimensions: (time: 21, y: 38, x: 36)
Coordinates:
* time (time) datetime64[ns] 168B 2018-07-14T08:50:...
* y (y) float64 304B -2.574e+06 ... -2.575e+06
* x (x) float64 288B 6.529e+05 ... 6.54e+05
spatial_ref int32 4B 32633
Data variables:
surface_temperature (time, y, x) float32 115kB nan nan ... 300.1
surface_temperature_quality (time, y, x) float32 115kB nan nan ... 1.72
Attributes:
crs: EPSG:32633
grid_mapping: spatial_ref
Nous souhaitons maintenant supprimer les tranches vides et convertir la bande « surface_temperature » en degrés Celsius. Nous traçons ensuite les tranches de temps avec des données valides.
[9]:
ds = ds.dropna(dim='time', how='all')
ds['surface_temperature'] = ds.surface_temperature - 273.15
[10]:
ds.surface_temperature.plot.imshow(col='time', col_wrap=9, cmap='coolwarm');
Comparer la température moyenne de surface à la température quotidienne de l’air
Nous pouvons charger des données atmosphériques ERA5 pour les comparer avec la température moyenne de surface de Landsat 8. Ici, nous utilisons la température de l’air quotidienne ERA5 à 2 mètres de hauteur. Elle est chargée à l’aide de la fonction load_era5 puis convertie en degrés Celsius. Pour plus d’informations sur les données ERA5 et sur la manière dont elles sont chargées dans le Sandbox, consultez le bloc-notes Climate Data ERA5.
Pour représenter graphiquement les données, nous trouvons la moyenne de la température de la surface terrestre sur la zone sélectionnée. Celle-ci peut ensuite être affichée avec les données correspondantes de température de l’air à 2 mètres.
[11]:
# Load ERA5 air temperature at 2 m height
var = 'air_temperature_at_2_metres'
air_temp = load_era5(var, lat, lon, time, reduce_func=np.mean)[var] - 273.15
Opening ERA5 Zarr dataset...
Variable: air_temperature_at_2_metres
Mapped ERA5 name: 2m_temperature
Time: 2018-07-01 to 2019-05-31
Latitude: -23.275 to -23.265
Longitude: 16.495000000000005 to 16.504999999999995
Selecting time range...
Normalising longitude coordinates...
Selecting AOI...
Subset size: {'time': 8040, 'latitude': 1, 'longitude': 1}
Resampling to 1D using <function mean at 0x7f281639b740>...
ERA5 loading complete.
[12]:
ds_mean = ds.groupby('time').mean(dim=xr.ALL_DIMS)
[13]:
ds_mean.surface_temperature.plot(figsize = (16, 6),label='Land Surface Temperature');
air_temp.groupby('time').mean(dim=None).plot(label='Air Temperature at 2 m');
plt.ylabel('Temperature (Celcius)')
plt.legend()
[13]:
<matplotlib.legend.Legend at 0x7f25d0970200>
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 :
[14]:
print(datacube.__version__)
1.9.13
Dernier test :
[15]:
from datetime import datetime
datetime.today().strftime('%Y-%m-%d')
[15]:
'2026-04-30'