ปัญหาในการคำนวณ NDVI โดยใช้ Rasterio Python

Sep 19 2020

ฉันกำลังพยายามคำนวณ NDVI โดยใช้ภาพแรสเตอร์สองภาพของ Landsat 7 (NIR & Red Bands ตัดโดยใช้ไฟล์มาสก์) โดยใช้รหัสต่อไปนี้:

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)

ในโค้ดด้านบนทั้งสองแถบ (Red & NIR) มีรูปร่างต่างกัน (แถวและคอลัมน์ต่างกัน) หลังจากเรียกใช้โค้ดด้านบนฉันได้รับข้อความ "ValueError: ไม่สามารถออกอากาศตัวถูกดำเนินการร่วมกับรูปร่าง (2730,3635) (2731,3660)"

แต่เมื่อการคำนวณ NDVI เดียวกันฉันกำลังพยายามทำใน ArcMap (โดยใช้เครื่องคิดเลข Raster) ดังนั้น NDVI จะถูกคำนวณ

ใครช่วยได้โปรดช่วยฉันแก้ข้อผิดพลาดนี้

คำตอบ

4 snowman2 Sep 19 2020 at 07:52

ในการแก้ปัญหาของคุณคุณต้องแน่ใจว่ากริดครอบคลุมพื้นที่เดียวกันและมีขนาดเท่ากัน วิธีหนึ่งในการบรรลุเป้าหมายนี้คือด้วยเมธอดreproject_matchในrioxarray(ส่วนขยาย xarray geospatial ขับเคลื่อนโดย 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()