You need to enable JavaScript to run this app. 如何实现cartopy Nightshade特征动画并正常导出卫星星下点轨迹视频
优惠活动
大模型
产品
解决方案
定价
更多

如何实现cartopy Nightshade特征动画并正常导出卫星星下点轨迹视频

问题根源

逐帧调用ax.add_feature()添加新的夜影图层时,上一帧的夜影图层并没有被移除,多次叠加后透明度累积就会出现屏幕全黑的问题。Nightshade是Cartopy的Feature类,没有像散点set_offsets这类直接更新属性的原生方法,我们可以通过逐帧删除旧夜影图层+添加新夜影图层的方式实现动画效果。

具体修改方案

1. 调整初始化参数

首先修正夜影时间不匹配的问题,你当前卫星轨道的时间是2021年,夜影用的是2000年的时间,两者时间对应动画效果才准确,同时新增全局变量存储当前帧的夜影实例:

# 替换原来生成dates的代码,用卫星对应的时间生成夜影
dates = [t.utc_datetime() for t in time]
shades = [Nightshade(date, alpha=0.2) for date in dates]

# 删掉原来这行无效初始化代码:ns = ax.add_feature(Nightshade(base, alpha=0.0))
# 新增全局变量存储当前夜影实例
current_ns = None

2. 重写update函数和动画配置

在update函数中先删除上一帧的夜影,再添加当前帧的新夜影,同时关闭blit参数避免Cartopy图层渲染异常:

def update(i):
    global current_ns
    lon = ssp[i, 0]
    lat = ssp[i, 1]
    scatter.set_offsets(np.c_[lon, lat])
    # 先删除上一帧的夜影
    if current_ns is not None:
        current_ns.remove()
    # 添加当前帧的夜影
    current_ns = ax.add_feature(shades[i])
    circle1.center = (lon, lat)
    circle2.center = (lon, lat)
    return scatter, circle1, circle2, current_ns

# 修改FuncAnimation的blit参数为False
anim = animation.FuncAnimation(plt.gcf(), update, frames=df.shape[0],init_func=None, interval=250, blit=False)

补充说明

关闭blit是因为Cartopy的Feature图层不属于matplotlib的基础artist,blit模式下可能无法正常刷新,关闭后虽渲染速度略慢,但导出视频的效果完全稳定。如果要追求更高的渲染效率,也可以手动计算每帧的晨昏线坐标,直接更新单个多边形的顶点属性,不需要反复删加图层,对于简单动画来说上述方案已经足够适用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 23:36:03