# Determining GEO Orbital Slot from TLE

I'm trying to figure out the equation based on TLE data which orbital slot a GEO satellites occupies.

I have the TLE data imported into R and I wish to know what satellites are in adjoining GEO slots. I wish to know the adjoining satellites to a particular slot to give my customer some knowledge of how many Conjunction Analysis have to be performed.

In some replies to this post-- thank you btw -- here is the spreadsheet formula I'm using and i still get erroneous results -

Here is a calculation using values from the TLE headers. I've written it with spreadsheet notation:

mod(RightAscension + sum(MeanAnomaly + Perigee), 360)


I can calculate the altitude from another exercise and it looks correct. However, for longitude (or RA) from the (for example) TLE BSAT-3A the value is 239.9 (599.9 before mod) while www.n2yo.com/ says it 109.9 degrees which seems more correct

• Are you trying to work out the longitude of a satellite based on it's TLE?
– user20636
Apr 8, 2019 at 19:17
• I've made an edit to your question to incorporate some of your comments, have a look and feel free to edit further.
– uhoh
Apr 8, 2019 at 23:22
• Thanks for the edit! I made a formatting change but I'm not sure I've captured the math correctly now. Can you double check that it looks the way you intend?
– uhoh
Apr 11, 2019 at 2:28
• yes, that's it,, i made the sum and mod separately in order to help debugging.
– user30059
Apr 11, 2019 at 2:36

(EDIT This answer responds to the original question that just referred to "slots" and said nothing about the accuracy required for collision avoidance}

This is certainly do-able as a simple calculation. You will need to recognise a little geometry. How much I explain will depend on your prior knowledge. Please say if you need more explanation on one step or another.

• The satellite moves around its GEO, or near GEO, orbit and at anytime has an angle from the Earth to an external reference.
• The rotating Earth also has an angular reference from any given longitude (e.g. 0degrees longitude)

Once you have both angles worked out at some instant you can work out the longitude as the difference between them.

In the following diagram see that for a geostationary object, i.e. one with near zero inclination, the orbit would be coplanar with the equator.

$$\text{As a result,}\ \Omega, \omega, \text{ and } \nu \text{ are all co-planar and can be added.}$$ $$\text{ This gives the total angle from the reference direction,}$$ $$\unicode{9800} (Aries), \text{ to the satellite (celestial body) in the diagram:}$$ As a rough and ready guide (if the inclination of the geostationary satellite is near to zero):

1. For a near circular, near GEO, satellite orbit take the sum of the right ascension and then the sum of the argument of perigee and mean anomaly. If the inclination is non-zero but small then you could optionally reduce the sum of the latter two quantities by cos(inc). You may have to do some mod() operation depending on the values, i.e if these sum to greater than 360deg.
2. For the Earth you need a reference of where a given longitude was pointing at some date/time in the past and then walk forward the amount of elapsed time to the time of your TLE. I found an old spreadsheet that suggested I'd previously used 99.968+360.985647*(days.since.1950 - 18262.0) though that is rather flaky and I'd be happy to be corrected. I think it may have come from A Handbook of Geostationary Orbit by Soop, though there must be other references around.

Link to orbital reference terms diagram

• thank you,, for item 1., what is the mathematical expression you have for the first sentence? Doesn't seem like adding these 3 values will give m the R.A.?
– user30059
Apr 9, 2019 at 2:00
• I hope the diagram helps. By the way can anyone fix my MathJax, it doesn't seem to respond to \aries. Apr 9, 2019 at 11:34
• I wish I could up vote twice!
– uhoh
Apr 9, 2019 at 12:19

Since you are looking for satellite conjunctions you will want good accuracy. The values in TLEs are intended only for use by an SGP4 propagator, and not designed to be used in other ways. You can get very approximate results by using them directly, but the results will be incorrect, and you won't be able to tell how incorrect they are!

For example while a simple method might work for crude sorting purposes, a lot of old satellites in graveyard orbits (and those that lost control before making it there) will be cruising very close to GEO with substantial inclination and/or eccentricity and/or creeping along longitude non-synchronously. A simple method to guess positions from TLEs will turn out to be not so simple, and may still miss some particularly interesting cases that may turn out to be the ones you are looking for most!

There are many sources for SGP4 propagation out there (the right way to do it), in many computer languages, but I don't know if there is one that is written in R and also well tested and supported.

