如何使用Cartopy绘制跨越极地的多边形
问题:跨极地多边形无法正常显示
在使用Cartopy绘制覆盖极地、日界线的多边形时,中纬度图形可正常渲染,但北极区域的多边形显示空白。测试代码中定义了北极圈附近的四个顶点,期望呈现覆盖北极区域的扇形多边形,但实际无显示效果。
原因分析
- 顶点顺序错误:给定的北极多边形顶点顺序
[(0,75), (270,75), (180,75), (90,75)]混乱,投影后形成自相交的无效多边形,Matplotlib无法正确渲染。 - 缺少极点顶点:仅使用75°N的顶点无法形成覆盖北极区域的闭合多边形,需将极点加入顶点列表。
- 投影细分精度不足:极地附近的地理曲线需要足够的细分段数,才能正确转换为平面投影坐标。
解决方案
方法1:修正顶点顺序并添加极点
调整顶点顺序为逆时针环绕极点,并加入北极点,确保多边形闭合且无自相交:
from matplotlib.patches import Polygon import matplotlib.pyplot as plt import cartopy.crs as ccrs geodetic = ccrs.Geodetic() # 修正后的北极多边形:包含极点,顶点按逆时针环绕 points_north = [ (0, 90), # 北极点 (0, 75), # 0°经度,75°N (90, 75), # 90°E,75°N (180, 75), # 180°经度,75°N (270, 75), # 90°W,75°N (0, 90) # 回到极点,闭合多边形 ] points_mid = [ (10, 70), (30, 20), (60, 20), (80, 70) ] proj0 = ccrs.PlateCarree() proj0._threshold /= 10 # 进一步提高细分精度 ax = plt.axes(projection=proj0) # 添加多边形,注意transform参数使用geodetic ax.add_patch(Polygon(points_north, alpha=0.4, color='blue', transform=geodetic)) ax.add_patch(Polygon(points_mid, alpha=0.4, color='red', transform=geodetic)) # 地图装饰 longlocs = list(range(-180, 181, 30)) latlocs = [-75, -60, -30, 0, 30, 60, 75, 90] ax.gridlines(xlocs=longlocs, ylocs=latlocs, draw_labels=True, crs=proj0) ax.set_global() ax.set_xlabel('Longitude') ax.set_ylabel('Latitude') plt.show()
方法2:使用Cartopy PathPatch处理复杂投影
对于更复杂的跨极地/日界线多边形,推荐使用Cartopy的PathPatch结合geodetic转换,能更好处理地理曲线的投影:
import matplotlib.pyplot as plt import cartopy.crs as ccrs from cartopy.mpl.patch import PathPatch import matplotlib.path as mpath geodetic = ccrs.Geodetic() proj0 = ccrs.PlateCarree() proj0._threshold /= 10 # 定义北极多边形顶点(含极点) points_north = [ (0, 90), (0,75), (90,75), (180,75), (270,75), (0,90) ] # 将地理坐标转换为投影坐标,并创建Path path = mpath.Path(points_north) ax = plt.axes(projection=proj0) # 使用PathPatch添加多边形 ax.add_patch(PathPatch(path, alpha=0.4, color='blue', transform=geodetic)) ax.add_patch(PathPatch(mpath.Path(points_mid), alpha=0.4, color='red', transform=geodetic)) # 地图装饰 ax.gridlines(xlocs=range(-180,181,30), ylocs=[-75,-60,-30,0,30,60,75,90], draw_labels=True) ax.set_global() plt.show()
关键注意事项
- 顶点顺序:必须按顺时针或逆时针方向环绕极点,避免自相交。
- 极点包含:若要覆盖极地区域,需将极点作为多边形的一个顶点。
- 细分精度:通过调整
proj0._threshold减小阈值,提高投影转换时的曲线细分段数,避免极地附近出现折线或空白。
内容的提问来源于stack exchange,提问作者Nova461
相关产品推荐
相关产品推荐

