解决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
相关产品推荐
相关产品推荐

