Merge lp:~jlcanales-gasco/stellarium/satellite-plugin into lp:stellarium

Proposed by J.L. Canales
Status: Superseded
Proposed branch: lp:~jlcanales-gasco/stellarium/satellite-plugin
Merge into: lp:stellarium
Diff against target: 12207 lines (+7211/-3735)
44 files modified
doc/builtinScriptFunctions.doxygen (+37/-0)
doc/scripting.doxygen (+8/-1)
plugins/Satellites/satellites.json (+1116/-909)
plugins/Satellites/src/CMakeLists.txt (+26/-8)
plugins/Satellites/src/Satellite.cpp (+208/-36)
plugins/Satellites/src/Satellite.hpp (+43/-3)
plugins/Satellites/src/Satellites.hpp (+1/-1)
plugins/Satellites/src/gsatellite/gException.hpp (+44/-0)
plugins/Satellites/src/gsatellite/gMatrix.cpp (+290/-0)
plugins/Satellites/src/gsatellite/gMatrix.hpp (+86/-0)
plugins/Satellites/src/gsatellite/gMatrixTempl.hpp (+117/-0)
plugins/Satellites/src/gsatellite/gObserver.cpp (+88/-0)
plugins/Satellites/src/gsatellite/gObserver.hpp (+114/-0)
plugins/Satellites/src/gsatellite/gSatTEME.cpp (+156/-0)
plugins/Satellites/src/gsatellite/gSatTEME.hpp (+128/-0)
plugins/Satellites/src/gsatellite/gTime.cpp (+347/-0)
plugins/Satellites/src/gsatellite/gTime.hpp (+329/-0)
plugins/Satellites/src/gsatellite/gTimeSpan.cpp (+217/-0)
plugins/Satellites/src/gsatellite/gVector.cpp (+105/-0)
plugins/Satellites/src/gsatellite/gVector.hpp (+78/-0)
plugins/Satellites/src/gsatellite/gVectorTempl.hpp (+107/-0)
plugins/Satellites/src/gsatellite/mathUtils.cpp (+63/-0)
plugins/Satellites/src/gsatellite/mathUtils.hpp (+42/-0)
plugins/Satellites/src/gsatellite/sgp4ext.cpp (+724/-0)
plugins/Satellites/src/gsatellite/sgp4ext.h (+97/-0)
plugins/Satellites/src/gsatellite/sgp4io.cpp (+261/-0)
plugins/Satellites/src/gsatellite/sgp4io.h (+46/-0)
plugins/Satellites/src/gsatellite/sgp4unit.cpp (+2113/-0)
plugins/Satellites/src/gsatellite/sgp4unit.h (+126/-0)
plugins/Satellites/src/gsatellite/stdsat.h (+35/-0)
plugins/Satellites/src/gui/SatellitesDialog.cpp (+11/-0)
plugins/Satellites/src/gui/SatellitesDialog.hpp (+1/-0)
plugins/Satellites/src/gui/satellitesDialog.ui (+10/-2)
plugins/Satellites/src/sgp4sdp4/1_COPYING (+0/-25)
plugins/Satellites/src/sgp4sdp4/2_README (+0/-167)
plugins/Satellites/src/sgp4sdp4/README (+0/-7)
plugins/Satellites/src/sgp4sdp4/sgp4sdp4.c (+0/-1072)
plugins/Satellites/src/sgp4sdp4/sgp4sdp4.h (+0/-237)
plugins/Satellites/src/sgp4sdp4/sgp_in.c (+0/-251)
plugins/Satellites/src/sgp4sdp4/sgp_math.c (+0/-286)
plugins/Satellites/src/sgp4sdp4/sgp_obs.c (+0/-214)
plugins/Satellites/src/sgp4sdp4/sgp_time.c (+0/-428)
plugins/Satellites/src/sgp4sdp4/solar.c (+0/-69)
util/refactor.pl (+37/-19)
To merge this branch: bzr merge lp:~jlcanales-gasco/stellarium/satellite-plugin
Reviewer Review Type Date Requested Status
J.L. Canales (community) Needs Resubmitting
Bogdan Marinov Needs Fixing
Review via email: mp+38067@code.launchpad.net

This proposal has been superseded by a proposal from 2010-10-30.

Description of the change

SGP4/SDP4 core refactored to use the revised Spacetrack report N#3 (including Spacetrack report N#6). There is an inform about all the improvements in the next URL: http://www.celestrak.com/publications/AIAA/2006-6753

Main advantages of this code are:
       - Better performance. The main computation process and the Kepler Equation resolution has been optimized.
       - More precision. Some instabilities in the kepler equation and the integrals problems has been resolved too.
       - Easy to use. I have wrapped the new SGP4/SDP4 code with an object oriented interface that aisle the Satellite class methods from the complexity of the SGP4/SDP4 functions.

Satellite sky-path drawing
  This is a functionality asked by some friends that take CCD Astronomical photographs and needs to predict if a satellite cross the photographed field. This feature can be activated changing a flag (draworb) in the satellites.json file (similar as the visible flag).

This code has been tested in Ubuntu 10.04 LTS

To post a comment you must log in.
Revision history for this message
Bogdan Marinov (daggerstab) wrote :

I skimmed the code and I immediately saw a problem that needs to be fixed before proceeding with a merge.

It seems that you've used an old version of the source as the base for your modifications. As a result, they overwrite the changes I made to fix bug #616627:
https://bugs.launchpad.net/stellarium/+bug/616627

Here are the relevant revisions:
http://bazaar.launchpad.net/~stellarium/stellarium/trunk/revision/4756
http://bazaar.launchpad.net/~stellarium/stellarium/trunk/revision/4757 (this is just an update of the TLEs)
http://bazaar.launchpad.net/~stellarium/stellarium/trunk/revision/4758

The links are for information only, just use the most recent code.

After you merge, you can update the TLEs again, just make sure that no satellites have been dropped off the lists at celestrak.com or renamed (again :(). My patch provides a log message that reports how many satellites have been updated out of the total number.

review: Needs Fixing
4766. By J.L. Canales

Bogdan Marinov review notes fixed. Code base actualized to Rev. N 4766

4767. By J.L. Canales

Fixed. Draw satellite skypath configuration desapear after TLE update

4768. By J.L. Canales

Satellite plugin: TLE data actualized

Revision history for this message
J.L. Canales (jlcanales-gasco) wrote :

Hi Bodgan,
   I have fixed the problems with the base version. Now the source code is based in the Rev. No. 4766.
   Additionaly, I have updated the satellite TLE data.

Regards,

review: Needs Resubmitting
Revision history for this message
Matthew Gates (matthew-porpoisehead) wrote :

I did a local merge of your code. It built and ran fine. Thank you
very much for your work - it looks very interesting.

Some comments:

1. Apart from the effort required, is there is good reason not recode
to use Stellarium's existing matrix classes instead of having another
set of matrix code?

2. The code formatting should be brought into conformity with the rest
of Stellarium's code. This includes indentation, variable names,
header #ifndef flags. The recode.pl script and astyle program make
this pretty quick to do.

3a. I would like to see the orbit lines fading in and out rather than
abruptly ending (progressively drop the alpha for the segments towards
the ends of the orbit lines).

3b. Orbit lines should be taken from the color in the satellites.json
file (I think they are all the same blue color at the moment?)

4. You wouldn't happen to have a method to determine the brightness of
a satellite would you (shadow & apparent magnitude when not is
shadow)? I imagine this would require some sort of size and/or albedo
data to be added to the satellites.json. If you have some code for
predicting Iridium flares that would be really amazing!

Matthew

On 9 October 2010 14:39, J.L. Canales <email address hidden> wrote:
> J.L. Canales has proposed merging lp:~jlcanales-gasco/stellarium/satellite-plugin into lp:stellarium.
>
> Requested reviews:
>  Stellarium (stellarium)
>
>
> SGP4/SDP4 core refactored to use the revised Spacetrack report N#3 (including Spacetrack report N#6). There is an inform about all the improvements in the next URL: http://www.celestrak.com/publications/AIAA/2006-6753
>
> Main advantages of this code are:
>       - Better performance. The main computation process and the Kepler Equation resolution has been optimized.
>       - More precision. Some instabilities in the kepler equation and the integrals problems has been resolved too.
>       - Easy to use. I have wrapped the new SGP4/SDP4 code with an object oriented interface that aisle the Satellite class methods from the complexity of the SGP4/SDP4 functions.
>
> Satellite sky-path drawing
>  This is a functionality asked by some friends that take CCD Astronomical photographs and needs to predict if a satellite cross the photographed field. This feature can be activated changing a flag (draworb) in the satellites.json file (similar as the visible flag).
>
> This code has been tested in Ubuntu 10.04 LTS
> --
> https://code.launchpad.net/~jlcanales-gasco/stellarium/satellite-plugin/+merge/38067
> Your team Stellarium is requested to review the proposed merge of lp:~jlcanales-gasco/stellarium/satellite-plugin into lp:stellarium.

Revision history for this message
J.L. Canales (jlcanales-gasco) wrote :

Hi Matthew,
   Thank you for your comments, I will answer your questions.
>
> 1. Apart from the effort required, is there is good reason not recode
> to use Stellarium's existing matrix classes instead of having another
> set of matrix code?

   I use this classes because I am reusing code from other of my projects originally based on
stl library. There aren't any technical reason, so it can be refactored using Stellarium's and QT's classes.

>
> 2. The code formatting should be brought into conformity with the rest
> of Stellarium's code. This includes indentation, variable names,
> header #ifndef flags. The recode.pl script and astyle program make
> this pretty quick to do.

OK, I'll do it.

>
> 3a. I would like to see the orbit lines fading in and out rather than
> abruptly ending (progressively drop the alpha for the segments towards
> the ends of the orbit lines).
Nice visual effect, I'll try to get it..

>
> 3b. Orbit lines should be taken from the color in the satellites.json
> file (I think they are all the same blue color at the moment?)
Ok, I'll do it..

>
> 4. You wouldn't happen to have a method to determine the brightness of
> a satellite would you (shadow & apparent magnitude when not is
> shadow)? I imagine this would require some sort of size and/or albedo
> data to be added to the satellites.json. If you have some code for
> predicting Iridium flares that would be really amazing!

I started to study how to model Iridium flares some time ago. It's not easy to find equations to predict it. Nevertheless, I found a java open source code (iridiumflares.sourceforge.com) that implements that feature. I am studying this code in order to port it to C++ but I have not finished yet.

Regards,

Revision history for this message
Matthew Gates (matthew-porpoisehead) wrote :

I look forward to seeing your changes.

Revision history for this message
Matthew Gates (matthew-porpoisehead) wrote :

I've made a change to the default satellites.json, and to Satellites.cpp. This should fix the missing group values. You'll need to merge this into your branch.

P.S. I changed the draorb key in the json file to draw_orbit, which I feel is easier to understand. You should change your code accordingly. Thanks.

Revision history for this message
Matthew Gates (matthew-porpoisehead) wrote :

Actually... I created my own branch which is trunk with your changes merged and a few extras from me. http://bazaar.launchpad.net/~matthew-porpoisehead/stellarium/satellites

4769. By J.L. Canales

Sat. Plugin: Satellite skypath line color setup available in sattelites.json

4770. By J.L. Canales

Sat. Plugin: Satellite skypath line fading in and out at the end of the orbit lines

Revision history for this message
J.L. Canales (jlcanales-gasco) wrote :

> Actually... I created my own branch which is trunk with your changes merged
> and a few extras from me. http://bazaar.launchpad.net/~matthew-
> porpoisehead/stellarium/satellites

Thanks, I'm merging your improvements to be synchronized.

4771. By J.L. Canales

merge: Matthew Gates Orbit lines fading solution

Revision history for this message
J.L. Canales (jlcanales-gasco) wrote :

I believe your solution to implement orbit lines fading in and out is better than mine, so I merged it in my branch.

   We have developed the 3a and 3b points of your previous comment. Now, I'm dealing with points 2 and 1.

Revision history for this message
Matthew Gates (matthew-porpoisehead) wrote :

I made it a bit more efficient by making only a single call to drawFromArray for the center segments of the line which are all the same color.

I also reformatted some of the gSatellite code to match the Stellarium coding standards better.

Please pull the changes from my branch and if you're happy with it make another merge proposal thing for lp:stellarium. I can do it myself from my branch, but I would prefer for you to get the commit credit :-)

Revision history for this message
J.L. Canales (jlcanales-gasco) wrote :

Many thanks,
  I'll execute my unit tests to validate the changes and I'll propose another merge...

> I made it a bit more efficient by making only a single call to drawFromArray
> for the center segments of the line which are all the same color.
>
> I also reformatted some of the gSatellite code to match the Stellarium coding
> standards better.
>
> Please pull the changes from my branch and if you're happy with it make
> another merge proposal thing for lp:stellarium. I can do it myself from my
> branch, but I would prefer for you to get the commit credit :-)

4772. By J.L. Canales

gSatellite code style adapted to stellarium rules

4773. By J.L. Canales

optimise satellite orbit drawing by making only a single call to drawFromArray for middle segments which are all the same color

4774. By J.L. Canales

Actualiced code base from trunk Rev. No 4776

4775. By J.L. Canales

FIX: Use Orbit Color seting up in satelites.json. Before this fix, orbit color was always equal to hint color

4776. By J.L. Canales

merge Matthew stylesheet and satellite dialog changes

4777. By J.L. Canales

Optimized use of setVertexArray in Satellite::drawOrbit method

4778. By J.L. Canales

Rendering of the orbits goes funny with non-stereo projection modes

4779. By J.L. Canales

[merge] Updated Author list; my e-mail included

4780. By J.L. Canales

merge Matthew Gates drawo orbit lines optimization and night style available

4781. By J.L. Canales

merge trunk changes rev. 4797

4782. By J.L. Canales

merge trunk rev 4806

4783. By J.L. Canales

Fix: Orbit line little bit off satellite icon

4784. By J.L. Canales

rebase trunk changes rev 4808

4785. By J.L. Canales

Rebase code from trunk Rev. 4821

4786. By J.L. Canales

Fix: First point of orbit line bad sited when time jumps more than orbitLineSegments*orbitLineSegmentDuration

4787. By J.L. Canales

Fix: breaking the smooth fade at the leading edge of the orbit line.

4788. By J.L. Canales

Rebase trunk code Rev 4856. Unuseless gSatellite code removed. gSatStelWrapper declared

4789. By J.L. Canales

SubPoint calculation gSatTEME inteface change to make easier wrapper implementation

4790. By J.L. Canales

gSatStelWrapper methods getTEMEPos, getTEMEVel, getSubPoint methods implemented

4791. By J.L. Canales

gSatStelWrapper getAltAz method implemented

4792. By J.L. Canales

Satellite class working with gSatStelWrapper. Orbit lines disabled, not refactored yet

4793. By J.L. Canales

Orbit lines code refactored. Using gTime classto time management

4794. By J.L. Canales

Clean unused files. gObserver class

4795. By J.L. Canales

Code standars application

4796. By J.L. Canales

gSatStelWrapper name changed to adapt to naming structure of other wrappers in stellarium. (starWraper)

4797. By J.L. Canales

Implemented Visibility prediction method in gSatWrapper class

4798. By J.L. Canales

Rebase trunk code Rev. 4875

4799. By J.L. Canales

Fix: redraw orbit lines after load new TLE data

4800. By J.L. Canales

Fix: Bug updating tle data in satelites.json

4801. By J.L. Canales

clean useless code

4802. By J.L. Canales

Fix: Problem detecting when the site is in dark earth side. Code formated folowing standarts

4803. By J.L. Canales

Fix: Satellite AlAz pos calculation bug.

4804. By J.L. Canales

merge with trunk rev. 4878

4805. By J.L. Canales

Update satellites and TLE in satellite.json

4806. By J.L. Canales

Updated GPS frecuencies with Lennert Buytenhek information

4807. By J.L. Canales

Set variables name accord to stellarium standarts

4808. By J.L. Canales

foreach clauses optimization

4809. By J.L. Canales

rebase trunk ver.4886

4810. By J.L. Canales

TLE data in satelites.json actualized

