You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Cartopy绘制跨越极地的多边形

问题:跨极地多边形无法正常显示

在使用Cartopy绘制覆盖极地、日界线的多边形时,中纬度图形可正常渲染,但北极区域的多边形显示空白。测试代码中定义了北极圈附近的四个顶点,期望呈现覆盖北极区域的扇形多边形,但实际无显示效果。

原因分析

  1. 顶点顺序错误:给定的北极多边形顶点顺序[(0,75), (270,75), (180,75), (90,75)]混乱,投影后形成自相交的无效多边形,Matplotlib无法正确渲染。
  2. 缺少极点顶点:仅使用75°N的顶点无法形成覆盖北极区域的闭合多边形,需将极点加入顶点列表。
  3. 投影细分精度不足:极地附近的地理曲线需要足够的细分段数,才能正确转换为平面投影坐标。

解决方案

方法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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 17:37:20