如何使用terra包基于像素面积转换栅格单位为每公顷值?
如何用cellSize实现栅格值的每公顷单位转换?
可以用cellSize实现,但结果和你自己写的px2ha函数不一致是因为两者的像素面积计算逻辑不同,以下是具体分析和修正方法:
核心逻辑回顾
你的需求是将像素总值转换为单位公顷值,公式为:
转换后值 = 原像素值 / 像素面积(公顷)
你的px2ha函数本质是通过分辨率乘积计算平面近似面积:
# 像素面积(平方米)= 分辨率宽 × 分辨率高 # 转换为公顷需除以10000,公式等价于 原值 / (像素面积/10000) = 原值 * 10000 / 像素面积 px2ha <- function(raster) { raster * 10000/prod(res(raster)) }
这个函数假设像素是完美正方形,属于简化的平面近似计算。
cellSize的差异原因
cellSize(r2, unit='ha')计算的是每个像素的实际地表面积,会考虑投影变形或地球曲率:
- 若原栅格是地理坐标系(经纬度),投影到epsg:2950(UTM米单位投影)后,
cellSize会计算更精确的椭球面面积,和prod(res(r2))的平面面积存在细微差异。 - 即使是投影坐标系,不同区域的投影变形也会导致
cellSize的结果和分辨率乘积不完全一致。
用cellSize实现需求的正确方式
方式1:精确的地表面积转换
直接使用cellSize的公顷结果,这是更贴合实际地表的单位值计算:
# 正确逻辑:原像素值 ÷ 像素面积(公顷)= 单位公顷值 r2_per_ha <- r2 / cellSize(r2, unit = 'ha')
这个结果和px2ha的差异是合理的,前者是实际地表面积,后者是平面近似面积。
方式2:和px2ha得到完全一致的结果
如果需要和px2ha的近似逻辑对齐,用cellSize计算平方米面积后再转换为公顷:
# 用cellSize计算平方米面积,再转换为公顷 r2_per_ha_approx <- r2 / (cellSize(r2, unit = 'm') / 10000) # 此时结果和px2ha(r2)完全一致 all.equal(r2_per_ha_approx, px2ha(r2))
验证差异的代码
你可以查看两种面积计算方式的差值:
# 计算px2ha用的近似公顷面积 approx_area <- prod(res(r2)) / 10000 # 计算cellSize的精确公顷面积 exact_area <- cellSize(r2, unit = 'ha') # 查看两者的差值分布 plot(exact_area - approx_area)
内容的提问来源于stack exchange,提问作者M. Beausoleil
相关产品推荐
相关产品推荐

