Euro AIP: European Aeronautical Information Library & Explorer
Euro AIP is a comprehensive Python library and web application for exploring, processing, and analyzing European airport and AIP (Aeronautical Information Publication) data.
Version: 2.0 - Modern API with queryable collections, transactions, and Pythonic operations
1. euro_aip Python Library
Overview
The euro_aip library provides:
- Modern Query API: Fluent, chainable collections for powerful data queries
- Builder API: Transaction-safe model building with bulk operations
- Data Models: Rich Python classes for airports, runways, procedures, and AIP entries
- Parsers: Tools to extract and standardize AIP data from various European sources
- Data Sources: Integrations for WorldAirports, Autorouter, and more
- Utilities: Geographic calculations, field standardization, fuzzy matching, and more
Key Features (v2.0)
- 🔍 Queryable Collections - LINQ-style queries with method chaining
- 📖 Dict-Style Access - Natural lookups:
airports['EGLL'] - 🔧 Set Operations - Combine queries with
|,&,-operators - 💾 Transactions - Atomic updates with automatic rollback
- ⚡ Bulk Operations - High-performance batch processing
- 🏗️ Builder Pattern - Fluent API for constructing airports
- 🛂 Border Formalities - Schengen / EU-customs membership + crossing-requirements helper
- 🔄 Full Backward Compatibility - Legacy API still supported
What Can You Use It For?
- Programmatic access to a unified, standardized database of European airports and procedures
- Complex queries with intuitive, chainable syntax
- Safe model updates with transaction support
- High-performance data loading with bulk operations
- Custom data analysis: Build your own scripts to analyze, filter, or export aviation data
- Integration: Use as a backend for your own aviation tools or research
Quick Examples
Query API - Finding Airports
from euro_aip.models import EuroAipModel
from euro_aip.storage import DatabaseStorage
# Load the model
storage = DatabaseStorage('airports.db')
model = storage.load_model()
# Dict-style lookup (fastest for known ICAO)
heathrow = model.airports['EGLL']
print(f"{heathrow.name} - {heathrow.elevation_ft}ft")
# Filter by country
french_airports = model.airports.by_country("FR").all()
# Complex filtering with method chaining
suitable = model.airports \
.by_country("FR") \
.with_hard_runway() \
.with_min_runway_length(3000) \
.with_fuel(avgas=True, jet_a=True) \
.all()
# Set operations for OR logic
western_europe = (
model.airports.by_country("FR") |
model.airports.by_country("DE") |
model.airports.by_country("BE")
)
# Check existence
if 'LFPG' in model.airports:
cdg = model.airports['LFPG']
Builder API - Modifying Data
# Bulk operations (high performance)
airports_to_add = [...] # List of Airport objects
result = model.bulk_add_airports(
airports_to_add,
merge="update_existing",
update_derived=True
)
print(f"Added {result['added']}, updated {result['updated']}")
# Transaction API (atomic updates)
with model.transaction() as txn:
txn.add_airport(airport)
txn.bulk_add_procedures(procedures)
# Automatic rollback on error
# Builder pattern (fluent API)
airport = model.airport_builder("EGLL") \
.with_basic_info(
name="London Heathrow",
latitude_deg=51.4706,
longitude_deg=-0.4619
) \
.with_runways(runways) \
.commit()
Border Formalities - Crossing Requirements
from euro_aip.borders import crossing_requirements, is_schengen
# What border formalities apply for a France -> Switzerland flight?
req = crossing_requirements("FR", "CH")
print(req.immigration_required) # False (both Schengen)
print(req.customs_required) # True (CH is outside the EU customs union)
# A country in neither bloc (e.g. GB after Brexit) reads as a full border
req = crossing_requirements("FR", "GB")
print(req.immigration_required, req.customs_required) # True True
# Derived airport convenience properties (from iso_country)
model.airports['LSGG'].is_schengen # True
model.airports['LSGG'].is_eu_customs_union # False
Documentation
Full documentation available in designs/:
- Quick Start Guide - Get started in 5 minutes
- Query API Documentation - Complete query reference
- Builder API Guide - Building and modifying data
- Border Formalities - Schengen / EU-customs membership & crossing requirements
- Migration Guide - Upgrading from legacy API
2. Example Scripts
The example/ directory contains ready-to-use scripts for common tasks:
- aipexport.py: Export AIP data to various formats (JSON, CSV, etc.)
- bordercrossingexport.py: Export and analyze border crossing airport data
- foreflight.py: Example for exporting data compatible with ForeFlight
- test_*.py: Example and test scripts for validating data and demonstrating usage
Each script includes usage instructions in the file or via --help.
3. Euro AIP Web App
A modern web application for interactive exploration of European airports and AIP data.
Live Demo: The web app is available at https://maps.flyfun.aero
Database Download: The underlying database generated by this library is available for download at https://flyfun.aero/data/airports.db
Features
- Interactive Map: Explore airports visually with Leaflet.js
- Advanced Filtering: Filter by country (full names, UK/EU priority), runway, AIP fields, and more
- AIP Filter Presets: Quick filters for AVGAS, Jet A, Customs, etc., plus custom field filtering
- Route-Based Search: Find airports near a user-defined route
- Border Crossing Points: Specialized data and filters
- Statistics and Charts: Visual analytics with Chart.js
- Modern UI: Responsive layout (Bootstrap 5), Font Awesome icons, scrollable panels, always-visible legend
Quick Start
- Clone the repository
- Install dependencies:
pip install -r requirements.txt - Run the server:
cd web/server && python main.py - Open http://localhost:8000 in your browser
API Endpoints
GET /api/airports/- List airports with filtering (country, max_airports, AIP field, etc.)GET /api/airports/{icao}- Get detailed airport informationGET /api/airports/route-search- Find airports near a routeGET /api/procedures/- List procedures with filteringGET /api/statistics/- Get various statisticsGET /api/filters/countries- Get country list with full names and display order
Route Search API Example
GET /api/airports/route-search?airports=LFPO,LFOB,LFST&distance_nm=50
4. Data Sources
- WorldAirports: Comprehensive airport database from OurAirports
- Autorouter: European AIP data and procedures
- France and UK AIP: Direct parsing of official published AIP data from France and the UK
- Border Crossing Data: Specialized border crossing point information
- Custom Parsers: For different European aviation authorities
5. Contributing
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Submit a pull request
6. License
MIT License - see the LICENSE file for details.
7. Acknowledgments
- OurAirports: For the comprehensive airport database
- Autorouter: For European AIP data
- OpenStreetMap: For map tiles
- Leaflet.js: For the interactive map functionality
- Bootstrap 5: For responsive layout and UI components
- Font Awesome: For iconography
- Chart.js: For statistical charting
Metadata
Release files for euro-aip 0.20.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| euro_aip-0.20.0.tar.gz | 279.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| euro_aip-0.20.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 607.3 kB
Release files / euro_aip-0.20.0.tar.gz
| Download URL | euro_aip-0.20.0.tar.gz |
|---|---|
| Size | 279.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5864697b99ca9e1e501c4927e797a168e95e3d3563314e35c920667ed91755fd
|
|
BLAKE2b-256 checksum How to use checksums |
b2e2dcc7925a5823670d60049745820d1293fb4db9f296e8ebefdf0232b748f4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.11
|
Release files / euro_aip-0.20.0-py3-none-any.whl
| Download URL | euro_aip-0.20.0-py3-none-any.whl |
|---|---|
| Size | 328.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4fb3ed3137fc27daa00c1a31414adcb68fb49b05f921ea00d10278465a16f429
|
|
BLAKE2b-256 checksum How to use checksums |
57b753eec8b6c0f1f2ad93ebc31f1211b8d689a18c23b56864840a8c7c7333c7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.11
|