This is the simulation for tracking satelite using the API from NASA. It converts TLE (Two line element) data from satellite to latitude and longitude project of orbits into the earth.
Please run plotter-main.py and install required dependencies

| [ | |
| { | |
| "@id": "https://data.ivanstanojevic.me/api/tle/25544", | |
| "@type": "TleModel", | |
| "satelliteId": 25544, | |
| "name": "ISS (ZARYA)", | |
| "date": "2019-10-19T17:06:18+00:00", | |
| "line1": "1 25544U 98067A 19292.71270833 .00000078 00000-0 93604-5 0 9996", | |
| "line2": "2 25544 51.6434 103.7961 0007043 164.9912 17.5733 15.50203574194572", | |
| "line_color": "coral", | |
| "marker_color": "green", | |
| "title": "ISS" | |
| }, | |
| { | |
| "@id": "https://data.ivanstanojevic.me/api/tle/44329", | |
| "@type": "TleModel", | |
| "satelliteId": 44329, | |
| "name": "RAAVANA-1", | |
| "date": "2019-10-18T11:49:54+00:00", | |
| "line1": "1 44329U 98067QE 19291.49299144 .00008243 00000-0 13481-3 0 9993", | |
| "line2": "2 44329 51.6395 108.0382 0007374 173.2880 186.8211 15.53444264 19189", | |
| "line_color": "blue", | |
| "marker_color": "red", | |
| "title": "NepaliSat-1" | |
| } | |
| ] |
| importrequests | |
| importtime | |
| defget_page(page_no=1): | |
| print('Processing page %d'%page_no) | |
| response=requests.get("https://data.ivanstanojevic.me/api/tle?page=%d"%page_no).json() | |
| returnresponse['member'] | |
| defget_last_page(): | |
| response=requests.get("https://data.ivanstanojevic.me/api/tle").json() | |
| last_link=response['view']['last'] | |
| returnint(last_link.split('=')[1].strip()) | |
| out=open('out.csv','a') | |
| dict= [] | |
| forpage_numberinrange(6,100): | |
| data=get_page(page_no=page_number) | |
| formemberindata: | |
| id=member['@id'] | |
| type=member['@type'] | |
| satelliteId=member['satelliteId'] | |
| name=member['name'] | |
| date=member['date'] | |
| line1=member['line1'] | |
| line2=member['line2'] | |
| wr='%s,%s,%d,%s,%s,%s,%s\n'% (id,type,satelliteId,name,date,line1,line2) | |
| out.write(wr) | |
| time.sleep(5) | |
| out.close() | |
| importrequests | |
| importephem | |
| fromthreadingimportThread | |
| members= [] | |
| defget_page(page_no=1): | |
| print('Processing page %d'%page_no) | |
| response=requests.get("https://data.ivanstanojevic.me/api/tle?page=%d"%page_no).json() | |
| returnresponse['member'] | |
| defget_last_page(): | |
| response=requests.get("https://data.ivanstanojevic.me/api/tle").json() | |
| last_link=response['view']['last'] | |
| returnint(last_link.split('=')[1].strip()) | |
| defasyncLoadData(*page_numbers): | |
| forpage_numberinpage_numbers: | |
| data=get_page(page_number) | |
| data_for_page[page_number-1] =data | |
| last_page_number=get_last_page() | |
| data_for_page= [None] *last_page_number | |
| page_numbers=list(range(1, last_page_number+1)) | |
| no_of_threads=20 | |
| pages_per_thread=len(page_numbers) //no_of_threads | |
| page_number_chunks= [page_numbers[page_number:page_number+pages_per_thread] forpage_numberin | |
| range(0, len(page_numbers), pages_per_thread)] | |
| threads= [] | |
| forpage_number_chunkinpage_number_chunks: | |
| thread=Thread(target=asyncLoadData,args=page_number_chunk) | |
| thread.start() | |
| threads.append(thread) | |
| forthreadinthreads: | |
| thread.join() | |
| members= [] | |
| forpage_numberinrange(1,last_page_number+1): | |
| data=data_for_page[page_number-1] | |
| ifdataisNone: | |
| continue | |
| formemberindata: | |
| members.append(member) | |
| print(members) | |
| importephem | |
| importdatetime | |
| importmath | |
| importjson | |
| importmatplotlib.pyplotasplt | |
| frommpl_toolkits.basemapimportBasemap | |
| m=Basemap( | |
| projection='mill', | |
| resolution='h', | |
| area_thresh=10000.,) | |
| my_loc= [85,27] | |
| deffind_dist(lat1,lon1,lat2,lon2): | |
| frommathimportsin, cos, sqrt, atan2, radians | |
| R=6373.0 | |
| dlon=lon2-lon1 | |
| dlat=lat2-lat1 | |
| a=sin(dlat/2) **2+cos(lat1) *cos(lat2) *sin(dlon/2) **2 | |
| c=2*atan2(sqrt(a), sqrt(1-a)) | |
| distance=R*c | |
| returndistance | |
| defplot_sat(sat): | |
| name=sat['name'] | |
| line1=sat['line1'] | |
| line2=sat['line2'] | |
| tle_rec=ephem.readtle(name, line1, line2) | |
| print(name, line1,line2) | |
| now=datetime.datetime.utcnow() | |
| lats= [] | |
| lons= [] | |
| dates= [] | |
| foriinrange(0, 100): | |
| date=now+datetime.timedelta(seconds=i*10) | |
| tle_rec.compute(date) | |
| lat, lon=tle_rec.sublong*180.0/math.pi, tle_rec.sublat*180.0/math.pi | |
| lats.append(lat) | |
| lons.append(lon) | |
| dates.append(date) | |
| foriinrange(50, len(dates)): | |
| plt.cla() | |
| m.drawcoastlines() | |
| m.drawcountries() | |
| m.drawstates() | |
| m.drawmapboundary(fill_color='#46bcec') | |
| m.fillcontinents(color='#acd3ac', lake_color='#acdbfd') | |
| m.nightshade(dates[i]) | |
| x, y=m(lons,lats) | |
| m.plot(x, y, marker='', color='red', linewidth=1) | |
| print(x,y) | |
| x, y=m(lons[i], lats[i]) | |
| print(lons[i], lats[i]) | |
| m.plot(x, y, marker='o', color='blue', zorder=5, linewidth=5) | |
| print(x,y) | |
| # plt.title( "test") | |
| plt.pause(0.5) | |
| defplot_sats(sats): | |
| dates= [] | |
| now=datetime.datetime.utcnow() | |
| seconds=500 | |
| foriinrange(0, seconds): | |
| date=now+datetime.timedelta(seconds=i*10) | |
| dates.append(date) | |
| sat_latlngs= [] | |
| foriinrange(len(sats)): | |
| name=sats[i]['name'] | |
| line1=sats[i]['line1'] | |
| line2=sats[i]['line2'] | |
| tle_rec=ephem.readtle(name, line1, line2) | |
| print(name, line1,line2) | |
| lats= [] | |
| lons= [] | |
| forjinrange(len(dates)): | |
| tle_rec.compute(dates[j]) | |
| lat, lon=tle_rec.sublong*180.0/math.pi, tle_rec.sublat*180.0/math.pi | |
| lats.append(lat) | |
| lons.append(lon) | |
| sat_latlngs.append([lats,lons]) | |
| foriinrange(0, len(dates)): | |
| plt.cla() | |
| m.drawcoastlines() | |
| m.drawcountries() | |
| m.drawstates() | |
| m.drawmapboundary(fill_color='#46bcec') | |
| m.fillcontinents(color='#acd3ac', lake_color='#acdbfd') | |
| m.nightshade(dates[i]) | |
| x, y=m(my_loc[0],my_loc[1]) | |
| m.plot(x,y,marker='o',color='green', linewidth=5) | |
| forjinrange(len(sats)): | |
| latlngs=sat_latlngs[j] | |
| lats=latlngs[0] | |
| lons=latlngs[1] | |
| x, y=m(lats,lons) | |
| m.plot( x,y, marker='', color=sats[j]['line_color'], linewidth=1) | |
| x, y=m(lats[i], lons[i]) | |
| m.plot(x, y,marker='^', color=sats[j]['marker_color'], zorder=5) | |
| print(x,y) | |
| plt.text(x,y,sats[j]['title'], color='white') | |
| # plt.title("Distance between you and NepalSat-1 is %d" % (find_dist(my_loc[1],my_loc[0],lats[i],lons[i]))) | |
| print(lons[i],lats[i]) | |
| plt.pause(0.5) | |
| c=open('data.json', 'r') | |
| sats=json.load(c) | |
| plot_sats(sats) | |
| # for sat in sats: | |
| # plot_sat(sat) |