R语言计算人口栅格焦点权重矩阵时报无法分配980.3Gb矢量错误
问题原因
你遇到的内存报错核心原因是focalWeight的参数单位和你的栅格坐标系不匹配:
- 你使用的栅格是WGS84经纬度坐标系,
focalWeight的d参数单位和坐标系单位保持一致,即度 - 你传入的
d=30代表要生成半径30度的高斯权重窗口,该窗口尺寸远大于你的栅格实际覆盖范围(你的栅格经纬度跨度均不到2度),所以会生成体积达数百G的权重矩阵,直接触发内存溢出 - 额外补充:
memory.limit仅能调整Windows系统下R的可寻址内存上限,你设置的数值远超过物理内存实际容量,完全无法解决本质问题
解决方法
方法1(推荐):更换效率更高的处理包+投影到米级平面坐标系
现在raster包已经停止维护,推荐使用其开发者推出的新一代栅格处理包terra,内存效率提升数倍,同时将栅格投影到以米为单位的平面坐标系(比如对应你研究区的UTM 11N坐标系),可以直接使用米作为半径单位计算:
library(terra) # 构造原始栅格(terra中用rast代替raster) pop <- rast(ncols=5296, nrows=5296, xmin=-115.9, xmax=-114.041717965, ymin=35.000051298, ymax=36.858333333, crs='+proj=longlat +datum=WGS84 +no_defs') # 投影到UTM 11N坐标系,单位为米 pop_utm <- project(pop, "EPSG:32611") # 直接设置30米半径计算高斯权重,terra中用focalMat代替focalWeight fw_1 <- focalMat(pop_utm, d = 30, type = "Gauss")
方法2:直接换算经纬度下的半径数值
如果不需要投影,可以将你需要的30米半径换算为度单位后传入:
# 纬度方向1度约等于111千米,35°N地区经度方向1度约等于91千米,这里取平均近似值换算 d_deg <- 30 / 111000 # 使用原始raster包计算 fw_1 <- focalWeight(pop, d = d_deg, type = "Gauss")
内容的提问来源于stack exchange,提问作者Jay Antonio Oliver
相关产品推荐
相关产品推荐

