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

使用Cartopy pcolormesh绘制跨日界线RGB数组的渲染问题

解决Cartopy pcolormesh跨日界线(180°经线)渲染异常的问题

我太懂这个坑了——Cartopy的pcolormesh在处理跨越180°经线的不规则网格数据时,确实会因为坐标衔接问题出现渲染断裂或者不显示的情况。其实核心问题在于默认的[-180, 180]经度范围在日界线处是不连续的,我们只需要把坐标系统切换到[0, 360]范围,并调整投影中心,就能完美解决这个问题。

具体解决方案步骤:

  • 转换经度范围:把所有小于0的经度值加上360,将[-180, 180]的经度转换为[0, 360]区间,这样日界线两侧的坐标就变成了连续的数值(比如-170°变成190°,和180°、170°自然衔接)。
  • 调整投影中心:创建Cartopy投影时指定central_longitude=180,让地图以180°经线为中心,此时日界线会落在地图的左右边缘,不会截断中间的数据。
  • 适配地图范围:设置地图的x轴范围为[0, 360],确保转换后的经度数据能完全显示在地图上。

修改后的可运行代码:

import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import numpy as np

# RGBA图像数据
r = np.array([[0.27359769, 0.27359769, 0.27359769, 0.27359769],
              [0.27359769, 0.67702749, 0.85702749, 0.27359769],
              [0.27359769, 0.85702749, 0.67702749, 0.27359769],
              [0.27359769, 0.67702749, 0.85702749, 0.27359769],
              [0.27359769, 0.85702749, 0.67702749, 0.27359769],
              [0.27359769, 0.27359769, 0.27359769, 0.27359769]])
g = r  # 替换为你的真实G通道数据
b = r  # 替换为你的真实B通道数据
a = np.ones_like(r)  # 透明度数组,按需调整

# 构造跨日界线的经纬度数组(示例,替换为你的真实数据)
lon = np.array([170, 180, -170, -160])
lat = np.array([-20, -10, 0, 10, 20, 30])

# 关键步骤:将经度转换为0-360范围
lon_360 = lon.copy()
lon_360[lon_360 < 0] += 360

# 创建以180°为中心的PlateCarree投影
proj = ccrs.PlateCarree(central_longitude=180)

fig, ax = plt.subplots(subplot_kw={'projection': proj}, figsize=(10, 6))

# 合并RGB+A为RGBA数组
rgba = np.dstack((r, g, b, a))
# 使用转换后的经度绘制,注意指定原始数据的坐标系为PlateCarree
ax.pcolormesh(lon_360, lat, rgba, transform=ccrs.PlateCarree(), shading='auto')

# 设置地图经度范围为0-360,匹配转换后的坐标
ax.set_xlim(0, 360)
# 添加地图基础元素
ax.coastlines(linewidth=0.8)
ax.gridlines(draw_labels=True, linestyle='--')

plt.show()

补充说明:

如果你的经纬度是二维不规则网格(比如每个像素都有独立的经纬度坐标),这个方法同样适用——只需要遍历整个经度数组,把所有负值加上360即可,不需要改变其他逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:07:51