Oberflächentemperatur (Land Surface Temperature)

In diesem Notebook lernst du, wie du mit der Bibliothek cdec die Landoberflächentemperatur (Land Surface Temperature, kurz LST) für einen bestimmten Ort und Zeitraum herunterladen, auf einer Karte darstellen und anschließend als Rasterdatensatz untersuchen kannst.

Die Landoberflächentemperatur beschreibt die Temperatur der Erdoberfläche, die von einem Satellitensensor erfasst wird. Sie ist nicht mit der Lufttemperatur gleichzusetzen. Mit ihr lassen sich beispielsweise Wärmeinseln in Städten, aufgeheizte versiegelte Flächen oder Temperaturunterschiede zwischen Vegetation und bebauten Gebieten untersuchen.

1 Räumliche Ausdehnung festlegen

Zunächst wird festgelegt, für welches Gebiet die Landoberflächentemperatur heruntergeladen werden soll.

Die räumliche Ausdehnung wird durch eine sogenannte Bounding Box beschrieben. Sie besteht aus vier Koordinaten, die die Grenzen des Untersuchungsgebiets angeben:

  • west: westliche Grenze
  • south: südliche Grenze
  • east: östliche Grenze
  • north: nördliche Grenze

In diesem Beispiel wird ein Gebiet rund um Bremen ausgewählt.

spatial_extent = {'west': 8.721771, 'south': 53.025027, 'east': 8.904419, 'north': 53.114965}

2 Zeitliche Ausdehnung festlegen

Neben dem Ort muss angegeben werden, aus welchem Zeitraum die Satellitendaten stammen sollen.

Dazu werden ein Start- und ein Enddatum festgelegt. Hier werden Messungen aus den Monaten Juni bis August 2024 berücksichtigt.

Für den gewählten Zeitraum wird später ein zeitlicher Mittelwert berechnet. Dadurch entsteht ein einzelnes Raster, das die durchschnittliche Landoberflächentemperatur dieses Zeitraums zeigt.

temporal_extent = ["2024-06-01", "2024-08-31"]

3 Oberflächentemperatur herunterladen

Als Nächstes wird festgelegt, wo die heruntergeladene Rasterdatei gespeichert werden soll.

Der Dateipfad wird in der Variable file_path gespeichert. Die Endung .tif kennzeichnet eine GeoTIFF-Datei. In einer solchen Rasterdatei können neben den Temperaturwerten auch räumliche Informationen gespeichert werden.

Anschließend wird die Bibliothek cdec importiert. Mit der Funktion download_lst() wird die mittlere Landoberflächentemperatur für das zuvor definierte Gebiet und den ausgewählten Zeitraum heruntergeladen.

Dabei werden mehrere Angaben übergeben:

  • file_path legt den Speicherort der Datei fest.
  • spatial_extent bestimmt das Untersuchungsgebiet.
  • temporal_extent bestimmt den betrachteten Zeitraum.

Standardmäßig wird die Datei als Cloud Optimized GeoTIFF (COG) gespeichert. Nach erfolgreicher Ausführung befindet sich das Temperatur-Raster unter dem zuvor angegebenen Dateipfad.

file_path = "data/lst.tif"
import cdec

cdec.download_lst(
    file_path,
    spatial_extent=spatial_extent,
    temporal_extent=temporal_extent,
)
✅ Authorized successfully
Authenticated using device code flow.
PosixPath('/Users/soeren/PycharmProjects/cdec/snippets/data_access/notebooks/data/lst.tif')

4 Rasterdaten auf einer Karte anzeigen

Das heruntergeladene Temperatur-Raster kann nun auf einer interaktiven Karte dargestellt werden.

Dazu wird zunächst mit Map() eine Karte erzeugt. Über center wird der Mittelpunkt der Karte festgelegt, während zoom die anfängliche Zoomstufe bestimmt.

Mit add_cog() wird anschließend die zuvor heruntergeladene Rasterdatei als neue Ebene zur Karte hinzugefügt. Die Farbskala coolwarm stellt niedrigere Temperaturen in kühlen und höhere Temperaturen in warmen Farbtönen dar.

