Wednesday, 16 September 2026

Vanishing Horizon: The Maths of Longitude Convergence

HTML: Perplexity AI
September 16, 2026

This follows on a previous conversation here: AI composed python code I posted on Google Colab - code for geeks here - that was Young's famous (in basic & quantum physics) double-slit experiment, this is Nautical vs. Statute miles from an initial Great Circle distance calculation prompt. 

Warning: it's technical, you may prefer to skip straight to simple instructions at the bottom if you're interested.

This came from this comment:
Now you got my GIS brain engaged... doesn't that 1° graticule shrink from equator to pole, so 60mi. must be mid-lat. like Calgary to Pau? I lived in W Canada and country roads went NS & EW, so NS roads had correction lines (literally two 90° bends) to account for converging longitudes.

I have a crazy story around that: my ex managed So. Alta. for Canadian Institute for the Blind exactly 30 yrs. ago. She went around old folks' homes, offering visual aids & education. "No-one actually wakes up blind one morning" she quipped, "let me help you spot early signs and cope as independent folk you are" (paraphrasing from memory). So one day this little old lady comes up to her and says, "guess what, my husband won't admit he's blind and insists on driving his truck still... fortunately roads here are straight, but with double right-angle bends at correction lines! So I always sit shotgun and put my hand on his arm before those and we end up in a field... Thank God he drives slow and there's no traffic or RCMP out back where we are LOL". RCMP are local police, and funnily "outback" strung together is what Aussies call remote areas too!


AI composition starts here.

On a globe, not all degrees are created equal. A degree of latitude is almost constant in length everywhere, but a degree of longitude shrinks as you move from the equator toward the poles. That simple fact shapes everything from nautical miles to the “jogged” country roads of western Canada.

Why longitude shrinks

Imagine the Earth as a sphere. Lines of latitude run east–west and are parallel. Lines of longitude run north–south and all meet at the poles. Because meridians converge, the ground distance covered by 1° of longitude depends on latitude:

length of 1° longitude ∝ cos(latitude)

At the equator, cos(0°) = 1, so 1° of longitude is about the same length as 1° of latitude. At higher latitudes, the cosine drops, and so does the east–west scale. By the time you reach the poles, cos(90°) = 0, and all meridians collapse to a point.

Numbers on the ground

Using a mean Earth radius, 1° of latitude is roughly 69.09 statute miles everywhere. For longitude, multiply by cos(latitude):

Location Latitude 1° latitude (mi.) 1° longitude (mi.)
Equator 0.00° N 69.09 69.09
Pau, France 43.30° N 69.09 50.29
Calgary, Canada 51.04° N 69.09 43.44
Arctic Circle 66.50° N 69.09 27.55

Table: How 1° of longitude shrinks with latitude, while 1° of latitude stays essentially constant.

So between Pau and Calgary, an east–west degree is already down to 38–44 nautical miles instead of 60. That’s not a mapping artifact; it’s the geometry of a sphere.

From spheres to survey lines

This convergence isn’t just theory. In western Canada, the Dominion Land Survey laid out townships and ranges on a rectangular grid. On paper, the grid is square. On the ground, however, meridians converge, so if you kept going north with perfectly straight north–south lines, your east–west distances would get progressively too small.

The solution: correction lines. Every so often, surveyors introduced a “jog” in the north–south roads—two sharp 90° bends—to realign the grid and keep section areas sane. Those kinks you remember driving are the physical expression of longitude convergence.

In other words: the map wants to be rectangular; the Earth insists on being round. Correction lines are the compromise.

A quick interactive model

To play with the numbers yourself, you can use a small Python script in Google Colab. The notebook below:

  • Computes 1° of latitude and longitude at any latitude
  • Shows ground distances for a Δlat × Δlon box
  • Estimates how far north you can go before convergence error across a given width reaches a chosen tolerance (a simple correction-line model)

Paste this into a single Colab cell and run it:

import math
import ipywidgets as widgets
from IPython.display import display, Markdown
import matplotlib.pyplot as plt
import numpy as np

# Constants (mean Earth radius)
R_nmi = 3440.065
R_km = 6371.0
R_mi = 3958.8
FEET_PER_MI = 5280.0

def degree_lengths(lat_deg):
    lat_rad = math.radians(lat_deg)
    dlat_rad = math.radians(1.0)
    dlon_rad = math.radians(1.0)
    
    lat_nmi = R_nmi * dlat_rad
    lat_km = R_km * dlat_rad
    lat_mi = R_mi * dlat_rad
    
    lon_nmi = R_nmi * dlon_rad * math.cos(lat_rad)
    lon_km = R_km * dlon_rad * math.cos(lat_rad)
    lon_mi = R_mi * dlon_rad * math.cos(lat_rad)
    
    return {
        "lat_nmi": lat_nmi, "lat_km": lat_km, "lat_mi": lat_mi,
        "lon_nmi": lon_nmi, "lon_km": lon_km, "lon_mi": lon_mi,
    }

def correction_spacing(lat_base_deg, width_mi, tol_ft):
    lat0 = math.radians(lat_base_deg)
    cos0 = math.cos(lat0)
    tol_mi = tol_ft / FEET_PER_MI
    target_cos = cos0 - tol_mi / width_mi
    if target_cos <= 0:
        return None
    lat1 = math.acos(target_cos)
    delta_rad = lat1 - lat0
    if delta_rad <= 0:
        return None
    delta_deg = math.degrees(delta_rad)
    d = degree_lengths(lat_base_deg)
    delta_lat_mi = d["lat_mi"] * delta_deg
    return {
        "lat_base": lat_base_deg,
        "width_mi": width_mi,
        "tol_ft": tol_ft,
        "delta_lat_deg": delta_deg,
        "delta_lat_mi": delta_lat_mi,
        "lat_top_deg": lat_base_deg + delta_deg,
    }

def update_geo(lat, dlat_deg, dlon_deg):
    d = degree_lengths(lat)
    ratio = d["lon_nmi"] / d["lat_nmi"]
    
    dist_lat_nmi = d["lat_nmi"] * dlat_deg
    dist_lat_km = d["lat_km"] * dlat_deg
    dist_lat_mi = d["lat_mi"] * dlat_deg
    
    dist_lon_nmi = d["lon_nmi"] * dlon_deg
    dist_lon_km = d["lon_km"] * dlon_deg
    dist_lon_mi = d["lon_mi"] * dlon_deg
    
    diag_nmi = math.hypot(dist_lat_nmi, dist_lon_nmi)
    diag_km = math.hypot(dist_lat_km, dist_lon_km)
    diag_mi = math.hypot(dist_lat_mi, dist_lon_mi)
    
    text = f"""### At latitude {lat:.2f} °N

- **1 ° of latitude**: {d['lat_nmi']:.3f} nmi | {d['lat_km']:.3f} km | {d['lat_mi']:.3f} mi  
- **1 ° of longitude**: {d['lon_nmi']:.3f} nmi | {d['lon_km']:.3f} km | {d['lon_mi']:.3f} mi  
- **Shrinkage ratio


AI composition ends here.

Try it out yourself, it's simple really:


Voilà... propeller-heads rejoice!




No comments:

Post a Comment