R语言将人口栅格值赋值到NLCD裁剪栅格时出现报错如何解决
问题原因及解决方法
错误根源
- 你当前的操作逻辑不符合栅格对齐的要求:原始
pop栅格总像元数为28047616,而你要创建的匹配NLCD_crop的栅格总像元数为53420477,二者数值长度完全不匹配,直接赋值必然触发报错。 - 原始
pop栅格元数据存在错误:其标注的CRS为米单位的aea投影,但extent范围是典型的WGS84经纬度数值,说明pop的CRS被错误赋值,这也是后续对齐出错的核心诱因。 - 要实现人口栅格与NLCD_crop的范围、CRS、分辨率完全对齐,正确方案是做重投影+重采样,而非手动创建栅格后直接塞值。
可行解决代码
方案1:使用raster包实现
首先修正pop的错误CRS,再执行重投影对齐:
# 第一步:修正pop的原始CRS(根据extent判断为WGS84经纬度坐标系) crs(pop) <- "+proj=longlat +datum=WGS84 +no_defs" # 第二步:重投影重采样,直接对齐NLCD_crop的所有网格参数 pop_aligned <- projectRaster(from = pop, to = NLCD_crop, method = "bilinear")
说明:人口为连续数值,采用
bilinear双线性插值效果更优;若为分类栅格可将方法改为ngb最邻近插值。
方案2:使用terra包实现(效率更高,推荐)
library(terra) # 转为terra的SpatRaster格式 pop_terra <- rast(pop) nlcd_terra <- rast(NLCD_crop) # 修正pop的原始CRS crs(pop_terra) <- "EPSG:4326" # 重投影对齐 pop_aligned <- project(pop_terra, nlcd_terra, method = "bilinear") # 如有需要可以转回raster格式 pop_aligned_raster <- raster(pop_aligned)
验证结果
运行后可通过以下代码确认对齐成功:
# 检查CRS是否一致 crs(pop_aligned) == crs(NLCD_crop) # 检查范围是否一致 extent(pop_aligned) == extent(NLCD_crop) # 检查维度是否一致 dim(pop_aligned) == dim(NLCD_crop)
以上三个判断均返回TRUE即符合要求。
内容的提问来源于stack exchange,提问作者Jay Antonio Oliver
相关产品推荐
相关产品推荐

