Извлечение процентного распределения значений в растре из подмножества полигонов - PullRequest
1 голос
/ 26 апреля 2020

У меня есть растр и sf полигон, как указано ниже:

library(raster)
libary(sf)

# Create raster r
r = raster(ncol=1000, nrow=1000, xmn=0, xmx=1000, ymn=0, ymx=1000)
values(r) = round(runif(ncell(r),1,10))

# Create sf polygon
poly_sf = st_sfc(st_polygon(list(cbind(c(0,10,50,100,0),c(0,70,300,500,0)))))

Растр содержит ячейки со значениями от 1 до 10. Я хотел бы иметь возможность генерировать кадр данных, который содержит общее процент от общего числа ячеек для каждого значения в подмножестве растровых ячеек, сгенерированных многоугольником poly_sf. Я посмотрел на exactextractr, но не понял, как добиться того, чего я хочу, используя этот пакет.

1 Ответ

1 голос
/ 27 апреля 2020

Вы можете использовать функцию mask из пакета raster, но вам необходимо преобразовать полигон в объект sf:

library(raster)
library(sf)

# Create raster r
r = raster(ncol=1000, nrow=1000, xmn=0, xmx=1000, ymn=0, ymx=1000)
values(r) = round(runif(ncell(r),1,10))

# Create sf polygon
poly_sf = st_sfc(st_polygon(list(cbind(c(0,10,50,100,0),c(0,70,300,500,0)))))
p2 <- st_as_sf(poly_sf)

# Plot the raster object:
plot(r)

enter image description here

Вы можете создать маску, используя функцию mask:

plot(mask(r, p2))

enter image description here

Итак, чтобы извлечь значения из этой маскированной объект, вы можете использовать функцию mask и рассчитывать для пропорций каждого значения, используя table:

# Subset the polyfon from the SF object: 
subset_ra <- mask(r, p2)

# Calculate the porportion of each value
df <- as.data.frame(table(as.matrix(subset_ra)))
df$Percent <- df$Freq / sum(df$Freq) * 100

   Var1 Freq   Percent
1     1  154  5.517736
2     2  329 11.787890
3     3  287 10.283053
4     4  290 10.390541
5     5  325 11.644572
6     6  305 10.927983
7     7  319 11.429595
8     8  312 11.178789
9     9  315 11.286277
10   10  155  5.553565

Это отвечает на ваш вопрос?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...