使用gain()时R计算WorldClim10分辨率气温值出错的问题
WorldClim 10分辨率气温数据设置gain=0.1后结果异常的原因及解决方法
问题背景
使用raster包的getData函数从WorldClim下载特定经纬度的平均气温数据,原始存储值约为100。设置gain(r) <- 0.1后,extract返回值为1.0,但预期结果应为10.0。该问题仅出现在10度分辨率的数据中,2.5度分辨率时计算结果正常。
操作代码如下:
library(raster) library(sp)
生成随机坐标:
x <- runif(10, -72.85, -72.78) y <- runif(10, 44.5, 44.6) coords <- data.frame(x, y)
下载并处理数据:
r <- getData("worldclim",var="tmean",res=10) gain(r) <- 0.1 points <- SpatialPoints(coords, proj4string = r@crs) values <- extract(r,points) df <- cbind.data.frame(coordinates(points),values)
原因分析
问题核心在于raster包的gain处理机制,以及WorldClim不同分辨率数据的原生元数据差异:
- 2.5度分辨率的
tmean数据,原生gain就是0.1,存储值100对应的实际气温为100*0.1=10.0。手动设置gain=0.1时,raster不会修改存储值,extract结果自然符合预期。 - 10度分辨率的
tmean数据,原生gain为0.01,存储值100对应的实际气温是100*0.01=1.0。当手动设置gain(r) <- 0.1时,raster会自动调整栅格的存储值以保持实际值不变:新存储值 =(实际值 - offset)/新gain = (1.0 - 0)/0.1 = 10。此时extract得到的是10*0.1=1.0,和原实际值一致,但和你预期的100*0.1=10.0不符——因为你误以为设置gain后存储值仍保持100,但实际上raster已自动重新编码了存储值。
解决方案
方案1:直接使用原生元数据(推荐)
WorldClim数据自带了正确的gain和offset,无需手动设置,raster会自动处理,extract时直接返回实际气温值:
library(raster) library(sp) # 生成随机坐标 x <- runif(10, -72.85, -72.78) y <- runif(10, 44.5, 44.6) coords <- data.frame(x, y) # 下载数据,不手动修改gain r <- getData("worldclim", var="tmean", res=10) points <- SpatialPoints(coords, proj4string = r@crs) values <- extract(r, points) df <- cbind.data.frame(coordinates(points), values)
方案2:自定义gain(如需统一缩放规则)
若确实需要自定义gain,可先将栅格转换为实际值,再重置元数据:
r <- getData("worldclim", var="tmean", res=10) # 先转换为实际气温值 r_actual <- r * gain(r) + offset(r) # 重置gain和offset为1和0,此时存储值等于实际值 gain(r_actual) <- 1 offset(r_actual) <- 0 # 设置自定义gain gain(r_actual) <- 0.1 # 提取结果为实际气温值 values <- extract(r_actual, points)
内容的提问来源于stack exchange,提问作者curiousRguy
相关产品推荐
相关产品推荐

