Skip to content

Instantly share code, notes, and snippets.

@crm114
Created April 13, 2014 21:40
Show Gist options
  • Save crm114/10603490 to your computer and use it in GitHub Desktop.
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.
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