Использование мозаики в r для слияния нескольких геотифов

У меня есть 50 файлов geotiff в той же папке. Все они представляли данные о высотах в части мира. Я хотел бы объединить некоторые файлы geotiff, и я обнаружил, что мозаика в R может нам помочь. Я переместил эти geotiff в ту же папку и написал R-скрипт, показанный ниже:

setwd()
a<-lista.files(pattern="*.tiff",file.name=TRUE)
combind<-merge(a,fun=mean)

Однако этот скрипт вернул ошибку: ошибка в as.data.frame(y)

Могу я спросить, как я могу улучшить свой сценарий?


person Bing-Hong Huang    schedule 08.05.2018    source источник
comment
Вам может понадобиться do.call(merge, a), а для merge нет аргумента fun.   -  person akrun    schedule 08.05.2018
comment
@akrun Спасибо за любезный ответ, но он возвращает, что второй аргумент должен быть списком.   -  person Bing-Hong Huang    schedule 08.05.2018
comment
Вы не привели пример. Это может быть Reduce(function(...) merge(...), a)   -  person akrun    schedule 08.05.2018
comment
кстати, слияние идет из пакетного растра.   -  person Bing-Hong Huang    schedule 08.05.2018
comment
Вам нужно привести воспроизводимый пример   -  person akrun    schedule 08.05.2018
comment
Если вы проверите ?merge из raster, пример работает с do.call(merge, x), и я также не нахожу аргумента fun   -  person akrun    schedule 08.05.2018


Ответы (1)


Вы можете использовать мощные функции GDAL. По моему опыту, это намного быстрее, чем чистый код R.

Мой подход был бы с library(gdalUtils):

Сначала создайте файл виртуального растра (vrt):

library(gdalUtils)
setwd(...)
gdalbuildvrt(gdalfile = "*.tif", # uses all tiffs in the current folder
             output.vrt = "dem.vrt")

Затем скопируйте виртуальный растр в реальный физический файл:

gdal_translate(src_dataset = "dem.vrt", 
               dst_dataset = "dem.tif", 
               output_Raster = TRUE # returns the raster as Raster*Object
                                    # if TRUE, you should consider to assign 
                                    # the whole function to an object like dem <- gddal_tr..
               options = c("BIGTIFF=YES", "COMPRESSION=LZW"))

Другое чистое (и, возможно, более медленное) пакетное решение raster:

f <- list.files(path = "your/path", pattern = ".tif$", full.names = TRUE)
rl <- lapply(f, raster)

do.call(merge, c(rl, tolerance = 1))

вам нужно настроить tolerance, поскольку растровые файлы, вероятно, не будут иметь одинаковое происхождение.

person loki    schedule 08.05.2018
comment
Спасибо за любезный ответ. Наконец, gdalUtils возвращает предупреждающее сообщение C:\Program Files (x86)\QGIS 2.18\bin\gdal_translate.exe -of GTiff dem.vrt height.tif имеет статус 1. Поэтому я пробую второй код. - person Bing-Hong Huang; 08.05.2018
comment
Возможно, вам нужно установить options = c("BIGTIFF=YES") - person loki; 08.05.2018
comment
У меня было время проверить. В моем случае gdalbuildvrt(gdalfile = ".tif$" ...) не удалось. Я отредактировал свой ответ. Возможно, вы могли бы проверить. Просто замените ".tif$" на ".tif". Я также добавил некоторые параметры. - person loki; 09.05.2018