Rhumb Line vs Great Circle Explained
On this page
Problem statement
There are two natural ways to travel between two points on the Earth. A great circle is the shortest path, but its compass heading changes continuously. A rhumb line, or loxodrome, keeps one compass heading the whole way, which is easy to steer, but it is longer, sometimes much longer. On a Mercator map the rhumb line is straight and the great circle curves towards the pole, which is why flight routes look bent and why the shortest path rarely looks like it on a web map.
This page explains both paths with numbers from real airport pairs in OurAirports: it computes great-circle distances on the WGS84 ellipsoid and rhumb-line distances with the loxodrome formula, measures how much longer the rhumb line is for routes of different lengths and directions, and shows the constant heading of one against the changing heading of the other.
Quick answer
The great circle is always the shorter path; the difference grows with distance and with latitude, and vanishes for routes along a meridian or the equator:
for a, z in (("LHR", "JFK"), ("JFK", "NRT"), ("SYD", "SCL"), ("GRU", "LOS"), ("NBO", "BOM")):
A, Z = AP.loc[a], AP.loc[z]
gc = geod.inv(A.longitude_deg, A.latitude_deg, Z.longitude_deg, Z.latitude_deg)[2] / 1000
rl, hdg = rhumb(A.latitude_deg, A.longitude_deg, Z.latitude_deg, Z.longitude_deg)
print(f"{a}-{z}: great circle {gc:7,.0f} km; rhumb line {rl:7,.0f} km at {hdg:5.1f}°; {(rl / gc - 1) * 100:5.1f}% longer")
LHR-JFK: great circle 5,555 km; rhumb line 5,758 km at 257.9°; 3.7% longer
JFK-NRT: great circle 10,854 km; rhumb line 12,746 km at 267.6°; 17.4% longer
SYD-SCL: great circle 11,363 km; rhumb line 12,774 km at 89.7°; 12.4% longer
GRU-LOS: great circle 6,348 km; rhumb line 6,357 km at 58.3°; 0.1% longer
NBO-BOM: great circle 4,531 km; rhumb line 4,535 km at 60.0°; 0.1% longer
London to New York by rhumb line, steering 257.9° all the way, is 3.7% longer than the great circle. New York to Tokyo is 17.4% longer and Sydney to Santiago 12.4%: long east-west routes at high or middle latitudes. São Paulo to Lagos and Nairobi to Mumbai, which cross the tropics, differ by only 0.1%.
The loxodrome, how much longer, headings along each path
1. The loxodrome formula
A rhumb line crosses every meridian at the same angle. Its length follows from the difference in latitude and the "stretched" latitude difference of the Mercator projection:
import inspect
print(inspect.getsource(rhumb))
print(f"JFK to LHR rhumb heading: {rhumb(AP.loc['JFK'].latitude_deg, AP.loc['JFK'].longitude_deg, AP.loc['LHR'].latitude_deg, AP.loc['LHR'].longitude_deg)[1]:.1f}° the whole way")
def rhumb(lat1, lon1, lat2, lon2, r=6371.0088):
"""Rhumb-line distance (km) and constant heading (degrees) on a sphere."""
p1, p2 = np.radians(lat1), np.radians(lat2)
dl = np.radians((np.asarray(lon2) - np.asarray(lon1) + 540) % 360 - 180) # shorter way round in longitude
dpsi = np.log(np.tan(np.pi / 4 + p2 / 2) / np.tan(np.pi / 4 + p1 / 2))
q = np.where(np.abs(dpsi) > 1e-12, (p2 - p1) / np.where(np.abs(dpsi) > 1e-12, dpsi, 1), np.cos(p1))
dist = np.hypot(p2 - p1, q * dl) * r
heading = (np.degrees(np.arctan2(dl, dpsi)) + 360) % 360
return dist, heading
JFK to LHR rhumb heading: 77.9° the whole way
The function computes the Mercator-stretched latitude difference dpsi, from which the constant heading follows, and the distance along the rhumb line. From JFK to Heathrow the rhumb heading is 77.9°, east-north-east, held the whole way.
2. How much longer, in general
Compute both distances for 20,000 random pairs of airports and summarise the excess by great-circle distance:
rng = np.random.default_rng(5)
i, j = rng.integers(0, len(AP), (2, 20000))
a, z = AP.iloc[i], AP.iloc[j]
gc = geod.inv(a.longitude_deg.values, a.latitude_deg.values, z.longitude_deg.values, z.latitude_deg.values)[2] / 1000
rl = rhumb(a.latitude_deg.values, a.longitude_deg.values, z.latitude_deg.values, z.longitude_deg.values)[0]
ok = gc > 10
ex = (rl[ok] / gc[ok] - 1) * 100
print(pd.Series(ex).groupby(pd.cut(gc[ok], [0, 1000, 3000, 6000, 10000, 20100])).agg(["size", "median", "max"]).round(1).to_string())
size median max
(0, 1000] 569 -0.1 0.6
(1000, 3000] 2448 0.1 1.7
(3000, 6000] 4107 0.4 18.1
(6000, 10000] 6401 2.3 43.0
(10000, 20100] 6459 4.4 39.1
For routes under 1,000 km the two paths differ by almost nothing; the small negative median is the difference between the spherical rhumb formula and the ellipsoidal geodesic, not a real effect. The excess grows with distance: a median of 2.3% at 6,000 to 10,000 km and 4.4% beyond, with individual routes up to 43% longer.
3. The heading along each path
Sample the great circle from JFK to Narita and compute the heading at each point; the rhumb line holds one heading:
J, N = AP.loc["JFK"], AP.loc["NRT"]
pts = np.array(geod.npts(J.longitude_deg, J.latitude_deg, N.longitude_deg, N.latitude_deg, 10))
lons = np.r_[J.longitude_deg, pts[:, 0], N.longitude_deg]; lats = np.r_[J.latitude_deg, pts[:, 1], N.latitude_deg]
hd = geod.inv(lons[:-1], lats[:-1], lons[1:], lats[1:])[0] % 360
print("great-circle heading every ~1,000 km:", np.round(hd).astype(int).tolist())
print(f"rhumb line heading: {rhumb(J.latitude_deg, J.longitude_deg, N.latitude_deg, N.longitude_deg)[1]:.0f}° throughout")
great-circle heading every ~1,000 km: [333, 328, 322, 312, 296, 275, 252, 233, 221, 214, 209]
rhumb line heading: 268° throughout
Following the great circle from JFK to Narita, the heading turns from 333°, north-north-west, through due west over Alaska, to 209°, south-south-west, on arrival: 124° of turning. The rhumb line heads 268°, almost due west, the whole way, and is 1,892 km longer.
The worst case among real routes
The data used on this page
Coordinates of the large airports with an IATA code in OurAirports, a public-domain database. Great-circle distances are geodesics on WGS84 from pyproj.Geod; rhumb lines use the spherical loxodrome formula with the mean Earth radius, which for comparison is accurate to a few tenths of a percent.
from pathlib import Path
import numpy as np
import pandas as pd
import requests
from pyproj import Geod
Path("data").mkdir(exist_ok=True)
p = Path("data/airports.csv")
if not p.exists():
r = requests.get("https://davidmegginson.github.io/ourairports-data/airports.csv", timeout=300)
r.raise_for_status()
p.write_bytes(r.content)
AP = pd.read_csv(p, keep_default_na=False, na_values=[""])
AP = AP[(AP.type == "large_airport") & AP.iata_code.notna()].set_index("iata_code")
geod = Geod(ellps="WGS84")
def rhumb(lat1, lon1, lat2, lon2, r=6371.0088):
"""Rhumb-line distance (km) and constant heading (degrees) on a sphere."""
p1, p2 = np.radians(lat1), np.radians(lat2)
dl = np.radians((np.asarray(lon2) - np.asarray(lon1) + 540) % 360 - 180) # shorter way round in longitude
dpsi = np.log(np.tan(np.pi / 4 + p2 / 2) / np.tan(np.pi / 4 + p1 / 2))
q = np.where(np.abs(dpsi) > 1e-12, (p2 - p1) / np.where(np.abs(dpsi) > 1e-12, dpsi, 1), np.cos(p1))
dist = np.hypot(p2 - p1, q * dl) * r
heading = (np.degrees(np.arctan2(dl, dpsi)) + 360) % 360
return dist, heading
print(f"{len(AP):,} large airports")
1,172 large airports
The data has 1,172 large airports with an IATA code.
Example 1: the worst case among real routes
Find the pair of large airports whose rhumb line is longest relative to the great circle:
k = np.argmax(np.where(ok, rl / np.where(ok, gc, 1), 0))
print(f"{a.index[k]} ({a.municipality.iloc[k]}) to {z.index[k]} ({z.municipality.iloc[k]}): great circle {gc[k]:,.0f} km, rhumb {rl[k]:,.0f} km, {(rl[k] / gc[k] - 1) * 100:.0f}% longer")
KJA (Krasnoyarsk) to ORD (Chicago): great circle 9,126 km, rhumb 13,055 km, 43% longer
Among the random pairs, Krasnoyarsk to Chicago has the largest excess: 9,126 km by the great circle, which runs over the Arctic, against 13,055 km by the rhumb line, 43% longer.
Shortest paths and constant headings
A great circle lies in a plane through the Earth's centre, and the arc of it between two points is the shortest path on the surface; on the ellipsoid its equivalent is the geodesic. Because meridians converge towards the poles, a great circle crosses each meridian at a different angle, so a navigator following it must keep changing heading. A rhumb line takes the opposite compromise: it crosses every meridian at the same angle, so one compass heading suffices, but at the cost of extra distance. Followed far enough it spirals towards the pole.
The Mercator projection was designed so that rhumb lines are straight, which made it the sailor's chart for centuries: draw a straight line, read the angle, steer it. The same property makes great circles look curved on Mercator and on the web maps built on it. The difference matters most for long east-west routes at high latitudes, where the great circle can save hundreds or thousands of kilometres by bowing towards the pole; along meridians and the equator the two paths are the same.
The shorter way round and navigation practice
- Shorter way round: a rhumb line between two longitudes can go either way round the world; the formula above takes the shorter longitude difference.
- Near-polar points: rhumb lines through the polar regions become very long and numerically sensitive.
- Ellipsoid: the rhumb formula above is spherical; ellipsoidal loxodromes differ by a fraction of a percent.
- Navigation practice: long-distance navigators approximate a great circle by a series of short rhumb lines.
Internal links
- How to find the midpoint and great-circle path between two coordinates in Python — drawing great circles
- How to calculate the bearing between two coordinates in Python — the changing heading
- Latitude and longitude explained — why meridians converge
FAQ
What is the difference between a great circle and a rhumb line?
A great circle is the shortest path between two points on a sphere, with a changing heading; a rhumb line keeps a constant compass heading and is longer.
Why do flight paths curve on maps?
Planes follow approximately great circles, which appear curved on Mercator-based web maps, where only rhumb lines are straight.
How much longer is a rhumb line?
It depends on the route: for most pairs of large airports a few percent, but for long east-west routes at high latitudes much more; step 2 summarises it by distance.
Is a straight line on a map a rhumb line?
On a Mercator map, yes; on other projections a straight line is generally neither path.