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.

Horizontal bars of the ZIP codes with the most individually owned aircraft, led by 99654 Wasilla, Alaska with 478, with 32128 Port Orange, Florida, 76049 Granbury, Texas and 34472 Ocala, Florida highlighted as lower-48 ZIP codes. Horizontal bars of the ZIP codes with the most individually owned aircraft, led by 99654 Wasilla, Alaska with 478, with 32128 Port Orange, Florida, 76049 Granbury, Texas and 34472 Ocala, Florida highlighted as lower-48 ZIP codes.
ZIP codes with the most individually owned aircraft.

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.

Stacked horizontal bars of owner types for the six ZIP codes with the most aircraft: South San Francisco 94080 and two Utah ZIP codes almost all corporation, three Wilmington, Delaware ZIP codes mostly LLC, with almost no individuals. Stacked horizontal bars of owner types for the six ZIP codes with the most aircraft: South San Francisco 94080 and two Utah ZIP codes almost all corporation, three Wilmington, Delaware ZIP codes mostly LLC, with almost no individuals.
The ZIP codes with the most aircraft are company addresses.

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
Map of the lower 48 with circles for the 300 ZIP codes with the most individually owned aircraft, clustered in Florida, Texas, California and the Pacific Northwest, with Port Orange and Granbury labelled. Map of the lower 48 with circles for the 300 ZIP codes with the most individually owned aircraft, clustered in Florida, Texas, California and the Pacific Northwest, with Port Orange and Granbury labelled.
The 300 lower-48 ZIP codes with the most individually owned aircraft.

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.