R ggplot绘制曲面投影栅格地图:如何移除投影区域外数据?
解决非WGS84投影下栅格数据的地球外遮罩问题
核心方案
通过生成目标投影对应的地球轮廓多边形,自动裁剪栅格中超出地球范围的部分,完全适配批量绘图需求,无需手动调整。
具体实现步骤
1. 创建目标投影的地球边界
先构建WGS84坐标系的全球圆形边界,再转换到目标投影,得到该投影下的地球轮廓:
library(terra) library(tidyterra) library(ggplot2) library(sf) # 生成WGS84全球圆形多边形(地球半径取近似值6371000米) world_wgs84 <- st_sfc(st_point(c(0,0)), crs = 4326) %>% st_buffer(dist = 6371000) %>% st_sf() # 转换到目标投影(示例为Hatano投影) target_crs <- st_crs("+proj=hatano") world_target_proj <- st_transform(world_wgs84, target_crs)
2. 自动裁剪栅格数据
用转换后的地球边界对栅格进行遮罩,移除地球外的冗余数据:
# 读取并预处理原始栅格 r <- rast('Beck_KG_V1_present_0p5.tif') r[r == 0] <- NA # 将栅格转换到目标投影(若原始栅格已为目标投影可跳过此步) r_proj <- project(r, target_crs) # 执行遮罩裁剪 r_clipped <- mask(r_proj, vect(world_target_proj))
3. 绘图验证
绘制裁剪后的栅格,此时地球外的数据已被自动移除:
ggplot() + geom_spatraster(data = r_clipped) + scale_fill_viridis_c(na.value = 'transparent') + coord_sf(crs = target_crs, expand = FALSE)
多投影适配与批量处理
该方法完全支持切换任意非WGS84投影,只需修改target_crs参数即可。结合循环或purrr包可轻松批量处理100+地图:
- 替换
target_crs为目标投影字符串(如"+proj=moll"墨卡托、"+proj=laea"兰伯特等) - 用
list.files()遍历所有栅格文件,循环执行裁剪与绘图流程
关键细节
- 地球半径取近似值6371000米足以满足绘图精度需求
mask()函数会自动处理栅格与多边形的空间匹配,无需手动对齐- 若原始栅格已为目标投影,可直接跳过
project()步骤

内容的提问来源于stack exchange,提问作者Herman Toothrot
相关产品推荐
相关产品推荐

