Почему пакет terra сбрасывает эти значения при использовании функции извлечения?
Я использую пакет terra для извлечения пестицидов из растровых файлов. На этапе извлечения кажется, что terra удаляет несколько строк. В этом примере есть 19 предупреждений, в которых говорится:
Не удалось вычислить мин. / Макс., В выборке не обнаружены допустимые пиксели. (Ошибка GDAL 1)
После этапа извлечения у меня осталось меньше строк, и, похоже, несколько строк упало.
Этот шаг отлично работал с использованием растра (отсюда Использование растра для расчета среднего и общего внесения пестицидов, но числа не складываются ), но, к сожалению, он медленный, учитывая количество файлов, которые мне нужно обработать.
Есть идеи, что означает эта ошибка и как ее решить?
Вот код:
## Terra ----
data(wrld_simpl)
## Need to create a SparVector for terra
wrld_simpl = vect(wrld_simpl)
r <- terra::rast("https://raw.github.com/hansronald/Pesticide-data/master/APR_Soybean_Glyphosate_2015_L.tif")
## Remove
r <- terra::clamp(r, lower=0, values=FALSE)
# area is in ha (values in raster are kg / ha per year)
a <- terra::area(r, sum=FALSE, mask=TRUE) * 0.0001
## Get the total area that pesticide has been applied to
tot_area <- terra::extract(a, wrld_simpl, fun = sum, na.rm = TRUE)
## Calculate total application in each cell
rtot <- r * a
## Calculate total application in each country
tot_app <- terra::extract(rtot, wrld_simpl, fun = sum, na.rm = TRUE)
## Mean application rate in each country
mean_app <- terra::extract(r, wrld_simpl, fun = mean, na.rm = TRUE)
## Save data to corresponding country
world_data = data.frame(wrld_simpl$NAME, wrld_simpl$ISO3)
world_data = data.frame(world_data, mean_app, tot_app, tot_area)
1 ответ
Это происходит потому, что некоторые полигоны настолько малы, что не покрывают ячейку растра. Теперь это исправлено в разрабатываемой версии (terra>= 1.2.8); но вот альтернативный подход с
exactrextractr
package --- это быстро и дает вам очень точную оценку, что особенно актуально, когда ваши растровые ячейки относительно большие, как в этом случае (хотя
wrld_simpl
довольно неточно).
library(raster)
library(sf)
library(exactextractr)
ra <- raster(a)
wsf = st_as_sf(wrld_simpl)
e <- exact_extract(ra, wsf, "sum")