投影后World Elevation栅格有值但绘图空白的原因与解决办法
问题描述
从Natural Earth Data下载3.2.0版的10m Cross Blended Hypso栅格数据(含地形、水体等RGB图层),使用terra和tidyterra绘制原始WGS84投影的栅格正常,但转换为Hatano投影后,栅格有数值(hasValues(globRaster2)返回TRUE),但绘图输出为空白。
原始绘图代码:
library(terra) library(tidyterra) library(tidyverse) library(viridis) globRaster <- terra::rast("E:\\Research\\Study\\calvarium\\Maps\\globRaster\\HYP_HR_SR_OB_DR.tif") pp <- ggplot() + geom_spatraster_rgb(data = globRaster, maxcell = 1e+06, alpha = 1) gc() ggsave("globRaster.pdf", pp, width = 90, height = 45, units = "mm", bg = "white")
投影后绘图代码:
globRaster2 <- project(globRaster, method = "near", "+proj=hatano", mask=TRUE) pp2 <- ggplot() + geom_spatraster_rgb(data = globRaster2, maxcell = 1e+06, alpha = 1) gc() ggsave("globRaster2.pdf", pp2, width = 90, height = 45, units = "mm", bg = "white")
栅格信息:
> globRaster class : SpatRaster size : 10800, 21600, 3 (nrow, ncol, nlyr) resolution : 0.01666667, 0.01666667 (x, y) extent : -180, 180, -90, 90 (xmin, xmax, ymin, ymax) coord. ref. : lon/lat WGS 84 (EPSG:4326) source : HYP_HR_SR_OB_DR.tif colors RGB : 1, 2, 3 names : HYP_HR_SR_OB_DR_1, HYP_HR_SR_OB_DR_2, HYP_HR_SR_OB_DR_3 > globRaster2 class : SpatRaster size : 13634, 28140, 3 (nrow, ncol, nlyr) resolution : 1210.47, 1210.513 (x, y) extent : -17031882, 17030741, -8143807, 8360326 (xmin, xmax, ymin, ymax) coord. ref. : +proj=hatano +datum=WGS84 +units=m +no_defs source : spat_2fa413487c42_12196_80Q6udnsxVen2Mq.tif colors RGB : 1, 2, 3 names : HYP_HR_SR_OB_DR_1, HYP_HR_SR_OB_DR_2, HYP_HR_SR_OB_DR_3 min values : 60, 124, 112 max values : 237, 243, 252 > hasValues(globRaster) [1] TRUE > hasValues(globRaster2) [1] TRUE
原因分析
- 坐标范围不匹配:Hatano投影的坐标单位是米,范围在正负1700万左右,ggplot默认的坐标范围未自动适配该范围,导致图形被压缩到可视区域外。
- 采样参数设置问题:投影后栅格尺寸远大于原始栅格,
maxcell=1e+06的采样数量可能不足以覆盖整个栅格,或者采样点分布不均导致无有效显示内容。 - 不必要的掩码参数:投影时使用
mask=TRUE,可能意外生成了限制显示的掩码(尽管hasValues返回TRUE,但掩码可能影响绘图渲染)。
解决方法
1. 移除mask=TRUE参数重新投影
mask=TRUE在project函数中会将输出栅格的掩码与输入栅格绑定,原始栅格无掩码时该参数可能引发异常,先移除重试:
globRaster2 <- project(globRaster, method = "near", "+proj=hatano")
2. 强制适配ggplot坐标范围
手动设置ggplot的坐标范围与投影后栅格的extent一致,确保内容完整显示:
r_ext <- ext(globRaster2) pp2 <- ggplot() + geom_spatraster_rgb(data = globRaster2, maxcell = 1e+06, alpha = 1) + coord_sf(xlim = c(r_ext[1], r_ext[2]), ylim = c(r_ext[3], r_ext[4]))
3. 降低栅格分辨率后再投影
原投影后栅格尺寸过大,先降低分辨率减少计算压力和采样问题:
# 聚合原始栅格降低分辨率(fact=5表示每5x5像素合并为1个) globRaster_low <- aggregate(globRaster, fact = 5) globRaster2_low <- project(globRaster_low, method = "near", "+proj=hatano") # 绘图时无需限制maxcell,或适当调整 pp2 <- ggplot() + geom_spatraster_rgb(data = globRaster2_low, alpha = 1) + coord_sf(xlim = ext(globRaster2_low)[c(1,2)], ylim = ext(globRaster2_low)[c(3,4)])
4. 确认RGB图层属性
检查并重置RGB图层属性,确保绘图时正确识别为RGB图像:
# 检查是否为RGB栅格 print(is.rgb(globRaster2)) # 若不是,手动设置RGB通道 if (!is.rgb(globRaster2)) { globRaster2 <- as.rgb(globRaster2, r=1, g=2, b=3) }
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

