Что такое raster :: extract и terra: extract
У меня проблемы с полным пониманием terra:extract. Я хочу извлечь средние значения растра для административных полигонов GADM. Мой растр имеет одно значение для каждой страны. Я ожидаю, что каждый административный многоугольник в пределах конкретной страны имеет одинаковое значение, а некоторые многоугольники, которые включают границу какой-либо страны, будут иметь средневзвешенные значения площади. К сожалению, это не относится к моему текущему сценарию. raster ::extract, кажется, дает разумные результаты, но не terra:extract. Может ли кто-нибудь объяснить мне, почему, в свете моего не тестируемого кода ниже? Большое спасибо.
## libraries
library(terra)
library(raster)
## sample example - provides results as expected
# sample raster and SpatialPolygons
r <- raster(ncol=2, nrow=3, xmn= 0, ymn= 0, xmx = 30,ymx = 30)
r[] <- c(2, 2, 2, 1, NA, NA)
cds <- rbind(c(7.5,0), c(7.5,20), c(30, 20),c(30,10))
library(sp)
p = Polygon(cds)
ps = Polygons(list(p),1)
sps = SpatialPolygons(list(ps))
plot(sps)
# test raster package
test1 <- raster::extract(r , sps, fun=mean, na.rm=T, weights=TRUE)
test1
# test terra package
sps.spatv <- vect(sps)
r.spatR <- rast(r) #conversion to SpatRaster class
test2 <- terra::extract(r.spatR, sps.spatv, fun=mean, na.rm=T, weights=TRUE, exact=TRUE, touches=TRUE)
test2
## non-testable code that leads to different results between raster and terra packages
# raster package
NadminR <- raster::extract(c.stack, wm_admin, fun=mean, na.rm=T, weights=TRUE)
Nadmin2R <- NadminR %>%
cbind(wm_admin@data["GID"]) %>%
as_tibble() %>%
gather(key="crop_cat", value="Nfert_kg_ha_yr", c("c3ann", "c3nfx", "c3per", "c4ann", "c4per"))
# terra package
wm_admin.spatv <- vect(wm_admin)
c.stack.spatR <- rast(c.stack)
NadminT <- terra::extract(c.stack.spatR, wm_admin.spatv, fun=mean, na.rm=T, weights=TRUE, exact=TRUE, touches=TRUE)
Nadmin2T <- NadminT %>%
cbind(wm_admin@data["GID"]) %>%
as_tibble() %>%
select(-c(ID)) %>%
gather(key="crop_cat", value="Nfert_kg_ha_yr", c("c3ann", "c3nfx", "c3per", "c4ann", "c4per"))
1 ответ
Непонятно, о чем вы на самом деле спрашиваете. Но это то, что я вижу с данными вашего примера
library(raster)
r <- raster(ncols=2, nrows=3, xmn= 0, ymn= 0, xmx = 30,ymx = 30, crs="+proj=merc")
values(r) <- 1:ncell(r)
cds <- rbind(c(7.5,0), c(7.5,20), c(30, 20),c(30,10))
sps <- spPolygons(cds, crs=crs(r))
extract(r , sps, fun=mean, na.rm=T)
# [,1]
#[1,] 4
extract(r , sps, fun=mean, na.rm=T, weights=T)
# [,1]
#[1,] 4.258889
sps.spatv <- vect(sps)
r.spatR <- rast(r)
extract(r.spatR, sps.spatv, fun=mean, na.rm=T)
# ID layer
#1 1 4
extract(r.spatR, sps.spatv, fun=mean, na.rm=T, weights=T)
# ID layer
#[1,] 1 4.319149
extract(r.spatR, sps.spatv, fun=mean, na.rm=T, exact=T)
# ID layer
#[1,] 1 4.259259
exactextractr::exact_extract(r , sps, "mean")
#[1] 4.259259
Предлагая, что
terra::extract
с weights=TRUE каким-то образом не улучшает оценку (я изучу это).
Обратите внимание, что есть и другие небольшие отличия, если вы
r <- raster(ncols=2, nrows=3, xmn= 0, ymn= 0, xmx = 30,ymx = 30, crs="+proj=longlat")
Поскольку terra exact=T учитывает разницу в размерах между ячейками.