Problem bei der Berechnung des NDVI mit Rasterio Python
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
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()