如何用R将30m SRTM-DEM转500m并匹配MODIS范围?
解决SRTM DEM与MODIS栅格范围匹配及地形因子计算问题
核心思路
放弃手动分解聚合的方式,直接以MODIS栅格为模板,将30m分辨率的SRTM重采样到完全匹配的500m分辨率、范围和坐标系下,再计算地形因子,从根源解决范围不匹配问题。
具体操作(使用Terra包,R语言)
Terra是替代旧版raster包的高效空间数据处理工具,优先推荐使用。
1. 加载依赖并读取数据
# 安装并加载Terra包 install.packages("terra") library(terra) # 读取原始30m SRTM和MODIS栅格文件 srtm_30m <- rast("你的SRTM文件路径.tif") modis_template <- rast("你的MODIS文件路径.tif")
2. 重采样SRTM到MODIS模板参数
由于两者已处于同一UTM坐标系,直接用resample()函数强制对齐MODIS的栅格系统:
# 重采样,地形数据推荐用双线性插值(bilinear)或均值(average)方法 srtm_500m <- resample(srtm_30m, modis_template, method = "bilinear")
3. 计算地形因子(坡度、坡向)
基于对齐后的500m SRTM直接计算:
# 计算坡度(单位:度) slope <- terrain(srtm_500m, v = "slope", unit = "degrees") # 计算坡向(单位:度,0=正北,顺时针递增) aspect <- terrain(srtm_500m, v = "aspect", unit = "degrees")
4. 验证匹配结果
检查重采样后的SRTM参数是否与MODIS完全一致:
# 查看栅格基本信息 srtm_500m modis_template
此时两者的dimensions、resolution、extent参数应完全匹配。
原方法出错原因
手动3倍分解+50倍聚合的操作,没有对齐MODIS栅格的原点坐标和边界范围。MODIS栅格的边界是严格对齐到500m网格的整数坐标(如xmin=364000,是500的倍数),而手动聚合后的SRTM原点为非整数的364486.3,自然无法匹配MODIS的栅格系统。
替代方案(使用旧版Raster包)
若习惯使用raster包,操作逻辑一致:
library(raster) # 读取数据 srtm_30m <- raster("你的SRTM文件路径.tif") modis_template <- raster("你的MODIS文件路径.tif") # 重采样对齐 srtm_500m <- resample(srtm_30m, modis_template, method = "bilinear") # 计算地形因子 slope <- terrain(srtm_500m, opt = "slope", unit = "degrees") aspect <- terrain(srtm_500m, opt = "aspect", unit = "degrees")
内容的提问来源于stack exchange,提问作者user20664990
相关产品推荐
相关产品推荐

