在R中使用terra重投影栅格时,如何保持全局值总和不变?
解决栅格重投影时全局总和保持不变的问题
问题核心在于:WGS84(地理坐标系)的像素面积随纬度变化,直接用method="sum"投影时,没有考虑原始像素的实际面积权重,导致总和失真。正确的做法是先将原始栅格转换为单位面积的数值,再进行投影求和,具体步骤如下:
步骤说明
- 计算原始栅格(r2)每个像素的实际地表面积
- 将r2的数值转换为"单位面积"量(比如每平方米的数值)
- 投影到目标栅格(r1)的CRS和分辨率,使用
method="sum" - 验证全局总和是否一致
示例代码
library(terra) # 假设r1是目标栅格(World Mollweide,10km分辨率),r2是原始栅格(WGS84,0.1度) # 1. 计算r2每个像素的实际面积(单位:平方米) r2_area <- cellSize(r2, unit = "m") # 2. 将r2的值转换为单位面积的数值(原数值 / 像素面积) # 注:如果原r2的数值本身就是"单位面积"量(如密度),则跳过此步 r2_per_m2 <- r2 / r2_area # 3. 投影到r1的CRS和分辨率,使用sum方法 # 此时sum的结果是:单位面积值 × 新像素覆盖的总面积 → 即新像素的总量 r2_moll <- project(r2_per_m2, r1, method = "sum") # 4. 验证总和 sum_before <- global(r2, "sum", na.rm = TRUE) sum_after <- global(r2_moll, "sum", na.rm = TRUE) # 查看结果,两者应基本一致(误差来自投影精度) sum_before sum_after
关键原理
- WGS84下的0.1度像素,赤道附近的面积远大于高纬度地区,直接相加不同纬度的像素值会导致权重失衡。
- 转换为单位面积数值后,投影求和时,新像素的总和等价于原始重叠区域的总量,从而保证全局总和不变。
内容的提问来源于stack exchange,提问作者Antonio de Rosa
相关产品推荐
相关产品推荐

