This answer to Why are orbital periods different for different GNSS positioning system constellations? suggests that the orbital periods of the four large GNSSS constellations are linked to the rotation period of the earth (the sidereal day) by rational numbers with 17 or 34 as the denominator in order to facilitate roughly twice-daily contact with each constellation's ground stations. It uses this answer to Why are the GPS constellation satellites in such a high orbit? to help support this.

GPS uses 1/2 of a sidereal day, 11:58:02 and an orbit height of 20192 km.

Other satellite navigation use similar orbit periods, 17 orbits per 8 to 10 sidereal days.

Glonass uses 8/17 of a sidereal day, 11:15:48 and an orbit height of 19140 km.

BeiDou uses 9/17 of a sidereal day, 12:40:16 and an orbit height of 21224 km.

Galileo uses 10/17 of a sidereal day, 14:04:45 and an orbit height of 23232 km.

The ratio of 1/2 may be also written as 17/34, the other ones as 16/34 , 18/34 and 20/34. The differences are small. Thus all satellites could be measured about twice a day from the same ground stations.

If you go to the Wikipedia page for Satellite navigation and look at the table, the 17's do in fact show up in a table there (shown below with some rows suppressed for compactness:

screenshot of table from the linked Wikipedia article

I've downloaded TLEs from Celestrack using these links and propagated them using Skyfield and I don't see any evidence of substantially repeating ground track orbits.

Considering that since these constellations exist in MEO specifically so that any location will see many of them constantly, is there really anything to this "17" argument forwarded by both this and this answer? Or is it just a red herring?

squiggly plots of some GNSS satellite orbits

above: Ground tracks for 72 hours using TLE groups from Celestrak and SGP4 propagation using Skyfield. Axes are geographical longitude and latitude and the lines are the subsatellite points at 0.03 hour time steps.

3D plots of some GNSS satellite orbits

Note: The Beidou system has satellites in both MEO and Geosynchronous orbits (~28,000 and ~42,000 km radii).

above: Earth-centered inertial orbits for 72 hours using TLE groups from Celestrak and SGP4 propagation using Skyfield at 0.03 hour time steps.

class Constellation(object):
    def __init__(self, name):
        self.name = name
        self.sats = []

class Satellite(object):
    def __init__(self, name):
        self.name = name

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from skyfield.api import Loader, EarthSatellite

load = Loader('~/Documents/fishing/SkyData')  # avoids multiple copies of large files
ts   = load.timescale()

data    = load('de421.bsp')
earth   = data['earth']
ts      = load.timescale()

print earth.at(ts.now()).position.km   # for no reason at all

fnames = ('beidou.txt', 'galileo.txt', 'glo-ops.txt',   'gps-ops.txt')
names  = ('Beidou',     'Galileo',     'Glonass (ops)', 'GPS (ops)'  )

# Build constellations and EarthSatellites
constellations = []
for fname, name in zip(fnames, names):
    const = Constellation(name)
    with open(fname, 'r') as infile:
        lines = infile.readlines()
    const.lines = lines
    satnames, L1s, L2s = [lines[i::3] for i in range(3)]
    for name, L1, L2 in zip(satnames, L1s, L2s):
        if len(name)<30 and L1[0]=='1' and L2[0]=='2':
            sat = Satellite(name.strip())
            sat.L1, sat.L2 = L1, L2
            sat.satobj = EarthSatellite(L1, L2) # add the Skyfield object

for const in constellations:
    print "constellation name: ", const.name
    print [sat.name for sat in const.sats]
    print len(const.sats), len(const.lines)/3

hours = np.arange(0, 72, 0.03)
time  = ts.utc(2018, 6, 21, hours)  # start June 21, 2018

