In [1]:
# Import necessary libraries
import ephem
import math
from datetime import datetime
#from time import strftime

In [2]:
# get_passes() function definition
# 

def get_passes(observer,tle,start_time,num_passes):

    obs_name, obs_lat, obs_lon, obs_alt = observer
    tle_line0, tle_line1, tle_line2 = tle
    start = ephem.date(start_time)

    # Set up location of observer
    ground_station = ephem.Observer()
    ground_station.name = obs_name
    ground_station.lon = obs_lon                  # in degrees (+E)
    ground_station.lat = obs_lat                  # in degrees (+N)
    ground_station.elevation = obs_alt            # in meters
    ground_station.date = start                   # in UTC (begin looking for next sat passes)

    # Read in most recent satellite TLE data
    sat = ephem.readtle(tle_line0, tle_line1,tle_line2)

    # Find all passes during duration
    i = 0
    pass_data = {}
    for i in range(num_passes):
        sat.compute(ground_station)                              # compute all body attributes for sat
        # next pass command yields array with [0]=rise time, [1]=rise azimuth, [2]=max alt time, [3]=max alt, [4]=set time, [5]=set azimuth
        info = ground_station.next_pass(sat)
        rise_time, rise_az, max_alt_time, max_alt, set_time, set_az = info
        deg_per_rad = 180.0/math.pi                              # use to display azimuth in degrees
        pass_duration = (set_time-rise_time)                     # (set time - rise time) --> fraction of a day

        if set_time > rise_time:                                 # only update if the set time is greater than the rise time
            ground_station.date = set_time                       # new observer date & time = previous set time

        pass_data[i] = [rise_time, set_time, pass_duration, (rise_az*deg_per_rad), (set_az*deg_per_rad)]
        #i = i + 1
        ground_station.date = ground_station.date + ephem.minute # increase time by 1 min and look for next pass
    return pass_data

In [3]:
from datetime import date, datetime
now = ephem.date('2017/5/30 12:00:00')
print(ephem.date(now))
print(now.tuple())
print(now)
print('%.6f' % now)
print(now + ephem.hour)
print(ephem.date(now + ephem.hour))


2017/5/30 12:00:00
(2017, 5, 30, 12, 0, 0.0)
2017/5/30 12:00:00
42884.000000
42884.041666666664
2017/5/30 13:00:00

In [4]:
vu = ['Valparaiso University', '41.4639', '-87.0439', 245.089]
tle = ['ISS', '1 25544U 98067A   17144.56334412  .00016717  00000-0  10270-3 0  9002', '2 25544  51.6383 156.0737 0005162 190.1606 169.9443 15.53944016 18074']
start_time = '2017/5/30 12:00:00'
num_passes = 20

pass_data = get_passes(vu,tle,start_time,num_passes)

for i in range(num_passes):
    print(pass_data[i])
#print(pass_data)


[42884.434691182, 42884.43991920763, 0.005228025627729949, 169.3898798692318, 82.07670985969658]
[42884.50003979661, 42884.5076599303, 0.007620133692398667, 224.0069548124835, 57.50470133941467]
[42884.5673264383, 42884.57464997139, 0.00732353309285827, 265.9121597857494, 51.11262782352322]
[42884.635205144965, 42884.64197067463, 0.00676552966615418, 296.4929111151341, 60.73552425080327]
[42884.70261850134, 42884.709823333724, 0.007204832385468762, 308.6423969692394, 89.18613765354696]
[42884.76961509613, 42884.77724968808, 0.007634591951500624, 304.12212313501163, 130.06104957165144]
[42884.83714153454, 42884.84296395175, 0.005822417209856212, 282.9471979908948, 182.04994968455227]
[42885.40006615611, 42885.402609394936, 0.0025432388283661567, 141.46799824032797, 101.89370460435568]
[42885.46403380888, 42885.47138834576, 0.00735453687957488, 209.8578764373436, 62.207921790561265]
[42885.53090961274, 42885.53843875804, 0.007529145303124096, 254.34143684115426, 51.54580183578001]
[42885.598744455754, 42885.60559309455, 0.006848638797237072, 289.10873896192, 55.89650597857849]
[42885.666350173495, 42885.67334304691, 0.006992873415583745, 307.0160196448327, 79.04153771708299]
[42885.733401703015, 42885.74102798578, 0.007626282764249481, 306.9374178278642, 117.04261339095873]
[42885.800608924, 42885.80741434049, 0.006805416487623006, 291.83351998789146, 164.53521363361853]
[42886.42821978558, 42886.43501324355, 0.006793457971070893, 194.44675668850374, 68.62931730855958]
[42886.494570947514, 42886.502230695725, 0.007659748211153783, 242.0061698416246, 53.2315061833175]
[42886.56224794223, 42886.56926925032, 0.007021308090770617, 280.1674749232397, 52.796474359606464]
[42886.630017238334, 42886.63685127267, 0.006834034335042816, 303.7631283922358, 70.21938534733854]
[42886.697189198305, 42886.704683630574, 0.007494432269595563, 308.5312014895516, 104.72968794020419]
[42886.76423687122, 42886.771584902, 0.007348030783759896, 298.1567451969492, 149.1595289061927]

