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

使用tidyterra::geom_spatraster_RGB()绘图出现白点,terra::plotRGB()无此问题

解决tidyterra绘图白点与颜色暗淡问题

问题根源

你遇到的两个问题本质是tidyterra::geom_spatraster_RGB()与terra::plotRGB()的默认行为差异:

  • 颜色暗淡:terra::plotRGB()默认启用stretch="lin"线性拉伸,自动优化像素值的显示范围;而tidyterra默认不做拉伸,直接用原始像素值绘图,导致颜色偏暗。
  • 白点:白点通常是栅格中的NA值(无数据区域,比如云层、影像边缘),terra::plotRGB()会自动隐藏NA值,而tidyterra默认将NA渲染为白色。

解决方案

1. 对栅格做线性拉伸

使用terra::stretch()函数对Sentinel-2影像的RGB波段做线性拉伸,匹配terra::plotRGB()的显示效果:

# 提取RGB对应波段(4,3,2)
rgb_rast = ab_sentinel2_rast[[c(4,3,2)]]

# 线性拉伸,将值缩放到0-5000(与你设置的max_col_value一致)
rgb_stretched = terra::stretch(rgb_rast, minv=0, maxv=5000, stretch="lin")

2. 处理NA值(消除白点)

在geom_spatraster_RGB()中设置na.value = NA,让NA值透明显示,避免白色斑点:

3. 完整修复后代码

library(rsi)
library(tidyterra)
library(terra)
library(tidyverse)
library(sf)

# 边界创建代码不变
annette_boundary = st_point(c(-131.5, 55.15))
annette_boundary = st_sfc(annette_boundary, crs=4326)
annette_boundary = st_buffer(st_transform(annette_boundary, 4326), 20000)

ab_sentinel2 = get_sentinel2_imagery(
  annette_boundary,
  start_date = "2024-10-20",
  end_date = "2024-10-22",
  output_filename = "sentinel2_imagery.tif"
)

ab_sentinel2_rast = terra::rast("sentinel2_imagery.tif")
ab_sentinel2_rast = terra::project(ab_sentinel2_rast, "EPSG:4326")

# 新增:提取RGB波段并做线性拉伸
rgb_rast = ab_sentinel2_rast[[c(4,3,2)]]
rgb_stretched = terra::stretch(rgb_rast, minv=0, maxv=5000, stretch="lin")

# ggplot绘图(修复白点和颜色问题)
ggplot() +
  tidyterra::geom_spatraster_rgb(data = rgb_stretched,
                                 interpolate = F, 
                                 max_col_value = 5000, 
                                 maxcell = 5e+05,
                                 na.value = NA) +  # 隐藏NA值,消除白点
  coord_sf(crs = 4326)  # 确保坐标系匹配

额外优化(可选:去除云层)

如果想进一步消除云层遮挡,可以用Sentinel-2的质量评估波段(SCL)做掩膜:

# 提取SCL质量波段(通常是第12波段,可通过names(ab_sentinel2_rast)确认)
scl_band = ab_sentinel2_rast[[12]]

# 定义有效区域:保留植被、裸地、水体(SCL代码:2=植被,4=裸地,6=水体)
valid_mask = scl_band %in% c(2,4,6)

# 对拉伸后的RGB栅格做掩膜,去除云层等无效区域
rgb_masked = terra::mask(rgb_stretched, valid_mask)

# 用掩膜后的栅格绘图
ggplot() +
  tidyterra::geom_spatraster_rgb(data = rgb_masked,
                                 interpolate = F, 
                                 max_col_value = 5000, 
                                 maxcell = 5e+05,
                                 na.value = NA) +
  coord_sf(crs = 4326)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 21:02:42