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))
raster
package de R et lafocal()
fonction (documentation p. 90): cran.r-project.org/web/packages/raster/raster.pdfmat <- 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 !Réponses:
La fonction
AssignValuesToAdjacentRasterCells
ci-dessous renvoie un nouvel objet RasterLayer avec les valeurs souhaitées attribuées à partir de l' entrée raster d' origine . La fonction vérifie si les cellules adjacentes de la position de référence se trouvent dans les limites du raster. Il affiche également des messages si une limite est sortie. Si vous devez déplacer la position de référence, vous pouvez simplement écrire une itération changeant la position d'entrée en c ( i , j ).Entrée de données
Une fonction
Exécuter des exemples
Exemples de tracé
Exemple de figure
Remarque: les
NA
valeurs moyennes des globules blancsla source
Pour un opérateur matriciel sur une petite matrice, cela a du sens et est traitable. Cependant, vous voudrez peut-être vraiment repenser votre logique lorsque vous appliquez une fonction comme celle-ci à un grand raster. Conceptuellement, cela ne suit pas vraiment dans une application générale. Vous parlez de ce que l'on appelle traditionnellement une statistique globale. Cependant, une statistique de bloc est par nature commençant à un coin du raster et remplaçant des blocs de valeurs, dans une taille de fenêtre spécifiée, par un opérateur. Normalement, ce type d'opérateur sert à l'agrégation de données. Il serait beaucoup plus facile à utiliser si vous envisagiez d'utiliser des conditions pour calculer la valeur centrale d'une matrice. De cette façon, vous pouvez facilement utiliser une fonction focale.
Gardez simplement à l'esprit que la fonction focale raster lit des blocs de données qui représentent les valeurs focales dans le voisinage défini en fonction de la matrice passée à l'argument w. Le résultat est un vecteur pour chaque quartier et le résultat de l'opérateur focal est affecté uniquement à la cellule focale et non au quartier entier. Considérez-le comme saisissant une matrice entourant une valeur de cellule, agissant dessus, attribuant une nouvelle valeur à la cellule puis se déplaçant vers la cellule suivante.
Si vous vous assurez que na.rm = FALSE, le vecteur représentera toujours le voisinage exact (c'est-à-dire le même vecteur de longueur) et sera contraint en un objet matriciel qui peut être opéré dans une fonction. Pour cette raison, vous pouvez simplement écrire une fonction qui prend le vecteur attendu, contraint dans une matrice, applique votre logique de notation de voisinage et attribue ensuite une seule valeur comme résultat. Cette fonction peut ensuite être passée à la fonction raster :: focal.
Voici ce qui se passerait dans chaque cellule sur la base d'une simple contrainte et d'une évaluation de la fenêtre focale. L'objet "w" serait essentiellement la même définition de matrice que l'on passerait l'argument w en focale. C'est ce qui définit la taille du vecteur de sous-ensemble dans chaque évaluation focale.
Maintenant, créez une fonction qui peut être appliquée à la focale applique la logique ci-dessus. Dans ce cas, vous pouvez affecter l'objet se comme valeur ou l'utiliser comme condition dans quelque chose comme "ifelse" pour attribuer une valeur basée sur une évaluation. J'ajoute l'instruction ifelse pour illustrer comment on évaluerait plusieurs conditions du voisinage et appliquerait une condition de position de matrice (notation de voisinage). Dans cette fonction factice, la coercition de x sur une matrice est complètement inutile et il suffit d'illustrer comment cela serait fait. On peut appliquer des conditions de notation de voisinage directement au vecteur, sans coercition matricielle, car la position dans le vecteur s'appliquerait à son emplacement dans la fenêtre focale et resterait fixe.
Et appliquez-le à un raster
la source
Vous pouvez facilement mettre à jour les valeurs raster en sous-configurant le raster en utilisant la notation [row, col]. Notez simplement que la ligne et la colonne commencent à partir du coin supérieur gauche du raster; r [1,1] est l'indice de pixel supérieur gauche et r [2,1] est celui sous r [1,1].
la source