가치 래스터가 있습니다.
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()
기능을 확인하십시오 (90 페이지 문서). cran.r-project.org/web/packages/raster/raster.pdf