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!
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
- go to https://colab.research.google.com/
- copy & paste the code from my Colab folder here
- press " > Run all " and wait a little
- page down to see the sliders c/w instructions
No comments:
Post a Comment