Lagi

Fungsi untuk raster hiperspektral dengan 3 variabel kesalahan tak terduga


Saya sedang menulis skrip untuk mengekstrak indeks vegetasi dari kubus data hiperspektral. Salah satu indeksnya adalah Indeks Vegetasi Segitiga yang saya tulis fungsinya sebagai berikut:

TVI2 <- function(h,m,l) { (1.5*(2.5*(hm)-1.3*(hl))/sqrt((2*h+1)^2-(6*h-5*sqrt( m)-0,5)))) }

Variabel berdiri untuk panjang gelombang yang berbeda dalam forum. Saya memiliki objek rasterbrick yang berisi semua 8 raster dan 101 band per raster. Untuk memanggil raster dan panjang gelombang tertentu saya menggunakan:

raster(r[[1]], lapisan=1)

Dan ini berfungsi dengan baik untuk menghitung indeks hanya dengan 2 variabel, seperti fungsi NDVI:

ndvi1 <- NDVI(raster(r[[1]], lapisan=41),(raster(r[[1]], lapisan=71)))

Namun jika saya ingin menggunakan pengaturan yang sama untuk fungsi TVI2:

tvi1 <- TVI2(raster(r[[1]], lapisan=71),(raster(r[[1]], lapisan=45),(raster(r[[1]], lapisan=21))) )

Saya terus mendapatkan kesalahan berikut:

Kesalahan: tak terduga ',' di "tvi1 <- TVI2(raster(r[[1]], layer=71),(raster(r[[1]], layer=45),"

Sepertinya saya tidak bisa mencari tahu mengapa. Jika saya tidak menggunakan panggilan raster sebagai variabel terakhir, tetapi hanya angka, fungsi berjalan dengan baik.

Adakah ide tentang bagaimana menyelesaikan ini?


Anda harus meneruskan fungsi Anda ke "overlay" bersama dengan pita spektral yang sesuai di bata raster Anda. Contoh ini akan menarik pita ke-71, ke-45 dan ke-21 dari sebuah objek bata.

tvi1 <- overlay(r[[71]], r[[45]], r[[21]], kesenangan = TVI2)

Anda mungkin perlu menulis ulang fungsi Anda sehingga kondisi kesalahan diperhitungkan.

Saya tidak jelas tentang struktur data Anda, tampaknya aneh dan Anda tidak memberikan informasi yang cukup untuk memahami bagaimana Anda memformat data Anda. Karena sintaks sering menjadi inti dari masalah R, ini adalah masalah. Anda tidak perlu memaksa setiap band menggunakan raster. Pita dalam tumpukan/bata raster sudah menjadi objek raster. Jika "r" hanyalah daftar nama raster maka Anda harus membuat tumpukan raster atau batu bata yang sebenarnya. Apakah Anda menyimpan serangkaian batu bata raster dalam daftar? Jika demikian, mengapa?


Jadi, Anda memiliki daftar 8 objek RasterBrick

r <- lapply(1:8, function(x) brick(system.file("external/rlogo.grd", package="raster")) )

Dan sebuah fungsi

TVI2 <- function(h,m,l) { (1.5*(2.5*(hm)-1.3*(hl))/sqrt((2*h+1)^2-(6*h-5*sqrt( m)-0,5)))) }

Sekarang Anda bisa melakukannya

x <- TVI2(raster(r[[1]], lapisan=1), raster(r[[1]], lapisan=2), raster(r[[1]], lapisan=3))

Yang setara dengan

x <- TVI2(raster(r[[1]][[1]]), raster(r[[1]][[2]]), raster(r[[1]][[3]]))

Ini tidak berhasil untuk Anda karena tanda kurung Anda tidak cocok. Atau, mengikuti Jeffrey Evans:

y <- hamparan(r[[1]][[1:3]], kesenangan=TVI2)

dengan indeks yang Anda gunakan (ini tidak akan berfungsi dengan data contoh)

hamparan(r[[1]][[c(71, 45, 21)]], kesenangan = TVI2)

panggilanTVI2denganhamparanseharusnya lebih efisien daripada memanggilnya langsung denganLapisan Rasterargumen


Tonton videonya: Analisis Numerik Kesalahan Relatif dan Kesalahan Absolut (Oktober 2021).