Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Растр в R: создание зонального подсчета определенных значений ячеек без переклассификации

Автор вопроса: joaoalОтветов: 1

Я хотел бы знать, есть ли способ создать zonal statistics для RasterLayerObjects, в частности count заданного значения ячейки (например, класса землепользования) в R без необходимости переклассифицировать весь растр. Решение должно эффективно использовать память для работы с большими растровыми файлами, т. е. извлечение значений в матрицу в R нежелательно.

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

Мое предлагаемое решение создает как избыточные данные, так и дополнительные этапы обработки, чтобы приблизить меня к моей первоначальной цели. Я думал, что что-то вроде zonal(r1[r1==6],r2,"count") будет работать, но, очевидно, это не так (см. ниже).

# generate reproducible Raster
library("raster")

## RASTER 1 (e.g. land-use classes)
r1 <- raster( crs="+proj=utm +zone=31")
extent(r1) <- extent(0, 100, 0, 100)
res(r1) <- c(5, 5)
values(r1) <- sample(10, ncell(r1), replace=TRUE)
plot(r1)

## RASTER 2 (containing zones of interest)
r2 <- raster( crs="+proj=utm +zone=31")
extent(r2) <- extent(0, 100, 0, 100)
res(r2) <- c(5, 5)
values(r2) <- c(rep(1,100),rep(2,100),rep(3,100),rep(4,100))
plot(r2)

# (1) ZONAL STATISTICS
# a. how many cells per zone (independent of specific cell value)
zonal(r1,r2,"count")

# b. how many cells per zone of specific value 6
zonal(r1[r1==6],r2,"count")
# -> fails

# with reclassification
r1.reclass<-
  reclassify(r1,
             matrix(c(1,5,NA,
                    5.5,6.5,1, #class of interest
                    6.5,10,NA),
                    ncol=3,
                    byrow = T),
             include.lowest=T # include the lowest value from the table.
           )
zonal(r1.reclass,r2,"count")

rgeospatialraster

Ответы

Ответ 1 · рейтинг 2 · loki

вы можете использовать raster::match.

zonal(match(r1, 6),r2, "count")

Как видно из plot(match(r1, 6)), он возвращает только те растровые ячейки, которые содержат нужные значения. Все остальные ячейки NA.

r1==6, использованный в вашей попытке, к сожалению, возвращает вектор и, следовательно, больше не может использоваться в фокусе.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы