Как мне воспроизвести этот растровый скрипт с помощью terra (особенно борясь с функцией маски)?

Я хочу извлечь некоторые нормы внесения, общее внесение и площадь из растрового файла, содержащего данные об использовании пестицидов. У меня есть много файлов, в которых мне нужно это сделать, а растр замедляется, поэтому мне нужно сделать это в terra, но я изо всех сил пытаюсь воспроизвести функцию маски.

Вот код в растре (скопирован отсюда: Использование растра для расчета среднего и общего внесения пестицидов, но числа не суммируются ):

      library(tidyverse)

## With raster ----
data(wrld_simpl)
r <- raster::raster("https://raw.github.com/hansronald/Pesticide-data/master/APR_Soybean_Glyphosate_2015_L.tif")
r <- raster::clamp(r, lower=0, useValues=FALSE)

# area in ha
a <- raster::area(r) * 100

## Get the mean application rate
mean_app <- raster::extract(r, wrld_simpl, fun = mean, na.rm = TRUE)
rtot  <- r * a

## Get the total application for each country
tot_app  <- raster::extract(rtot, wrld_simpl, fun = sum, na.rm = TRUE)

## Get the total area for each country
rarea <- mask(a, r)
tot_area <- raster::extract(rarea, wrld_simpl, fun = sum, na.rm = TRUE)

В терре

      ## Terra ----

data(wrld_simpl)
wrld_simpl = vect(wrld_simpl)

r <- terra::rast("https://raw.github.com/hansronald/Pesticide-data/master/APR_Soybean_Glyphosate_2015_L.tif")
r <- terra::clamp(r, lower=0, values=FALSE)

# area in ha
a <- terra::area(r) * 100

mean_app <- terra::extract(r, wrld_simpl, fun = mean, na.rm = TRUE)
rtot  <- r * a
tot_app  <- terra::extract(rtot, wrld_simpl, fun = sum, na.rm = TRUE)

rarea <- terra::mask(a, r)
tot_area <- terra::extract(rarea, wrld_simpl, fun = sum, na.rm = TRUE)

Но я получаю эту ошибку, когда пытаюсь использовать маску:

      Error in (function (classes, fdef, mtable)  : 
  unable to find an inherited method for function ‘mask’ for signature ‘"numeric", "SpatRaster"’

Есть идеи, как это решить?

1 ответ

Решение

В area метод в немного отличается от raster. В terraон может возвращать либо SpatRaster (площадь для каждой ячейки), либо число (общая площадь). В твоем случае a это общая площадь, и неудивительно, что вы не можете использовать его с mask (Конечно, хорошо осматривать объекты на каждом этапе.)

Вы можете получить то, что хотите, используя sum=FALSE. И добавив mask=TRUE вы можете вообще пропустить этап маски.

      a <- terra::area(r, sum=FALSE, mask=TRUE) / 10000

Также обратите внимание, что это м 2 .

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