Predicting the ISS From a TLE: A Worked Example

ISS Info Team20 min read
Illustration of an International Space Station overhead pass, with a luminous arc tracing the station's path across a starfield above a low horizon

The dot moving across the live tracker on issinfo.net is not a guess. It is the output of an algorithm whose inputs are two lines of plain text, 69 characters each, a format designed for IBM punched cards in the late 1960s and never seriously updated since. Those two lines are called a Two-Line Element set, or TLE, and they contain everything needed to predict where the International Space Station will be tonight, tomorrow, or in three days time.

This post takes a real, fresh TLE for the ISS, walks through what every field means, and then propagates it forward by exactly one hour using nothing more than a calculator and Johannes Kepler. The simple version gets within a few kilometres. The grown-up version, an algorithm called SGP4, gets to within one. And it expires faster than milk.

Annotated ISS Two-Line Element set on a dark background with field callouts and a small Earth and orbit diagram in the corner The actual ISS TLE retrieved from Space-Track.org at 03:08:50 UTC on 28 May 2026, the same upstream this site's tracker pulls from. Two lines of text, no header, no metadata. Everything from "where is it now" to "how draggy is it" lives in these 138 characters.

A format older than the moon landing

Max Lane, working on a US Air Force contract in the mid 1960s, published the first paper in 1965 on what would become the Simplified General Perturbations family of models. By 1969 he and Kenneth Cranford had refined the maths to include harmonics from the Sun and Moon, and the model was the standard at NORAD by the early 1970s. The data fed to it was punched onto two 80-column IBM cards, the so-called transmission format, and that is exactly the format the world still uses, rendered as ASCII text rather than rectangular holes.

In 1980, Felix Hoots and Ronald Roehrich published Spacetrack Report Number 3, complete with the FORTRAN IV source code for SGP4. That report is the reason every amateur tracker, every commercial constellation operator, and every web tracker like this one can speak a common orbital language. It has been revisited and tightened, most notably by David Vallado and the CelesTrak team in 2006, but the bones of the format and the algorithm are unchanged.

The United States Space Force, through the 18th Space Defense Squadron, observes every detectable object in Earth orbit using a worldwide network of radars and optical sensors. The activation of the Space Fence S-band radar on Kwajalein Atoll in 2020 multiplied that catalogue several times over. Each tracked object gets a TLE, refreshed when new observations warrant it. The unclassified entries are published on Space-Track.org and mirrored, curated and explained on Dr T. S. Kelso's CelesTrak site, which has been the public face of orbital data since 1985.

The TLE, line by line

Here is the live ISS TLE the live tracker is using as this post goes out:

ISS (ZARYA)
1 25544U 98067A   26148.13113954  .00011691  00000+0  21663-3 0  9996
2 25544  51.6335  39.3887 0007375 106.1024 254.0777 15.49434162568649

The first line is the optional 24-character title, present in three-line element sets and absent in two-line. "ZARYA" is the name of the first ISS module, launched in 1998, and the catalogue uses it as the station's permanent label.

Line 1 carries the housekeeping data, line 2 the orbital geometry. Reading from column 1, here is what line 1 says.

Field Value Meaning
Line number 1 Tells the parser which line it is reading
Catalog number 25544 NORAD's permanent ID for the ISS, assigned at the Zarya launch
Classification U Unclassified
International Designator 98067A Launched 1998, the 67th launch of the year, piece A
Epoch 26148.13113954 Day 148.13113954 of 2026, which is 03:08:50 UTC on 28 May
First derivative of mean motion .00011691 How fast the orbital period is shortening, in rev/day per day
Second derivative of mean motion 00000+0 Unused by SGP4, retained for legacy reasons
B* drag term 21663-3 A fitted ballistic coefficient, 0.00021663 per Earth radius
Ephemeris type 0 Always zero in distributed data
Element set number 999 Incremented every time a new TLE is generated for this object
Checksum 6 Modulo-10 sum of every digit, with minus signs counted as 1

