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

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

解决方法

  1. 更新Terra包到稳定版本:by参数是Terra 1.7-29之后才稳定支持的功能,Linux环境可能安装了旧版本。执行更新:
install.packages("terra", repos = "https://rspatial.r-universe.dev")
  1. 确认fun参数传入格式正确,确保使用字符型函数名(如'mean')或直接传入函数(如mean),避免语法错误。

内容的提问来源于stack exchange,提问作者Blaiso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 10:42:50