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%.

World map of three routes as great circles, solid, and rhumb lines, dashed: London to New York, New York to Tokyo, whose great circle arcs over Alaska while the rhumb line runs nearly due west, and Sydney to Santiago, whose great circle dips towards Antarctica. World map of three routes as great circles, solid, and rhumb lines, dashed: London to New York, New York to Tokyo, whose great circle arcs over Alaska while the rhumb line runs nearly due west, and Sydney to Santiago, whose great circle dips towards Antarctica.
Two paths on the map.

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.

Extra distance of the rhumb line over the great circle for five routes. rhumb line longer than the great circle byJFK-NRT17.4%SYD-SCL12.4%LHR-JFK3.7%GRU-LOS0.1%NBO-BOM0.1%05%10%15%20%Worst random pair: Krasnoyarsk-Chicago, 43% spatialworkflow.io
Extra distance by route.

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.

Scatter of the rhumb line's extra distance against great-circle distance for 20,000 random airport pairs, coloured by mean latitude: near zero for short routes and low latitudes, rising to over 40 percent for routes of 8,000 to 10,000 kilometres at high latitudes. Scatter of the rhumb line's extra distance against great-circle distance for 20,000 random airport pairs, coloured by mean latitude: near zero for short routes and low latitudes, rising to over 40 percent for routes of 8,000 to 10,000 kilometres at high latitudes.
Extra distance in general.

Shortest paths and constant headings

Great circle and rhumb line compared. two ways between two pointsgreat circleshortest pathheading changesJFK-NRT: 333° to 209°straight on a gnomonic maprhumb lineconstant headinglongerJFK-NRT: 268° throughoutstraight on MercatorJFK-NRT: 10,854 km against 12,746 km spatialworkflow.io
Two ways between two points.

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

Choosing between a great circle and a rhumb line. which path?distance or bearing?great circle for distancelong east-west routerhumb much longernear the equator or a meridiannearly identicalshorter way roundwrap longitude differencewhat the map showsMercator straight = rhumb20,000 random pairs of large airports spatialworkflow.io
Which path?
  • 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.

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.