summaryrefslogtreecommitdiff
path: root/iss/predictions.py
blob: 7febe622dbe0b7e5f06c0d2f1846c7a5bd692bb6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
from skyfield.api import Topos, load


class Predictions(object):
    ISS = "ISS (ZARYA)"

    def __init__(self, lat, lng, altitude=30.0, tz="UTC", satellite=ISS):
        self.lat = lat
        self.lng = lng
        self.altitude = altitude
        self.tz = tz
        self.satellite = satellite

    def init_stations(self):
        stations_url = "http://celestrak.com/NORAD/elements/stations.txt"
        return load.tle_file(stations_url)

    def get_next_days(self, days=10):
        ts = load.timescale()
        t0 = ts.now()
        t1 = ts.ut1_jd(t0.ut1 + days)
        return t0, t1

    def get_location(self):
        return Topos(latitude_degrees=self.lat, longitude_degrees=self.lng)

    def get_satellite(self):
        satellites = self.init_stations()
        by_name = {sat.name: sat for sat in satellites}
        return by_name[self.satellite]

    def get_predictions(self):
        satellite = self.get_satellite()
        t0, t1 = self.get_next_days(days=10)
        location = self.get_location()

        t, events = satellite.find_events(
            location, t0, t1, altitude_degrees=self.altitude
        )

        for ti, event in zip(t, events):
            name = ("rise above 30°", "culminate", "set below 30°")[event]
            print(ti.utc_strftime("%Y %b %d %H:%M:%S"), name)