Skip to article frontmatterSkip to article content

Great Circle Terminology

https://www.jpl.nasa.gov/edu/news/2022/12/8/nasa-mission-takes-a-deep-dive-into-earths-surface-water/ Image credit: NASA/JPL-Caltech

Great Circle Terminology


Overview

Great circles are powerful tools used in the navigation of ships and planes as well as in geoscience for working with remote sensing via satellites. Great circle mathematics make use of spherical geometry, where, rather than lines, shapes on a sphere are formed by the intersection of arcs along the curved surface.

While spherical geometry played an important role historically in the fields of astronomy and navigation, its teaching has largely fallen out of favor since the 1950’s making finding comphrenshive resources difficult.

This notebook will cover the important and unique terminology used when working with Great Circles and spherical geometry.

  1. Spherical Geometry
  2. Great Circles
  3. Ellipsoids vs. Spheres
  4. Geodesy
  5. A Note on Resources

Prerequisites

  • Time to learn: 20 minutes

Spherical Geometry

Spherical Trigonometry

Spherical geometry (and one of it important branches: spherical trigonometry) provide solutions for relationshsips between the sides and angles on a sphere that are commonly used in right-angled triangles. Spheres are unique since unlike triangles, spheres have internal angles that add up to more than 180 degrees.

The sum of the angles of a spherical triangle is not equal to 180°. A sphere is a curved surface, but locally the laws of the flat (planar) Euclidean geometry are good approximations. In a small triangle on the face of the earth, the sum of the angles is only slightly more than 180 degrees

Wikipedia: Spherical geometry

Great Circle USGS

Law of Cosines

“The cosine rule is the fundamental identity of spherical trigonometry: all other identities, including the sine rule, may be derived from the cosine rule” (Wikiepedia)

The law of cosines states that for the angles A, B, C and opposite sides a, b, c:

cos(a)=cos(b)cos(c)+sin(b)sin(c)cos(A)cos(a) = cos(b)cos(c) + sin(b)sin(c)cos(A)
cos(b)=cos(c)cos(a)+sin(c)sin(a)cos(B)cos(b) = cos(c)cos(a) + sin(c)sin(a)cos(B)
cos(c)=cos(a)cos(b)+sin(a)sin(b)cos(C)cos(c) = cos(a)cos(b) + sin(a)sin(b)cos(C)

Law of Sines

The spherical law of sines states that for the angles A, B, and C and the opposite of the sides a, b, c:

sin(A)sin(a)=sin(B)sin(b)=sin(C)sin(c)\frac{sin(A)}{sin(a)} = \frac{sin(B)}{sin(b)} = \frac{sin(C)}{sin(c)}

Great Circles

Great Circle Path vs. Great Circle Arc

A great circle is the largest circle that can be formed on the surface of a sphere. A great circle is created by the intersection of a plane that also passes through the center of the sphere.

All great circles:

  • Intersect the center of the Earth
  • Divide the Earth in half
  • Represent the shortest distance between any two points on the surface of the Earth

For example, the equator is an example of a great circle. The equator can be imagined as the path formed by a plane cutting through the center of the planet and intersecting the center.

A great circle path is a closed path (-180 to 180 degrees longitude) that forms around the entire planet. A great circle path can be defined by a shorter great circle arc which can be formed by:

  • At least two points
  • One point, a bearing, and a distance

Ellipsoids vs. Spheres

The earth is not round, instead it is an irregular ellipsoid known as a an oblate spheroid where the poles are slightly flatter. Spherical trigonometry uses a unit sphere, so working on Earth and without additional corrections, the measurements will contain up to 0.3% (22 km) when assuming the Earth is a perfect sphere (see more).

To account for the errors when assuming the Earth is a sphere, there are various geodetic systems and ellipsoids to include in calculations.

Geodesic and Python

For the purpose of this notebook we will be taking advantage of two geodesic Python packages:

