R计算中国人口栅格差值报错:method not applicable问题排查
问题描述
我获取了GPW v4人口计数数据和中国shapefile数据,想要计算两个人口栅格层的差值,以展示中国各像素的人口变化。预处理代码运行正常,但使用raster包的overlay()函数计算差值时出现“method not applicable”错误。
预处理代码:
library(raster) library(sf) library(tmap) p_15 <- terra::rast("gpw-v4-population-count-rev11_2015_2pt5_min_tif/gpw_v4_population_count_rev11_2015_2pt5_min.tif") p_20 <- terra::rast("gpw-v4-population-count-rev11_2020_2pt5_min_tif/gpw_v4_population_count_rev11_2020_2pt5_min.tif") CHN <- sf::read_sf("gadm36_CHN_shp/gadm36_CHN_1.shp") CHN <- sf::st_transform(CHN, crs="epsg:4490")|> terra::vect() p_15<- terra::project(p_15,'EPSG:4490') p_20 <- terra::project(p_20,'EPSG:4490') p_15_crop <- terra::crop(p_15, CHN) p_20_crop <- terra::crop(p_20, CHN) p_15_mask <- mask(p_15_crop, CHN) p_20_mask <- mask(p_20_crop, CHN)
出错的差值计算代码:
diff1520 <- overlay(p_15_mask, p_20_mask, fun=function(x,y){return(y-x)})
问题原因与解决方法
问题原因
你用terra::rast()创建的是**SpatRaster对象**(terra包的栅格类型),但overlay()是raster包专门针对RasterLayer对象设计的函数,跨包混用不同类型的栅格对象,导致兼容性错误。
解决方法
方法1:全程使用terra包语法(推荐)
terra包是raster包的升级替代版本,支持直接用算术运算符计算栅格差值,语法更简洁高效:
# 直接用减法运算符计算差值 diff1520 <- p_20_mask - p_15_mask # 或者用terra::lapp()函数(对应raster包的overlay) diff1520 <- terra::lapp(c(p_15_mask, p_20_mask), fun = function(x) x[2] - x[1])
方法2:转换对象类型后使用raster包
如果一定要用raster包的overlay(),先将SpatRaster转为RasterLayer:
library(raster) # 转换栅格对象类型 p_15_mask_r <- raster(p_15_mask) p_20_mask_r <- raster(p_20_mask) # 再使用overlay计算差值 diff1520 <- overlay(p_15_mask_r, p_20_mask_r, fun=function(x,y){y-x})
内容的提问来源于stack exchange,提问作者user20409271
相关产品推荐
相关产品推荐

