如何实现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
相关产品推荐
相关产品推荐

