Distance

Runnable examples for great-circle distance calculations using the Distance endpoint. Covers single route measurements and multi-route comparisons for network planning.

#QuestionData used
1Great-circle distance between two airports for route planningDistance
2Multi-route distance comparison: rank routes from EGLL by distanceDistance

Requirements

Auth
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 rich

1. 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", "—"))
    table.add_row("Destination", data.get("to", "—"))
    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.