What it is
ATS Landmark Atlas maps the National Register of Historic Places — the United States' official list of the places it has decided are worth keeping. All 74,636 public listings are drawn live from the National Park Service Cultural Resources GIS service: 64,358 buildings, 5,107 structures, 3,156 districts, 1,544 sites and 471 objects, each coloured by type on an Okabe–Ito colour-blind-safe palette. The 1,208 National Historic Landmarks — the subset the Secretary of the Interior has designated nationally significant — ride on their own layer above the rest, marked with a gold star so the distinction never depends on hue alone.
At national scale the points collapse into counted clusters; pass city scale and they resolve into individual markers, and from 1:50,000 the listed boundary polygons appear underneath. The panel searches by name or city, filters by state, resource type, landmark status and the decade a place joined the register, and redraws a listings-per-decade histogram from counts the service computes server-side rather than from anything downloaded and tallied in the browser.
The app is zero-credential and holds no copy of the register. Both map layers are FeatureLayers pointed straight at mapservices.nps.gov, which returns CORS headers for the Labs origin, so the data a visitor sees is whatever the National Park Service published that morning.
The experience
The map opens on the contiguous United States with the register already clustered across it, and the controls follow the questions people actually ask of this list:
- Find a place. Type a name or a city — Fallingwater, Savannah, Taos — and the map narrows as you type. The search runs as a case-insensitive server-side query across the resource name and city fields, so it searches all 74,636 listings, not a loaded subset.
- Narrow by state. Every state and territory is in the picker with its listing count, from New York's 4,899 down to Palau's 1. The register reaches well past the fifty states: Puerto Rico, Guam, American Samoa, the Northern Marianas, the Virgin Islands, the Freely Associated States — and one listing in Morocco.
- Filter by resource type. Five chips for building, district, site, structure and object, each carrying its own swatch. A district is a whole neighbourhood or complex; an object may be a single milestone or statue.
- Isolate the landmarks. One switch reduces the map to the 1,208 National Historic Landmarks — roughly one listing in sixty.
- Scrub the decades. A year-range slider filters on when a place was added to the register, and the per-decade histogram redraws from fresh server-side counts. The 1980s dominate at 25,971 listings; the 1966 founding year and the current decade bracket the curve.
- Open a listing. The card gives address, county and state, the date it was listed, its contributing-resource counts, its NRIS reference number, a landmark badge where one applies — and, when the nomination file has been digitised, a link to its record in the National Archives catalog.
- Fly the tour. Eight National Historic Landmarks across the country — Fallingwater, the Lincoln Home, Eads Bridge, Little Rock Central High School, the Alamo, Taos Pueblo, Bodie and the Old Faithful Inn — each opening its live record. In 3D the camera flies to each one over real terrain.
The data — where it comes from
One live federal service and one anonymous basemap — free end to end, and nothing cached in the app.
| Source | What it provides | Refresh | Cost | Attribution |
|---|---|---|---|---|
| National Park Service, Cultural Resources GIS — National Register of Historic Places map service (mapservices.nps.gov, layers 0 and 1), queried live | 74,636 listed points (name, resource type, address, city, county, state, listing date, National Historic Landmark flag, contributing-resource counts, NRIS reference number) and 22,905 listed boundary polygons carrying National Archives catalog links | Live — every map draw and every count is a fresh query; no snapshot is bundled | Free (no API key) | National Park Service, National Register of Historic Places (public, non-restricted listings). A work of the US federal government — public domain in the United States. |
| National Archives and Records Administration catalog (catalog.archives.gov), linked per listing | The digitised nomination file for a listing, where one exists (17,673 of the 22,905 boundary records carry a usable link) | Link-out only — the app stores no Archives content | Free | National Archives and Records Administration |
| Esri dark-gray vector basemap (anonymous) | Dark basemap under both layers, in 2D and 3D | Vendor-managed | Free (no API key) | Esri attribution renders in-map automatically |
| Esri world elevation (anonymous) | Terrain under the 3D scene | Vendor-managed | Free (no API key) | Esri |
How it was assembled
The application is a fully static single-page app with no backend, no database and no bundled dataset. The stack: TypeScript, ArcGIS Maps SDK for JavaScript 5.1.x, Calcite Design System 5.x, and Vite 8.
Module map — the codebase is small and deliberate; each file owns one concern:
Key engineering decisions
- Clustering is not decoration, it is the only way this draws. 74,636 individual markers at national scale is a solid smear and a stalled frame budget. A FeatureReductionCluster collapses them into counted bubbles and is swapped off — by setting featureReduction to null — once the view passes 1:150,000, so city scale shows real points.
- Boundary polygons are scale-gated for a measured reason. The 22,905-polygon boundary layer only switches on at 1:50,000. Draping that many polygons on 3D terrain at global scale is the known way to make a camera fly stutter, so the scale gate does double duty: it keeps the small-scale map legible and keeps the 3D goTo smooth.
- CertDate carries two date formats, and both are parsed. Measured across all 74,636 rows: 74,339 are ISO-ish ("1984-04-"), 58 are US M/D/YYYY ("3/20/1980"), and 239 are empty. A left-four year parse alone silently mis-bins the slash rows, and a string range over CertDate sorts "2/2/2024" into the 1990s — so the year filter excludes slash rows from its range predicate and OR-s the correct ones back in by object ID.
- The decade chart is computed by the service, not the browser. groupByFieldsForStatistics accepts a SQL expression, so SUBSTRING(CertDate,1,3) returns one row per decade in a single request — no feature download, no client-side tally. LEFT(CertDate,3) is rejected outright, so SUBSTRING is the portable form. A second small grouped query folds in the slash-format rows at their true decade, keeping the chart exact rather than 58 listings short.
- The Archives link lives on the other layer. NARA_URL is a polygon-layer field, so the card looks it up by NRIS reference number after opening rather than carrying it on the clicked point. Of the 22,905 polygons only 17,673 hold a usable URL — the rest store an empty string — so the query tests for a non-empty value and the link simply never appears when there is nothing to link to.
- Every number on screen is the service's. The header counts, the state picker's per-state totals, the match count and the histogram are all query results. Nothing is hard-coded, so the app cannot drift from the register as listings are added.