У мене є растрове значення:
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), використовуючи позначення [рядок, стовпчик], можна обчислити лише нове значення в правому нижньому куті. Таким чином, очікуваний результат буде:
[,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
пакетом R таfocal()
функцією (стор. 90 документації): cran.r-project.org/web/packages/raster/raster.pdf