In [6]:
# get_passes() function prior to 6/6/17


# get_passes() function
# This function will take in a 3 element list of observer data containing [name,latitude,longitude,altitude],
# a 3 element list of satellite TLE data, a start time formatted as an ephem date, and a desired number of passes to find
# EX: vu = ['Valparaiso University', '41.4639', '-87.0439', 245.089]
#     tle = ['ISS', '1 25544U 98067A   17144.56334412  .00016717  00000-0  10270-3 0  9002', '2 25544  51.6383 156.0737 0005162 190.1606 169.9443 15.53944016 18074']
#     start_time = '2017/5/30 12:00:00'
#     num_passes = 20
# This function will return a list called pass_data with number of elements = num_passes.
# Each element in pass_data is a 5-element list containing:
#    rise_time (ephem date), set_time (ephem date), pass_duration (as fraction of a day), rise_az (in deg), set_az (in deg)
# for each pass.

# Import necessary libraries
import ephem
import math
from datetime import datetime

# get_passes() function definition
def get_passes(observer,tle,start_time,num_passes):
    """lkjhgkjhgjkghkjhg"""

    obs_name, obs_lat, obs_lon, obs_alt = observer
    tle_line0, tle_line1, tle_line2 = tle
    start = ephem.date(start_time)

    # Set up location of observer
    ground_station = ephem.Observer()
    ground_station.name = obs_name                                           # name string
    ground_station.lon = obs_lon                                             # in degrees (+E)
    ground_station.lat = obs_lat                                             # in degrees (+N)
    ground_station.elevation = obs_alt                                       # in meters
    ground_station.date = start                                              # in UTC (begin looking for next sat passes at this time)

    # Read in most recent satellite TLE data
    sat = ephem.readtle(tle_line0, tle_line1,tle_line2)

    # Find all passes during duration
    i = 0
    pass_data = {}
    for i in range(num_passes):
        sat.compute(ground_station)                                          # compute all body attributes for sat
        # next pass command yields array with [0]=rise time, [1]=rise azimuth, [2]=max alt time, [3]=max alt, [4]=set time, [5]=set azimuth
        info = ground_station.next_pass(sat)
        rise_time, rise_az, max_alt_time, max_alt, set_time, set_az = info
        deg_per_rad = 180.0/math.pi                                          # use to display azimuth in degrees
        pass_duration = (set_time-rise_time)                                 # (set time - rise time) --> fraction of a day

        if set_time > rise_time:                                             # only update if the set time is greater than the rise time
            ground_station.date = set_time                                   # new observer date & time = previous set time

        pass_data[i] = [rise_time, set_time, pass_duration, (rise_az*deg_per_rad), (set_az*deg_per_rad)]

        ground_station.date = ground_station.date + ephem.minute             # increase time by 1 min and look for next pass
    return pass_data                                                         # return list of 5-element pass predictions

