Как извлечь растровые значения из данных многоугольника, а затем объединить их во фрейм пространственных данных?

Я хотел бы объединить полигональные и растровые данные в один фрейм данных, чтобы затем использовать пакет randomForests в R.
Это включает в себя сначала извлечение среднего значения растра на полигон.

Пока у меня есть следующее:

#load libraries
library(raster)
library(rgdal)
library(sp)
library(maptools)

#import raster data 
r <- raster("myRasterdata.tif")

#import polygon data 
p <- readShapePoly("myPolydata.shp")

#extract mean raster value for each polygon
ExtractMyData <- extract(r, p, small=TRUE, fun=mean, na.rm=TRUE, df=FALSE,  nl=1, sp=TRUE)
# note I have also tried this with df=TRUE and sp=FALSE

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

Обратите внимание, что на самом деле мне нужно будет преобразовать полигоны в точки (используя метод центроида?) Для целей RandomForests, чтобы я мог догадаться, что я действительно хочу, это соединить средние значения растра, соединенные с точками, а не с полигонами.

Любые предложения будут ценны. Спасибо!!

1 ответ

Это работает:

library(raster)
library(sp)
library(maptools)


#import polygon data 
data(wrld_simpl)
p <- wrld_simpl

#create raster data 
r <- raster(extent(p))
r[] <- seq_len(ncell(r))


## this does it directly, adding columns "names(r)" to "p" 
p <- extract(brick(r, r * 2), p, fun = mean, na.rm = TRUE, sp = TRUE)

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

p$ExtractData <- extract(r, p, fun = mean, na.rm = TRUE)

Или вы можете работать с многослойным растром, столбец за столбцом, например:

b <- brick(r, r * 2)
extr <- extract(b, p, fun = mean, na.rm = TRUE)
for (i in seq_len(ncol(extr))) p[[colnames(extr)[i]]] <- extr[,i]
Другие вопросы по тегам