Rasterio Python kullanarak NDVI hesaplamasında sorun

Sep 19 2020

Aşağıdaki kodu kullanarak Landsat 7'nin iki kırpılmış raster görüntüsünü (maske dosyası kullanılarak kırpılmış NIR ve Kırmızı Bantlar) kullanarak NDVI'yı hesaplamaya çalışıyorum:

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)

Yukarıdaki kodda her iki bant (Kırmızı ve NIR) farklı şekillere sahiptir (farklı satırlar ve sütunlar). Yukarıdaki kodu çalıştırdıktan sonra "ValueError: işlenenler şekillerle birlikte yayınlanamaz (2730,3635) (2731,3660)" mesajını alıyorum.

Ancak ArcMap'te (Raster Hesaplayıcı kullanarak) yapmaya çalıştığım aynı NDVI hesaplaması yapıldığında, NDVI hesaplanıyor.

Birisi bu hatayı çözmeme yardım edebilir mi?

Yanıtlar

4 snowman2 Sep 19 2020 at 07:52

Sorununuzu çözmek için ızgaraların aynı alanı kapladığından ve aynı boyutlarda olduğundan emin olmanız gerekir. Bunu başarmanın bir yöntemi reproject_match yöntemidir rioxarray(rasterio tarafından desteklenen jeo-uzamsal xarray uzantısı).

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()