使用ggOceanMaps跨180°日期变更线绘制新西兰及查塔姆群岛地图的问题
跨180°日期变更线绘制ggOceanMaps地图的解决方案
报错成因
这个报错并非ggOceanMaps完全不支持跨180°经线绘图,完全是两个常规操作触发了内置逻辑的边界缺陷:
- 直接在limits参数中填入带负号的西经值(比如代表170°W的-170)时,函数会按照R的默认数值大小排序经度,把-170识别为比165更小的左边界,最终绘图范围会被错配为从-170到165的整段西太平洋区域,和目标要绘制的新西兰周边范围完全不匹配
- 错配的超长范围会让内置的自动经纬度网格计算逻辑出现坐标断裂,最终触发图形引擎的
polygon edge not found报错
实现步骤
不需要替换其他绘图包,通过连续坐标映射+关闭自动网格计算的方式,就能完整保留该包原生的专业海底地形渲染能力:
- 把西经值换算为连续的东经值定义绘图范围:目标覆盖的170°W,对应的连续东经坐标为190°E(计算逻辑:180° + (180° - 170°) = 190°E),此时整个绘图的经度范围165°E到190°E是连续无跳变的,函数可以正常裁剪全球海底地形、陆地矢量数据,不会出现数据缺失
- 调用basemap时关闭自动经纬度网格生成逻辑,直接规避跨线坐标计算导致的报错:在函数参数中加入
grid.terms = list(lon = NULL, lat = NULL) - 底图渲染完成后,手动添加符合日常地理认知的经纬度刻度,把连续坐标值和实际东西经标注一一对应
可直接运行的调整后代码
library(ggOceanMaps) # 连续经度范围:165°E 到 190°E(对应170°W),纬度范围覆盖-51到-32的区间 nzmap2 <- basemap( limits = c(165, 190, -51, -32), bathymetry = TRUE, resolution = "high", land.col = "darkseagreen4", lon.interval = 5, lat.interval = 5, # 关闭自动网格生成,规避跨线计算报错 grid.terms = list(lon = NULL, lat = NULL) ) + # 手动添加匹配地理认知的经纬度刻度 scale_x_continuous( breaks = c(165, 170, 175, 180, 185, 190), labels = c("165°E", "170°E", "175°E", "180°", "175°W", "170°W") ) + scale_y_continuous( breaks = seq(-50, -30, 5), labels = paste0(seq(-50, -30, 5), "°S") ) + xlab("Longitude") + ylab("Latitude") nzmap2
效果说明
运行上述代码生成的底图,会完整覆盖新西兰南北岛、查塔姆群岛的全域范围,海底地形、陆块的渲染和原预期的视觉效果完全一致,不会触发之前的报错。由于全程使用连续的坐标值,不存在坐标撕断的问题,陆块和海底地形的形状都是完整的。
注意:不要直接在limits参数中混用东经正数、西经负数的写法,这类写法本质是坐标不连续,哪怕绕过报错,也会出现陆地、海底地形被切成两部分的显示问题。
内容的提问来源于stack exchange,提问作者Victoria Carrington
相关产品推荐
相关产品推荐

