Объединение нескольких растров в R

Я пытаюсь найти эффективный по времени способ слияния нескольких растровых изображений в R. Это соседние сцены ASTER из южного региона Килиманджаро, и моя цель - собрать их вместе, чтобы получить одно большое изображение.

Это то, что я получил до сих пор (объект "ast14dmo", представляющий список объектов RasterLayer):

# Loop through single ASTER scenes
for (i in seq(ast14dmo.sd)) {
  if (i == 1) {
    # Merge current with subsequent scene
    ast14dmo.sd.mrg <- merge(ast14dmo.sd[[i]], ast14dmo.sd[[i+1]], tolerance = 1)
  } else if (i > 1 && i < length(ast14dmo.sd)) {
    tmp.mrg <- merge(ast14dmo.sd[[i]], ast14dmo.sd[[i+1]], tolerance = 1)
    ast14dmo.sd.mrg <- merge(ast14dmo.sd.mrg, tmp.mrg, tolerance = 1)
  } else {
    # Save merged image
    writeRaster(ast14dmo.sd.mrg, paste(path.mrg, "/AST14DMO_sd_", z, "m_mrg", sep = ""), format = "GTiff", overwrite = TRUE)
  }
}

Как вы, наверное, догадались, код работает. Однако слияние происходит довольно долго, учитывая, что каждый отдельный растровый объект имеет размер около 70 мб. Я также попытался уменьшить и do.call, но это не удалось, поскольку я не мог передать аргумент "допуск", который обходит разные истоки растровых файлов.

Кто-нибудь понял, как ускорить процесс?

Ответ 1

Вы можете использовать do.call

ast14dmo.sd$tolerance <- 1
ast14dmo.sd$filename <- paste(path.mrg, "/AST14DMO_sd_", z, "m_mrg.tif", sep = "")
ast14dmo.sd$overwrite <- TRUE
mm <- do.call(merge, ast14dmo.sd)

Вот некоторые данные из примера в raster::merge

r1 <- raster(xmx=-150, ymn=60, ncols=30, nrows=30)
r1[] <- 1:ncell(r1)
r2 <- raster(xmn=-100, xmx=-50, ymx=50, ymn=30)
res(r2) <- c(xres(r1), yres(r1))
r2[] <- 1:ncell(r2)

x <- list(r1, r2)
names(x) <- c("x", "y")
x$filename <- 'test.tif'
x$overwrite <- TRUE
m <- do.call(merge, x)

Ответ 2

Функция "merge" из пакета Raster немного медленнее. Для больших проектов более быстрым вариантом является работа с командами gdal в R.

library(gdalUtils)
library(rgdal)

Составьте список всех растровых файлов, к которым вы хотите присоединиться (в текущем рабочем каталоге).

all_my_rasts <- c('r1.tif', 'r2.tif', 'r3.tif')

Создайте шаблонный растровый файл для построения. Подумайте об этом большой пустой холст, чтобы добавить плитки.

e <- extent(-131, -124, 49, 53)
template <- raster(e)
projection(template) <- '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'
writeRaster(template, file="MyBigNastyRasty.tif", format="GTiff")

Объедините все растровые плитки в один большой растровый файл.

mosaic_rasters(gdalfile=all_my_rasts,dst_dataset="MyBigNastyRasty.tif",of="GTiff")
gdalinfo("MyBigNastyRasty.tif")

Это должно работать очень хорошо для скорости (быстрее, чем слияние в растровом пакете), но если у вас есть тысячи фрагментов, вы можете даже захотеть сначала создать vrt.

Ответ 3

Вы можете использовать Reduce следующим образом:

Reduce(function(...)merge(...,tolerance=1),ast14dmo.sd)

Ответ 4

Инструмент мозаики ГИС SAGA (http://www.saga-gis.org/saga_tool_doc/7.3.0/grid_tools_3.html) обеспечивает максимальную гибкость при объединении числовых слоев и работает по умолчанию параллельно! Вам нужно только сначала перевести все растры/изображения в формат SAGA.sgrd, а затем запустить командную строку saga_cmd.

Ответ 5

Я столкнулся с этой же проблемой, и я использовал

#Read desired files into R
data_name1<-'file_name1.tif' 

r1=raster(data_name1)

data_name2<-'file_name2.tif'

r2=raster(data_name2)

#Merge files
new_data <- raster::merge(r1, r2)

Хотя он не создавал новый объединенный растровый файл, он сохранялся в среде данных и создавал объединенную карту при построении графика.