Distance
Runnable examples for great-circle distance calculations using the Distance endpoint. Covers single route measurements and multi-route comparisons for network planning.
| # | Question | Data used |
|---|---|---|
| 1 | Great-circle distance between two airports for route planning | Distance |
| 2 | Multi-route distance comparison: rank routes from EGLL by distance | Distance |
Requirements
x-api-key on every request (direct subscription). Learn more →Install
The scripts below use requests for API calls and rich for terminal output. Install once:
pip install requests rich1. Route distance between two airports
Question: What is the great-circle distance between KJFK and KLAX, and what is the initial bearing?
import os
import requests
from rich.console import Console
from rich.panel import Panel
from rich.table import Table
console = Console()
HEADERS = {
"X-RapidAPI-Key": os.getenv("RAPIDAPI_KEY", "YOUR_RAPIDAPI_KEY"),
"X-RapidAPI-Host": "skylink-api.p.rapidapi.com",
}
BASE = "https://skylink-api.p.rapidapi.com"
def fetch_distance(from_icao: str, to_icao: str) -> dict | None:
r = requests.get(
f"{BASE}/distance",
headers=HEADERS,
params={"from_icao": from_icao, "to_icao": to_icao},
timeout=(10, 15),
)
if r.status_code == 404:
return None
r.raise_for_status()
return r.json()
def main() -> None:
data = fetch_distance("KJFK", "KLAX")
if not data:
console.print("[yellow]No distance data returned.[/]")
return
table = Table(title="Route Distance")
table.add_column("Field", style="cyan", min_width=22)
table.add_column("Value")
table.add_row("Origin", data.get("from_airport_name", data.get("from_icao", "—")))
table.add_row("Destination", data.get("to_airport_name", data.get("to_icao", "—")))
table.add_row("Distance (nm)", f"{data.get('distance_nm', '—')} nm")
table.add_row("Distance (km)", f"{data.get('distance_km', '—')} km")
table.add_row("Distance (mi)", f"{data.get('distance_mi', '—')} mi")
table.add_row("Initial bearing", f"{data.get('bearing_deg', '—')}° true")
console.print(table)
console.print(Panel(
"Distance shown is great-circle (shortest path on a sphere). "
"Actual filed routes are typically longer due to airways, wind routing, and restricted airspace.",
title="Note",
style="dim",
))
if __name__ == "__main__":
main()Output: A table with origin and destination airport names, distance in nautical miles, kilometres, and statute miles, plus the initial true bearing. A note clarifies that great-circle distance differs from actual filed routes.
2. Multi-route distance ranking from EGLL
Question: Of four destinations from London Heathrow, which routes are shortest and longest?
Fetches all routes concurrently then sorts ascending by nautical miles.
import os
import concurrent.futures
import requests
from rich.console import Console
from rich.table import Table
console = Console()
HEADERS = {
"X-RapidAPI-Key": os.getenv("RAPIDAPI_KEY", "YOUR_RAPIDAPI_KEY"),
"X-RapidAPI-Host": "skylink-api.p.rapidapi.com",
}
BASE = "https://skylink-api.p.rapidapi.com"
ORIGIN = "EGLL"
DESTINATIONS: list[tuple[str, str]] = [
("KJFK", "New York"),
("OMDB", "Dubai"),
("YSSY", "Sydney"),
("RJTT", "Tokyo"),
]
def fetch_distance(from_icao: str, to_icao: str) -> dict | None:
r = requests.get(
f"{BASE}/distance",
headers=HEADERS,
params={"from_icao": from_icao, "to_icao": to_icao},
timeout=(10, 15),
)
if r.status_code == 404:
return None
r.raise_for_status()
return r.json()
def main() -> None:
results: list[tuple[str, str, dict]] = []
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as ex:
futures = {
ex.submit(fetch_distance, ORIGIN, icao): (icao, city)
for icao, city in DESTINATIONS
}
for fut, (icao, city) in futures.items():
data = fut.result()
if data:
results.append((icao, city, data))
results.sort(key=lambda x: x[2].get("distance_nm", float("inf")))
table = Table(title=f"Routes from {ORIGIN} — sorted by distance")
table.add_column("Destination", style="cyan")
table.add_column("City")
table.add_column("Distance (nm)", justify="right")
table.add_column("Distance (km)", justify="right")
table.add_column("Bearing", justify="right")
for icao, city, data in results:
table.add_row(
icao,
city,
str(data.get("distance_nm", "—")),
str(data.get("distance_km", "—")),
f"{data.get('bearing_deg', '—')}°",
)
console.print(table)
if __name__ == "__main__":
main()Output: A table of four routes from EGLL sorted by nautical miles ascending, showing destination ICAO, city name, distance in nm and km, and initial bearing.