Skip to content

Concepts

The Aeronautical Information Exchange Model (AIXM) is the global standard for representing and sharing digital aeronautical information. Administered jointly by Eurocontrol and the FAA, the AIXM standard defines how the aviation industry digitises all aspects of airspace, including airspaces, airports, runways, navigation aids, flight obstacles, routes and waypoints.

Software supporting a given data schema is typically required to solve three core problems:

  • Ingest data from that schema
  • Read and query that schema
  • Write or produce that schema

Unlike static mapping or generic GIS formats, any software claiming true AIXM compliance cannot simply treat AIXM as flat spatial data. It must natively support and enforce three domain-specific aeronautical concepts:

  • Temporality through versions and corrections
  • Types of messages (BASELINE, TEMPDELTAS, DELTAS, SNAPSHOTS)
  • Advanced Geometry Capabilities

Furthermore, the AIXM schema itself poses unusual challenges due to its size, deeply nested structure and polymorphic nature. To address these challenges, the Delorean AIXM project required a technology stack that offered flexibility, capability and robustness. The three core aspects of Delorean-AIXM are:

  • Java 21
    • Schema-driven code generation: Standard JAXB/Jakarta XML Binding tools compile XML Schema Definitions (XSD) into strongly-typed Java domain classes.
    • Marshalling: Strict round-trip fidelity when unmarshalling raw XML messages
  • PostgreSQL + PostGIS
    • Relational database : If you're not using PostgreSQL, you're either a bank or wrong.
    • Geospatial rocessing: PostGIS provides all the tools required for advanced geometry rendering.
  • Hibernate (JPA)
    • Nested ORM: Maps Java class hierarchies, polymorphic entities, and nested object graphs to relational database tables.
    • Schema Generation: Derives the target relational database schema (tables, foreign key constraints, join tables, sequences) directly from annotated Java domain classes.

All of these products were then incorporated into the core concepts of the Delorean-AIXM solution.

Automated HyperJAXB-generated class

Delorean-AIXM relies on automatically generated domain classes annotated for both JAXB XML serialization and JPA/Hibernate database persistence. Delorean uses an automated code generation pipeline that transforms raw XML Schemas directly into AIXM-compliant Java XML Bindings and 3NF-compliant PostGIS database model.

This is achieved by taking the official XML schema definition files aixm.xsd published by Eurocontrol and the FAA, along with a config.json file that steers the class generation rules. These inputs are fed into prejaxb.py, a utility script that produces an aixm.xjb binding file to customize and extend the original XSD schemas.

hyperjaxb then compiles the schemas and binding rules into java.class annotated for both XML streaming (JAXB) and database persistence (JPA/Hibernate). Finally, postjaxb.py performs a second pass on the generated java.class, modifying addapted types, naming and fix structural limitations inherent to hyperjaxb.


stateDiagram-v2
    direction LR
    aixm.xsd --> hyperjaxb
    aixm.xsd --> prejaxb.py
    config.json --> prejaxb.py
    prejaxb.py --> aixm.xjb
    aixm.xjb --> hyperjaxb
    hyperjaxb --> java.class
    java.class --> postjaxb.py
    postjaxb.py --> java.class

As the generated classes are derived directly from the original aixm.xsd, the structure of the classes and the database schema are very similar to the original aixm.xsd.

The root class, AIXM Message, holds all the metadata and AIXM features. Each AIXM feature contains AIXM Timeslices, which contains attributes and AIXM objects. All of these classes also retain their correct GML inheritance all the way to GMLType, as AIXM is built on top of GML concepts.

As the generated classes are derived directly from the original aixm.xsd, the structure of the classes and the database schema are very similar to the original aixm.xsd.

