Расчет количества пиксельных (кол-во) растровых файлов в R
У меня есть огромное количество растровых файлов и многоугольник, который находится в пределах растровых файлов. Я хочу получить номер пикселя (количество) для каждого растрового файла в пределах многоугольника. Кроме того, я хочу создать таблицу с именем растрового файла и количеством пикселей (в списке) для каждого растрового файла. Я пытался с укладкой, но с этим я не могу отследить название. Есть ли другой способ выполнить эту задачу в R?
1 ответ
Всегда включайте пример данных, пожалуйста
library(raster)
fn <-system.file("external/rlogo.grd", package="raster")
s <- stack(fn)
s[[1]][1:5000] <- NA
s[[2]][5001:ncell(s)] <- NA
names(s)
#[1] "red" "green" "blue"
p <- rbind(c(5,20), c(25,55), c(50, 20), c(20,6), c(5,20))
pol <- spPolygons(p)
plot(s, addfun=function() lines(pol, lwd=2))
Я не совсем уверен, что вы после. Количество ячеек (пикселей) будет одинаковым для всех растров, если вы можете сложить их (что, как вы говорите, вы можете). Я предполагаю, что вы хотите сумму клеток, которые не NA
, Если у вас на самом деле есть растры с другим происхождением / разрешением, вы можете повторить эти шаги, но нет необходимости их складывать в RasterStack
, но вам нужно будет изменить подход, чтобы также посчитать NA
клетки.
Простой подход для небольших объектов:
m <- mask(s, pol)
cellStats(m, function(i, ...) sum(!is.na(i)))
# red green blue
# 600 506 1106
Если этого не хватает памяти, вы можете сделать:
m <- mask(s, pol)
x <- reclassify(m, cbind(-Inf, Inf, 1))
names(x) <- names(m)
cellStats(x, 'sum')
#red green blue
#600 506 1106
Вы также можете попробовать:
extract(s, pol, fun=function(x,...)length(na.omit(x)))
# red green blue
#[1,] 600 506 1106
Если вы хотите сосчитать все ячейки (будь то NA
или нет), вы можете сделать что-то вроде
# example RasterLayer
r <- s[[1]]
# this step may help in speed if your polygon is small relative to the raster
r <- crop(r, pol)
x <- rasterize(pol, r, 1)
cellStats(x, 'sum')
#[1] 1106