R — ошибка с terra::extract: невозможно найти унаследованный метод для функции «extract» для сигнатур «SpatRaster», «SpatialPolygons»

Я пытаюсь преобразовать сценарий 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 в скрипте?

Спасибо за ваши ответы.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Полагаю, вы не ожидаете, что ваш 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--->

Благодарю за ваш ответ. Возможно, мой воспроизводимый пример не подходит. cds1, по моим реальным данным, является шейп-файлом. шейп-файл (cds1) и файл tiff (cds2) пересекаются, поскольку в файле tiff есть данные, которые я могу извлечь с помощью растрового пакета. Я получаю сообщение об ошибке только тогда, когда использую rast и terra::extract вместо raster и raster::extract.

Colsourie 27.06.2024 16:42

Возможно, в cds2 есть какие-то знаки -, которые привели бы к пересечению, но я несколько ограничен предоставленными данными. И добро пожаловать в Stackoverflow. Возможно, ссылка на .tif...

Chris 27.06.2024 17:10
Ответ принят как подходящий

Сообщение об ошибке:

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» для представления векторных данных.

Большое спасибо за этот очень ясный ответ. Я понимаю, почему сейчас появилось сообщение об ошибке и как ее устранить.

Colsourie 28.06.2024 10:45

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