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

投影后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
原因分析
  1. 坐标范围不匹配:Hatano投影的坐标单位是米,范围在正负1700万左右,ggplot默认的坐标范围未自动适配该范围,导致图形被压缩到可视区域外。
  2. 采样参数设置问题:投影后栅格尺寸远大于原始栅格,maxcell=1e+06的采样数量可能不足以覆盖整个栅格,或者采样点分布不均导致无有效显示内容。
  3. 不必要的掩码参数:投影时使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 15:44:52