R语言中Raster::extend无法扩展栅格范围问题求助
R语言raster包对齐同分辨率栅格范围失败的解决方法
我在R中使用raster包(版本3.5-29,Hijmans等,2022),尝试对齐两个分辨率相同但范围不同的.asc栅格,目的是创建Raster stack。原始栅格属性如下:
> r1;r2 class : RasterLayer dimensions : 1420, 1207, 1713940 (nrow, ncol, ncell) resolution : 50, 50 (x, y) extent : -30155.19, 30194.81, -35519.03, 35480.97 (xmin, xmax, ymin, ymax) crs : NA source : Naive_IS2018_UDScaled.asc names : Naive_IS2018_UDScaled class : RasterLayer dimensions : 1418, 939, 1331502 (nrow, ncol, ncell) resolution : 50, 50 (x, y) extent : -23488.8, 23461.2, -35475.82, 35424.18 (xmin, xmax, ymin, ymax) crs : NA source : Naive_IS2019_UDScaled.asc names : Naive_IS2019_UDScaled
我尝试通过提取极值定义统一范围,再用extend()扩展栅格:
## align all rasters to same extent rasterlist <- as.list(r1,r2) raster_extents <- lapply(rasterlist, raster::extent) do.call(raster::merge, raster_extents) sharedextent <- c(-30155.19 , 30194.81 , -35519.03 , 35480.97) r1 <- raster::extend(r1, sharedextent) r2 <- raster::extend(r2, sharedextent)
操作后栅格范围未按预期变化:r1范围无变化,r2范围异常且源变为内存存储,属性如下:
> r1;r2 class : RasterLayer dimensions : 1420, 1207, 1713940 (nrow, ncol, ncell) resolution : 50, 50 (x, y) extent : -30155.19, 30194.81, -35519.03, 35480.97 (xmin, xmax, ymin, ymax) crs : NA source : Naive_IS2018_UDScaled.asc names : Naive_IS2018_UDScaled class : RasterLayer dimensions : 1420, 1207, 1713940 (nrow, ncol, ncell) resolution : 50, 50 (x, y) extent : -30138.8, 30211.2, -35525.82, 35474.18 (xmin, xmax, ymin, ymax) crs : NA source : memory names : Naive_IS2019_UDScaled values : 0, 0.0006528347 (min, max)
问题原因及解决步骤
as.list()使用错误:as.list(r1,r2)只会把r1转为列表,r2被忽略,应该用list(r1,r2)创建栅格列表。- 手动定义范围的精度问题:直接用数值定义
sharedextent时,可能因为栅格的对齐规则导致范围偏移,正确做法是先合并所有栅格的范围得到统一的Extent对象,再基于该对象创建模板栅格,最后用resample()或extend()+crop()确保对齐。
正确代码如下:
# 1. 正确创建栅格列表 rasterlist <- list(r1, r2) # 2. 合并所有栅格的范围,得到统一的Extent对象 shared_extent <- do.call(raster::merge, lapply(rasterlist, raster::extent)) # 3. 创建与目标范围、分辨率匹配的模板栅格 template <- raster(shared_extent, res = res(r1), crs = crs(r1)) # 4. 将所有栅格重采样到模板(确保范围和分辨率完全对齐) r1_aligned <- resample(r1, template) r2_aligned <- resample(r2, template) # 5. 创建Raster Stack raster_stack <- stack(r1_aligned, r2_aligned)
补充说明
- 使用
resample()可以确保栅格的行列数、范围完全匹配,避免手动定义范围时的精度偏差。 - 如果不需要重采样(仅扩展范围),可以先
extend()到shared_extent,再用crop()裁剪到精确范围:
r2_extended <- extend(r2, shared_extent) r2_aligned <- crop(r2_extended, shared_extent)
内容的提问来源于stack exchange,提问作者smok
相关产品推荐
相关产品推荐

