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

解决tidyterra中等地球投影下全球数据重复绘制问题

问题:tidyterra绘制全球数据时跨180°经线重复显示的解决方法

问题描述

使用tidyterra绘制全球栅格数据时,在**格林尼治等地球投影(ESRI:53035)**下出现异常:俄罗斯区域在地图左侧重复显示,阿拉斯加/加拿大区域在右侧重复显示,尽管这些大陆已在另一侧完整呈现。经纬度投影或摩尔维特投影(ESRI:54009)显示正常,尝试设置limits和expand=FALSE未解决问题,需强制遵守-180°/180°经线的边界限制。

示例代码

library(terra)
library(geodata)
library(tidyterra)

# 示例数据
tavg <- worldclim_global("tavg", 10, ".")
tavg <- mean(tavg)

# 经纬度投影绘图
ggplot() +
  geom_spatraster(data = tavg) +
  scale_fill_whitebox_c(palette='atlas')

# 摩尔维特投影绘图(显示正常)
ggplot() +
  geom_spatraster(data = tavg) +
  scale_fill_whitebox_c(palette='atlas') +
  coord_sf(crs = st_crs("ESRI:54009")) + 
  labs(title='Mollweide')

# 等地球投影绘图(出现重复)
ggplot() +
  geom_spatraster(data = tavg) +
  scale_fill_whitebox_c(palette='atlas') +
  coord_sf(crs = st_crs("ESRI:53035")) + 
  labs(title='Equal Earth')

解决方案

1. 裁剪原始栅格至严格的±180°经度范围

部分全球栅格数据可能包含超出±180°的冗余延伸数据(如极地附近),先通过terra::crop()限定边界:

# 创建覆盖全球经纬度的边界框
bbox <- ext(-180, 180, -90, 90)
# 裁剪栅格
tavg_cropped <- crop(tavg, bbox)

2. 在coord_sf()中强制指定投影后的x轴范围

即使裁剪了原始数据,投影转换后ggplot仍可能自动扩展边界。先计算目标投影下±180°对应的坐标值,再限定x范围:

library(sf)

# 将WGS84下的经度边界点转换为等地球投影坐标
lon_bounds <- st_sfc(st_point(c(-180, 0)), st_point(c(180, 0)), crs = 4326)
lon_bounds_proj <- st_transform(lon_bounds, st_crs("ESRI:53035"))

# 获取投影后的x轴极值
x_min <- st_coordinates(lon_bounds_proj)[1, 1]
x_max <- st_coordinates(lon_bounds_proj)[2, 1]

# 绘制修复后的等地球投影图
ggplot() +
  geom_spatraster(data = tavg_cropped) +
  scale_fill_whitebox_c(palette='atlas') +
  coord_sf(
    crs = st_crs("ESRI:53035"),
    xlim = c(x_min, x_max),
    expand = FALSE
  ) + 
  labs(title='Equal Earth (Fixed)')

3. 替代方案:预先转换投影并裁剪

先将栅格转换为目标投影,再裁剪到投影后的有效范围,避免ggplot自动扩展边界:

# 预先将栅格转换为等地球投影
tavg_equalearth <- project(tavg, "ESRI:53035")
# 裁剪至转换后栅格的原生范围
tavg_equalearth_cropped <- crop(tavg_equalearth, ext(tavg_equalearth))

# 绘图
ggplot() +
  geom_spatraster(data = tavg_equalearth_cropped) +
  scale_fill_whitebox_c(palette='atlas') +
  coord_sf(crs = st_crs("ESRI:53035"), expand = FALSE) + 
  labs(title='Equal Earth (Pre-projected)')

问题原因

这类重复显示是因为部分全球投影(如ESRI:53035)在转换时,ggplot会自动扩展绘图边界以覆盖栅格的“环绕”部分(即跨180°经线的延伸数据)。通过裁剪原始数据+限定投影后范围,可以强制约束显示区域在预期的边界内。

内容的提问来源于stack exchange,提问作者Jaken

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 11:35:04