Problem bei der Berechnung des NDVI mit Rasterio Python

Sep 19 2020

Ich versuche, den NDVI mithilfe von zwei abgeschnittenen Rasterbildern von Landsat 7 (NIR- und rote Bänder, die mithilfe einer Maskendatei abgeschnitten wurden) mit dem folgenden Code zu berechnen:

import rasterio as rio
import numpy as np
import matplotlib.pyplot as plt

with rio.open(r'D:\clip_test_b3.tif') as src:
    red = src.read(1)   # (Rows, Columns) = (2731, 3660)
    
with rio.open(r'D:\clip_test_b4.tif') as src:
    nir = src.read(1)   # (Rows, Columns) = (2730, 3635)
    
np.seterr(divide = 'ignore', invalid = 'ignore')

ndvi = (nir.astype(float) - red.astype(float))/(nir + red)

plt.imshow(ndvi)

Im obigen Code haben beide Bänder (Rot & NIR) unterschiedliche Formen (unterschiedliche Zeilen und Spalten). Nach dem Ausführen des obigen Codes wird die Meldung "ValueError: Operanden konnten nicht zusammen mit Shapes (2730,3635) (2731,3660) gesendet werden" angezeigt.

Wenn jedoch dieselbe NDVI-Berechnung in ArcMap (mit Raster Calculator) durchgeführt wird, wird NDVI berechnet.

Kann mir bitte jemand bei der Behebung dieses Fehlers helfen?

Antworten

4 snowman2 Sep 19 2020 at 07:52

Um Ihr Problem zu lösen, müssen Sie sicherstellen, dass die Gitter denselben Bereich abdecken und dieselben Abmessungen haben. Eine Methode, um dies zu erreichen, ist die Methode reproject_match in rioxarray(geospatial xarray extension, unterstützt von rasterio).

import rioxarray

red = rioxarray.open_rasterio("D:\clip_test_b3.tif")
nir_original = rioxarray.open_rasterio("D:\clip_test_b4.tif")

nir = nir_original.rio.reproject_match(red)
ndvi = (nir.astype(float) - red.astype(float))/(nir + red)

ndvi.plot()