Ich habe ein Werteraster:
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)
Wie kann ich in diesem Raster den 8 benachbarten Zellen der aktuellen Zelle Werte zuweisen (oder Werte ändern), wie in dieser Abbildung dargestellt? Ich habe einen roten Punkt in der aktuellen Zelle von dieser Codezeile platziert:
points(xFromCol(r, col=5), yFromRow(r, row=5),col="red",pch=16)
Hier wird das erwartete Ergebnis sein:
Dabei wird der Wert der aktuellen Zelle (dh 5 im Werteraster) durch 0 ersetzt.
Insgesamt müssen die neuen Werte für die 8 benachbarten Zellen wie folgt berechnet werden:
Neuer Wert = Durchschnitt der im roten Rechteck enthaltenen Zellenwerte * Abstand zwischen der aktuellen Zelle (roter Punkt) und der benachbarten Zelle (dh Quadrat (2) für diagonal benachbarte Zellen oder 1 auf andere Weise)
Aktualisieren
Wenn die Grenzen für die benachbarten Zellen außerhalb der Rastergrenzen liegen, muss ich neue Werte für die benachbarten Zellen berechnen, die die Bedingungen berücksichtigen. Die benachbarten Zellen, die die Bedingungen nicht einhalten, entsprechen "NA".
Wenn zum Beispiel die Referenzposition c (1,1) anstelle von c (5,5) unter Verwendung der [row, col] -Notation ist, kann nur der neue Wert in der unteren rechten Ecke berechnet werden. Das erwartete Ergebnis ist also:
[,1] [,2] [,3]
[1,] NA NA NA
[2,] NA 0 NA
[3,] NA NA New_value
Wenn die Referenzposition beispielsweise c (3,1) ist, können nur die neuen Werte in der oberen rechten, rechten und unteren rechten Ecke berechnet werden. Das erwartete Ergebnis ist also:
[,1] [,2] [,3]
[1,] NA NA New_value
[2,] NA 0 New_value
[3,] NA NA New_value
Hier ist mein erster Versuch, die Funktion zu verwenden, focal
aber ich habe einige Schwierigkeiten, einen automatischen Code zu erstellen.
Markieren Sie benachbarte Zellen
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)
Wenn sich die benachbarte Zelle in der oberen linken Ecke der aktuellen Zelle befindet
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))
Wenn sich die benachbarte Zelle in der oberen mittleren Ecke der aktuellen Zelle befindet
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))
Wenn sich die benachbarte Zelle in der oberen linken Ecke der aktuellen Zelle befindet
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))
Wenn sich die benachbarte Zelle in der linken Ecke der aktuellen Zelle befindet
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))
Wenn sich die benachbarte Zelle in der rechten Ecke der aktuellen Zelle befindet
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))
Wenn sich die benachbarte Zelle in der unteren linken Ecke der aktuellen Zelle befindet
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))
Wenn sich die benachbarte Zelle in der unteren mittleren Ecke der aktuellen Zelle befindet
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))
Wenn sich die benachbarte Zelle in der rechten unteren Ecke der aktuellen Zelle befindet
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))
. Wie kann ich das Ergebnis nur für die 8 benachbarten Zellen der aktuellen Zelle und nicht für das gesamte Raster erhalten? Hier sollte das Ergebnis sein: res <- matrix(c(7.42,0,0,0,0,0,0,0,0), nrow=3, ncol=3, byrow = T)
. Vielen Dank !
raster
Paket und diefocal()
Funktion an (S. 90 Dokumentation): cran.r-project.org/web/packages/raster/raster.pdf