pyproj and geopy both take advantage of different types of (optional) ellipsoids:

import pyproj
for key in pyproj.list.get_ellps_map().keys():
    print(f"{key} = {pyproj.list.get_ellps_map()[key]}")
MERIT = {'a': 6378137.0, 'rf': 298.257, 'description': 'MERIT 1983'}
SGS85 = {'a': 6378136.0, 'rf': 298.257, 'description': 'Soviet Geodetic System 85'}
GRS80 = {'a': 6378137.0, 'rf': 298.257222101, 'description': 'GRS 1980(IUGG, 1980)'}
IAU76 = {'a': 6378140.0, 'rf': 298.257, 'description': 'IAU 1976'}
airy = {'a': 6377563.396, 'rf': 299.3249646, 'description': 'Airy 1830'}
APL4.9 = {'a': 6378137.0, 'rf': 298.25, 'description': 'Appl. Physics. 1965'}
NWL9D = {'a': 6378145.0, 'rf': 298.25, 'description': 'Naval Weapons Lab., 1965'}
mod_airy = {'a': 6377340.189, 'b': 6356034.446, 'description': 'Modified Airy'}
andrae = {'a': 6377104.43, 'rf': 300.0, 'description': 'Andrae 1876 (Den., Iclnd.)'}
danish = {'a': 6377019.2563, 'rf': 300.0, 'description': 'Andrae 1876 (Denmark, Iceland)'}
aust_SA = {'a': 6378160.0, 'rf': 298.25, 'description': 'Australian Natl & S. Amer. 1969'}
GRS67 = {'a': 6378160.0, 'rf': 298.247167427, 'description': 'GRS 67(IUGG 1967)'}
GSK2011 = {'a': 6378136.5, 'rf': 298.2564151, 'description': 'GSK-2011'}
bessel = {'a': 6377397.155, 'rf': 299.1528128, 'description': 'Bessel 1841'}
bess_nam = {'a': 6377483.865, 'rf': 299.1528128, 'description': 'Bessel 1841 (Namibia)'}
clrk66 = {'a': 6378206.4, 'b': 6356583.8, 'description': 'Clarke 1866'}
clrk80 = {'a': 6378249.145, 'rf': 293.4663, 'description': 'Clarke 1880 mod.'}
clrk80ign = {'a': 6378249.2, 'rf': 293.4660212936269, 'description': 'Clarke 1880 (IGN).'}
CPM = {'a': 6375738.7, 'rf': 334.29, 'description': 'Comm. des Poids et Mesures 1799'}
delmbr = {'a': 6376428.0, 'rf': 311.5, 'description': 'Delambre 1810 (Belgium)'}
engelis = {'a': 6378136.05, 'rf': 298.2566, 'description': 'Engelis 1985'}
evrst30 = {'a': 6377276.345, 'rf': 300.8017, 'description': 'Everest 1830'}
evrst48 = {'a': 6377304.063, 'rf': 300.8017, 'description': 'Everest 1948'}
evrst56 = {'a': 6377301.243, 'rf': 300.8017, 'description': 'Everest 1956'}
evrst69 = {'a': 6377295.664, 'rf': 300.8017, 'description': 'Everest 1969'}
evrstSS = {'a': 6377298.556, 'rf': 300.8017, 'description': 'Everest (Sabah & Sarawak)'}
fschr60 = {'a': 6378166.0, 'rf': 298.3, 'description': 'Fischer (Mercury Datum) 1960'}
fschr60m = {'a': 6378155.0, 'rf': 298.3, 'description': 'Modified Fischer 1960'}
fschr68 = {'a': 6378150.0, 'rf': 298.3, 'description': 'Fischer 1968'}
helmert = {'a': 6378200.0, 'rf': 298.3, 'description': 'Helmert 1906'}
hough = {'a': 6378270.0, 'rf': 297.0, 'description': 'Hough'}
intl = {'a': 6378388.0, 'rf': 297.0, 'description': 'International 1924 (Hayford 1909, 1910)'}
krass = {'a': 6378245.0, 'rf': 298.3, 'description': 'Krassovsky, 1942'}
kaula = {'a': 6378163.0, 'rf': 298.24, 'description': 'Kaula 1961'}
lerch = {'a': 6378139.0, 'rf': 298.257, 'description': 'Lerch 1979'}
mprts = {'a': 6397300.0, 'rf': 191.0, 'description': 'Maupertius 1738'}
new_intl = {'a': 6378157.5, 'b': 6356772.2, 'description': 'New International 1967'}
plessis = {'a': 6376523.0, 'b': 6355863.0, 'description': 'Plessis 1817 (France)'}
PZ90 = {'a': 6378136.0, 'rf': 298.25784, 'description': 'PZ-90'}
SEasia = {'a': 6378155.0, 'b': 6356773.3205, 'description': 'Southeast Asia'}
walbeck = {'a': 6376896.0, 'b': 6355834.8467, 'description': 'Walbeck'}
WGS60 = {'a': 6378165.0, 'rf': 298.3, 'description': 'WGS 60'}
WGS66 = {'a': 6378145.0, 'rf': 298.25, 'description': 'WGS 66'}
WGS72 = {'a': 6378135.0, 'rf': 298.26, 'description': 'WGS 72'}
WGS84 = {'a': 6378137.0, 'rf': 298.257223563, 'description': 'WGS 84'}
sphere = {'a': 6370997.0, 'b': 6370997.0, 'description': 'Normal Sphere (r=6370997)'}
from geopy import distance
for key in distance.ELLIPSOIDS.keys():
    print(f"{key} = {distance.ELLIPSOIDS[key]}")
