値ラスターがあります:
m <- matrix(c(2,4,5,5,2,8,7,3,1,6,
5,7,5,7,1,6,7,2,6,3,
4,7,3,4,5,3,7,9,3,8,
9,3,6,8,3,4,7,3,7,8,
3,3,7,7,5,3,2,8,9,8,
7,6,2,6,5,2,2,7,7,7,
4,7,2,5,7,7,7,3,3,5,
7,6,7,5,9,6,5,2,3,2,
4,9,2,5,5,8,3,3,1,2,
5,2,6,5,1,5,3,7,7,2),nrow=10, ncol=10, byrow = T)
r <- raster(m)
extent(r) <- matrix(c(0, 0, 10, 10), nrow=2)
plot(r)
text(r)
このラスターから、この図に従って現在のセルの8つの隣接するセルに値を割り当てる(または値を変更する)にはどうすればよいですか?このコード行から現在のセル内に赤い点を配置しました。
points(xFromCol(r, col=5), yFromRow(r, row=5),col="red",pch=16)
ここで、期待される結果は次のようになります。
現在のセルの値(つまり、値ラスタの5)は0に置き換えられます。
全体として、8つの隣接セルの新しい値は次のように計算する必要があります。
新しい値=赤い長方形に含まれるセル値の平均*現在のセル(赤い点)と隣接するセル間の距離(つまり、斜めに隣接するセルの場合はsqrt(2)、そうでない場合は1)
更新
隣接セルの境界がラスターの制限を超えている場合、条件を尊重する隣接セルの新しい値を計算する必要があります。条件を尊重しない隣接セルは「NA」に等しくなります。
たとえば、[row、col]表記を使用して参照位置がc(5,5)ではなくc(1,1)である場合、右下隅の新しい値のみを計算できます。したがって、期待される結果は次のようになります。
[,1] [,2] [,3]
[1,] NA NA NA
[2,] NA 0 NA
[3,] NA NA New_value
たとえば、参照位置がc(3,1)の場合、右上隅、右隅、および右下隅の新しい値のみを計算できます。したがって、期待される結果は次のようになります。
[,1] [,2] [,3]
[1,] NA NA New_value
[2,] NA 0 New_value
[3,] NA NA New_value
関数を使用してこれを初めて試みましfocal
たが、自動コードを作成するのは少し困難です。
隣接するセルを選択
mat_perc <- matrix(c(1,1,1,1,1,
1,1,1,1,1,
1,1,0,1,1,
1,1,1,1,1,
1,1,1,1,1), nrow=5, ncol=5, byrow = T)
cell_perc <- adjacent(r, cellFromRowCol(r, 5, 5), directions=mat_perc, pairs=FALSE, sorted=TRUE, include=TRUE)
r_perc <- rasterFromCells(r, cell_perc)
r_perc <- setValues(r_perc,extract(r, cell_perc))
plot(r_perc)
text(r_perc)
隣接するセルが現在のセルの左上隅にある場合
focal_m <- matrix(c(1,1,NA,1,1,NA,NA,NA,NA), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)*sqrt(2)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
隣接セルが現在のセルの中央上部にある場合
focal_m <- matrix(c(1,1,1,1,1,1,NA,NA,NA), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
隣接するセルが現在のセルの左上隅にある場合
focal_m <- matrix(c(NA,1,1,NA,1,1,NA,NA,NA), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)*sqrt(2)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
隣接するセルが現在のセルの左隅にある場合
focal_m <- matrix(c(1,1,NA,1,1,NA,1,1,NA), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
隣接するセルが現在のセルの右隅にある場合
focal_m <- matrix(c(NA,1,1,NA,1,1,NA,1,1), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
隣接するセルが現在のセルの左下隅にある場合
focal_m <- matrix(c(NA,NA,NA,1,1,NA,1,1,NA), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)*sqrt(2)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
隣接するセルが現在のセルの中央下隅にある場合
focal_m <- matrix(c(NA,NA,NA,1,1,1,1,1,1), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
隣接するセルが現在のセルの右下隅にある場合
focal_m <- matrix(c(NA,NA,NA,NA,1,1,NA,1,1), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)*sqrt(2)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
mat <- matrix(c(1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0), nrow=5, ncol=5, byrow = T)
f.rast <- function(x) mean(x)*sqrt(2)
aggr <- as.matrix(focal(r, mat, f.rast))
。すべてのラスタではなく、現在のセルの8つの隣接セルのみの結果を取得するにはどうすればよいですか?ここで、結果は次のようになりますres <- matrix(c(7.42,0,0,0,0,0,0,0,0), nrow=3, ncol=3, byrow = T)
。どうもありがとう !
raster
パッケージとfocal()
関数を確認してください(p。90