r - аналогичный метод sp для растра :: calc ИЛИ метод для вычисления sp :: over с помощью объекта sp и растра - PullRequest
2 голосов
/ 22 апреля 2019

Суть моей проблемы заключается в том, что я хочу минимизировать количество раз, необходимое для преобразования объекта между форматом sp (то есть SpatialPixelsDataFrame) и форматом Raster *.

Задача состоит в следующем: я начинаю со списка объектов SPixDF (поскольку это выходные данные внешней функции, над которыми я не имею контроля), и мне нужно сделать с ними две вещи.

  1. Мне нужно объединить их в один объект. Решение должно быть обобщаемым (то есть обрабатывать списки различной длины). В принципе, я не могу найти способ сделать raster :: calc () с объектами SPixDF.

  2. Причина, по которой мне нужно решение для # 1, заключается в том, что следующим шагом является наложение точек на результирующую усредненную поверхность SPixDF (т.е. sp :: over). И sp :: over () не может наложить данные SpatialPoints на данные в формате Raster *.

## Data set-up ##
# grid data
data(meuse.grid)
coordinates(meuse.grid) = ~x+y
proj4string(meuse.grid) <- CRS("+init=epsg:28992")
gridded(meuse.grid) = TRUE
spplot(meuse.grid)

meuse.grid.list <- list(meuse.grid, meuse.grid, meuse.grid)

# point data 
data(meuse)
coordinates(meuse) = ~x+y
proj4string(meuse) <- CRS("+init=epsg:28992")


### Analysis steps (involving 2 conversions) ### 

# Convert listed SPixDF to listed RasterLayer
meuse.raster.list <- lapply(meuse.grid.list, function(x) raster(x, layer=5, values=T))

meuse.raster.stack <- stack(meuse.raster.list)  # list of RasterLayers to RasterStack

# task #1
meuse.cmbnd <- calc(meuse.raster.stack, mean)  # average together individual rasters

# Convert back to SPixDF 
meuse.cmbnd.spdf <- as(meuse.cmbnd, "SpatialPixelsDataFrame") 

# task #2
# overlay points on SPixDf grid
Result <- over(meuse, meuse.cmbnd.spdf)

Если бы sp :: over () мог обрабатывать растровые * объекты, я бы просто преобразовал исходный объект один раз (в растровый *) и выполнил шаги 1 и 2 в этом формате. По сути, проблема в том, что я не могу найти ОБЩИЙ СПОСОБ выполнить оба шага в одном и том же формате (sp или Raster).

Если вы думаете о чем-либо, я был бы очень благодарен!

P.S. Основанием для этого является то, что эта операция в настоящее время написана в функции, над которой я работаю, и я пытаюсь ускорить ее. Но поскольку я должен продолжать переключаться между классами sp и Raster, решение, которое я имею, становится медленнее, чем существующая формулировка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...