EE 499 — Satellite Technologies · prototype tool

What is a TLE?

Two lines of 69 characters that say where a satellite was at one instant and how it was moving. Almost every public satellite-tracking tool starts here. This page takes one apart column by column.

Two lines, sixty-nine characters each

A two-line element set (TLE) is a compact, fixed-width text record describing one Earth-orbiting object. It was designed in the 1960s for punched cards and teleprinters, and the format has not changed since — which is why it is so rigid, and why it is still everywhere.

Each set has two mandatory lines of exactly 69 characters. Most distributions add an optional third line above them carrying the object's name, so you will see both the “2-line” and “3-line” forms in the wild.

The numbers come from the US Space Force's radar and optical tracking network. Observations are fitted to the SGP4 orbit model, and the fitted parameters are what the TLE stores. They are published through CelesTrak and Space-Track.

The single most important thing to understand

A TLE does not contain a position and a velocity. It contains mean elements — parameters that only mean what they are supposed to mean when fed to the SGP4 model that produced them. They are averaged in a way that deliberately removes short-period wobbles, so that the model can put them back. Treating them as ordinary Keplerian elements is an approximation, and we will be precise later on the page about how much that costs you.

The whole journey, end to end

A satellite is up there. A red line crosses a map on your screen. Everything between those two facts is the chain below — and the whole middle of it fits in 138 characters.

  1. start

    Step 1

    The real orbit

    Radar and telescopes watch it pass. Nobody can read its orbit off directly.

    the real thing

  2. fit + pack

    Step 2

    The TLE

    Those observations are fitted to the SGP4 model, and the fit is packed into two lines of 69 characters.

    SGP4 mean elements

  3. read by column

    Step 3

    Six numbers and a time

    Size, shape, tilt, orientation and starting position — plus the instant they were true.

    a, e, i, Ω, ω, M₀

  4. Kepler + rotate

    Step 4

    A point in space

    Kepler's equation says where on the ellipse at time t. Three rotations tilt that ellipse into place.

    PQW → ECI

  5. θ = ωE·t

    Step 5

    A point on the map

    The Earth turns underneath. The position in space becomes a latitude and a longitude — the ground track.

    ECEF → lat, lon

Two places where reality leaks out

Between steps 1 and 2, a real orbit — perturbed by a lumpy Earth, the atmosphere, the Sun and the Moon — is compressed into a handful of averaged numbers. They only mean what they are supposed to mean when SGP4 reads them back.

Between steps 3 and 4, our visualizer propagates plain two-body Kepler motion instead of SGP4. Near the epoch the shape is right and the lesson holds; a day or two later the real satellite is somewhere else.

Steps 2 and 3 are what the decoder below does. Steps 4 and 5 are what the Orbit Visualizer does.

Decode one

Pick a sample or paste your own. Hover or focus a row in the table to highlight the exact characters it comes from.

These samples are constructed teaching examples. The checksums are valid and the orbits are realistic, but they are not live orbital data and must not be used for real tracking. For current elements, fetch them from CelesTrak or Space-Track and paste them below — the decoder works on any well-formed set.

Raw record with column numbers


        

Columns are 1-based. Notice that fields are separated by position, not by spaces — several of them touch each other.

Field by field

Ln Cols Field Raw characters Decoded

What that orbit actually is

The six numbers the Orbit Visualizer needs


          

Six things that break naive parsers

Every one of these has produced a confidently wrong satellite track in somebody's student project. They are worth reading before you write a line of parsing code.

  1. It is a fixed-column format, not a delimited one

    Splitting on whitespace works on most lines and then silently fails on the rest. On line 2 the mean motion ends at column 63 and the revolution number starts at column 64, with nothing in between. Split … 15.50377579478213 on spaces and you get one token that is neither value. Read by column, or not at all.

  2. The eccentricity has an invisible “0.” in front of it

    The field holds seven digits and no decimal point. 0006703 means 0.0006703, and 7200000 means 0.72.

    A consequence worth noticing: because the leading 0. is assumed, the format cannot represent e ≥ 1. A TLE can only ever describe a closed orbit — never a parabolic or hyperbolic trajectory. The largest eccentricity expressible is 0.9999999.

  3. B* and the second derivative use an assumed-decimal exponent

    10270-3 is not “10270 minus 3”. It is 0.10270 × 10−3: five mantissa digits with an assumed leading 0., then a signed single-digit exponent. So -11606-4 is −0.11606 × 10−4.

  4. The epoch year is two digits, windowed at 57

    57–99 means 1957–1999; 00–56 means 2000–2056. The pivot is Sputnik. The format will need attention again in 2057.

    The day field is a day of year with a fractional day, in UTC, where 001.00000000 is midnight on 1 January — not 2 January. Off-by-one here shifts your whole ground track.

  5. The checksum counts a minus sign as 1

    Column 69 is the sum of every digit in columns 1–68, with each counting as 1 and every other character as 0, taken modulo 10. Plus signs, letters, spaces and decimal points contribute nothing. It catches typos and truncation, not much else — it is a transmission check, not a signature.

  6. Catalog numbers ran out, and now some start with a letter

    The catalog field is five characters, so it capped at 99 999. The Alpha-5 extension puts a letter in the first column: A = 10, B = 11, … Z = 33, skipping I and O because they read as 1 and 0. So T5544 is object 295 544. Parsers that assume five digits return NaN and usually carry on regardless.

