All Downloads are FREE. Search and download functionalities are using the official Maven repository.

uk.me.g4dpz.satellite.TLE Maven / Gradle / Ivy

Go to download

predict4java provides real-time satellite tracking and orbital prediction information

The newest version!
/**
    predict4java: An SDP4 / SGP4 library for satellite orbit predictions

    Copyright (C)  2004-2010  David A. B. Johnson, G4DPZ.

    This class is a Java port of one of the core elements of
    the Predict program, Copyright John A. Magliacane,
    KD2BD 1991-2003: http://www.qsl.net/kd2bd/predict.html

    Dr. T.S. Kelso is the author of the SGP4/SDP4 orbital models,
    originally written in Fortran and Pascal, and released into the
    public domain through his website (http://www.celestrak.com/).
    Neoklis Kyriazis, 5B4AZ, later re-wrote Dr. Kelso's code in C,
    and released it under the GNU GPL in 2002.
    PREDICT's core is based on 5B4AZ's code translation efforts.

    Author: David A. B. Johnson, G4DPZ 

    Comments, questions and bugreports should be submitted via
    http://sourceforge.net/projects/websat/
    More details can be found at the project home page:

    http://websat.sourceforge.net

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, visit http://www.fsf.org/
 */
package uk.me.g4dpz.satellite;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.commons.lang.StringUtils;

/**
 * TLE representation to aid SGP4 calculations.
 */
public class TLE implements Serializable {

    private static final long serialVersionUID = 716922882884628016L;

    private static final int THREELINES = 3;
    private static final double DEG2RAD = 1.745329251994330E-2;
    private static final double TWO_PI = Math.PI * 2.0;
    private static final double MINS_PERDAY = 1.44E3;
    private static final double XKE = 7.43669161E-2;
    private static final double TWO_THIRDS = 2.0 / 3.0;
    private static final double CK2 = 5.413079E-4;

    private int catnum;
    private String name;
    private int setnum;
    private int year;
    private double refepoch;
    private double incl;
    private double raan;
    private double eccn;
    private double argper;
    private double meanan;
    private double meanmo;
    private double drag;
    private double nddot6;
    private double bstar;
    private int orbitnum;
    private double epoch;
    private double xndt2o;
    private double xincl;
    private double xnodeo;
    private double eo;
    private double omegao;
    private double xmo;
    private double xno;
    private boolean deepspace;
    private java.util.Date createddate;

    // Constructors

    /**
     * Copy constructor.
     *
     * @param tle
     */
    public TLE(final TLE tle) {
        this.catnum = tle.catnum;
        this.name = tle.name;
        this.setnum = tle.setnum;
        this.year = tle.year;
        this.refepoch = tle.refepoch;
        this.incl = tle.incl;
        this.raan = tle.raan;
        this.eccn = tle.eccn;
        this.argper = tle.argper;
        this.meanan = tle.meanan;
        this.meanmo = tle.meanmo;
        this.drag = tle.drag;
        this.nddot6 = tle.nddot6;
        this.bstar = tle.bstar;
        this.orbitnum = tle.orbitnum;
        this.epoch = tle.epoch;
        this.xndt2o = tle.xndt2o;
        this.xincl = tle.xincl;
        this.xnodeo = tle.xnodeo;
        this.eo = tle.eo;
        this.omegao = tle.omegao;
        this.xmo = tle.xmo;
        this.xno = tle.xno;
        this.deepspace = tle.deepspace;
        this.createddate = tle.createddate;
    }

    public TLE(final String[] tle) throws IllegalArgumentException {
        this(tle, false);
    }

    /**
     * Constructor.
     *
     * @param tle the three line elements
     * @throws IllegalArgumentException here was something wrong with the TLE
     */
    public TLE(final String[] tle, final boolean nilStart) throws IllegalArgumentException {

        if (nilStart) {
            tle[0] = tle[0].substring(2);
        }

        if (null == tle) {
            throw new IllegalArgumentException("TLE was null");
        }

        if (tle.length != THREELINES) {
            throw new IllegalArgumentException("TLE had " + tle.length
                    + " elements");
        }

        int lineCount = 0;

        for (final String line : tle) {

            testArguments(lineCount, line);

            lineCount++;
        }

        catnum = Integer.parseInt(StringUtils.strip(tle[1].substring(2, 7)));
        name = tle[0].trim();
        setnum = Integer.parseInt(StringUtils.strip(tle[1].substring(64, 68)));
        year = Integer.parseInt(StringUtils.strip(tle[1].substring(18, 20)));
        refepoch = Double.parseDouble(tle[1].substring(20, 32));
        incl = Double.parseDouble(tle[2].substring(8, 16));
        raan = Double.parseDouble(tle[2].substring(17, 25));
        eccn = 1.0e-07 * Double.parseDouble(tle[2].substring(26, 33));
        argper = Double.parseDouble(tle[2].substring(34, 42));
        meanan = Double.parseDouble(tle[2].substring(43, 51));
        meanmo = Double.parseDouble(tle[2].substring(52, 63));
        drag = Double.parseDouble(tle[1].substring(33, 43));

        double tempnum = 1.0e-5 * Double.parseDouble(tle[1].substring(44, 50));
        nddot6 = tempnum
                / Math.pow(10.0, Double.parseDouble(tle[1].substring(51, 52)));

        tempnum = 1.0e-5 * Double.parseDouble(tle[1].substring(53, 59));

        bstar = tempnum
                / Math.pow(10.0, Double.parseDouble(tle[1].substring(60, 61)));

        orbitnum = Integer.parseInt(StringUtils.strip(tle[2].substring(63, 68)));

        /* reassign the values to thse which get used in calculations */
        epoch = (1000.0 * getYear()) + getRefepoch();

        xndt2o = drag;

        double temp = incl;
        temp *= DEG2RAD;
        xincl = temp;

        temp = raan;
        temp *= DEG2RAD;
        xnodeo = temp;

        eo = eccn;

        temp = argper;
        temp *= DEG2RAD;
        omegao = temp;

        temp = meanan;
        temp *= DEG2RAD;
        xmo = temp;

        xno = meanmo;

        /* Preprocess tle set */

        preProcessTLESet();
    }

