Echtfarb-Satellitenbild (True Color Image)

In diesem Notebook lernst du, wie du mit der Bibliothek cdec ein Echtfarb-Satellitenbild (True Color Image kurz TCI) für einen bestimmten Ort und Zeitraum herunterladen, auf einer Karte darstellen und anschließend als Rasterdatensatz untersuchen kannst.

Ein Echtfarbbild stellt die Erdoberfläche ähnlich dar, wie sie mit dem menschlichen Auge wahrgenommen wird. Dadurch lassen sich beispielsweise Siedlungsflächen, Gewässer, Vegetation oder Wolken leicht erkennen.

Satellitenaufnahme der Stadt Bremen (Sentinel 2)

Satellitenaufnahme der Stadt Bremen (Sentinel 2)

1 Räumliche Ausdehnung festlegen

Zunächst wird festgelegt, für welches Gebiet das Satellitenbild 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 Aufnahmen aus dem Juni 2024 berücksichtigt.

Die zeitliche Eingrenzung ist besonders wichtig, da für ein Gebiet viele Satellitenaufnahmen zu unterschiedlichen Zeitpunkten verfügbar sein können.

temporal_extent = ["2024-06-01", "2024-06-30"]

3 Echtfarbbild 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 eigentlichen Bilddaten auch räumliche Informationen gespeichert werden.

Anschließend wird die Bibliothek cdec importiert. Mit der Funktion download_tci() wird ein passendes Echtfarbbild 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.
  • max_cloud_cover=10 begrenzt die zulässige Wolkenbedeckung bei der Auswahl einer Satellitenaufnahme.

Nach erfolgreicher Ausführung befindet sich das Satellitenbild unter dem zuvor angegebenen Dateipfad.

file_path = "data/tci.tif"
import cdec

cdec.download_tci(
    file_path,
    spatial_extent=spatial_extent,
    temporal_extent=temporal_extent,
    max_cloud_cover=10
)
Authenticated using refresh token.
PosixPath('/Users/soeren/PycharmProjects/cdec/how-to/notebooks/data/tci.tif')

4 Rasterdaten auf einer Karte anzeigen

Das heruntergeladene Satellitenbild 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. Der Parameter name legt fest, unter welchem Namen die Ebene in der Karte angezeigt wird.

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="Echtfarbbild",
)

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 Bilddaten 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: 3
Data type: ('uint8', 'uint8', 'uint8')
Shape: (1005, 1228)
Coordinate Reference System: EPSG:32632

7 Pixelwerte auslesen

Mit src.read() werden die eigentlichen Rasterdaten aus der Datei gelesen und in der Variable data gespeichert.

Das Ergebnis ist ein mehrdimensionales Array. Es enthält für jedes Rasterband die zugehörigen Pixelwerte des Satellitenbildes.

Durch die Ausgabe von data können Aufbau und Werte des Arrays direkt untersucht werden.

data = src.read()
data
array([[[201, 195, 187, ..., 115,  98,  85],
        [181, 183, 175, ..., 119,  88,  84],
        [151, 160, 155, ...,  83,  89,  87],
        ...,
        [113, 118, 106, ..., 198, 194, 192],
        [114, 113,  95, ..., 206, 198, 193],
        [114, 106,  96, ..., 217, 209, 204]],

       [[189, 188, 183, ..., 109, 107, 108],
        [158, 170, 161, ..., 117, 108, 109],
        [128, 142, 144, ..., 103, 107, 111],
        ...,
        [116, 118, 124, ..., 193, 183, 180],
        [117, 121, 126, ..., 204, 197, 190],
        [117, 124, 127, ..., 216, 205, 199]],

       [[157, 169, 165, ...,  79,  83,  70],
        [119, 135, 142, ...,  83,  80,  72],
        [109, 117, 123, ...,  67,  79,  74],
        ...,
        [ 92,  95,  94, ..., 190, 169, 166],
        [ 95,  94,  90, ..., 203, 192, 184],
        [ 98,  89,  87, ..., 213, 205, 200]]],
      shape=(3, 1005, 1228), dtype=uint8)

8 Rasterdaten visualisieren

Zum Abschluss werden die eingelesenen Rasterdaten direkt im Notebook dargestellt.

Die Funktion show() aus rasterio.plot erzeugt aus den Rasterwerten eine grafische Darstellung. Dadurch lässt sich überprüfen, wie die eingelesenen Daten aussehen, bevor weitere Verarbeitungsschritte durchgeführt werden.

from rasterio.plot import show

show(data)

Wiederverwendung

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