The database is divided into 17 schemas reflecting standard AIXM feature packages (e.g., Aerial Refuelling, AirportHeliport). Additionally, three specialized schemas are included:

  • public: Contains abstractc concepts.
  • gml: Handles geometries (replacing AIXM's native Geometry structures).
  • aixm: Manages abstract AIXM core types such as messages and metadata.

The database follows the same (but shortened) naming strategy as AIXM :

Suffix AIXM Type Exemple Class Exemple Database
_f (Feature)Type DMEType dme_f
_tp (Feature)TimeSlicePropertyType DMETimeSlicePropertyType dme_tp
_t (Feature)TimeSliceTypee DMETimeSliceTypee dme_t
_te (Feature)TimeSliceExtensionType DMETimeSliceExtensionType dme_te
_p (Feature)PropertyType DMEPropertyType dme_p
_p (Property)PropertyType NotePropertyType note_p
_o (Object)Type NoteType note_o
_oe (Object)ExtensionType NoteExtensionType note_oe

Association between table follow three standadized paterns :

Relation Type Naming Pattern Exemple
One-to-One Embedded (Attribute)_(Nested Attribute) designator_nilreason
One-to-One Join Columns (Table)_hjid dme_te_hjid
One-to-One Join Table (Table)_(Role)_link dmetmslctp_lctn_link

The links between features are materialised either through join columns (one-to-many) or join tables.

Overall, this means that Delorean-AIXM has only one automatically generated layer between the database and the XML files. This ensures that the class and database structures remain robust and flexible in the face of future changes and extensions while keeping the middle layer lean and efficient for effective parsing and persistence in all the other required workflows.

Swift write-render-read operation

To abstract away the complex, deeply nested table structure of AIXM and eliminate the performance penalty of querying 8–10 levels of joins at runtime, Delorean-AIXM relies on Materialized Views. These materialized views flatten the normalized 3NF AIXM schema into clean, tabular representations of aeronautical features while automatically resolving spatial, relational, and temporal logic directly inside PostgreSQL. This is the key reason why the AIXM schema can be connected to standard GIS tool, the performance of querying these materialised views is sub-millisecond.

The unlogged table for curve and surface geometries enables the GML geometries to be rendered in parallel, since multiple sessions can write to the unlogged table simultaneously, thereby speeding up the rendering process.


erDiagram
    direction TB

    subgraph "Feature View"
        direction LR
        dme_view {
            varchar gml_id PK
            varchar designator
            varchar name
            numeric elevation
            timestamp valid_time
            text note_translated_note
            geometry location_geom
        }

        unlogged_curve {
            varchar id PK
            geometry geom
        }

        unlogged_surface {
            varchar id PK
            geometry geom
        }

        unlogged_curve ||--|| dme_view : "View"
        unlogged_surface ||--|| dme_view : "View"
    end

    subgraph "Feature Table"
        direction LR
        dme_f {
            varchar gml_id
        }

        dme_t {
            varchar designator
            varchar name
            numeric elevation
            timestamp valid_time
            varchar interpretation
        }

        note_p {
            text translated_note
        }

        elevatedpoint_p {
            bigint gml_point_hjid FK
        }

        gml_point {
            bigint id PK
            varchar srs_name
            text pos
        }

        %% Normalized 3NF Relational Tables
        dme_f }|--o{ dme_t : "timeSlice"
        dme_t }|--o{ note_p : "annotation"
        dme_t }|--o{ elevatedpoint_p : "location"
        elevatedpoint_p }|--|| gml_point : "point"
    end

    "Feature View" ||--|| "Feature Table" : "View"
    "Feature View" ||--|| "Feature Table" : "Inserts"

These view a generated by taking the same config.json we used for the java class generation, java.class generation themselves and are pipes into a utility called prejaxb.

stateDiagram-v2
    direction LR

    config.json --> postjaxb
    java.class --> postjaxb
    postjaxb --> materialized_view
    postjaxb --> filter_query
    postjaxb --> domain_types

As mentioned above, the GML AIXM geometries are computed in the database. First, PostGIS computes the complex segments (arcs, circles and geodesics) from the GML primitives (points, lines and polygons), which are then merged to form curves. These curves then serve as the geometric basis for the views and surfaces. In a second phase, PostGIS computes the surface rings by aggregating, cutting, merging and ordering the previously generated curves. These rings are then merged into polygons to form surfaces.

Why use an unlogged table rather than a view for this? A view (materialised or not) can only be used by one session at a time. This means that all the geometry and intermediate results must be computed and held in memory by a single session. This significantly slows down the computation, even on a high-end, optimised PostgreSQL server, because the memory allocation per session is almost always reached. By using an unlogged table and multiple sessions, we can divide the memory footprint and increase the number of parallel jobs. However, the number of sessions should match the number of cores available to the database, as having too many sessions would be counterproductive.

This multiple-session pattern is used by all functions that interact with PostgreSQL from Delorean-AIXM from persist, extract, merge, predicate etc.