# 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
- 🔄 **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
```python
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
```python
# 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()
```

### Documentation

Full documentation available in `designs/`:
- **[Quick Start Guide](designs/QUICK_START.md)** - Get started in 5 minutes
- **[Query API Documentation](designs/models_query_api_documentation.md)** - Complete query reference
- **[Builder API Guide](designs/builder_api_guide.md)** - Building and modifying data
- **[Migration Guide](designs/migration_guide.md)** - 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](https://maps.flyfun.aero)

**Database Download:** The underlying database generated by this library is available for download at [https://flyfun.aero/data/airports.db](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
1. Clone the repository
2. Install dependencies: `pip install -r requirements.txt`
3. Run the server: `cd web/server && python main.py`
4. 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 information
- `GET /api/airports/route-search` - Find airports near a route
- `GET /api/procedures/` - List procedures with filtering
- `GET /api/statistics/` - Get various statistics
- `GET /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
1. Fork the repository
2. Create a feature branch
3. Make your changes
4. Add tests if applicable
5. 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 