Durch die Ausgabe von m wird die interaktive Karte im Notebook dargestellt.

from geolibre import Map

m = Map(
    center=(8.81, 53.07),
    zoom=11
)

layer_id = m.add_cog(
    file_path,
    name="Landoberflächentemperatur",
    colormap="coolwarm",
)

m

5 Rasterdaten mit Rasterio einlesen

Neben der Darstellung auf einer Karte können die eigentlichen Rasterdaten auch direkt mit Python untersucht werden.

Dafür wird die Bibliothek rasterio importiert. Mit rio.open() wird die heruntergeladene GeoTIFF-Datei geöffnet. Das resultierende Rasterobjekt wird in der Variable src gespeichert.

Über dieses Objekt können sowohl die Temperaturwerte als auch verschiedene Metadaten des Rasterdatensatzes abgerufen werden.

import rasterio as rio

src = rio.open(file_path)

6 Eigenschaften des Rasterdatensatzes untersuchen

Bevor die eigentlichen Pixelwerte betrachtet werden, lohnt sich ein Blick auf einige grundlegende Eigenschaften des Rasterdatensatzes.

Ausgegeben werden:

  • src.count: Anzahl der enthaltenen Rasterbänder
  • src.dtypes: Datentypen der gespeicherten Pixelwerte
  • src.shape: Höhe und Breite des Rasters
  • src.crs: verwendetes Koordinatenreferenzsystem (Coordinate Reference System)

Diese Informationen helfen dabei, den Aufbau eines Rasterdatensatzes besser zu verstehen und sind für die weitere Verarbeitung von Geodaten wichtig.

print(f"Number of bands: {src.count}")
print(f"Data type: {src.dtypes}")
print(f"Shape: {src.shape}")
print(f"Coordinate Reference System: {src.crs}")
Number of bands: 1
Data type: ('float32',)
Shape: (11, 21)
Coordinate Reference System: EPSG:4326

7 Pixelwerte auslesen und umrechnen

Mit src.read() werden die eigentlichen Rasterdaten aus der Datei gelesen. Die Sentinel-3-Daten enthalten die Temperaturwerte in Kelvin.

Für eine leichter verständliche Darstellung werden die Werte anschließend in Grad Celsius umgerechnet. Dazu wird von jedem Pixelwert 273.15 subtrahiert. Da die Landoberflächentemperatur als einzelnes Rasterband gespeichert wird, enthält das Array genau eine Ebene mit Temperaturwerten.

