Suite

Fonction pour rasters hyperspectraux avec erreur inattendue à 3 variables


J'écris un script pour extraire des indices de végétation à partir de cubes de données hyperspectraux. L'un des indices est l'indice de végétation triangulaire pour lequel j'ai écrit la fonction suivante :

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

Les variables représentent différentes longueurs d'onde dans la formule. J'ai un objet rasterbrick contenant les 8 rasters et 101 bandes par raster. Pour appeler un raster et une longueur d'onde spécifiques, j'utilise :

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

Et cela fonctionne très bien pour calculer un index avec seulement 2 variables, comme la fonction NDVI :

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

Cependant si je veux utiliser cette même configuration pour la fonction TVI2 :

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

J'obtiens toujours l'erreur suivante :

Erreur : ',' inattendu dans "tvi1 <- TVI2(raster(r[[1]], layer=71),(raster(r[[1]], layer=45),"

Je n'arrive pas à comprendre pourquoi. Si je n'utilise pas l'appel raster comme dernière variable, mais juste un nombre, la fonction s'exécute correctement.

Des idées sur la façon de résoudre cela?


Vous devez passer votre fonction à "superposer" avec les bandes spectrales appropriées dans votre brique raster. Cet exemple tirerait les 71e, 45e et 21e bandes d'un objet en brique.

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

Vous devrez peut-être réécrire votre fonction pour que les conditions d'erreur soient prises en compte.

Je ne suis pas clair sur votre structure de données, cela semble étrange et vous ne fournissez pas assez d'informations pour comprendre comment vous avez formaté vos données. Puisque la syntaxe est souvent au cœur des problèmes de R, c'est un problème. Vous ne devriez pas avoir besoin de contraindre chaque bande à l'aide de raster. Les canaux d'une pile/brique raster sont déjà des objets raster. Si "r" n'est qu'une liste de noms de raster, vous devez créer une pile ou une brique de raster réelle. Stockez-vous une série de briques raster dans une liste ? Si oui, pourquoi?


Vous avez donc une liste de 8 objets RasterBrick

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

Et une fonction

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

Maintenant tu peux faire

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

Ce qui équivaut à

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

Cela n'a pas fonctionné pour vous car vos parenthèses ne correspondaient pas. Ou, à la suite de Jeffrey Evans :

y <- overlay(r[[1]][[1:3]], fun=TVI2)

avec les indices que vous utilisez (cela ne fonctionnera pas avec les données d'exemple)

superposition(r[[1]][[c(71, 45, 21)]], amusant = TVI2)

appelTVI2avecrecouvrirdevrait être plus efficace que de l'appeler directement avecCouche rasterarguments


Voir la vidéo: Point Cloud LIDAR Processing Demonstration (Octobre 2021).