【问题标题】:Error in mosaic of rasters from different extent using terra package in R?使用 R 中的 terra 包在不同程度上镶嵌栅格时出错?
【发布时间】:2021-07-14 01:54:24
【问题描述】:

我有一个文件夹,其中包含大约 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 

【问题讨论】:

  • 一种方法是构建一个包含所有图块的 vrt 文件,然后将其写入 tif。

标签: r gis raster spatial terra


【解决方案1】:

我可以像这样复制消息

library(terra)
r1 <- rast(nrow=1667, ncol=1667, ext=c(-1800000, -1749990, -600010, -550000))
r2 <- rast(nrow=1667, ncol=1667, ext=c(-1800000, -1749990, -550010, -5e+05))
values(r1) <- 1:ncell(r1)
values(r2) <- 1:ncell(r2)
m <- mosaic(r1, r2)
#Error: [mosaic] internal error: extents do not match ()

merge 也失败了。这是我将研究的错误。它适用于raster

library(raster)
x1 <- raster(r1)
x2 <- raster(r2)
m <- mosaic(x1, x2, fun=mean)
mm <- merge(x1, x2)

稍后:

错误是因为栅格未对齐。有了terra 1.2-1(目前是development version),我现在得到了

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 

【讨论】:

  • 谢谢!我在尝试在 HPC 上下载 terra/1.2-1 时遇到了一些问题,因此我将不得不尝试使用 vrt 路由。 vrt 函数是否与 gdalUtils 包中的 gdalbuildvrt 函数相同?否则,我找不到vrt 函数。
  • vrt 是在 1.1-17 版(在 CRAN 上)中引入的,并建立在与 gdalUtils 相同的底层 GDAL 功能上;但实施的细节可能会有所不同。
猜你喜欢
  • 2021-05-12
  • 2021-09-16
  • 1970-01-01
  • 2022-07-13
  • 2022-06-28
  • 2022-12-23
  • 1970-01-01
  • 2014-01-11
  • 1970-01-01
相关资源
最近更新 更多