Извлечение значений растровых пикселей с использованием векторных многоугольников в R - PullRequest
0 голосов
/ 02 апреля 2020

Я боролся с этим часами. У меня есть шейп-файл (называемый «shp»), содержащий 177 полигонов, т.е. 177 округов. Этот шейп-файл накладывается на растр. Мой растр (называемый "ras") состоит из пикселей, имеющих различные значения загрязнения.

Теперь я хотел бы извлечь все значения пикселей и их количество вхождений для каждого многоугольника.

Это именно то, что делает функция QGIS "зональная гистограмма". Но я хотел бы сделать то же самое в R.

Я попробовал функцию extract (), и мне удалось получить среднее значение для округа, что уже является первым шагом, но я хотел бы сделать распределение пикселей (гистограмма).

Может ли кто-нибудь помочь мне?

Большое спасибо,

Мар ie -Laure

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020

Большое спасибо за вашу помощь. В следующий раз я обещаю, что буду осторожен и объясню свою проблему более подробно.

С вашей помощью мне удалось найти решение. Я также использовал этот веб-сайт: http://zevross.com/blog/2015/03/30/map-and-analyze-raster-data-in-r/

Для информации сначала мне пришлось удалить пакет «tidyr», поскольку возник конфликт с функцией извлечения.

В случае, если это может кому-то помочь, вот окончательный код:

# Libraries loading
library(raster) 
library(rgdal)
library(sp)

# raster layer import
ras=raster("C:/*.tif")

# shapefile layer import
shp<-shapefile("C:/*.shp")

# Extract the values of the pixels raster per county
ext <- extract(ras, shp, method='simple')

# Function to tabulate pixel values by region & return a data frame
tabFunc                            <- function(indx, extracted, region, regname) {
  dat                              <- as.data.frame(table(extracted[[indx]]))
  dat$name                         <- region[[regname]][[indx]]
  return(dat)
}

# run through each county & compute a table of the number
# of raster cells by pixel value. ("CODE" is the county code) 
tabs <- lapply(seq(ext), tabFunc, ext, shp, "CODE")

# assemble into one data frame
df <- do.call(rbind, tabs)  

# to see the data frame in R
print(df)

# table export 
write.csv(df,"C:/*.csv", row.names = FALSE)
0 голосов
/ 02 апреля 2020

Всегда, пожалуйста, включайте минимальный, самостоятельный, воспроизводимый пример. Это позволяет легко отвечать и другим учиться. Кроме того, создание такого примера позволит вам ответить на свой вопрос в большинстве случаев. Вот один из них (почти буквально из? Raster :: extract, так что не сложно сделать)

Или вы хотите барплот

z <- lapply(1:length(v), function(i) barplot(table(v[[i]]), main=mains[i]))
...