How to Find Fly-In Communities From Aircraft Registrations by ZIP Code
On this page
Problem statement
Some American neighbourhoods are built around a runway: residential airparks where houses have hangars and streets double as taxiways. They do not appear as such in any official dataset, but they show up in the FAA registry, because private owners register their aircraft at home. Counting aircraft by ZIP code finds them, provided the count leaves out the companies whose addresses collect thousands of aircraft. This page ranks ZIP codes by individually owned aircraft in the 16 October 2026 registry, places them with the Census ZCTA gazetteer, and maps the busiest.
Quick answer
Keep valid US registrations owned by individuals and count by ZIP code:
ind = reg[(reg.COUNTRY == "US") & (reg["STATUS CODE"] == "V") & (reg["TYPE REGISTRANT"] == "1")]
z = ind.groupby("ZIP CODE").agg(aircraft=("N-NUMBER", "size"), city=("CITY", lambda s: s.mode()[0]), state=("STATE", "first"))
print(z.nlargest(8, "aircraft").to_string())
aircraft city state
ZIP CODE
99654 478 WASILLA AK
99645 253 PALMER AK
32128 245 PORT ORANGE FL
99502 227 ANCHORAGE AK
76049 205 GRANBURY TX
99577 200 EAGLE RIVER AK
99516 199 ANCHORAGE AK
99623 177 WASILLA AK
Six of the top eight ZIP codes are in Alaska, around Wasilla, Palmer, Anchorage and Eagle River, where small aircraft are ordinary transport. The two in the lower 48 are 32128, Port Orange, Florida, home of the Spruce Creek fly-in community, and 76049, Granbury, Texas.
Individuals, not companies, and ZIPs on a map
1. Why individuals
allz = reg[(reg.COUNTRY == "US") & (reg["STATUS CODE"] == "V")]
top = allz["ZIP CODE"].value_counts().head(6)
mix = pd.crosstab(allz[allz["ZIP CODE"].isin(top.index)]["ZIP CODE"], allz["TYPE REGISTRANT"].map(REGISTRANT))
print(mix.loc[top.index, ["individual", "LLC", "corporation"]].assign(city=allz.groupby("ZIP CODE").CITY.agg(lambda s: s.mode()[0]).loc[top.index]).to_string())
TYPE REGISTRANT individual LLC corporation city
ZIP CODE
94080 7 1 3022 S SAN FRAN
19808 44 1256 570 WILMINGTON
84111 2 41 1876 SALT LAKE CITY
19801 8 1098 552 WILMINGTON
84054 5 86 1554 NORTH SALT LAKE
19810 6 740 821 WILMINGTON
Counted over all owners, the busiest ZIP codes are company addresses: 3,022 corporate aircraft in South San Francisco 94080, more than a thousand LLC registrations in each of three Wilmington, Delaware ZIP codes, and corporate addresses in Salt Lake City and North Salt Lake with only 2 and 5 individual owners. Restricting to individuals removes them.
2. Place the ZIP codes
gaz = pd.read_csv(zipfile.ZipFile(Z.open("2024_Gaz_zcta_national.zip")).open("2024_Gaz_zcta_national.txt"), sep="\t", dtype={"GEOID": str})
gaz.columns = gaz.columns.str.strip()
z = z.join(gaz.set_index("GEOID")[["ALAND", "INTPTLAT", "INTPTLONG"]])
print(f"ZIP codes with individual owners: {len(z):,}; matched to a ZCTA: {z.ALAND.notna().sum():,} holding {z[z.ALAND.notna()].aircraft.sum() / z.aircraft.sum():.1%} of the aircraft")
ZIP codes with individual owners: 20,734; matched to a ZCTA: 19,783 holding 98.3% of the aircraft
20,734 ZIP codes have at least one individually owned aircraft; 19,783 match a ZCTA in the gazetteer, holding 98.3% of the aircraft. The rest are PO-box and other ZIP codes with no ZCTA.
3. Density, not just count
z["per_km2"] = z.aircraft / (z.ALAND / 1e6)
dense = z[(z.aircraft >= 40)].nlargest(8, "per_km2")
print(dense[["city", "state", "aircraft", "per_km2"]].round(1).to_string())
city state aircraft per_km2
ZIP CODE
99517 ANCHORAGE AK 117 13.9
03890 WEST OSSIPEE NH 59 13.9
99515 ANCHORAGE AK 144 5.3
99502 ANCHORAGE AK 227 5.0
99501 ANCHORAGE AK 84 4.8
32128 PORT ORANGE FL 245 2.8
67212 WICHITA KS 91 2.8
99508 ANCHORAGE AK 50 2.7
Per square kilometre of land the ranking shifts toward small ZIP codes around airfields: ZIP 99517 in Anchorage and 03890, West Ossipee, New Hampshire, both at 13.9 aircraft per kmΒ², then Spruce Creek's 32128 and 67212 in Wichita.
Alaska and the lower 48
The data used on this page
The FAA's Releasable Aircraft Database, public domain, downloaded on 16 October 2026 and saved on this site, because the FAA replaces it every day. The saved copy leaves out the owners' names and street addresses and keeps five-digit ZIP codes; every other column is as published. With it come the Census Bureau's Vintage 2025 county population estimates, 2024 county boundaries and 2024 ZCTA gazetteer.
from pathlib import Path
import zipfile
import geopandas as gpd
import numpy as np
import pandas as pd
import requests
Path("data").mkdir(exist_ok=True)
# FAA Releasable Aircraft Database, 16 October 2026: MASTER.txt without the NAME, STREET, STREET2 and OTHER NAMES
# columns and with five-digit ZIP codes (MASTER-no-names.txt), ACFTREF.txt and ENGINE.txt as published; Census
# Vintage 2025 county estimates, 2024 cartographic boundary counties and 2024 ZCTA gazetteer. Saved here unchanged
# otherwise, because the FAA replaces the file daily.
# Live: https://registry.faa.gov/database/ReleasableAircraft.zip (needs a browser User-Agent),
# https://www2.census.gov/geo/docs/maps-data/data/gazetteer/2024_Gazetteer/2024_Gaz_zcta_national.zip
ARCHIVE = "faa-aircraft-registry-2026-10-16.zip"
if not Path(f"data/{ARCHIVE}").exists():
Path(f"data/{ARCHIVE}").write_bytes(requests.get(f"https://data.spatialworkflow.io/{ARCHIVE}", timeout=600).content)
Z = zipfile.ZipFile(f"data/{ARCHIVE}")
def faa(name):
"""One registry file: comma-separated, every field padded with spaces, a byte-order mark and a trailing comma."""
d = pd.read_csv(Z.open(name), dtype=str, encoding="utf-8-sig", keep_default_na=False)
d.columns = d.columns.str.strip()
d = d.loc[:, [c for c in d.columns if c and not c.startswith("Unnamed")]]
return d.apply(lambda c: c.str.strip())
reg = faa("MASTER-no-names.txt")
ref = faa("ACFTREF.txt")
TYPE_AIRCRAFT = {"1": "glider", "2": "balloon", "3": "blimp", "4": "fixed wing single engine", "5": "fixed wing multi engine",
"6": "rotorcraft", "7": "weight-shift", "8": "powered parachute", "9": "gyroplane", "H": "hybrid lift", "O": "other"}
REGISTRANT = {"1": "individual", "2": "partnership", "3": "corporation", "4": "co-owned", "5": "government", "7": "LLC",
"8": "non-citizen corporation", "9": "non-citizen co-owned", "": "blank"}
Path("data/cb_2024_us_county_20m.zip").write_bytes(Z.read("cb_2024_us_county_20m.zip"))
counties = gpd.read_file("data/cb_2024_us_county_20m.zip")
STATEFP = counties.drop_duplicates("STUSPS").set_index("STUSPS").STATEFP
pop = pd.read_csv(Z.open("co-est2025-alldata.csv"), encoding="latin-1", dtype={"STATE": str, "COUNTY": str})
pop = pop[pop.SUMLEV == 50].assign(GEOID=lambda p: p.STATE + p.COUNTY)
print(f"FAA registry, 16 October 2026: {len(reg):,} aircraft, {len(ref):,} make-and-model codes")
FAA registry, 16 October 2026: 317,604 aircraft, 94,115 make-and-model codes
Example 1: Alaska apart
ak = z[z.state == "AK"]
print(f"Alaska ZIPs: {len(ak)} holding {ak.aircraft.sum():,} individually owned aircraft, {ak.aircraft.sum() / z.aircraft.sum():.1%} of the US")
print(z[z.state != "AK"].nlargest(6, "aircraft")[["city", "state", "aircraft"]].to_string())
Alaska ZIPs: 152 holding 4,975 individually owned aircraft, 4.0% of the US
city state aircraft
ZIP CODE
32128 PORT ORANGE FL 245
76049 GRANBURY TX 205
34472 OCALA FL 141
33868 POLK CITY FL 133
97351 INDEPENDENCE OR 122
98042 KENT WA 107
Alaska's 152 ZIP codes hold 4,975 individually owned aircraft, 4.0% of the US total. Outside Alaska the list after Spruce Creek and Granbury runs to Ocala and Polk City in Florida, Independence, Oregon, and Kent, Washington.
Example 2: map the busiest ZIPs
pts = z[z.ALAND.notna() & ~z.state.isin(["AK", "HI", "PR"])].nlargest(300, "aircraft")
g = gpd.GeoDataFrame(pts, geometry=gpd.points_from_xy(pts.INTPTLONG, pts.INTPTLAT), crs=4326).to_crs(5070)
print(f"ZIPs drawn: {len(g)}; smallest count drawn: {g.aircraft.min()}")
ax = counties[~counties.STUSPS.isin(["AK", "HI", "PR"])].to_crs(5070).plot(color="whitesmoke", edgecolor="white", figsize=(10, 6))
g.plot(ax=ax, markersize=g.aircraft / 3, color="tab:blue", alpha=0.6)
ax.set_axis_off()
ZIPs drawn: 300; smallest count drawn: 33
The 300 busiest ZIP codes in the lower 48, down to 33 individually owned aircraft each, cluster in Florida, Texas, California and the Pacific Northwest, with Spruce Creek and Granbury the largest circles.
Internal links
- Registration addresses β the company ZIP codes left out here
- Registered aircraft per resident β the county view
- Read the FAA registry β the columns and the reader
- County codes that no longer exist β the ZCTA centroids used another way