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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 15:53:12