2016-05-09 11 views
0

私は72バンドラスタを計算しようとしています。最初の36バンドの値(近赤外線バンド)が後者の36バンドの値(短波赤外線バンド)より大きい場合、0に割り当てます。そうでない場合は、次の機能に進みます。私はそれを書いている他の方法(基本的に同じロジック)を試してみて、同じエラーが表示されます。複数のバンドを同時に計算する方法Rラスタ?

raster_stack <- stack("NIR.bin", "SWIR.bin") 
#ndii = NIR - SWIR/NIR+SWIR 

fun <- function(x) { 
     x[is.na(x)] <- 0; 
     if (x[37:72] >= x[1:36]){ 
      0} else { 
       ndii <- ((x[1:36]-x[37:72])/(x[1:36]+x[37:72])); 
       silent=TRUE; 
       return(ndii) 
       } 
} 
ndii <- calc(raster_stack, fun) 

エラーメッセージは、常にこのいずれかです:(、Xアウト)setValuesで

エラー:これは私が書いた関数である値は数値でなければなりません、整数、論理 または因子

NA値を取り除くためにx[is.na(x)] <- 0を追加しましたが、役に立たないようです。これを解決するための洞察?

+0

私はあなたが機能をクリーンアップする必要があると思います。 'nd'とは何ですか? 'silent = TRUE'コマンドは' return(nd) '行の後に来るので決して実行されません。このリンク[最小限で完全で検証可能な例を作成する方法](http://stackoverflow.com/help/mcve) – steveb

+0

をご覧になることをお勧めします。 「nd」は、この関数が計算しているndii値を示します。どんな洞察?私はループのために書こうとしましたが、どちらも役に立ちません。 –

+0

@Yuyunあなたはバイナリファイルをこのようにスタックできますか? –

答えて

0

いくつか問題があります。あなたのifステートメントは、36の値を比較しているので良くありません。また、データを行列のように扱う必要があります。

library(raster) 
raster_stack <- stack("NIR.bin", "SWIR.bin") 
#ndii = NIR - SWIR/NIR+SWIR 

fun <- function(x) { 
    y <- (x[,1:36]-x[,37:72])/(x[,1:36] + x[,37:72]) 
    i <- x[,37:72] >= x[,1:36] 
    y[i] <- 0 
    y 
} 
ndii <- calc(raster_stack, fun) 
関連する問題