In [24]:
start_time = '2017/5/30 12:00:00'
start = ephem.date(start_time)
duration = 12.55
print(start)
print(ephem.date(start+duration*ephem.hour))


2017/5/30 12:00:00
2017/5/31 00:33:00

In [44]:
# 6/6/17 get_passes() edits

# Import necessary libraries
import ephem
import math
from datetime import datetime

# get_passes() function definition
def get_passes_two(observer,tle,start_time,num_passes=None,duration=None):
    """Configure observer and satellite, Return pass data for all passes in given interval.
    
    Arguments:
    observer -- 4 element list containing desired [name,lat,lon,alt]
    tle -- 3 element list containing desired tle [line0,line1,line2]
    start_time -- ephem.date string formatted 'yyyy/mm/dd hr:min:sec'
    num_passes -- integer number of desired passes (defualt None)
    duration -- float number of hours or fraction of hours (default None)
    
    Specify either num_passes or duration.
    If both, use num_passes.
    If neither, find passes for next 24 hours.
    """
    
    obs_name, obs_lat, obs_lon, obs_alt = observer
    tle_line0, tle_line1, tle_line2 = tle
    
    # Set up location of observer
    ground_station = ephem.Observer()
    ground_station.name = obs_name                                           # name string
    ground_station.lon = obs_lon                                             # in degrees (+E)
    ground_station.lat = obs_lat                                             # in degrees (+N)
    ground_station.elevation = obs_alt                                       # in meters
    ground_station.date = ephem.date(start_time)                             # in UTC (begin looking for next sat passes at this time)

    # Read in most recent satellite TLE data
    sat = ephem.readtle(tle_line0, tle_line1,tle_line2)
    
    pass_data = {}
    i=0
    
    if num_passes!=None and duration==None:
        # if only num_passes specified
        for i in range(num_passes):
            sat.compute(ground_station)                                          # compute all body attributes for sat
            # next pass command yields array with [0]=rise time, [1]=rise azimuth, [2]=max alt time, [3]=max alt, [4]=set time, [5]=set azimuth
            info = ground_station.next_pass(sat)
            rise_time, rise_az, max_alt_time, max_alt, set_time, set_az = info
            deg_per_rad = 180.0/math.pi                                          # use to display azimuth in degrees
            pass_duration = (set_time-rise_time)                                 # (set time - rise time) --> fraction of a day

            if set_time > rise_time:                                             # only update if the set time is greater than the rise time
                ground_station.date = set_time                                   # new observer date & time = previous set time

            pass_data[i] = [rise_time, set_time, pass_duration, (rise_az*deg_per_rad), (set_az*deg_per_rad)]

            ground_station.date = ground_station.date + ephem.minute             # increase time by 1 min and look for next pass
        return pass_data
    if num_passes==None and duration!=None:
        # if only duration specified
        end_time = ephem.date(ground_station.date+duration*ephem.hour)
        while (ground_station.date <= end_time):
            sat.compute(ground_station)                                          # compute all body attributes for sat
            # next pass command yields array with [0]=rise time, [1]=rise azimuth, [2]=max alt time, [3]=max alt, [4]=set time, [5]=set azimuth
            info = ground_station.next_pass(sat)
            rise_time, rise_az, max_alt_time, max_alt, set_time, set_az = info
            deg_per_rad = 180.0/math.pi                                          # use to display azimuth in degrees
            pass_duration = (set_time-rise_time)                                 # (set time - rise time) --> fraction of a day

            if set_time > rise_time:                                             # only update if the set time is greater than the rise time
                ground_station.date = set_time                                   # new observer date & time = previous set time

            pass_data[i] = [rise_time, set_time, pass_duration, (rise_az*deg_per_rad), (set_az*deg_per_rad)]

            i=i+1
            ground_station.date = ground_station.date + ephem.minute             # increase time by 1 min and look for next pass
        return pass_data
    if num_passes!=None and duration!=None:
        # if both are specified, use num_passes
        for i in range(num_passes):
            sat.compute(ground_station)                                          # compute all body attributes for sat
            # next pass command yields array with [0]=rise time, [1]=rise azimuth, [2]=max alt time, [3]=max alt, [4]=set time, [5]=set azimuth
            info = ground_station.next_pass(sat)
            rise_time, rise_az, max_alt_time, max_alt, set_time, set_az = info
            deg_per_rad = 180.0/math.pi                                          # use to display azimuth in degrees
            pass_duration = (set_time-rise_time)                                 # (set time - rise time) --> fraction of a day

            if set_time > rise_time:                                             # only update if the set time is greater than the rise time
                ground_station.date = set_time                                   # new observer date & time = previous set time

            pass_data[i] = [rise_time, set_time, pass_duration, (rise_az*deg_per_rad), (set_az*deg_per_rad)]

            ground_station.date = ground_station.date + ephem.minute             # increase time by 1 min and look for next pass
        return pass_data
    if num_passes==None and duration==None:
        # if neither are specified, get passes for the next 24 hours
        end_time = ephem.date(ground_station.date+1)
        while (ground_station.date <= end_time):
            sat.compute(ground_station)                                          # compute all body attributes for sat
            # next pass command yields array with [0]=rise time, [1]=rise azimuth, [2]=max alt time, [3]=max alt, [4]=set time, [5]=set azimuth
            info = ground_station.next_pass(sat)
            rise_time, rise_az, max_alt_time, max_alt, set_time, set_az = info
            deg_per_rad = 180.0/math.pi                                          # use to display azimuth in degrees
            pass_duration = (set_time-rise_time)                                 # (set time - rise time) --> fraction of a day

            if set_time > rise_time:                                             # only update if the set time is greater than the rise time
                ground_station.date = set_time                                   # new observer date & time = previous set time

            pass_data[i] = [rise_time, set_time, pass_duration, (rise_az*deg_per_rad), (set_az*deg_per_rad)]

            i=i+1
            ground_station.date = ground_station.date + ephem.minute             # increase time by 1 min and look for next pass
        return pass_data

