← All guides

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.

5,000 ftNMNxw 345°downwind 255°base 165°final 075°45° entry07L25R07R25L

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

Condition: Excellent. Edge lights: High. Surface: Grooved. Weight bearing: Single wheel 45k, Double wheel 90k.

Pattern side: FAA NASR · TPA standard 1,000 ft AGL (not charted) · layout: FAA runway-end coordinates

KLVK, Livermore Municipal Airport. The same component every airport page renders, from the same NASR payload. Select a runway end to swap the pattern; the wind and favored runway are live.
5,000 ftNMNxw 186°downwind 096°base 006°final 276°45° entry2709

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)

Condition: Excellent. Edge lights: High. Surface: Grooved. Weight bearing: Single wheel 45k, Double wheel 89k.

Pattern side + displaced threshold: FAA NASR · TPA charted (NASR) · layout: FAA runway-end coordinates

KTEX, Telluride Regional Airport. The same component every airport page renders, from the same NASR payload. Select a runway end to swap the pattern; the wind and favored runway are live.

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.