Unmerged revisions

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added file 'doc/builtinScriptFunctions.doxygen'
2--- doc/builtinScriptFunctions.doxygen 1970-01-01 00:00:00 +0000
3+++ doc/builtinScriptFunctions.doxygen 2010-10-30 00:49:41 +0000
4@@ -0,0 +1,37 @@
5+/*
6+ * Stellarium
7+ * Copyright (C) 2010 Matthew Gates
8+ *
9+ * This program is free software; you can redistribute it and/or
10+ * modify it under the terms of the GNU General Public License
11+ * as published by the Free Software Foundation; either version 2
12+ * of the License, or (at your option) any later version.
13+ *
14+ * This program is distributed in the hope that it will be useful,
15+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
16+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17+ * GNU General Public License for more details.
18+ *
19+ * You should have received a copy of the GNU General Public License
20+ * along with this program; if not, write to the Free Software
21+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22+ */
23+
24+/*!
25+
26+@page builtinScriptFunctions Built in Script Functions
27+
28+<B>waitFor(dt, spec="utc")</B>
29+
30+Waits until a specified simulation date/time.
31+
32+This function will take into account the rate (and direction) in which simulation
33+time is passing. e.g. if a future date is specified and the time is moving backwards,
34+the function will return immediately. If the time rate is 0, the function will not
35+wait. This is to prevent infinite wait time.
36+
37+Parameters:
38+ - dt : the date string to use
39+ - spec : "local" or "utc".
40+
41+*/
42
43=== modified file 'doc/scripting.doxygen'
44--- doc/scripting.doxygen 2010-05-19 06:40:34 +0000
45+++ doc/scripting.doxygen 2010-10-30 00:49:41 +0000
46@@ -1,6 +1,6 @@
47 /*
48 * Stellarium
49- * Copyright (C) 2009 Matthew Gates
50+ * Copyright (C) 2010 Matthew Gates
51 *
52 * This program is free software; you can redistribute it and/or
53 * modify it under the terms of the GNU General Public License
54@@ -75,6 +75,13 @@
55 - StelSkyDrawer
56 - StelSkyLayerMgr
57
58+@section built_in_script_functions Built in Script Functions
59+
60+In addition to the public slots of the classes described above, some functionality
61+is provided by functions implemented within the scripting language. These are
62+made available from the core object, and are similar in operation to the
63+public slots of StelMainScriptAPI. See @ref builtinScriptFunctions for details.
64+
65 @section script_console Script Console
66
67 Note: The Script Console has been enabled by default since version 0.10.5.
68
69=== modified file 'plugins/Satellites/satellites.json'
70--- plugins/Satellites/satellites.json 2010-10-27 15:28:33 +0000
71+++ plugins/Satellites/satellites.json 2010-10-30 00:49:41 +0000
72@@ -1,187 +1,39 @@
73 {
74 "creator": "Satellites plugin (update)",
75 "hintColor": [0, 0.5, 0.5],
76+ "orbitColor": [0, 0.5, 0.5],
77 "satellites":
78 {
79 "AAU CUBESAT":
80 {
81 "comms": [],
82- "tle1": "1 27846U 03031G 10010.54313843 .00000017 00000-0 28199-4 0 6580",
83- "tle2": "2 27846 98.7035 22.6880 0008761 245.5711 114.4553 14.21010978338790",
84- "draw_orbit": false,
85- "visible": false
86- },
87- "PHASE 3B (AO-10)":
88- {
89- "description": "Amateur satellite",
90- "groups": ["amateur", "non-operational"],
91- "tle1": "1 14129U 83058B 09080.32998673 -.00000327 00000-0 10000-3 0 6360",
92- "tle2": "2 14129 25.9652 165.8235 5982871 207.6161 100.7646 2.05871463165845",
93- "draw_orbit": false,
94- "visible": false
95- },
96- "PACSAT (AO-16)":
97- {
98- "description": "Amateur satellite",
99- "groups": ["amateur", "non-operational"],
100- "tle1": "1 20439U 90005D 09080.85236265 .00000014 00000-0 20602-4 0 5632",
101- "tle2": "2 20439 98.2700 53.2702 0011918 71.1776 289.0705 14.31818920 653",
102- "draw_orbit": false,
103+ "groups": [],
104+ "orbitColor": [0, 0, 0],
105+ "orbitVisible": false,
106+ "tle1": "1 27846U 03031G 10300.91786855 .00000087 00000-0 60137-4 0 8600",
107+ "tle2": "2 27846 98.7017 308.8055 0009783 122.9220 237.2907 14.21060728380030",
108 "visible": false
109 },
110 "ARSENE (AO-24)":
111 {
112- "description": "Amateur satellite",
113- "groups": ["amateur", "non-operational"],
114- "tle1": "1 22654U 93031B 09078.43825483 -.00000132 00000-0 10000-3 0 2462",
115- "tle2": "2 22654 5.1398 339.1447 2877460 155.4874 221.3758 1.42205192 77846",
116- "draw_orbit": false,
117- "visible": false
118- },
119- "EYESAT-1 (AO-27)":
120- {
121- "comms": [
122- {
123- "description": "uplink",
124- "frequency": 145.85
125- },
126- {
127- "description": "downlink",
128- "frequency": 145.2
129- }],
130- "description": "Amateur satellite",
131- "groups": ["amateur"],
132- "tle1": "1 22825U 93061C 09080.84794649 .00000017 00000-0 23242-4 0 2051",
133- "tle2": "2 22825 98.4253 37.0634 0008629 156.2036 203.9551 14.29261103807439",
134- "draw_orbit": false,
135- "visible": true
136- },
137- "PHASE 3D (AO-40)":
138- {
139- "comms": [
140- {
141- "description": "Beacon",
142- "frequency": 145.898
143- }],
144- "description": "AMSAT-OSCAR 40 (Phase 3D)",
145- "groups": ["amateur"],
146- "tle1": "1 26609U 00072B 09080.26545799 -.00000301 00000-0 10000-3 0 2044",
147- "tle2": "2 26609 8.9892 27.3596 7956558 186.7198 145.1448 1.25584591 38523",
148- "draw_orbit": false,
149- "visible": true
150- },
151- "OSCAR 5 (AO-5)":
152- {
153- "description": "Amateur satellite",
154- "groups": ["amateur", "non-operational"],
155- "tle1": "1 04321U 70008B 09080.96250683 -.00000031 00000-0 10000-3 0 1420",
156- "tle2": "2 04321 102.1329 90.4257 0027646 145.0891 215.1997 12.52156131789847",
157- "draw_orbit": false,
158- "visible": false
159- },
160- "ECHO (AO-51)":
161- {
162- "comms": [
163- {
164- "description": "uplink",
165- "frequency": 145.92,
166- "modulation": "FM/Voice"
167- },
168- {
169- "description": "downlink",
170- "frequency": 435.15,
171- "modulation": "FM/Voice"
172- }],
173- "description": "Amateur satellite",
174- "groups": ["amateur"],
175- "tle1": "1 28375U 04025K 09080.66057599 .00000001 00000-0 12813-4 0 3455",
176- "tle2": "2 28375 98.0561 95.3557 0085140 31.1071 329.5121 14.40636066248352",
177- "draw_orbit": false,
178- "visible": true
179- },
180- "OSCAR 6 (AO-6)":
181- {
182- "description": "Amateur satellite",
183- "groups": ["amateur", "non-operational"],
184- "tle1": "1 06236U 72082B 09080.97286453 -.00000027 00000-0 10000-3 0 1476",
185- "tle2": "2 06236 101.4018 97.8648 0004124 61.3429 298.8059 12.53076701666485",
186- "draw_orbit": false,
187- "visible": false
188- },
189- "OSCAR 7 (AO-7)":
190- {
191- "comms": [
192- {
193- "description": "200mW Beacon used with Modes B & C",
194- "frequency": 145.972
195- },
196- {
197- "description": "downlink",
198- "frequency": 145.95,
199- "modulation": "Modes B & C"
200- },
201- {
202- "description": "uplink",
203- "frequency": 145.9,
204- "modulation": "Mode A"
205- },
206- {
207- "description": "downlink",
208- "frequency": 29.45,
209- "modulation": "Mode A"
210- },
211- {
212- "description": "200mW Beacon used with Mode A",
213- "frequency": 29.502
214- },
215- {
216- "frequency": 2304.1,
217- "modulation": "40 mW Beacon - only when commanded"
218- },
219- {
220- "description": "uplink",
221- "frequency": 432.15,
222- "modulation": "Modes B & C"
223- }],
224- "description": "AMSAT-OSCAR 7 (Phase-IIB)",
225- "groups": ["amateur"],
226- "tle1": "1 07530U 74089B 09081.09982174 -.00000027 00000-0 10000-3 0 4327",
227- "tle2": "2 07530 101.4356 108.9488 0012080 79.3798 280.8632 12.53575454571800",
228- "draw_orbit": false,
229- "visible": true
230- },
231- "OSCAR 8 (AO-8)":
232- {
233- "description": "Amateur satellite",
234- "groups": ["amateur", "non-operational"],
235- "tle1": "1 10703U 78026B 09081.15228109 .00000030 00000-0 50534-4 0 4427",
236- "tle2": "2 10703 98.8443 129.5050 0007638 50.2967 309.8869 13.98840358583855",
237- "draw_orbit": false,
238+ "comms": [],
239+ "groups": ["amateur", "non-operational"],
240+ "orbitColor": [0, 0, 0],
241+ "orbitVisible": false,
242+ "tle1": "1 22654U 93031B 10296.29188703 -.00000103 00000-0 10000-3 0 4131",
243+ "tle2": "2 22654 4.6448 327.4414 2846429 190.3502 161.8369 1.42205681 86138",
244 "visible": false
245 },
246 "CANX-1":
247 {
248 "comms": [],
249- "tle1": "1 27847U 03031H 10010.55450479 .00000005 00000-0 22661-4 0 6786",
250- "tle2": "2 27847 98.7031 22.6860 0008813 243.1062 116.9211 14.20990414338740",
251- "draw_orbit": false,
252+ "groups": [],
253+ "orbitColor": [0, 0, 0],
254+ "orbitVisible": false,
255+ "tle1": "1 27847U 03031H 10301.49689319 .00000073 00000-0 53616-4 0 8814",
256+ "tle2": "2 27847 98.7006 309.3586 0009858 121.5158 238.6993 14.21038584380060",
257 "visible": false
258 },
259- "CUTE-1 (CO-55)":
260- {
261- "comms": [
262- {
263- "description": "downlink",
264- "frequency": 437.4,
265- "modulation": "AFSK 1200 bps"
266- }],
267- "description": "Amateur satellite",
268- "groups": ["amateur"],
269- "tle1": "1 27844U 03031E 09080.51717845 .00000023 00000-0 31209-4 0 5380",
270- "tle2": "2 27844 98.7159 90.9149 0010677 40.0025 320.1937 14.20627455296817",
271- "draw_orbit": false,
272- "visible": true
273- },
274 "CUBESAT XI-IV (CO-57)":
275 {
276 "comms": [
277@@ -190,11 +42,11 @@
278 "frequency": 437.49,
279 "modulation": "AFSK 1200 bps"
280 }],
281- "description": "Amateur satellite",
282 "groups": ["amateur"],
283- "tle1": "1 27848U 03031J 09080.55297394 .00000015 00000-0 27156-4 0 4858",
284- "tle2": "2 27848 98.7176 90.0128 0010577 41.9374 318.2624 14.20430987296783",
285- "draw_orbit": false,
286+ "orbitColor": [0, 0, 0],
287+ "orbitVisible": false,
288+ "tle1": "1 27848U 03031J 10300.75686843 .00000118 00000-0 75342-4 0 9138",
289+ "tle2": "2 27848 98.7155 306.9596 0009645 148.6384 211.5372 14.20530353379862",
290 "visible": true
291 },
292 "CUBESAT XI-V (CO-58)":
293@@ -205,21 +57,27 @@
294 "frequency": 437.345,
295 "modulation": "AFSK 1200 bps"
296 }],
297- "description": "Amateur satellite",
298 "groups": ["amateur"],
299- "tle1": "1 28895U 05043F 09080.73753781 .00000170 00000-0 45254-4 0 2627",
300- "tle2": "2 28895 98.0694 333.7523 0016860 260.8704 99.0653 14.59751404180971",
301- "draw_orbit": false,
302+ "orbitColor": [0, 0, 0],
303+ "orbitVisible": false,
304+ "tle1": "1 28895U 05043F 10301.90384514 .00000118 00000-0 33891-4 0 7168",
305+ "tle2": "2 28895 97.9923 181.8026 0017166 223.3057 136.6785 14.59954295266498",
306 "visible": true
307 },
308- "DOVE (DO-17)":
309+ "CUTE-1 (CO-55)":
310 {
311- "description": "Amateur satellite",
312- "groups": ["amateur", "non-operational"],
313- "tle1": "1 20440U 90005E 09080.52227667 .00000009 00000-0 18438-4 0 2752",
314- "tle2": "2 20440 98.2451 57.8863 0011973 67.7463 292.4996 14.32122011 741",
315- "draw_orbit": false,
316- "visible": false
317+ "comms": [
318+ {
319+ "description": "downlink",
320+ "frequency": 437.4,
321+ "modulation": "AFSK 1200 bps"
322+ }],
323+ "groups": ["amateur"],
324+ "orbitColor": [0, 0, 0],
325+ "orbitVisible": false,
326+ "tle1": "1 27844U 03031E 10301.55293538 .00000112 00000-0 72257-4 0 9662",
327+ "tle2": "2 27844 98.7101 308.6233 0009948 142.0283 218.1605 14.20740927380020",
328+ "visible": true
329 },
330 "DELFI-C3 (DO-64)":
331 {
332@@ -229,1152 +87,1315 @@
333 "frequency": 145.87,
334 "modulation": "BPSK 1200 bps"
335 }],
336- "description": "Amateur satellite",
337 "groups": ["amateur"],
338- "tle1": "1 32789U 08021G 09080.84012653 .00000106 00000-0 20301-4 0 3267",
339- "tle2": "2 32789 97.9568 145.5256 0014665 318.8670 41.1422 14.81641404 48513",
340- "draw_orbit": false,
341+ "orbitColor": [0, 0, 0],
342+ "orbitVisible": false,
343+ "tle1": "1 32789U 08021G 10301.97603882 .00001122 00000-0 14653-3 0 8232",
344+ "tle2": "2 32789 97.8873 5.5871 0015021 205.9532 154.0924 14.82393546135328",
345 "visible": true
346 },
347+ "DOVE (DO-17)":
348+ {
349+ "comms": [],
350+ "groups": ["amateur", "non-operational"],
351+ "orbitColor": [0, 0, 0],
352+ "orbitVisible": false,
353+ "tle1": "1 20440U 90005E 10301.41284784 .00000048 00000-0 33180-4 0 7479",
354+ "tle2": "2 20440 98.3259 257.6780 0011703 121.3158 238.9186 14.32187224 84605",
355+ "visible": false
356+ },
357 "DTUSAT":
358 {
359 "comms": [],
360- "tle1": "1 27842U 03031C 10010.89561892 .00000007 00000-0 23258-4 0 7359",
361- "tle2": "2 27842 98.7047 23.0441 0008526 245.7454 114.2832 14.21010898338847",
362- "draw_orbit": false,
363+ "groups": [],
364+ "orbitColor": [0, 0, 0],
365+ "orbitVisible": false,
366+ "tle1": "1 27842U 03031C 10302.04462644 .00000081 00000-0 57327-4 0 9601",
367+ "tle2": "2 27842 98.7019 309.9250 0009996 120.0473 240.1690 14.21063113380192",
368 "visible": false
369 },
370+ "ECHO (AO-51)":
371+ {
372+ "comms": [
373+ {
374+ "description": "uplink",
375+ "frequency": 145.92,
376+ "modulation": "FM/Voice"
377+ },
378+ {
379+ "description": "downlink",
380+ "frequency": 435.15,
381+ "modulation": "FM/Voice"
382+ }],
383+ "groups": ["amateur"],
384+ "orbitColor": [0, 0, 0],
385+ "orbitVisible": false,
386+ "tle1": "1 28375U 04025K 10301.07913539 .00000051 00000-0 27765-4 0 8107",
387+ "tle2": "2 28375 98.0736 287.0941 0085114 54.0307 306.8742 14.40705651332640",
388+ "visible": true
389+ },
390 "ENVISAT":
391 {
392 "comms": [],
393 "groups": ["scientific"],
394 "hintColor": [0.400000005960464, 0.800000011920929, 1],
395- "tle1": "1 27386U 02009A 10011.73639675 .00000071 00000-0 42510-4 0 6762",
396- "tle2": "2 27386 98.5484 81.1001 0001030 91.3585 61.9740 14.32248909411344",
397- "draw_orbit": true,
398+ "orbitColor": [0, 0, 0],
399+ "orbitVisible": true,
400+ "tle1": "1 27386U 02009A 10302.30705345 .00000433 00000-0 15968-3 0 5695",
401+ "tle2": "2 27386 98.5363 7.4906 0001057 108.6868 251.4502 14.37440949452946",
402 "visible": true
403 },
404- "JAS-1 (FO-12)":
405- {
406- "description": "Amateur satellite",
407- "groups": ["amateur", "non-operational"],
408- "tle1": "1 16909U 86061B 09080.94650626 -.00000083 00000-0 10000-3 0 5465",
409- "tle2": "2 16909 50.0155 70.0871 0010887 345.8622 14.1906 12.44452849 28116",
410- "draw_orbit": false,
411- "visible": false
412- },
413- "JAS-1B (FO-20)":
414- {
415- "description": "Amateur satellite",
416- "groups": ["amateur", "non-operational"],
417- "tle1": "1 20480U 90013C 09080.79147234 -.00000010 00000-0 50788-4 0 941",
418- "tle2": "2 20480 99.0681 17.7100 0540652 8.2393 352.7149 12.83361326895695",
419- "draw_orbit": false,
420- "visible": false
421- },
422- "JAS-2 (FO-29)":
423+ "EYESAT-1 (AO-27)":
424 {
425 "comms": [
426 {
427 "description": "uplink",
428- "frequency": 145.95,
429- "modulation": "SSB/CW"
430+ "frequency": 145.85
431 },
432 {
433 "description": "downlink",
434- "frequency": 435.85,
435- "modulation": "SSB/CW"
436+ "frequency": 145.2
437 }],
438- "description": "Amateur satellite",
439 "groups": ["amateur"],
440- "tle1": "1 24278U 96046B 09080.73870134 -.00000063 00000-0 -26229-4 0 41",
441- "tle2": "2 24278 98.5666 326.4736 0350089 216.8408 140.8210 13.52942306621921",
442- "draw_orbit": false,
443+ "orbitColor": [0, 0, 0],
444+ "orbitVisible": false,
445+ "tle1": "1 22825U 93061C 10301.86090994 .00000033 00000-0 29665-4 0 6612",
446+ "tle2": "2 22825 98.5013 246.4466 0007545 234.1411 125.9055 14.29313405891148",
447 "visible": true
448 },
449 "GENESIS 1":
450 {
451 "comms": [],
452- "tle1": "1 29252U 06029A 10011.52793667 .00000091 00000-0 19479-4 0 9551",
453- "tle2": "2 29252 64.5138 48.6502 0005838 166.2231 193.9045 15.03489848192237",
454- "draw_orbit": false,
455+ "groups": [],
456+ "orbitColor": [0, 0, 0],
457+ "orbitVisible": false,
458+ "tle1": "1 29252U 06029A 10301.24236459 .00000810 00000-0 71150-4 0 1806",
459+ "tle2": "2 29252 64.5138 201.6869 0033064 326.9862 32.9190 15.03780124235794",
460 "visible": true
461 },
462 "GENESIS 2":
463 {
464 "comms": [],
465- "tle1": "1 31789U 07028A 10011.52925320 .00000135 00000-0 23184-4 0 7041",
466- "tle2": "2 31789 64.5059 80.0205 0048307 232.0058 127.6690 15.03160429139449",
467- "draw_orbit": false,
468+ "groups": [],
469+ "orbitColor": [0, 0, 0],
470+ "orbitVisible": false,
471+ "tle1": "1 31789U 07028A 10301.30602734 .00000668 00000-0 61695-4 0 9244",
472+ "tle2": "2 31789 64.5057 233.2725 0015456 185.0663 175.0302 15.03452344183002",
473 "visible": true
474 },
475- "TECHSAT 1B (GO-32)":
476- {
477- "description": "Amateur satellite",
478- "groups": ["amateur", "non-operational"],
479- "tle1": "1 25397U 98043D 09080.75202847 -.00000043 00000-0 -91654-6 0 8508",
480- "tle2": "2 25397 98.3353 107.7463 0001898 121.8466 238.2885 14.23155927555696",
481- "draw_orbit": false,
482- "visible": false
483- },
484 "GPS BIIA-10 (PRN 32)":
485 {
486 "comms": [],
487- "tle1": "1 20959U 90103A 10010.99755647 -.00000036 00000-0 10000-3 0 5262",
488- "tle2": "2 20959 55.0535 274.6290 0132765 299.3343 59.4131 2.00568641140074",
489- "draw_orbit": false,
490+ "groups": [],
491+ "orbitColor": [0, 0, 0],
492+ "orbitVisible": false,
493+ "tle1": "1 20959U 90103A 10301.17033650 .00000001 00000-0 10000-3 0 8981",
494+ "tle2": "2 20959 54.8508 262.9106 0128049 307.5619 51.2764 2.00571453145897",
495 "visible": false
496 },
497 "GPS BIIA-11 (PRN 24)":
498 {
499 "comms": [],
500- "tle1": "1 21552U 91047A 10009.70414824 .00000092 00000-0 10000-3 0 5313",
501- "tle2": "2 21552 54.4144 212.6800 0062160 326.3598 33.2642 2.00563397135632",
502- "draw_orbit": false,
503+ "groups": [],
504+ "orbitColor": [0, 0, 0],
505+ "orbitVisible": false,
506+ "tle1": "1 21552U 91047A 10301.06970066 .00000018 00000-0 10000-3 0 8874",
507+ "tle2": "2 21552 54.3571 200.9750 0057951 338.3118 21.5157 2.00436716141476",
508 "visible": false
509 },
510 "GPS BIIA-14 (PRN 26)":
511 {
512 "comms": [],
513- "tle1": "1 22014U 92039A 10010.93278189 -.00000105 00000-0 10000-3 0 4649",
514- "tle2": "2 22014 56.8181 333.2692 0195319 59.8919 302.0021 2.00570105121807",
515- "draw_orbit": false,
516+ "groups": [],
517+ "orbitColor": [0, 0, 0],
518+ "orbitVisible": false,
519+ "tle1": "1 22014U 92039A 10299.97348574 -.00000038 00000-0 10000-3 0 7848",
520+ "tle2": "2 22014 56.6867 322.0414 0196227 63.7900 298.2637 2.00568038127602",
521 "visible": false
522 },
523 "GPS BIIA-15 (PRN 27)":
524 {
525 "comms": [],
526- "tle1": "1 22108U 92058A 10010.90400221 -.00000067 00000-0 10000-3 0 3539",
527- "tle2": "2 22108 55.9801 26.5719 0219290 274.8295 82.7079 2.00561618126981",
528- "draw_orbit": false,
529+ "groups": [],
530+ "orbitColor": [0, 0, 0],
531+ "orbitVisible": false,
532+ "tle1": "1 22108U 92058A 10301.07012426 -.00000061 00000-0 10000-3 0 6825",
533+ "tle2": "2 22108 56.1265 15.1080 0219146 282.0449 75.5558 2.00576285132801",
534 "visible": false
535 },
536 "GPS BIIA-21 (PRN 09)":
537 {
538 "comms": [],
539- "tle1": "1 22700U 93042A 10010.42349068 -.00000067 00000-0 10000-3 0 7005",
540- "tle2": "2 22700 56.0930 27.9954 0203907 87.3193 275.0601 2.00570795121138",
541- "draw_orbit": false,
542+ "groups": [],
543+ "orbitColor": [0, 0, 0],
544+ "orbitVisible": false,
545+ "tle1": "1 22700U 93042A 10300.60063047 -.00000060 00000-0 10000-3 0 227",
546+ "tle2": "2 22700 56.2590 16.5804 0168032 88.8279 273.1456 2.00561025126958",
547 "visible": false
548 },
549 "GPS BIIA-23 (PRN 04)":
550 {
551 "comms": [],
552- "tle1": "1 22877U 93068A 10010.06604071 .00000093 00000-0 10000-3 0 197",
553- "tle2": "2 22877 53.8346 209.9413 0090336 32.3870 328.2140 2.00570796118779",
554- "draw_orbit": false,
555+ "groups": [],
556+ "orbitColor": [0, 0, 0],
557+ "orbitVisible": false,
558+ "tle1": "1 22877U 93068A 10300.74029013 .00000022 00000-0 10000-3 0 3691",
559+ "tle2": "2 22877 53.7782 198.0703 0092885 37.1146 323.5923 2.00552150124602",
560 "visible": false
561 },
562 "GPS BIIA-24 (PRN 06)":
563 {
564 "comms": [],
565- "tle1": "1 23027U 94016A 10010.76960448 .00000006 00000-0 10000-3 0 283",
566- "tle2": "2 23027 53.5254 146.9361 0060541 291.8296 67.4883 2.00564113116098",
567- "draw_orbit": false,
568+ "groups": [],
569+ "orbitColor": [0, 0, 0],
570+ "orbitVisible": false,
571+ "tle1": "1 23027U 94016A 10301.43787208 .00000072 00000-0 10000-3 0 3399",
572+ "tle2": "2 23027 53.5644 134.9878 0063098 304.7648 54.7027 2.00565234121928",
573 "visible": false
574 },
575 "GPS BIIA-25 (PRN 03)":
576 {
577 "comms": [],
578- "tle1": "1 23833U 96019A 10011.28117265 -.00000009 00000-0 10000-3 0 2176",
579- "tle2": "2 23833 53.1057 142.9368 0125981 55.7020 305.4397 2.00562273101088",
580- "draw_orbit": false,
581+ "groups": [],
582+ "orbitColor": [0, 0, 0],
583+ "orbitVisible": false,
584+ "tle1": "1 23833U 96019A 10300.45786614 .00000069 00000-0 10000-3 0 5332",
585+ "tle2": "2 23833 53.1598 130.9064 0142163 56.9894 304.4139 2.00570127106884",
586 "visible": false
587 },
588 "GPS BIIA-26 (PRN 10)":
589 {
590 "comms": [],
591- "tle1": "1 23953U 96041A 10011.18603747 -.00000025 00000-0 10000-3 0 6866",
592- "tle2": "2 23953 54.7294 271.0433 0088058 35.3384 325.3007 2.00592554 98874",
593- "draw_orbit": false,
594+ "groups": [],
595+ "orbitColor": [0, 0, 0],
596+ "orbitVisible": false,
597+ "tle1": "1 23953U 96041A 10300.83095470 .00000001 00000-0 10000-3 0 280",
598+ "tle2": "2 23953 54.5206 259.2542 0093347 37.3286 323.3054 2.00580557104681",
599 "visible": false
600 },
601 "GPS BIIA-27 (PRN 30)":
602 {
603 "comms": [],
604- "tle1": "1 24320U 96056A 10010.55267325 -.00000068 00000-0 10000-3 0 4257",
605- "tle2": "2 24320 54.6846 87.2451 0117066 83.4925 277.8682 2.00567811 97528",
606- "draw_orbit": false,
607+ "groups": [],
608+ "orbitColor": [0, 0, 0],
609+ "orbitVisible": false,
610+ "tle1": "1 24320U 96056A 10300.76073036 .00000024 00000-0 00000+0 0 7570",
611+ "tle2": "2 24320 54.8841 75.4974 0129153 89.1011 272.3637 2.00368467103347",
612 "visible": false
613 },
614 "GPS BIIA-28 (PRN 08)":
615 {
616 "comms": [],
617- "tle1": "1 25030U 97067A 10010.28331492 -.00000064 00000-0 10000-3 0 1002",
618- "tle2": "2 25030 56.8069 33.5854 0109830 177.7126 182.3861 2.00557057 89283",
619- "draw_orbit": false,
620+ "groups": [],
621+ "orbitColor": [0, 0, 0],
622+ "orbitVisible": false,
623+ "tle1": "1 25030U 97067A 10300.46082717 -.00000055 00000-0 10000-3 0 4280",
624+ "tle2": "2 25030 56.9800 22.3810 0114857 181.8340 178.1709 2.00565936 95101",
625 "visible": false
626 },
627 "GPS BIIR-02 (PRN 13)":
628 {
629 "comms": [],
630- "tle1": "1 24876U 97035A 10011.15261365 -.00000105 00000-0 10000-3 0 1907",
631- "tle2": "2 24876 56.9425 333.4309 0037352 94.7690 265.6519 2.00571727 91409",
632- "draw_orbit": false,
633+ "groups": [],
634+ "orbitColor": [0, 0, 0],
635+ "orbitVisible": false,
636+ "tle1": "1 24876U 97035A 10300.82746512 -.00000037 00000-0 10000-3 0 5014",
637+ "tle2": "2 24876 56.8190 322.2355 0040820 104.7722 255.7262 2.00561646 97215",
638 "visible": false
639 },
640 "GPS BIIR-03 (PRN 11)":
641 {
642 "comms": [],
643- "tle1": "1 25933U 99055A 10010.92537465 .00000081 00000-0 10000-3 0 6410",
644- "tle2": "2 25933 50.9220 196.7469 0102582 44.1197 316.7153 2.00557696 75219",
645- "draw_orbit": false,
646+ "groups": [],
647+ "orbitColor": [0, 0, 0],
648+ "orbitVisible": false,
649+ "tle1": "1 25933U 99055A 10301.10513055 .00000027 00000-0 10000-3 0 9482",
650+ "tle2": "2 25933 50.8872 184.0730 0111220 49.1827 311.8654 2.00586073 81036",
651 "visible": false
652 },
653 "GPS BIIR-04 (PRN 20)":
654 {
655 "comms": [],
656- "tle1": "1 26360U 00025A 10011.52706440 -.00000016 00000-0 10000-3 0 7344",
657- "tle2": "2 26360 53.7974 268.0575 0039769 72.6509 287.8497 2.00559568 70923",
658- "draw_orbit": false,
659+ "groups": [],
660+ "orbitColor": [0, 0, 0],
661+ "orbitVisible": false,
662+ "tle1": "1 26360U 00025A 10300.69570086 .00000000 00000-0 10000-3 0 398",
663+ "tle2": "2 26360 53.6003 256.0337 0040795 71.7443 288.6921 2.00547813 76721",
664 "visible": false
665 },
666 "GPS BIIR-05 (PRN 28)":
667 {
668 "comms": [],
669- "tle1": "1 26407U 00040A 10010.36440597 -.00000066 00000-0 10000-3 0 6829",
670- "tle2": "2 26407 55.5104 91.6427 0157978 246.2508 112.1090 2.00565206 69571",
671- "draw_orbit": false,
672+ "groups": [],
673+ "orbitColor": [0, 0, 0],
674+ "orbitVisible": false,
675+ "tle1": "1 26407U 00040A 10301.53469852 .00000000 00000-0 10000-3 0 9882",
676+ "tle2": "2 26407 55.6937 80.1082 0165329 248.9835 109.2466 2.00562548 75417",
677 "visible": false
678 },
679 "GPS BIIR-06 (PRN 14)":
680 {
681 "comms": [],
682- "tle1": "1 26605U 00071A 10010.96064742 -.00000106 00000-0 10000-3 0 6884",
683- "tle2": "2 26605 56.5635 332.2378 0052732 241.2746 118.1865 2.00562276 67186",
684- "draw_orbit": false,
685+ "groups": [],
686+ "orbitColor": [0, 0, 0],
687+ "orbitVisible": false,
688+ "tle1": "1 26605U 00071A 10301.13987066 -.00000036 00000-0 10000-3 0 9985",
689+ "tle2": "2 26605 56.4295 320.9194 0059068 240.4602 118.9895 2.00574824 73009",
690 "visible": false
691 },
692 "GPS BIIR-07 (PRN 18)":
693 {
694 "comms": [],
695- "tle1": "1 26690U 01004A 10011.32818609 -.00000026 00000-0 10000-3 0 5740",
696- "tle2": "2 26690 53.8131 271.1512 0110582 226.2030 132.9381 2.00565198 65607",
697- "draw_orbit": false,
698+ "groups": [],
699+ "orbitColor": [0, 0, 0],
700+ "orbitVisible": false,
701+ "tle1": "1 26690U 01004A 10301.00551877 -.00000001 00000-0 10000-3 0 8777",
702+ "tle2": "2 26690 53.6003 259.1082 0120363 229.8105 129.1216 2.00556043 71411",
703 "visible": false
704 },
705 "GPS BIIR-08 (PRN 16)":
706 {
707 "comms": [],
708- "tle1": "1 27663U 03005A 10010.18241212 -.00000066 00000-0 10000-3 0 9453",
709- "tle2": "2 27663 55.6126 91.1957 0054149 342.9474 16.8941 2.00562319 50933",
710- "draw_orbit": false,
711+ "groups": [],
712+ "orbitColor": [0, 0, 0],
713+ "orbitVisible": false,
714+ "tle1": "1 27663U 03005A 10301.36090832 .00000036 00000-0 10000-3 0 2860",
715+ "tle2": "2 27663 55.7967 79.6869 0058044 349.2639 10.6053 2.00563683 56770",
716 "visible": false
717 },
718 "GPS BIIR-09 (PRN 21)":
719 {
720 "comms": [],
721- "tle1": "1 27704U 03010A 10010.75198163 .00000090 00000-0 10000-3 0 8437",
722- "tle2": "2 27704 53.4558 210.5815 0154862 213.4823 145.5286 2.00557110 49738",
723- "draw_orbit": false,
724+ "groups": [],
725+ "orbitColor": [0, 0, 0],
726+ "orbitVisible": false,
727+ "tle1": "1 27704U 03010A 10299.92552095 .00000026 00000-0 10000-3 0 1671",
728+ "tle2": "2 27704 53.4076 198.6608 0172053 221.0136 137.7605 2.00568532 55536",
729 "visible": false
730 },
731 "GPS BIIR-10 (PRN 22)":
732 {
733 "comms": [],
734- "tle1": "1 28129U 03058A 10010.87364204 -.00000030 00000-0 10000-3 0 4548",
735- "tle2": "2 28129 53.6784 271.4646 0053797 253.0522 106.4165 2.00564472 44446",
736- "draw_orbit": false,
737+ "groups": [],
738+ "orbitColor": [0, 0, 0],
739+ "orbitVisible": false,
740+ "tle1": "1 28129U 03058A 10301.04872722 -.00000002 00000-0 10000-3 0 7642",
741+ "tle2": "2 28129 53.4689 259.3656 0057247 250.7828 108.5881 2.00557705 50267",
742 "visible": false
743 },
744 "GPS BIIR-11 (PRN 19)":
745 {
746 "comms": [],
747- "tle1": "1 28190U 04009A 10011.32018064 .00000015 00000-0 10000-3 0 4007",
748- "tle2": "2 28190 54.8708 154.0770 0060512 347.4292 12.3771 2.00562181 42623",
749- "draw_orbit": false,
750+ "groups": [],
751+ "orbitColor": [0, 0, 0],
752+ "orbitVisible": false,
753+ "tle1": "1 28190U 04009A 10301.50046097 .00000072 00000-0 10000-3 0 7406",
754+ "tle2": "2 28190 54.9000 142.5675 0066538 355.8704 4.1637 2.00574577 48448",
755 "visible": false
756 },
757 "GPS BIIR-12 (PRN 23)":
758 {
759 "comms": [],
760- "tle1": "1 28361U 04023A 10011.11001436 -.00000108 00000-0 10000-3 0 2210",
761- "tle2": "2 28361 55.5233 330.1407 0063091 175.1654 184.8914 2.00555994 40706",
762- "draw_orbit": false,
763+ "groups": [],
764+ "orbitColor": [0, 0, 0],
765+ "orbitVisible": false,
766+ "tle1": "1 28361U 04023A 10301.28559030 -.00000036 00000-0 10000-3 0 5604",
767+ "tle2": "2 28361 55.3810 318.5203 0072448 180.5016 179.5309 2.00568475 46520",
768 "visible": false
769 },
770 "GPS BIIR-13 (PRN 02)":
771 {
772 "comms": [],
773- "tle1": "1 28474U 04045A 10010.60958177 .00000092 00000-0 10000-3 0 1103",
774- "tle2": "2 28474 53.8831 208.8835 0092214 169.6917 190.5412 2.00553740 38050",
775- "draw_orbit": false,
776+ "groups": [],
777+ "orbitColor": [0, 0, 0],
778+ "orbitVisible": false,
779+ "tle1": "1 28474U 04045A 10300.77942241 .00000022 00000-0 10000-3 0 4407",
780+ "tle2": "2 28474 53.8254 197.0502 0092613 180.6485 179.4129 2.00565881 43871",
781 "visible": false
782 },
783 "GPS BIIRM-1 (PRN 17)":
784 {
785 "comms": [],
786- "tle1": "1 28874U 05038A 10010.46611155 .00000020 00000-0 10000-3 0 3749",
787- "tle2": "2 28874 55.0076 150.9355 0050579 211.6273 148.0313 2.00552416 31470",
788- "draw_orbit": false,
789+ "groups": [],
790+ "orbitColor": [0, 0, 0],
791+ "orbitVisible": false,
792+ "tle1": "1 28874U 05038A 10300.63167212 .00000072 00000-0 10000-3 0 7178",
793+ "tle2": "2 28874 55.0369 139.4663 0058105 217.5165 142.1443 2.00563988 37298",
794 "visible": false
795 },
796 "GPS BIIRM-2 (PRN 31)":
797 {
798 "comms": [],
799- "tle1": "1 29486U 06042A 10011.06942763 -.00000065 00000-0 10000-3 0 6815",
800- "tle2": "2 29486 55.8943 29.7669 0076878 294.8151 64.4195 2.00574313 24189",
801- "draw_orbit": false,
802+ "groups": [],
803+ "orbitColor": [0, 0, 0],
804+ "orbitVisible": false,
805+ "tle1": "1 29486U 06042A 10300.25051077 -.00000059 00000-0 10000-3 0 318",
806+ "tle2": "2 29486 56.0510 18.3338 0076580 298.9210 60.3604 2.00551737 29988",
807 "visible": false
808 },
809 "GPS BIIRM-3 (PRN 12)":
810 {
811 "comms": [],
812- "tle1": "1 29601U 06052A 10010.51493068 -.00000066 00000-0 10000-3 0 7387",
813- "tle2": "2 29601 55.5346 90.1935 0034161 324.4761 35.3273 2.00550794 23085",
814- "draw_orbit": false,
815+ "groups": [],
816+ "orbitColor": [0, 0, 0],
817+ "orbitVisible": false,
818+ "tle1": "1 29601U 06052A 10300.68949439 .00000031 00000-0 10000-3 0 952",
819+ "tle2": "2 29601 55.7140 78.7061 0033602 337.9762 21.8540 2.00573430 28905",
820 "visible": false
821 },
822 "GPS BIIRM-4 (PRN 15)":
823 {
824 "comms": [],
825- "tle1": "1 32260U 07047A 10010.31555820 -.00000108 00000-0 00000+0 0 4705",
826- "tle2": "2 32260 54.7160 328.8448 0023063 332.4507 27.4199 2.00560044 16474",
827- "draw_orbit": false,
828+ "groups": [],
829+ "orbitColor": [0, 0, 0],
830+ "orbitVisible": false,
831+ "tle1": "1 32260U 07047A 10301.00379408 -.00000037 00000-0 00000+0 0 8086",
832+ "tle2": "2 32260 54.5620 316.9717 0026605 346.0435 13.9162 2.00545550 22300",
833 "visible": false
834 },
835 "GPS BIIRM-5 (PRN 29)":
836 {
837 "comms": [],
838- "tle1": "1 32384U 07062A 10010.63802324 .00000019 00000-0 10000-3 0 4994",
839- "tle2": "2 32384 55.0131 151.4032 0032068 287.1304 72.4854 2.00578110 15209",
840- "draw_orbit": false,
841+ "groups": [],
842+ "orbitColor": [0, 0, 0],
843+ "orbitVisible": false,
844+ "tle1": "1 32384U 07062A 10300.82009883 .00000072 00000-0 10000-3 0 8359",
845+ "tle2": "2 32384 55.0523 139.9388 0024871 291.4893 68.2676 2.00565959 21022",
846 "visible": false
847 },
848 "GPS BIIRM-6 (PRN 07)":
849 {
850 "comms": [],
851- "tle1": "1 32711U 08012A 10010.73574093 -.00000067 00000-0 10000-3 0 3661",
852- "tle2": "2 32711 55.5876 29.8416 0032333 179.9404 180.1045 2.00557495 13415",
853- "draw_orbit": false,
854+ "groups": [],
855+ "orbitColor": [0, 0, 0],
856+ "orbitVisible": false,
857+ "tle1": "1 32711U 08012A 10300.91601166 -.00000060 00000-0 10000-3 0 6672",
858+ "tle2": "2 32711 55.7503 18.2909 0041268 182.2061 177.8254 2.00562157 19238",
859 "visible": false
860 },
861+ "HAMSAT (VO-52)":
862+ {
863+ "comms": [
864+ {
865+ "description": "Beacon",
866+ "frequency": 145.86,
867+ "modulation": "CW"
868+ }],
869+ "groups": ["amateur"],
870+ "orbitColor": [0, 0, 0],
871+ "orbitVisible": false,
872+ "tle1": "1 28650U 05017B 10301.70204233 .00000454 00000-0 63624-4 0 6322",
873+ "tle2": "2 28650 97.6762 349.8118 0026562 197.3803 162.6532 14.81837321296466",
874+ "visible": true
875+ },
876 "HST":
877 {
878 "comms": [],
879- "tle1": "1 20580U 90037B 10009.85735511 .00000291 00000-0 94489-5 0 5019",
880- "tle2": "2 20580 28.4685 193.3983 0003260 317.8077 42.2266 15.00875675880934",
881- "draw_orbit": false,
882+ "groups": [],
883+ "orbitColor": [0, 0, 0],
884+ "orbitVisible": true,
885+ "tle1": "1 20580U 90037B 10300.09759300 .00000718 00000-0 41998-4 0 6685",
886+ "tle2": "2 20580 28.4686 98.6536 0003467 162.6448 197.4276 15.01074509924596",
887 "visible": true
888 },
889- "ITAMSAT (IO-26)":
890- {
891- "description": "Amateur satellite",
892- "groups": ["amateur", "non-operational"],
893- "tle1": "1 22826U 93061D 09080.85350470 -.00000006 00000-0 14293-4 0 9268",
894- "tle2": "2 22826 98.4204 37.8560 0009197 152.3361 207.8319 14.29512039807534",
895- "draw_orbit": false,
896- "visible": false
897- },
898 "IRIDIUM 10":
899 {
900- "description": "Iridium 10",
901+ "comms": [],
902 "groups": ["iridium", "communications"],
903- "tle1": "1 24839U 97030D 09080.75603299 .00000198 00000-0 63641-4 0 5665",
904- "tle2": "2 24839 86.4032 167.9110 0002345 85.8737 274.2720 14.34216304615619",
905- "draw_orbit": false,
906+ "orbitColor": [0, 0, 0],
907+ "orbitVisible": false,
908+ "tle1": "1 24839U 97030D 10301.46267144 .00000007 00000-0 -45497-5 0 2584",
909+ "tle2": "2 24839 86.3911 283.1128 0002489 80.1516 279.9963 14.34216097699562",
910 "visible": false
911 },
912 "IRIDIUM 11":
913 {
914- "description": "Iridium 11",
915+ "comms": [],
916 "groups": ["iridium", "communications"],
917- "tle1": "1 25578U 98074B 09080.96418723 .00000021 00000-0 -64075-8 0 5598",
918- "tle2": "2 25578 86.5093 73.3425 0002585 79.6314 280.5189 14.54937843544862",
919- "draw_orbit": false,
920+ "orbitColor": [0, 0, 0],
921+ "orbitVisible": false,
922+ "tle1": "1 25578U 98074B 10301.24589116 .00000272 00000-0 58203-4 0 2734",
923+ "tle2": "2 25578 86.5181 188.7611 0002357 77.8060 282.3396 14.54951368629966",
924 "visible": false
925 },
926 "IRIDIUM 12":
927 {
928- "description": "Iridium 12",
929+ "comms": [],
930 "groups": ["iridium", "communications"],
931- "tle1": "1 24837U 97030B 09080.76871839 .00000162 00000-0 50797-4 0 5682",
932- "tle2": "2 24837 86.4018 167.9072 0002316 83.3237 276.8222 14.34216073615601",
933- "draw_orbit": false,
934+ "orbitColor": [0, 0, 0],
935+ "orbitVisible": false,
936+ "tle1": "1 24837U 97030B 10301.40558675 -.00000010 00000-0 -10565-4 0 2579",
937+ "tle2": "2 24837 86.3903 283.1426 0002512 84.4387 275.7108 14.34216340699546",
938 "visible": false
939 },
940 "IRIDIUM 13":
941 {
942- "description": "Iridium 13",
943+ "comms": [],
944 "groups": ["iridium", "communications"],
945- "tle1": "1 24840U 97030E 09080.77506041 .00000178 00000-0 56458-4 0 5246",
946- "tle2": "2 24840 86.4035 167.9756 0002404 88.5081 271.6386 14.34216342615608",
947- "draw_orbit": false,
948+ "orbitColor": [0, 0, 0],
949+ "orbitVisible": false,
950+ "tle1": "1 24840U 97030E 10301.48170248 .00000002 00000-0 -63744-5 0 2148",
951+ "tle2": "2 24840 86.3913 283.1911 0002538 78.9591 281.1904 14.34216190699552",
952 "visible": false
953 },
954 "IRIDIUM 14":
955 {
956- "description": "Iridium 14",
957+ "comms": [],
958 "groups": ["iridium", "communications"],
959- "tle1": "1 25777U 99032A 09080.96055310 .00000130 00000-0 25188-4 0 5243",
960- "tle2": "2 25777 86.5126 41.6339 0001855 82.9817 277.1596 14.54935495519245",
961- "draw_orbit": false,
962+ "orbitColor": [0, 0, 0],
963+ "orbitVisible": false,
964+ "tle1": "1 25777U 99032A 10301.51723412 .00000154 00000-0 30756-4 0 2427",
965+ "tle2": "2 25777 86.5153 156.9718 0002312 77.7386 282.4084 14.54947031604388",
966 "visible": false
967 },
968 "IRIDIUM 15":
969 {
970- "description": "Iridium 15",
971+ "comms": [],
972 "groups": ["iridium", "communications"],
973- "tle1": "1 24869U 97034A 09080.83555834 .00000127 00000-0 38404-4 0 5876",
974- "tle2": "2 24869 86.3996 199.4843 0002242 82.3271 277.8172 14.34217422612589",
975- "draw_orbit": false,
976+ "orbitColor": [0, 0, 0],
977+ "orbitVisible": false,
978+ "tle1": "1 24869U 97034A 10301.47242563 -.00000024 00000-0 -15465-4 0 2873",
979+ "tle2": "2 24869 86.3926 314.8201 0002445 86.9290 273.2200 14.34219000696521",
980 "visible": false
981 },
982 "IRIDIUM 16":
983 {
984- "description": "Iridium 16",
985+ "comms": [],
986 "groups": ["iridium", "communications"],
987- "tle1": "1 24841U 97030F 09080.74756006 .00000103 00000-0 28979-4 0 5472",
988- "tle2": "2 24841 86.4115 168.5066 0004087 67.5298 292.6324 14.35274480615732",
989- "draw_orbit": false,
990+ "orbitColor": [0, 0, 0],
991+ "orbitVisible": false,
992+ "tle1": "1 24841U 97030F 10301.49343822 .00000157 00000-0 47706-4 0 2532",
993+ "tle2": "2 24841 86.3990 283.8057 0001109 29.5848 330.5421 14.35369815699755",
994 "visible": false
995 },
996 "IRIDIUM 17":
997 {
998- "description": "Iridium 17",
999+ "comms": [],
1000 "groups": ["iridium", "communications"],
1001- "tle1": "1 24870U 97034B 09080.86574228 .00000094 00000-0 26348-4 0 5551",
1002- "tle2": "2 24870 86.3997 199.3860 0002450 74.3578 285.7893 14.34424293612609",
1003- "draw_orbit": false,
1004+ "orbitColor": [0, 0, 0],
1005+ "orbitVisible": false,
1006+ "tle1": "1 24870U 97034B 10301.40154518 .00000156 00000-0 48296-4 0 2490",
1007+ "tle2": "2 24870 86.3935 314.6658 0002199 76.6525 283.4917 14.34512721696546",
1008 "visible": false
1009 },
1010 "IRIDIUM 18":
1011 {
1012- "description": "Iridium 18",
1013+ "comms": [],
1014 "groups": ["iridium", "communications"],
1015- "tle1": "1 24872U 97034D 09080.86727066 .00000184 00000-0 58625-4 0 5567",
1016- "tle2": "2 24872 86.4003 199.6099 0002454 81.7604 278.3867 14.34217527612589",
1017- "draw_orbit": false,
1018+ "orbitColor": [0, 0, 0],
1019+ "orbitVisible": false,
1020+ "tle1": "1 24872U 97034D 10301.50413725 .00000004 00000-0 -56993-5 0 2443",
1021+ "tle2": "2 24872 86.3931 314.9668 0002380 81.5831 278.5648 14.34219073696523",
1022 "visible": false
1023 },
1024 "IRIDIUM 19":
1025 {
1026- "description": "Iridium 19",
1027+ "comms": [],
1028 "groups": ["iridium", "communications"],
1029- "tle1": "1 24965U 97056A 09080.72718535 .00000100 00000-0 28631-4 0 5236",
1030- "tle2": "2 24965 86.3996 136.4806 0002460 90.2603 269.8873 14.34219384601200",
1031- "draw_orbit": false,
1032+ "orbitColor": [0, 0, 0],
1033+ "orbitVisible": false,
1034+ "tle1": "1 24965U 97056A 10301.50366897 .00000088 00000-0 24442-4 0 2104",
1035+ "tle2": "2 24965 86.3935 251.5975 0002482 84.1741 275.9721 14.34218772685165",
1036 "visible": false
1037 },
1038 "IRIDIUM 2":
1039 {
1040- "description": "Iridium 2",
1041+ "comms": [],
1042 "groups": ["iridium", "communications"],
1043- "tle1": "1 25527U 98066A 09080.75555857 .00000044 00000-0 94123-6 0 8457",
1044- "tle2": "2 25527 85.5654 330.3309 0011200 129.4966 230.7244 14.97948645565148",
1045- "draw_orbit": false,
1046+ "orbitColor": [0, 0, 0],
1047+ "orbitVisible": false,
1048+ "tle1": "1 25527U 98066A 10301.18691019 .00001380 00000-0 11268-3 0 6125",
1049+ "tle2": "2 25527 85.5646 356.9509 0008409 198.8268 161.2649 14.98527668652791",
1050 "visible": false
1051 },
1052 "IRIDIUM 20":
1053 {
1054- "description": "Iridium 20",
1055+ "comms": [],
1056 "groups": ["iridium", "communications"],
1057- "tle1": "1 25577U 98074A 09080.98033202 -.00000021 00000-0 -14422-4 0 3714",
1058- "tle2": "2 25577 86.3904 73.1381 0002452 79.1409 281.0061 14.34214985537121",
1059- "draw_orbit": false,
1060+ "orbitColor": [0, 0, 0],
1061+ "orbitVisible": false,
1062+ "tle1": "1 25577U 98074A 10301.40802733 -.00001014 00000-0 -36937-3 0 503",
1063+ "tle2": "2 25577 86.3993 188.4413 0002307 83.6228 276.5230 14.34213135621030",
1064 "visible": false
1065 },
1066 "IRIDIUM 21":
1067 {
1068- "description": "Iridium 21",
1069+ "comms": [],
1070 "groups": ["iridium", "communications"],
1071- "tle1": "1 25778U 99032B 09080.93260961 .00000088 00000-0 24407-4 0 4289",
1072- "tle2": "2 25778 86.3940 41.6568 0001858 135.0959 225.0387 14.34213303516794",
1073- "draw_orbit": false,
1074+ "orbitColor": [0, 0, 0],
1075+ "orbitVisible": false,
1076+ "tle1": "1 25778U 99032B 10301.36016290 .00000109 00000-0 32005-4 0 1215",
1077+ "tle2": "2 25778 86.3966 157.0456 0004285 90.1310 270.0372 14.34223335600704",
1078 "visible": false
1079 },
1080 "IRIDIUM 22":
1081 {
1082- "description": "Iridium 22",
1083+ "comms": [],
1084 "groups": ["iridium", "communications"],
1085- "tle1": "1 24907U 97043E 09080.93593228 .00000038 00000-0 64008-5 0 5443",
1086- "tle2": "2 24907 86.3913 73.5164 0002428 76.7490 283.3976 14.34215296606512",
1087- "draw_orbit": false,
1088+ "orbitColor": [0, 0, 0],
1089+ "orbitVisible": false,
1090+ "tle1": "1 24907U 97043E 10301.36362755 .00000137 00000-0 41923-4 0 2275",
1091+ "tle2": "2 24907 86.4005 188.8880 0002341 81.1379 279.0079 14.34216367690429",
1092 "visible": false
1093 },
1094 "IRIDIUM 23":
1095 {
1096- "description": "Iridium 23",
1097+ "comms": [],
1098 "groups": ["iridium", "communications"],
1099- "tle1": "1 24906U 97043D 09080.94227688 .00000036 00000-0 58894-5 0 5744",
1100- "tle2": "2 24906 86.3894 73.1318 0002472 82.1303 278.0178 14.34215338606511",
1101- "draw_orbit": false,
1102+ "orbitColor": [0, 0, 0],
1103+ "orbitVisible": false,
1104+ "tle1": "1 24906U 97043D 10301.43972938 .00000175 00000-0 55359-4 0 2597",
1105+ "tle2": "2 24906 86.3999 188.3968 0002284 78.4691 281.6760 14.34218288690434",
1106 "visible": false
1107 },
1108 "IRIDIUM 24":
1109 {
1110- "description": "Iridium 24",
1111+ "comms": [],
1112 "groups": ["iridium", "communications"],
1113- "tle1": "1 25105U 97082B 09080.88485856 .00000094 00000-0 24467-4 0 1226",
1114- "tle2": "2 25105 86.3868 64.1686 0012063 143.9347 216.2672 14.38254916590102",
1115- "draw_orbit": false,
1116+ "orbitColor": [0, 0, 0],
1117+ "orbitVisible": false,
1118+ "tle1": "1 25105U 97082B 10301.18083982 .00000179 00000-0 52087-4 0 7624",
1119+ "tle2": "2 25105 86.3964 177.7006 0013578 41.4370 318.7856 14.38367245674235",
1120 "visible": false
1121 },
1122 "IRIDIUM 25":
1123 {
1124- "description": "Iridium 25",
1125+ "comms": [],
1126 "groups": ["iridium", "communications"],
1127- "tle1": "1 24904U 97043B 09080.95495998 .00000045 00000-0 90546-5 0 5564",
1128- "tle2": "2 24904 86.3902 73.1904 0002447 79.4878 280.6605 14.34215301606501",
1129- "draw_orbit": false,
1130+ "orbitColor": [0, 0, 0],
1131+ "orbitVisible": false,
1132+ "tle1": "1 24904U 97043B 10301.31288895 -.00000306 00000-0 -11639-3 0 2415",
1133+ "tle2": "2 24904 86.3986 188.5237 0002349 81.6978 278.4538 14.34214579690408",
1134 "visible": false
1135 },
1136 "IRIDIUM 26":
1137 {
1138- "description": "Iridium 26",
1139+ "comms": [],
1140 "groups": ["iridium", "communications"],
1141- "tle1": "1 24903U 97043A 09080.92325319 .00000061 00000-0 14603-4 0 6635",
1142- "tle2": "2 24903 86.3905 73.2530 0002433 79.3191 280.8286 14.34215067606530",
1143- "draw_orbit": false,
1144+ "orbitColor": [0, 0, 0],
1145+ "orbitVisible": false,
1146+ "tle1": "1 24903U 97043A 10301.28117716 -.00000455 00000-0 -16970-3 0 3502",
1147+ "tle2": "2 24903 86.3991 188.5961 0002453 79.9332 280.2207 14.34214020690435",
1148 "visible": false
1149 },
1150 "IRIDIUM 28":
1151 {
1152- "description": "Iridium 28",
1153+ "comms": [],
1154 "groups": ["iridium", "communications"],
1155- "tle1": "1 24948U 97051E 09080.72766345 -.00000012 00000-0 -11441-4 0 3800",
1156- "tle2": "2 24948 86.3924 105.0922 0002660 74.1790 285.9694 14.34248276603049",
1157- "draw_orbit": false,
1158+ "orbitColor": [0, 0, 0],
1159+ "orbitVisible": false,
1160+ "tle1": "1 24948U 97051E 10301.33479639 .00000180 00000-0 57176-4 0 864",
1161+ "tle2": "2 24948 86.3985 220.2483 0001878 79.3904 280.7492 14.34341723686986",
1162 "visible": false
1163 },
1164 "IRIDIUM 29":
1165 {
1166- "description": "Iridium 29",
1167+ "comms": [],
1168 "groups": ["iridium", "communications"],
1169- "tle1": "1 24944U 97051A 09080.73641357 -.00000048 00000-0 -24213-4 0 5196",
1170- "tle2": "2 24944 86.3928 104.9291 0002412 84.1606 275.9868 14.34217590603056",
1171- "draw_orbit": false,
1172+ "orbitColor": [0, 0, 0],
1173+ "orbitVisible": false,
1174+ "tle1": "1 24944U 97051A 10301.30362042 -.00000646 00000-0 -23779-3 0 1935",
1175+ "tle2": "2 24944 86.3978 220.1102 0002370 78.2191 281.9265 14.34214060686989",
1176 "visible": false
1177 },
1178 "IRIDIUM 3":
1179 {
1180- "description": "Iridium 3",
1181+ "comms": [],
1182 "groups": ["iridium", "communications"],
1183- "tle1": "1 25431U 98048A 09080.92959394 .00000063 00000-0 15480-4 0 4481",
1184- "tle2": "2 25431 86.3903 73.3431 0002965 84.2311 275.9229 14.34215319554292",
1185- "draw_orbit": false,
1186+ "orbitColor": [0, 0, 0],
1187+ "orbitVisible": false,
1188+ "tle1": "1 25431U 98048A 10301.28751827 -.00001140 00000-0 -41424-3 0 1335",
1189+ "tle2": "2 25431 86.3996 188.7028 0002503 69.5365 290.6101 14.34213818638197",
1190 "visible": false
1191 },
1192 "IRIDIUM 30":
1193 {
1194- "description": "Iridium 30",
1195+ "comms": [],
1196 "groups": ["iridium", "communications"],
1197- "tle1": "1 24949U 97051F 09080.60956429 -.00000118 00000-0 -49226-4 0 5599",
1198- "tle2": "2 24949 86.3918 105.0480 0002502 87.1679 272.9801 14.34216956603032",
1199- "draw_orbit": false,
1200+ "orbitColor": [0, 0, 0],
1201+ "orbitVisible": false,
1202+ "tle1": "1 24949U 97051F 10301.31630586 -.00000935 00000-0 -34102-3 0 2521",
1203+ "tle2": "2 24949 86.3982 220.1828 0002394 80.5741 279.5722 14.34212081686989",
1204 "visible": false
1205 },
1206 "IRIDIUM 31":
1207 {
1208- "description": "Iridium 31",
1209+ "comms": [],
1210 "groups": ["iridium", "communications"],
1211- "tle1": "1 24950U 97051G 09080.95206580 .00000006 00000-0 -50967-5 0 5472",
1212- "tle2": "2 24950 86.3926 104.8960 0002452 82.6436 277.5040 14.34217229603094",
1213- "draw_orbit": false,
1214+ "orbitColor": [0, 0, 0],
1215+ "orbitVisible": false,
1216+ "tle1": "1 24950U 97051G 10301.44950136 -.00001083 00000-0 -39397-3 0 2226",
1217+ "tle2": "2 24950 86.3981 220.1240 0002426 81.3268 278.8198 14.34210867687011",
1218 "visible": false
1219 },
1220 "IRIDIUM 32":
1221 {
1222- "description": "Iridium 32",
1223+ "comms": [],
1224 "groups": ["iridium", "communications"],
1225- "tle1": "1 24945U 97051B 09080.82521335 -.00000034 00000-0 -19243-4 0 5260",
1226- "tle2": "2 24945 86.3920 104.9062 0002420 86.0555 274.0934 14.34217114603087",
1227- "draw_orbit": false,
1228+ "orbitColor": [0, 0, 0],
1229+ "orbitVisible": false,
1230+ "tle1": "1 24945U 97051B 10301.39241707 -.00000905 00000-0 -33044-3 0 2114",
1231+ "tle2": "2 24945 86.3976 220.0911 0002352 78.3319 281.8123 14.34212503687015",
1232 "visible": false
1233 },
1234 "IRIDIUM 33":
1235 {
1236- "description": "Iridium 33",
1237+ "comms": [],
1238 "groups": ["iridium", "communications"],
1239- "tle1": "1 24946U 97051C 09079.48224177 .00000050 00000-0 11256-4 0 5548",
1240- "tle2": "2 24946 86.3829 105.5030 0007498 339.0307 21.0569 14.32470536602871",
1241- "draw_orbit": false,
1242+ "orbitColor": [0, 0, 0],
1243+ "orbitVisible": false,
1244+ "tle1": "1 24946U 97051C 10301.30780396 .00000103 00000-0 30874-4 0 3307",
1245+ "tle2": "2 24946 86.3895 220.2555 0006786 199.2047 160.8908 14.32545186686906",
1246 "visible": false
1247 },
1248 "IRIDIUM 34":
1249 {
1250- "description": "Iridium 34",
1251+ "comms": [],
1252 "groups": ["iridium", "communications"],
1253- "tle1": "1 24969U 97056E 09080.66375773 .00000143 00000-0 44096-4 0 5214",
1254- "tle2": "2 24969 86.3985 136.5744 0002407 86.3781 273.7691 14.34219875601171",
1255- "draw_orbit": false,
1256+ "orbitColor": [0, 0, 0],
1257+ "orbitVisible": false,
1258+ "tle1": "1 24969U 97056E 10301.37047500 .00000133 00000-0 40499-4 0 2044",
1259+ "tle2": "2 24969 86.3933 251.7300 0002471 80.8760 279.2726 14.34219098685123",
1260 "visible": false
1261 },
1262 "IRIDIUM 35":
1263 {
1264- "description": "Iridium 35",
1265+ "comms": [],
1266 "groups": ["iridium", "communications"],
1267- "tle1": "1 24966U 97056B 09080.73987018 .00000085 00000-0 23358-4 0 5695",
1268- "tle2": "2 24966 86.3976 136.5004 0002426 88.2177 271.9296 14.34219553601183",
1269- "draw_orbit": false,
1270+ "orbitColor": [0, 0, 0],
1271+ "orbitVisible": false,
1272+ "tle1": "1 24966U 97056B 10301.51635596 -.00000385 00000-0 -14474-3 0 2533",
1273+ "tle2": "2 24966 86.3937 251.6122 0002532 80.6792 279.4757 14.34211428685143",
1274 "visible": false
1275 },
1276 "IRIDIUM 36":
1277 {
1278- "description": "Iridium 36",
1279+ "comms": [],
1280 "groups": ["iridium", "communications"],
1281- "tle1": "1 24967U 97056C 09080.65710171 -.00000019 00000-0 -13689-4 0 4998",
1282- "tle2": "2 24967 86.3983 136.6024 0002458 82.4670 277.6800 14.34287200601317",
1283- "draw_orbit": false,
1284+ "orbitColor": [0, 0, 0],
1285+ "orbitVisible": false,
1286+ "tle1": "1 24967U 97056C 10301.39302625 .00000131 00000-0 39626-4 0 1997",
1287+ "tle2": "2 24967 86.3966 251.7390 0002309 86.5090 273.6383 14.34359852685271",
1288 "visible": false
1289 },
1290 "IRIDIUM 37":
1291 {
1292- "description": "Iridium 37",
1293+ "comms": [],
1294 "groups": ["iridium", "communications"],
1295- "tle1": "1 24968U 97056D 09080.71450005 .00000098 00000-0 28096-4 0 5346",
1296- "tle2": "2 24968 86.3999 136.6077 0002361 87.7484 272.3982 14.34219477601186",
1297- "draw_orbit": false,
1298+ "orbitColor": [0, 0, 0],
1299+ "orbitVisible": false,
1300+ "tle1": "1 24968U 97056D 10301.35144457 .00000056 00000-0 12992-4 0 2210",
1301+ "tle2": "2 24968 86.3939 251.7957 0002427 84.6546 275.4959 14.34213228685126",
1302 "visible": false
1303 },
1304 "IRIDIUM 38":
1305 {
1306- "description": "Iridium 38",
1307+ "comms": [],
1308 "groups": ["iridium", "communications"],
1309- "tle1": "1 25043U 97069E 09080.84584675 .00000189 00000-0 59905-4 0 5412",
1310- "tle2": "2 25043 86.3999 198.9627 0003100 65.2494 294.9020 14.34689502595081",
1311- "draw_orbit": false,
1312+ "orbitColor": [0, 0, 0],
1313+ "orbitVisible": false,
1314+ "tle1": "1 25043U 97069E 10301.48572705 .00000131 00000-0 39291-4 0 2310",
1315+ "tle2": "2 25043 86.3930 314.0819 0001612 70.0722 290.0660 14.34770701679053",
1316 "visible": false
1317 },
1318 "IRIDIUM 39":
1319 {
1320- "description": "Iridium 39",
1321+ "comms": [],
1322 "groups": ["iridium", "communications"],
1323- "tle1": "1 25042U 97069D 09080.81653387 .00000186 00000-0 59194-4 0 5120",
1324- "tle2": "2 25042 86.4012 199.6847 0002432 78.6189 281.5268 14.34217041594973",
1325- "draw_orbit": false,
1326+ "orbitColor": [0, 0, 0],
1327+ "orbitVisible": false,
1328+ "tle1": "1 25042U 97069D 10301.38362828 .00000037 00000-0 61418-5 0 2065",
1329+ "tle2": "2 25042 86.3939 315.1128 0002183 83.4944 276.6508 14.34218237678909",
1330 "visible": false
1331 },
1332 "IRIDIUM 4":
1333 {
1334- "description": "Iridium 4",
1335+ "comms": [],
1336 "groups": ["iridium", "communications"],
1337- "tle1": "1 24796U 97020E 09080.70815717 .00000117 00000-0 34873-4 0 5689",
1338- "tle2": "2 24796 86.3992 136.4182 0002479 84.7507 275.3970 14.34219551621866",
1339- "draw_orbit": false,
1340+ "orbitColor": [0, 0, 0],
1341+ "orbitVisible": false,
1342+ "tle1": "1 24796U 97020E 10301.48464559 .00000171 00000-0 53914-4 0 2512",
1343+ "tle2": "2 24796 86.3930 251.5109 0002496 78.1753 281.9709 14.34218964705824",
1344 "visible": false
1345 },
1346 "IRIDIUM 40":
1347 {
1348- "description": "Iridium 40",
1349+ "comms": [],
1350 "groups": ["iridium", "communications"],
1351- "tle1": "1 25041U 97069C 09080.87997502 .00000177 00000-0 56017-4 0 5384",
1352- "tle2": "2 25041 86.4003 199.5053 0002277 80.7998 279.3453 14.34217086595004",
1353- "draw_orbit": false,
1354+ "orbitColor": [0, 0, 0],
1355+ "orbitVisible": false,
1356+ "tle1": "1 25041U 97069C 10301.51682757 .00000049 00000-0 10364-4 0 2285",
1357+ "tle2": "2 25041 86.3934 314.8434 0002403 85.3762 274.7711 14.34219119678942",
1358 "visible": false
1359 },
1360 "IRIDIUM 41":
1361 {
1362- "description": "Iridium 41",
1363+ "comms": [],
1364 "groups": ["iridium", "communications"],
1365- "tle1": "1 25040U 97069B 09080.85461500 .00000190 00000-0 60760-4 0 5122",
1366- "tle2": "2 25040 86.4003 199.5463 0002248 80.0849 280.0599 14.34216855594983",
1367- "draw_orbit": false,
1368+ "orbitColor": [0, 0, 0],
1369+ "orbitVisible": false,
1370+ "tle1": "1 25040U 97069B 10301.49145091 .00000021 00000-0 37710-6 0 2024",
1371+ "tle2": "2 25040 86.3928 314.8920 0002308 74.9331 285.2131 14.34219357678929",
1372 "visible": false
1373 },
1374 "IRIDIUM 42":
1375 {
1376- "description": "Iridium 42",
1377+ "comms": [],
1378 "groups": ["iridium", "communications"],
1379- "tle1": "1 25077U 97077A 09080.94340195 .00000110 00000-0 32067-4 0 5274",
1380- "tle2": "2 25077 86.3994 199.5528 0002240 84.0668 276.0780 14.34216755590856",
1381- "draw_orbit": false,
1382+ "orbitColor": [0, 0, 0],
1383+ "orbitVisible": false,
1384+ "tle1": "1 25077U 97077A 10301.51048518 .00000012 00000-0 -27886-5 0 2238",
1385+ "tle2": "2 25077 86.3933 314.9318 0002374 85.5992 274.5489 14.34219003674786",
1386 "visible": false
1387 },
1388 "IRIDIUM 43":
1389 {
1390- "description": "Iridium 43",
1391+ "comms": [],
1392 "groups": ["iridium", "communications"],
1393- "tle1": "1 25039U 97069A 09080.86094029 .00000205 00000-0 66131-4 0 5236",
1394- "tle2": "2 25039 86.4004 199.6307 0002233 83.8211 276.3235 14.34217273594988",
1395- "draw_orbit": false,
1396+ "orbitColor": [0, 0, 0],
1397+ "orbitVisible": false,
1398+ "tle1": "1 25039U 97069A 10301.49779840 .00000009 00000-0 -39060-5 0 2135",
1399+ "tle2": "2 25039 86.3934 314.9917 0002408 81.0220 279.1261 14.34219096678924",
1400 "visible": false
1401 },
1402 "IRIDIUM 44":
1403 {
1404- "description": "Iridium 44",
1405+ "comms": [],
1406 "groups": ["iridium", "communications"],
1407- "tle1": "1 25078U 97077B 09080.71935762 .00000118 00000-0 33304-4 0 717",
1408- "tle2": "2 25078 86.4006 195.3112 0003942 66.7305 293.4317 14.36538090591378",
1409- "draw_orbit": false,
1410+ "orbitColor": [0, 0, 0],
1411+ "orbitVisible": false,
1412+ "tle1": "1 25078U 97077B 10301.43391839 .00000158 00000-0 46896-4 0 7053",
1413+ "tle2": "2 25078 86.3948 309.6718 0001443 21.3821 338.7429 14.36659332675461",
1414 "visible": false
1415 },
1416 "IRIDIUM 45":
1417 {
1418- "description": "Iridium 45",
1419+ "comms": [],
1420 "groups": ["iridium", "communications"],
1421- "tle1": "1 25104U 97082A 09080.96130432 -.00000044 00000-0 -22820-4 0 4750",
1422- "tle2": "2 25104 86.3894 73.2144 0002470 84.6910 275.4577 14.34215008589056",
1423- "draw_orbit": false,
1424+ "orbitColor": [0, 0, 0],
1425+ "orbitVisible": false,
1426+ "tle1": "1 25104U 97082A 10301.24946346 -.00001076 00000-0 -39134-3 0 1554",
1427+ "tle2": "2 25104 86.3988 188.5603 0002315 82.0799 278.0695 14.34212715672948",
1428 "visible": false
1429 },
1430 "IRIDIUM 46":
1431 {
1432- "description": "Iridium 46",
1433+ "comms": [],
1434 "groups": ["iridium", "communications"],
1435- "tle1": "1 24905U 97043C 09080.96764942 .00000030 00000-0 35050-5 0 5691",
1436- "tle2": "2 24905 86.3912 73.4590 0002447 80.6193 279.5279 14.34215070606519",
1437- "draw_orbit": false,
1438+ "orbitColor": [0, 0, 0],
1439+ "orbitVisible": false,
1440+ "tle1": "1 24905U 97043C 10301.25580518 -.00000150 00000-0 -60680-4 0 2649",
1441+ "tle2": "2 24905 86.4001 188.8750 0002431 82.1446 278.0076 14.34215312690408",
1442 "visible": false
1443 },
1444 "IRIDIUM 47":
1445 {
1446- "description": "Iridium 47",
1447+ "comms": [],
1448 "groups": ["iridium", "communications"],
1449- "tle1": "1 25106U 97082C 09080.97398853 .00000111 00000-0 32561-4 0 4695",
1450- "tle2": "2 25106 86.3898 73.1510 0002484 79.6182 280.5287 14.34215564589050",
1451- "draw_orbit": false,
1452+ "orbitColor": [0, 0, 0],
1453+ "orbitVisible": false,
1454+ "tle1": "1 25106U 97082C 10301.54122237 -.00000281 00000-0 -10746-3 0 1504",
1455+ "tle2": "2 25106 86.4001 188.3780 0002427 77.6559 282.4918 14.34214589672981",
1456 "visible": false
1457 },
1458 "IRIDIUM 49":
1459 {
1460- "description": "Iridium 49",
1461+ "comms": [],
1462 "groups": ["iridium", "communications"],
1463- "tle1": "1 25108U 97082E 09080.98667654 .00000065 00000-0 16281-4 0 4875",
1464- "tle2": "2 25108 86.3903 73.1642 0002478 78.6020 281.5453 14.34215226589060",
1465- "draw_orbit": false,
1466+ "orbitColor": [0, 0, 0],
1467+ "orbitVisible": false,
1468+ "tle1": "1 25108U 97082E 10301.27483287 -.00001099 00000-0 -39961-3 0 1699",
1469+ "tle2": "2 25108 86.3989 188.5250 0002347 83.1310 277.0152 14.34214115672951",
1470 "visible": false
1471 },
1472 "IRIDIUM 5":
1473 {
1474- "description": "Iridium 5",
1475+ "comms": [],
1476 "groups": ["iridium", "communications"],
1477- "tle1": "1 24795U 97020D 09080.75255433 .00000063 00000-0 15294-4 0 6795",
1478- "tle2": "2 24795 86.3980 136.7732 0002993 61.1224 299.0272 14.34219542621938",
1479- "draw_orbit": false,
1480+ "orbitColor": [0, 0, 0],
1481+ "orbitVisible": false,
1482+ "tle1": "1 24795U 97020D 10301.38957589 .00000124 00000-0 37398-4 0 3955",
1483+ "tle2": "2 24795 86.3931 251.9381 0001043 80.5962 279.5368 14.34217681705870",
1484 "visible": false
1485 },
1486 "IRIDIUM 50":
1487 {
1488- "description": "Iridium 50",
1489+ "comms": [],
1490 "groups": ["iridium", "communications"],
1491- "tle1": "1 25172U 98010D 09080.79408766 .00000199 00000-0 63929-4 0 5098",
1492- "tle2": "2 25172 86.4035 168.0271 0002291 84.7609 275.3846 14.34216501580429",
1493- "draw_orbit": false,
1494+ "orbitColor": [0, 0, 0],
1495+ "orbitVisible": false,
1496+ "tle1": "1 25172U 98010D 10301.50072644 .00000034 00000-0 52070-5 0 2010",
1497+ "tle2": "2 25172 86.3915 283.2603 0002516 84.0356 276.1131 14.34216379664372",
1498 "visible": false
1499 },
1500 "IRIDIUM 51":
1501 {
1502- "description": "Iridium 51",
1503+ "comms": [],
1504 "groups": ["iridium", "communications"],
1505- "tle1": "1 25262U 98018A 09080.96019622 .00000083 00000-0 18843-4 0 6047",
1506- "tle2": "2 25262 86.4521 136.5459 0002506 88.2627 271.8861 14.42963543578794",
1507- "draw_orbit": false,
1508+ "orbitColor": [0, 0, 0],
1509+ "orbitVisible": false,
1510+ "tle1": "1 25262U 98018A 10301.38405275 .00000217 00000-0 58884-4 0 2981",
1511+ "tle2": "2 25262 86.4450 251.8827 0002519 77.4188 282.7311 14.42949049663219",
1512 "visible": false
1513 },
1514 "IRIDIUM 52":
1515 {
1516- "description": "Iridium 52",
1517+ "comms": [],
1518 "groups": ["iridium", "communications"],
1519- "tle1": "1 25169U 98010A 09080.73700209 .00000123 00000-0 36961-4 0 2624",
1520- "tle2": "2 25169 86.4038 168.0762 0002354 85.6372 274.5081 14.34216423580436",
1521- "draw_orbit": false,
1522+ "orbitColor": [0, 0, 0],
1523+ "orbitVisible": false,
1524+ "tle1": "1 25169U 98010A 10301.51340845 -.00000026 00000-0 -16458-4 0 9512",
1525+ "tle2": "2 25169 86.3919 283.2800 0002428 86.1036 274.0443 14.34216393664392",
1526 "visible": false
1527 },
1528 "IRIDIUM 53":
1529 {
1530- "description": "Iridium 53",
1531+ "comms": [],
1532 "groups": ["iridium", "communications"],
1533- "tle1": "1 25173U 98010E 09080.74334661 .00000213 00000-0 68921-4 0 4965",
1534- "tle2": "2 25173 86.4038 168.0584 0002328 85.4274 274.7179 14.34216418580426",
1535- "draw_orbit": false,
1536+ "orbitColor": [0, 0, 0],
1537+ "orbitVisible": false,
1538+ "tle1": "1 25173U 98010E 10301.38021403 -.00000015 00000-0 -12587-4 0 1854",
1539+ "tle2": "2 25173 86.3913 283.3189 0002495 82.8733 277.2753 14.34216408664366",
1540 "visible": false
1541 },
1542 "IRIDIUM 54":
1543 {
1544- "description": "Iridium 54",
1545+ "comms": [],
1546 "groups": ["iridium", "communications"],
1547- "tle1": "1 25171U 98010C 09080.83214435 .00000162 00000-0 50776-4 0 4950",
1548- "tle2": "2 25171 86.4034 168.0396 0002357 83.7922 276.3539 14.34216177580592",
1549- "draw_orbit": false,
1550+ "orbitColor": [0, 0, 0],
1551+ "orbitVisible": false,
1552+ "tle1": "1 25171U 98010C 10301.39924441 -.00000011 00000-0 -11061-4 0 1769",
1553+ "tle2": "2 25171 86.3919 283.3345 0002424 83.5338 276.6130 14.34216421664520",
1554 "visible": false
1555 },
1556 "IRIDIUM 55":
1557 {
1558- "description": "Iridium 55",
1559+ "comms": [],
1560 "groups": ["iridium", "communications"],
1561- "tle1": "1 25272U 98019A 09080.65396145 -.00000055 00000-0 -26585-4 0 4460",
1562- "tle2": "2 25272 86.3929 104.9099 0002443 82.6744 277.4726 14.34217346574706",
1563- "draw_orbit": false,
1564+ "orbitColor": [0, 0, 0],
1565+ "orbitVisible": false,
1566+ "tle1": "1 25272U 98019A 10301.29093539 -.00000972 00000-0 -35442-3 0 1320",
1567+ "tle2": "2 25272 86.3977 220.0601 0002338 82.5159 277.6284 14.34211332658646",
1568 "visible": false
1569 },
1570 "IRIDIUM 56":
1571 {
1572- "description": "Iridium 56",
1573+ "comms": [],
1574 "groups": ["iridium", "communications"],
1575- "tle1": "1 25170U 98010B 09080.93996768 .00000090 00000-0 25013-4 0 4042",
1576- "tle2": "2 25170 86.4019 168.0354 0002303 83.3803 276.7656 14.34215986580448",
1577- "draw_orbit": false,
1578+ "orbitColor": [0, 0, 0],
1579+ "orbitVisible": false,
1580+ "tle1": "1 25170U 98010B 10301.43729637 -.00000028 00000-0 -17004-4 0 5746",
1581+ "tle2": "2 25170 86.3908 283.3687 0002487 85.4859 274.6628 14.34216414664368",
1582 "visible": false
1583 },
1584 "IRIDIUM 57":
1585 {
1586- "description": "Iridium 57",
1587+ "comms": [],
1588 "groups": ["iridium", "communications"],
1589- "tle1": "1 25273U 98019B 09080.97743384 .00000010 00000-0 -34515-5 0 4842",
1590- "tle2": "2 25273 86.3938 104.9487 0002488 81.4053 278.7428 14.34217528574757",
1591- "draw_orbit": false,
1592+ "orbitColor": [0, 0, 0],
1593+ "orbitVisible": false,
1594+ "tle1": "1 25273U 98019B 10301.33533499 -.00001235 00000-0 -44805-3 0 1775",
1595+ "tle2": "2 25273 86.3978 220.2411 0002411 79.3416 280.8052 14.34209304658657",
1596 "visible": false
1597 },
1598 "IRIDIUM 58":
1599 {
1600- "description": "Iridium 58",
1601+ "comms": [],
1602 "groups": ["iridium", "communications"],
1603- "tle1": "1 25274U 98019C 09080.56516741 -.00000072 00000-0 -32690-4 0 2919",
1604- "tle2": "2 25274 86.3927 105.2286 0002529 81.2320 278.9159 14.34216858574699",
1605- "draw_orbit": false,
1606+ "orbitColor": [0, 0, 0],
1607+ "orbitVisible": false,
1608+ "tle1": "1 25274U 98019C 10301.34167667 -.00001005 00000-0 -36595-3 0 9834",
1609+ "tle2": "2 25274 86.3983 220.3638 0002407 77.7622 282.3841 14.34211663658656",
1610 "visible": false
1611 },
1612 "IRIDIUM 59":
1613 {
1614- "description": "Iridium 59",
1615+ "comms": [],
1616 "groups": ["iridium", "communications"],
1617- "tle1": "1 25275U 98019D 09080.92035227 -.00000093 00000-0 -40264-4 0 1373",
1618- "tle2": "2 25275 86.3948 105.0965 0002450 63.6517 296.4931 14.34216674574745",
1619- "draw_orbit": false,
1620+ "orbitColor": [0, 0, 0],
1621+ "orbitVisible": false,
1622+ "tle1": "1 25275U 98019D 10301.48755396 -.00000215 00000-0 -83874-4 0 8195",
1623+ "tle2": "2 25275 86.3977 220.2862 0002621 62.6138 297.5324 14.34212109658673",
1624 "visible": false
1625 },
1626 "IRIDIUM 6":
1627 {
1628- "description": "Iridium 6",
1629+ "comms": [],
1630 "groups": ["iridium", "communications"],
1631- "tle1": "1 24794U 97020C 09080.68913056 .00000120 00000-0 35767-4 0 3460",
1632- "tle2": "2 24794 86.4005 136.6398 0002655 84.7222 275.4275 14.34219576621845",
1633- "draw_orbit": false,
1634+ "orbitColor": [0, 0, 0],
1635+ "orbitVisible": false,
1636+ "tle1": "1 24794U 97020C 10301.32607453 .00000055 00000-0 12715-4 0 338",
1637+ "tle2": "2 24794 86.3937 251.8254 0002324 72.0200 288.1255 14.34218653705788",
1638 "visible": false
1639 },
1640 "IRIDIUM 60":
1641 {
1642- "description": "Iridium 60",
1643+ "comms": [],
1644 "groups": ["iridium", "communications"],
1645- "tle1": "1 25276U 98019E 09080.57785244 -.00000075 00000-0 -33997-4 0 5140",
1646- "tle2": "2 25276 86.3925 104.9765 0002456 85.4836 274.6635 14.34216941574699",
1647- "draw_orbit": false,
1648+ "orbitColor": [0, 0, 0],
1649+ "orbitVisible": false,
1650+ "tle1": "1 25276U 98019E 10301.28459325 -.00000994 00000-0 -36204-3 0 2144",
1651+ "tle2": "2 25276 86.3968 220.0866 0002365 82.9570 277.1859 14.34211540658648",
1652 "visible": false
1653 },
1654 "IRIDIUM 61":
1655 {
1656- "description": "Iridium 61",
1657+ "comms": [],
1658 "groups": ["iridium", "communications"],
1659- "tle1": "1 25263U 98018B 09080.65107557 .00000022 00000-0 88117-6 0 4504",
1660- "tle2": "2 25263 86.4005 136.6114 0002427 83.6921 276.4543 14.34219094575509",
1661- "draw_orbit": false,
1662+ "orbitColor": [0, 0, 0],
1663+ "orbitVisible": false,
1664+ "tle1": "1 25263U 98018B 10301.35780410 .00000113 00000-0 33114-4 0 1428",
1665+ "tle2": "2 25263 86.3928 251.7666 0002448 80.9880 279.1602 14.34218616659452",
1666 "visible": false
1667 },
1668 "IRIDIUM 62":
1669 {
1670- "description": "Iridium 62",
1671+ "comms": [],
1672 "groups": ["iridium", "communications"],
1673- "tle1": "1 25285U 98021A 09080.95798294 .00000157 00000-0 49153-4 0 4806",
1674- "tle2": "2 25285 86.3937 41.6021 0002403 80.9094 279.2370 14.34213398573703",
1675- "draw_orbit": false,
1676+ "orbitColor": [0, 0, 0],
1677+ "orbitVisible": false,
1678+ "tle1": "1 25285U 98021A 10301.17622834 .00000069 00000-0 17456-4 0 1792",
1679+ "tle2": "2 25285 86.3970 157.0768 0002305 82.5068 277.6381 14.34223177657589",
1680 "visible": false
1681 },
1682 "IRIDIUM 63":
1683 {
1684- "description": "Iridium 63",
1685+ "comms": [],
1686 "groups": ["iridium", "communications"],
1687- "tle1": "1 25286U 98021B 09080.96432934 .00000129 00000-0 39109-4 0 4926",
1688- "tle2": "2 25286 86.3940 41.6827 0002432 80.3005 279.8464 14.34213273573702",
1689- "draw_orbit": false,
1690+ "orbitColor": [0, 0, 0],
1691+ "orbitVisible": false,
1692+ "tle1": "1 25286U 98021B 10301.53141413 .00000143 00000-0 44086-4 0 1918",
1693+ "tle2": "2 25286 86.3968 157.0252 0002277 82.8855 277.2605 14.34223540657635",
1694 "visible": false
1695 },
1696 "IRIDIUM 64":
1697 {
1698- "description": "Iridium 64",
1699+ "comms": [],
1700 "groups": ["iridium", "communications"],
1701- "tle1": "1 25287U 98021C 09080.97067364 .00000097 00000-0 27550-4 0 4403",
1702- "tle2": "2 25287 86.3941 41.6185 0002444 79.6780 280.4691 14.34213124573687",
1703- "draw_orbit": false,
1704+ "orbitColor": [0, 0, 0],
1705+ "orbitVisible": false,
1706+ "tle1": "1 25287U 98021C 10301.53775312 .00000146 00000-0 45003-4 0 1384",
1707+ "tle2": "2 25287 86.3969 156.9492 0002225 78.7498 281.3965 14.34223729657613",
1708 "visible": false
1709 },
1710 "IRIDIUM 65":
1711 {
1712- "description": "Iridium 65",
1713+ "comms": [],
1714 "groups": ["iridium", "communications"],
1715- "tle1": "1 25288U 98021D 09080.97701561 .00000123 00000-0 36733-4 0 4883",
1716- "tle2": "2 25288 86.3937 41.5700 0002779 77.2145 282.9359 14.34213117573708",
1717- "draw_orbit": false,
1718+ "orbitColor": [0, 0, 0],
1719+ "orbitVisible": false,
1720+ "tle1": "1 25288U 98021D 10301.54410206 .00000118 00000-0 35048-4 0 1741",
1721+ "tle2": "2 25288 86.3961 156.8925 0002160 70.7095 289.4345 14.34223186657639",
1722 "visible": false
1723 },
1724 "IRIDIUM 66":
1725 {
1726- "description": "Iridium 66",
1727+ "comms": [],
1728 "groups": ["iridium", "communications"],
1729- "tle1": "1 25289U 98021E 09080.91358909 .00000122 00000-0 36428-4 0 4444",
1730- "tle2": "2 25289 86.3935 41.5254 0002463 80.4519 279.6944 14.34213230573699",
1731- "draw_orbit": false,
1732+ "orbitColor": [0, 0, 0],
1733+ "orbitVisible": false,
1734+ "tle1": "1 25289U 98021E 10301.55043804 .00000160 00000-0 49961-4 0 1262",
1735+ "tle2": "2 25289 86.3966 156.8141 0002326 77.3563 282.7910 14.34223829657630",
1736 "visible": false
1737 },
1738 "IRIDIUM 67":
1739 {
1740- "description": "Iridium 67",
1741+ "comms": [],
1742 "groups": ["iridium", "communications"],
1743- "tle1": "1 25290U 98021F 09080.91993107 .00000097 00000-0 27599-4 0 2674",
1744- "tle2": "2 25290 86.3939 41.6124 0002412 79.5456 280.6007 14.34213091573704",
1745- "draw_orbit": false,
1746+ "orbitColor": [0, 0, 0],
1747+ "orbitVisible": false,
1748+ "tle1": "1 25290U 98021F 10301.55678822 .00000157 00000-0 49065-4 0 9571",
1749+ "tle2": "2 25290 86.3966 156.9105 0002292 81.8706 278.2758 14.34222482657649",
1750 "visible": false
1751 },
1752 "IRIDIUM 68":
1753 {
1754- "description": "Iridium 68",
1755+ "comms": [],
1756 "groups": ["iridium", "communications"],
1757- "tle1": "1 25291U 98021G 09080.92627825 .00000159 00000-0 49798-4 0 4808",
1758- "tle2": "2 25291 86.3939 41.6734 0002409 78.9035 281.2421 14.34213167573671",
1759- "draw_orbit": false,
1760+ "orbitColor": [0, 0, 0],
1761+ "orbitVisible": false,
1762+ "tle1": "1 25291U 98021G 10301.21428558 .00000022 00000-0 93324-6 0 1701",
1763+ "tle2": "2 25291 86.3975 157.1273 0002379 80.9438 279.2019 14.34222910657565",
1764 "visible": false
1765 },
1766 "IRIDIUM 69":
1767 {
1768- "description": "Iridium 69",
1769+ "comms": [],
1770 "groups": ["iridium", "communications"],
1771- "tle1": "1 25319U 98026A 09080.49486789 .00000092 00000-0 24359-4 0 3146",
1772- "tle2": "2 25319 86.3922 69.9726 0004196 68.2945 291.8696 14.37077443570581",
1773- "draw_orbit": false,
1774+ "orbitColor": [0, 0, 0],
1775+ "orbitVisible": false,
1776+ "tle1": "1 25319U 98026A 10301.20092608 .00000175 00000-0 52209-4 0 9992",
1777+ "tle2": "2 25319 86.4028 184.2023 0001667 27.0848 333.0433 14.37186299654700",
1778 "visible": false
1779 },
1780 "IRIDIUM 7":
1781 {
1782- "description": "Iridium 7",
1783+ "comms": [],
1784 "groups": ["iridium", "communications"],
1785- "tle1": "1 24793U 97020B 09080.69547303 .00000099 00000-0 28351-4 0 5488",
1786- "tle2": "2 24793 86.4007 136.6478 0002405 86.1825 273.9642 14.34219478621845",
1787- "draw_orbit": false,
1788+ "orbitColor": [0, 0, 0],
1789+ "orbitVisible": false,
1790+ "tle1": "1 24793U 97020B 10301.40220610 .00000141 00000-0 43379-4 0 2318",
1791+ "tle2": "2 24793 86.3940 251.8136 0002461 78.4314 281.7157 14.34218416705796",
1792 "visible": false
1793 },
1794 "IRIDIUM 70":
1795 {
1796- "description": "Iridium 70",
1797+ "comms": [],
1798 "groups": ["iridium", "communications"],
1799- "tle1": "1 25342U 98032A 09080.95163750 .00000131 00000-0 39568-4 0 5009",
1800- "tle2": "2 25342 86.3942 41.7657 0002391 79.7340 280.4119 14.34213490567784",
1801- "draw_orbit": false,
1802+ "orbitColor": [0, 0, 0],
1803+ "orbitVisible": false,
1804+ "tle1": "1 25342U 98032A 10301.51872847 .00000058 00000-0 13786-4 0 1900",
1805+ "tle2": "2 25342 86.3972 157.1287 0002384 75.3883 284.7578 14.34223132651711",
1806 "visible": false
1807 },
1808 "IRIDIUM 71":
1809 {
1810- "description": "Iridium 71",
1811+ "comms": [],
1812 "groups": ["iridium", "communications"],
1813- "tle1": "1 25320U 98026B 09080.50288721 .00000073 00000-0 17612-4 0 528",
1814- "tle2": "2 25320 86.3912 67.4298 0003490 107.5106 252.6473 14.37667721570864",
1815- "draw_orbit": false,
1816+ "orbitColor": [0, 0, 0],
1817+ "orbitVisible": false,
1818+ "tle1": "1 25320U 98026B 10301.38830995 .00000167 00000-0 48786-4 0 7008",
1819+ "tle2": "2 25320 86.4015 181.2578 0003918 53.2779 306.8772 14.37762656655044",
1820 "visible": false
1821 },
1822 "IRIDIUM 72":
1823 {
1824- "description": "Iridium 72",
1825+ "comms": [],
1826 "groups": ["iridium", "communications"],
1827- "tle1": "1 25343U 98032B 09080.93895920 .00000118 00000-0 35034-4 0 4894",
1828- "tle2": "2 25343 86.3940 41.5784 0002432 76.1741 283.9715 14.34213267567786",
1829- "draw_orbit": false,
1830+ "orbitColor": [0, 0, 0],
1831+ "orbitVisible": false,
1832+ "tle1": "1 25343U 98032B 10301.36650689 .00000036 00000-0 57202-5 0 1786",
1833+ "tle2": "2 25343 86.3968 156.9630 0002284 83.2424 276.9033 14.34222857651693",
1834 "visible": false
1835 },
1836 "IRIDIUM 73":
1837 {
1838- "description": "Iridium 73",
1839+ "comms": [],
1840 "groups": ["iridium", "communications"],
1841- "tle1": "1 25344U 98032C 09080.78187609 .00000124 00000-0 28464-4 0 3655",
1842- "tle2": "2 25344 86.4423 32.4179 0003011 59.8565 300.2935 14.47114841572085",
1843- "draw_orbit": false,
1844+ "orbitColor": [0, 0, 0],
1845+ "orbitVisible": false,
1846+ "tle1": "1 25344U 98032C 10301.50767954 .00000224 00000-0 55764-4 0 684",
1847+ "tle2": "2 25344 86.4424 145.7382 0001667 87.6700 272.4703 14.47231315656795",
1848 "visible": false
1849 },
1850 "IRIDIUM 74":
1851 {
1852- "description": "Iridium 74",
1853+ "comms": [],
1854 "groups": ["iridium", "communications"],
1855- "tle1": "1 25345U 98032D 09080.98077926 .00000138 00000-0 35328-4 0 5135",
1856- "tle2": "2 25345 86.4451 41.7016 0002432 79.4303 280.7170 14.42945639568815",
1857- "draw_orbit": false,
1858+ "orbitColor": [0, 0, 0],
1859+ "orbitVisible": false,
1860+ "tle1": "1 25345U 98032D 10301.19597976 .00000138 00000-0 35333-4 0 2063",
1861+ "tle2": "2 25345 86.4476 157.2241 0002407 81.1807 278.9657 14.42972666653203",
1862 "visible": false
1863 },
1864 "IRIDIUM 75":
1865 {
1866- "description": "Iridium 75",
1867+ "comms": [],
1868 "groups": ["iridium", "communications"],
1869- "tle1": "1 25346U 98032E 09080.94529799 .00000116 00000-0 34491-4 0 5150",
1870- "tle2": "2 25346 86.3944 41.7207 0002402 79.7335 280.4124 14.34213264568357",
1871- "draw_orbit": false,
1872+ "orbitColor": [0, 0, 0],
1873+ "orbitVisible": false,
1874+ "tle1": "1 25346U 98032E 10301.16354397 .00000141 00000-0 43140-4 0 2068",
1875+ "tle2": "2 25346 86.3971 157.2134 0002294 79.7958 280.3486 14.34223438652234",
1876 "visible": false
1877 },
1878 "IRIDIUM 76":
1879 {
1880- "description": "Iridium 76",
1881+ "comms": [],
1882 "groups": ["iridium", "communications"],
1883- "tle1": "1 25432U 98048B 09080.94861862 .00000054 00000-0 12145-4 0 3738",
1884- "tle2": "2 25432 86.3906 73.1863 0002300 98.0699 262.0767 14.34215369554286",
1885- "draw_orbit": false,
1886+ "orbitColor": [0, 0, 0],
1887+ "orbitVisible": false,
1888+ "tle1": "1 25432U 98048B 10301.44608460 -.00000329 00000-0 -12444-3 0 616",
1889+ "tle2": "2 25432 86.3996 188.4685 0003065 78.4615 281.6922 14.34214482638206",
1890 "visible": false
1891 },
1892 "IRIDIUM 77":
1893 {
1894- "description": "Iridium 77",
1895+ "comms": [],
1896 "groups": ["iridium", "communications"],
1897- "tle1": "1 25471U 98051E 09080.82923891 .00000100 00000-0 28744-4 0 6088",
1898- "tle2": "2 25471 86.3997 199.4609 0003163 99.7025 260.4521 14.34216514556700",
1899- "draw_orbit": false,
1900+ "orbitColor": [0, 0, 0],
1901+ "orbitVisible": false,
1902+ "tle1": "1 25471U 98051E 10301.53585330 -.00000042 00000-0 -22019-4 0 2987",
1903+ "tle2": "2 25471 86.3933 314.7363 0003080 66.1707 293.9816 14.34218805640653",
1904 "visible": false
1905 },
1906 "IRIDIUM 8":
1907 {
1908- "description": "Iridium 8",
1909+ "comms": [],
1910 "groups": ["iridium", "communications"],
1911- "tle1": "1 24792U 97020A 09080.70181317 .00000069 00000-0 17647-4 0 5504",
1912- "tle2": "2 24792 86.3985 136.5160 0002379 81.7440 278.4023 14.34219493621849",
1913- "draw_orbit": false,
1914+ "orbitColor": [0, 0, 0],
1915+ "orbitVisible": false,
1916+ "tle1": "1 24792U 97020A 10301.33878008 .00000175 00000-0 55255-4 0 2367",
1917+ "tle2": "2 24792 86.3929 251.6847 0002468 83.0522 277.0969 14.34218759705787",
1918 "visible": false
1919 },
1920 "IRIDIUM 80":
1921 {
1922- "description": "Iridium 80",
1923+ "comms": [],
1924 "groups": ["iridium", "communications"],
1925- "tle1": "1 25469U 98051C 09080.96243436 .00000071 00000-0 18286-4 0 4399",
1926- "tle2": "2 25469 86.4008 199.5241 0002317 83.5362 276.6098 14.34216358551528",
1927- "draw_orbit": false,
1928+ "orbitColor": [0, 0, 0],
1929+ "orbitVisible": false,
1930+ "tle1": "1 25469U 98051C 10301.45974671 .00000026 00000-0 23231-5 0 1296",
1931+ "tle2": "2 25469 86.3934 314.9459 0002420 84.6040 275.5434 14.34218863635448",
1932 "visible": false
1933 },
1934 "IRIDIUM 81":
1935 {
1936- "description": "Iridium 81",
1937+ "comms": [],
1938 "groups": ["iridium", "communications"],
1939- "tle1": "1 25468U 98051B 09080.84189280 .00000175 00000-0 55498-4 0 4370",
1940- "tle2": "2 25468 86.4000 199.4552 0002193 77.7791 282.3646 14.34217895551504",
1941- "draw_orbit": false,
1942+ "orbitColor": [0, 0, 0],
1943+ "orbitVisible": false,
1944+ "tle1": "1 25468U 98051B 10301.33921626 .00000059 00000-0 14111-4 0 1229",
1945+ "tle2": "2 25468 86.3933 314.8350 0002397 90.0757 270.0723 14.34221465635425",
1946 "visible": false
1947 },
1948 "IRIDIUM 82":
1949 {
1950- "description": "Iridium 82",
1951+ "comms": [],
1952 "groups": ["iridium", "communications"],
1953- "tle1": "1 25467U 98051A 09080.84826518 .00000139 00000-0 42421-4 0 6061",
1954- "tle2": "2 25467 86.3999 199.5966 0003026 75.7695 284.3832 14.34216930555283",
1955- "draw_orbit": false,
1956+ "orbitColor": [0, 0, 0],
1957+ "orbitVisible": false,
1958+ "tle1": "1 25467U 98051A 10301.48511420 .00000014 00000-0 -21688-5 0 2996",
1959+ "tle2": "2 25467 86.3932 314.9807 0001788 65.6330 294.5064 14.34218947639221",
1960 "visible": false
1961 },
1962 "IRIDIUM 83":
1963 {
1964- "description": "Iridium 83",
1965+ "comms": [],
1966 "groups": ["iridium", "communications"],
1967- "tle1": "1 25531U 98066E 09080.92094038 .00000145 00000-0 44885-4 0 4298",
1968- "tle2": "2 25531 86.4034 167.8505 0002327 86.2880 273.8578 14.34216119543038",
1969- "draw_orbit": false,
1970+ "orbitColor": [0, 0, 0],
1971+ "orbitVisible": false,
1972+ "tle1": "1 25531U 98066E 10301.48804132 .00000035 00000-0 56045-5 0 1344",
1973+ "tle2": "2 25531 86.3909 283.1112 0002508 84.1587 275.9902 14.34216451626963",
1974 "visible": false
1975 },
1976 "IRIDIUM 84":
1977 {
1978- "description": "Iridium 84",
1979+ "comms": [],
1980 "groups": ["iridium", "communications"],
1981- "tle1": "1 25530U 98066D 09080.74968891 .00000167 00000-0 52727-4 0 3189",
1982- "tle2": "2 25530 86.4031 167.9111 0002365 84.5906 275.5553 14.34216529545657",
1983- "draw_orbit": false,
1984+ "orbitColor": [0, 0, 0],
1985+ "orbitVisible": false,
1986+ "tle1": "1 25530U 98066D 10301.38654792 -.00000022 00000-0 -15073-4 0 35",
1987+ "tle2": "2 25530 86.3904 283.1224 0002478 80.5376 279.6109 14.34216504629594",
1988 "visible": false
1989 },
1990 "IRIDIUM 86":
1991 {
1992- "description": "Iridium 86",
1993+ "comms": [],
1994 "groups": ["iridium", "communications"],
1995- "tle1": "1 25528U 98066B 09080.78774334 .00000154 00000-0 47880-4 0 6551",
1996- "tle2": "2 25528 86.4010 167.7890 0003121 91.2601 268.8949 14.34216774548021",
1997- "draw_orbit": false,
1998+ "orbitColor": [0, 0, 0],
1999+ "orbitVisible": false,
2000+ "tle1": "1 25528U 98066B 10301.49439995 -.00000076 00000-0 -34290-4 0 3494",
2001+ "tle2": "2 25528 86.3905 282.9585 0002584 64.3260 295.8203 14.34214517631971",
2002 "visible": false
2003 },
2004 "IRIDIUM 90":
2005 {
2006- "description": "Iridium 90",
2007+ "comms": [],
2008 "groups": ["iridium", "communications"],
2009- "tle1": "1 27373U 02005B 09080.75759552 .00000204 00000-0 54978-4 0 9905",
2010- "tle2": "2 27373 86.4545 167.7383 0002768 294.7036 65.3870 14.42961102377382",
2011- "draw_orbit": false,
2012+ "orbitColor": [1.33587057158802e-32, 1.33611037243559e-32, 1.33635017328316e-32],
2013+ "orbitVisible": false,
2014+ "tle1": "1 27373U 02005B 10301.38944945 .00000018 00000-0 -61500-6 0 6928",
2015+ "tle2": "2 27373 86.4418 283.0115 0006587 122.1221 238.0642 14.42944996461831",
2016 "visible": false
2017 },
2018 "IRIDIUM 91":
2019 {
2020- "description": "Iridium 91",
2021+ "comms": [],
2022 "groups": ["iridium", "communications"],
2023- "tle1": "1 27372U 02005A 09080.97109062 -.00000020 00000-0 -14335-4 0 297",
2024- "tle2": "2 27372 86.3944 105.0683 0004458 24.2179 335.9227 14.34217272380315",
2025- "draw_orbit": false,
2026+ "orbitColor": [0, 0, 0],
2027+ "orbitVisible": false,
2028+ "tle1": "1 27372U 02005A 10301.32898421 -.00000869 00000-0 -31743-3 0 7196",
2029+ "tle2": "2 27372 86.3994 220.4433 0001622 210.6079 149.5009 14.34212504464217",
2030 "visible": false
2031 },
2032 "IRIDIUM 911":
2033 {
2034- "description": "Iridium 911",
2035+ "comms": [],
2036 "groups": ["iridium", "communications"],
2037- "tle1": "1 24842U 97030G 09080.72568503 .00000103 00000-0 24569-4 0 2539",
2038- "tle2": "2 24842 86.4523 170.7526 0015237 358.4789 1.6370 14.43158132618677",
2039- "draw_orbit": false,
2040+ "orbitColor": [0, 0, 0],
2041+ "orbitVisible": false,
2042+ "tle1": "1 24842U 97030G 10301.39019954 .00000179 00000-0 47092-4 0 9100",
2043+ "tle2": "2 24842 86.4409 285.8639 0013360 202.2380 157.8254 14.43279006703147",
2044 "visible": false
2045 },
2046 "IRIDIUM 914":
2047 {
2048- "description": "Iridium 914",
2049+ "comms": [],
2050 "groups": ["iridium", "communications"],
2051- "tle1": "1 24836U 97030A 09080.76183671 .00000072 00000-0 17532-4 0 1698",
2052- "tle2": "2 24836 86.3996 160.9874 0000845 77.3318 282.7979 14.37427546616467",
2053- "draw_orbit": false,
2054- "draw_orbit": false,
2055+ "orbitColor": [0, 0, 0],
2056+ "orbitVisible": false,
2057+ "tle1": "1 24836U 97030A 10301.47064822 .00000123 00000-0 34337-4 0 8180",
2058+ "tle2": "2 24836 86.3878 274.7253 0003518 99.8978 260.2622 14.37508507700605",
2059 "visible": false
2060 },
2061 "IRIDIUM 920":
2062 {
2063- "description": "Iridium 920",
2064+ "comms": [],
2065 "groups": ["iridium", "communications"],
2066- "tle1": "1 24871U 97034C 09080.95778183 -.00000024 00000-0 -14712-4 0 1999",
2067- "tle2": "2 24871 86.4029 192.6800 0013043 137.8990 222.3210 14.38055586613699",
2068- "draw_orbit": false,
2069+ "orbitColor": [0, 0, 0],
2070+ "orbitVisible": false,
2071+ "tle1": "1 24871U 97034C 10301.47784503 .00000156 00000-0 44992-4 0 8654",
2072+ "tle2": "2 24871 86.3924 306.5829 0013278 34.5535 325.6538 14.38145628697843",
2073 "visible": false
2074 },
2075 "IRIDIUM 921":
2076 {
2077- "description": "Iridium 921",
2078+ "comms": [],
2079 "groups": ["iridium", "communications"],
2080- "tle1": "1 24873U 97034E 09080.91559410 .00000320 00000-0 24960-4 0 5208",
2081- "tle2": "2 24873 86.3865 31.4638 0010185 126.4679 233.7489 14.97110247636150",
2082- "draw_orbit": false,
2083+ "orbitColor": [0, 0, 0],
2084+ "orbitVisible": false,
2085+ "tle1": "1 24873U 97034E 10301.42548635 .00000748 00000-0 61428-4 0 2503",
2086+ "tle2": "2 24873 86.3825 120.3525 0007896 173.3973 186.7336 14.97579698723763",
2087 "visible": false
2088 },
2089 "IRIDIUM 94":
2090 {
2091- "description": "Iridium 94",
2092+ "comms": [],
2093 "groups": ["iridium", "communications"],
2094- "tle1": "1 27374U 02005C 09080.75273894 -.00000019 00000-0 -75926-5 0 618",
2095- "tle2": "2 27374 86.5746 104.7593 0002666 84.3214 275.8306 14.66608250380349",
2096- "draw_orbit": false,
2097+ "orbitColor": [0, 0, 0],
2098+ "orbitVisible": false,
2099+ "tle1": "1 27374U 02005C 10301.52437384 .00000386 00000-0 65943-4 0 7997",
2100+ "tle2": "2 27374 86.5797 219.8733 0002532 81.5994 278.5499 14.66262166466187",
2101 "visible": false
2102 },
2103 "IRIDIUM 95":
2104 {
2105- "description": "Iridium 95",
2106+ "comms": [],
2107 "groups": ["iridium", "communications"],
2108- "tle1": "1 27375U 02005D 09080.66030253 -.00000059 00000-0 -28000-4 0 84",
2109- "tle2": "2 27375 86.3944 105.0032 0002427 89.9724 270.1749 14.34217381379558",
2110- "draw_orbit": false,
2111+ "orbitColor": [0, 0, 0],
2112+ "orbitVisible": false,
2113+ "tle1": "1 27375U 02005D 10301.36704777 -.00001097 00000-0 -39903-3 0 6945",
2114+ "tle2": "2 27375 86.3990 220.2275 0002513 83.6665 276.4819 14.34210058463509",
2115 "visible": false
2116 },
2117 "IRIDIUM 96":
2118 {
2119- "description": "Iridium 96",
2120+ "comms": [],
2121 "groups": ["iridium", "communications"],
2122- "tle1": "1 27376U 02005E 09080.56026923 -.00000015 00000-0 -69572-5 0 546",
2123- "tle2": "2 27376 86.5756 104.7982 0002697 80.6016 279.5497 14.66608347380313",
2124- "draw_orbit": false,
2125+ "orbitColor": [0, 0, 0],
2126+ "orbitVisible": false,
2127+ "tle1": "1 27376U 02005E 10301.32586491 .00000427 00000-0 73309-4 0 7868",
2128+ "tle2": "2 27376 86.5797 219.8961 0002513 78.1701 281.9792 14.66261825466151",
2129 "visible": false
2130 },
2131 "IRIDIUM 97":
2132 {
2133- "description": "Iridium 97",
2134+ "comms": [],
2135 "groups": ["iridium", "communications"],
2136- "tle1": "1 27450U 02031A 09080.67644149 .00000069 00000-0 17482-4 0 9207",
2137- "tle2": "2 27450 86.4000 136.7814 0003464 21.9907 338.1435 14.34219520358872",
2138- "draw_orbit": false,
2139+ "orbitColor": [0, 0, 0],
2140+ "orbitVisible": false,
2141+ "tle1": "1 27450U 02031A 10301.52269454 .00000150 00000-0 46368-4 0 6013",
2142+ "tle2": "2 27450 86.3936 251.8511 0001794 177.8890 182.2321 14.34219456442849",
2143 "visible": false
2144 },
2145 "IRIDIUM 98":
2146 {
2147- "description": "Iridium 98",
2148+ "comms": [],
2149 "groups": ["iridium", "communications"],
2150- "tle1": "1 27451U 02031B 09080.85265633 .00000211 00000-0 57105-4 0 9389",
2151- "tle2": "2 27451 86.4540 199.6827 0005377 49.1145 311.0517 14.42947974358258",
2152- "draw_orbit": false,
2153+ "orbitColor": [0, 0, 0],
2154+ "orbitVisible": false,
2155+ "tle1": "1 27451U 02031B 10301.48412638 .00000083 00000-0 18806-4 0 6496",
2156+ "tle2": "2 27451 86.4467 315.2431 0001379 229.4044 130.7062 14.42954671442709",
2157 "visible": false
2158 },
2159 "ISS (ZARYA)":
2160@@ -1408,81 +1429,117 @@
2161 "description": "ARISS packet uplink",
2162 "frequency": 145.825
2163 }],
2164+ "groups": [],
2165 "hintColor": [0.899999976158142, 0.899999976158142, 0.899999976158142],
2166- "tle1": "1 25544U 98067A 10011.92371058 .00012181 00000-0 76107-4 0 3541",
2167- "tle2": "2 25544 51.6465 313.4924 0007635 171.1951 233.5729 15.77327898638859",
2168- "draw_orbit": true,
2169+ "orbitColor": [0, 0, 0],
2170+ "orbitVisible": true,
2171+ "tle1": "1 25544U 98067A 10302.36561338 .00017353 00000-0 13399-3 0 1686",
2172+ "tle2": "2 25544 51.6470 264.0662 0008627 133.4449 11.1436 15.72003660684578",
2173+ "visible": true
2174+ },
2175+ "ITAMSAT (IO-26)":
2176+ {
2177+ "comms": [],
2178+ "groups": ["amateur", "non-operational"],
2179+ "orbitColor": [0, 0, 0],
2180+ "orbitVisible": false,
2181+ "tle1": "1 22826U 93061D 10301.97235919 .00000031 00000-0 28853-4 0 3997",
2182+ "tle2": "2 22826 98.4957 247.1079 0008234 226.7778 133.2713 14.29571240891272",
2183+ "visible": false
2184+ },
2185+ "JAS-1 (FO-12)":
2186+ {
2187+ "comms": [],
2188+ "groups": ["amateur", "non-operational"],
2189+ "orbitColor": [0, 0, 0],
2190+ "orbitVisible": false,
2191+ "tle1": "1 16909U 86061B 10301.81520572 -.00000083 00000-0 10000-3 0 8008",
2192+ "tle2": "2 16909 50.0140 68.9849 0011238 37.6411 322.5189 12.44454413101068",
2193+ "visible": false
2194+ },
2195+ "JAS-1B (FO-20)":
2196+ {
2197+ "comms": [],
2198+ "groups": ["amateur", "non-operational"],
2199+ "orbitColor": [0, 0, 0],
2200+ "orbitVisible": false,
2201+ "tle1": "1 20480U 90013C 10301.57246602 -.00000016 00000-0 26752-4 0 6029",
2202+ "tle2": "2 20480 99.0171 133.7011 0540746 121.5591 243.9482 12.83366127970837",
2203+ "visible": false
2204+ },
2205+ "JAS-2 (FO-29)":
2206+ {
2207+ "comms": [
2208+ {
2209+ "description": "uplink",
2210+ "frequency": 145.95,
2211+ "modulation": "SSB/CW"
2212+ },
2213+ {
2214+ "description": "downlink",
2215+ "frequency": 435.85,
2216+ "modulation": "SSB/CW"
2217+ }],
2218+ "groups": ["amateur"],
2219+ "orbitColor": [0, 0, 0],
2220+ "orbitVisible": false,
2221+ "tle1": "1 24278U 96046B 10301.66195490 .00000024 00000-0 57446-4 0 4253",
2222+ "tle2": "2 24278 98.5182 112.3778 0351102 137.5077 225.3818 13.52953723701152",
2223 "visible": true
2224 },
2225 "KITSAT 1 (KO-23)":
2226 {
2227- "description": "Amateur satellite",
2228+ "comms": [],
2229 "groups": ["amateur", "non-operational"],
2230- "tle1": "1 22077U 92052B 09080.68175229 -.00000037 00000-0 10000-3 0 6995",
2231- "tle2": "2 22077 66.0847 149.9211 0013023 300.4010 59.5723 12.86447618780266",
2232- "draw_orbit": false,
2233+ "orbitColor": [0, 0, 0],
2234+ "orbitVisible": false,
2235+ "tle1": "1 22077U 92052B 10301.69375558 -.00000037 00000-0 10000-3 0 805",
2236+ "tle2": "2 22077 66.0880 2.5985 0003219 352.4177 7.6789 12.86454782855643",
2237 "visible": false
2238 },
2239 "KITSAT 2 (KO-25)":
2240 {
2241- "description": "Amateur satellite",
2242+ "comms": [],
2243 "groups": ["amateur", "non-operational"],
2244- "tle1": "1 22828U 93061F 09080.83613139 -.00000007 00000-0 13561-4 0 1385",
2245- "tle2": "2 22828 98.4126 37.7648 0010637 129.0987 231.1150 14.29813121775804",
2246- "draw_orbit": false,
2247+ "orbitColor": [0, 0, 0],
2248+ "orbitVisible": false,
2249+ "tle1": "1 22828U 93061F 10301.06364579 .00000062 00000-0 40708-4 0 5982",
2250+ "tle2": "2 22828 98.4900 246.0066 0009608 201.4547 158.6238 14.29863591859434",
2251 "visible": false
2252 },
2253 "LUSAT (LO-19)":
2254 {
2255- "description": "Amateur satellite",
2256- "groups": ["amateur", "non-operational"],
2257- "tle1": "1 20442U 90005G 09080.85379851 .00000101 00000-0 52762-4 0 4846",
2258- "tle2": "2 20442 98.2328 60.8676 0012920 67.8229 292.4325 14.32055802 813",
2259- "draw_orbit": false,
2260- "visible": false
2261- },
2262- "UNAMSAT-2 (MO-30)":
2263- {
2264- "description": "Amateur satellite",
2265- "groups": ["amateur", "non-operational"],
2266- "tle1": "1 24305U 96052B 09080.47219106 .00000009 00000-0 -65784-5 0 696",
2267- "tle2": "2 24305 82.9323 58.9099 0030942 136.0160 224.3468 13.73567811628634",
2268- "draw_orbit": false,
2269- "visible": false
2270- },
2271- "TIUNGSAT-1 (MO-46)":
2272- {
2273- "description": "Amateur satellite",
2274- "groups": ["amateur", "non-operational"],
2275- "tle1": "1 26548U 00057D 09080.87169003 -.00000081 00000-0 87572-5 0 3491",
2276- "tle2": "2 26548 64.5595 350.9689 0050062 285.2131 74.3419 14.83347625459005",
2277- "draw_orbit": false,
2278- "visible": false
2279+ "comms": [],
2280+ "groups": ["amateur", "non-operational"],
2281+ "orbitColor": [0, 0, 0],
2282+ "orbitVisible": false,
2283+ "tle1": "1 20442U 90005G 10301.84364414 .00000038 00000-0 29355-4 0 9398",
2284+ "tle2": "2 20442 98.3130 259.8718 0012739 121.7305 238.5120 14.32109553 84689",
2285+ "visible": false
2286+ },
2287+ "MOZHAYETS 4 (RS-22)":
2288+ {
2289+ "comms": [
2290+ {
2291+ "description": "downlink",
2292+ "frequency": 435.352,
2293+ "modulation": "CW"
2294+ }],
2295+ "groups": ["amateur"],
2296+ "orbitColor": [0, 0, 0],
2297+ "orbitVisible": false,
2298+ "tle1": "1 27939U 03042A 10302.06642910 .00000227 00000-0 52443-4 0 6735",
2299+ "tle2": "2 27939 97.8700 161.7284 0013634 1.4874 358.6385 14.63469503378538",
2300+ "visible": true
2301 },
2302 "NCUBE-2":
2303 {
2304 "comms": [],
2305- "tle1": "1 28897U 05043H 10010.64548338 .00000118 00000-0 34050-4 0 457",
2306- "tle2": "2 28897 98.0343 260.0372 0018237 60.5035 299.7985 14.60015933216294",
2307- "draw_orbit": false,
2308- "visible": false
2309- },
2310- "PCSAT (NO-44)":
2311- {
2312- "description": "Amateur satellite",
2313- "groups": ["amateur", "non-operational"],
2314- "tle1": "1 26931U 01043C 09080.69111513 -.00000245 00000-0 -63501-4 0 1278",
2315- "tle2": "2 26931 67.0529 289.7584 0005178 260.4427 99.6072 14.29549665390074",
2316- "draw_orbit": false,
2317- "visible": false
2318- },
2319- "SAPPHIRE (NO-45)":
2320- {
2321- "description": "Amateur satellite",
2322- "groups": ["amateur", "non-operational"],
2323- "tle1": "1 26932U 01043D 09080.93767055 -.00000067 00000-0 60390-5 0 1347",
2324- "tle2": "2 26932 67.0506 289.0527 0006019 240.4193 119.6306 14.29604170390158",
2325- "draw_orbit": false,
2326+ "groups": [],
2327+ "orbitColor": [0, 0, 0],
2328+ "orbitVisible": false,
2329+ "tle1": "1 28897U 05043H 10301.21380730 .00000281 00000-0 67563-4 0 2822",
2330+ "tle2": "2 28897 97.9915 181.0256 0016236 227.0454 132.9375 14.60143919258699",
2331 "visible": false
2332 },
2333 "NOAA 15":
2334@@ -1493,11 +1550,11 @@
2335 "frequency": 137.5,
2336 "modulation": "AM/APT"
2337 }],
2338- "description": "NOAA Weather Satellite 15",
2339 "groups": ["scientific", "weather"],
2340- "tle1": "1 25338U 98030A 09080.90089393 -.00000044 00000-0 -26503-6 0 8619",
2341- "tle2": "2 25338 98.5808 72.0445 0009840 316.2506 43.7883 14.24749834564348",
2342- "draw_orbit": true,
2343+ "orbitColor": [0, 0, 0],
2344+ "orbitVisible": true,
2345+ "tle1": "1 25338U 98030A 10301.29622088 .00000039 00000-0 35343-4 0 5746",
2346+ "tle2": "2 25338 98.6330 285.9285 0011477 50.6187 309.6026 14.24862396647703",
2347 "visible": true
2348 },
2349 "NOAA 17":
2350@@ -1508,11 +1565,11 @@
2351 "frequency": 137.62,
2352 "modulation": "AM/APT"
2353 }],
2354- "description": "NOAA Weather Satellite 17",
2355 "groups": ["scientific", "weather"],
2356- "tle1": "1 27453U 02032A 09080.80573152 -.00000085 00000-0 -18637-4 0 3444",
2357- "tle2": "2 27453 98.4939 142.8491 0011919 24.2008 335.9717 14.24048587350311",
2358- "draw_orbit": true,
2359+ "orbitColor": [0, 0, 0],
2360+ "orbitVisible": true,
2361+ "tle1": "1 27453U 02032A 10301.34155174 .00000013 00000-0 23508-4 0 406",
2362+ "tle2": "2 27453 98.4151 346.3131 0012727 107.3453 252.9128 14.24202947433659",
2363 "visible": true
2364 },
2365 "NOAA 18":
2366@@ -1523,55 +1580,177 @@
2367 "frequency": 137.1,
2368 "modulation": "AM/APT"
2369 }],
2370- "description": "NOAA Weather Satellite 18",
2371 "groups": ["scientific", "weather"],
2372- "tle1": "1 28654U 05018A 09080.77119997 .00000000 00000-0 24577-4 0 8343",
2373- "tle2": "2 28654 98.8994 24.7197 0013458 248.9605 111.0150 14.11241530197625",
2374- "draw_orbit": true,
2375+ "orbitColor": [0, 0, 0],
2376+ "orbitVisible": true,
2377+ "tle1": "1 28654U 05018A 10301.36432412 -.00000103 00000-0 -31919-4 0 5303",
2378+ "tle2": "2 28654 98.9662 247.3312 0015092 40.2479 319.9812 14.11400503280228",
2379 "visible": true
2380 },
2381 "OPAL (OO-38)":
2382 {
2383- "description": "Amateur satellite",
2384+ "comms": [],
2385 "groups": ["amateur", "non-operational"],
2386- "tle1": "1 26063U 00004C 09080.77017786 -.00000011 00000-0 16522-4 0 4630",
2387- "tle2": "2 26063 100.1939 211.4200 0036983 147.0349 213.3150 14.35858482479406",
2388- "draw_orbit": false,
2389+ "orbitColor": [0, 0, 0],
2390+ "orbitVisible": false,
2391+ "tle1": "1 26063U 00004C 10301.79139841 .00000023 00000-0 28053-4 0 9388",
2392+ "tle2": "2 26063 100.1955 184.9222 0036493 298.1072 61.6434 14.35911320563504",
2393 "visible": false
2394 },
2395 "OSCAR 3 (OSCAR III)":
2396 {
2397- "description": "Amateur satellite",
2398- "groups": ["amateur", "non-operational"],
2399- "tle1": "1 01293U 65016F 09080.92578501 .00000079 00000-0 82795-4 0 4881",
2400- "tle2": "2 01293 70.0694 359.9998 0020227 281.6686 78.2153 14.04694421247559",
2401- "draw_orbit": false,
2402+ "comms": [],
2403+ "groups": ["amateur", "non-operational"],
2404+ "orbitColor": [0, 0, 0],
2405+ "orbitVisible": false,
2406+ "tle1": "1 01293U 65016F 10301.16504886 .00000182 00000-0 14627-3 0 9293",
2407+ "tle2": "2 01293 70.0742 175.0957 0020293 230.4062 129.5239 14.04822768329742",
2408+ "visible": false
2409+ },
2410+ "OSCAR 5 (AO-5)":
2411+ {
2412+ "comms": [],
2413+ "groups": ["amateur", "non-operational"],
2414+ "orbitColor": [0, 0, 0],
2415+ "orbitVisible": false,
2416+ "tle1": "1 04321U 70008B 10301.91710438 -.00000031 00000-0 10000-3 0 3895",
2417+ "tle2": "2 04321 102.1008 327.0014 0027516 116.1671 244.2233 12.52160958863180",
2418+ "visible": false
2419+ },
2420+ "OSCAR 6 (AO-6)":
2421+ {
2422+ "comms": [],
2423+ "groups": ["amateur", "non-operational"],
2424+ "orbitColor": [0, 0, 0],
2425+ "orbitVisible": false,
2426+ "tle1": "1 06236U 72082B 10300.62660884 -.00000027 00000-0 10000-3 0 3796",
2427+ "tle2": "2 06236 101.3975 298.8583 0004330 359.0525 1.0536 12.53083162739710",
2428+ "visible": false
2429+ },
2430+ "OSCAR 7 (AO-7)":
2431+ {
2432+ "comms": [
2433+ {
2434+ "description": "200mW Beacon used with Modes B & C",
2435+ "frequency": 145.972
2436+ },
2437+ {
2438+ "description": "downlink",
2439+ "frequency": 145.95,
2440+ "modulation": "Modes B & C"
2441+ },
2442+ {
2443+ "description": "uplink",
2444+ "frequency": 145.9,
2445+ "modulation": "Mode A"
2446+ },
2447+ {
2448+ "description": "downlink",
2449+ "frequency": 29.45,
2450+ "modulation": "Mode A"
2451+ },
2452+ {
2453+ "description": "200mW Beacon used with Mode A",
2454+ "frequency": 29.502
2455+ },
2456+ {
2457+ "frequency": 2304.1,
2458+ "modulation": "40 mW Beacon - only when commanded"
2459+ },
2460+ {
2461+ "description": "uplink",
2462+ "frequency": 432.15,
2463+ "modulation": "Modes B & C"
2464+ }],
2465+ "groups": ["amateur"],
2466+ "orbitColor": [0, 0, 0],
2467+ "orbitVisible": false,
2468+ "tle1": "1 07530U 74089B 10301.95788337 -.00000027 00000-0 10000-3 0 9149",
2469+ "tle2": "2 07530 101.3995 312.6222 0012265 12.5206 347.6162 12.53580065645217",
2470+ "visible": true
2471+ },
2472+ "OSCAR 8 (AO-8)":
2473+ {
2474+ "comms": [],
2475+ "groups": ["amateur", "non-operational"],
2476+ "orbitColor": [0, 0, 0],
2477+ "orbitVisible": false,
2478+ "tle1": "1 10703U 78026B 10302.09716984 .00000360 00000-0 27885-3 0 9772",
2479+ "tle2": "2 10703 98.7639 332.1837 0005434 220.9322 139.1432 13.98878843665771",
2480+ "visible": false
2481+ },
2482+ "PACSAT (AO-16)":
2483+ {
2484+ "comms": [],
2485+ "groups": ["amateur", "non-operational"],
2486+ "orbitColor": [0, 0, 0],
2487+ "orbitVisible": false,
2488+ "tle1": "1 20439U 90005D 10301.79742930 .00000042 00000-0 31108-4 0 295",
2489+ "tle2": "2 20439 98.3505 254.5613 0011591 126.5263 233.6991 14.31880226 84503",
2490+ "visible": false
2491+ },
2492+ "PAN SAT (PO-34)":
2493+ {
2494+ "comms": [],
2495+ "groups": ["amateur", "non-operational"],
2496+ "orbitColor": [0, 0, 0],
2497+ "orbitVisible": false,
2498+ "tle1": "1 25520U 98064B 10301.70201388 .00000947 00000-0 36144-4 0 6084",
2499+ "tle2": "2 25520 28.4585 155.8089 0005085 340.3000 19.7375 15.17716130664451",
2500+ "visible": false
2501+ },
2502+ "PCSAT (NO-44)":
2503+ {
2504+ "comms": [],
2505+ "groups": ["amateur", "non-operational"],
2506+ "orbitColor": [0, 0, 0],
2507+ "orbitVisible": false,
2508+ "tle1": "1 26931U 01043C 10302.17766215 -.00000115 00000-0 -12460-4 0 5936",
2509+ "tle2": "2 26931 67.0531 218.7490 0005616 271.5946 88.4492 14.29617215473904",
2510 "visible": false
2511 },
2512 "PEHUENSAT 1 (PO-63)":
2513 {
2514 "comms": [],
2515- "tle1": "1 29712U 07001D 09129.76442331 .00000438 00000-0 63872-4 0 4664",
2516- "tle2": "2 29712 97.8314 187.0851 0015285 43.5600 316.6810 14.80531783125782",
2517- "draw_orbit": false,
2518- "visible": false
2519+ "groups": [],
2520+ "orbitColor": [0, 0, 0],
2521+ "orbitVisible": false,
2522+ "tle1": "1 29712U 07001D 10301.18895127 .00001391 00000-0 18424-3 0 3692",
2523+ "tle2": "2 29712 97.7673 349.0635 0015087 91.9833 268.3076 14.81366235205172",
2524+ "visible": false
2525+ },
2526+ "PHASE 3B (AO-10)":
2527+ {
2528+ "comms": [],
2529+ "groups": ["amateur", "non-operational"],
2530+ "orbitColor": [0, 0, 0],
2531+ "orbitVisible": false,
2532+ "tle1": "1 14129U 83058B 10301.48429116 -.00000086 00000-0 10000-3 0 7774",
2533+ "tle2": "2 14129 26.7917 67.8588 6039053 9.7099 357.9616 2.05867874177912",
2534+ "visible": false
2535+ },
2536+ "PHASE 3D (AO-40)":
2537+ {
2538+ "comms": [
2539+ {
2540+ "description": "Beacon",
2541+ "frequency": 145.898
2542+ }],
2543+ "groups": ["amateur"],
2544+ "orbitColor": [0, 0, 0],
2545+ "orbitVisible": false,
2546+ "tle1": "1 26609U 00072B 10299.42141595 -.00000068 00000-0 10000-3 0 4325",
2547+ "tle2": "2 26609 8.7380 307.8723 7952988 1.7527 359.9938 1.25586613 45867",
2548+ "visible": true
2549 },
2550 "POSAT (PO-28)":
2551 {
2552- "description": "Amateur satellite",
2553- "groups": ["amateur", "non-operational"],
2554- "tle1": "1 22829U 93061G 09080.84418226 -.00000012 00000-0 11647-4 0 1746",
2555- "tle2": "2 22829 98.4087 38.9001 0010531 125.5741 234.6455 14.30211190807812",
2556- "draw_orbit": false,
2557- "visible": false
2558- },
2559- "PAN SAT (PO-34)":
2560- {
2561- "description": "Amateur satellite",
2562- "groups": ["amateur", "non-operational"],
2563- "tle1": "1 25520U 98064B 09080.51367299 .00000409 00000-0 10351-4 0 2091",
2564- "tle2": "2 25520 28.4596 121.9419 0005186 71.4910 288.6250 15.17311364575324",
2565- "draw_orbit": false,
2566+ "comms": [],
2567+ "groups": ["amateur", "non-operational"],
2568+ "orbitColor": [0, 0, 0],
2569+ "orbitVisible": false,
2570+ "tle1": "1 22829U 93061G 10302.02792415 .00000101 00000-0 55301-4 0 6131",
2571+ "tle2": "2 22829 98.4857 248.1374 0009510 193.5771 166.5159 14.30264274891603",
2572 "visible": false
2573 },
2574 "RADIO ROSTO (RS-15)":
2575@@ -1595,70 +1774,41 @@
2576 "frequency": 145.878,
2577 "modulation": "Mode A"
2578 }],
2579- "description": "Radio Sputnik (RS) 15",
2580- "groups": ["amateur"],
2581- "tle1": "1 23439U 94085A 09080.97335086 -.00000039 00000-0 10000-3 0 2029",
2582- "tle2": "2 23439 64.8130 45.8464 0146514 68.4113 293.2342 11.27553256586281",
2583- "draw_orbit": false,
2584- "visible": true
2585- },
2586- "MOZHAYETS 4 (RS-22)":
2587- {
2588- "comms": [
2589- {
2590- "description": "downlink",
2591- "frequency": 435.352,
2592- "modulation": "CW"
2593- }],
2594- "description": "Amateur satellite",
2595- "groups": ["amateur"],
2596- "tle1": "1 27939U 03042A 09080.74176473 .00000091 00000-0 26556-4 0 7452",
2597- "tle2": "2 27939 97.9578 318.7317 0014519 50.9541 309.2958 14.63301923292787",
2598- "draw_orbit": false,
2599- "visible": true
2600- },
2601- "SEASAT 1":
2602+ "groups": ["amateur"],
2603+ "orbitColor": [0, 0, 0],
2604+ "orbitVisible": false,
2605+ "tle1": "1 23439U 94085A 10300.89335058 -.00000039 00000-0 10000-3 0 3454",
2606+ "tle2": "2 23439 64.8172 179.9334 0163415 320.8699 38.0499 11.27554569652230",
2607+ "visible": true
2608+ },
2609+ "SAPPHIRE (NO-45)":
2610 {
2611 "comms": [],
2612- "tle1": "1 10967U 78064A 10011.48877880 -.00000066 00000-0 21494-4 0 146",
2613- "tle2": "2 10967 108.0202 37.9154 0003096 275.7432 84.3363 14.42175802655204",
2614- "draw_orbit": false,
2615- "visible": true
2616- },
2617- "SEDSAT 1 (SO-33)":
2618- {
2619- "description": "Amateur satellite",
2620- "groups": ["amateur", "non-operational"],
2621- "tle1": "1 25509U 98061B 09080.68393431 .00000028 00000-0 -80808-5 0 4141",
2622- "tle2": "2 25509 31.4336 187.2850 0354956 293.3308 63.0343 14.28246349543312",
2623- "draw_orbit": false,
2624- "visible": false
2625- },
2626- "SUNSAT (SO-35)":
2627- {
2628- "description": "Amateur satellite",
2629- "groups": ["amateur", "non-operational"],
2630- "tle1": "1 25636U 99008C 09080.57259666 -.00000022 00000-0 18215-5 0 2632",
2631- "tle2": "2 25636 96.4526 285.7652 0148832 138.9281 222.3233 14.43457619530468",
2632- "draw_orbit": false,
2633+ "groups": ["amateur", "non-operational"],
2634+ "orbitColor": [0, 0, 0],
2635+ "orbitVisible": false,
2636+ "tle1": "1 26932U 01043D 10300.93680270 .00000207 00000-0 11303-3 0 6008",
2637+ "tle2": "2 26932 67.0569 222.0623 0003987 282.5276 77.5383 14.29652157473776",
2638 "visible": false
2639 },
2640 "SAUDISAT 1A (SO-41)":
2641 {
2642- "description": "Amateur satellite",
2643+ "comms": [],
2644 "groups": ["amateur", "non-operational"],
2645- "tle1": "1 26545U 00057A 09081.15361688 .00000047 00000-0 25135-4 0 2129",
2646- "tle2": "2 26545 64.5602 25.7522 0053775 291.6905 67.8477 14.80571352458315",
2647- "draw_orbit": false,
2648+ "orbitColor": [0, 0, 0],
2649+ "orbitVisible": false,
2650+ "tle1": "1 26545U 00057A 10302.21213510 .00000238 00000-0 49391-4 0 6636",
2651+ "tle2": "2 26545 64.5593 19.7278 0028002 198.2244 161.7864 14.80754992545086",
2652 "visible": false
2653 },
2654 "SAUDISAT 1B (SO-42)":
2655 {
2656- "description": "Amateur satellite",
2657+ "comms": [],
2658 "groups": ["amateur", "non-operational"],
2659- "tle1": "1 26549U 00057E 09080.84595995 -.00000003 00000-0 19202-4 0 2905",
2660- "tle2": "2 26549 64.5580 42.8624 0056981 296.2253 63.3012 14.79427179457945",
2661- "draw_orbit": false,
2662+ "orbitColor": [0, 0, 0],
2663+ "orbitVisible": false,
2664+ "tle1": "1 26549U 00057E 10301.27703190 .00000252 00000-0 52462-4 0 7554",
2665+ "tle2": "2 26549 64.5588 42.0123 0033543 196.2105 163.7950 14.79603796544554",
2666 "visible": false
2667 },
2668 "SAUDISAT 1C (SO-50)":
2669@@ -1674,73 +1824,151 @@
2670 "frequency": 436.795,
2671 "modulation": "FM"
2672 }],
2673- "description": "Amateur satellite",
2674 "groups": ["amateur"],
2675- "tle1": "1 27607U 02058C 09080.71748238 -.00000074 00000-0 10658-4 0 8438",
2676- "tle2": "2 27607 64.5592 290.7496 0076162 224.5615 134.9353 14.71420878335808",
2677- "draw_orbit": false,
2678- "visible": true
2679+ "orbitColor": [0, 0, 0],
2680+ "orbitVisible": false,
2681+ "tle1": "1 27607U 02058C 10301.61448115 .00000083 00000-0 34786-4 0 3045",
2682+ "tle2": "2 27607 64.5581 311.2303 0045303 21.9147 338.3881 14.71594408422011",
2683+ "visible": true
2684+ },
2685+ "SEASAT 1":
2686+ {
2687+ "comms": [],
2688+ "groups": [],
2689+ "orbitColor": [0, 0, 0],
2690+ "orbitVisible": false,
2691+ "tle1": "1 10967U 78064A 10301.42156452 .00000021 00000-0 47716-4 0 2504",
2692+ "tle2": "2 10967 108.0170 282.5360 0003008 244.5472 115.5366 14.42233989697001",
2693+ "visible": true
2694+ },
2695+ "SEDSAT 1 (SO-33)":
2696+ {
2697+ "comms": [],
2698+ "groups": ["amateur", "non-operational"],
2699+ "orbitColor": [0, 0, 0],
2700+ "orbitVisible": false,
2701+ "tle1": "1 25509U 98061B 10301.54597441 .00000218 00000-0 32855-4 0 8244",
2702+ "tle2": "2 25509 31.4315 114.3559 0352948 15.8890 345.2447 14.28335354627136",
2703+ "visible": false
2704+ },
2705+ "SSETI EXPRESS (XO-53)":
2706+ {
2707+ "comms": [],
2708+ "groups": ["amateur", "non-operational"],
2709+ "orbitColor": [0, 0, 0],
2710+ "orbitVisible": false,
2711+ "tle1": "1 28894U 05043E 10302.16153439 .00000121 00000-0 34690-4 0 9025",
2712+ "tle2": "2 28894 97.9880 181.3536 0016597 225.9524 134.0317 14.59762730266645",
2713+ "visible": false
2714+ },
2715+ "SUNSAT (SO-35)":
2716+ {
2717+ "comms": [],
2718+ "groups": ["amateur", "non-operational"],
2719+ "orbitColor": [0, 0, 0],
2720+ "orbitVisible": false,
2721+ "tle1": "1 25636U 99008C 10301.17920158 .00000094 00000-0 31863-4 0 7442",
2722+ "tle2": "2 25636 96.4810 11.4219 0149458 85.2411 276.5846 14.43522153614944",
2723+ "visible": false
2724+ },
2725+ "TECHSAT 1B (GO-32)":
2726+ {
2727+ "comms": [],
2728+ "groups": ["amateur", "non-operational"],
2729+ "orbitColor": [0, 0, 0],
2730+ "orbitVisible": false,
2731+ "tle1": "1 25397U 98043D 10301.04803974 .00000064 00000-0 46175-4 0 3171",
2732+ "tle2": "2 25397 98.3171 301.2061 0000536 187.5333 172.5857 14.23188315638945",
2733+ "visible": false
2734+ },
2735+ "TIUNGSAT-1 (MO-46)":
2736+ {
2737+ "comms": [],
2738+ "groups": ["amateur", "non-operational"],
2739+ "orbitColor": [0, 0, 0],
2740+ "orbitVisible": false,
2741+ "tle1": "1 26548U 00057D 10301.43415163 .00000269 00000-0 50374-4 0 8347",
2742+ "tle2": "2 26548 64.5572 338.3968 0020896 204.3629 155.6463 14.83575119545869",
2743+ "visible": false
2744 },
2745 "TMSAT-1 (TO-31)":
2746 {
2747- "description": "Amateur satellite",
2748+ "comms": [],
2749 "groups": ["amateur", "non-operational"],
2750- "tle1": "1 25396U 98043C 09080.64556542 -.00000075 00000-0 -14722-4 0 3609",
2751- "tle2": "2 25396 98.3414 113.1366 0003330 117.6494 242.5017 14.23773358555849",
2752- "draw_orbit": false,
2753+ "orbitColor": [0, 0, 0],
2754+ "orbitVisible": false,
2755+ "tle1": "1 25396U 98043C 10301.66959165 .00000015 00000-0 24496-4 0 8311",
2756+ "tle2": "2 25396 98.3083 307.8110 0001932 195.3696 164.7419 14.23816641639233",
2757 "visible": false
2758 },
2759 "UARS":
2760 {
2761 "comms": [],
2762- "tle1": "1 21701U 91063B 10011.56517379 .00007948 00000-0 10185-3 0 8632",
2763- "tle2": "2 21701 56.9701 169.1612 0067526 215.9750 143.6756 15.57588661 11660",
2764- "draw_orbit": false,
2765+ "groups": [],
2766+ "orbitColor": [0, 0, 0],
2767+ "orbitVisible": false,
2768+ "tle1": "1 21701U 91063B 10302.26036846 .00018353 00000-0 16692-3 0 1147",
2769+ "tle2": "2 21701 56.9712 322.6612 0063129 75.5188 285.2865 15.65524459 57060",
2770 "visible": true
2771 },
2772+ "UNAMSAT-2 (MO-30)":
2773+ {
2774+ "comms": [],
2775+ "groups": ["amateur", "non-operational"],
2776+ "orbitColor": [0, 0, 0],
2777+ "orbitVisible": false,
2778+ "tle1": "1 24305U 96052B 10301.64417402 .00000050 00000-0 37693-4 0 5644",
2779+ "tle2": "2 24305 82.9375 345.3896 0029043 310.0764 49.7849 13.73589184709104",
2780+ "visible": false
2781+ },
2782+ "UOSAT 12 (UO-36)":
2783+ {
2784+ "comms": [],
2785+ "groups": ["amateur", "non-operational"],
2786+ "orbitColor": [0, 0, 0],
2787+ "orbitVisible": false,
2788+ "tle1": "1 25693U 99021A 10301.41097796 -.00000043 00000-0 13897-4 0 3404",
2789+ "tle2": "2 25693 64.5608 25.1028 0045010 293.3862 66.2479 14.78829481621518",
2790+ "visible": false
2791+ },
2792 "UOSAT 2 (UO-11)":
2793 {
2794- "description": "Amateur satellite",
2795+ "comms": [],
2796 "groups": ["amateur", "non-operational"],
2797- "tle1": "1 14781U 84021B 09080.64423839 .00000051 00000-0 14037-4 0 9177",
2798- "tle2": "2 14781 98.1180 124.2766 0008009 259.6956 100.3325 14.79700400344880",
2799- "draw_orbit": false,
2800+ "orbitColor": [0, 0, 0],
2801+ "orbitVisible": false,
2802+ "tle1": "1 14781U 84021B 10301.36196208 -.00000161 00000-0 -14259-4 0 3760",
2803+ "tle2": "2 14781 98.0387 353.3855 0009139 161.9114 198.2405 14.79849098431506",
2804 "visible": false
2805 },
2806 "UOSAT 3 (UO-14)":
2807 {
2808- "description": "Amateur satellite",
2809+ "comms": [],
2810 "groups": ["amateur", "non-operational"],
2811- "tle1": "1 20437U 90005B 09080.89917087 -.00000002 00000-0 14954-4 0 8782",
2812- "tle2": "2 20437 98.3297 42.5381 0011721 66.3877 293.8534 14.31539355 562",
2813- "draw_orbit": false,
2814+ "orbitColor": [0, 0, 0],
2815+ "orbitVisible": false,
2816+ "tle1": "1 20437U 90005B 10300.91152494 -.00000056 00000-0 -51411-5 0 3454",
2817+ "tle2": "2 20437 98.4072 246.6446 0011266 129.9527 230.2667 14.31589070 84265",
2818 "visible": false
2819 },
2820 "UOSAT 4 (UO-15)":
2821 {
2822- "description": "Amateur satellite",
2823+ "comms": [],
2824 "groups": ["amateur", "non-operational"],
2825- "tle1": "1 20438U 90005C 09080.90778475 -.00000010 00000-0 12128-4 0 3731",
2826- "tle2": "2 20438 98.3890 35.1941 0010802 94.4649 265.7767 14.30441006999994",
2827- "draw_orbit": false,
2828+ "orbitColor": [0, 0, 0],
2829+ "orbitVisible": false,
2830+ "tle1": "1 20438U 90005C 10301.79041733 .00000022 00000-0 24893-4 0 8454",
2831+ "tle2": "2 20438 98.4607 242.8951 0010217 160.3752 199.7827 14.30479448 83759",
2832 "visible": false
2833 },
2834 "UOSAT 5 (UO-22)":
2835 {
2836- "description": "Amateur satellite",
2837- "groups": ["amateur", "non-operational"],
2838- "tle1": "1 21575U 91050B 09080.89099734 .00000050 00000-0 29842-4 0 5115",
2839- "tle2": "2 21575 98.4357 31.0711 0006470 282.9876 77.0586 14.39667965928143",
2840- "draw_orbit": false,
2841- "visible": false
2842- },
2843- "UOSAT 12 (UO-36)":
2844- {
2845- "description": "Amateur satellite",
2846- "groups": ["amateur", "non-operational"],
2847- "tle1": "1 25693U 99021A 09080.89685166 -.00000052 00000-0 12065-4 0 8740",
2848- "tle2": "2 25693 64.5601 24.0115 0014988 205.2445 154.7951 14.78742116534931",
2849- "draw_orbit": false,
2850+ "comms": [],
2851+ "groups": ["amateur", "non-operational"],
2852+ "orbitColor": [0, 0, 0],
2853+ "orbitVisible": false,
2854+ "tle1": "1 21575U 91050B 10301.83741544 .00000072 00000-0 37052-4 0 9705",
2855+ "tle2": "2 21575 98.5098 250.6008 0007023 332.9581 27.1235 14.39741581 12450",
2856 "visible": false
2857 },
2858 "UWE-1":
2859@@ -1751,42 +1979,21 @@
2860 "frequency": 437.505,
2861 "modulation": "AFSK, 9600 baud"
2862 }],
2863- "tle1": "1 28892U 05043C 10011.41208966 .00000105 00000-0 31411-4 0 5277",
2864- "tle2": "2 28892 98.0328 260.2408 0018374 58.0630 302.2350 14.59806760224221",
2865- "draw_orbit": false,
2866+ "groups": [],
2867+ "orbitColor": [0, 0, 0],
2868+ "orbitVisible": false,
2869+ "tle1": "1 28892U 05043C 10302.15932038 .00000277 00000-0 67049-4 0 7666",
2870+ "tle2": "2 28892 97.9897 181.2370 0016475 223.3607 136.6293 14.59933347266640",
2871 "visible": false
2872 },
2873- "HAMSAT (VO-52)":
2874- {
2875- "comms": [
2876- {
2877- "description": "Beacon",
2878- "frequency": 145.86,
2879- "modulation": "CW"
2880- }],
2881- "description": "Amateur satellite",
2882- "groups": ["amateur"],
2883- "tle1": "1 28650U 05017B 09080.72416803 -.00000248 00000-0 -24823-4 0 1847",
2884- "tle2": "2 28650 97.7510 145.1610 0026425 317.3448 42.5717 14.81561809209694",
2885- "draw_orbit": false,
2886- "visible": true
2887- },
2888 "WEBERSAT (WO-18)":
2889 {
2890- "description": "Amateur satellite",
2891- "groups": ["amateur", "non-operational"],
2892- "tle1": "1 20441U 90005F 09080.86048996 .00000029 00000-0 26273-4 0 7816",
2893- "tle2": "2 20441 98.2526 56.8316 0012586 69.9267 290.3272 14.31886901 720",
2894- "draw_orbit": false,
2895- "visible": false
2896- },
2897- "SSETI EXPRESS (XO-53)":
2898- {
2899- "description": "Amateur satellite",
2900- "groups": ["amateur", "non-operational"],
2901- "tle1": "1 28894U 05043E 09080.73492122 .00000020 00000-0 13815-4 0 4180",
2902- "tle2": "2 28894 98.0668 333.5116 0016556 264.1886 95.7421 14.59659039181098",
2903- "draw_orbit": false,
2904+ "comms": [],
2905+ "groups": ["amateur", "non-operational"],
2906+ "orbitColor": [0, 0, 0],
2907+ "orbitVisible": false,
2908+ "tle1": "1 20441U 90005F 10301.84779390 .00000035 00000-0 28489-4 0 2555",
2909+ "tle2": "2 20441 98.3319 257.0049 0012093 124.2979 235.9352 14.31947554 84589",
2910 "visible": false
2911 }
2912 },
2913
2914=== modified file 'plugins/Satellites/src/CMakeLists.txt'
2915--- plugins/Satellites/src/CMakeLists.txt 2010-05-10 08:59:49 +0000
2916+++ plugins/Satellites/src/CMakeLists.txt 2010-10-30 00:49:41 +0000
2917@@ -1,15 +1,33 @@
2918-INCLUDE_DIRECTORIES(. sgp4sdp4 gui ${CMAKE_BINARY_DIR}/plugins/Satellites/src ${CMAKE_BINARY_DIR}/plugins/Satellites/src/gui)
2919+INCLUDE_DIRECTORIES(. gsatellite gui ${CMAKE_BINARY_DIR}/plugins/Satellites/src ${CMAKE_BINARY_DIR}/plugins/Satellites/src/gui)
2920
2921 LINK_DIRECTORIES(/src)
2922
2923 SET(Satellites_SRCS
2924- sgp4sdp4/sgp4sdp4.c
2925- sgp4sdp4/sgp4sdp4.h
2926- sgp4sdp4/sgp_in.c
2927- sgp4sdp4/sgp_math.c
2928- sgp4sdp4/sgp_obs.c
2929- sgp4sdp4/sgp_time.c
2930- sgp4sdp4/solar.c
2931+ gsatellite/gException.hpp
2932+ gsatellite/gMatrix.cpp
2933+ gsatellite/gMatrix.hpp
2934+ gsatellite/gMatrixTempl.hpp
2935+ gsatellite/gObserver.cpp
2936+ gsatellite/gObserver.hpp
2937+ gsatellite/gSatTEME.cpp
2938+ gsatellite/gSatTEME.hpp
2939+ gsatellite/mathUtils.cpp
2940+ gsatellite/mathUtils.hpp
2941+ gsatellite/gTime.cpp
2942+ gsatellite/gTime.hpp
2943+ gsatellite/gTimeSpan.cpp
2944+ gsatellite/gVector.cpp
2945+ gsatellite/gVector.hpp
2946+ gsatellite/gVectorTempl.hpp
2947+ gsatellite/sgp4ext.cpp
2948+ gsatellite/sgp4ext.h
2949+ gsatellite/sgp4io.cpp
2950+ gsatellite/sgp4io.h
2951+ gsatellite/sgp4unit.cpp
2952+ gsatellite/sgp4unit.h
2953+ gsatellite/stdsat.h
2954+
2955+
2956 Satellite.hpp
2957 Satellite.cpp
2958 Satellites.hpp
2959
2960=== modified file 'plugins/Satellites/src/Satellite.cpp'
2961--- plugins/Satellites/src/Satellite.cpp 2010-10-27 15:20:46 +0000
2962+++ plugins/Satellites/src/Satellite.cpp 2010-10-30 00:49:41 +0000
2963@@ -27,12 +27,22 @@
2964 #include "StelTexture.hpp"
2965 #include "VecMath.hpp"
2966 #include "StelUtils.hpp"
2967-#include "sgp4sdp4/sgp4sdp4.h"
2968+
2969+
2970+#include "gsatellite/gSatTEME.hpp"
2971+#include "gsatellite/gObserver.hpp"
2972+#include "gsatellite/gTime.hpp"
2973+#include "gsatellite/gVector.hpp"
2974
2975 #include <QTextStream>
2976 #include <QRegExp>
2977 #include <QDebug>
2978 #include <QVariant>
2979+#include <QtOpenGL>
2980+#include <QSettings>
2981+
2982+#include <cmath>
2983+#include <cstdlib>
2984
2985 // static data members - will be initialised in the Satallites class (the StelObjectMgr)
2986 StelTextureSP Satellite::hintTexture;
2987@@ -47,13 +57,15 @@
2988 if (!map.contains("designation") || !map.contains("tle1") || !map.contains("tle2"))
2989 return;
2990
2991-
2992+ font.setPixelSize(16);
2993+
2994 designation = map.value("designation").toString();
2995 strncpy(elements[0], "DUMMY", 5);
2996 strncpy(elements[1], qPrintable(map.value("tle1").toString()), 80);
2997 strncpy(elements[2], qPrintable(map.value("tle2").toString()), 80);
2998 if (map.contains("description")) description = map.value("description").toString();
2999 if (map.contains("visible")) visible = map.value("visible").toBool();
3000+ if (map.contains("orbitVisible")) orbitVisible = map.value("orbitVisible").toBool();
3001
3002 if (map.contains("hintColor"))
3003 {
3004@@ -87,12 +99,16 @@
3005 }
3006 }
3007
3008+ pSatellite = new gSatTEME( designation.toAscii().data(), elements[1], elements[2]);
3009+
3010 setObserverLocation();
3011 initialized = true;
3012 }
3013
3014 Satellite::~Satellite()
3015 {
3016+ if(pSatellite != NULL)
3017+ delete pSatellite;
3018 }
3019
3020 QVariantMap Satellite::getMap(void)
3021@@ -100,11 +116,14 @@
3022 QVariantMap map;
3023 map["designation"] = designation;
3024 map["visible"] = visible;
3025+ map["orbitVisible"] = orbitVisible;
3026 map["tle1"] = QString(elements[1]);
3027 map["tle2"] = QString(elements[2]);
3028- QVariantList col;
3029+ QVariantList col, orbitCol;;
3030 col << (double)hintColor[0] << (double)hintColor[1] << (double)hintColor[2];
3031+ orbitCol << (double)orbitColor[0] << (double)orbitColor[1] << (double)orbitColor[2];
3032 map["hintColor"] = col;
3033+ map["orbitColor"] = orbitCol;
3034 QVariantList commList;
3035 foreach(commLink c, comms)
3036 {
3037@@ -146,9 +165,23 @@
3038
3039 if (flags&Extra1)
3040 {
3041+ oss << "<p>";
3042 oss << QString("Range (km): <b>%1</b>").arg(range, 5, 'f', 2) << "<br>";
3043 oss << QString("Range rate (km/s): <b>%1</b>").arg(rangeRate, 5, 'f', 3) << "<br>";
3044 oss << QString("Altitude (km): <b>%1</b>").arg(height, 5, 'f', 2) << "<br>";
3045+ oss << QString("SubPoint Lat/Long(Deg): <b>%1</b>").arg(LatLong[0], 5, 'f', 2) << "/";
3046+ oss << QString("<b>%1</b>").arg(LatLong[1], 5, 'f', 3);
3047+ oss << "</p>";
3048+
3049+ oss << "TEME Coordinates(km): ";
3050+ oss << QString("<b>X:</b> %1 ").arg(Position[0], 5, 'f', 2);
3051+ oss << QString("<b>Y:</b> %1 ").arg(Position[1], 5, 'f', 2);
3052+ oss << QString("<b>Z:</b> %1 ").arg(Position[2], 5, 'f', 2) << "<br>";
3053+ oss << "TEME Vel(km/s): ";
3054+ oss << QString("<b>X:</b> %1 ").arg(Vel[0], 5, 'f', 2);
3055+ oss << QString("<b>Y:</b> %1 ").arg(Vel[1], 5, 'f', 2);
3056+ oss << QString("<b>Z:</b> %1 ").arg(Vel[2], 5, 'f', 2) << "<br>";
3057+
3058 }
3059
3060 if (flags&Extra2 && comms.size() > 0)
3061@@ -191,9 +224,10 @@
3062 {
3063 l = *loc;
3064 }
3065- obs_geodetic.lon = l.longitude * de2ra;
3066- obs_geodetic.lat = l.latitude * de2ra;
3067- obs_geodetic.alt = l.altitude / 1000.0;
3068+
3069+
3070+ observer.setPosition( l.latitude, l.longitude, l.altitude / 1000.0);
3071+
3072 }
3073
3074 Vec3f Satellite::getInfoColor(void) const {
3075@@ -212,36 +246,26 @@
3076
3077 void Satellite::update(double)
3078 {
3079- ClearFlag(ALL_FLAGS);
3080- Get_Next_Tle_Set(elements, &tle);
3081- memcpy(&localtle, &tle, sizeof(tle_t));
3082- select_ephemeris(&tle);
3083- double jul_epoch, jul_utc, tsince, phase;
3084- vector_t vel = {0,0,0,0};
3085- vector_t pos = {0,0,0,0};
3086- vector_t obs_set;
3087- geodetic_t sat_geodetic;
3088- jul_utc = StelApp::getInstance().getCore()->getNavigator()->getJDay();
3089- jul_epoch = Julian_Date_of_Epoch(tle.epoch);
3090- tsince = (jul_utc - jul_epoch) * xmnpda;
3091-
3092- if (isFlagSet(DEEP_SPACE_EPHEM_FLAG))
3093- SDP4(tsince, &tle, &pos, &vel, &phase);
3094- else
3095- SGP4(tsince, &tle, &pos, &vel, &phase);
3096-
3097- Convert_Sat_State(&pos, &vel);
3098- SgpMagnitude(&vel); // scalar magnitude, not brightness...
3099- velocity=vel.w;
3100-
3101- Calculate_Obs(jul_utc, &pos, &vel, &obs_geodetic, &obs_set);
3102- Calculate_LatLonAlt(jul_utc, &pos, &sat_geodetic);
3103-
3104- azimuth=Degrees(obs_set.x);
3105- elevation=Degrees(obs_set.y);
3106- range=obs_set.z;
3107- rangeRate=obs_set.w;
3108- height=sat_geodetic.alt;
3109+ double jul_utc = StelApp::getInstance().getCore()->getNavigator()->getJDay();
3110+
3111+ epochTime = jul_utc;
3112+
3113+ pSatellite->setEpoch( epochTime);
3114+ Position = pSatellite->getPos();
3115+ Vel = pSatellite->getVel();
3116+ LatLong = pSatellite->getSubPoint( epochTime);
3117+ azElPos = observer.calculateLook( *pSatellite, epochTime);
3118+
3119+
3120+ azimuth = azElPos[ AZIMUTH]/KDEG2RAD;
3121+ elevation = azElPos[ ELEVATION]/KDEG2RAD;
3122+ range = azElPos[ RANGE];
3123+ rangeRate = azElPos[ RANGERATE];
3124+ height = LatLong[2];
3125+
3126+ // Compute orbit points to draw orbit line.
3127+ if(orbitVisible) computeOrbitPoints();
3128+
3129 }
3130
3131 double Satellite::getDoppler(double freq) const
3132@@ -259,16 +283,164 @@
3133 XYZ = core->getNavigator()->j2000ToEquinoxEqu(core->getNavigator()->altAzToEquinoxEqu(pos));
3134 StelApp::getInstance().getVisionModeNight() ? glColor4f(0.6,0.0,0.0,1.0) : glColor4f(hintColor[0],hintColor[1],hintColor[2], Satellite::hintBrightness);
3135
3136+
3137 StelProjectorP prj = core->getProjection(StelCore::FrameJ2000);
3138 Vec3d xy;
3139 if (prj->project(XYZ,xy))
3140 {
3141+
3142 if (Satellite::showLabels)
3143 {
3144 painter.drawText(xy[0], xy[1], designation, 0, 10, 10, false);
3145 Satellite::hintTexture->bind();
3146 }
3147 painter.drawSprite2dMode(xy[0], xy[1], 11);
3148+
3149+ if(orbitVisible) drawOrbit(core, prj, painter);
3150+ }
3151+}
3152+
3153+void Satellite::drawOrbit(const StelCore* core, StelProjectorP& prj, StelPainter& painter){
3154+ Vec3d XYZPos, xy1;
3155+ float a, azimth, elev;
3156+ QVarLengthArray<float, 1024> vertexArray;
3157+
3158+
3159+ glDisable(GL_TEXTURE_2D);
3160+ glEnable(GL_LINE_SMOOTH);
3161+ glEnable(GL_BLEND);
3162+ painter.enableClientStates(true, false, false);
3163+
3164+ QList<gVector>::iterator it= orbitPoints.begin();
3165+
3166+ for(int i=0; i<orbitPoints.size();i++)
3167+ {
3168+ azimth = it->at( AZIMUTH);
3169+ elev = it->at( ELEVATION);
3170+ a = ( (azimth/KDEG2RAD)-90)*M_PI/180;
3171+ Vec3d pos(sin(a),cos(a), tan( (elev/KDEG2RAD) * M_PI / 180.));
3172+ XYZPos = core->getNavigator()->j2000ToEquinoxEqu(core->getNavigator()->altAzToEquinoxEqu(pos));
3173+
3174+ if (prj->project(XYZPos,xy1))
3175+ {
3176+ vertexArray.append(xy1[0]);
3177+ vertexArray.append(xy1[1]);
3178+ }
3179+ it++;
3180+
3181+ // draw the end parts of the orbit only, since they have non-standard color
3182+ // We'll draw the middle segment (with all the same color) with a single
3183+ // call to drawFromArray after this loop closes.
3184+ if (i>0 && ((DRAWORBIT_SLOTS_NUMBER/2) - abs(i - (DRAWORBIT_SLOTS_NUMBER/2) % DRAWORBIT_SLOTS_NUMBER)) < DRAWORBIT_FADE_NUMBER)
3185+ {
3186+ painter.setColor(hintColor[0], hintColor[1], hintColor[2], hintBrightness * calculateOrbitSegmentIntensity(i));
3187+ painter.setVertexPointer(2, GL_FLOAT, vertexArray.constData());
3188+ painter.drawFromArray(StelPainter::LineStrip, 2, i-1, false);
3189+ }
3190+ }
3191+
3192+ // draw the middle segments of the orbit which are all the same color
3193+ if(!vertexArray.isEmpty())
3194+ {
3195+ if (vertexArray.count() > (2*DRAWORBIT_FADE_NUMBER))
3196+ {
3197+ painter.setColor(hintColor[0], hintColor[1], hintColor[2], hintBrightness);
3198+ painter.setVertexPointer(2, GL_FLOAT, vertexArray.constData());
3199+ painter.drawFromArray(StelPainter::LineStrip, DRAWORBIT_SLOTS_NUMBER + 1 - (2*DRAWORBIT_FADE_NUMBER), DRAWORBIT_FADE_NUMBER - 1, false);
3200+ }
3201+ vertexArray.clear();
3202+ }
3203+
3204+ painter.enableClientStates(false);
3205+ glEnable(GL_TEXTURE_2D);
3206+}
3207+
3208+float Satellite::calculateOrbitSegmentIntensity(int segNum)
3209+{
3210+ int endDist = (DRAWORBIT_SLOTS_NUMBER/2) - abs(segNum - (DRAWORBIT_SLOTS_NUMBER/2) % DRAWORBIT_SLOTS_NUMBER);
3211+ if (endDist > DRAWORBIT_FADE_NUMBER) { return 1.0; }
3212+ else { return (endDist + 1) / (DRAWORBIT_FADE_NUMBER + 1.0); }
3213+}
3214+
3215+void Satellite::computeOrbitPoints(){
3216+
3217+ gTimeSpan computeInterval(0,0,0,DRAWORBIT_SLOT_SECNUMBER); //1/2 minute
3218+ gTimeSpan orbitSpan(0,0,0, DRAWORBIT_SLOTS_NUMBER*DRAWORBIT_SLOT_SECNUMBER/2); //+- 15 minutes range.
3219+ gTime epochTm;
3220+ gVector azElVector;
3221+ int diffSlots;
3222+
3223+
3224+ if( orbitPoints.isEmpty())//Setup orbitPoins
3225+ {
3226+ epochTm = epochTime - orbitSpan;
3227+
3228+ for(int i=0; i< DRAWORBIT_SLOTS_NUMBER; i++)
3229+ {
3230+ pSatellite->setEpoch( epochTm);
3231+ azElVector = observer.calculateLook( *pSatellite, epochTm);
3232+ orbitPoints.append(azElVector);
3233+ epochTm += computeInterval;
3234+ }
3235+ lastEpochCompForOrbit = epochTime;
3236+ }
3237+ else if( epochTime > lastEpochCompForOrbit)
3238+ { // compute next orbit point when clock runs forward
3239+
3240+ gTimeSpan diffTime = epochTime - lastEpochCompForOrbit;
3241+ diffSlots = (int)(diffTime.getDblSeconds()/DRAWORBIT_SLOT_SECNUMBER);
3242+
3243+ if(diffSlots > 0)
3244+ {
3245+ if( diffSlots > DRAWORBIT_SLOTS_NUMBER)
3246+ {
3247+ diffSlots = DRAWORBIT_SLOTS_NUMBER;
3248+ epochTm = epochTime - orbitSpan;
3249+ }
3250+ else
3251+ {
3252+ epochTm = lastEpochCompForOrbit + orbitSpan + computeInterval;
3253+ }
3254+
3255+ for( int i=0; i<diffSlots;i++)
3256+ { //remove points at beginning of list and add points at end.
3257+ orbitPoints.removeFirst();
3258+ pSatellite->setEpoch( epochTm);
3259+ azElVector = observer.calculateLook( *pSatellite, epochTm);
3260+ orbitPoints.append(azElVector);
3261+ epochTm += computeInterval;
3262+ }
3263+
3264+ lastEpochCompForOrbit = epochTime;
3265+ }
3266+ }
3267+ else if(epochTime < lastEpochCompForOrbit)
3268+ { // compute next orbit point when clock runs backward
3269+ gTimeSpan diffTime = lastEpochCompForOrbit - epochTime;
3270+ diffSlots = (int)(diffTime.getDblSeconds()/DRAWORBIT_SLOT_SECNUMBER);
3271+
3272+ if(diffSlots > 0)
3273+ {
3274+ if( diffSlots > DRAWORBIT_SLOTS_NUMBER)
3275+ {
3276+ diffSlots = DRAWORBIT_SLOTS_NUMBER;
3277+ epochTm = epochTime + orbitSpan;
3278+ }
3279+ else
3280+ {
3281+ epochTm = epochTime - orbitSpan - computeInterval;
3282+ }
3283+ for( int i=0; i<diffSlots;i++)
3284+ { //remove points at end of list and add points at beginning.
3285+ orbitPoints.removeLast();
3286+ pSatellite->setEpoch( epochTm);
3287+ azElVector = observer.calculateLook( *pSatellite, epochTm);
3288+ orbitPoints.push_front(azElVector);
3289+ epochTm -= computeInterval;
3290+
3291+ }
3292+ lastEpochCompForOrbit = epochTime;
3293+ }
3294 }
3295 }
3296
3297
3298=== modified file 'plugins/Satellites/src/Satellite.hpp'
3299--- plugins/Satellites/src/Satellite.hpp 2010-05-17 19:24:14 +0000
3300+++ plugins/Satellites/src/Satellite.hpp 2010-10-30 00:49:41 +0000
3301@@ -23,10 +23,23 @@
3302 #include <QVariant>
3303 #include <QString>
3304 #include <QStringList>
3305+#include <QFont>
3306+#include <QList>
3307
3308 #include "StelObject.hpp"
3309 #include "StelTextureTypes.hpp"
3310-#include "sgp4sdp4/sgp4sdp4.h"
3311+
3312+#include "StelPainter.hpp"
3313+#include "gsatellite/gSatTEME.hpp"
3314+#include "gsatellite/gObserver.hpp"
3315+#include "gsatellite/gTime.hpp"
3316+#include "gsatellite/gVector.hpp"
3317+
3318+
3319+#define DRAWORBIT_SLOTS_NUMBER 131
3320+#define DRAWORBIT_FADE_NUMBER 10
3321+#define DRAWORBIT_SLOT_SECNUMBER 10
3322+
3323
3324 class StelPainter;
3325 class StelLocation;
3326@@ -82,14 +95,26 @@
3327 double getDoppler(double freq) const;
3328 static float showLabels;
3329
3330+public:
3331+ void enableDrawOrbit(bool b);
3332+
3333+private:
3334+ //draw orbits methods
3335+ void computeOrbitPoints();
3336+ void drawOrbit(const StelCore* core, StelProjectorP& prj, StelPainter& painter);
3337+ //! returns 0 - 1.0 for the DRAWORBIT_FADE_NUMBER segments at
3338+ //! each end of an orbit, with 1 in the middle.
3339+ float calculateOrbitSegmentIntensity(int segNum);
3340+
3341 private:
3342 bool initialized;
3343 bool visible;
3344+ bool orbitVisible; //draw orbit enabled/disabled
3345+
3346 QString designation; // The ID of the satllite
3347 QString description; // longer description of spacecraft
3348 Vec3d XYZ; // holds J2000 position
3349 char elements[3][80]; // TLE elements as char* for passing to sgp lib
3350- tle_t tle, localtle;
3351 double height, velocity, azimuth, elevation, range, rangeRate;
3352 QList<commLink> comms;
3353 Vec3f hintColor;
3354@@ -98,10 +123,25 @@
3355 static StelTextureSP hintTexture;
3356 static float hintBrightness;
3357 static float hintScale;
3358- geodetic_t obs_geodetic; // observer location
3359
3360 void draw(const StelCore* core, StelPainter& painter, float maxMagHints);
3361 void setObserverLocation(StelLocation* loc=NULL);
3362+
3363+ //gsatellite objects
3364+ gSatTEME *pSatellite;
3365+ gObserver observer;
3366+ gTime epochTime;
3367+ gVector Position;
3368+ gVector Vel;
3369+ gVector LatLong;
3370+ gVector azElPos;
3371+
3372+ //Satellite Orbit Draw
3373+ QFont font;
3374+ Vec3f orbitColor;
3375+ gTime lastEpochCompForOrbit;
3376+ QList<gVector> orbitPoints; //orbit points represented by azElPos vectors
3377+
3378 };
3379
3380 #endif // _SATELLITE_HPP_
3381
3382=== modified file 'plugins/Satellites/src/Satellites.hpp'
3383--- plugins/Satellites/src/Satellites.hpp 2010-04-18 17:48:49 +0000
3384+++ plugins/Satellites/src/Satellites.hpp 2010-10-30 00:49:41 +0000
3385@@ -42,7 +42,7 @@
3386 typedef QSharedPointer<Satellite> SatelliteP;
3387
3388 //! @class Satellites
3389-//! Satellites in low Earth orbith require different orbital calculations from planets, the moon
3390+//! Satellites in low Earth orbit require different orbital calculations from planets, the moon
3391 //! and so on. This plugin implements the SGP4/SDP4 algorithms in Stellarium, allowing accurate
3392 //! prediction of the position of artificial satellites.
3393 class Satellites : public StelObjectModule
3394
3395=== added directory 'plugins/Satellites/src/gsatellite'
3396=== added file 'plugins/Satellites/src/gsatellite/gException.hpp'
3397--- plugins/Satellites/src/gsatellite/gException.hpp 1970-01-01 00:00:00 +0000
3398+++ plugins/Satellites/src/gsatellite/gException.hpp 2010-10-30 00:49:41 +0000
3399@@ -0,0 +1,44 @@
3400+/***************************************************************************
3401+ * Copyright (C) 2006 by j. l. Canales *
3402+ * jlcanales@users.sourceforge.net *
3403+ * *
3404+ * This program is free software; you can redistribute it and/or modify *
3405+ * it under the terms of the GNU General Public License as published by *
3406+ * the Free Software Foundation; either version 2 of the License, or *
3407+ * (at your option) any later version. *
3408+ * *
3409+ * This program is distributed in the hope that it will be useful, *
3410+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
3411+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
3412+ * GNU General Public License for more details. *
3413+ * *
3414+ * You should have received a copy of the GNU General Public License *
3415+ * along with this program; if not, write to the *
3416+ * Free Software Foundation, Inc., *
3417+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
3418+ ***************************************************************************/
3419+
3420+#ifndef _GEXCEPTION_HPP_
3421+#define _GEXCEPTION_HPP_ 1
3422+
3423+#include <stdexcept>
3424+
3425+//Exception Codes
3426+#define EXCP_UNKNOWN 1
3427+#define EXCP_INCORRECTPARAM 2
3428+#define EXCP_OPERATIONOVERFLOW 3
3429+#define EXCP_MEMORYALLOCATION 4
3430+#define EXCP_COMPUTEOVERFLOW 5
3431+
3432+typedef unsigned int GEXCEPTIONTYPE;
3433+
3434+// Exception messages for GMatrix
3435+
3436+#define OPERATOR_X_INCOMPATIBLE_ORDER "The matrix have incompatible order to calculate its verctorial product"
3437+#define OPERATOR_ADD_INCOMPATIBLE_ORDER "The matrix have incompatible order to calculate the addition"
3438+#define OPERATOR_ADDEQUAL_INCOMPATIBLE_ORDER "The matrix have incompatible order to calculate the addition"
3439+#define OPERATOR_DIFF_INCOMPATIBLE_ORDER "The matrix have incompatible order to calculate the substraction"
3440+#define OPERATOR_DIFFEQUAL_INCOMPATIBLE_ORDER "The matrix have incompatible order to calculate the substraction"
3441+#define DET_INCOMPATIBLE_ORDER "The matrix is not square, the determinant can't be calculate."
3442+
3443+#endif // _GEXCEPTION_HPP_
3444
3445=== added file 'plugins/Satellites/src/gsatellite/gMatrix.cpp'
3446--- plugins/Satellites/src/gsatellite/gMatrix.cpp 1970-01-01 00:00:00 +0000
3447+++ plugins/Satellites/src/gsatellite/gMatrix.cpp 2010-10-30 00:49:41 +0000
3448@@ -0,0 +1,290 @@
3449+/***************************************************************************
3450+ * Name: GMatrix.cpp
3451+ *
3452+ * Date: 2009-12-31 16:34:55 +0100 (jue, 31 dic 2009)
3453+ * Revision: 17
3454+ * HeadURL: https://gsat.svn.sourceforge.net/svnroot/gsat/trunk/src/GMatrix.cpp
3455+ *
3456+ * Description: GMatrix Definition.
3457+ * GMatrix class define a bidimensional GDOUBLE elements matrix
3458+ * and the basic matrix operations.
3459+ *
3460+ ***************************************************************************/
3461+
3462+/***************************************************************************
3463+ * Copyright (C) 2004 by JL Canales *
3464+ * ph03696@homeserver *
3465+ * *
3466+ * This program is free software; you can redistribute it and/or modify *
3467+ * it under the terms of the GNU General Public License as published by *
3468+ * the Free Software Foundation; either version 2 of the License, or *
3469+ * (at your option) any later version. *
3470+ * *
3471+ * This program is distributed in the hope that it will be useful, *
3472+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
3473+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
3474+ * GNU General Public License for more details. *
3475+ * *
3476+ * You should have received a copy of the GNU General Public License *
3477+ * along with this program; if not, write to the *
3478+ * Free Software Foundation, Inc., *
3479+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
3480+ ***************************************************************************/
3481+
3482+// CMatrix
3483+#include "gMatrix.hpp"
3484+#include "gException.hpp"
3485+
3486+#include <cassert>
3487+
3488+// Class gMatrix
3489+gMatrix::gMatrix() : gMatrixTempl<double>()
3490+{
3491+}
3492+
3493+gMatrix::gMatrix(unsigned int ai_uiRowNumber, unsigned int ai_uiColumNumber)
3494+ : gMatrixTempl<double>(ai_uiRowNumber, ai_uiColumNumber)
3495+{
3496+
3497+}
3498+
3499+
3500+bool gMatrix::operator!=(const gMatrix &right) const
3501+{
3502+ if((*this)==(right))
3503+ {
3504+ return false;
3505+ }
3506+ else
3507+ {
3508+ return true;
3509+ }
3510+}
3511+
3512+
3513+
3514+//## Other Operations (implementation)
3515+
3516+gMatrix gMatrix::operator *(const gMatrix &ai_RightMatrix)
3517+{
3518+
3519+ unsigned int iRow;
3520+ unsigned int iColumn;
3521+ unsigned int uiRightColumn = ai_RightMatrix.Columns();
3522+ unsigned int uiRightRow = ai_RightMatrix.Rows();
3523+
3524+ unsigned int Iterator;
3525+ double dAuxValue = 0;
3526+ gMatrix ReturnedMatrix(Rows(), uiRightColumn);
3527+
3528+
3529+ if(Columns() != uiRightRow)
3530+ {
3531+ throw std::out_of_range(OPERATOR_X_INCOMPATIBLE_ORDER);
3532+ }
3533+ else
3534+ {
3535+ for(iRow = 0; iRow < Rows(); iRow++)
3536+ for(iColumn = 0; iColumn < uiRightColumn; iColumn++)
3537+ {
3538+ // Product and addition of implied elements
3539+ for(Iterator = 0; Iterator < uiRightRow; Iterator++)
3540+ {
3541+ dAuxValue += (operator[](iRow)[ Iterator] *
3542+ ai_RightMatrix[ Iterator][ iColumn]);
3543+ }
3544+
3545+ ReturnedMatrix[ iRow][ iColumn] = dAuxValue;
3546+ dAuxValue = 0;
3547+ }
3548+ }
3549+
3550+ return ReturnedMatrix;
3551+}
3552+
3553+
3554+gVector gMatrix::operator *(const gVector &ai_RightVector)
3555+{
3556+
3557+ unsigned int iRow;
3558+ unsigned int iColumn;
3559+
3560+ double dAuxValue = 0;
3561+ gVector ReturnedVector(Rows());
3562+
3563+ assert(Columns() == ai_RightVector.size());
3564+
3565+
3566+ if(Columns() != ai_RightVector.size())
3567+ {
3568+ throw std::out_of_range(OPERATOR_X_INCOMPATIBLE_ORDER);
3569+ }
3570+ else
3571+ {
3572+ for(iRow = 0; iRow < Rows(); iRow++)
3573+ {
3574+ for(iColumn = 0; iColumn < Columns(); iColumn++)
3575+ {
3576+ // Product and addition of implied elements
3577+ dAuxValue += (operator[](iRow)[ iColumn] *
3578+ ai_RightVector[ iColumn]);
3579+ }
3580+
3581+ ReturnedVector[ iRow] = dAuxValue;
3582+ dAuxValue = 0;
3583+
3584+ }
3585+ }
3586+ return ReturnedVector;
3587+}
3588+
3589+
3590+gMatrix gMatrix::operator *(double ai_dRight)
3591+{
3592+ unsigned int iRow;
3593+ unsigned int iColumn;
3594+ gMatrix ReturnedMatrix(Rows(), Columns());
3595+
3596+ try
3597+ {
3598+ for(iRow = 0; iRow < Rows(); iRow++)
3599+ for(iColumn = 0; iColumn < Columns(); iColumn ++)
3600+ ReturnedMatrix[ iRow][ iColumn] = ((*this)[ iRow][ iColumn] * ai_dRight);
3601+ }
3602+ catch(...)
3603+ {
3604+ for(iRow = 0; iRow < Rows(); iRow++)
3605+ for(iColumn = 0; iColumn < Columns(); iColumn ++)
3606+ ReturnedMatrix[ iRow][ iColumn] = 0;
3607+
3608+ throw;
3609+ }
3610+
3611+ return ReturnedMatrix;
3612+}
3613+
3614+gMatrix gMatrix::operator+(gMatrix &ai_RightMatrix) const
3615+{
3616+
3617+ gMatrix ReturnedMatrix(Rows(), Columns());
3618+
3619+#ifdef ENABLE_DEBUG
3620+ assert(Rows()==ai_RightMatrix.Rows() && Columns()==ai_RightMatrix.Columns());
3621+#endif
3622+
3623+ if(Rows()!=ai_RightMatrix.Rows() || Columns()!=ai_RightMatrix.Columns())
3624+ {
3625+ throw std::out_of_range(OPERATOR_ADD_INCOMPATIBLE_ORDER);
3626+ }
3627+
3628+
3629+ for(unsigned int i = 0; i<Rows(); i++)
3630+ for(unsigned int j = 0; j<Columns(); j++)
3631+ ReturnedMatrix[ i][ j] = operator[](i)[ j] + ai_RightMatrix[ i][ j];
3632+
3633+
3634+ return ReturnedMatrix;
3635+
3636+}
3637+
3638+const gMatrix& gMatrix::operator+=(gMatrix &ai_RightMatrix)
3639+{
3640+
3641+#ifdef ENABLE_DEBUG
3642+ assert(Rows()==ai_RightMatrix.Rows() && Columns()==ai_RightMatrix.Columns());
3643+#endif
3644+
3645+ if(Rows()!=ai_RightMatrix.Rows() || Columns()!=ai_RightMatrix.Columns())
3646+ {
3647+ throw std::out_of_range(OPERATOR_ADDEQUAL_INCOMPATIBLE_ORDER);
3648+ }
3649+ for(unsigned int i = 0; i<Rows(); i++)
3650+ for(unsigned int j = 0; j<Columns(); j++)
3651+ operator[](i)[ j] = operator[](i)[ j] + ai_RightMatrix[ i][ j];
3652+
3653+
3654+ return *this;
3655+
3656+}
3657+
3658+gMatrix gMatrix::operator-(gMatrix &ai_RightMatrix) const
3659+{
3660+
3661+ gMatrix ReturnedMatrix(Rows(), Columns());
3662+
3663+#ifdef ENABLE_DEBUG
3664+ assert(Rows()==ai_RightMatrix.Rows() && Columns()==ai_RightMatrix.Columns());
3665+#endif
3666+
3667+ if(Rows()!=ai_RightMatrix.Rows() || Columns()!=ai_RightMatrix.Columns())
3668+ {
3669+ throw std::out_of_range(OPERATOR_DIFF_INCOMPATIBLE_ORDER);
3670+ }
3671+ for(unsigned int i = 0; i<Rows(); i++)
3672+ for(unsigned int j = 0; j<Columns(); j++)
3673+ ReturnedMatrix[ i][ j] = operator[](i)[ j] - ai_RightMatrix[ i][ j];
3674+
3675+
3676+ return ReturnedMatrix;
3677+
3678+}
3679+
3680+const gMatrix& gMatrix::operator-=(gMatrix &ai_RightMatrix)
3681+{
3682+
3683+#ifdef ENABLE_DEBUG
3684+ assert(Rows()==ai_RightMatrix.Rows() && Columns()==ai_RightMatrix.Columns());
3685+#endif
3686+
3687+ if(Rows()!=ai_RightMatrix.Rows() || Columns()!=ai_RightMatrix.Columns())
3688+ {
3689+ throw std::out_of_range(OPERATOR_DIFFEQUAL_INCOMPATIBLE_ORDER);
3690+ }
3691+ for(unsigned int i = 0; i<Rows(); i++)
3692+ for(unsigned int j = 0; j<Columns(); j++)
3693+ operator[](i)[ j] = operator[](i)[ j] - ai_RightMatrix[ i][ j];
3694+
3695+
3696+ return *this;
3697+
3698+}
3699+
3700+double gMatrix::det()
3701+{
3702+
3703+ gMatrix aux=*this;
3704+ double dDet;
3705+ int k,l,i,j;
3706+ int n = Rows();
3707+ int m = n-1;
3708+
3709+
3710+ try
3711+ {
3712+ if(Columns() != Rows())
3713+ {
3714+ throw std::invalid_argument(DET_INCOMPATIBLE_ORDER);
3715+ }
3716+
3717+ dDet=aux[0][0];
3718+ for(k=0; k<m; k++)
3719+ {
3720+ l=k+1;
3721+ for(i=l; i<n; i++)
3722+ {
3723+ for(j=l; j<n; j++)
3724+ {
3725+ aux[i][j] = (aux[k][k]*aux[i][j]-aux[k][j]*aux[i][k])/aux[k][k];
3726+ }
3727+ }
3728+ dDet=dDet*aux[k+1][k+1];
3729+ }
3730+
3731+ return dDet;
3732+ }
3733+ catch(...)
3734+ {
3735+ throw;
3736+ }
3737+}
3738+
3739
3740=== added file 'plugins/Satellites/src/gsatellite/gMatrix.hpp'
3741--- plugins/Satellites/src/gsatellite/gMatrix.hpp 1970-01-01 00:00:00 +0000
3742+++ plugins/Satellites/src/gsatellite/gMatrix.hpp 2010-10-30 00:49:41 +0000
3743@@ -0,0 +1,86 @@
3744+/***************************************************************************
3745+ * Name: gMatrix.h
3746+ *
3747+ * Date: 2007-03-29 17:01:15 +0200 (jue, 29 mar 2007)
3748+ * Revision: 16
3749+ * HeadURL: https://gsat.svn.sourceforge.net/svnroot/gsat/trunk/src/GMatrix.h
3750+ *
3751+ * Description: Fichero de descripci� de la clase GMatrix.
3752+ * Esta clase tiene como cometido la encapsulaci� de objetos
3753+ * tipo matriz bidimensional de elementos GDOUBLE junto con
3754+ * las operaciones de matrices realizables.
3755+ *
3756+ *
3757+ ***************************************************************************/
3758+
3759+/***************************************************************************
3760+ * Copyright (C) 2004 by JL Canales *
3761+ * ph03696@homeserver *
3762+ * *
3763+ * This program is free software; you can redistribute it and/or modify *
3764+ * it under the terms of the GNU General Public License as published by *
3765+ * the Free Software Foundation; either version 2 of the License, or *
3766+ * (at your option) any later version. *
3767+ * *
3768+ * This program is distributed in the hope that it will be useful, *
3769+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
3770+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
3771+ * GNU General Public License for more details. *
3772+ * *
3773+ * You should have received a copy of the GNU General Public License *
3774+ * along with this program; if not, write to the *
3775+ * Free Software Foundation, Inc., *
3776+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
3777+ ***************************************************************************/
3778+
3779+#ifndef _GMATRIX_HPP_
3780+#define _GMATRIX_HPP_ 1
3781+
3782+// MatrixContainer
3783+#include "gMatrixTempl.hpp"
3784+#include "gVector.hpp"
3785+
3786+//! @class: gMatrix
3787+//! This class implement the needed code to make matrix calculations.
3788+//! The GMatrix class inherit from MatrixContainer class that is created
3789+//! from the vector STL class givingt all the STL vector funcionality.
3790+//! This class has not overlapped the = operator and the copy constructor
3791+//! because this methods are given by the vector STL class.
3792+class gMatrix : public gMatrixTempl<double>
3793+{
3794+public:
3795+ //## Constructors (generated)
3796+ gMatrix();
3797+
3798+ //## Constructors (specified)
3799+ //## Operation:gMatrix%950961952
3800+ // Constructor whit row and column dimensions.
3801+ gMatrix ( unsigned int ai_uiRowNumber, unsigned int ai_uiColumNumber);
3802+
3803+ //## Equality Operations (generated)
3804+ bool operator!=( const gMatrix &right) const;
3805+
3806+ //## Other Operations (specified)
3807+ //## Operation: operator*%949869240
3808+ // This operators make the vectorial product calculation
3809+ gMatrix operator* ( const gMatrix &ai_RightMatrix);
3810+
3811+ //## Operation: operator*%949869240
3812+ // This operators make the vectorial product calculation
3813+ gVector operator* ( const gVector &ai_RightVector);
3814+
3815+ //## Operation: operator*%949869241
3816+ // This operator make the scalar product calculation.
3817+ gMatrix operator* ( double ai_dRight);
3818+
3819+ gMatrix operator+ ( gMatrix &ai_RightMatrix) const;
3820+ const gMatrix& operator+=( gMatrix &ai_RightMatrix);
3821+
3822+ gMatrix operator- ( gMatrix &ai_RightMatrix) const;
3823+ const gMatrix& operator-=( gMatrix &ai_RightMatrix);
3824+
3825+ // Determinant
3826+ double det();
3827+};
3828+
3829+#endif //_GMATRIX_HPP_
3830
3831=== added file 'plugins/Satellites/src/gsatellite/gMatrixTempl.hpp'
3832--- plugins/Satellites/src/gsatellite/gMatrixTempl.hpp 1970-01-01 00:00:00 +0000
3833+++ plugins/Satellites/src/gsatellite/gMatrixTempl.hpp 2010-10-30 00:49:41 +0000
3834@@ -0,0 +1,117 @@
3835+/***************************************************************************
3836+ * Name: gMatrixTempl.h
3837+ *
3838+ * Description: MatrixContainer is a template to build
3839+ * bidimensional objects arrays.
3840+ ***************************************************************************/
3841+
3842+/***************************************************************************
3843+ * Copyright (C) 2006 by j. l. Canales *
3844+ * jlcanales@users.sourceforge.net *
3845+ * *
3846+ * This program is free software; you can redistribute it and/or modify *
3847+ * it under the terms of the GNU General Public License as published by *
3848+ * the Free Software Foundation; either version 2 of the License, or *
3849+ * (at your option) any later version. *
3850+ * *
3851+ * This program is distributed in the hope that it will be useful, *
3852+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
3853+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
3854+ * GNU General Public License for more details. *
3855+ * *
3856+ * You should have received a copy of the GNU General Public License *
3857+ * along with this program; if not, write to the *
3858+ * Free Software Foundation, Inc., *
3859+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
3860+ ***************************************************************************/
3861+
3862+#ifndef _GMATRIXTEMPL_HPP_
3863+#define _GMATRIXTEMPL_HPP_ 1
3864+
3865+#include "gVectorTempl.hpp" // checked vector
3866+#include <iostream> // for operator<<(), see below
3867+
3868+// matrix as vector of vectors
3869+template<class T>
3870+class gMatrixTempl : public br_stl::gVectorTempl<
3871+ br_stl::gVectorTempl<T> >
3872+{
3873+public:
3874+ typedef typename std::vector<T>::size_type size_type;
3875+
3876+ gMatrixTempl(size_type x = 0, size_type y = 0)
3877+ : br_stl::gVectorTempl< br_stl::gVectorTempl<T> >(x, br_stl::gVectorTempl<T>(y)), rows(x), columns(y)
3878+ {
3879+ }
3880+
3881+ gMatrixTempl(const gMatrixTempl<T> &right)
3882+ : br_stl::gVectorTempl< br_stl::gVectorTempl<T> >(right.rows, br_stl::gVectorTempl<T>(right.columns)), rows(right.rows), columns(right.columns)
3883+ {
3884+
3885+ for(size_type i = 0; i < rows; ++i)
3886+ for(size_type j = 0; j < columns ; ++j)
3887+ operator[](i)[j] = right[ i][ j];
3888+ }
3889+
3890+ size_type Rows() const
3891+ {
3892+ return rows;
3893+ }
3894+
3895+ size_type Columns() const
3896+ {
3897+ return columns;
3898+ }
3899+
3900+ void SetSize(size_type x, size_type y)
3901+ {
3902+
3903+ br_stl::gVectorTempl< br_stl::gVectorTempl<T> >::resize(x);
3904+ for(size_type index = 0; index < x; index++)
3905+ operator[](index).resize(y);
3906+
3907+ rows = x;
3908+ columns = y;
3909+ }
3910+
3911+
3912+ void init(const T& Value)
3913+ {
3914+ for(size_type i = 0; i < rows; ++i)
3915+ for(size_type j = 0; j < columns ; ++j)
3916+ operator[](i)[j] = Value; // that is, (*this)[i][j]
3917+ }
3918+
3919+ // create identity matrix
3920+ gMatrixTempl<T>& I()
3921+ {
3922+ for(size_type i = 0; i < rows; ++i)
3923+ for(size_type j = 0; j < columns ; ++j)
3924+ operator[](i)[j] = (i==j) ? T(1) : T(0);
3925+ return *this;
3926+ }
3927+
3928+protected:
3929+ size_type rows;
3930+ size_type columns;
3931+
3932+
3933+}; // class Matrix
3934+
3935+
3936+template<class T>
3937+inline std::ostream& operator<<(std::ostream& s, const gMatrixTempl<T>& m)
3938+{
3939+ typedef typename gMatrixTempl<T>::size_type size_type;
3940+
3941+ for(size_type i = 0; i < m.Rows(); ++i)
3942+ {
3943+ s << std::endl << i <<" : ";
3944+ for(size_type j = 0; j < m.Columns(); ++j)
3945+ s << m[i][j] <<" ";
3946+ }
3947+ s << std::endl;
3948+ return s;
3949+}
3950+
3951+#endif // _GMATRIXTEMPL_HPP_
3952
3953=== added file 'plugins/Satellites/src/gsatellite/gObserver.cpp'
3954--- plugins/Satellites/src/gsatellite/gObserver.cpp 1970-01-01 00:00:00 +0000
3955+++ plugins/Satellites/src/gsatellite/gObserver.cpp 2010-10-30 00:49:41 +0000
3956@@ -0,0 +1,88 @@
3957+/*
3958+ * gObserver.cpp
3959+ *
3960+ * Created on: 05/08/2010
3961+ * Author: cdeveloper
3962+ */
3963+
3964+#include "stdsat.h"
3965+#include "gVector.hpp"
3966+#include "gObserver.hpp"
3967+#include "gTime.hpp"
3968+#include "mathUtils.hpp"
3969+#include <math.h>
3970+
3971+//! Definition: This operation compute the observer ECI coordinates for the ai_epoch time
3972+void gObserver::getECIPosition(gTime ai_epoch, gVector& ao_position, gVector& ao_vel)
3973+{
3974+ ao_position.resize(3);
3975+ ao_vel.resize(3);
3976+ double radLatitude = m_latitude * KDEG2RAD;
3977+ double theta = ai_epoch.toThetaLMST(m_longitude * KDEG2RAD);
3978+ double r;
3979+ double c,sq;
3980+
3981+ /* Reference: The 1992 Astronomical Almanac, page K11. */
3982+ c = 1/sqrt(1 + __f*(__f - 2)*Sqr(sin(radLatitude)));
3983+ sq = Sqr(1 - __f)*c;
3984+
3985+ r = (KEARTHRADIUS*c + m_attitude)*cos(radLatitude);
3986+ ao_position[0] = r * cos(theta);/*kilometers*/
3987+ ao_position[1] = r * sin(theta);
3988+ ao_position[2] = (KEARTHRADIUS*sq + m_attitude)*sin(radLatitude);
3989+ ao_vel[0] = -KMFACTOR*ao_position[1];/*kilometers/second*/
3990+ ao_vel[1] = KMFACTOR*ao_position[0];
3991+ ao_vel[2] = 0;
3992+}
3993+
3994+gVector gObserver::calculateLook(gSatTEME ai_Sat, gTime ai_epoch)
3995+{
3996+
3997+ gVector returnVector(4);
3998+ gVector topoSatPos(3);
3999+ gVector observerECIPos;
4000+ gVector observerECIVel;
4001+
4002+
4003+ double radLatitude = m_latitude * KDEG2RAD;
4004+ double theta = ai_epoch.toThetaLMST(m_longitude * KDEG2RAD);
4005+
4006+ getECIPosition(ai_epoch, observerECIPos, observerECIVel);
4007+ ai_Sat.setEpoch(ai_epoch);
4008+
4009+ gVector satECIPos = ai_Sat.getPos();
4010+ gVector satECIVel = ai_Sat.getVel();
4011+ gVector slantRange = satECIPos - observerECIPos;
4012+ gVector rangeVel = satECIVel - observerECIVel;
4013+
4014+ //top_s
4015+ topoSatPos[0] = sin(radLatitude) * cos(theta)*slantRange[0]
4016+ + sin(radLatitude)* sin(theta)*slantRange[1]
4017+ - cos(radLatitude)* slantRange[2];
4018+ //top_e
4019+ topoSatPos[1] = (-1.0)* sin(theta)*slantRange[0]
4020+ + cos(theta)*slantRange[1];
4021+
4022+ //top_z
4023+ topoSatPos[2] = cos(radLatitude) * cos(theta)*slantRange[0]
4024+ + cos(radLatitude) * sin(theta)*slantRange[1]
4025+ + sin(radLatitude) *slantRange[2];
4026+
4027+ returnVector[ AZIMUTH] = atan((-1.0)*topoSatPos[1]/topoSatPos[0]);
4028+ if(topoSatPos[0] > 0)
4029+ returnVector[ AZIMUTH] += KPI;
4030+ if(returnVector[ AZIMUTH] < 0)
4031+ returnVector[ AZIMUTH] += K2PI;
4032+
4033+ returnVector[ RANGE] = slantRange.Magnitude();
4034+ returnVector[ ELEVATION] = asin(topoSatPos[2]/returnVector[ RANGE]);
4035+ returnVector[ RANGERATE] = slantRange.Dot(rangeVel)/returnVector[ RANGE];
4036+ return returnVector;
4037+
4038+
4039+ // Corrections for atmospheric refraction
4040+ // Reference: Astronomical Algorithms by Jean Meeus, pp. 101-104
4041+ // Correction is meaningless when apparent elevation is below horizon
4042+ // obs_set->y = obs_set->y + Radians((1.02/tan(Radians(Degrees(el)+
4043+ // 10.3/(Degrees(el)+5.11))))/60);
4044+}
4045
4046=== added file 'plugins/Satellites/src/gsatellite/gObserver.hpp'
4047--- plugins/Satellites/src/gsatellite/gObserver.hpp 1970-01-01 00:00:00 +0000
4048+++ plugins/Satellites/src/gsatellite/gObserver.hpp 2010-10-30 00:49:41 +0000
4049@@ -0,0 +1,114 @@
4050+/***************************************************************************
4051+ * Name: gObserver.hpp
4052+ ***************************************************************************/
4053+
4054+/***************************************************************************
4055+ * Copyright (C) 2006 by J. L. Canales *
4056+ * jlcanales@users.sourceforge.net *
4057+ * *
4058+ * This program is free software; you can redistribute it and/or modify *
4059+ * it under the terms of the GNU General Public License as published by *
4060+ * the Free Software Foundation; either version 2 of the License, or *
4061+ * (at your option) any later version. *
4062+ * *
4063+ * This program is distributed in the hope that it will be useful, *
4064+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
4065+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
4066+ * GNU General Public License for more details. *
4067+ * *
4068+ * You should have received a copy of the GNU General Public License *
4069+ * along with this program; if not, write to the *
4070+ * Free Software Foundation, Inc., *
4071+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
4072+ ***************************************************************************/
4073+#ifndef _GOBSERVER_HPP_
4074+#define _GOBSERVER_HPP_ 1
4075+
4076+// stdsat
4077+#include "stdsat.h"
4078+#include "gVector.hpp"
4079+#include "gTime.hpp"
4080+#include "gSatTEME.hpp"
4081+
4082+#define AZIMUTH 0
4083+#define ELEVATION 1
4084+#define RANGE 2
4085+#define RANGERATE 3
4086+
4087+//! @class gObserver
4088+//! This class implements the need functionality to change
4089+//! coordinates from Geographic Reference System to Observer Reference System
4090+class gObserver
4091+{
4092+public:
4093+ //## Constructors (generated)
4094+ //! @brief Default class gObserver constructor
4095+ //! @param[in] ai_latitude Observer Geographic latitude
4096+ //! @param[in] ai_longitude Observer Geographic longitude
4097+ //! @param[in] ai_attitude Observer Geographic attitude
4098+ gObserver(double ai_latitude=0, double ai_longitude=0 , double ai_attitude=0):
4099+ m_latitude(ai_latitude),m_longitude(ai_longitude), m_attitude(ai_attitude)
4100+ {
4101+ ;
4102+ }
4103+
4104+ //! Method used to get observer latitude.
4105+ //!
4106+ double getLatitude()
4107+ {
4108+ return m_latitude;
4109+ }
4110+
4111+ //! Method used to get observer object longitude.
4112+ //!
4113+ double getLongitude()
4114+ {
4115+ return m_longitude;
4116+ }
4117+
4118+ //! Method used to set Observer geographic position.
4119+ //!
4120+ void setPosition(double ai_latitude, double ai_longitude, double ai_attitude)
4121+ {
4122+ m_latitude = ai_latitude;
4123+ m_longitude = ai_longitude;
4124+ m_attitude = ai_attitude;
4125+ }
4126+
4127+
4128+
4129+ // Operation getECIPosition
4130+ //! @brief This operation compute the observer ECI coordinates for the
4131+ //! ai_epoch time
4132+ //! @details
4133+ //! References:
4134+ //! Orbital Coordinate Systems, Part II
4135+ //! Dr. T.S. Kelso
4136+ //! http://www.celestrak.com/columns/v02n02/
4137+ //! @param[in] ai_epoch Epoch for the ECI reference system calculation
4138+ //! @param[out] ao_position Observer position vector
4139+ //! @param[out] ao_vel Observer velocity vector
4140+ //! gVector Vector including X,Y,Z ECI Coordinates
4141+ void getECIPosition(gTime ai_epoch, gVector& ao_position, gVector& ao_vel);
4142+
4143+ // Operation calculateLook
4144+ //! @brief This operation compute the Azimuth, Elevation and Range of
4145+ //! a satellite from the observer site.
4146+ //! @param[in] ai_Sat Sat TEME object to be looked.
4147+ //! @param[in] ai_epoch Epoch for the ECI reference system calculation
4148+ //! @return gVector Vector including Az, El, Range coordinates
4149+ //! References:
4150+ //! Orbital Coordinate Systems, Part II
4151+ //! Dr. T.S. Kelso
4152+ //! http://www.celestrak.com/columns/v02n02/
4153+ gVector calculateLook(gSatTEME ai_Sat, gTime ai_epoch);
4154+
4155+private: //## implementation
4156+
4157+ double m_latitude; //meassured in degrees
4158+ double m_longitude; //meassured in degrees
4159+ double m_attitude;
4160+
4161+};
4162+
4163+#endif // _GOBSERVER_HPP_
4164
4165=== added file 'plugins/Satellites/src/gsatellite/gSatTEME.cpp'
4166--- plugins/Satellites/src/gsatellite/gSatTEME.cpp 1970-01-01 00:00:00 +0000
4167+++ plugins/Satellites/src/gsatellite/gSatTEME.cpp 2010-10-30 00:49:41 +0000
4168@@ -0,0 +1,156 @@
4169+/***************************************************************************
4170+ * Name: gSatTEME.cpp
4171+ *
4172+ * Description: gSatTEME class implementation.
4173+ * This class abstract all the SGP4 complexity. It uses the
4174+ * David. A. Vallado code for SGP4 Calculation.
4175+ *
4176+ * Reference:
4177+ * Revisiting Spacetrack Report #3 AIAA 2006-6753
4178+ * Vallado, David A., Paul Crawford, Richard Hujsak, and T.S.
4179+ * Kelso, "Revisiting Spacetrack Report #3,"
4180+ * presented at the AIAA/AAS Astrodynamics Specialist
4181+ * Conference, Keystone, CO, 2006 August 21–24.
4182+ * http://celestrak.com/publications/AIAA/2006-6753/
4183+ ***************************************************************************/
4184+
4185+/***************************************************************************
4186+ * Copyright (C) 2004 by J.L. Canales *
4187+ * ph03696@homeserver *
4188+ * *
4189+ * This program is free software; you can redistribute it and/or modify *
4190+ * it under the terms of the GNU General Public License as published by *
4191+ * the Free Software Foundation; either version 2 of the License, or *
4192+ * (at your option) any later version. *
4193+ * *
4194+ * This program is distributed in the hope that it will be useful, *
4195+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
4196+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
4197+ * GNU General Public License for more details. *
4198+ * *
4199+ * You should have received a copy of the GNU General Public License *
4200+ * along with this program; if not, write to the *
4201+ * Free Software Foundation, Inc., *
4202+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
4203+ ***************************************************************************/
4204+
4205+// GKepFile
4206+#include "gSatTEME.hpp"
4207+#include <iostream>
4208+#include <iomanip>
4209+
4210+#include "stdsat.h"
4211+#include "mathUtils.hpp"
4212+
4213+#include "sgp4io.h"
4214+
4215+#define CONSTANTS_SET wgs72
4216+#define TYPERUN_SET 'c'
4217+#define OPSMODE_SET 'i'
4218+#define TYPEINPUT_SET 'm'
4219+
4220+#define LATITUDE 0
4221+#define LONGITUDE 1
4222+#define ALTITUDE 2
4223+
4224+// Constructors
4225+gSatTEME::gSatTEME(const char *pstrName, char *pstrTleLine1, char *pstrTleLine2)
4226+{
4227+
4228+ double startmfe, stopmfe, deltamin;
4229+ double ro[3];
4230+ double vo[3];
4231+
4232+ m_Position.resize(3);
4233+ m_Vel.resize(3);
4234+
4235+ m_SatName = pstrName;
4236+
4237+ //set gravitational constants
4238+ getgravconst(CONSTANTS_SET, tumin, mu, radiusearthkm, xke, j2, j3, j4, j3oj2);
4239+
4240+ //Parsing TLE_Files and sat variables setting
4241+ twoline2rv(pstrTleLine1, pstrTleLine2, TYPERUN_SET, TYPEINPUT_SET, OPSMODE_SET, CONSTANTS_SET,
4242+ startmfe, stopmfe, deltamin, satrec);
4243+
4244+ // call the propagator to get the initial state vector value
4245+ sgp4(CONSTANTS_SET, satrec, 0.0, ro, vo);
4246+
4247+ m_Position[ 0]= ro[ 0];
4248+ m_Position[ 1]= ro[ 1];
4249+ m_Position[ 2]= ro[ 2];
4250+ m_Vel[ 0] = vo[ 0];
4251+ m_Vel[ 1] = vo[ 1];
4252+ m_Vel[ 2] = vo[ 2];
4253+}
4254+
4255+void gSatTEME::setEpoch(gTime ai_time)
4256+{
4257+
4258+ gTime kepEpoch(satrec.jdsatepoch);
4259+ gTimeSpan tSince = ai_time - kepEpoch;
4260+
4261+ double ro[3];
4262+ double vo[3];
4263+ double dtsince = tSince.getDblSeconds()/KSEC_PER_MIN;
4264+ // call the propagator to get the initial state vector value
4265+ sgp4(CONSTANTS_SET, satrec, dtsince, ro, vo);
4266+
4267+ m_Position[ 0]= ro[ 0];
4268+ m_Position[ 1]= ro[ 1];
4269+ m_Position[ 2]= ro[ 2];
4270+ m_Vel[ 0] = vo[ 0];
4271+ m_Vel[ 1] = vo[ 1];
4272+ m_Vel[ 2] = vo[ 2];
4273+}
4274+
4275+void gSatTEME::setEpoch(double ai_minSinceKepEpoch)
4276+{
4277+
4278+ double ro[3];
4279+ double vo[3];
4280+ // call the propagator to get the initial state vector value
4281+ sgp4(CONSTANTS_SET, satrec, ai_minSinceKepEpoch, ro, vo);
4282+
4283+ m_Position[ 0]= ro[ 0];
4284+ m_Position[ 1]= ro[ 1];
4285+ m_Position[ 2]= ro[ 2];
4286+ m_Vel[ 0] = vo[ 0];
4287+ m_Vel[ 1] = vo[ 1];
4288+ m_Vel[ 2] = vo[ 2];
4289+}
4290+
4291+gVector gSatTEME::getSubPoint(gTime ai_Time)
4292+{
4293+
4294+ gVector resultVector(3); // (0) Latitude, (1) Longitude, (2) altitude
4295+ double theta, r, e2, phi, c;
4296+
4297+ theta = AcTan(m_Position[1], m_Position[0]); // radians
4298+ resultVector[ LONGITUDE] = fmod((theta - ai_Time.toThetaGMST()), K2PI); //radians
4299+
4300+
4301+ r = sqrt(Sqr(m_Position[0]) + Sqr(m_Position[1]));
4302+ e2 = __f*(2 - __f);
4303+ resultVector[ LATITUDE] = AcTan(m_Position[2],r); /*radians*/
4304+
4305+ do
4306+ {
4307+ phi = resultVector[ LATITUDE];
4308+ c = 1/sqrt(1 - e2*Sqr(sin(phi)));
4309+ resultVector[ LATITUDE] = AcTan(m_Position[2] + KEARTHRADIUS*c*e2*sin(phi),r);
4310+ }
4311+ while(fabs(resultVector[ LATITUDE] - phi) >= 1E-10);
4312+
4313+ resultVector[ ALTITUDE] = r/cos(resultVector[ LATITUDE]) - KEARTHRADIUS*c;/*kilometers*/
4314+
4315+ if(resultVector[ LATITUDE] > (KPI/2.0)) resultVector[ LATITUDE] -= K2PI;
4316+
4317+ resultVector[LATITUDE] = resultVector[LATITUDE]/KDEG2RAD;
4318+ resultVector[LONGITUDE] = resultVector[LONGITUDE]/KDEG2RAD;
4319+ if(resultVector[LONGITUDE] < -180.0) resultVector[LONGITUDE] +=360;
4320+ else if(resultVector[LONGITUDE] > 180.0) resultVector[LONGITUDE] -= 360;
4321+
4322+
4323+ return resultVector;
4324+}
4325
4326=== added file 'plugins/Satellites/src/gsatellite/gSatTEME.hpp'
4327--- plugins/Satellites/src/gsatellite/gSatTEME.hpp 1970-01-01 00:00:00 +0000
4328+++ plugins/Satellites/src/gsatellite/gSatTEME.hpp 2010-10-30 00:49:41 +0000
4329@@ -0,0 +1,128 @@
4330+/***************************************************************************
4331+ * Name: gSatTeme.hpp
4332+ *
4333+ * Description: gSatTEME classes declaration.
4334+ * This class abstract all the SGP4 complexity. It uses the
4335+ * revised David. A. Vallado code for SGP4 Calculation.
4336+ *
4337+ * Reference:
4338+ * Revisiting Spacetrack Report #3 AIAA 2006-6753
4339+ * Vallado, David A., Paul Crawford, Richard Hujsak, and T.S.
4340+ * Kelso, "Revisiting Spacetrack Report #3,"
4341+ * presented at the AIAA/AAS Astrodynamics Specialist
4342+ * Conference, Keystone, CO, 2006 August 21–24.
4343+ * http://celestrak.com/publications/AIAA/2006-6753/
4344+ ***************************************************************************/
4345+
4346+/***************************************************************************
4347+ * Copyright (C) 2006 by J.L. Canales *
4348+ * jlcanales@users.sourceforge.net *
4349+ * *
4350+ * This program is free software; you can redistribute it and/or modify *
4351+ * it under the terms of the GNU General Public License as published by *
4352+ * the Free Software Foundation; either version 2 of the License, or *
4353+ * (at your option) any later version. *
4354+ * *
4355+ * This program is distributed in the hope that it will be useful, *
4356+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
4357+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
4358+ * GNU General Public License for more details. *
4359+ * *
4360+ * You should have received a copy of the GNU General Public License *
4361+ * along with this program; if not, write to the *
4362+ * Free Software Foundation, Inc., *
4363+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
4364+ ***************************************************************************/
4365+
4366+#ifndef _GSATTEME_HPP_
4367+#define _GSATTEME_HPP_ 1
4368+
4369+#include "gTime.hpp"
4370+#include "gVector.hpp"
4371+
4372+#include "sgp4unit.h"
4373+#include "sgp4ext.h"
4374+
4375+
4376+//! @class gSatTEME
4377+//! @brief Sat position and velocity predictions over TEME reference system.
4378+//! @details
4379+//! Class to abstract all the SGP4 complexity.
4380+//! It implementation wrap whit an object oriented class the revised David. A. Vallado
4381+//! code for SGP4 Calculation. (Spacetrack report #6 revised AIAA-2006-6753-rev1)
4382+class gSatTEME
4383+{
4384+public:
4385+
4386+ // Operation: gSatTEME(const char *pstrName, char *pstrTleLine1, char *pstrTleLine2)
4387+ //! @brief Default class gSatTEME constructor
4388+ //! @param[in] pstrName Pointer to a null end string with the Sat. Name
4389+ //! @param[in] pstrTleLine1 Pointer to a null end string with the
4390+ //! first TLE Kep. data line
4391+ //! @param[in] pstrTleLine2 Pointer to a null end string with the
4392+ //! second TLE Kep. data line
4393+ gSatTEME(const char *pstrName, char *pstrTleLine1, char *pstrTleLine2);
4394+
4395+ // Operation: setEpoch( gTime ai_time)
4396+ //! @brief Set compute epoch for prediction
4397+ //! @param[in] ai_time gTime object storing the compute epoch time.
4398+ void setEpoch(gTime ai_time);
4399+
4400+ // Operation: setEpoch( double ai_minSinceKepEpoch)
4401+ //! @brief Set compute epoch for prediction in minutes since Keplerian data Epoch
4402+ //! @param[in] ai_minSinceKepEpoch Time since Keplerian Epoch measured in minutes
4403+ //! and fraction of minutes.
4404+ void setEpoch(double ai_minSinceKepEpoch);
4405+
4406+ // Operation: getPos()
4407+ //! @brief Get the TEME satellite position Vector
4408+ //! @return gVector
4409+ //! Satellite position vector.
4410+ //! x: position[0]
4411+ //! y: position[1]
4412+ //! z: position[2]
4413+ gVector getPos()
4414+ {
4415+ return m_Position;
4416+ }
4417+
4418+ // Operation: getVel()
4419+ //! @brief Get the TEME satellite Velocity Vector
4420+ //! @return gVector Satellite Velocity Vector\n
4421+ //! x: Vel[0]\n
4422+ //! y: Vel[1]\n
4423+ //! z: Vel[2]\n
4424+ gVector getVel()
4425+ {
4426+ return m_Vel;
4427+ }
4428+
4429+ // Operation: getSubPoint
4430+ //! @brief Get the Geographic satellite subpoint Vector
4431+ //! @details To implement this operation, next references has been used:
4432+ //! Orbital Coordinate Systems, Part III By Dr. T.S. Kelso
4433+ //! http://www.celestrak.com/columns/v02n03/
4434+ //! @param[in] ai_Time Epoch time for subpoint calculation. (of course, this must be
4435+ //! refactorized to be computed in the setEpoch function)
4436+ //! @return gVector Geographical coordinates\n
4437+ //! Latitude: Coord[0] measured in degrees\n
4438+ //! Longitude: Coord[1] measured in degrees\n
4439+ //! Altitude: Coord[2] measured in Km.\n
4440+ gVector getSubPoint(gTime ai_Time);
4441+
4442+ int getErrorCode()
4443+ {
4444+ return satrec.error;
4445+ }
4446+
4447+private:
4448+ // sgp4 proceses variables
4449+ double tumin, mu, radiusearthkm, xke, j2, j3, j4, j3oj2;
4450+ elsetrec satrec;
4451+
4452+ std::string m_SatName;
4453+ gVector m_Position;
4454+ gVector m_Vel;
4455+};
4456+
4457+#endif // _GSATTEME_HPP_
4458
4459=== added file 'plugins/Satellites/src/gsatellite/gTime.cpp'
4460--- plugins/Satellites/src/gsatellite/gTime.cpp 1970-01-01 00:00:00 +0000
4461+++ plugins/Satellites/src/gsatellite/gTime.cpp 2010-10-30 00:49:41 +0000
4462@@ -0,0 +1,347 @@
4463+/***************************************************************************
4464+ * Name: gTime.cpp
4465+ *
4466+ * Description:
4467+ ***************************************************************************/
4468+
4469+/***************************************************************************
4470+ * Copyright (C) 2004 by JL Trabajo *
4471+ * ph03696@homeserver *
4472+ * *
4473+ * This program is free software; you can redistribute it and/or modify *
4474+ * it under the terms of the GNU General Public License as published by *
4475+ * the Free Software Foundation; either version 2 of the License, or *
4476+ * (at your option) any later version. *
4477+ * *
4478+ * This program is distributed in the hope that it will be useful, *
4479+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
4480+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
4481+ * GNU General Public License for more details. *
4482+ * *
4483+ * You should have received a copy of the GNU General Public License *
4484+ * along with this program; if not, write to the *
4485+ * Free Software Foundation, Inc., *
4486+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
4487+ ***************************************************************************/
4488+
4489+
4490+#include <cassert>
4491+// gtime
4492+#include "gTime.hpp"
4493+// GExcpt
4494+#include "gException.hpp"
4495+#include "stdsat.h"
4496+#include <math.h>
4497+
4498+#include <stdio.h>
4499+#include <stdlib.h>
4500+
4501+// Class GTimeSpan
4502+
4503+//////////////////////////////////////////////////////////////////////////////
4504+// Referencies:
4505+// Astronomical Formulae for Calculators.
4506+// Jean Meeus
4507+// Chapter 3: Julian Day and Calendar Date. PG's 23, 24, 25
4508+//
4509+void gTime::setTime(int year, double day)
4510+{
4511+ assert((day >= 0.0) && (day < 367.0));
4512+
4513+ // Now calculate Julian date
4514+
4515+ year--;
4516+
4517+ int A = (year / 100);
4518+ int B = 2 - A + (A / 4);
4519+
4520+ double JDforYear = (int)(365.25 * year) +
4521+ (int)(30.6001 * 14) + //MM = 1 then MM=12 + 1 for the expresion (30.6001 * (mm +1))
4522+ 1720994.5 + B;
4523+
4524+ m_time = JDforYear + day;
4525+}
4526+
4527+
4528+// Constructors
4529+
4530+gTime gTime::getCurrentTime()
4531+{
4532+
4533+ time_t rawtime;
4534+ struct tm * timeinfo;
4535+
4536+ time(&rawtime);
4537+ timeinfo = gmtime(&rawtime);
4538+
4539+ return gTime(*timeinfo);
4540+}
4541+
4542+
4543+
4544+gTime::gTime(int year, double day)
4545+{
4546+ setTime(year, day);
4547+}
4548+
4549+gTime::gTime(double ai_jDays)
4550+{
4551+ m_time= ai_jDays;
4552+}
4553+
4554+gTime::gTime(int nYear, int nMonth, int nDay, int nHour, int nMin, double nSec)
4555+{
4556+ // Calculate N, the day of the year (1..366)
4557+ int N;
4558+ int F1 = (int)((275.0 * nMonth) / 9.0);
4559+ int F2 = (int)((nMonth + 9.0) / 12.0);
4560+
4561+ if(isLeapYear(nYear))
4562+ {
4563+ // Leap year
4564+ N = F1 - F2 + nDay - 30;
4565+ }
4566+ else
4567+ {
4568+ // Common year
4569+ N = F1 - (2 * F2) + nDay - 30;
4570+ }
4571+
4572+ double dDay = N + (nHour + (nMin + (nSec / 60.0)) / 60.0) / 24.0;
4573+
4574+
4575+ setTime(nYear, dDay);
4576+
4577+}
4578+
4579+
4580+gTime::gTime(const gTime& timeSrc):m_time(timeSrc.m_time)
4581+{
4582+
4583+}
4584+
4585+gTime::gTime(struct tm ai_timestruct)
4586+{
4587+
4588+ int year = ai_timestruct.tm_year + 1900;
4589+
4590+ double day = ai_timestruct.tm_yday + 1;
4591+ day += (ai_timestruct.tm_hour + (ai_timestruct.tm_min + (ai_timestruct.tm_sec / 60.0)) / 60.0) / 24.0;
4592+
4593+ setTime(year, day);
4594+}
4595+
4596+gTimeSpan gTime::getTimeToUTC()
4597+{
4598+
4599+ //Time to utc calculation.
4600+ time_t when = time(NULL);
4601+ struct tm utc = *gmtime(&when);
4602+ struct tm lcl = *localtime(&when);
4603+ gTimeSpan tUTCDiff;
4604+
4605+
4606+ int delta_h = lcl.tm_hour - utc.tm_hour;
4607+ tUTCDiff = (time_t) delta_h*3600;
4608+
4609+ return(tUTCDiff);
4610+}
4611+
4612+
4613+const gTime& gTime::operator=(const gTime& timeSrc)
4614+{
4615+ m_time = timeSrc.m_time;
4616+ return (*this);
4617+}
4618+
4619+const gTime& gTime::operator=(time_t t)
4620+{
4621+ struct tm *ptm = gmtime(&t);
4622+ assert(ptm);
4623+
4624+ int year = ptm->tm_year + 1900;
4625+
4626+ double day = ptm->tm_yday + 1;
4627+ day += (ptm->tm_hour + (ptm->tm_min + (ptm->tm_sec / 60.0)) / 60.0) / 24.0;
4628+
4629+ setTime(year, day);
4630+
4631+ return (*this);
4632+
4633+}
4634+
4635+
4636+// Attributes
4637+double gTime::getGmtTm() const
4638+{
4639+ return m_time;
4640+}
4641+
4642+double gTime::getLocalTm() const
4643+{
4644+ return (m_time + getTimeToUTC().getDblSeconds());
4645+}
4646+
4647+
4648+time_t gTime::toTime() const
4649+{
4650+ return ((m_time - JDAY_JAN1_00H_1970)*KSEC_PER_DAY);
4651+
4652+
4653+}
4654+
4655+void gTime::toCalendarDate(int *pYear, int *pMonth , double *pDom) const
4656+{
4657+
4658+ assert(pYear != NULL);
4659+ assert(pMonth != NULL);
4660+ assert(pDom != NULL);
4661+
4662+ double jdAdj, F, alpha, A, B, DOM;
4663+ int Z, C, D, E, month, year;
4664+
4665+ jdAdj = m_time + 0.5;
4666+ Z = (int)jdAdj; // integer part
4667+ F = jdAdj - Z; // fractional part
4668+
4669+ if(Z < 2299161)
4670+ {
4671+ A = Z;
4672+ }
4673+ else
4674+ {
4675+ alpha = (int)((Z - 1867216.25) / 36524.25);
4676+ A = Z + 1 + alpha - (int)(alpha / 4.0);
4677+ }
4678+
4679+ B = A + 1524.0;
4680+ C = (int)((B - 122.1) / 365.25);
4681+ D = (int)(C * 365.25);
4682+ E = (int)((B - D) / 30.6001);
4683+
4684+ DOM = B - D - (int)(E * 30.6001) + F;
4685+ month = (E < 13.5) ? (E - 1) : (E - 13);
4686+ year = (month > 2.5) ? (C - 4716) : (C - 4715);
4687+
4688+ *pYear = year;
4689+ *pMonth = month;
4690+ *pDom = DOM;
4691+}
4692+
4693+
4694+// @method toThetaGMST();
4695+// Definition: Calculate Theta Angle at Greenwich Mean Time for the Julian date. The return value
4696+// is the angle, in radians, measuring eastward from the Vernal Equinox to the
4697+// prime meridian.
4698+double gTime::toThetaGMST() const
4699+{
4700+
4701+ double jd, Theta_JD;
4702+ double UT = fmod((m_time + 0.5), 1.0);
4703+ jd = m_time - UT;
4704+ double TU = (jd- JDAY_JAN1_12H_2000) / 36525.0;
4705+
4706+ double GMST = 24110.54841 + TU *
4707+ (8640184.812866 + TU * (0.093104 - TU * 6.2e-06));
4708+
4709+ GMST = fmod((GMST + KSEC_PER_DAY * OMEGA_E * UT),KSEC_PER_DAY);
4710+ Theta_JD=(K2PI * (GMST / KSEC_PER_DAY));
4711+
4712+ if(Theta_JD <0.0)
4713+ Theta_JD+=K2PI;
4714+
4715+ return Theta_JD;
4716+}
4717+
4718+// @method toThetaLMST();
4719+// Definition: Calculate Theta Angle at Local Mean Time for the Julian date.
4720+double gTime::toThetaLMST(double longitude) const
4721+{
4722+ return fmod(toThetaGMST() + longitude, K2PI);
4723+}
4724+
4725+
4726+
4727+// Operations
4728+// time math
4729+gTimeSpan gTime::operator-(gTime ai_time) const
4730+{
4731+ return (gTimeSpan((m_time - ai_time.m_time)));
4732+}
4733+
4734+gTime gTime::operator-(gTimeSpan ai_timeSpan) const
4735+{
4736+ return (gTime((m_time - ai_timeSpan.getDblDays())));
4737+}
4738+
4739+gTime gTime::operator+(gTimeSpan ai_timeSpan) const
4740+{
4741+ return (gTime((m_time + ai_timeSpan.getDblDays())));
4742+}
4743+
4744+const gTime& gTime::operator+=(gTimeSpan ai_timeSpan)
4745+{
4746+ m_time += ai_timeSpan.getDblDays();
4747+ return (*this);
4748+
4749+}
4750+
4751+const gTime& gTime::operator-=(gTimeSpan ai_timeSpan)
4752+{
4753+ m_time -= ai_timeSpan.getDblDays();
4754+ return (*this);
4755+}
4756+
4757+bool gTime::operator==(gTime ai_time) const
4758+{
4759+
4760+ if(m_time == ai_time.m_time)
4761+ return true;
4762+ else
4763+ return false;
4764+}
4765+
4766+bool gTime::operator!=(gTime ai_time) const
4767+{
4768+
4769+ if(m_time != ai_time.m_time)
4770+ return true;
4771+ else
4772+ return false;
4773+}
4774+
4775+bool gTime::operator<(gTime ai_time) const
4776+{
4777+
4778+ if(m_time < ai_time.m_time)
4779+ return true;
4780+ else
4781+ return false;
4782+}
4783+
4784+bool gTime::operator>(gTime ai_time) const
4785+{
4786+
4787+ if(m_time > ai_time.m_time)
4788+ return true;
4789+ else
4790+ return false;
4791+}
4792+
4793+bool gTime::operator<=(gTime ai_time) const
4794+{
4795+
4796+ if(m_time <= ai_time.m_time)
4797+ return true;
4798+ else
4799+ return false;
4800+}
4801+
4802+bool gTime::operator>=(gTime ai_time) const
4803+{
4804+
4805+ if(m_time >= ai_time.m_time)
4806+ return true;
4807+ else
4808+ return false;
4809+}
4810
4811=== added file 'plugins/Satellites/src/gsatellite/gTime.hpp'
4812--- plugins/Satellites/src/gsatellite/gTime.hpp 1970-01-01 00:00:00 +0000
4813+++ plugins/Satellites/src/gsatellite/gTime.hpp 2010-10-30 00:49:41 +0000
4814@@ -0,0 +1,329 @@
4815+/****************************************************************************
4816+ * Name: gTime.hpp
4817+ *
4818+ * Description: gTime y gTimeSpan classes declaration.
4819+ * This classes implement the method and operators to manage
4820+ * calculation over dates and timestamps.
4821+ *
4822+ *
4823+ ***************************************************************************/
4824+
4825+/***************************************************************************
4826+ * Copyright (C) 2006 by J. L. Canales *
4827+ * jlcanales@users.sourceforge.net *
4828+ * *
4829+ * This program is free software; you can redistribute it and/or modify *
4830+ * it under the terms of the GNU General Public License as published by *
4831+ * the Free Software Foundation; either version 2 of the License, or *
4832+ * (at your option) any later version. *
4833+ * *
4834+ * This program is distributed in the hope that it will be useful, *
4835+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
4836+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
4837+ * GNU General Public License for more details. *
4838+ * *
4839+ * You should have received a copy of the GNU General Public License *
4840+ * along with this program; if not, write to the *
4841+ * Free Software Foundation, Inc., *
4842+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
4843+ ***************************************************************************/
4844+
4845+/////////////////////////////////////////////////////////////////////////////
4846+// gTimeSpan and gTime
4847+#ifndef _GTIME_HPP_
4848+#define _GTIME_HPP_ 1
4849+
4850+#include <time.h>
4851+#include <iostream> // for operator<<(), see below
4852+
4853+static const double JDAY_JAN1_00H_1900 = 2415019.5; // Jan 1.0 1900 = Jan 1 1900 00h UTC
4854+static const double JDAY_JAN1_12H_1900 = 2415020.0; // Jan 1.5 1900 = Jan 1 1900 12h UTC
4855+static const double JDAY_JAN1_12H_2000 = 2451545.0; // Jan 1.5 2000 = Jan 1 2000 12h UTC
4856+static const double JDAY_JAN1_00H_1970 = 2440587.5;
4857+
4858+static const double OMEGA_E = 1.002737909350795; // earth rotation per sideral day
4859+
4860+static const int KSEC_PER_MIN = 60;
4861+static const int KSEC_PER_HR = 3600;
4862+static const int KSEC_PER_DAY = 86400;
4863+static const int KMIN_PER_HR = 60;
4864+static const int KMIN_PER_DAY = 1440;
4865+static const int KHR_PER_DAY = 60;
4866+
4867+class gTimeSpan
4868+{
4869+public:
4870+ // Constructors
4871+ gTimeSpan(double timeSpanSrc = 0); // timeSpanSrc is mesured in days and fraction of day
4872+ gTimeSpan(long lDays, int nHours, int nMins, double nSecs);
4873+
4874+ gTimeSpan(const gTimeSpan& timeSpanSrc);
4875+ const gTimeSpan& operator=(const gTimeSpan& timeSpanSrc);
4876+
4877+ // Equal to time in Julian Days
4878+ const gTimeSpan& operator=(const double& timeSpanSrc)
4879+ {
4880+ m_timeSpan=timeSpanSrc*KSEC_PER_DAY;
4881+ return *this;
4882+ }
4883+
4884+ // Attributes
4885+ // extract parts
4886+
4887+ //! Operation: getDays()
4888+ //! This method returns the integer days number stored in the gTimeSpan object.
4889+ //! @return
4890+ //! long Total number of days
4891+ long getDays() const;
4892+
4893+ //! Operation: getHours()
4894+ //! This method returns the integer hours number stored in the gTimeSpan object.
4895+ //! @return
4896+ //! int This is a value between 0 and 23 hours
4897+ int getHours() const;
4898+
4899+ //! Operation: getMinutes()
4900+ //! This method returns the integer Minutes number stored in the gTimeSpan object.
4901+ //! @return
4902+ //! int This is a value between 0 and 59 minutes.
4903+ int getMinutes() const;
4904+
4905+ //! Operation: getSeconds()
4906+ //! This method returns the integer seconds number stored in the gTimeSpan object.
4907+ //! @return
4908+ //! int This is a value between 0 and 59 seconds
4909+ int getSeconds() const;
4910+
4911+ //! Operation: getDblSeconds()
4912+ //! This method returns the total seconds number stored in the gTimeSpan
4913+ //! object.
4914+ //! @return
4915+ //! double Total number of seconds in seconds and fraction of second.
4916+ double getDblSeconds() const;
4917+
4918+
4919+ //! Operation: getDblDays()
4920+ //! This method returns the total days number stored in the gTimeSpan
4921+ //! object.
4922+ //! @return
4923+ //! double Total number of days in days and fraction of day.
4924+ double getDblDays() const;
4925+ // Operations
4926+
4927+ //////////////////////////////////////
4928+ // TimeSpan Object Math operations
4929+ //////////////////////////////////////
4930+ gTimeSpan operator-(gTimeSpan timeSpan) const;
4931+ gTimeSpan operator+(gTimeSpan timeSpan) const;
4932+ const gTimeSpan& operator+=(gTimeSpan timeSpan);
4933+ const gTimeSpan& operator-=(gTimeSpan timeSpan);
4934+ bool operator==(gTimeSpan timeSpan) const;
4935+ bool operator!=(gTimeSpan timeSpan) const;
4936+ bool operator<(gTimeSpan timeSpan) const;
4937+ bool operator>(gTimeSpan timeSpan) const;
4938+ bool operator<=(gTimeSpan timeSpan) const;
4939+ bool operator>=(gTimeSpan timeSpan) const;
4940+
4941+private:
4942+ double m_timeSpan; //time span in julian days
4943+
4944+};
4945+
4946+
4947+
4948+
4949+
4950+//! @class gTime
4951+//! This class implements time calculations.
4952+//! Time is stored in julian days
4953+//! - Time getting in GMT, Local and Sidereal (earth rotational angle)
4954+//! - Time Math operations.
4955+
4956+class gTime
4957+{
4958+public:
4959+
4960+ // Constructors
4961+ gTime(double ai_jDays = 0);
4962+ gTime(int year, double day);
4963+ gTime(int nYear, int nMonth, int nDay, int nHour, int nMin, double nSec);
4964+ gTime(struct tm ai_timestruct);
4965+
4966+ // copy constructor
4967+ gTime(const gTime& timeSrc);
4968+
4969+ //////////////////////////////////////
4970+ // Time Object setting operations
4971+ //////////////////////////////////////
4972+
4973+ // Operation setTime
4974+ //! @brief Set the time value of the time object to the julian day of
4975+ //! year, day.
4976+ //! @details
4977+ //! References:\n
4978+ //! Astronomical Formulae for Calculators.\n
4979+ //! Jean Meeus\n
4980+ //! Chapter 3: Julian Day and Calendar Date. PG's 23, 24, 25\n
4981+ //! @param[in] year date year
4982+ //! @param[in] day date day and day fraction. Notice: 1 Jan is day=0 (not 1)
4983+ void setTime(int year, double day);
4984+
4985+ // Operation operator=
4986+ //! @brief overload de = operator to assign time values to he object.
4987+ //! @param timeSrc Time to be assigned
4988+ //! @return const gTime& Reference to *this object modified after operation
4989+ const gTime& operator=(const gTime& timeSrc);
4990+
4991+ // Operation operator=
4992+ //! @brief overload de = operator to assign time values to he object in
4993+ //! time_t (operating system) format.
4994+ //! @param[in] t Time to be assigned
4995+ //! @return
4996+ //! const gTime& Reference to *this object modified after operation
4997+ const gTime& operator=(time_t t);
4998+
4999+
5000+ // Operation operator=
The diff has been truncated for viewing.