J'ai un raster de valeur:
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)
À partir de ce raster, comment puis-je attribuer des valeurs (ou modifier des valeurs) aux 8 cellules adjacentes de la cellule actuelle selon cette illustration? J'ai placé un point rouge dans la cellule actuelle de cette ligne de code:
points(xFromCol(r, col=5), yFromRow(r, row=5),col="red",pch=16)
Ici, le résultat attendu sera:
où la valeur de la cellule actuelle (c'est-à-dire 5 dans le raster de valeurs) est remplacée par 0.
Globalement, les nouvelles valeurs pour les 8 cellules adjacentes doivent être calculées comme suit:
Nouvelle valeur = moyenne des valeurs des cellules contenues dans le rectangle rouge * distance entre la cellule actuelle (point rouge) et la cellule adjacente (c.-à-d. Sqrt (2) pour les cellules adjacentes en diagonale ou 1 sinon)
Mise à jour
Lorsque les limites des cellules adjacentes sont hors des limites du raster, je dois calculer de nouvelles valeurs pour les cellules adjacentes qui respectent les conditions. Les cellules adjacentes qui ne respectent pas les conditions seront égales à "NA".
Par exemple, si la position de référence est c (1,1) au lieu de c (5,5) en utilisant la notation [ligne, col], seule la nouvelle valeur dans le coin inférieur droit peut être calculée. Ainsi, le résultat attendu sera:
[,1] [,2] [,3]
[1,] NA NA NA
[2,] NA 0 NA
[3,] NA NA New_value
Par exemple, si la position de référence est c (3,1), seules les nouvelles valeurs dans les coins supérieur droit, droit et inférieur droit peuvent être calculées. Ainsi, le résultat attendu sera:
[,1] [,2] [,3]
[1,] NA NA New_value
[2,] NA 0 New_value
[3,] NA NA New_value
Voici ma première tentative en utilisant la fonction, focal
mais j'ai du mal à créer un code automatique.
Sélectionnez les cellules adjacentes
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)
si la cellule adjacente est située dans le coin supérieur gauche de la cellule actuelle
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))
si la cellule adjacente est située dans le coin supérieur moyen de la cellule actuelle
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))
si la cellule adjacente est située dans le coin supérieur gauche de la cellule actuelle
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))
si la cellule adjacente est située dans le coin gauche de la cellule actuelle
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))
si la cellule adjacente est située dans le coin droit de la cellule actuelle
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))
si la cellule adjacente est située dans le coin inférieur gauche de la cellule actuelle
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))
si la cellule adjacente est située dans le coin inférieur-milieu de la cellule actuelle
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))
si la cellule adjacente est située dans le coin inférieur droit de la cellule actuelle
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))
. Comment puis-je obtenir le résultat uniquement pour les 8 cellules adjacentes de la cellule actuelle et pas pour tout le raster? Ici, le résultat devrait être: res <- matrix(c(7.42,0,0,0,0,0,0,0,0), nrow=3, ncol=3, byrow = T)
. Merci beaucoup !
raster
package de R et lafocal()
fonction (documentation p. 90): cran.r-project.org/web/packages/raster/raster.pdf