#r #gis #raster #spatial #terra
#r #гис #растр #пространственный #terra
Вопрос:
У меня есть папка, содержащая около 191 файла GeoTIFF (каждый файл представляет собой отдельную плитку DEM (рельефа) гораздо большей площади). Я хочу объединить все плитки в один растровый файл. Я использую terra
пакет и успешно смог загрузить каждый растр и объединить их с разрешением 2 метра до разрешения 30 метров. Однако при запуске mosaic
функции для их объединения я сталкиваюсь с ошибкой (см. Сообщение об ошибке ниже). Я смог запустить функцию мозаики на меньшем подмножестве всего из трех плиток, но когда я масштабирую до всех файлов, это становится проблемой.
Вызывая сводку растров (см. Ниже), агрегация немного изменяет экстент — может ли это быть проблемой? resample
может быть вариант, но каждый отдельный растр имеет разную степень, и я не совсем уверен, как реализовать это исправление.
Не уверен, что образец набора данных поможет, поскольку я знаю, что функции работают. Я запускаю этот код на высокопроизводительном кластере, поэтому не очень эффективно запускать небольшие партии кода.
library(terra)
files <- as.list(list.files("./DEM_tiles", full.names = TRUE))
raster.list <- lapply(files, rast)
for(i in 1:length(raster.list)){
raster.list[[i]] <- aggregate(raster.list[[i]], fact = 15)
}
raster.mosaic <- do.call(mosaic, raster.list)
> Error: [mosaic] internal error: extents do not match ()
> Execution halted
Ниже приведен пример того, как выглядят две плитки:
### Before Aggregation
[[1]]
class : SpatRaster
dimensions : 25000, 25000, 1 (nrow, ncol, nlyr)
resolution : 2, 2 (x, y)
extent : -1800000, -1750000, -6e 05, -550000 (xmin, xmax, ymin, ymax)
coord. ref. : proj=stere lat_0=90 lat_ts=70 lon_0=-45 x_0=0 y_0=0 datum=WGS84 units=m no_defs
source : 35_23_1_1_2m_v3.0_reg_dem.tif
name : 35_23_1_1_2m_v3.0_reg_dem
[[2]]
class : SpatRaster
dimensions : 25000, 25000, 1 (nrow, ncol, nlyr)
resolution : 2, 2 (x, y)
extent : -1800000, -1750000, -550000, -5e 05 (xmin, xmax, ymin, ymax)
coord. ref. : proj=stere lat_0=90 lat_ts=70 lon_0=-45 x_0=0 y_0=0 datum=WGS84 units=m no_defs
source : 35_23_1_2_2m_v3.0_reg_dem.tif
name : 35_23_1_2_2m_v3.0_reg_dem
### After Aggregation
[[1]]
class : SpatRaster
dimensions : 1667, 1667, 1 (nrow, ncol, nlyr)
resolution : 30, 30 (x, y)
extent : -1800000, -1749990, -600010, -550000 (xmin, xmax, ymin, ymax)
coord. ref. : proj=stere lat_0=90 lat_ts=70 lon_0=-45 x_0=0 y_0=0 datum=WGS84 units=m no_defs
source : memory
name : 35_23_1_1_2m_v3.0_reg_dem
min value : -15.62178
max value : 233.6489
[[2]]
class : SpatRaster
dimensions : 1667, 1667, 1 (nrow, ncol, nlyr)
resolution : 30, 30 (x, y)
extent : -1800000, -1749990, -550010, -5e 05 (xmin, xmax, ymin, ymax)
coord. ref. : proj=stere lat_0=90 lat_ts=70 lon_0=-45 x_0=0 y_0=0 datum=WGS84 units=m no_defs
source : memory
name : 35_23_1_2_2m_v3.0_reg_dem
min value : -15.27713
max value : 243.0772
Комментарии:
1. Одним из способов может быть создание vrt-файла со всеми фрагментами, а затем запись его как tif.
Ответ №1:
Ошибка заключалась в том, что растры не были выровнены, и из-за ошибки. Теперь я получаю
library(terra)
#terra version 1.2.1
crs <- " proj=stere lat_0=90 lat_ts=70 lon_0=-45 x_0=0 y_0=0 datum=WGS84 units=m"
r1 <- rast(nrow=1667, ncol=1667, ext=c(-1800000, -1749990, -600010, -550000), crs=crs)
r2 <- rast(nrow=1667, ncol=1667, ext=c(-1800000, -1749990, -550010, -5e 05), crs=crs)
values(r1) <- 1:ncell(r1)
values(r2) <- 1:ncell(r2)
m <- mosaic(r1, r2)
#Warning message:
#[mosaic] rasters did not align and were resampled
m
#class : SpatRaster
#dimensions : 3334, 1667, 1 (nrow, ncol, nlyr)
#resolution : 30, 30 (x, y)
#extent : -1800000, -1749990, -600010, -499990 (xmin, xmax, ymin, ymax)
#coord. ref. : proj=stere lat_0=90 lat_ts=70 lon_0=-45 x_0=0 y_0=0 datum=WGS84 units=m no_defs
#source : memory
#name : lyr.1
#min value : 1
#max value : 2778889
Также
предложение @Elia — хороший обходной путь:
r1 <- writeRaster(r1, "test1.tif", overwrite=TRUE)
r2 <- writeRaster(r2, "test2.tif", overwrite=TRUE)
v <- vrt(c("test1.tif", "test2.tif"), "test.vrt", overwrite=TRUE)
v
#class : SpatRaster
#dimensions : 3334, 1667, 1 (nrow, ncol, nlyr)
#resolution : 30, 30 (x, y)
#extent : -1800000, -1749990, -600020, -5e 05 (xmin, xmax, ymin, ymax)
#coord. ref. : proj=stere lat_0=90 lat_ts=70 lon_0=-45 x_0=0 y_0=0 datum=WGS84 units=m no_defs
#source : test.vrt
#name : test
#min value : 1
#max value : 2778889
Комментарии:
1. Спасибо! У меня возникли некоторые проблемы при попытке загрузить terra / 1.2-1 на HPC, поэтому мне придется попробовать маршрут vrt. Является
vrt
ли функция такой же, какgdalbuildvrt
функция изgdalUtils
пакета? В противном случае я не могу найтиvrt
функцию.2.
vrt
был представлен в версии 1.1-17 (на CRAN) и основан на той же базовой функциональности GDAL, что и gdalUtils; но детали реализации могут отличаться.