    /**
     *
     */
    private synchronized void preProcessTLESet() {
        double temp;
        temp = TWO_PI / MINS_PERDAY / MINS_PERDAY;
        xno = xno * temp * MINS_PERDAY;
        xndt2o *= temp;

        double dd1 = XKE / xno;
        final double a1 = Math.pow(dd1, TWO_THIRDS);
        final double r1 = Math.cos(xincl);
        dd1 = 1.0 - eo * eo;
        temp = CK2 * 1.5f * (r1 * r1 * 3.0 - 1.0)
                / Math.pow(dd1, 1.5);
        final double del1 = temp / (a1 * a1);
        final double ao = a1
                * (1.0 - del1
                        * (TWO_THIRDS * .5 + del1
                                * (del1 * 1.654320987654321 + 1.0)));
        final double delo = temp / (ao * ao);
        final double xnodp = xno / (delo + 1.0);

        /* Select a deep-space/near-earth ephemeris */

        deepspace = TWO_PI / xnodp / MINS_PERDAY >= 0.15625;
    }

    /**
     * @param lineCount the current line
     * @param line the line under test
     * @throws IllegalArgumentException there was a problem with the data
     */
    private void testArguments(final int lineCount, final String line)
            throws IllegalArgumentException {
        if (null == line) {
            throw new IllegalArgumentException(
                    createIllegalArgumentMessage(lineCount, "was null"));
        }

        if (0 == line.length()) {
            throw new IllegalArgumentException(
                    createIllegalArgumentMessage(lineCount, "was zero length"));
        }
    }

    /**
     * Default constructor cannot be invoked.
     */
    @SuppressWarnings("unused")
    private TLE() {
    }

    /**
     * @return the catalog number
     */
    public int getCatnum() {
        return this.catnum;
    }

    /**
     * @return the name
     */
    public String getName() {
        return this.name;
    }

    /**
     * @return the element set number
     */
    public int getSetnum() {
        return this.setnum;
    }

    /**
     * @return the year part of the date of the elements
     */
    public int getYear() {
        return this.year;
    }

    /**
     * @return the reference epoch of the elements
     */
    public double getRefepoch() {
        return this.refepoch;
    }

    /**
     * @return the inclination of the satellite orbit
     */
    public double getIncl() {
        return this.incl;
    }

    /**
     * @return the Right Ascention of the Acending Node of the orbit
     */
    public double getRaan() {
        return this.raan;
    }

    /**
     * @return the Eccentricity of the orbit
     */
    public double getEccn() {
        return this.eccn;
    }

    /**
     * @return the Argument of Perigee of the orbit
     */
    public double getArgper() {
        return this.argper;
    }

    /**
     * @return the Mean Anomoly of the orbit
     */
    public double getMeanan() {
        return this.meanan;
    }

    /**
     * @return the Mean Motion of the satellite
     */
    public double getMeanmo() {
        return this.meanmo;
    }

    /**
     * @return the Drag factor
     */
    public double getDrag() {
        return this.drag;
    }

    /**
     * @return Nddot6
     */
    public double getNddot6() {
        return this.nddot6;
    }

    /**
     * @return Bstar
     */
    public double getBstar() {
        return this.bstar;
    }

    /**
     * @return Orbitnum
     */
    public int getOrbitnum() {
        return this.orbitnum;
    }

    /**
     * @return Deepspace
     */
    public boolean isDeepspace() {
        return deepspace;
    }

    /**
     * @return Eo
     */
    public double getEo() {
        return eo;
    }

    /**
     * @return Epoch
     */
    public double getEpoch() {
        return epoch;
    }

    /**
     * @return Omegao
     */
    public double getOmegao() {
        return omegao;
    }

    /**
     * @return Xincl
     */
    public double getXincl() {
        return xincl;
    }

    /**
     * @return Xmo
     */
    public double getXmo() {
        return xmo;
    }

    /**
     * @return Xndt2o
     */
    public synchronized double getXndt2o() {
        return xndt2o;
    }

    /**
     * @return Xno
     */
    public synchronized double getXno() {
        return xno;
    }

    /**
     * @return Xnodeo
     */
    public double getXnodeo() {
        return xnodeo;
    }

    /**
     * @return the createddate
     */
    public Date getCreateddate() {
        return new Date(createddate.getTime());
    }

    /**
     * @param createddate the createddate to set
     */
    public void setCreateddate(final Date createddate) {
        this.createddate = new Date(createddate.getTime());
    }

    /**
     * @param lineCount the line count
     * @param problem the problem
     * @return the description
     */
    private String createIllegalArgumentMessage(final int lineCount, final String problem) {
        return "TLE line[" + lineCount
                + "] " + problem;
    }

    public static List importSat(final InputStream fileIS) throws IOException {

        final List importedSats = new ArrayList();

        final BufferedReader buf = new BufferedReader(new InputStreamReader(fileIS));
        String readString;

        int j = 0;

        final String[] lines = new String[3];

        while ((readString = buf.readLine()) != null) {

            switch (j) {
                case 0:
                case 1:
                    lines[j] = readString;
                    j++;
                    break;
                case 2:
                    lines[j] = readString;
                    j = 0;
                    importedSats.add(new TLE(lines));
                    break;
                default:
                    break;
            }
        }

        return importedSats;
    }

    @Override
    public String toString() {
        return name;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy