Что такое 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 учитывает разницу в размерах между ячейками.

Другие вопросы по тегам