Tôi có một raster giá trị:
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)
Từ raster này, làm thế nào tôi có thể gán giá trị (hoặc thay đổi giá trị) cho 8 ô liền kề của ô hiện tại theo hình minh họa này? Tôi đã đặt một điểm đỏ trong ô hiện tại từ dòng mã này:
points(xFromCol(r, col=5), yFromRow(r, row=5),col="red",pch=16)
Ở đây, kết quả dự kiến sẽ là:
trong đó giá trị của ô hiện tại (nghĩa là 5 trong raster giá trị) được thay thế bằng 0.
Nhìn chung, các giá trị mới cho 8 ô liền kề phải được tính như sau:
Giá trị mới = trung bình của các giá trị ô chứa trong hình chữ nhật màu đỏ * khoảng cách giữa ô hiện tại (điểm đỏ) và ô liền kề (nghĩa là sqrt (2) cho các ô liền kề chéo hoặc 1 khác)
Cập nhật
Khi giới hạn cho các ô liền kề nằm ngoài giới hạn raster, tôi cần tính các giá trị mới cho các ô liền kề tôn trọng các điều kiện. Các ô liền kề không tôn trọng các điều kiện sẽ bằng "NA".
Ví dụ: nếu vị trí tham chiếu là c (1,1) thay vì c (5,5) bằng cách sử dụng ký hiệu [hàng, col], chỉ có thể tính giá trị mới ở góc dưới bên phải. Do đó, kết quả dự kiến sẽ là:
[,1] [,2] [,3]
[1,] NA NA NA
[2,] NA 0 NA
[3,] NA NA New_value
Ví dụ: nếu vị trí tham chiếu là c (3,1), chỉ có thể tính các giá trị mới ở góc trên bên phải, bên phải và dưới cùng bên phải. Do đó, kết quả dự kiến sẽ là:
[,1] [,2] [,3]
[1,] NA NA New_value
[2,] NA 0 New_value
[3,] NA NA New_value
Đây là nỗ lực đầu tiên của tôi ở đây bằng cách sử dụng hàm focal
nhưng tôi gặp một số khó khăn để tạo mã tự động.
Chọn các ô liền kề
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)
nếu ô liền kề nằm ở góc trên bên trái của ô hiện tại
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))
nếu ô liền kề nằm ở góc trên giữa của ô hiện tại
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))
nếu ô liền kề nằm ở góc trên bên trái của ô hiện tại
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))
nếu ô liền kề nằm ở góc trái của ô hiện tại
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))
nếu ô liền kề nằm ở góc bên phải của ô hiện tại
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))
nếu ô liền kề nằm ở góc dưới bên trái của ô hiện tại
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))
nếu ô liền kề nằm ở góc dưới cùng giữa của ô hiện tại
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))
nếu ô liền kề nằm ở góc dưới bên phải của ô hiện tại
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))
. Làm thế nào tôi có thể nhận được kết quả chỉ cho 8 ô liền kề của ô hiện tại và không phải tất cả các raster? Ở đây, kết quả sẽ là : res <- matrix(c(7.42,0,0,0,0,0,0,0,0), nrow=3, ncol=3, byrow = T)
. Cảm ơn rất nhiều !
raster
gói của R vàfocal()
chức năng (tài liệu trang 90): cran.r-project.org/web/packages/raster/raster.pdf