Bir değer rasterim var:
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)
Bu taramadan, bu şekle göre mevcut hücrenin bitişik 8 hücresine nasıl değer atayabilirim (veya değerleri değiştirebilirim)? Bu kod satırından geçerli hücrenin içine kırmızı bir nokta yerleştirdim:
points(xFromCol(r, col=5), yFromRow(r, row=5),col="red",pch=16)
Burada beklenen sonuç:
burada mevcut hücrenin değeri (yani değer rasterinde 5) 0 ile değiştirilir.
Genel olarak, bitişik 8 hücre için yeni değerler aşağıdaki gibi hesaplanmalıdır:
Yeni değer = kırmızı dikdörtgenin içerdiği hücre değerlerinin ortalaması * geçerli hücre (kırmızı nokta) ve bitişik hücre arasındaki mesafe (yani, çapraz olarak bitişik hücreler için sqrt (2) veya 1 aksi takdirde)
Güncelleme
Bitişik hücreler için sınırlar tarama sınırlarının dışında olduğunda, koşullara uyan bitişik hücreler için yeni değerler hesaplamam gerekir. Koşullara uymayan bitişik hücreler "NA" ya eşit olacaktır.
Örneğin, referans konumu [satır, sütun] gösterimi kullanılarak c (5,5) yerine c (1,1) ise, yalnızca sağ alt köşedeki yeni değer hesaplanabilir. Böylece, beklenen sonuç:
[,1] [,2] [,3]
[1,] NA NA NA
[2,] NA 0 NA
[3,] NA NA New_value
Örneğin, referans konumu c (3,1) ise, yalnızca sağ üst, sağ ve sağ alt köşelerdeki yeni değerler hesaplanabilir. Böylece, beklenen sonuç:
[,1] [,2] [,3]
[1,] NA NA New_value
[2,] NA 0 New_value
[3,] NA NA New_value
İşte işlevi kullanarak bu benim ilk denemem focal
ama otomatik kod yapmak için bazı zorluklar var.
Bitişik hücreleri seçin
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)
bitişik hücre geçerli hücrenin sol üst köşesinde bulunuyorsa
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))
bitişik hücre geçerli hücrenin üst orta köşesinde bulunuyorsa
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))
bitişik hücre geçerli hücrenin sol üst köşesinde bulunuyorsa
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))
bitişik hücre geçerli hücrenin sol köşesinde bulunuyorsa
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))
bitişik hücre geçerli hücrenin sağ köşesinde bulunuyorsa
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))
bitişik hücre geçerli hücrenin sol alt köşesinde bulunuyorsa
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))
bitişik hücre geçerli hücrenin alt orta köşesinde bulunuyorsa
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))
bitişik hücre geçerli hücrenin sağ alt köşesinde bulunuyorsa
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))
. Tüm raster için değil, mevcut hücrenin sadece 8 bitişik hücresinin sonucunu nasıl elde edebilirim? Burada, sonucu olmalıdır: res <- matrix(c(7.42,0,0,0,0,0,0,0,0), nrow=3, ncol=3, byrow = T)
. Çok teşekkürler !
raster
paketini vefocal()
işlevini kontrol edin (s. 90 dokümantasyon): cran.r-project.org/web/packages/raster/raster.pdf