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

如何为多组.tif气候数据添加时间维度并转换为stars对象?

解决方法:将WorldClim多变量月度数据转为带时间维度的stars对象

核心问题在于,RasterStack转为stars对象时,默认将各图层识别为attributes维度,而非时间维度。以下是正确的处理流程,可实现多变量整合并支持按日期筛选:

1. 单个变量的时间维度处理

对每个气候变量(降水、温度、最高温),读取为RasterStack后,直接将attributes维度重定义为time维度,并赋予对应日期:

# 读取降水数据并转为带时间维度的stars对象
rastlist_prec <- list.files(path = "my/path/prec/WorldClim_2.1_prec_30s/clipped_2024-10-09_16-35-06", 
                            pattern = "wc2.1", full.names = TRUE)
stack_prec <- stack(rastlist_prec)

stars_prec <- st_as_stars(stack_prec) %>%
  # 将原attributes维度转为time,赋值1980年1-4月日期
  st_set_dimensions(which = "attributes", 
                    values = as.Date(c("1980-01-01", "1980-02-01", "1980-03-01", "1980-04-01")),
                    names = "time") %>%
  # 重命名属性为变量名
  st_set_names("prec")

# 同理处理温度数据
rastlist_temp <- list.files(path = "my/path/temp/...", pattern = "wc2.1", full.names = TRUE)
stack_temp <- stack(rastlist_temp)
stars_temp <- st_as_stars(stack_temp) %>%
  st_set_dimensions(which = "attributes", 
                    values = as.Date(c("1980-01-01", "1980-02-01", "1980-03-01", "1980-04-01")),
                    names = "time") %>%
  st_set_names("temp")

# 同理处理最高温度数据
rastlist_tmax <- list.files(path = "my/path/tmax/...", pattern = "wc2.1", full.names = TRUE)
stack_tmax <- stack(rastlist_tmax)
stars_tmax <- st_as_stars(stack_tmax) %>%
  st_set_dimensions(which = "attributes", 
                    values = as.Date(c("1980-01-01", "1980-02-01", "1980-03-01", "1980-04-01")),
                    names = "time") %>%
  st_set_names("tmax")

2. 整合多变量到统一stars对象

将三个变量按新增的variable维度合并,确保时间维度对齐:

# 合并三个变量,新增variable维度
stars_clim <- c(stars_prec, stars_temp, stars_tmax, along = "variable")
# 为variable维度赋值变量名称
stars_clim <- st_set_dimensions(stars_clim, which = "variable", values = c("prec", "temp", "tmax"))

3. 按日期筛选数据

完成维度定义后,可直接按时间或变量筛选数据:

# 筛选1980年2月的所有气候变量数据
feb_clim_data <- stars_clim %>% filter(time == as.Date("1980-02-01"))

# 筛选1980年1-2月的降水数据
prec_jan_feb <- stars_clim %>% 
  filter(time %in% as.Date(c("1980-01-01", "1980-02-01")), 
         variable == "prec")

原方法问题说明

之前重复stars对象再合并的操作,会导致维度叠加混乱,错误地将时间维度拆分为独立属性。正确逻辑是直接将每个变量的图层维度转为time,再通过变量维度整合多数据。

内容的提问来源于stack exchange,提问作者Rocío Beatriz Cortés

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 11:05:54