Satellite prediction

I’m relatively new to Android and Java so I hope to find some help here. After a lot of research I found the Orekit project.
My goal is to use TLE data from Celestrak and create a list for each satellite with following content:

  • Satellite name
  • Maximum elevation
  • Time of maximum elevation
  • Next AOS and EOS
    This data in relation to a given location (latitude/longitude).
    Then I want to select one of the satellites and get the Azimuth and Elevation to be able to track it.

I appreciate if someone could point me to the right direction.

Many thanks for your replies,

best regards

Hi @patrickk83

Welcome to the Orekit forum!

Initialize a TLE using Orekit library is very simple. Knowing the first line and the second line of the TLE, you can easily initialize a TLE object following this example:

    final String line1 = "1 37753U 11036A   12090.13205652 -.00000006  00000-0  00000+0 0  2272";
    final String line2 = "2 37753  55.0032 176.5796 0004733  13.2285 346.8266  2.00565440  5153";
    final TLE tle = new TLE(line1, line2);

To compute the different elements you want, you will need an orbit propagator. I suggest to use a TLE propagator which only needs the previous TLE to be initialized:

    final TLEPropagator propagator = TLEPropagator.selectExtrapolator(tle);

Here, you can access the TLE date by using initDate = tle.getDate(); and define a target date to perform your propagation (target date is usually initDate.shiftedBy(dt);).

Orekit TLE object will not give you directly the satellite name. Instead you can access the satellite number (tle.getSatelliteNumber();) or the COSPAR ID by combining tle.getLaunchYear(), tle.getLaunchNumber() and tle.getLaunchPiece().
In order to have the satellite name you will have to use the “line 0” of the TLE. Here an example from Celestrak website:

GPS BIIR-2  (PRN 13)    
1 24876U 97035A   20125.56476991  .00000055  00000-0  00000-0 0  9998
2 24876  55.4540 185.8673 0039046  61.3461 299.1248  2.00565008167132

Orekit does not use the “line 0”. Therefore, what I can suggest you is to create a Map object containing the satellite name and the corresponding TLE(s). Something like: Map<String, TLE> or Map<String, List<TLE>>

I suggest you to add an event detector to your tle propagator. In the package of Orekit you will find the class ElevationExtremumDetector that answer your request. Here you will find an example on how to initialize and add this event detector to an orbit propagator (the example uses an Eckstein-Hechler propagator but the initialization is identical for a TLE propagator).

By adding an event handler to the ElevationExtremumDetector you can easily access the date of the maximum elevation. To add a handler to a detector, you have to use the withHandler() method. To create your own event handler to print (or save) to date of the maximum elevation, you can implement the EventHandler interface in the,handler package.
A simple implementation can be:

private static class Visibility implements EventHandler<ElevationExtremumDetector> {

        public Action eventOccurred(SpacecraftState s, ElevationExtremumDetector ed, boolean increasing) {
            // We have an elevation extremum

            // Get the corresponding elevation in degrees
            final double elevation = FastMath.toDerees(ed.getElevation(s));

            // Get the date of the extremum
            final AbsoluteDate date = s.getDate();

            // Print the data
            system.out.println("Maximum elevation at: " + date + " value (°): " + value);

            // Continue after event detection
            return Action.CONTINUE;


You can add more information to this event handler.

What is the signification of these acronyms?

Knowing the coordinates of the station, you can create a GeodeticPoint and then a TopocentricFrame to access azimuth and elevation of the satellite. After creating the topocentric frame, you can use the methods getElevation() and getAzimuth().
To access the azimuth and elevation angles at fixed step, you will have to add an OrekitFixedStepHandler (package propagation.sampling) to your orbit propagator. Implementing this interface is simple, you will find an example here.

I hope this will help you.
Kind regards,


Thank you very much for this detailed explanation. I know this will help me absolutely.
AOS (Acquisition of Signal) is the time that a satellite rises above the horizon of an observer and EOS (End of Signal) is the time of the end of sight.

Again thank you very much!

Kind regards,