1

入力ラスターは複数のレイヤーで構成されており、それぞれのレイヤーにはデータ値が含まれていない画像領域があります。これらのレイヤーは完全には重なっておらず、すべてのバンドの交点 (どのレイヤーにも NoData 値がないゾーン) のみで構成されるファイルを出力しようとしています。

以下はいくつかのレイヤーで機能しますが、実際のファイルにある 50 以上 (少なくとも 3000x3000 ピクセル) では機能しません。

library(raster)

fin = "D:\\temp\\all_modes.pix"
fout = "D:\\temp\\test.pix"

inbands = stack(fin, bands = c(3:20))
NAvalue(inbands) = 0

# Not great:
#out = all(is.na(inbands) == FALSE) * inbands
#writeRaster(out, filename=fout, format="PCIDSK", dtype="INT2U", overwrite=TRUE, NAflag=0)

# A little better:
#mymask = all(as.logical(inbands))
#mask(inbands, mymask, filename=fout, format="PCIDSK", dtype="INT2U", overwrite=TRUE, NAflag=0)

# Even better, don't need to keep everything (but still not efficient):
#trim(all(as.logical(inbands)) * inbands, filename=fout, format="PCIDSK", dtype="INT2U", overwrite=TRUE, NAflag=0)

# Even better, calculations get smaller as we progress (is it possible to do even better?)
for(i in 1:nlayers(inbands)){
 band_i = subset(inbands, i)
 inbands = trim(as.logical(band_i) * inbands)
}
writeRaster(inbands, filename=fout, format="PCIDSK", dtype="INT2U", overwrite=TRUE, NAflag=0)

これをより効率的に行う/多数のレイヤーで動作させる方法についてのアイデアはありますか?

4

3 に答える 3

2

私は最初にこれを提案しました:

x <- trim(inband, filename='fout')

しかし、少なくとも1つのレイヤーの値がNAではない領域(行/列)が返されるため、希望どおりの結果が得られないことがわかりました。NAではない値を持つすべての領域ではなく。

以下は効率的かもしれません。少なくとも1つのNA値を持つすべてのセルは、合計付きのNAになります(デフォルトでは、na.rm = FALSE)。

x <- sum(inband)
x <- trim(x)
r <- crop(inband, x)

おそらく続いて

r <- mask(r, x)

xのNAの場合、rのすべてのセルをNAに設定します

于 2011-04-09T03:58:26.620 に答える
1

答えてくれてありがとう、彼らは私に良いアイデアをくれました。私はこれを思いつきました。これははるかに高速です。

myraster = stack(fn, bands) # You get the idea
NAvalue(myraster) = 0

# Tranform to 1 where there is data    
logical_raster = as.logical(myraster)

# Make a raster with 1 in the zone of intersection
a = subset(myraster, 1)
values(a) = TRUE
for(i in 1:nlayers(myraster)) {
  a = a & logical_raster[[i]]
}

# Apply the "mask" and trim to intersection extent
myraster = myraster * a
intersect_only = trim(myraster)
于 2011-04-15T16:55:37.970 に答える
0

all/anyは、長いリストに対して論理 AND/OR を実行する方法であることを発見しました。ここでは、小さなラスターで目的を達成する 2 つの同一のプロットを示します。

#dummy data
m1 = cbind(matrix(NA, nrow = 4, ncol = 2), matrix(1, nrow = 4, ncol = 2))
m2 = t(m1)
m3 = matrix(rep(c(1, NA), 8), nrow = 4)
inbands = stack(lapply(list(m1, m2, m3), raster))

# first method, using & operator 
plot(inbands[[1]] & inbands[[2]] & inbands[[3]])

# second method, using `all`
plot(all(inbands))

私のシステムでは、数値を論理に強制するという警告があります。次の 2 つの方法は警告を回避しますが、遅くなる可能性がありますか? これらは論理的には同等ですが、それらを相互に比較したり、上記の 2 番目の方法と比較したりする場合があります。

plot(all(!is.na(inbands)))
plot(!any(is.na(inbands)))
于 2011-04-09T09:24:02.503 に答える