1
0
Fork 0
sattools/python/ground_track.py

115 lines
3.2 KiB
Python
Executable File

#!/usr/bin/env python3
"""
Script showing the position of the ISS at the time of the TLE
and the ground track for the previous and the next orbit
(original) source: https://github.com/galactics/beyond/blob/master/doc/source/_static/ground-track.py
"""
import sys
import argparse
import numpy as np
import matplotlib.pyplot as plt
from pathlib import Path
from beyond.dates import Date, timedelta
from utils import tle_from_file
if __name__ == "__main__":
# Parse arguments
parser = argparse.ArgumentParser(
description="Plot the ground track of a TLE")
parser.add_argument('TLEFILE', help="the tle file", type=str)
args = parser.parse_args()
# Parsing of TLE
tle, name = tle_from_file(args.TLEFILE)
# Conversion into `Orbit` object
orb = tle.orbit()
# Tables containing the positions of the ground track
latitudes, longitudes = [], []
prev_lon, prev_lat = None, None
period = orb.infos.period
# start = orb.date - period
start = Date.now()
stop = period
step = period / 100
for point in orb.ephemeris(start=start, stop=stop, step=step):
# Conversion to earth rotating frame
point.frame = 'ITRF'
# Conversion from cartesian to spherical coordinates (range, latitude, longitude)
point.form = 'spherical'
# Conversion from radians to degrees
lon, lat = np.degrees(point[1:3])
# Creation of multiple segments in order to not have a ground track
# doing impossible paths
if prev_lon is None:
lons = []
lats = []
longitudes.append(lons)
latitudes.append(lats)
elif orb.i < np.pi /2 and (np.sign(prev_lon) == 1 and np.sign(lon) == -1):
lons.append(lon + 360)
lats.append(lat)
lons = [prev_lon - 360]
lats = [prev_lat]
longitudes.append(lons)
latitudes.append(lats)
elif orb.i > np.pi/2 and (np.sign(prev_lon) == -1 and np.sign(lon) == 1):
lons.append(lon - 360)
lats.append(lat)
lons = [prev_lon + 360]
lats = [prev_lat]
longitudes.append(lons)
latitudes.append(lats)
lons.append(lon)
lats.append(lat)
prev_lon = lon
prev_lat = lat
fig = plt.figure(figsize=(15.2, 8.2))
ax = fig.add_subplot(111)
ax.set_title(start.datetime.strftime('%Y-%m-%dT%H:%M:%SZ'))
# Plot earth
img = Path(__file__).parent / "earth.png"
im = plt.imread(str(img))
ax.imshow(im, extent=[-180, 180, -90, 90])
# Plot ground track
for lons, lats in zip(longitudes, latitudes):
ax.plot(lons, lats, 'r-')
# Plot current location
ax.plot(lons[0], lats[0], 'bo')
# Plot location at epoch
# lon, lat = np.degrees(orb.copy(frame='ITRF', form='spherical')[1:3])
# ax.plot([lon], [lat], 'bo')
ax.set_xlim([-180, 180])
ax.set_ylim([-90, 90])
ax.grid(True, color='w', linestyle=":", alpha=0.4)
ax.set_xticks(range(-180, 181, 30))
ax.set_yticks(range(-90, 91, 30))
fig.tight_layout()
if "no-display" not in sys.argv:
plt.show()