Я пытаюсь преобразовать сценарий R с помощью пакета raster
, чтобы вместо этого использовать пакет terra
. Поэтому я заменил функцию raster::raster
на функцию terra::rast
, а также функцию raster::extract
на terra::extract
.
Воспроизводимый пример:
cds1 <- rbind(c(-180,-20), c(-160,5), c(-60, 0), c(-160,-60), c(-180,-20))
cds2 <- rbind(c(80,0), c(100,60), c(120,0), c(120,-55), c(80,0))
polys <- SpatialPolygons(list(Polygons(list(Polygon(cds1)), 1)))
exo <- rast(cds2) #normally a .tiff file here.
val <- terra::extract(exo, polys)
Я получаю следующую ошибку:
Error in (function (classes, fdef, mtable) : unable to find inherited method for the function ‘extract’ for signature ‘"SpatRaster", "SpatialPolygons"’
Как я могу исправить ошибку и извлечь значения из exo
без использования пакета raster
в скрипте?
Спасибо за ваши ответы.
Полагаю, вы не ожидаете, что ваш exo
будет выглядеть так
Чтобы сделать ваш полигон(ы)
vect(cds1, type = 'polygons', crs = 'EPSG:4326')
class : SpatVector
geometry : polygons
dimensions : 1, 0 (geometries, attributes)
extent : -180, -60, -60, 5 (xmin, xmax, ymin, ymax)
coord. ref. : lon/lat WGS 84 (EPSG:4326)
polys <- vect(cds1, type = 'polygons', crs = 'EPSG:4326')
И рассмотрим матрицу cds2 как источник пространственной протяженности.
exo_pre <- rast(ext(c(min(cds2[, 1]), max(cds2[, 1]), min(cds2[ ,2]), max(cds2[, 2]))), crs = 'EPSG:4326', resolution = 1)
exo_pre
class : SpatRaster
dimensions : 115, 40, 1 (nrow, ncol, nlyr)
resolution : 1, 1 (x, y)
extent : 80, 120, -55, 60 (xmin, xmax, ymin, ymax)
coord. ref. : lon/lat WGS 84 (EPSG:4326)
exo_pre в настоящее время не имеет значений. Что это такое и где они должны быть? Если мы построим cds2 как многоугольник, мы увидим, где они должны быть: область трапеции внутри rast. Задание значений, затем маскирование многоугольником cds2
values(exo_pre) <- 1:ncell(exo_pre)
cds2_poly <- vect(cds2, type = 'polygons', crs = 'EPSG:4326')
exo <- mask(exo_pre, cds2_poly)
plot(exo)
Хотя проблема полигонов решена, extract
не будет работать между exo, полученным из cds2, и полигонами, полученными из cds1, поскольку они не перекрываются.
Предположим
cds2_2 <- rbind(c(80,0), c(-100,-60), c(120,0), c(120,-55), c(80,0))
# or
cds2_3 <- rbind(c(80,0), c(-100,-60), c(-120,0), c(120,-55), c(80,0))
есть совпадения и extract
, выдержки
extract(exo_2, polys)
ID lyr.1
1 1 1
2 1 2
3 1 3
4 1 4
5 1 5
#<---snip--->
Возможно, в cds2 есть какие-то знаки -
, которые привели бы к пересечению, но я несколько ограничен предоставленными данными. И добро пожаловать в Stackoverflow. Возможно, ссылка на .tif...
Сообщение об ошибке:
Error in (function (classes, fdef, mtable) :
unable to find inherited method for the function ‘extract’
for signature ‘"SpatRaster", "SpatialPolygons"’
И если вы посмотрите на ?terra::extract
, вы увидите, что есть метод
"SpatRaster", "SpatVector"
Итак, вам нужно представить свои полигоны как SpatVector. Ты можешь сделать:
val <- terra::extract(exo, vect(polys))
И в реальной жизни вы, вероятно, могли бы сделать что-то подобное
polys <- vect("filename.shp")
val <- terra::extract(exo, polys)
Суть в том, что если вы хотите использовать «terra» вместо устаревшего пакета «raster», вам не следует использовать пакет «sp» для представления векторных данных.
Большое спасибо за этот очень ясный ответ. Я понимаю, почему сейчас появилось сообщение об ошибке и как ее устранить.
Благодарю за ваш ответ. Возможно, мой воспроизводимый пример не подходит. cds1, по моим реальным данным, является шейп-файлом. шейп-файл (cds1) и файл tiff (cds2) пересекаются, поскольку в файле tiff есть данные, которые я могу извлечь с помощью растрового пакета. Я получаю сообщение об ошибке только тогда, когда использую rast и terra::extract вместо raster и raster::extract.