Two of those entries deserve a closer look. The epoch is encoded as a two-digit year followed by the day of the year and a fractional part down to a hundred-millionth of a day. To decode it, take 0.13113954 of a day, multiply by 86,400 seconds, and you get 11,330.456 seconds, or 3 hours, 8 minutes, 50.456 seconds. So this TLE was fitted to observations made through 03:08:50 UTC on 28 May 2026, and every other number on the two lines describes the orbit at exactly that instant.

The B* drag term, often written B-star, is the only place the atmosphere gets a vote. It is a scaled ballistic coefficient: roughly the satellite's drag-coefficient-times-area divided by its mass, in units of inverse Earth radii. The trailing "-3" is exponent notation: 21663-3 means 0.21663 multiplied by ten to the minus three, or 0.00021663 per Earth radius. It is how SGP4 knows how much velocity the ISS is losing to air drag every revolution.

Line 2 is the orbit itself.

Field Value Meaning
Line number 2
Catalog number 25544 Must match line 1
Inclination 51.6335° Tilt of the orbital plane against the equator
Right ascension of the ascending node 39.3887° Where the orbit crosses the equator going north, measured against the stars
Eccentricity 0007375 0.0007375, dimensionless, with an implied leading decimal
Argument of perigee 106.1024° Angle from the ascending node to the orbit's low point
Mean anomaly 254.0777° Where the station was on its orbit at the epoch, as a uniform-time angle
Mean motion 15.49434162 Revolutions per day
Revolution number at epoch 56864 How many orbits since launch
Checksum 9

Eccentricity of 0.0007375 means the ISS orbit is, to a very good approximation, a circle. Its closest and furthest points from Earth's centre differ by only about ten kilometres out of nearly seven thousand. Mean motion of 15.4943 revolutions per day works out to an orbital period of 92.93 minutes, which is what the live tracker is counting down.

Six numbers describe an orbit

Strip the housekeeping away and you are left with six numbers that fully specify an orbit in space. They are called the Keplerian elements, after Johannes Kepler, who worked out in 1609 that planets travel on ellipses with the Sun at one focus.

Diagram of the six Keplerian orbital elements, with Earth at the centre, an inclined orbital plane shown as a tilted ellipse, and labels for inclination, right ascension of the ascending node, argument of perigee and true anomaly Two numbers describe the orbit's shape. Three describe where the ellipse sits in space. The sixth places the satellite on it.

The first two describe the shape:

  • Semi-major axis (a) is half the long diameter of the ellipse, the average orbital radius.
  • Eccentricity (e) is how squashed the ellipse is. Zero is a perfect circle, one is a parabola, anything in between is an ellipse.

The TLE does not actually store the semi-major axis. It stores the mean motion instead, the number of orbits per day, and you derive a from Newton's version of Kepler's third law:

n² × a³ = μ

where n is the mean motion in radians per second and μ is Earth's standard gravitational parameter, 398,600.4418 km³/s². Once you know how fast it goes round, the geometry is fixed.

The next three numbers orient the orbital plane in space, measured against the Earth Centred Inertial frame, a coordinate system whose x-axis points at the vernal equinox and whose z-axis runs through the north pole.

  • Inclination (i), 51.6335°, is the tilt of the orbital plane against the equator. The ISS inclination is high because the station has to be reachable from Baikonur in Kazakhstan as well as Kennedy Space Center in Florida, and 51.6° is the geometric compromise that gives both launch sites a fair shot.
  • Right ascension of the ascending node (Ω), 39.3887°, is the longitude (against the fixed stars, not against the rotating Earth) where the orbit crosses the equator going from south to north.
  • Argument of perigee (ω), 106.1024°, is the angle inside the orbital plane from that ascending node to the orbit's low point.

The sixth number, the mean anomaly (M), 254.0777°, says where the satellite was on the orbit at the epoch. It is not a real geometric angle. It is the angle the satellite would be at if it travelled at perfectly uniform angular speed, which a real orbit does not. Real orbits run faster near perigee and slower near apogee, by Kepler's second law. Mean anomaly is a fiction designed to be linear in time, and it is by far the most useful fiction in orbital mechanics.

