Как я могу получить количество пикселей со значением NA в растре, вырезанном из большого растра по многим полигонам? - PullRequest
0 голосов
/ 05 августа 2020

Я новичок в этой области. В настоящее время я применил маску облака к растровому изображению в R и хочу проверить, сколько пикселей замаскировано. Но что мне действительно нужно, так это только изображения внутри некоторых многоугольников (их более 400), поэтому я хочу получить только количество пикселей без значения внутри многоугольников.

Вот что я сделал:

library(raster)
library(rgdal)

##Read the raster files

tb = raster('D:/HLS/NDVI_Month_2018_TB.tif', band = 6)

##Read the polygon (400 polygons)

crops = readOGR('D:/HLS/shapefile/tb/tb.shp')

##reproject the vector

new_crops = spTransform(crops, crs(tb))

##Clip the raster with polygons

cliped = crop(tb, extent(new_crops))
output = mask(cliped, new_crops)

##Check the NA value

freq(output, value = NA)

Однако то, что я получил от функции freq (), похоже, это все пиксели в пределах области (не только многоугольники, но и область, полученная с помощью функции crop ()). результат freq ()

Любые предложения о том, как получить значение NA внутри многоугольников, были бы очень полезны! Спасибо!

1 Ответ

0 голосов
/ 05 августа 2020

Задавая вопрос R, укажите минимальный, автономный. воспроизводимый пример. То есть не обращайтесь к вашим фактическим данным, а опишите проблему в более общем виде с данными, которые поставляются с R или которые вы создаете с помощью кода. Как это (взято в основном из ?raster::extract

Пример растра и полигонов

library(raster)
r <- raster(ncol=90, nrow=45)
values(r) <- 1:ncell(r)
r[seq(1,ncell(r),3)] <- NA

p1 <- rbind(c(-180,-20), c(-140,55), c(0, 0), c(-140,-60), c(-180,-20))
p2 <- rbind(c(10,0), c(140,60), c(160,0), c(140,-55), c(10,0))

pols <- spPolygons(p1, p2)

Решение 1

extract(r, pols, fun=function(i, ...) sum(is.na(i)))
#     [,1]
#[1,]  215
#[2,]  178

Решение 2

z <- rasterize(pols, r)
zonal(is.na(r), z, "sum")
#     zone sum
#[1,]    1 215
#[2,]    2 178
...