如何让elevatr生成的罗宾逊投影栅格呈现伪圆柱形态?
问题:如何让罗宾逊投影的单通道栅格呈现伪圆柱形态?
数据来源与处理背景
我从两个渠道获取全球高程栅格数据:
- 来源1(Natural Earth):下载3.2.0版大尺寸(385.56MB)的多通道高程栅格,初始坐标系为WGS 84。
- 来源2(R语言elevatr包):通过以下代码生成并导出单通道WGS 84坐标系栅格:
world_elevation <- elevatr::get_elev_raster( locations = world_poly, z = 4, clip = "locations", override_size_check = T ) writeRaster(world_elevation, "world_elevation.tif", options = c("COMPRESS = NONE", "TFW = YES"))
后续使用terra和tidyterra包将两个栅格转换为罗宾逊投影(投影参数:crsRobinson = "+proj=robin +lon_0=0 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs"),但出现差异:
- 来源1的栅格投影后,用
geom_spatraster_rgb绘图呈现标准伪圆柱形态(中间矩形、两侧外凸); - 来源2的栅格经扩展范围、投影后,尝试用伪圆柱矢量裁剪,用
geom_spatraster绘图仍为矩形。
解决方案
要让来源2的栅格呈现罗宾逊投影的伪圆柱形态,核心是处理栅格的无数据区域(NA)并配合正确的绘图参数,步骤如下:
1. 投影时自动掩膜有效范围
使用terra::project()转换投影时,设置mask=TRUE,让投影后的栅格自动保留原数据的轮廓,避免生成完整的矩形范围:
library(terra) library(tidyterra) # 读取来源2的单通道栅格 world_elev <- rast("world_elevation.tif") # 定义罗宾逊投影参数 crsRobinson <- "+proj=robin +lon_0=0 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs" # 投影并自动掩膜,仅保留有效数据区域 world_elev_robin <- project(world_elev, crsRobinson, mask = TRUE)
2. 用矢量边界二次裁剪(可选,提升精度)
如果自动掩膜的效果不够理想,可以用罗宾逊投影的全球边界矢量进一步裁剪栅格:
# 将全球边界矢量转换为罗宾逊投影 world_poly_robin <- project(vect(world_poly), crsRobinson) # 裁剪+掩膜,彻底去除矩形范围外的无效区域 world_elev_robin_clipped <- crop(world_elev_robin, world_poly_robin) world_elev_robin_clipped <- mask(world_elev_robin_clipped, world_poly_robin)
3. 绘图时忽略无数据区域
使用geom_spatraster绘图时,设置na.rm=TRUE让NA区域不显示,配合theme_void()去除背景边框,强化伪圆柱形态:
library(ggplot2) ggplot() + geom_spatraster(data = world_elev_robin, na.rm = TRUE) + scale_fill_terrain_c() + # 可选:使用地形色阶 theme_void()
关键原因
来源1的多通道栅格在投影后,RGB通道的无数据区域会被geom_spatraster_rgb自动识别并隐藏;而来源2的单通道栅格需要显式将矩形范围外的区域设为NA,绘图时忽略这些NA区域,才能呈现出罗宾逊投影的伪圆柱形态。
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

