Cartopy自定义边界与立体投影下网格线缺失问题求助
解决南大洋太平洋扇区地图180~60W区域网格线缺失问题
问题分析
你用自定义边界限制地图范围,同时设置了set_extent,但在Stereographic投影下,默认gridlines()未正确处理跨180°经线(日界线)的区域,导致180~60W范围的网格线被裁剪或未生成。另外,自定义边界顶点的生成范围和set_extent的范围存在差异,也会干扰网格线的渲染逻辑。
解决方案
通过以下修改确保网格线覆盖目标区域:
- 统一自定义边界和
set_extent的经纬度范围,避免范围冲突 - 给
gridlines()显式指定经纬度生成范围,强制覆盖跨180°的区域 - 优化边界顶点生成逻辑,避免不连续问题
修改后的代码
import matplotlib.pyplot as plt import matplotlib.path as mpath import cartopy import cartopy.crs as ccrs import numpy as np # 目标区域:160E~60W(对应经度160~300),-90S~-60S proj = ccrs.Stereographic(central_longitude=228, central_latitude=-70) fig = plt.figure(figsize=(10,10)) ax = plt.axes([0,0,1,1], projection=proj) latmin = -90 latmax = -60 lonmin = 160 # 匹配目标起始经度 lonmax = 300 # 60W对应经度,统一范围 # 生成平滑的自定义边界顶点 vertices = [(lon, latmin) for lon in np.linspace(lonmin, lonmax, 100)] + \ [(lon, latmax) for lon in np.linspace(lonmax, lonmin, 100)] boundary = mpath.Path(vertices) ax.set_boundary(boundary, transform=ccrs.PlateCarree()) # 统一extent与自定义边界范围 ax.set_extent([lonmin, lonmax, latmin, latmax], ccrs.PlateCarree()) ax.add_feature(cartopy.feature.LAND, zorder=1, edgecolor='k') # 显式指定网格线经纬度位置,覆盖跨180区域 gl = ax.gridlines( crs=ccrs.PlateCarree(), draw_labels=True, xlocs=np.arange(160, 301, 10), ylocs=np.arange(-90, -59, 10), linestyle='--', color='gray' ) # 调整标签位置避免重叠 gl.right_labels = False gl.top_labels = False plt.show()
关键修改说明
- 范围统一:将自定义边界和
set_extent的经纬度范围对齐为目标区域,消除范围冲突 - 强制网格线范围:通过
xlocs和ylocs指定网格线的生成点,确保覆盖180~60W区域 - 平滑边界:用
np.linspace生成更连续的边界顶点,避免整数步长导致的边界断裂 - 标签优化:关闭右侧和顶部标签,避免极地投影下的标签错位或重叠
内容的提问来源于stack exchange,提问作者Jellywzx
相关产品推荐
相关产品推荐

