Terra 1.8-5版本rasterize()函数报错:写入值过多求助
问题:Terra 1.8.5中rasterize()触发"值数量超出"错误
错误信息
Error in h(simpleError(msg, call)) :
error in evaluating the argument 'x' in selecting a method for function 'rast': [rasterize] too many values for writing: 84300725 > 83166375
测试数据
- 北卡罗来纳州县级边界矢量数据
- MRLC的NLCD 2021土地覆盖栅格数据
复现代码
library(terra) library(sf) library(dplyr) # 读取NLCD栅格 nlcd <- terra::rast("C:/Users/Eliot/Desktop/terra_test_data/nlcd_2021_land_cover_l48_20230630/nlcd_2021_land_cover_l48_20230630.img") # 读取并转换县级边界CRS counties <- sf::st_read("C:/Users/Eliot/Desktop/terra_test_data/NCDOT_County_Boundaries/NCDOT_County_Boundaries.shp") %>% st_transform(crs(nlcd)) # 筛选Madison县 madison <- counties %>% dplyr::filter(NAME == "Madison") # 裁剪栅格至县级边界范围 nlcd <- crop(nlcd, vect(counties), mask = FALSE) # 触发错误的栅格化操作 rasterize(vect(madison), nlcd)
环境信息
- 系统:Windows 11
- Terra版本:1.8.5
- R版本:4.4.2
问题分析
Terra 1.8.x对栅格范围的精度校验更严格,这个错误是因为裁剪后的栅格(nlcd)和目标矢量(madison)的范围存在细微偏差,导致rasterize计算出的待写入值数量超过了栅格实际能容纳的像素数。
解决方案
方案1:直接用目标矢量裁剪栅格
别先用大范围的counties裁剪栅格,直接用要栅格化的madison矢量来裁剪,确保范围完全匹配:
nlcd_madison <- crop(nlcd, vect(madison), mask = FALSE) rasterize(vect(madison), nlcd_madison)
方案2:强制对齐栅格与矢量范围
如果需要保留原栅格的分辨率,可先提取目标矢量的范围,再调整栅格适配这个范围:
# 获取Madison县的精确范围 madison_ext <- ext(vect(madison)) # 调整栅格至该范围 nlcd_aligned <- extend(nlcd, madison_ext) # 执行栅格化 rasterize(vect(madison), nlcd_aligned)
方案3:创建匹配目标矢量的空栅格
基于原栅格的分辨率和坐标系,直接生成完全适配目标矢量范围的空栅格:
madison_rast <- rast(vect(madison), res = res(nlcd), crs = crs(nlcd)) rasterize(vect(madison), madison_rast)
业务场景适配建议
针对物种分布范围内的多边形栅格化需求:
- 优先用物种分布范围裁剪栅格,确保后续所有观测多边形的处理都基于这个匹配的栅格范围
- 多组多边形处理时,统一以物种分布范围作为栅格的基准范围,避免出现范围偏差导致的错误
内容的提问来源于stack exchange,提问作者Eliot Dixon
相关产品推荐
相关产品推荐

