Created
April 13, 2014 21:40
-
-
Save crm114/10603490 to your computer and use it in GitHub Desktop.
SpaceApps Challenge 2014. Calculate ephemerides given a set of Earth coordinates (Latitude, Longitude), time and altitude. The API accepts TLE data for satellites and xephem data for space bodies.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from flask import Flask, jsonify, request | |
from datetime import tzinfo, timedelta, datetime | |
import json | |
import ephem | |
app = Flask(__name__) | |
@app.route("/spacebody") | |
def spacebody(): | |
ephem_line = str(request.args['xephem_line']) | |
space_object = ephem.readdb(ephem_line) | |
user = calculate_user(request) | |
rising_transit_setting = calculate_rising_transit_setting(user, space_object) | |
return jsonify(rising_transit_setting) | |
@app.route("/satellite") | |
def satellite(): | |
user = calculate_user(request) | |
space_object = calculate_tle(request) | |
try: | |
rising_transit_setting = calculate_passing(user, space_object) | |
except: | |
rising_transit_setting = calculate_rising_transit_setting(user, space_object) | |
return jsonify(rising_transit_setting) | |
def calculate_tle(request): | |
tle0 = request.args['tle0'] | |
tle1 = request.args['tle1'] | |
tle2 = request.args['tle2'] | |
space_object = ephem.readtle(str(tle0), str(tle1), str(tle2)) | |
print space_object | |
return space_object | |
def calculate_user(request): | |
user = ephem.Observer() | |
print user | |
lat = request.args['lat'] | |
print lat | |
print request.args.keys() | |
lon = request.args['lon'] | |
if 'date' in request.args.keys(): | |
date = dateatetime.utcfromtimestamp(int(request.args['date'])) | |
else: | |
date = datetime.datetime.now() | |
if 'elevation' in request.args.keys(): | |
elevation = float(request.args['elevation']) | |
else: | |
elevation = 0.0 | |
user.lat, user.lon, user.date, user.elevation = str(lat), str(lon), str(date), elevation | |
print user | |
return user | |
def calculate_rising_transit_setting(user, space_object): | |
space_object.compute(user) | |
previous_rising, pr_az, pr_alt = user.previous_rising(space_object), space_object.az, space_object.alt | |
next_rising, nr_az, nr_alt = user.next_rising(space_object), space_object.az, space_object.alt | |
previous_transit, pt_az, pt_alt = user.previous_transit(space_object), space_object.az, space_object.alt | |
next_transit, nt_az, nt_alt = user.next_transit(space_object), space_object.az, space_object.alt | |
previous_setting, ps_az, ps_alt = user.next_setting(space_object), space_object.az, space_object.alt | |
next_setting, ns_az, ns_alt = user.next_setting(space_object), space_object.az, space_object.alt | |
rising_transit_setting = { | |
'previous_rising': { 'date_time': previous_rising, 'az': pr_az, 'alt': pr_alt }, | |
'next_rising': { 'date_time': next_rising, 'az': nr_az, 'alt': nr_alt }, | |
'previous_transit': { 'date_time': previous_transit, 'az': pt_alt, 'alt': pt_az }, | |
'next_transit': {'date_time': next_transit, 'az': nt_az, 'alt': nt_alt}, | |
'previous_setting': { 'date_time': previous_setting,'az': ps_az, 'alt': ps_alt }, | |
'next_setting': { 'date_time': next_setting, 'az': ns_az, 'alt': ns_alt } | |
} | |
return rising_transit_setting | |
def calculate_passing(user, space_object): | |
space_object.compute(user) | |
print user | |
passing = user.next_pass(space_object) | |
print passing | |
passing_dict = { | |
'sublat': space_object.sublat, | |
'sublong': space_object.sublong, | |
'rise': { 'date_time': passing[0], 'az': passing[1] }, | |
'transit': {'date_time': passing[2], 'alt': passing[3] }, | |
'set': { 'date_time': passing[4], 'az': passing[5] } | |
} | |
return passing_dict | |
if __name__ == "__main__": | |
app.run(debug=True) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment