R语言基于坐标点提取多栅格值及extract函数报错咨询
报错本质
extract()函数触发签名匹配错误的核心是参数顺序、对象类型完全不符合函数定义:
- 原生
raster::extract()的函数签名为:extract(x = 栅格类对象, y = 点位/矢量类空间对象) - 当前代码把普通数据框
data放在第一个参数位置(对应函数预期的栅格输入),把单个RasterLayer放在第二个参数位置(对应预期的点位输入),类型完全不匹配,因此触发找不到对应方法的报错。
除此之外原代码还存在多处无效逻辑:
- 重复加载
raster包、重复读取同一份坐标csv文件,无实际作用 - 存在无效代码
raster(swi.tif):swi.tif是未定义的文本对象,既没有赋值也没有正确传给raster函数,运行时会直接报错 - 错误给
stack()/brick()函数传入普通数据框对象:这两个函数的作用是合并同范围、同分辨率的栅格图层为多波段栅格容器,不支持接收数据框类对象作为输入
修正后完整可运行流程
- 清理重复冗余的包加载代码
library(randomForest) library(caret) library(raster) library(rgdal) - 读入栅格图层与点位数据,删掉无意义的无效代码
# 读取三个环境因子栅格 rsp.1 <- raster("rsp.tif") twi.1 <- raster("twi.tif") swi.1 <- raster("swi.tif") # 读取点位的坐标与土壤属性数据,同一份文件不需要重复读两次 pt_data <- read.csv("0.10.coordinates.csv", sep = ";", header = TRUE) - 合并栅格为多波段容器,仅传入栅格类对象
# 把三个栅格合并为RasterBrick,作为数值提取的栅格源 topo.brick <- brick(rsp.1, swi.1, twi.1) - 按正确参数顺序调用extract完成数值提取
需提前确认数据框内的x(经度)、y(纬度)列名存在,且点位坐标的参考系与栅格完全匹配# 正确传参逻辑:栅格对象放在第一个参数位置,仅含坐标列的点位数据放在第二个参数位置 extracted_vals <- extract( x = topo.brick, y = pt_data[, c("x", "y")], # 仅传入坐标列,函数可自动识别为空间点位 sp = FALSE ) # 把提取到的栅格值和原点位属性表合并,得到可直接用于随机森林建模的完整数据集 model_input <- cbind(pt_data, extracted_vals)
注意事项
- 如果提取结果出现大量NA值,优先检查坐标参考系匹配情况:比如栅格是投影坐标系、点位用了未投影的地理坐标系,会出现位置偏移导致无法匹配栅格像元
- 调用extract时不要把包含所有属性的全量数据框直接传给
y参数:函数无法自动识别哪两列是坐标,会触发类型匹配错误 - 不要把数据框对象传入
stack()/brick()参数,这类函数仅支持接收栅格类输入
内容的提问来源于stack exchange,提问作者not your r2
相关产品推荐
相关产品推荐

