基于ggOceanMaps实现太平洋中心投影并叠加卫星追踪数据的问题
ggOceanMaps卫星轨迹绘图问题解决方案
1. 恢复太平洋中心投影的弯曲经纬网格
ggOceanMaps默认输出平面直线路径的经纬网格,要实现球面弯曲效果,只需在basemap()中添加几个参数:
basemap( limits = c(175, -135, -25, 0), rotate = TRUE, bathy.style = "poly_blues", grid = TRUE, # 强制启用网格 spherical = TRUE, # 开启球面网格渲染(关键参数) lon.interval = 30, # 经度网格间隔,可按需调整 lat.interval = 5, # 纬度网格间隔,可按需调整 grid.col = "gray50" # 网格颜色,可选 ) + ggspatial::annotation_scale(location = "br") + ggspatial::annotation_north_arrow(location = "tr", which_north = "true")
spherical=TRUE会让网格按照球面投影规则生成弯曲线条,配合rotate=TRUE的太平洋中心投影,就能还原你需要的球面形态网格。
2. 修复海龟轨迹不显示的问题
轨迹不显示的核心原因是坐标系不匹配:ggOceanMaps的basemap()使用投影坐标系,而你的原始数据是经纬度(地理坐标系),直接用普通geom_path()/geom_point()会导致图形被绘制到视野范围外(但图例不受影响)。
推荐两种快速解决方法:
方法一:用ggspatial空间图层自动转投影
直接替换geom_path()为ggspatial::geom_spatial_path(),它会自动识别basemap的投影参数并转换你的经纬度数据:
basemap( limits = c(175, -135, -25, 0), rotate = TRUE, bathy.style = "poly_blues" ) + ggspatial::geom_spatial_path( data = DATA_SATELLITE_CLEANED, aes(x = Longitude, y = Latitude, group = Deploy_ID, color = Deploy_ID), size = 0.6, alpha = 0.8 ) + ggspatial::annotation_scale(location = "br") + ggspatial::annotation_north_arrow(location = "tr", which_north = "true")
如果需要绘制点位,替换为ggspatial::geom_spatial_point()即可。
方法二:提前转换数据坐标系
用ggOceanMaps自带的transform_coord()函数,将原始经纬度数据转换成basemap使用的投影坐标,再用普通geom图层:
# 先转换数据坐标系 DATA_PROJECTED <- transform_coord( data = DATA_SATELLITE_CLEANED, limits = c(175, -135, -25, 0), rotate = TRUE ) # 绘制地图与轨迹 basemap( limits = c(175, -135, -25, 0), rotate = TRUE, bathy.style = "poly_blues" ) + geom_path( data = DATA_PROJECTED, aes(x = lon, y = lat, group = Deploy_ID, color = Deploy_ID), size = 0.6, alpha = 0.8 ) + ggspatial::annotation_scale(location = "br") + ggspatial::annotation_north_arrow(location = "tr", which_north = "true")
注意转换后的数据列名变为lon和lat,需对应调整aes()中的参数。
内容的提问来源于stack exchange,提问作者Australmat
相关产品推荐
相关产品推荐

