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

使用RStoolbox包的ggRGB函数无法绘制掩膜图像求助

解决terra+RStoolbox ggRGB绘图内存分配错误

问题场景

使用terra、ggplot2、RStoolbox处理遥感图像时,裁剪掩膜后的栅格用ggRGB绘图触发内存错误,代码如下:

library(terra)
library(ggplot2)
library(RStoolbox)

lsat

plotRGB(lsat,
        r = 3,
        g = 2,
        b = 1,
        stretch = 'hist')

m <- draw(x="polygon", n = 5)

lsat.masked <- crop(lsat, m, mask = T)

ggplot() + ggRGB(img = lsat.masked,
                 r = 3,
                 g = 2,
                 b = 1,
                 stretch = 'hist',
                 ggLayer = T)

错误信息(翻译后)

错误于grid.Call.graphics(C_raster, x$raster, x$x, x$y, x$width, x$height, :
无法分配大小为67108864 Tb的内存块
另外:警告信息:
In matrix(z, nrow = nrow(rr), ncol = ncol(rr), byrow = TRUE) :
数据长度[5888]不是行数[88]的约数或倍数

问题原因

RStoolbox的ggRGB函数对terra包的栅格对象(尤其是掩膜后带大量NA的栅格)兼容性不足,导致内存维度计算异常,触发错误的内存分配请求。

解决方案

方案1:转换栅格格式

将terra栅格对象转换为raster包的RasterBrick格式后再调用ggRGB:

# 转换terra栅格为RasterBrick
lsat.masked_raster <- as(lsat.masked, "RasterBrick")

# 用转换后的对象绘图
ggplot() + 
  ggRGB(img = lsat.masked_raster,
        r = 3, g = 2, b = 1,
        stretch = 'hist',
        ggLayer = TRUE)

方案2:手动构建ggplot图层(无需格式转换)

直接用terra的plotRGB生成RGB矩阵,结合ggplot的annotation_raster绘图:

# 生成RGB拉伸后的矩阵
rgb_mat <- plotRGB(lsat.masked, r=3,g=2,b=1, stretch='hist', returnMatrix=TRUE)

# 获取栅格范围
ext <- ext(lsat.masked)

# ggplot绘图
ggplot() +
  annotation_raster(rgb_mat, xmin=ext[1], xmax=ext[2], ymin=ext[3], ymax=ext[4]) +
  coord_equal()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 03:14:55