У меня есть растровое значение:
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))
raster
пакетом иfocal()
функцией R (документация на стр. 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))
. Как получить результат только для 8 соседних ячеек текущей ячейки, а не для всех растров? Здесь, результат должен быть:res <- matrix(c(7.42,0,0,0,0,0,0,0,0), nrow=3, ncol=3, byrow = T)
. Большое спасибо !Ответы:
Приведенная
AssignValuesToAdjacentRasterCells
ниже функция возвращает новый объект RasterLayer с требуемыми значениями, назначенными из исходного растрового ввода. Функция проверяет, находятся ли соседние ячейки от референтной позиции в пределах растра. Он также отображает сообщения, если какая-то граница отсутствует. Если вам нужно переместить референтную позицию, вы можете просто написать итерацию, изменяющую входную позицию на c ( i , j ).Ввод данных
функция
Выполнить примеры
Примеры сюжетов
Пример рисунка
Примечание: средние
NA
значения белых клетокисточник
Для матричного оператора на малой матрице это имеет смысл и может быть учтено. Однако вы можете по-настоящему переосмыслить свою логику, применяя такую функцию к большому растру. Концептуально это не совсем соответствует общему применению. Вы говорите о том, что традиционно называлось статистикой блоков. Однако статистика блоков по своей природе начинается с одного угла растра и заменяет блоки значений в пределах указанного размера окна оператором. Обычно этот тип оператора предназначен для агрегирования данных. Это было бы значительно лучше, если бы вы думали с точки зрения использования условий для вычисления центрального значения матрицы. Таким образом, вы можете легко использовать фокусную функцию.
Просто имейте в виду, что функция фокусировки растра считывает блоки данных, которые представляют значения фокусировки в определенной окрестности на основе матрицы, переданной аргументу w. Результатом является вектор для каждой окрестности, а результат оператора фокуса присваивается только фокальной ячейке, а не всей окрестности. Думайте об этом как о захвате матрицы, окружающей значение ячейки, воздействии на нее, назначении нового значения ячейке и затем переходе к следующей ячейке.
Если вы убедитесь, что na.rm = FALSE, то вектор всегда будет представлять точную окрестность (т. Е. Вектор одинаковой длины) и будет приведен к матричному объекту, с которым можно работать в функции. По этой причине вы можете просто написать функцию, которая принимает вектор ожидания, приводит в матрицу, применяет логику нотации соседства и затем присваивает единственное значение в качестве результата. Затем эту функцию можно передать в функцию raster :: focal.
Вот что будет происходить в каждой ячейке на основе простого принуждения и оценки фокусного окна. Объект "w" по существу будет таким же определением матрицы, что и аргумент w в фокусе. Это то, что определяет размер вектора поднабора в каждой фокусной оценке.
Теперь создайте функцию, которая может быть применена к фокальной, применяет вышеуказанную логику. В этом случае вы можете назначить объект se в качестве значения или использовать его как условие в чем-то вроде «ifelse», чтобы присвоить значение на основе оценки. Я добавляю оператор ifelse, чтобы проиллюстрировать, как можно оценить несколько условий окрестности и применить условие положения матрицы (обозначение окрестности). В этой фиктивной функции приведение x к матрице совершенно не нужно, и там просто для иллюстрации, как это будет сделано. Можно применять условия обозначения окрестности непосредственно к вектору без принуждения матрицы, поскольку положение в векторе будет применяться к его расположению в фокусном окне и оставаться фиксированным.
И применить его к растру
источник
Вы можете легко обновить растровые значения, подставив растр в нотацию [row, col]. Просто обратите внимание, что строка и столбец начинаются с верхнего левого угла растра; r [1,1] - индекс верхнего левого пикселя, а r [2,1] - индекс под r [1,1].
источник