Linux环境下使用R包terra的rasterize函数创建空间栅格砖报错
Terra包跨平台运行报错及解决方法
Terra包的rasterize函数可通过by参数按列拆分数据,快速将空间点数据生成分层栅格(栅格砖)。但相同包版本在Linux 4.1.2环境运行时出现报错,Windows环境则正常执行。复现代码如下:
library(saqgetr) library(sf) library(terra) library(dplyr) library(data.table) ## 导入空气质量站点数据 s <- fread('http://aq-data.ricardo-aea.com/R_data/saqgetr/helper_tables/sites_table.csv.gz')[1:50,] %>% st_as_sf(coords = c('longitude', 'latitude'), crs = 4326) ## 创建研究区域栅格 r <- rast(s, res=1, vals = 1) ## 获取站点观测数据 s_dat <- get_saq_observations(site = s$site, start = 2023) %>% filter(variable == "pm10" & date < "2023-01-01 12:00") %>% mutate(date = as.character(date)) %>% left_join(s, by = "site") %>% select(date, value, geometry) ## 设置几何列 st_geometry(s_dat) <- s_dat$geometry ## 转换为Terra矢量对象 sv <- terra::vect(s_dat) ## 按日期生成分层栅格砖 b <- terra::rasterize(sv, r, field = "value", fun = 'mean', by = "date") ## 查看结果 plot(b)
报错1:rast(s, res=1, vals = 1)转换sf对象失败
报错信息
Error in methods::as(x, "SpatRaster") : no method or default for coercing "sf" to "SpatRaster"
解决方法
避免直接将sf对象传入rast(),改为显式提取空间范围并创建栅格:
# 提取sf对象的空间范围 e <- ext(s) # 基于范围创建空栅格,设置分辨率与初始值 r <- rast(e, res=1, vals=1) # 匹配原sf的坐标系 crs(r) <- crs(s)
原因:旧版本Terra在Linux环境下对sf对象的直接转换支持存在兼容性问题,显式指定范围和坐标系可规避该问题。
报错2:rasterize的by参数执行报错
报错信息
Error in match.fun(FUN) : 'list(g)' is not a function, character or symbol
解决方法
- 更新Terra包到稳定版本:
by参数是Terra 1.7-29之后才稳定支持的功能,Linux环境可能安装了旧版本。执行更新:
install.packages("terra", repos = "https://rspatial.r-universe.dev")
- 确认
fun参数传入格式正确,确保使用字符型函数名(如'mean')或直接传入函数(如mean),避免语法错误。
内容的提问来源于stack exchange,提问作者Blaiso
相关产品推荐
相关产品推荐

