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

Basemap中Robinson投影(lon_0=-180)昼夜阴影异常问题求助

解决Basemap Robinson投影(中心经度-180°)昼夜阴影异常问题

可以通过shiftgrid函数修复这个问题,核心原因是投影的经度范围与nightshade生成的数据经度范围不匹配:当你把投影中心设为-180°时,Basemap的经度处理逻辑是[-180°, 180°],但nightshade默认生成的昼夜边界数据是[0°, 360°]的经度范围,导致x坐标非单调,引发等值线绘制异常。

具体解决步骤

  • 手动获取nightshade生成的昼夜边界经纬度数据
  • 使用shiftgrid将经度从[0°, 360°]转换为[-180°, 180°],匹配投影的经度范围
  • 重新投影调整后的经纬度,并填充阴影区域

修改后的完整代码

from mpl_toolkits.basemap import Basemap, shiftgrid
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime

# 初始化Robinson投影,中心经度-180°
m = Basemap(projection='robin', lon_0=-180, resolution='c')
m.drawcoastlines()
m.fillcontinents(color='coral', lake_color='aqua')
m.drawparallels(np.arange(-90., 120., 30.))
m.drawmeridians(np.arange(0., 360., 60.))
m.drawmapboundary(fill_color='aqua')

date = datetime(2024, 10, 10, 6)
# 手动获取昼夜边界的经纬度数据
lons, lats = m.nightshade(date, return_data=True)
# 使用shiftgrid将经度从[0,360]转换为[-180,180]
lons_shifted, _ = shiftgrid(180., lons, lats, start=False)
# 投影调整后的经纬度
x, y = m(lons_shifted, lats)
# 填充阴影区域
m.fill(x, y, 'k', alpha=0.2)

plt.title("Robinson Projection")
plt.savefig('test.png')

关键代码解释

  • shiftgrid(180., lons, lats, start=False):将经度数据从[0°, 360°]偏移为[-180°, 180°],start=False表示调整后起始经度为-180°
  • return_data=True:让nightshade返回原始的经纬度数据,而不是直接绘制
  • 手动调用m.fill绘制调整后的阴影,替代原来自动绘制的逻辑

额外建议

Basemap已经停止维护,后续建议迁移到Cartopy库,它对现代投影和数据处理的支持更完善,也不会出现这类经度范围不匹配的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 01:00:13