You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 16:56:04