WGS-84 = (6378.137, 6356.7523142, 0.0033528106647474805)
GRS-80 = (6378.137, 6356.7523141, 0.003352810681182319)
Airy (1830) = (6377.563396, 6356.256909, 0.0033408506414970775)
Intl 1924 = (6378.388, 6356.911946, 0.003367003367003367)
Clarke (1880) = (6378.249145, 6356.51486955, 0.003407561378699334)
GRS-67 = (6378.16, 6356.774719, 0.003352891869237217)

The standard reference ellipsoid for working with Earth is WGS-84

geopy by default makes use of WGS-84 which is a a unified global ellipsoid model that is used for GPS collected from satellites to calculate extremely preise measurements of the Earth. For the purpose of this notebook, this is the ellipsoid model we will be working with.

print(pyproj.list.get_ellps_map()["WGS84"])
print(distance.ELLIPSOIDS["WGS-84"])
{'a': 6378137.0, 'rf': 298.257223563, 'description': 'WGS 84'}
(6378.137, 6356.7523142, 0.0033528106647474805)

WGS-84 is an ellipsoid with a semi-major axis of 6378137.0 meters, an inverse flattening feature of 298.257223563, and a flattening factor of 0.0033528106647474805.

Learn more!

Geodesy

Geodesy is the complex science of measuring the Earth’s geometric shape.

Learn more!

Geodesic

A geodesic is the shortest curved path between any two points on a surface. A “straight line” on the surface of a curved surface like a sphere form an arc

If an insect is placed on a surface and continually walks “forward”, by definition it will trace out a geodesic

Wikipedia - Geodesic

Straight Line on a curved surface

This is especially apparent when working with satellite data where the apparent “straight path” that a satellite will trace across the the surface of a planet.

An Important Note on Resources

Spherical geometry and resources associated with working with great circles can be difficult to find

Here are a list of some for working mathematically with great circles:


Summary

A great circle is formed by a plane intersecting a sphere and the center, like the equator.

Great circles make use of spherical geometry to measure features on the curved surface of a unit sphere. However, planets like Earth are not perfect spheres and to account for the error are combined with geodesic calculations to reduce the error in final calculations.

What’s next?

Coordinates and Great Circles