动画和导出 cartopy Nightshade 功能

问题描述

我正在尝试通过组合包绘制卫星的地面轨迹,为卫星运动设置动画,从卫星点(在此代码中只是任意圆圈)标记视野,然后将文件导出为某种视频。到目前为止,除了当我尝试导出视频时,Nightshade 功能的动画效果不如叠加层多,并最终使大部分屏幕变黑,我已经能够完成所有这些操作。关于如何正确为 Nightshade 功能设置动画,我有什么遗漏吗?我知道我基本上是在每次运行帧时在更新函数中重新创建一个功能,但我无法像绘制散点图一样弄清楚如何更新它。

我在下面包含了我的示例代码

import pandas as pd
from sgp4.api import WGS72
from sgp4.api import Satrec
from skyfield.api import EarthSatellite,load,N,W,wgs84
import datetime
import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import matplotlib.animation as animation
from cartopy.feature.nightshade import Nightshade

# CREATE THE SATELLITE DATA
epoch = datetime.date(1949,12,31)
sat = Satrec()
sat.sgp4init(
    WGS72,# gravity model
    'i',# 'a' = old AFSPC mode,'i' = improved mode
    5,# satnum: Satellite number
    (datetime.date.today() - epoch).days,# epoch: days since 1949 December 31 00:00 UT
    0,# bstar: drag coefficient (1/earth radii)
    6.969196665e-13,# ndot (NOT USED): ballistic coefficient (revs/day)
    0.0,# nddot (NOT USED): mean motion 2nd derivative (revs/day^3)
    0.1,# ecco: eccentricity
    280 * np.pi / 180,# argpo: argument of perigee (radians)
    50 * np.pi / 180,# inclo: inclination (radians)
    275 * np.pi / 180,# mo: mean anomaly (radians)
    0.0472294454407,# no_kozai: mean motion (radians/minute)
    50 * np.pi / 180,# nodeo: right ascension of ascending node (radians)
)
# DEFINE A FEW BASIC ParaMETERS FOR THE PROGRAM
P = sat.mo / sat.no_kozai  # min,period of orbit. LEOs orbit between 84-127 minutes
ts = load.timescale()
sat1 = EarthSatellite.from_satrec(sat,ts)

hours = np.arange(0,6,0.05)
time = ts.utc(2021,31,hours)

pos = sat1.at(time).position.km
pos_ec = sat1.at(time).ecliptic_position().km

sp = wgs84.subpoint(sat1.at(time))
latitude = sp.latitude
longitude = sp.longitude
elev = sp.elevation

# CREATE A DATAFRAME OF THE DATA FOR REVIEW LATER IF NEEDED
df = pd.DataFrame([time.utc_datetime(),latitude.degrees,longitude.degrees,elev.km],index=['DTS','lat','lon','elev']).T
df.lat = df.lat.astype('float32')
df.lon = df.lon.astype('float32')
df.elev = df.elev.astype('float32')
df.set_index('DTS',inplace=True)


# ASSIGN RELEVANT DATA FOR THE SUBSATELLITE POINT
ssp = np.transpose(np.array([longitude.degrees,latitude.degrees]))
line = ssp.copy()
pos = np.where(np.diff(np.abs(line[:,0] >= 0)))[0]
line[pos,:] = np.nan

# CREATE DATE TIME RANGES FOR USE WITH THE NIGHTSHADE FEATURE
base = datetime.datetime(2000,1,1)
dates = np.array([base + datetime.timedelta(hours=i) for i in range(len(hours))])
shades = [Nightshade(date,alpha=0.2) for date in dates]

### CREATE figURE AND IMAGE
fig = plt.figure(figsize=(16,8))
ax = fig.add_subplot(1,projection=ccrs.PlateCarree())
ax.stock_img()
# plot lines that will show the ground track that will be animated
ax.plot(line[:,0],line[:,1],'--k')
# create a blank scatter to start
scatter = ax.scatter(None,None,color='r',s=30)
# initiate the circles around the scatter point
circle1 = plt.Circle((longitude.degrees[0],latitude.degrees[0]),radius=30,color='blue',alpha=0.3)
circle2 = plt.Circle((longitude.degrees[0],radius=40,color='yellow',alpha=0.3)
# add the circles to the axis
ax.add_patch(circle1)
ax.add_patch(circle2)

# Add the nightshade feature (but set it to be invisible so it doesn't stay through the whole animation)
ns = ax.add_feature(Nightshade(base,alpha=0.0))

# Create all the updates for the animation
def update(i):
    lon = ssp[i,0]
    lat = ssp[i,1]
    scatter.set_offsets(np.c_[lon,lat])
    # add a feature for the next Nightshade feature
    ns = ax.add_feature(shades[i],alpha=0.2)
    circle1.center = (lon,lat)
    circle2.center = (lon,lat)

    return scatter,circle1,circle2,ns

# Run the animation
anim = animation.FuncAnimation(plt.gcf(),update,frames=df.shape[0],init_func=None,interval=250,blit=True)
plt.show()

# WRITE THE VIDEO
Writer = animation.writers['ffmpeg']
writer = Writer(fps=10,Metadata=dict(artist='Me'),bitrate=1800)
anim.save('gt.mp4',writer=writer)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...