Three anomalies and one transcendental equation

To turn the mean anomaly into a position, you need to convert it twice: first to the eccentric anomaly (E), an angle measured at the centre of the ellipse, and then to the true anomaly (ν), the real geometric angle measured at the focus where Earth sits.

Diagram of an ellipse and its auxiliary circle, showing the geometric relationship between mean anomaly, eccentric anomaly and true anomaly, with the four-step propagation equations in a side panel M ticks like a clock. E is the projection on a helper circle. ν is the real angle from the focus. The TLE stores M because it is the only one that advances linearly with time.

The relationship between mean anomaly and eccentric anomaly is Kepler's equation, written down in 1609 and never solved in closed form since:

M = E - e × sin(E)

It is transcendental: there is no algebraic rearrangement that gives E in terms of M. You have to iterate. Newton's method converges in two or three steps for the near-circular ISS orbit:

E_{k+1} = E_k - (E_k - e × sin(E_k) - M) / (1 - e × cos(E_k))

Starting from E_0 = M, the first correction is on the order of e, the second on the order of , and so on. With e = 0.0007, two iterations are already at the limit of double-precision arithmetic.

Once you have E, the true anomaly and orbital radius come straight from geometry:

tan(ν / 2) = √((1 + e) / (1 - e)) × tan(E / 2)
r = a × (1 - e × cos(E))

Now you have the satellite's position in the orbital plane: at distance r from Earth's centre, at angle ν past perigee. Three rotations later, by ω, then i, then Ω, you have it in the inertial frame. One more rotation, by the angle Earth has spun through since some reference moment, and you have it in the Earth-fixed frame from which latitude and longitude fall out trivially.

A worked example: where is the ISS one hour after the epoch?

Take the ISS TLE above and ask: where will the station be at 04:08:50 UTC on 28 May 2026, exactly one hour after the epoch? Pure Kepler, no SGP4 corrections, all arithmetic shown.

Step 1: convert mean motion to SI units.

n = 15.49434162 rev/day × 2π rad / 86,400 s = 1.12667 × 10⁻³ rad/s

Step 2: get the semi-major axis from Kepler's third law.

a³ = μ / n²
   = 398,600.4418 / (1.12667 × 10⁻³)²
   = 3.13978 × 10¹¹ km³
a = 6,796.5 km

So the orbit's average radius is 6,796 km, which is 418 km above the Earth's 6,378 km equatorial radius. Exactly what you would expect for the ISS.

Step 3: advance the mean anomaly by one hour.

ΔM = n × Δt = 1.12667 × 10⁻³ × 3600 = 4.0560 rad = 232.395°
M(t) = 254.0777° + 232.395° = 486.473°
     = 126.473° (mod 360°)
     = 2.2074 rad

The station has gone a bit more than half an orbit. Mean anomaly of 126° means it is past apogee and heading back down toward perigee.

Step 4: solve Kepler's equation for E.

Starting from E_0 = M = 2.2074:

E_0 = 2.2074
correction = (2.2074 - 0.0007375 × sin(2.2074) - 2.2074) / (1 - 0.0007375 × cos(2.2074))
           = (-0.0007375 × 0.80354) / 1.000439
           = -0.000593
E_1 = 2.2074 - (-0.000593) = 2.2080 rad = 126.507°

One Newton step has already converged to five decimal places. The eccentricity is so small that for the ISS, E and M are nearly identical.

Step 5: get true anomaly and radius.

ν ≈ E + 2e × sin(E) = 126.507° + 2 × 0.0007375 × 0.80354 × (180/π)
  = 126.507° + 0.0679° = 126.575°
r = a × (1 - e × cos(E))
  = 6,796.5 × (1 - 0.0007375 × cos(126.507°))
  = 6,796.5 × (1 - 0.0007375 × (-0.5949))
  = 6,796.5 × 1.000439
  = 6,799.5 km