I would recommend you try to learn a bit of Python if you don't know it already. I use Skyfield as an easy way to SGP4-propagate TLEs. See How can I plot a satellite's orbit in 3D from a TLE using Python and Skyfield? and also here for example.

I know that for Python there is the Python Package Index or PyPI: https://pypi.org/ which is a central index to search for packages. I noticed that it doesn't include Skyfield (because SGP4 is just a small part of it) and it also fails to show https://github.com/brandon-rhodes/python-sgp4 However, it does show Poliastro https://pypi.org/project/poliastro/ which might also work well for you.

If you know of a similar index of packages or software for the R language, then you can try searching for various combinations of the words TLE, Two Line Element Set orbit, propagation, propagator and of course SGP4!

• @BarryvT see my For example: edit above. I started writing it as a reply comment, but decided it should be part of the post itself.
– uhoh
Apr 9, 2019 at 2:06
• @BarryvT "In the vicinity" - yes. Best way to get a handle on how accurate involves that propagation step again. There are questions elsewhere on space stack exchange addressing this. Apr 9, 2019 at 14:07
• @uhoh Done, managed to edit it in time. Still haven't got into the habit of the (at) thing Apr 9, 2019 at 14:12
• @BarryvT that's the kind of specific information that should be included within your question where readers will see it. I moved your previous comment back into your question but I think you can see how that works now, so can you give it a try and edit your question and add that? Thanks! Stack Exchange is different than some other sites. Comments are considered temporary and ("should" be) only used to clarify posts. They can be cleaned up at any time without notice.
– uhoh
Apr 11, 2019 at 1:58

Reviving this post for future readers as the current answer is ambiguous.

Orbital Slot = (RAAN + AOP + MA + Longitude of Vernal Equinox) modulo 360

If the Orbital Slot is above 180, subtract 360 to get it into standard longitude format.

The RAAN is measured from the vernal equinox (also called the First Point of Aries or X in the ECI coordinate system), so all you have to do is find out the longitude of X at the given epoch and add it to the sum of the right ascension of the ascending node (RAAN), argument of perigee (AOP), and the mean anomaly (MA).

You'd probably use a propagator like Skyfield if you were interested in a high-precision answer but if you were just wanting something that good enough, you can use the Epoch, RAAN, AOP, and MA straight the from TLE and determine the longitude of the First Point of Aries using the equations for GMST. Better yet, just use a J2000 Origin calculator like this: https://celestialprogramming.com/snippets/geographicPosition.html

Example TLE:

NILESAT 301
1 52817U 22061A   *23249.56848803* -.00000069  00000+0  00000+0 0  9990
2 52817   0.0496 *335.7118* 0002127 *182.0463*  *25.2751*  1.00272417  4570


Python Code:

import math

#inputs from TLE
epoch = 23249.56848803
raan = 335.7118
aop = 182.0463
ma = 25.2751

#compute vernal equinox longitude
year, frac_day = int(str(epoch)[:2]), float(str(epoch)[2:])
julian_date = 2451544.5 + 365 * year + math.floor(0.25 * year) + math.floor(0.01 * year) + math.floor(0.0025 * year) + frac_day
julian_centuries = (julian_date - 2451545) / 36525
earth_rotation_angle = (2 * math.pi * (0.779057273264 + 0.00273781191135448 * julian_centuries * 36525 + ((julian_centuries * 36525) % 1))) % (2 * math.pi)
if earth_rotation_angle < 0: earth_rotation_angle += 2 * math.pi
gmst = (earth_rotation_angle + (0.014506 + 4612.15739966 * julian_centuries + 1.39667721 * julian_centuries**2 - 0.00009344 * julian_centuries**3 + 0.00001882 * julian_centuries**4) / 60 / 60 * math.pi / 180) % (2 * math.pi)
if gmst < 0: gmst += 2 * math.pi
vernal_equinox = -gmst * 180 / math.pi

#solution
orbital_slot = (raan + aop + ma + vernal_equinox) % 360
if orbital_slot>180: orbital_slot -= 360

print(orbital_slot, "deg E")


In this case, the solution yields -7.014 deg E. For an idea of accuracy, Celestrak reports -7.0 deg E.

• Welcome to Stack Exchange! Great answer +1. I'm not sure my answer recommending the use of Skyfield is ambiguous per se but I certainly think your answer where you work the problem and share the script is by far the most useful of the three answers!
– uhoh
Sep 7 at 23:30