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

如何获取两个RasterLayer的最小SIF值并区分其来自VPD还是SM?

解决方案

要实现提取两个栅格的最小SIF值并区分来源,核心是在计算最小值的同时,记录每个单元格最小值对应的原始图层(VPD/SM)。以下是基于terra(推荐替代raster的现代包)和raster包的具体实现步骤:


方法一:使用terra包(推荐)

步骤1:加载包并合并栅格

library(terra)

# 合并两个对齐后的栅格为多层对象,命名以便区分
sif_stack <- c(sif_min_vpd, sif_min_sm_aligned)
names(sif_stack) <- c("VPD_SIF", "SM_SIF")

步骤2:计算最小SIF值+确定来源

# 提取每个单元格的最小SIF值
min_sif <- min(sif_stack)

# 创建来源标识栅格:1代表来自VPD,2代表来自SM
source_raster <- which.min(sif_stack)
# 将数值标签转换为文字描述
source_raster <- classify(source_raster, rbind(c(1, "VPD"), c(2, "SM")))

步骤3:可视化(区分来源+显示SIF值)

你可以分开绘制两个栅格,或者结合为一张图:

# 分图展示
par(mfrow = c(1, 2))
plot(min_sif, main = "最干旱月份最小SIF值")
plot(source_raster, main = "最小值来源", col = c("#1f77b4", "#ff7f0e"))

# 结合ggplot2绘制复合图(同时显示值和来源)
library(ggplot2)
df <- as.data.frame(min_sif, xy = TRUE)
df$source <- as.data.frame(source_raster)[,1]

ggplot(df, aes(x = x, y = y, fill = source, color = min_sif)) +
  geom_raster() +
  scale_fill_manual(values = c("VPD" = "#1f77b4", "SM" = "#ff7f0e"), name = "来源") +
  scale_color_viridis_c(name = "SIF值") +
  labs(title = "最干旱月份最小SIF值及来源") +
  coord_equal()

方法二:使用raster包

如果习惯使用旧版raster包,逻辑完全一致:

library(raster)

# 合并为栅格栈
sif_stack <- stack(sif_min_vpd, sif_min_sm_aligned)
names(sif_stack) <- c("VPD_SIF", "SM_SIF")

# 计算最小值和来源
min_sif <- min(sif_stack)
source_raster <- which.min(sif_stack)
source_raster <- reclassify(source_raster, c(1,1,"VPD", 2,2,"SM"))

# 可视化方式同terra,仅需将plot适配raster语法即可

关键说明

  • which.min()函数会返回每个单元格最小值所在的图层索引,这是区分来源的核心;
  • 转换为文字标签后,可视化时可以通过颜色映射直接区分VPD/SM来源;
  • 最终你会得到两个栅格:min_sif存储最小SIF值,source_raster存储对应来源,两者单元格一一对应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 11:17:35