from mpl_toolkits.basemap import Basemap
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime
from datetime import timedelta

# if not working, try sudo apt-get install python-mpl_toolkits.basemap


################################## example 1 ##################################
# simple plot of the world

fig=plt.figure()
ax=fig.add_axes([0.1,0.1,0.8,0.8])
m = Basemap(llcrnrlon=-180.,llcrnrlat=-90.,urcrnrlon=180.,urcrnrlat=90.,\
            rsphere=(6378137.00,6356752.3142),\
            resolution='l',projection='cyl',\
            lat_0=0.,lon_0=-00.,lat_ts=0.)


# nice orange/blue map
#m.drawmapboundary(fill_color='aqua')
#m.fillcontinents(color="coral",lake_color="aqua")

m.drawcoastlines()
#m.drawcountries()
#m.nightshade(datetime(2000,1,1,12))

#m.bluemarble()
#m.etopo()
#m.shadedrelief()
m.drawparallels(np.arange(-90,90,30),labels=[1,1,0,1])
m.drawmeridians(np.arange(-180,180,60),labels=[1,1,0,1])
#plt.show()



################################## example 2 ##################################
# plots europa, marks kiel and shows current nightshade

plt.figure()
kiellat=54.325278
kiellon=10.8140556
m = Basemap(llcrnrlon=-20.,llcrnrlat=35.,urcrnrlon=40.,urcrnrlat=75.,\
            rsphere=(6378137.00,6356752.3142),\
            resolution='l',projection='cyl',\
            lat_0=0.,lon_0=-00.,lat_ts=0.)
m.bluemarble()
m.nightshade(datetime.utcnow(),delta=0.1,alpha=0.3)
plt.title("UTC: %s\n local: %s" %(datetime.utcnow().strftime("%Y-%m-%d %H:%M"),datetime.now().strftime("%Y-%m-%d %H:%M")))
plt.plot(kiellon,kiellat,"ro",ms=5)
plt.text(kiellon+1,kiellat+0.6,"Kiel", color="r")
#plt.show()

################################## example 3 ##################################
# plots current ISS position and previous orbits
import requests
import urllib
import ephem
plt.figure()
m = Basemap(llcrnrlon=-180.,llcrnrlat=-90.,urcrnrlon=180.,urcrnrlat=90.,\
            rsphere=(6378137.00,6356752.3142),\
            resolution='l',projection='cyl',\
            lat_0=0.,lon_0=-00.,lat_ts=0.)
m.shadedrelief()

url="http://spaceflight.nasa.gov/realdata/sightings/SSapplications/Post/JavaSSOP/orbit/ISS/SVPOST.html"
f=urllib.urlopen(url)

def make_float_degree(tlelonlat):
  return np.sign(float(str(tlelonlat).split(":")[0]))*(abs(float(str(tlelonlat).split(":")[0]))+float(str(tlelonlat).split(":")[1])/60.+float(str(tlelonlat).split(":")[2])/3600.)

def lons_lats(secsbeforestart,secsbeforeend=0):
  lons,lats=[],[]
  for q in range(secsbeforeend,secsbeforestart):
    tle_rec.compute(datetime.utcnow()-timedelta(seconds=q))
    lon,lat= tle_rec.sublong, tle_rec.sublat
    lon,lat= make_float_degree(lon),make_float_degree(lat)
    lons.append(lon)
    lats.append(lat)
  return lons,lats

for line in f:
  if "TWO LINE" in line: 
    #print "!!!!\n",line,f.readline(),f.readline(),f.readline(),"\n!!!!\n"
    f.readline()  #empty
    if "ISS" in f.readline():  #should read ISS
      l1= f.readline()      
      l2= f.readline()
      tle_rec = ephem.readtle("ISS", l1, l2)
      lons,lats=lons_lats(4*60*6*10,3*60*6*10)
      plt.plot(lons,lats,".",color="orange",zorder=5,rasterized=True)
      lons,lats=lons_lats(3*60*6*10,2*60*6*10)
      plt.plot(lons,lats,"m.",zorder=5,rasterized=True)
      lons,lats=lons_lats(2*60*6*10,60*6*10)
      plt.plot(lons,lats,"g.",zorder=5,rasterized=True)
      lons,lats=lons_lats(60*6*10)
      plt.plot(lons,lats,"b.",zorder=5,rasterized=True)
      plt.plot(lons[0],lats[0],"ro",zorder=10,ms=10)
      plt.title("Last 4 hours of ISS orbit - current position: %2.2f lon., %2.2f lat." %(lons[0],lats[0]))
      break #we only want first entry
m.nightshade(datetime.utcnow(),alpha=0.3)
plt.show()

