Observed since 20 Oct, 20:47 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
A production-grade AI Aviation SDK for airport data, flight geometry, network intelligence, emissions, and passenger experience.
A production-grade AI Aviation SDK for airport data, flight geometry, network intelligence, emissions, and passenger experience.
aeronavx/core): data loaders, geodesy, routing, emissions, statisticsaeronavx/hf): semantic search, cache, offline inferenceaeronavx/cli) + FastAPI server (aeronavx/api)aeronavx/data): bundled OurAirports datasets for offline-first usepip install aeronavx
# Full data features (pandas, scipy, timezonefinder, rapidfuzz, requests)
pip install aeronavx[full]
# AI semantic search (HF)
pip install aeronavx[hf]
# API server
pip install aeronavx[api]
# Everything
pip install aeronavx[all]
Or from source:
git clone https://github.com/teyfikoz/AeroNavX.git
cd AeroNavX
pip install -e .
import aeronavx
# Get airports
ist = aeronavx.get_airport("IST")
jfk = aeronavx.get_airport("JFK")
# Calculate distance
dist_km = ist.distance_to(jfk)
print(f"Distance: {dist_km:.2f} km")
# Find nearest airports
nearest = aeronavx.nearest_airport(41.0, 29.0, n=5)
# Estimate emissions
co2 = aeronavx.estimate_co2_kg_for_segment("IST", "JFK")
print(f"CO2: {co2:.2f} kg per passenger")
import aeronavx as anx
results = anx.semantic_search("New York international", top_k=5)
# If pandas is installed, results is a DataFrame
print(results[["iata", "name", "municipality", "score"]])
import aeronavx as anx
ist = anx.get_airport("IST")
jfk = anx.get_airport("JFK")
jet_lag = anx.calculate_jet_lag(ist, jfk, age=35)
print(jet_lag.direction.value, jet_lag.severity.value, jet_lag.estimated_recovery_days)
import aeronavx as anx
hubs = anx.identify_global_hubs(top_n=5)
for hub in hubs:
print(hub.airport.iata_code, hub.hub_score)
import aeronavx as anx
emissions = anx.calculate_flight_emissions(
"IST", "JFK",
aircraft_type=anx.AircraftType.WIDE_BODY,
fuel_type=anx.FuelType.JET_A1,
load_factor=0.85,
)
print(emissions.total_co2_kg, emissions.co2_per_passenger_kg)
savings = anx.compare_saf_savings("IST", "JFK", saf_percentage=50)
print(savings.reduction_percentage)
import aeronavx as anx
route = anx.generate_route("IST", "JFK", num_waypoints=8)
print(route.total_distance_km, route.total_time_hours)
Set environment variables before import:
export HF_TOKEN="your_token"
export AERONAVX_CACHE="~/.aeronavx"
export AERONAVX_OFFLINE=1
export AERONAVX_EMBED_MODEL="sentence-transformers/all-MiniLM-L6-v2"
Offline mode uses cached models only; if the model is not cached, a clear error is raised.
Supported tokens:
HF_TOKENHF_API_TOKENHUGGINGFACE_HUB_TOKENfrom aeronavx.core import loader
# Load only major airports (large + medium with scheduled service)
major_airports = loader.load_airports(
include_types=['large_airport', 'medium_airport'],
scheduled_service_only=True
)
print(f"Major airports: {len(major_airports):,}") # ~3,200
# Load specific countries
us_airports = loader.load_airports(countries=['US'])
print(f"US airports: {len(us_airports):,}") # ~20,000
# Load airports with IATA codes only
iata_airports = loader.load_airports(has_iata_only=True)
print(f"IATA airports: {len(iata_airports):,}") # ~9,000
import aeronavx
# Get all runways for an airport
runways = aeronavx.get_runways_by_airport("KJFK")
for rwy in runways:
print(f"{rwy.designation}: {rwy.length_ft:.0f}ft, {rwy.surface}")
# Get the longest runway
longest = aeronavx.get_longest_runway("KJFK")
print(f"Longest: {longest.designation} - {longest.length_ft:.0f}ft")
# Get only paved runways
paved = aeronavx.get_paved_runways("KJFK")
print(f"Paved runways: {len(paved)}")
import aeronavx
# Global statistics
stats = aeronavx.get_global_stats()
print(f"Total airports: {stats.total_airports:,}")
print(f"Total runways: {stats.total_runways:,}")
print(f"Countries: {stats.countries_count}")
print(f"Longest runway: {stats.longest_runway_ft:,.0f} ft")
# Country statistics
us_stats = aeronavx.get_country_stats("US")
print(f"US has {us_stats.total_airports:,} airports")
print(f"Large airports: {us_stats.large_airports}")
print(f"Total runways: {us_stats.total_runways:,}")
# Continent statistics
eu_stats = aeronavx.get_continent_stats("EU")
print(f"Europe: {eu_stats.total_airports:,} airports")
print(f"Countries: {eu_stats.countries_count}")
# Top countries
top = aeronavx.get_top_countries_by_airports(5)
for country, count in top:
print(f"{country}: {count:,} airports")
# Calculate distance
aeronavx distance --from IST --to JFK --unit nmi
# Find nearest airports
aeronavx nearest --lat 41.0 --lon 29.0 --n 5
# Search by name
aeronavx search --name "Heathrow"
# Estimate emissions
aeronavx emissions --from IST --to LHR
# Flight time
aeronavx flight-time --from IST --to JFK
# Semantic search (HF)
aeronavx semantic-search --query "London Heathrow"
# Jet lag analysis
aeronavx jet-lag --from IST --to JFK --age 35
# Global hubs
aeronavx hubs --top-n 5
# Advanced emissions
aeronavx emissions-advanced --from IST --to JFK --aircraft-type wide_body --saf-percent 50
# Synthetic route
aeronavx synthetic-route --from IST --to JFK --waypoints 8
python -m aeronavx.api.server
Then access:
Set AERONAVX_API_KEY to enable API key authentication:
export AERONAVX_API_KEY="your-secret-key"
python -m aeronavx.api.server
Then include the key in requests:
curl -H "X-API-Key: your-secret-key" http://localhost:8000/airport/IST
The /health endpoint is always open. If AERONAVX_API_KEY is not set, all endpoints are open (backward compatible).
Built-in rate limiting defaults to 60 requests/minute per IP. Configure with:
export AERONAVX_RATE_LIMIT=120 # 120 req/min
The /health endpoint is exempt from rate limiting.
# Build and run
docker compose up -d
# With API key
AERONAVX_API_KEY=your-secret docker compose up -d
# Or build manually
docker build -t aeronavx .
docker run -p 8000:8000 -e AERONAVX_API_KEY=your-secret aeronavx
| Variable | Default | Description |
|---|---|---|
AERONAVX_API_KEY | (unset = open) | API key for endpoint authentication |
AERONAVX_RATE_LIMIT | 60 | Max requests per minute per IP |
AERONAVX_CACHE | ~/.aeronavx | Cache directory for HF models/embeddings |
AERONAVX_OFFLINE | 0 | Set to 1 for cache-only inference |
HF_TOKEN | — | Hugging Face API token |
AERONAVX_EMBED_MODEL | sentence-transformers/all-MiniLM-L6-v2 | Embedding model |
AeroNavX includes 84,000+ airports and 47,000+ runways from OurAirports, which provides:
Data Attribution: Airport and runway data from OurAirports (David Megginson et al.) - Licensed under MIT License
See examples/ directory for:
basic_distance.py: Distance calculationsnearest_airports.py: Finding nearby airportsrouting_example.py: Multi-segment routesemissions_example.py: CO2 estimationpytest
Run real-model semantic search tests (optional):
AERONAVX_RUN_REAL_MODEL_TESTS=1 pytest tests/test_semantic_search_real_model.py
Run the semantic search benchmark locally:
python benchmark_semantic_search.py --sample-size 2000
Latest benchmark outputs are included in PRODUCTION_READINESS_REPORT.md.
Required: Python >= 3.9
Optional:
pandas: DataFrame supportscipy: Faster spatial indexingrapidfuzz: Better fuzzy searchtimezonefinder: Timezone supportfastapi, uvicorn: API serverrequests: Weather datasentence-transformers, transformers, torch, datasets, huggingface_hub, accelerate: HF semantic searchfaiss-cpu (optional): ANN acceleration for semantic searchMIT License
Contributions welcome! Please open an issue or pull request.
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 3.2.0 | 6 Jun 2026 | 18 |
This describes our collected data; it is not a security assessment.
Observed since 20 Oct, 20:47 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:1ad199cd0686b906eeeed4642eddc8caef2c0e9d1bc4b30d1bb627910d94da26