如何在rayshader的plot_3d上叠加raster栅格层并解决add_overlay报错
问题原因
你遇到的报错是三个核心问题导致的:
- 变量名笔误:
plot_3d的第一个输入参数是高程矩阵,你代码中写的mat_tx_reduced是未定义变量,实际你生成的降采样高程矩阵是mat_reduced - 入参类型错误:
add_overlay的overlay参数不支持直接传入RasterLayer对象,需要先将栅格转换为RGB数组或rayshader支持的覆盖层格式,且要和高程矩阵的尺寸完全匹配 - 调用逻辑错误:
plot_3d没有返回值,直接渲染到rgl绘图设备,使用管道符将其输出传递给add_overlay不符合逻辑,add_overlay会自动识别当前激活的3D绘图设备,不需要传入管道传递的参数
修正步骤
- 读取自定义栅格后,先对齐高程数据的投影、范围,再重采样到和降采样后的高程矩阵相同的尺寸
- 使用rayshader自带的
raster_to_overlay函数,将栅格转换为add_overlay支持的格式 - 单独调用
add_overlay完成叠加
修正后代码
library(raster) library(rayshader) # 读取莫桑比克高程数据 altc <- getData('alt', country='MOZ', mask=TRUE) elevation_matrix <- raster_to_matrix(altc) mat_reduced <- resize_matrix(elevation_matrix, 0.7) # 读取自定义栅格并做对齐处理 y <- raster("https://www.dropbox.com/s/zhsu204du0rgbjp/Tlim_margins_Mozambique.grd?dl=0") # 对齐投影、范围、分辨率 y_proj <- projectRaster(y, crs = crs(altc)) y_crop <- crop(y_proj, altc) y_resample <- resample(y_crop, raster(mat_reduced, crs = crs(altc), ext = extent(altc))) # 转换为add_overlay支持的覆盖层格式 y_overlay <- raster_to_overlay(y_resample, alpha = 0.5) # 生成基础着色纹理 base_shade <- mat_reduced |> sphere_shade(texture = create_texture( lightcolor = "white", shadowcolor = "black", leftcolor = "grey", rightcolor = "grey", centercolor = "grey", cornercolors = c(NW = "#ffc500", NE = "#387642", SW = "#d27441", SE = "#296176") ), colorintensity = 0.12, sunangle = 45) # 绘制3D高程图 base_shade |> plot_3d(mat_reduced, windowsize = c(800, 600), zscale = 200, zoom = 0.65, phi = 80, theta = 0, fov = 0, shadow = TRUE, shadowcolor = "#5da5da", water = TRUE, watercolor = "lightblue", waterlinecolor = "lightblue") # 叠加栅格层 add_overlay(overlay = y_overlay)
额外注意事项
如果你的栅格是分类栅格,可以提前指定配色方案,传入raster_to_overlay的palette参数自定义叠加层的显示颜色。
内容的提问来源于stack exchange,提问作者Agus camacho
相关产品推荐
相关产品推荐

