Drawing the traffic pattern for every US airport
The FAA publishes the pattern as columns in a database. Turning those columns into a diagram, for every airport, with no human touching any of them.
Every US airport's traffic pattern is already public data. The FAA publishes runway alignments, which end turns right instead of left, and the pattern altitude, as columns in the NASR subscriber files. What it does not publish is a picture. SkyReady renders one from those columns, at request time, for all 13,309 US airports that have a runway, with no per airport hand work.
This is the part of the site people ask about, so here is how it actually works, including the bits that were harder than expected. Everything below is drawn by the code being described, from the FAA's data, for a real airport. Nothing here is a mock.
RWY 07LLEFT traffic
- Heading
- 075° mag · 091° true
- Dimensions
- 5,253 × 100 ft
- TPA
- 1,400 ft MSL (≈1,000 AGL) · standard
- Surface
- Asphalt
- Lights
- 4-light PAPI (right) (4°)
More details — RWY 07L
- Threshold elev
- 373 ft
- Markings
- precision
- Approach obstacle
- Tree, 75 ft, 2,016 ft from threshold, 350 ft L of centerline — 24:1 slope to clear
- Threshold crossing height
- 32 ft
- TDZ elevation
- 386 ft
Pattern side: FAA NASR · TPA standard 1,000 ft AGL (not charted) · layout: FAA runway-end coordinates
RWY 27LEFT traffic
- Heading
- 276° mag · 285° true
- Dimensions
- 7,111 × 100 ft
- TPA
- 10,484 ft MSL · 1,414 AGL · charted
- Surface
- Asphalt
- Lights
- 4-light PAPI (left) (4°)
- Displaced thr
- 200 ft
Enter the left downwind (heading 096°) on the 45° at 10,484 ft MSL.
More details — RWY 27
- Threshold elev
- 9,070 ft
- Markings
- nonprecision
- Threshold crossing height
- 40 ft
- TDZ elevation
- 9,068 ft
- Declared TORA/TODA/ASDA/LDA
- 7,111 / 7,111 / 7,111 / 6,911 ft
- End lights
- REIL
- Arresting gear
- EMAS (arresting bed)
Pattern side + displaced threshold: FAA NASR · TPA charted (NASR) · layout: FAA runway-end coordinates
What the FAA gives you
Two files do most of the work. APT_BASE carries the airport: field
elevation (ELEV), magnetic variation (MAG_VARN), the traffic
pattern altitude (TPA), and the tower type that says whether there is one
(TWR_TYPE_CODE).
APT_RWY_END carries each runway end separately: its identifier,
its true alignment (TRUE_ALIGNMENT), threshold coordinates
(LAT_DECIMAL, LONG_DECIMAL), and a Y or N flag called
RIGHT_HAND_TRAFFIC_PAT_FLAG.
That per end detail is the whole reason this is possible. Pattern direction is a property of the runway end, not the runway: 07L can be left traffic while 25R, the same strip of asphalt from the other side, is right. Any model that stores one direction per runway has already lost the information.
Placing the runways
The plate has two layouts and picks between them per airport.
When NASR has threshold coordinates for every end, it uses them. Latitude and longitude convert to a local feet grid against the first threshold, using 364,320 feet per degree of latitude and scaling longitude by the cosine of the latitude. That gives a true relative geometry: converging runways converge at the real angle, a displaced parallel sits where it really sits.
When coordinates are missing for any end, it falls back to a schematic. Runways are grouped by heading modulo 180 rounded to ten degrees, so near parallel runways land in one group, then each is offset sideways from a shared centre by 1,000 feet per slot. This is roughly how a sectional draws a field it has no room to draw precisely: not survey accurate, but correct in the ways a pilot reads it.
Runway heading then comes from the threshold pair when both are real, computed with
atan2 over the coordinate delta, and from the published NASR alignment
otherwise. Deriving it from coordinates rather than trusting the column matters because
the two disagree at some fields, and the drawing has to agree with itself.
True versus magnetic, which is not a rounding error
NASR alignments are true. Pilots fly magnetic, ATIS speaks magnetic, and the number painted on the runway is magnetic. So every heading on the plate is converted: magnetic equals true minus east variation, using the field's own published variation.
Skipping this is the classic way to ship a diagram that looks right and is wrong. In parts of Alaska the variation exceeds 20 degrees. A downwind drawn on true headings there is off by more than two runway numbers.
Pattern altitude, which is published in the other unit
NASR publishes traffic pattern altitude as AGL, above the field. Pilots fly MSL, off the altimeter. So the plate adds field elevation and shows both, and when NASR publishes no TPA at all it falls back to roughly 1,000 feet AGL rounded to the field elevation, labelled as an approximation rather than presented as published.
The airport that makes this concrete is Telluride: a 1,414 foot AGL pattern above a 9,070 foot field. Print the AGL number alone and you have told a pilot to fly at 1,414 feet in terrain that starts above 9,000.
The edge cases that actually bit
Runway identifiers are the part everyone underestimates. The obvious parse is two digits and an optional L, C or R. Of the 333 distinct identifiers in the US data, 182 do not match that shape. Among them:
- 18W, 04W, 31W. A W suffix marks a water landing lane at a seaplane base. 09U marks an ultralight strip.
- N, S, E, W, NE, NW, SE, SW. Ends named by compass point rather than by number, where the landing area has no surveyed alignment.
- ALL. A single end covering the whole landing area, at fields with no defined strip.
Each of these has to be painted on the runway at a size that fits, so the parser returns the designation, the suffix letter, and a font size that shrinks as the string grows. Not difficult, but it is the difference between covering every airport and covering the 95 percent that look normal.
The other recurring theme is that absent data must look absent. A missing pattern altitude is labelled as an estimate. A missing coordinate drops the whole field to the schematic layout rather than drawing one real runway and one guessed one on the same picture. Wrong information presented confidently is worse than a gap.
What it is drawn with
Plain SVG, computed per request on the server and hydrated for interaction. There is no tile server, no map library and no stored image: the diagram is a function of the data, so when the FAA publishes a new 28 day cycle every affected airport redraws itself. No backfill job, no cache to invalidate, nothing to redraw by hand.
Live wind then layers on top. The same page pulls the current METAR, computes the crosswind component for each runway end, and marks the favored one, which is the actual question a pilot arrives with.
Does it hold up?
The same parse produced a study: we counted every runway end in the country whose pattern turns right, and found 3,185 of them across 2,563 airports. That page publishes the methodology, the limitations, and the whole dataset as CSV under CC BY 4.0. If the parse were wrong at scale, those numbers would not survive contact with anyone who checks a field they know.
Try it against an airport you have flown: Livermore, Aspen, or search for your own field. The Chart Supplement remains authoritative; this is a planning aid built on the FAA's own data, and corrections are welcome at support@skyready.app.
Sources: FAA NASR subscriber files (APT_BASE, APT_RWY_END); FAA AC 90-66C; 14 CFR 91.126. Diagram, analysis and code by SkyReady.