Учитывая ограничивающий прямоугольник, как я могу подсчитать количество определенных значений (скажем, меня интересует количество value == 1
) в растре в 1) arcpy или 2) растровом пакете в R?
11
В R
используется crop
для извлечения значений и ( например ) , table
чтобы сосчитать их.
В качестве примера, давайте создадим сетку в 1 градус, охватывающую земной шар:
library(raster)
x.raster <- raster(outer(179:0, 0:359, `+`), xmn=-180, xmx=180, ymn=-90, ymx=90)
Ограничительная рамка преобразуется в extent
объект для использования crop
:
y.extent <- extent(cbind(c(-125,20), c(-60,50)))
y.raster <- crop(x.raster, y.extent)
Сделав это, табуляция проста:
table(getValues(y.raster))
В этих выходных данных первая строка перечисляет значения, а вторая перечисляет их соответствующие значения:
165 166 167 ... 257 258
1 2 3 ... 2 1
В качестве проверки мы можем построить растр и экстент:
plot(x.raster)
plot(y.extent, add=T)
Небольшое дополнение: вы также можете использовать (безопасную для памяти) функцию "freq":
После ответа whuber:
library(raster)
x.raster <- raster(outer(179:0, 0:359, '+'), xmn=-180, xmx=180, ymn=-90, ymx=90)
y.extent <- extent(cbind(c(-125,20), c(-60,50)))
y.raster <- crop(x.raster, y.extent)
Но теперь сделайте:
freq(y.raster)
Это имеет значение только для очень больших объектов (растр в файле). 'freq' возвращает матрицу из двух столбцов (значение / количество), тогда как 'table' возвращает таблицу.
crop
операцию для одной минуты сетки, охватывающей Землю: она имеет 10800 строк и 21600 столбцов (233 280 000 ячеек). Обрезка была выполнена за 1,36 секунды.v <- extract(x.raster, y.extent)
затемtable(v)
extract
? Он не является частью,raster
иR
справочная система (??
) также не находит никакой функции с этим именем.