Cartopy非PlateCarree投影绘图异常(含空图)问题求助
投影参数误解分析与解决方案
核心误解点
- 混淆projection与transform的作用
projection是最终绘图使用的地图投影(输出坐标系),transform是输入原始数据的坐标系(绝大多数公开气候数据都是地理经纬度格式,对应PlateCarree())。你之前错误地将两者强行设为一致,忽略了原始数据的坐标系属性。
- 对投影特性的认知不足
PlateCarree(等距圆柱投影)本身在高纬度区域会产生拉伸变形,这是该投影的固有特性;Mercator投影同样在高纬度存在明显变形,若要减少北欧区域的变形,更适合选择极地或兰伯特类投影。
- 未设置目标区域范围
- 第三种情况的空图/耗时久,本质是未限定斯堪的纳维亚的显示范围,代码默认渲染全球,导致数据区域过小无法显示,或全局渲染负载过高。
解决方案(以Cartopy为例)
关键规则
- 原始经纬度格式的气候数据,
transform固定为PlateCarree() - 根据需求选择适配高纬度的
projection - 必须指定目标区域的地理范围,避免全局渲染
示例代码
import matplotlib.pyplot as plt import cartopy.crs as ccrs import cartopy.feature as cfeature # 替换为你的实际数据:lat(北纬55-70)、lon(东经5-30)、data lat = ... lon = ... data = ... # 选择适配北欧的投影:三种方案可选 # 方案1:坚持使用Mercator投影 proj = ccrs.Mercator() # 方案2:更适合高纬度的兰伯特投影(中心对准斯堪的纳维亚) # proj = ccrs.LambertConformal(central_longitude=15, central_latitude=62) # 方案3:北极极地投影 # proj = ccrs.NorthPolarStereo() # 创建绘图对象,指定输出投影 fig, ax = plt.subplots(subplot_kw={'projection': proj}, figsize=(10, 8)) # 设置斯堪的纳维亚区域范围:东经5-30,北纬55-70,需指定地理坐标的坐标系 ax.set_extent([5, 30, 55, 70], crs=ccrs.PlateCarree()) # 添加地图基础要素 ax.add_feature(cfeature.COASTLINE.with_scale('50m'), linewidth=0.8) ax.add_feature(cfeature.LAND, color='lightgray') ax.add_feature(cfeature.OCEAN, color='lightblue') # 绘制数据:指定transform为原始数据的坐标系 contour_plot = ax.contourf(lon, lat, data, transform=ccrs.PlateCarree(), cmap='viridis') # 添加颜色条 plt.colorbar(contour_plot, ax=ax, orientation='horizontal', pad=0.05) plt.title('斯堪的纳维亚气候数据') plt.show()
针对你三种情况的具体解释
- 双PlateCarree成功但变形:这是该投影的固有缺陷,高纬度拉伸是设计特性,若要避免变形需更换投影。
- 双Mercator显示异常:错误地将
transform设为Mercator,导致原始经纬度数据被错误转换,与地图坐标系不匹配,因此要素显示错位、变形。 - Mercator+PlateCarree空图:未设置
set_extent限定区域,代码默认渲染全球,斯堪的纳维亚区域在全局视图中占比极小,看起来为空,同时全局渲染会大幅增加耗时。
内容的提问来源于stack exchange,提问作者Elsri
相关产品推荐
相关产品推荐

