Saya memiliki raster nilai:
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)
Dari raster ini, bagaimana saya bisa menetapkan nilai (atau mengubah nilai) ke 8 sel yang berdekatan dari sel saat ini menurut ilustrasi ini? Saya menempatkan titik merah di dalam sel saat ini dari baris kode ini:
points(xFromCol(r, col=5), yFromRow(r, row=5),col="red",pch=16)
Di sini, hasil yang diharapkan adalah:
di mana nilai sel saat ini (yaitu, 5 dalam nilai raster) diganti dengan 0.
Secara keseluruhan, nilai baru untuk 8 sel yang berdekatan harus dihitung sebagai berikut:
Nilai baru = rata-rata nilai sel yang terkandung dalam persegi panjang merah * jarak antara sel saat ini (titik merah) dan sel yang berdekatan (yaitu, sqrt (2) untuk sel yang berdekatan secara diagonal atau 1 sebaliknya)
Memperbarui
Ketika batas untuk sel yang berdekatan berada di luar batas raster, saya perlu menghitung nilai baru untuk sel yang berdekatan yang menghormati kondisi. Sel-sel yang berdekatan yang tidak menghormati kondisinya akan sama dengan "NA".
Misalnya, jika posisi referensi adalah c (1,1) alih-alih c (5,5) dengan menggunakan notasi [baris, kolom], hanya nilai baru di sudut kanan bawah yang dapat dihitung. Dengan demikian, hasil yang diharapkan adalah:
[,1] [,2] [,3]
[1,] NA NA NA
[2,] NA 0 NA
[3,] NA NA New_value
Misalnya, jika posisi referensi adalah c (3,1), hanya nilai-nilai baru di sudut kanan atas, kanan dan kanan bawah dapat dihitung. Dengan demikian, hasil yang diharapkan adalah:
[,1] [,2] [,3]
[1,] NA NA New_value
[2,] NA 0 New_value
[3,] NA NA New_value
Ini adalah upaya pertama saya untuk ini dengan menggunakan fungsi focal
tetapi saya memiliki beberapa kesulitan untuk membuat kode otomatis.
Pilih sel yang berdekatan
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)
jika sel yang berdekatan terletak di sudut kiri atas sel saat ini
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))
jika sel yang berdekatan terletak di sudut tengah atas sel saat ini
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))
jika sel yang berdekatan terletak di sudut kiri atas sel saat ini
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))
jika sel yang berdekatan terletak di sudut kiri sel saat ini
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))
jika sel yang berdekatan terletak di sudut kanan sel saat ini
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))
jika sel yang berdekatan terletak di sudut kiri bawah sel saat ini
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))
jika sel yang berdekatan terletak di sudut tengah-bawah sel saat ini
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))
jika sel yang berdekatan terletak di sudut kanan bawah sel saat ini
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))
. Bagaimana saya bisa mendapatkan hasil hanya untuk 8 sel yang berdekatan dari sel saat ini dan tidak semua raster? Di sini, hasilnya harus: res <- matrix(c(7.42,0,0,0,0,0,0,0,0), nrow=3, ncol=3, byrow = T)
. Terima kasih banyak !
raster
paket R danfocal()
fungsinya (hlm. 90 dokumentasi): cran.r-project.org/web/packages/raster/raster.pdf