In [45]:
vu = ['Valparaiso University', '41.4639', '-87.0439', 245.089]
tle = ['ISS', '1 25544U 98067A   17144.56334412  .00016717  00000-0  10270-3 0  9002', '2 25544  51.6383 156.0737 0005162 190.1606 169.9443 15.53944016 18074']
start_time = '2017/5/30 12:00:00'
num_passes = 20
duration = 10.5

pass_data = get_passes_two(vu,tle,start_time,num_passes=None,duration=None)
    
print(pass_data)


{0: [42884.434691182, 42884.43991920763, 0.005228025627729949, 169.3898798692318, 82.07670985969658], 1: [42884.50003979661, 42884.5076599303, 0.007620133692398667, 224.0069548124835, 57.50470133941467], 2: [42884.5673264383, 42884.57464997139, 0.00732353309285827, 265.9121597857494, 51.11262782352322], 3: [42884.635205144965, 42884.64197067463, 0.00676552966615418, 296.4929111151341, 60.73552425080327], 4: [42884.70261850134, 42884.709823333724, 0.007204832385468762, 308.6423969692394, 89.18613765354696], 5: [42884.76961509613, 42884.77724968808, 0.007634591951500624, 304.12212313501163, 130.06104957165144], 6: [42884.83714153454, 42884.84296395175, 0.005822417209856212, 282.9471979908948, 182.04994968455227], 7: [42885.40006615611, 42885.402609394936, 0.0025432388283661567, 141.46799824032797, 101.89370460435568]}

In [46]:
get_passes_two?


Help on function get_passes_two in module __main__:

get_passes_two(observer, tle, start_time, num_passes=None, duration=None)
    Configure observer and satellite, Return pass data for all passes in given interval.
    
    Arguments:
    observer -- 4 element list containing desired [name,lat,lon,alt]
    tle -- 3 element list containing desired tle [line0,line1,line2]
    start_time -- ephem.date string formatted 'yyyy/mm/dd hr:min:sec'
    num_passes -- integer number of desired passes (defualt None)
    duration -- float number of hours or fraction of hours (default None)
    
    Specify either num_passes or duration.
    If both, use num_passes.
    If neither, find passes for next 24 hours.