That gives an altitude above the equatorial radius of 421 km, two kilometres higher than the orbit's mean value. The station is past apogee and falling back, exactly as the mean-anomaly value implied.

Step 6: rotate into the inertial frame. Position in the orbital plane is (r cos ν, r sin ν, 0). Apply rotation matrices in the order R₃(-Ω) R₁(-i) R₃(-ω) and you have the satellite's (x, y, z) in the Earth Centred Inertial frame at the requested instant. From there, rotating by the angle Earth has spun through gives you (x, y, z) in Earth-fixed coordinates, and a single coordinate transform gives latitude, longitude and altitude above the WGS84 ellipsoid. That is what the live tracker draws as a moving dot.

For 04:08:50 UTC on 28 May 2026, the simple Kepler propagation puts the ISS over the southern Indian Ocean, around 38°S and 92°E, a few minutes shy of crossing the equator on its northbound leg. The real SGP4 answer is within a kilometre or two of that, but in the wrong direction by a handful of seconds because pure Kepler ignores three real effects.

What SGP4 adds, and why the simple maths is not enough

Flowchart showing the propagation pipeline from a TLE through mean-anomaly advance, Kepler's equation, rotation into ECI and conversion to latitude and longitude, with SGP4 corrections listed below Pure Kepler treats the Earth as a point and the orbit as empty. SGP4 adds the bulge, the air, and the gravitational tugs.

Pure Kepler assumes three things that are not true. The Earth is not a point mass. There is air at 400 km. And the Sun and Moon are not infinitely far away. SGP4 corrects all three at every propagation step.

The Earth's bulge. The planet is an oblate spheroid, fatter at the equator than the poles by about 21 km. The dominant term in its gravity field, called J₂, makes the orbital plane slowly precess around the polar axis and the argument of perigee slowly rotate within the plane. For the ISS the ascending node drifts west by roughly 5° per day, and the orbital plane completes a full circuit of the sky every two months. SGP4 bakes this in by treating the Keplerian elements themselves as functions of time, not constants.

Atmospheric drag. Even at 400 km there is enough air to matter. The thermosphere expands when the Sun is active and contracts when it is quiet, so the drag on the ISS varies by a factor of two or three over the eleven-year solar cycle. SGP4 uses the B* term from the TLE to model the secular shrinkage of the orbit caused by drag. The first derivative of mean motion in the TLE, .00011691, says that the station's orbit is currently speeding up at 0.0001 revolutions per day per day. Faster revolutions means a smaller orbit. The ISS is sinking at about 70 metres a day in May 2026, and will sink faster as the next solar maximum approaches.

Third-body gravity. The Moon and Sun tug on the station, very gently at the ISS altitude. Pure Kepler ignores them. SGP4 includes them anyway, mostly so that the same algorithm works for higher orbits where they really matter.

With those corrections, the SGP4 prediction error at the epoch is about one kilometre, and grows by a further one to three kilometres per day, mostly because nobody can predict the next month's solar weather and therefore the next month's thermospheric density. After three days the prediction is uncertain by maybe ten kilometres along-track, which sounds like a lot until you remember the station is travelling at 7.66 km/s. Ten kilometres along-track is an uncertainty of one and a half seconds in when the station passes a given point. For a backyard observer trying to catch a bright pass that is fine. For Cygnus Northrop Grumman trying to dock, it is not.

That is why a fresh TLE matters. The 18th Space Defense Squadron typically publishes new ISS element sets every six to twelve hours, and the live tracker on this site fetches them automatically from Space-Track.org. If a TLE on disk gets older than 24 hours, an alert fires and the data pipeline pulls a fresh one.

Why TLEs go stale: the reboost cycle

There is one more reason a TLE has a shelf life: the station does not behave the way the TLE assumes. Every few weeks, a visiting Progress or Cygnus cargo ship fires its engines for several minutes to push the ISS back up into its working orbit, adding about three kilometres of altitude. That manoeuvre is invisible to SGP4, which only knows about smooth drag. The moment the engines fire, every TLE published before the burn is wrong by exactly the size of the burn, and a new TLE has to be fitted to fresh radar observations.