# Propagate TLEs
for const in constellations:
    for sat in const.sats:
        satobj_at    = sat.satobj.at(time)
        sat.pos      = satobj_at.position.km
        sat.subpoint = satobj_at.subpoint()
        sat.lon      = sat.subpoint.longitude.degrees
        sat.lat      = sat.subpoint.latitude.degrees
        breaks       = np.where(np.abs(sat.lon[1:]-sat.lon[:-1]) > 60)

        sat.plot_lon         = sat.lon[:-1]
        sat.plot_lat         = sat.lat[:-1]
        sat.plot_lon[breaks] = np.nan    # avoid ugly wraparounds

if True:
    things = ('-b', '-g', '-r', '-c')
    fs, lw = 16, 0.7
    for i, (const, color) in enumerate(zip(constellations, things)):
        plt.subplot(2, 2, i+1)
        for sat in const.sats:
            plt.plot(sat.plot_lon, sat.plot_lat, color, linewidth=lw)
        plt.title(const.name, fontsize=fs)

if True:    
    fig = plt.figure(figsize=[9, 7])  # [12, 10]
    things = ('-b', '-g', '-r', '-c')
    for i, (const, color) in enumerate(zip(constellations, things)):
        ax  = fig.add_subplot(2, 2, i+1, projection='3d')
        for sat in const.sats:
            x, y, z = sat.pos
            ax.plot(x, y, z, color)
        ax.set_title(const.name, fontsize=16)
  • 1
    $\begingroup$ I think the number of revolutions per sideral day was choosen to allow satellites position measurement from the ground stations twice per day. For measurement a satellite should be visible from 3 or more ground stations simultaneously. GPS was designed that way, but I have no information about this for the other systems. May be a plot of the relation of satellites to ground stations will be helpful. $\endgroup$
    – Uwe
    Commented Jun 22, 2018 at 10:19
  • $\begingroup$ If you choose a period of 8 sideral days and close to 2 revolutions per day but not exactly 2, you may select 15 or 17 revolutions per sideral day. For a period of 9 sideral days, 17 or 19 revolutions are possible. But for a period of 10 days, 19 or 21 revolutions should be used, not 17. $\endgroup$
    – Uwe
    Commented Jun 22, 2018 at 15:07
  • $\begingroup$ @Uwe I'm still not sure the 17 in the table in Wikipedia has any specific significance, so that might be a good place to start. So far, it looks like they are not actually in orbits who's periods are exact rational fractions times the sidereal day, otherwise the ground tracks would be repeating. $\endgroup$
    – uhoh
    Commented Jun 22, 2018 at 16:59
  • 2
    $\begingroup$ To see repeating ground tracks, you should look for a interval of 8, 9 or 10 sideral days, not only 72 hours. GPS ground tracks should repeat in 1 or 2 sideral days, about, but not exactly 24 or 48 hours. All satellites of a constellation may be to many for a plot, but a single one will give a better plot. $\endgroup$
    – Uwe
    Commented Jun 23, 2018 at 9:11
  • 1
    $\begingroup$ @Uwe you've actually solved my problem! Do you think you could post your comment as a short answer? In this case the answer is very simple so really a sentence or two is all that's needed. I can accept it, then add a supplementary answer with a calculation backing that up. $\endgroup$
    – uhoh
    Commented Nov 6, 2018 at 0:58

1 Answer 1


The GPS constellation wanted to be high enough where many of them could be seen, but not in Geostationary orbit, because it wasn't needed. Somewhat arbitrarily it was decided to set them up such that they orbit twice per sidereal day, as it is a good middle ground, not a lot of satellites in that area, and it is high enough to be useful.

When other nations wanted to set up their constellations, they wanted a point to start, but not be in exactly the same plane as GPS. The same repeating orbits seemed like a natural boundary point, and 17 was somewhat arbitrarily chosen as a numerator for the fractional orbit.

What this means is that for every 17 orbits of the satellite, 8, or 9, or 10 sidereal days will have passed on Earth. Repeating tracks seems like a useful thing to do, and there isn't any negative points, so it was decided. But really all that was critically important was to be in a slightly different plane than GPS, and somewhere in the middle orbit range.


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.