パッケージ:
データ:
- 10バンドのrasterStack。
- 各バンドには、NAで囲まれた画像領域が含まれています
- バンドは論理的です。つまり、画像データの場合は「1」、周辺領域の場合は「0」/NAです。
- ほとんどのバンドには部分的なオーバーラップがありますが、各バンドの「画像領域」は互いに完全に整列していません。
目的:
- 各「ゾーン」のrasterLayerまたはセル番号のいずれかを返すことができる高速関数を記述します。たとえば、バンド1と2からのデータのみを含むピクセルはゾーン1に分類され、バンド3と4からのデータのみを含むピクセルはゾーン2に分類されます。 、など。rasterLayerが返された場合、後でゾーン値をバンド番号と一致させることができる必要があります。
最初の試み:
# Possible band combinations
values = integer(0)
for(i in 1:nlayers(myraster)){
combs = combn(1:nlayers(myraster), i)
for(j in 1:ncol(combs)){
values = c(values, list(combs[,j]))
}
}
# Define the zone finding function
find_zones = function(bands){
# The intersection of the bands of interest
a = subset(myraster, 1)
values(a) = TRUE
for(i in bands){
a = a & myraster[[i]]
}
# Union of the remaining bands
b = subset(myraster, 1)
values(b) = FALSE
for(i in seq(1:nlayers(myraster))[-bands]){
b = b | myraster[[i]]
}
#plot(a & !b)
cells = Which(a & !b, cells=TRUE)
return(cells)
}
# Applying the function
results = lapply(values, find_zones)
現在の関数の実行には非常に長い時間がかかります。もっと良い方法を考えられますか?各ピクセルにデータがあるバンドの数を知りたいだけでなく、どのバンドも知りたいことに注意してください。これの目的は、後で異なる領域を異なる方法で処理することです。
また、実際のシナリオは3000 x 3000以上のラスターであり、10バンドを超える可能性があることにも注意してください。
編集
10個のオフセット画像領域で構成されるサンプルデータ:
# Sample data
library(raster)
for(i in 1:10) {
start_line = i*10*1000
end_line = 1000000 - 800*1000 - start_line
offset = i * 10
data = c(rep(0,start_line), rep(c(rep(0,offset), rep(1,800), rep(0,200-offset)), 800), rep(0, end_line))
current_layer = raster(nrows=1000, ncols=1000)
values(current_layer) = data
if(i == 1) {
myraster = stack(current_layer)
} else {
myraster = addLayer(myraster, current_layer)
}
}
NAvalue(myraster) = 0 # You may not want to do this depending on your solution...