NASA budgets around 7.5 tonnes of propellant a year, worth roughly $210 million in launch costs, to keep the station up. Without those reboosts, atmospheric drag would bring the ISS back into the thicker atmosphere in around two years, and the structure would burn up. The same drag also forces the rest of the catalogue to be re-fitted constantly. Of the roughly 30,000 trackable objects in low Earth orbit in 2026, the lowest few thousand get fresh TLEs every day, and SpaceX's Starlink satellites are republished hourly because their constant orbital adjustments make older TLEs nearly useless.

The Space-Track.org GP catalogue, the authoritative feed maintained by the 18th Space Defense Squadron and used by the live tracker on this site, is updated continuously as fresh radar fits come in. The relevant Go implementation of SGP4 that powers issinfo.net is go-satellite, a port of David Vallado's reference C++ code, and it is the same algorithm running inside every smartphone satellite-spotting app. The maths is over half a century old. The data refreshes constantly. That combination is what lets a 138-character string of digits tell you, to within a kilometre, where 420 tonnes of pressurised aluminium will be over your head tonight.

Things you might not know

Fact Detail
The format was designed for punched cards A TLE is 138 characters because two IBM 80-column cards, minus a few control fields, gave 138 usable columns. The format has never been updated because doing so would break every piece of software written since 1972.
There is a Y2K-style problem coming The two-digit epoch year is interpreted as 1957 through 1999 for values 57 through 99, and 2000 through 2056 for values 00 through 56. In 2057 the format will need to change or be retired. The CCSDS Orbit Mean-Elements Message format, with a four-digit year and a nine-digit catalogue number, is the planned successor and has been in use alongside TLEs since 2020.
The plus sign nearly broke everything When NORAD upgraded its UNIVAC mainframes from BCD to EBCDIC character encoding in the 1980s, the plus character changed binary representation. Checksums failed worldwide until Dr Kelso traced the problem and NORAD started feeding CelesTrak directly in 1989.
ISS catalogue number 25544 means it was the 25,544th tracked object The catalogue starts at 1, which is Sputnik 1's R-7 rocket booster. Sputnik 1 itself is number 2. Every numbered slot up to 25,544 was filled before Zarya launched on 20 November 1998.
Mean anomaly is fictional but irreplaceable The mean anomaly is the angle the satellite would have if it moved at constant angular speed, which it does not. It is the only orbital element that advances linearly with time, which is why every propagator uses it. Eccentric and true anomalies are then computed from it on demand.
SGP4 is older than the personal computer The FORTRAN IV source code in Spacetrack Report Number 3 was published in 1980, four years before the Apple Macintosh. The 2006 revision by Vallado, Crawford, Hujsak and Kelso fixed numerical issues but did not change the algorithm.
Deep-space satellites use a different model SGP4 is the near-Earth flavour. For orbits with periods longer than 225 minutes, including geostationary and Molniya orbits, the SDP4 variant adds extra terms for solar and lunar resonances. Modern code libraries merge both into one function and pick the right branch at runtime.
The B* term has weird units It is measured in inverse Earth radii, a unit chosen in the 1960s because it kept the numbers in a range FORTRAN could print without exponential notation. The actual ballistic coefficient in SI units is B* × 2 / ρ₀, where ρ₀ is a reference atmospheric density. Nobody ever uses the SI version.

Related Reading

Sources: Space-Track.org for the live ISS TLE (the same upstream this site's tracker uses; login required), Dr T. S. Kelso's Frequently Asked Questions: Two-Line Element Set Format, Wikipedia's Two-line element set and Simplified perturbations models articles, Hoots and Roehrich's 1980 Spacetrack Report Number 3, Vallado et al's 2006 Revisiting Spacetrack Report #3, and Heavens-Above's ISS orbit page for cross-checking the current elements.