As shown in the question, Now I have a TLE observation data and CPF(Consolidated Prediction Format) data. According to CPF's documentation, CPF predictions are tabulated satellite state vectors generally in the geocentric Earth-fixed coordinate system of date known as the ITRF (International Terrestrial Reference Frame).
So what can I do to convert TLE data into state vectors in ITRF(Both data at the same observation time)?

Here's what I've done so far:
The observation time is 2022-07-12T11:38:00.043871000
The TLE data is:

1  7646U 75010A   22193.48472273 -.00000146  00000-0 -15590-5 0  9998
2  7646  49.8266  11.4131 0205800   0.2699 359.8273 13.82312865395926 

The CPF data is(The specific data format can be viewed in CPF_format):
10 0 59772 41880.000000 0 -430956.931 -7170514.708 -0.274
So the Cartesian coordinate of the CPF data point at the observation time in ITRF is:
x = -430956.931, y = -7170514.708, z = -0.274
Then, I converted TLE data into a state vector in ITRF through the following python code:

   from tletools import TLE
   from astropy import units as u
   from astropy.coordinates import GCRS, ITRS, CartesianRepresentation
   time = 2022-07-12T11:38:00.043871000
   s = '1  7646U 75010A   22193.48472273 -.00000146  00000-0 -15590-5 0  9998'
   t = '2  7646  49.8266  11.4131 0205800   0.2699 359.8273 13.82312865395926'
   tle = TLE.from_lines('starlette', s, t)
   orbit = tle.to_orbit()
   r, v = orbit.rv()
   gcrs = GCRS(CartesianRepresentation(r[0] * u.m, r[1] * u.m, r[2] * u.m), obstime=time)
   itrs = gcrs.transform_to(ITRS(obstime=time))
   x_ecef = itrs.x.value
   y_ecef = itrs.y.value
   z_ecef = itrs.z.value

However, the results are far from the CPF data:
·x_ecef = -387448.4141639284, y_ecef = -7172405.299520155, z_ecef = 23871.227963843405
Later, I also considered precession, nutation, pole shift and other factors. Due to the large amount of code, here it will not be displayed. But maybe my research is not enough, the difference between CPF and TLE data is still obvious.
So, what efforts should I make to solve the above problems? Can I directly consider precession, nutation, pole shift and other factors in astropy.coordinates?
I will appreciate it for any help!

  • $\begingroup$ did you solve your problem? I use sgp4 as the accepted answer suggested, still has a big difference $\endgroup$
    – Gary Allen
    Sep 26, 2023 at 9:08

1 Answer 1


This is not quite a case of garbage in, garbage out. It's a garbage in the middle problem. Toss the tletools package you are using in the circular file (aka the garbage can), which is where it belongs. It's pretty obvious from the code, starting at line 209, that TLE.to_orbit is doing exactly the wrong thing. It treats the TLE elements as if they were classical osculating elements, which very much is not the case.

Astropy recommends using the sgp4 package.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.