TwoLineElement |
package orbit; /** * Represents the NASA 2-line orbital element. As of 07 Jan 2003: * * ISS * 1 25544U 98067A 03007.53073344 .00041100 00000-0 34010-3 0 9019 * 2 25544 51.6346 107.2569 0004536 6.6073 353.5141 15.58656572 35940 * * (from http://spaceflight.nasa.gov/realdata/sightings/SSapplications/Post/JavaSSOP/orbit/ISS/SVPOST.html) * * ISS (ZARYA) * 1 25544U 98067A 03007.15863095 .00022159 00000-0 28892-3 0 5534 * 2 25544 51.6345 109.1211 0004923 6.2534 64.4750 15.58618678235921 * * (from http://celestrak.com/NORAD/elements/stations.txt - this doesn't look exactly right; there's no space in the * final field of line 2!) * * <p>Title: ISS Transit</p> * <p>Description: Predict transits of the ISS across the moon and sun</p> * <p>Copyright: Copyright (c) 2002</p> * <p>Company: J2EE Consultants</p> * @author Thomas Fly * @version 1.0 */ public class TwoLineElement { final static int MINUTES_PER_DAY = 1440; /* First line: */ final String satelliteNumber; final String classification; final String launchYear; final String launchNumber; final String pieceOfLaunchVehicle; final String epochYear; final String epoch; final String firstDerivativeMeanMotion; final String secondDerivativeMeanMotion; final double dragCoefficient; final String ephemerisType; final String elementNumber; final String checksum_1; /* Second line: */ final String satelliteNumber_2; final double orbitInclination; final double rightAscensionAscendingNode; final double orbitEccentricity; final double orbitPerigee; final double meanAnomaly; final double meanMotion; final String revolutionNumberAtEpoch; final String checksum_2; public TwoLineElement(String[] twoLine) { /* First line: 25544U 98067A 03007.53073344 .00041100 00000-0 34010-3 0 9019 ... or, 25544U 98067A 03007.15863095 .00022159 00000-0 28892-3 0 5534 Butt-ugly Pascal translated from even-more butt-ugly FORTRAN: {* Decode Card 1 *} catnr := Copy(abuf[1],3,5); epoch := Real_Value(abuf[1],19,14); julian_epoch := Julian_Date_of_Epoch(epoch); xndt2o := Real_Value(abuf[1],34,10); xndd6o := Real_Value(abuf[1],45,6)*1E-5; iexp := Integer_Value(abuf[1],51,2); bstar := Real_Value(abuf[1],54,6)*1E-5; ibexp := Integer_Value(abuf[1],60,2); elset := ThreeDigit(Integer_Value(abuf[1],66,3)); */ // catnr := Copy(abuf[1],3,5) satelliteNumber = twoLine[0].substring(2, 7); classification = twoLine[0].substring(7, 8); launchYear = twoLine[0].substring(9, 11); launchNumber = twoLine[0].substring(11, 14); pieceOfLaunchVehicle = twoLine[0].substring(14, 17); // epoch := Real_Value(abuf[1],19,14) epochYear = twoLine[0].substring(18, 20); epoch = twoLine[0].substring(20, 32); // xndt2o := Real_Value(abuf[1],34,10) firstDerivativeMeanMotion = twoLine[0].substring(33, 43); // xndd6o := Real_Value(abuf[1],45,6)*1E-5 // iexp := Integer_Value(abuf[1],51,2) secondDerivativeMeanMotion = twoLine[0].substring(44, 52); // bstar := Real_Value(abuf[1],54,6)*1E-5 // ibexp := Integer_Value(abuf[1],60,2) dragCoefficient = new Double(twoLine[0].substring(53, 59)).doubleValue() * 1e-5 * new Double("1e" + twoLine[0].substring(59, 61)).doubleValue(); ephemerisType = twoLine[0].substring(62, 63); // HUH??? elset := ThreeDigit(Integer_Value(abuf[1],66,3)) elementNumber = twoLine[0].substring(64, 68); checksum_1 = twoLine[0].substring(68, 69); /* Second line: 25544 51.6346 107.2569 0004536 6.6073 353.5141 15.58656572 35940 ... or, 25544 51.6345 109.1211 0004923 6.2534 64.4750 15.58618678235921 More butt-ugly code: {* Decode Card 2 *} xincl := Real_Value(abuf[2],9,8); xnodeo := Real_Value(abuf[2],18,8); eo := Real_Value(abuf[2],27,7)*1E-7; omegao := Real_Value(abuf[2],35,8); xmo := Real_Value(abuf[2],44,8); xno := Real_Value(abuf[2],53,11); */ satelliteNumber_2 = twoLine[1].substring(2, 7); // xincl := Real_Value(abuf[2],9,8) orbitInclination = new Double(twoLine[1].substring(8, 16)).doubleValue() * Math.PI / 180; // xnodeo := Real_Value(abuf[2],18,8) rightAscensionAscendingNode = new Double(twoLine[1].substring(17, 25)).doubleValue() * Math.PI / 180; // eo := Real_Value(abuf[2],27,7)*1E-7 orbitEccentricity = new Double(twoLine[1].substring(26, 33)).doubleValue() * 1e-7; // omegao := Real_Value(abuf[2],35,8) orbitPerigee = new Double(twoLine[1].substring(34, 42)).doubleValue() * Math.PI / 180; // xmo := Real_Value(abuf[2],44,8) meanAnomaly = new Double(twoLine[1].substring(43, 51)).doubleValue() * Math.PI / 180; // xno := Real_Value(abuf[2],53,11) meanMotion = new Double(twoLine[1].substring(52, 63)).doubleValue() * 2 * Math.PI / MINUTES_PER_DAY; revolutionNumberAtEpoch = twoLine[1].substring(64, 68); checksum_2 = twoLine[1].substring(68, 69); } }
TwoLineElement |