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

cartopy正射投影(Orthographic)绘图如何设置统一的extent轴范围

问题原因

你调用get_extent和set_extent时传入的crs = proj()是无参数的默认正射投影实例(默认中心点为经度0、纬度0),和你实际绘图使用的proj(lon, lat)(中心点为经度-90、纬度90的正射投影)不属于同一坐标系,提取的extent本身就是错的,应用后自然无法得到预期效果。

正确操作步骤

1. 提取基准图extent

直接从绘制好的基准轴对象获取当前投影下的extent即可,不需要额外指定crs(默认返回当前轴投影坐标系下的范围值):

# 基准图绘制代码和原有逻辑一致
import matplotlib.pyplot as plt
import cartopy.crs as ccrs

lon = -90
lat = 90
proj =  ccrs.Orthographic
projection = proj(lon, lat)
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection = projection)

transform = ccrs.Geodetic()
lat0 = 50
lon0 = 50
for x in range(-5,6):
    plt.plot(lon0 + x, lat0, 'bo', transform = transform)
    plt.plot(lon0, lat0 + x, 'bo', transform = transform)

# 关键:提取当前轴投影下的extent保存
target_extent = ax.get_extent()

2. 复用extent到其他地图

只要保证其他地图的投影参数和基准图完全一致,调用set_extent传入保存的范围即可:

# 新建第二幅图,投影参数和基准图完全一致
fig2 = plt.figure()
ax2 = fig2.add_subplot(1, 1, 1, projection=proj(lon, lat))

# 直接用之前保存的extent
ax2.set_extent(target_extent, crs=projection)

# 此处绘制其他内容,范围会和第一幅图完全一致
for x in range(-5,6):
    plt.plot(lon0 + x, lat0 + 2, 'ro', transform = transform)
    plt.plot(lon0, lat0 + x + 2, 'ro', transform = transform)

plt.show()

注意事项

  • 所有需要统一范围的地图,投影参数(中心点、椭球等)必须完全和基准图一致,否则extent复用会错位
  • 如果需要跨投影复用范围,需要先把extent的四个边界值转换到目标投影坐标系下再调用set_extent

内容的提问来源于stack exchange,提问作者ramzeek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:45:03