Mam raster wartości:
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)
Jak z tego rastra mogę przypisać wartości (lub zmienić wartości) 8 sąsiednim komórkom bieżącej komórki zgodnie z tą ilustracją? W bieżącej komórce umieściłem czerwony punkt z tej linii kodu:
points(xFromCol(r, col=5), yFromRow(r, row=5),col="red",pch=16)
Tutaj oczekiwany wynik to:
gdzie wartość bieżącej komórki (tj. 5 w rastrze wartości) jest zastępowana przez 0.
Ogólnie nowe wartości dla 8 sąsiednich komórek należy obliczyć w następujący sposób:
Nowa wartość = średnia wartości komórek zawartych w czerwonym prostokącie * odległość między bieżącą komórką (czerwony punkt) a sąsiednią komórką (tj. Sqrt (2) dla sąsiednich komórek po przekątnej lub 1 w innym przypadku)
Aktualizacja
Kiedy granice dla sąsiednich komórek są poza granicami rastra, muszę obliczyć nowe wartości dla sąsiednich komórek, które spełniają warunki. Sąsiednie komórki, które nie spełniają warunków, będą równe „NA”.
Na przykład, jeśli pozycją odniesienia jest c (1,1) zamiast c (5,5) za pomocą notacji [wiersz, kol], można obliczyć tylko nową wartość w prawym dolnym rogu. Zatem oczekiwany wynik to:
[,1] [,2] [,3]
[1,] NA NA NA
[2,] NA 0 NA
[3,] NA NA New_value
Na przykład, jeśli pozycją odniesienia jest c (3,1), można obliczyć tylko nowe wartości w prawym górnym, prawym i prawym dolnym rogu. Zatem oczekiwany wynik to:
[,1] [,2] [,3]
[1,] NA NA New_value
[2,] NA 0 New_value
[3,] NA NA New_value
Oto moja pierwsza próba focal
zrobienia tego przy użyciu funkcji, ale mam pewne trudności z utworzeniem automatycznego kodu.
Wybierz sąsiednie komórki
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)
jeśli sąsiednia komórka znajduje się w lewym górnym rogu bieżącej komórki
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))
jeśli sąsiednia komórka znajduje się w górnym środkowym rogu bieżącej komórki
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))
jeśli sąsiednia komórka znajduje się w lewym górnym rogu bieżącej komórki
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))
jeśli sąsiednia komórka znajduje się w lewym rogu bieżącej komórki
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))
jeśli sąsiednia komórka znajduje się w prawym rogu bieżącej komórki
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))
jeśli sąsiednia komórka znajduje się w lewym dolnym rogu bieżącej komórki
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))
jeśli sąsiednia komórka znajduje się w środkowym dolnym rogu bieżącej komórki
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))
jeśli sąsiednia komórka znajduje się w prawym dolnym rogu bieżącej komórki
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))
. Jak mogę uzyskać wynik tylko dla 8 sąsiednich komórek bieżącej komórki, a nie dla całego rastra? Tutaj, wynik powinien być: res <- matrix(c(7.42,0,0,0,0,0,0,0,0), nrow=3, ncol=3, byrow = T)
. Wielkie dzięki !
raster
pakiet R ifocal()
funkcję (s. 90 dokumentacji): cran.r-project.org/web/packages/raster/raster.pdf