#!/usr/bin/env python
'''Tracking plot functions
'''
#Python standard import
#Third party import
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import matplotlib.cm as cm
from mpl_toolkits.mplot3d import Axes3D
#Local import
from .. import frames
[docs]def az_el_to_xy(az,el):
az, el = np.radians(az), np.radians(el)
r=np.cos(el)
x=r*np.sin(az)
y=r*np.cos(az)
return x,y
[docs]def local_passes(passes, **kwargs):
enu_ind = kwargs.pop('station_ind', 0)
for ind, ps in enumerate(passes):
if 'add_track' not in kwargs:
if ind == 0:
kwargs['add_track'] = False
else:
kwargs['add_track'] = True
if isinstance(ps.enu, list):
enu = ps.enu[enu_ind]
else:
enu = ps.enu
azelr = frames.cart_to_sph(enu[:3,:], radians=kwargs.setdefault('radians', False))
ax = local_tracking(azelr[0,:], azelr[1,:], **kwargs)
if 'ax' not in kwargs:
kwargs['ax'] = ax
return ax
[docs]def local_tracking(azimuth, elevation, ax=None, t=None, add_track=False, node_times=False, radians=False):
if ax is None:
fig = plt.figure()
ax = fig.add_subplot(111)
x0,y0 = az_el_to_xy(azimuth,elevation)
ax.plot( x0, y0 )
if not add_track:
x,y=az_el_to_xy(np.linspace(0,360,num=360),np.repeat(0.0,360))
ax.plot( x, y ,color="green", alpha=0.5)
x,y=az_el_to_xy(np.linspace(0,360,num=360),np.repeat(30.0,360))
x[np.logical_and(x > 0, abs(y) < 0.1)] = np.nan
ax.plot( x, y ,color="black")
ax.text(np.cos(np.pi*30/180.0),0, r'$30\degree$', horizontalalignment='center', verticalalignment='center')
x,y=az_el_to_xy(np.linspace(0,360,num=360),np.repeat(60.0,360))
x[np.logical_and(x > 0, abs(y) < 0.1)] = np.nan
ax.plot( x, y ,color="black")
ax.text(np.cos(np.pi*60/180.0),0, r'$60\degree$', horizontalalignment='center', verticalalignment='center')
x,y=az_el_to_xy(np.linspace(0,360,num=360),np.repeat(80.0,360))
x[np.logical_and(x > 0, abs(y) < 0.1)] = np.nan
ax.plot( x, y ,color="black")
ax.text(np.cos(np.pi*80/180.0),0, r'$80\degree$', horizontalalignment='center', verticalalignment='center')
ax.plot( x0[0], y0[0] , 'o')
ax.plot( x0[-1], y0[-1] , 'x')
if t is None or not node_times:
start = 'Start'
end = 'End'
else:
start = t[0].to_value('isot', subfmt='date_hm')
end = t[-1].to_value('isot', subfmt='date_hm')
ax.text(x0[0], y0[0], start)
ax.text(x0[-1], y0[-1], end)
if not add_track:
ax.text(0, 1, 'North', horizontalalignment='center', verticalalignment='bottom')
ax.text(0, -1, 'South', horizontalalignment='center', verticalalignment='top')
ax.text(1, 0, 'East', horizontalalignment='left')
ax.text(-1, 0, 'West', horizontalalignment='right')
ax.axis('off')
ax.set_xlim([-1.1,1.1])
ax.set_ylim([-1.1,1.1])
ax.set_aspect('equal', 'datalim')
return ax