NDVI (Vegetationsindex)

In diesem Notebook lernst du, wie du mit der Bibliothek cdec ein NDVI-Raster (Normalized Difference Vegetation Index) für einen bestimmten Ort und Zeitraum herunterladen, auf einer Karte darstellen und anschließend als Rasterdatensatz untersuchen kannst.

Der NDVI ist ein Vegetationsindex, der aus dem roten und nahinfraroten Spektralbereich von Satellitendaten berechnet wird. Hohe positive Werte deuten in der Regel auf dichte und gesunde Vegetation hin, Werte um 0 eher auf vegetationsarme oder versiegelte Flächen. Negative Werte treten häufig bei Wasserflächen oder Wolken auf.

1 Räumliche Ausdehnung festlegen

Zunächst wird festgelegt, für welches Gebiet der Vegetationsindex berechnet 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 NDVI-Raster herunterladen

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

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

Anschließend wird die Bibliothek cdec importiert. Mit der Funktion download_ndvi() wird ein passender Vegetationsindex für das zuvor definierte Gebiet und den ausgewählten Zeitraum heruntergeladen und berechnet.

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 der Satellitenaufnahmen.

Nach erfolgreicher Ausführung befindet sich das NDVI-Raster unter dem zuvor angegebenen Dateipfad.

file_path = "data/ndvi.tiff"
import cdec

cdec.download_ndvi(
    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/ndvi.tiff')

4 Rasterdaten auf einer Karte anzeigen

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

Dazu wird zunächst mit Map() eine Karte erzeugt. Mit add_raster() wird anschließend die zuvor heruntergeladene Rasterdatei als neue Ebene zur Karte hinzugefügt.

Die Farbskala RdYlGn stellt niedrige NDVI-Werte eher in Rot- und Gelbtönen und hohe NDVI-Werte in Grüntönen dar. Dadurch lässt sich der Vegetationszustand im Untersuchungsgebiet besonders gut erkennen.

from geolibre import Map

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

layer_id = m.add_cog(
    file_path,
    name="NDVI",
    colormap='RdYlGn'
)

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 NDVI-Werte 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: (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.

Da der NDVI als einzelnes Rasterband gespeichert wird, enthält das resultierende Array genau eine Ebene mit den berechneten Indexwerten für alle Pixel des Untersuchungsgebiets.

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

data = src.read()
data
array([[[-0.02400001,  0.03938732,  0.06452941, ...,  0.6181039 ,
          0.6471723 ,  0.72090113],
        [-0.02178426,  0.01866921,  0.05669169, ...,  0.60479665,
          0.7110429 ,  0.75684553],
        [ 0.11574406,  0.09125716,  0.1370492 , ...,  0.74276334,
          0.747279  ,  0.77054036],
        ...,
        [ 0.55185664,  0.5376079 ,  0.6437744 , ...,  0.04109587,
          0.0418535 ,  0.05184042],
        [ 0.5453677 ,  0.58345735,  0.7208706 , ...,  0.02859655,
          0.0277825 ,  0.05075957],
        [ 0.54533845,  0.64937586,  0.73238754, ..., -0.00319716,
         -0.0051576 , -0.00109085]]], shape=(1, 1005, 1228), dtype=float32)

8 Rasterdaten visualisieren

Zum Abschluss werden die eingelesenen Rasterdaten direkt im Notebook dargestellt.

Die Funktion imshow() aus plotly.express erzeugt aus den Rasterwerten eine grafische Darstellung. Durch die Farbskala RdYlGn werden niedrige NDVI-Werte eher rot und hohe NDVI-Werte grün eingefärbt. Dadurch lässt sich die räumliche Verteilung der Vegetation besonders anschaulich nachvollziehen.

from rasterio.plot import show

show(data)

import plotly.express as px

fig = px.imshow(
    data[0],
    color_continuous_scale="RdYlGn",
    color_continuous_midpoint=0.1,
    height=800,
)

fig.show()

Wiederverwendung

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