У меня есть растровое значение:
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)
Из этого растра, как я могу назначить значения (или изменить значения) для 8 соседних ячеек текущей ячейки в соответствии с этой иллюстрацией? Я поместил красную точку в текущей ячейке из этой строки кода:
points(xFromCol(r, col=5), yFromRow(r, row=5),col="red",pch=16)
Здесь ожидаемый результат будет:
где значение текущей ячейки (т. е. 5 в растре значений) заменяется на 0.
В целом, новые значения для 8 соседних ячеек должны быть рассчитаны следующим образом:
Новое значение = среднее значение в ячейке, содержащейся в красном прямоугольнике * расстояние между текущей ячейкой (красная точка) и соседней ячейкой (т. Е. Sqrt (2) для соседних по диагонали ячеек или 1 в противном случае)
Обновить
Когда границы для соседних ячеек выходят за пределы растра, мне нужно вычислить новые значения для смежных ячеек, которые соответствуют условиям. Соседние ячейки, которые не соответствуют условиям, будут равны «NA».
Например, если ссылочная позиция равна c (1,1) вместо c (5,5) с использованием нотации [row, col], можно вычислить только новое значение в правом нижнем углу. Таким образом, ожидаемый результат будет:
[,1] [,2] [,3]
[1,] NA NA NA
[2,] NA 0 NA
[3,] NA NA New_value
Например, если исходная позиция c (3,1), могут быть рассчитаны только новые значения в верхнем правом, правом и нижнем правом углах. Таким образом, ожидаемый результат будет:
[,1] [,2] [,3]
[1,] NA NA New_value
[2,] NA 0 New_value
[3,] NA NA New_value
Вот моя первая попытка сделать это с помощью функции, focal
но у меня возникли некоторые трудности при создании автоматического кода.
Выберите соседние ячейки
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)
если соседняя ячейка расположена в верхнем левом углу текущей ячейки
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))
если соседняя ячейка расположена в верхнем среднем углу текущей ячейки
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))
если соседняя ячейка расположена в верхнем левом углу текущей ячейки
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))
если соседняя ячейка расположена в левом углу текущей ячейки
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))
если соседняя ячейка расположена в правом углу текущей ячейки
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))
если соседняя ячейка расположена в нижнем левом углу текущей ячейки
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))
если соседняя ячейка расположена в нижнем среднем углу текущей ячейки
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))
если соседняя ячейка находится в правом нижнем углу текущей ячейки
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))
. Как получить результат только для 8 соседних ячеек текущей ячейки, а не для всех растров? Здесь, результат должен быть: res <- matrix(c(7.42,0,0,0,0,0,0,0,0), nrow=3, ncol=3, byrow = T)
. Большое спасибо !
raster
пакетом иfocal()
функцией R (документация на стр. 90): cran.r-project.org/web/packages/raster/raster.pdf