data_kelvin = src.read()
data_celsius = data_kelvin - 273.15
data_celsius
array([[[ 8.074982 ,  7.851593 ,  7.9270325,  8.816559 ,  9.512482 ,
          9.435028 ,  9.177307 ,  8.500214 ,  8.3081665,  8.57077  ,
          8.404327 ,  7.615387 ,  6.9169617,  7.2128906,  7.980011 ,
          8.326935 ,  8.009796 ,  7.8954773,  8.299713 ,  7.8964233,
          7.5393677],
        [ 9.091766 ,  8.641205 ,  8.224274 ,  8.318176 ,  8.927429 ,
          9.586975 ,  9.767029 ,  9.751007 ,  9.832428 ,  9.409058 ,
          8.780731 ,  7.8406982,  7.289154 ,  7.8069153,  8.485687 ,
          8.413666 ,  8.496368 ,  8.741913 ,  8.617828 ,  8.312561 ,
          7.4725037],
        [ 9.838654 ,  9.946411 ,  9.695221 ,  9.40921  ,  9.141083 ,
          9.525177 ,  9.853638 , 10.398987 , 10.273895 , 10.211945 ,
          9.622925 ,  8.391235 ,  7.8151245,  8.291107 ,  8.620514 ,
          8.164673 ,  8.118286 ,  7.9770813,  8.112488 ,  8.307068 ,
          7.726074 ],
        [ 9.352814 ,  9.798981 ,  9.993927 , 10.058197 ,  9.550079 ,
          9.609741 ,  9.588623 ,  9.847778 ,  9.953003 , 10.412567 ,
         10.194946 ,  9.250336 ,  8.971863 ,  8.832275 ,  8.811249 ,
          8.053314 ,  8.113586 ,  8.355469 ,  8.3437805,  8.320892 ,
          8.085022 ],
        [ 8.809021 ,  8.882233 ,  9.054352 ,  9.159119 ,  9.66687  ,
          9.791138 , 10.115723 ,  9.942322 , 10.094543 ,  9.966705 ,
          9.668091 ,  9.742218 ,  9.575623 ,  9.45578  ,  9.362061 ,
          8.716248 ,  9.026794 ,  9.116211 ,  8.836517 ,  8.568146 ,
          8.308289 ],
        [ 8.916534 ,  8.859863 ,  8.451508 ,  8.5381775,  9.355774 ,
         10.017334 , 10.288391 , 10.489838 , 10.189789 , 10.056488 ,
          9.13028  ,  8.466095 ,  8.400635 ,  8.803925 ,  9.2013855,
          9.138428 ,  9.659515 ,  9.657257 ,  9.524384 ,  9.142273 ,
          9.188843 ],
        [ 9.180328 ,  9.145325 ,  9.306274 ,  8.755646 ,  9.050079 ,
          9.625763 , 10.080811 , 10.4375   , 10.134277 ,  9.932312 ,
          9.383423 ,  8.574493 ,  7.875061 ,  7.8230896,  7.98584  ,
          8.185089 ,  8.443268 ,  9.078308 ,  9.575592 , 10.102509 ,
         10.309631 ],
        [ 9.3246765,  9.321655 ,  9.361084 ,  8.974731 ,  8.984802 ,
          9.22699  ,  9.594818 ,  9.962097 , 10.003723 , 10.011322 ,
          9.939636 ,  9.903442 ,  9.58606  ,  9.251953 ,  9.222412 ,
          9.061584 ,  8.462952 ,  8.56485  ,  9.258942 ,  9.4263   ,
          9.528076 ],
        [ 9.324036 ,  9.137329 ,  9.17569  ,  8.807007 ,  8.588837 ,
          8.80304  ,  8.884766 ,  9.182892 ,  9.401184 ,  9.125458 ,
          9.177826 ,  9.945618 , 10.108368 ,  9.944733 ,  9.454498 ,
          9.374634 ,  8.216217 ,  8.44223  ,  8.994568 ,  9.325989 ,
          9.091888 ],
        [ 9.180725 ,  8.994385 ,  8.943665 ,  8.827698 ,  8.85614  ,
          8.742706 ,  8.862854 ,  8.777954 ,  9.015991 ,  9.66629  ,
          9.656921 ,  9.76239  ,  9.722107 ,  9.8463745,  9.346893 ,
          8.909668 ,  7.687134 ,  7.5498657,  8.098206 ,  8.96814  ,
          9.181824 ],
        [ 8.615082 ,  8.497101 ,  8.238892 ,  8.758362 ,  9.18927  ,
          9.260071 ,  9.376465 ,  9.355255 ,  9.225189 ,  8.99707  ,
          9.145996 ,  9.200989 ,  9.024536 ,  8.933624 ,  8.593231 ,
          8.639618 ,  9.16156  ,  8.551392 ,  7.702179 ,  8.246277 ,
          8.802155 ]]], dtype=float32)

8 Rasterdaten visualisieren

Zum Abschluss werden die umgerechneten Temperaturwerte direkt im Notebook dargestellt.

Die Funktion imshow() aus plotly.express erzeugt aus dem ersten Rasterband eine grafische Darstellung. Die Farbskala thermal macht räumliche Temperaturunterschiede sichtbar; die Farblegende zeigt die Werte in Grad Celsius.

import plotly.express as px

fig = px.imshow(
    data_celsius[0],
    color_continuous_scale="thermal",
    labels={"color": "Temperatur (°C)"},
    height=800,
)

fig.show()

Wiederverwendung

Dieses Material steht unter der Lizenz CC BY-SA 4.0. (Lizenz Anzeigen)