Tractrix for QGIS manual
Tractrix for QGIS — the OpenAirside plugin — adds ten Processing algorithms that simulate aircraft and ground-vehicle manoeuvres on your map layers and check them against ICAO, FAA or EASA clearances.
On this page
Installation
Requirements
- QGIS 3.34 LTR or later, including QGIS 4.x, built with Qt5 or Qt6.
- Windows, macOS or Linux. No additional Python packages are required: the engine is pure Python.
Install from ZIP
- Download the plugin ZIP from the download centre or Downloads (account required).
- In QGIS choose Plugins → Manage and Install Plugins → Install from ZIP.
- Select the ZIP and press Install Plugin. QGIS may warn that the plugin is experimental; that flag stays until version 1.0.
If you build the ZIP yourself from a source checkout, zip the openairside/ folder on its own so that the archive contains openairside/metadata.txt at its top level.
Install with the script (macOS)
With QGIS closed, run tools/install.sh from a checkout of the repository. It copies openairside/ into the QGIS 4 default profile and enables the plugin. Set QGIS_PROFILE to install into another profile.
Where the tools appear
- Processing → Toolbox → Tractrix, in the groups Aircraft, Airside design, Stands and aprons, Ground vehicles and Libraries. (The provider ID stays
openairside.) - The Tractrix menu under Plugins, with every tool.
- The Tractrix toolbar, with the first five tools.
Update and uninstall
Install a newer ZIP over the old one to update. To remove the plugin, use Plugins → Manage and Install Plugins → Installed → Tractrix for QGIS (OpenAirside) → Uninstall Plugin.
Concepts
- Direction of travel
- Draw every path line in the direction the aircraft or vehicle moves. For pushback, draw from the parked position in the direction the aircraft moves backwards.
- Working CRS
- Calculations are done in metres. If the input layer is in a projected CRS with metre units it is used as is; otherwise (for example EPSG:4326) the tool works in the local UTM zone and writes outputs in that CRS.
- Tracking point
- The point of the aircraft that follows the line: the nose gear, the cockpit (pilot's eye, the ICAO and FAA design assumption), or a custom point ahead of the main gear. The main gear follows the tractrix of the line.
- Standard and context
- The clearance added around the swept envelope depends on the standard (ICAO, FAA, EASA or none) and the context (taxiway, taxilane or stand). See the standards reference.
- Clearance versus edge margin
- The clearance is a buffer around the whole aircraft envelope, for wingtip-to-object checks. The edge margin is the distance from each outer main-gear tyre to the pavement edge, checked against the wheel-to-edge clearance when you give a pavement layer.
- Run
- One aircraft on one line part. Every output feature carries a
runlabel such asA320 / path 3, so group paths can be told apart and separation can be checked between runs.
Common outputs
The manoeuvre tools — aircraft path, pushback / towing and GSE path — write the same five optional layers, plus an optional HTML report and a JSON summary. Untick an output in the dialog to skip it; Poses is off by default.
| Output (ID) | Geometry | Fields |
|---|---|---|
Swept and clearance envelopes (ENVELOPES) | MultiPolygon | run, element, unit, area_m2, clearance_m, note |
Path elements (TRACKS) | LineString | run, element, unit, length_m |
Footprints, animated (FOOTPRINTS) | MultiPolygon | run, unit, step, s_m, time, heading, steer_deg, height_m |
Poses (POSES) | Point | run, aircraft, step, s_m, time, heading, steer_deg, steer_limit, steer_ok, ref_point |
Issues (ISSUES) | MultiPolygon | run, kind, value, limit, s_m, note |
HTML report (REPORT) | File | Optional; not created by default |
Summary (SUMMARY) | String | JSON list, one object per run |
Element values
Envelopes use element = swept_envelope, clearance_envelope, main_gear_swept, nose_gear_swept, engine_swept, tug_swept or vehicle_swept. Tracks use the key-point name: nose, cockpit, nose_gear, main_gear_centre, main_gear_left_outer, main_gear_right_outer, wingtip_left, wingtip_right, tail, tailplane_tip_left/_right and engine_N_exhaust.
Issue kinds
| kind | Meaning | value / limit |
|---|---|---|
| steering_limit | The nose-wheel (or steering) angle needed to follow the line exceeds the limit. Explained. | Worst angle / limit, degrees |
| edge_margin | An outer main-gear tyre comes closer to the pavement edge than the wheel-to-edge clearance. Explained. | Margin / required margin, metres |
| conflict_contact | The swept envelope overlaps an obstacle. | Overlap area, m² / 0 |
| conflict_clearance | An obstacle lies inside the clearance envelope. | Distance / clearance, metres |
The dialog log prints one line per run with the maximum steering angle, exceedances, minimum edge margin, contacts and clearance infringements.
Tools reference
Each tool is listed with its Processing ID, for use in scripts and models. Parameter IDs are shown in capitals.
Aircraft path simulation (taxi / group path)
openairside:aircraft_path · group Aircraft
Simulates one or more aircraft following each line of the path layer. The tracking point stays on the line; the main gear follows the tractrix. Select several aircraft for a group path; an aircraft field on the path layer overrides the selection line by line.
| Parameter | Description | Default |
|---|---|---|
PATH | Path lines, drawn in the direction of travel | required |
AIRCRAFT | Aircraft; select several for a group path | A320 |
AIRCRAFT_FIELD | Field on the path layer holding an aircraft ID or ICAO type (e.g. A320, B738, B77W); optional | — |
TRACKING | Tracking point: nose gear, cockpit (ICAO/FAA cockpit over centreline), or custom point | Nose gear |
TRACK_DIST | Custom tracking distance ahead of the main gear, m (min 0.5) | 20.0 |
SPEED | Speed for the animation time, km/h | 15.0 |
STEER_LIMIT | Nose-wheel steering limit override, degrees; 0 uses the library value | 0 |
STANDARD | Clearance standard: ICAO, FAA, EASA, or None / custom distance | ICAO |
CONTEXT | Clearance context: taxiway, taxilane or stand | Taxiway |
CLEARANCE | Clearance distance override, m; −1 takes it from the standard | −1 |
PAVEMENT | Pavement polygons for the edge-margin check; optional | — |
OBSTACLES | Obstacles: buildings, equipment, parked aircraft (any geometry); optional | — |
FOOTPRINT_SPACING | Distance between footprints, m (min 0.5) | 10.0 |
ENVELOPES … REPORT | The common outputs | see above |
Tips. For taxiway design use cockpit tracking; for stand lead-in lines use nose-gear tracking. Checks start once the tracking point is on the line, so the first metres of travel do not raise false edge-margin issues. The summary gives, per run, the maximum steering angle, exceedances, minimum edge margin, obstacle contacts and clearance infringements.
Pushback / towing simulation
openairside:pushback_tow · group Aircraft
Pushback: draw the path from the parked position in the direction the aircraft moves (backwards). The main-gear centre follows it and the nose-wheel angle follows from the path curvature; the tug sits on the nose gear (towbarless) or at the end of the towbar. Tow forward: the tug's front axle follows the path and the towbar, nose gear and aircraft follow as an articulated train.
| Parameter | Description | Default |
|---|---|---|
PATH | Pushback / tow path | required |
AIRCRAFT | Aircraft | A320 |
MODE | Pushback (aircraft reverses, main-gear centre follows the path) or tow forward (tug leads) | Pushback |
TUG | Tug from the vehicle library (pushback tractors) | first tug |
TOWBAR | Use a towbar; untick for towbarless | ticked |
TOWBAR_LENGTH | Towbar length, m (min 1) | 6.0 |
TOW_LIMIT | Towing steering limit, degrees (10–120) | 90 |
SPEED | Speed, km/h | 5.0 |
STANDARD | Clearance standard | ICAO |
CONTEXT | Clearance context | Stand |
CLEARANCE | Clearance override, m; −1 = from standard | −1 |
PAVEMENT, OBSTACLES | Optional check layers | — |
FOOTPRINT_SPACING | Distance between footprints, m | 5.0 |
Tips. The drawn line is smoothed over ±3 m, so small digitising kinks do not create steering spikes. Exceedances of the towing limit are written to the Issues layer; the tug and towbar appear in the envelopes as tug_swept.
Turning radii and 180° turn
openairside:turning_analysis · group Aircraft
Steady-turn radii for each aircraft at a nose-wheel angle: main-gear centre, inner and outer main-gear tyre edges (R1, R2), nose gear (R3), wingtip (R4), nose (R5) and tail (R6), plus the minimum pavement width for a 180° turn. Optionally draws the 180° turn at a point.
| Parameter | Description | Default |
|---|---|---|
AIRCRAFT | Aircraft (several allowed) | A320 |
STEER | Nose-wheel steering angle, degrees (0–89); 0 = the library maximum | 0 |
LOCATION | Point at which to draw the 180° turn; optional | — |
HEADING | Initial heading, degrees from north | 0 |
TABLE | Turning radii table (no geometry) | created |
GEOMETRY | 180° turn geometry: swept envelope, main-gear swath and radius circles | created |
Table fields: aircraft, name, steer_deg, steer_limit, R_main_gear_centre, R1_inner_mlg_edge, R2_outer_mlg_edge, R3_nose_gear, R4_wingtip, R5_nose, R6_tail, R_max, min_width_180, source. Geometry fields: aircraft, element, radius_m.
Jet blast contours
openairside:jet_blast · group Aircraft
Velocity contours behind every engine of the aircraft at each input point — stand positions, or the Poses output of a path simulation to sweep the blast along a route — plus engine intake hazard areas. Calibrated to ICAO Doc 9157 Table A2-1; indicative only (see methodology).
| Parameter | Description | Default |
|---|---|---|
POINTS | Aircraft positions (points) | required |
HEADING_FIELD | Numeric field with the aircraft heading, degrees from north | heading |
AIRCRAFT_FIELD | Field with the aircraft type; optional | aircraft |
AIRCRAFT | Aircraft when there is no aircraft field | A320 |
REFERENCE | The point represents the main-gear centre or the nose gear | Main-gear centre |
THRUST | Thrust levels: idle, breakaway, take-off (several allowed) | Breakaway |
VELOCITIES | Contour velocities, km/h, comma separated | 56,80,161 |
EVERY | Use every Nth point (thin a dense pose layer) | 1 |
DISSOLVE | Dissolve contours per velocity (blast along a path) | off |
INTAKE | Add engine intake hazard areas | on |
OUTPUT | Jet blast contours (polygons) | created |
Output fields: aircraft, element, thrust, velocity_kmh, velocity_mph, velocity_ms, length_m, model. element is jet_blast or intake_hazard; model records whether the type is calibrated individually or with the fleet factor.
Stand design (lead-in, parking, clearances, conflicts)
openairside:stand_design · group Stands and aprons
Each lead-in line is a stand. Draw it in the direction of taxi-in, ending at the stop position of the tracking point. The aircraft taxis in along the line; the final pose is the parked position.
| Parameter | Description | Default |
|---|---|---|
LEADIN | Lead-in lines; the end is the stop position | required |
STAND_FIELD | Stand name field; optional | — |
AIRCRAFT_FIELD | Aircraft field; optional | — |
AIRCRAFT | Design aircraft when there is no aircraft field | A320 |
TRACKING | The lead-in line is followed by the nose gear or the cockpit | Nose gear |
STANDARD | Clearance standard | ICAO |
CLEARANCE | Clearance override, m; −1 = from standard | −1 |
OBSTACLES | Obstacles; optional | — |
STANDS | Stand footprints and clearances (polygons) | created |
STOPLINES | Stop bars (lines) | created |
PARKED | Parked positions (points) | created |
CONFLICTS | Stand conflicts (polygons) | created |
The stand clearance zone uses Annex 14 3.13.6 — 3 / 3 / 4.5 / 7.5 / 7.5 / 7.5 m for codes A–F — the FAA ADG taxilane wingtip clearance, or your override. Conflicts are raised when a stand's clearance zone (stand_clearance) or its entry envelope (taxi_in_clearance) reaches another stand's parked aircraft, or any obstacle (obstacle). The Parked positions layer, with heading, feeds straight into Jet blast contours.
Taxiway fillet / required pavement
openairside:fillet_design · group Airside design
For each centreline drawn through the turn and each design aircraft, the cockpit (or nose gear) follows the centreline and the outer main-gear tyres sweep a swath. Required pavement = swath + wheel-to-edge margin, united with the nominal straight taxiway width. Fillet = required pavement minus the existing pavement (or minus the nominal taxiway if no pavement layer is given).
| Parameter | Description | Default |
|---|---|---|
CENTRELINE | Taxiway centrelines through the turn | required |
AIRCRAFT | Design aircraft group (several allowed) | A320 |
STANDARD | ICAO / EASA (Doc 9157 Table 1-1) or FAA (TESM by TDG) | ICAO / EASA |
TRACKING | Point on centreline: cockpit (ICAO/FAA design method) or nose gear | Cockpit |
MARGIN | Wheel-to-edge margin override, m; −1 = standard | −1 |
WIDTH | Nominal taxiway width override, m; 0 = standard | 0 |
PAVEMENT | Existing pavement; optional | — |
OUTPUT | Required pavement and fillets (polygons) | created |
TRACKS | Main-gear outer tyre tracks; optional | created |
Output fields: line, aircraft, element, margin_m, width_m, area_m2, max_track_in_m, with element = required_pavement, nominal_taxiway or fillet. The summary reports the maximum main-gear track-in from the centreline.
Envelope separation check
openairside:envelope_separation · group Airside design
Minimum distance between every pair of envelopes that belong to different runs — for example the swept envelopes of two aircraft on parallel taxiways. Pairs closer than the required separation are flagged, and the shortest connecting line is written for each pair.
| Parameter | Description | Default |
|---|---|---|
ENVELOPES | Envelope polygons (typically an Envelopes output) | required |
RUN_FIELD | Field identifying the run | run |
ELEMENT_FIELD | Element field; optional | element |
REQUIRED | Required separation, m | 7.5 |
OUTPUT | Separation lines | created |
Output fields: run_a, run_b, distance_m, required_m, ok.
GSE / vehicle path simulation
openairside:vehicle_path · group Ground vehicles
Swept path of a ground support or airside vehicle whose front (steered) axle follows each line. Trailers follow as an articulated train. Checks the steering lock and the articulation angle between units, with a jack-knife warning above 90°.
| Parameter | Description | Default |
|---|---|---|
PATH | Vehicle path (front axle) | required |
VEHICLE | Vehicle from the library | first vehicle |
SPEED | Speed, km/h | 15.0 |
STEER_LIMIT | Steering lock override, degrees (0–90); 0 = library value | 0 |
CLEARANCE | Clearance around the vehicle, m | 0.5 |
PAVEMENT, OBSTACLES | Optional check layers | — |
FOOTPRINT_SPACING | Distance between footprints, m | 3.0 |
The library contains towbar, towbarless and remote-controlled tugs, a baggage tractor with four dollies, a belt loader, a catering high-loader, a hydrant dispenser, a fuel bowser semi-trailer, a lavatory/water truck, passenger stairs, an ambulift, an apron bus, an ARFF vehicle and a follow-me car.
Aircraft library table and vehicle library table
openairside:aircraft_library · openairside:vehicle_library · group Libraries
Export the libraries as tables without geometry. The aircraft table can be filtered by ICAO code letters (CODES, default A–F) and by a text match on manufacturer, name or ICAO type (MATCH).
Aircraft fields: id, icao_type, manufacturer, name, engine_class, n_engines, engine_layout, wingspan, length, tail_height, wheelbase, cmg, mgw, mtow_kg, icao_code_letter, adg, tdg, wtc, max_steer_deg, steer_source, source. Vehicle fields: id, name, category, length, width, wheelbase, front_overhang, max_steer_deg, n_trailers, source.
Check steer_source before relying on a steering limit: it cites the manufacturer document, or says that a default was used.
Demo project walkthrough
Open sample_data/demo_airport.qgz from a checkout of the repository. It contains a taxiway with two 45 m turns and no fillets, an apron with four stands (S2 and S3 deliberately too close for code C), a pushback route and a baggage-train route, and the outputs of every tool in sample_data/demo_outputs/.
- Taxi an A320. Run Aircraft path simulation on the taxiway centreline with cockpit tracking and the pavement layer. The minimum edge margin is 4.39 m, above the 3 m required: no issues.
- Taxi a B777-300ER on the same line. The outer main gear leaves the unfilleted pavement by 6.6 m and two edge-margin breaches are flagged. The turns need fillets.
- Design the fillets. Run Taxiway fillet / required pavement with both aircraft. The maximum track-in is 2.63 m for the A320 (2.7 m by hand) and 11.6 m for the B777-300ER; the fillet polygons show the pavement to add.
- Check the stands. Run Stand design on the lead-in lines. S2 and S3 are 0.18 m apart where code C requires 4.5 m: a conflict is written.
- Push back. Run Pushback / towing on the pushback route. The maximum nose-wheel angle is 17.8°, against 17.5° from the analytic solution.
- Jet blast. Run Jet blast contours on the Parked positions output, breakaway thrust. The A320's 56 km/h contour reaches 48 m behind the tail, as in ICAO Doc 9157.
- Baggage train. Run GSE / vehicle path on the baggage route with the tractor and four dollies, and inspect the articulation angles.
Animating with the Temporal Controller
Footprint layers are temporal: each footprint has a time timestamp computed from the distance travelled and the speed you entered. The layer is configured automatically (single field, instantaneous, not accumulated).
- Open View → Panels → Temporal Controller.
- Choose Animated temporal navigation (the play icon).
- Press the refresh button next to the range to fit it to the layers, set the step (for example 1 second), and press play.
- To export frames for a video, use Export animation in the same panel.
Simulated times start at 2026-01-01 00:00 UTC. Use a lower FOOTPRINT_SPACING for a smoother animation. For a 3D view, extrude the footprints in QGIS 3D by the height_m field.
Styling
On load, outputs are given a categorised style: envelopes and stands by element, footprints by unit, issues and stand conflicts by kind, jet blast by velocity_kmh. Layer opacity is set between 45 % and 100 % so the base map stays visible.
| element | Colour |
|---|---|
| swept_envelope, parked_footprint, vehicle_swept | #1f78b4 |
| clearance_envelope, stand_clearance | #fdbf6f |
| main_gear_swept | #33a02c |
| nose_gear_swept | #b2df8a |
| engine_swept, intake_hazard | #e31a1c |
| tug_swept | #6a3d9a |
| required_pavement, entry_swept | #a6cee3 |
| fillet | #ff7f00 |
| nominal_taxiway | #bdbdbd |
Change the style as you would for any layer, then save it with Style → Save as default or as a .qml file to reuse it across projects.
Reports
Set HTML report to a file path to write a report with one section per run: aircraft or unit, travel, maximum steering angle against the limit, steering exceedances, minimum outer-tyre to pavement-edge margin and breaches (when a pavement layer is given), swept area, clearance applied, obstacle contacts and clearance infringements, and every note — including what geometry was estimated and where the steering limit came from. The same figures are returned as JSON in the SUMMARY output, for models and scripts.
Scripting and models
Every tool can be used in the graphical modeller and from the Python console:
import processing
result = processing.run("openairside:aircraft_path", {
"PATH": "centrelines", # layer name, id or path
"AIRCRAFT": [0], # index into the aircraft list
"TRACKING": 1, # 0 nose gear, 1 cockpit, 2 custom
"STANDARD": 0, # 0 ICAO, 1 FAA, 2 EASA, 3 none
"CONTEXT": 0, # 0 taxiway, 1 taxilane, 2 stand
"PAVEMENT": "pavement",
"ENVELOPES": "TEMPORARY_OUTPUT",
"ISSUES": "TEMPORARY_OUTPUT",
})
print(result["SUMMARY"])
Enum parameters such as AIRCRAFT take indexes into the list shown in the dialog; to choose aircraft by type in a script, put the ICAO type in a field of the path layer and pass it as AIRCRAFT_FIELD. For use outside QGIS, see the command-line engine.