R调用exact_extract提取栅格均值报summarise无适用方法错误
问题背景
- 现有存储大量经纬度点位及对应火辐射功率(FRP)值的CSV文件,需完成如下空间分析流程:
- 将CSV点位数据栅格化
- 将生成的栅格与多面矢量网格图层叠加
- 提取每个面要素覆盖范围内的FRP平均值
- 此前使用
exact_extract函数处理NetCDF格式多波段栅格可正常运行,本次处理CSV栅格化生成的单波段栅格时,执行提取语句触发报错。
复现代码
library(choroplethr) library(choroplethrMaps) library(ggmap) library(exactextractr) #For `exact_extract` library(matrixStats) #For `colWeightedMeans` library(raster) #For `brick` library(sf) #For `st_read` library(stringr) #For `str_sub` library(tidyr) library(dplyr) library(RColorBrewer) library(ncdf4) # netcdf处理包 library(rasterVis) library(raster) # 栅格处理包 library(rgdal) # 地理空间分析包 library(ggplot2) # 绘图包 library(maptools) library(rgeos) library(maps) library(data.table) library(reshape) library(doBy) # 测试用CSV样例,实际场景加载体量更大的真实文件 viirs_2020 <- read.csv(text = "frp, lat, long, 1.43,46.73021,-92.0754, 1.27,46.72907,-92.0775, 1.8,40.72152,-84.1262, 1.23,41.63972,-87.1309, 0.82,41.61905,-87.3285, 1.61,41.64,-87.4095, 1.56,41.64461,-87.141, header=TRUE") # 定义栅格的空间范围、分辨率与坐标系 viirs2020_r <- raster(xmn = -125, xmx = -65, ymn = 15, ymx = 55, res = 0.75, crs = "+proj=longlat +datum=WGS84") # 将CSV点位转换为栅格 viirs2020_raster <- rasterize(viirs_2020[, c('long', 'lat')], viirs2020_r, viirs_2020[, 'frp'], fun=mean) plot(viirs2020_raster) # 加载野火范围的矢量网格图层 cp_grid <- st_read('Drop Effectiveness/data/map data/cameronpeak_grid.shp') cp_grid <- st_transform(cp_grid, 4269) cp_grid$id <- factor(cp_grid$id) # 自定义函数:计算面要素覆盖范围内的栅格值加权平均 get_frp = function(values, coverage){ values %>% summarize(across(everything(), ~ weighted.mean(.x, coverage, na.rm=TRUE))) } # 执行值提取(触发报错的语句) out = exact_extract(viirs2020_raster, cp_grid, fun=get_frp, stack_apply=FALSE)
报错信息
in UseMethod("summarise") : no applicable method for 'summarise' applied to an object of class "c('double', 'numeric')"
报错原因
自定义的get_frp函数仅适配多波段栅格(如NetCDF读取生成的RasterStack/Brick对象)的输入场景:
- 当输入为多波段栅格时,
exact_extract向自定义函数传递的values参数是数据框结构,每列对应一个波段的栅格值,此时调用dplyr的summarise+across逐列计算加权平均可正常运行。 - 本次通过
rasterize生成的是单波段RasterLayer对象,exact_extract向自定义函数传递的values参数是普通数值型(double/numeric)向量,而summarise是专为数据框设计的泛型函数,没有针对数值向量的处理方法,因此触发方法不匹配的报错。
解决方案
二选一即可:
方案1:修改自定义函数,兼容单/多波段栅格输入
调整函数逻辑,先判断输入的values类型,对应不同的计算逻辑:
get_frp = function(values, coverage){ # 单波段栅格场景:values为数值向量,直接计算加权平均 if(is.vector(values)){ return(weighted.mean(values, coverage, na.rm = TRUE)) } # 多波段栅格场景:values为数据框,逐列计算加权平均 values %>% summarize(across(everything(), ~ weighted.mean(.x, coverage, na.rm=TRUE))) }
修改后重新执行exact_extract调用语句即可正常得到结果。
方案2:直接调用exactextractr内置加权平均方法,无需自定义函数
exact_extract原生支持按栅格覆盖面积加权的均值计算,直接传入内置函数名即可,代码更简洁且不存在类型兼容问题:
out <- exact_extract(viirs2020_raster, cp_grid, fun = "weighted.mean", na.rm = TRUE) # 若需将结果绑定到矢量图层属性表,可直接赋值 cp_grid$mean_frp <- out
内容的提问来源于stack exchange,提问作者JohnnyJohnson
相关产品推荐
相关产品推荐