Column reference

The authoritative layout, for when you are writing your own parser. Columns are 1-based and inclusive.

Line 1 — identity, epoch, drag

ColumnsFieldNotes
01Line numberAlways 1.
03–07Satellite catalog numberNORAD ID. May be Alpha-5 encoded.
08ClassificationU unclassified, C classified, S secret. Public sets are always U.
10–11International designator: launch yearLast two digits, same 57 window.
12–14International designator: launch numberWhich launch of that year.
15–17International designator: pieceA is normally the primary payload; later letters are other objects and debris.
19–20Epoch yearTwo digits, windowed at 57.
21–32Epoch day of yearFractional day, UTC. Day 1.0 is 1 January 00:00.
34–43First derivative of mean motion ÷ 2rev/day². Positive means the orbit is decaying. Unused by SGP4 itself.
45–52Second derivative of mean motion ÷ 6rev/day³, assumed-decimal exponent. Almost always zero.
54–61B* drag termInverse earth radii, assumed-decimal exponent. This is the one SGP4 actually uses.
63Ephemeris type0 in every public set, meaning “propagate with SGP4/SDP4”.
65–68Element set numberIncrements with each new set issued for the object.
69ChecksumModulo 10, minus signs count as 1.

Line 2 — the orbit

ColumnsFieldNotes
01Line numberAlways 2.
03–07Satellite catalog numberMust match line 1. If it does not, you have two different objects.
09–16Inclination iDegrees, 0–180. Above 90° the orbit is retrograde.
18–25RAAN ΩDegrees. Where the orbit plane crosses the equator heading north, measured from the vernal equinox.
27–33Eccentricity eAssumed leading 0.
35–42Argument of perigee ωDegrees, from the ascending node to perigee.
44–51Mean anomaly MDegrees at the epoch. This is the “where is it now” field.
53–63Mean motion nRevolutions per day. Sets the orbit size.
64–68Revolution numberCompleted revolutions at the epoch. Rolls over past 99 999.
69ChecksumSame rule as line 1.

From a TLE to an orbit you can draw

Five of the six elements the Orbit Visualizer needs are read straight off line 2. Only the orbit size needs converting, because a TLE stores the mean motion rather than the semi-major axis:

n [rev/day]  ->  n [rad/s] = n · 2π / 86400
a = ( μ / n² )^(1/3)          with μ = 398 600.4418 km³ s⁻²
TLE fieldVisualizer controlConversion
Mean motion nSemi-major-axis altitudeKepler's third law, then subtract RE
Eccentricity eEccentricityInsert the assumed 0.
Inclination iInclinationDirect
RAAN ΩRAANDirect
Argument of perigee ωArgument of perigeeDirect
Mean anomaly MInitial mean anomaly M0Direct, valid at the epoch

What this conversion costs you

The visualizer propagates two-body Keplerian motion. A TLE's elements are SGP4 mean elements. Feeding one to the other is a legitimate teaching approximation, and it is also wrong in ways you should be able to name:

  • The semi-major axis is approximate. The stored mean motion is a Brouwer–Kozai mean value, so Kepler's third law returns an a that is typically a few kilometres off the osculating value in LEO.
  • RAAN will drift and our model will not. Earth's oblateness (J2) regresses the node of a 500 km, 51.6° orbit by roughly −5° per day. A two-body model holds Ω fixed, so the ground track slides sideways from the truth within a day or two.
  • Drag is ignored entirely. B* is right there in line 1 and our model has nowhere to put it.

For a single orbit near the epoch this is fine and the shape is instructive. For predicting when a satellite will actually pass over a ground station a day later, it is not — that needs SGP4.

A TLE goes stale

The elements describe a fit centred on the epoch. Accuracy is typically around a kilometre near the epoch and degrades by roughly one to three kilometres per day, faster for low, draggy orbits and much faster around a solar storm. Operational tracking refreshes element sets every few days or more often.

The decoder above reports the age of whatever you paste, measured against your computer's clock. Treat a set more than a week or two old as an illustration rather than a prediction.

What comes next

The planned next step is to let you hand a TLE straight to the Orbit Visualizer and watch its ground track, with the simulation clock anchored to the element set's epoch rather than to zero.

Predicting when a satellite passes over a specific place needs three things this page does not yet cover: an observer position (latitude, longitude, altitude), a minimum elevation angle to count as visible, and a propagator good enough to still be right hours or days after the epoch. The parser on this page is already shaped to feed all three.