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

将物种分布点转为Raster Stack时遇栅格范围不一致错误

问题:合并物种分布栅格时出现「different extent」错误

我有一个包含不同物种分布点的数据框,想要为species列中的每个物种创建对应的栅格,再将栅格列表合并为Raster Stack,但运行代码时出现了如下错误:

Error in compareRaster(x): different extent

原代码如下:

library(terra)

Occurrence_data <- data.frame(
    lon = c(11.002470, 10.733250, 11.135831, 6.003845, 5.073000, 8.859500, 10.740000),
    lat = c(59.05563, 63.57087, 60.15113, 62.40066, 60.11600, 58.62880, 59.95000),
    species = c("B.terrestris", "B.pascuorum", "B.hortorum", "B.pratorum", "B.terrestris", "B.pascuorum", "B.hortorum")
)

###### Get unique species from the 'species' column
species_list <- as.factor(unique(Occurrence_data$species))


create_species_dataframes <- function(DF) {
  # Get unique species from the 'species' column
  species_list <- unique(DF$species)

  # Create an empty list to store data frames
  species_dataframes <- list()

  # Loop through each unique species
  for (species in species_list) {
    # Filter the DataFrame for the current species
    species_df <- DF[DF$species == species, ]

    # Store the filtered DataFrame in the list
    species_dataframes[[species]] <- species_df
  }

  # Returning the list of data frames
  return(species_dataframes)
}
#call function to create individual dataframes for each species 
Models<-create_species_dataframes(Occurrence_data)

# Function to convert data frame to raster
convert_to_raster <- function(df) {
  # Convert the data frame to a raster
  raster_data <- rast(df, type = "xy", crs = "EPSG:4326")

  return(raster_data)
}

# Convert each data frame in the Models list to a raster
raster_list <- lapply(Models, convert_to_raster)
# Then, we combine all these rasters into stack. 
for(x in raster_list ){
   stackrasters<-stack(stackrasters,raster(x))
 }

错误原因

  1. 栅格参数不统一:用rast(df, type="xy")直接转换时,每个物种的分布点范围不同,生成的栅格在范围(extent)、分辨率上都不一致,而合并成栈要求所有栅格的空间参数完全匹配。
  2. 包函数混用:代码同时使用了terra包(rast())和raster包(stack()、raster())的函数,两者对象不兼容,进一步加剧了问题。

解决方案

先定义一个统一的栅格模板(基于所有数据的空间范围设定),然后将每个物种的分布点栅格化到这个模板上,最后用terra包的函数合并为栈。

修正后的完整代码:

library(terra)

# 1. 加载数据
Occurrence_data <- data.frame(
    lon = c(11.002470, 10.733250, 11.135831, 6.003845, 5.073000, 8.859500, 10.740000),
    lat = c(59.05563, 63.57087, 60.15113, 62.40066, 60.11600, 58.62880, 59.95000),
    species = c("B.terrestris", "B.pascuorum", "B.hortorum", "B.pratorum", "B.terrestris", "B.pascuorum", "B.hortorum")
)

# 2. 创建统一的栅格模板
# 获取所有数据的空间范围
ext <- ext(Occurrence_data$lon, Occurrence_data$lat)
# 创建模板栅格(可自定义分辨率,这里设为0.5度)
template_rast <- rast(ext, res = 0.5, crs = "EPSG:4326")

# 3. 编写栅格化函数:将单个物种的分布点转换为模板匹配的栅格
species_to_raster <- function(species_name, df, template) {
  # 筛选当前物种的分布点
  sp_df <- df[df$species == species_name, ]
  # 转换为矢量点对象
  sp_vect <- vect(sp_df, geom = c("lon", "lat"), crs = "EPSG:4326")
  # 栅格化:将点转换为存在/不存在的栅格(1表示有分布,NA表示无)
  sp_rast <- rasterize(sp_vect, template, field = 1)
  # 设置栅格名称为物种名
  names(sp_rast) <- species_name
  return(sp_rast)
}

# 4. 生成所有物种的栅格并合并为栈
unique_species <- unique(Occurrence_data$species)
raster_list <- lapply(unique_species, species_to_raster, df = Occurrence_data, template = template_rast)
# 合并为terra的Raster Stack(用c()函数)
species_raster_stack <- do.call(c, raster_list)

# 查看结果
species_raster_stack

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 06:45:11