Cartopy设置不同central_longitude时地图范围异常的原因与解决方法
Cartopy自定义中央经线时地图显示异常的原因与解决方案
1. 异常原因
Cartopy的set_extent方法默认采用当前坐标轴的投影坐标系来解析传入的范围参数。当你将ccrs.PlateCarree的central_longitude设为-60时,该投影的坐标系统已将中央经线偏移至西经60度,此时你传入的[-180,180,-60,60]是基于**原始地理坐标系(中央经线0度)**的范围,但Cartopy会错误地将其当作当前投影(中央经线-60)下的坐标处理,最终导致地图显示偏移、区域缺失或空白等异常。
核心问题是:传入的范围参数坐标系与当前轴的投影坐标系不匹配,且未明确声明参数所属坐标系。
2. 解决方法
有两种可靠的解决方式:
方式一:显式指定范围参数的坐标系
调用set_extent时,通过crs参数明确告知Cartopy,传入的范围是基于标准地理坐标系(即ccrs.PlateCarree(central_longitude=0))的,Cartopy会自动完成坐标系转换:
import cartopy.crs as ccrs import matplotlib.pyplot as plt # 创建中央经线为-60的PlateCarree投影轴 ax = plt.axes(projection=ccrs.PlateCarree(central_longitude=-60)) # 指定范围参数属于标准地理坐标系 ax.set_extent([-180, 180, -60, 60], crs=ccrs.PlateCarree()) ax.coastlines() plt.show()
方式二:直接传入当前投影坐标系下的范围
根据当前投影的中央经度,计算出对应地理范围在该投影下的坐标值。以central_longitude=-60为例:
- 地理经度-180°对应投影经度:
-180 - (-60) = -120 - 地理经度180°对应投影经度:
180 - (-60) = 240
直接传入投影坐标系下的范围即可:
ax.set_extent([-120, 240, -60, 60])
针对Mercator投影的最终实现
如果你要创建以西经160°为中央经线、南北纬60°之间的Mercator地图,同样适用上述逻辑,示例代码:
import cartopy.crs as ccrs import matplotlib.pyplot as plt fig, ax = plt.subplots(subplot_kw={'projection': ccrs.Mercator(central_longitude=-160)}) # 显式指定范围属于标准地理坐标系 ax.set_extent([-180, 180, -60, 60], crs=ccrs.PlateCarree()) ax.coastlines() plt.show()
内容的提问来源于stack exchange,提问作者iury simoes-sousa
相关产品推荐
相关产品推荐

