水深图的分辨率调整与坐标参考系转换问题
Terra栅格投影转换与分辨率调整问题解决
问题背景与操作过程
为模拟鱼类运动,从GEBCO获取水深图并完成陆地区域掩膜,操作正常:
library(terra) tif_file <- "~/path_to/GEBCO_map.tif" map <- rast(tif_file) map <- ifel(map >= 0, NA, abs(map))
后续需将栅格调整为100×100米分辨率,并从WGS84(EPSG:4326)转换至WGS84/UTM zone 29N(EPSG:32629),已有参考栅格mapE,执行以下操作后出现异常:
map_reprojected <- project(map, crs(mapE)) # 尝试设置目标分辨率(100×100米) new_resolution <- c(100, 100) current_resolution <- res(map) # 基于目标分辨率计算行列数 target_ncols <- ncol(map) * (current_resolution[1] / new_resolution[1]) target_nrows <- nrow(map) * (current_resolution[2] / new_resolution[2]) # 创建新分辨率的虚拟栅格 dummy_raster <- rast(ext(map), nrows = round(target_nrows), ncols = round(target_ncols), resolution = new_resolution) # 重采样至新分辨率 map_resampled <- resample(map_reprojected, res = new_resolution, method = "bilinear")
遇到的问题
- 调整分辨率后,栅格维度变为
1,1,1且全为NA - 坐标参考系转换后绘图显示变形
解决方案
1. 正确的操作流程
问题核心在于混淆了不同投影的单位逻辑,以及错误使用resample参数。推荐两种稳妥的操作方式:
方式一:利用参考栅格直接对齐
既然已有同投影、同分辨率的mapE,直接用它作为模板完成投影+重采样:
# 一步完成投影转换与分辨率匹配 map_final <- project(map, mapE, method = "bilinear")
方式二:手动构建目标投影栅格模板
若无参考栅格,需先转换范围到目标投影,再创建模板:
# 定义目标投影 target_crs <- "EPSG:32629" # 将原栅格范围转换到目标投影坐标系 target_ext <- project(ext(map), from = crs(map), to = target_crs) # 创建100×100米分辨率的空栅格模板 dummy_raster <- rast( ext = target_ext, resolution = c(100, 100), crs = target_crs ) # 投影并重采样到模板 map_final <- project(map, dummy_raster, method = "bilinear")
2. 问题原因解析
- 分辨率计算错误:原栅格分辨率是度单位(WGS84),目标是米单位(UTM),直接用两者做除法换算行列数完全逻辑错误,必须先将原范围转换到目标投影下再计算。
resample参数误用:resample需要传入目标栅格模板,而非直接传分辨率向量。直接传res = new_resolution会导致terra无法匹配正确的空间范围,生成无效的1×1栅格。- 投影变形:之前的变形是因为投影后未正确匹配分辨率和范围,用上述流程生成的栅格会保持正确的空间形态。
3. 验证投影有效性
用以下代码验证结果:
# 查看最终栅格的坐标系 crs(map_final) # 查看分辨率 res(map_final) # 查看栅格维度 dim(map_final)
若输出CRS为EPSG:32629、分辨率为100 100,且维度合理无全NA,说明操作有效。
内容的提问来源于stack exchange,提问作者EcologyWuhu
相关产品推荐
相关产品推荐

