使用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
相关产品推荐
相关产品推荐

