Files
maptool/docs/nps-resources.adoc
T
randy bc505436c1
CI / check (push) Successful in 41s
CI / deploy (push) Successful in 16s
Document all NPS mapping resources investigated this session
A reference doc (docs/nps-resources.adoc) covering everything looked at
while pulling icons/controls/theme colors from NPS's mapping ecosystem:
what's actually in use (symbol-library, home-button, the Park Tiles-inspired
offline palette), what was considered and deliberately skipped (svg-icons,
markdown-handlebars, the unmerged overview/carto/wms branches) and why, the
Park Tiles cartography research (Harpers Ferry Center lineage, the four
style variants, why the actual tile service is off-limits via Mapbox
Atlas licensing, the public style JSON and Mapbox Studio style IDs found),
and the still-open upstream PR revising artwork for three icons we use.

Worth having as a knowledge base rather than re-deriving any of this from
scratch next time — NPS's tooling has repeatedly turned out to be a better
source than building something from nothing.
2026-09-07 20:07:27 +02:00

10 KiB
Raw Blame History

National Park Service mapping resources

A reference for what’s out there in the National Park Service’s mapping ecosystem: what this app has actually adopted, what was investigated and deliberately skipped, and the licensing/provenance details behind each. Kept as a knowledge base since NPS’s tooling has repeatedly turned out to be a better source than reinventing something from scratch — worth checking here before searching from zero next time.

What this app actually uses

What Where License

symbol-library (map category icons, POI badge glyphs)

public/js/icons.js’s `POI_ICONS/PARK4NIGHT_TAGS

CC0 (public domain)

home-button (the "Home" map control)

public/vendor/npmap-home-button/

MIT (per package.json); the whole npmap5-plugins repo is separately public domain as a US government work

Park Tiles color palette (offline basemap theme)

public/js/map.js’s `OFFLINE_THEME

Colors only — see Park Tiles (the NPS basemap theme) for why the actual tile service isn’t used

See docs/third-party-notices.adoc for the formal vendored-library notice and docs/architecture.adoc for how each is wired in.

npmap5-plugins

https://github.com/nationalparkservice/npmap5-plugins — a monorepo of MapLibre GL JS plugins built for NPS’s current (v5) map stack. Live demos: https://nationalparkservice.github.io/npmap5-plugins. More examples/screenshots: issue #7.

On main (stable, what we’ve pulled from)

Plugin What it is

symbol-library

The icon set — see above. Confirmed by the maintainer (issue #4) to be the designated replacement for the older standalone nationalparkservice/symbol-library repo, with a much larger vocabulary (300+ icons vs. the ~200 in the old repo).

home-button

Adopted, see above.

svg-icons

Considered, not adopted. Solves the same "recolor an icon at render time" problem we hit and fixed ourselves this session (see docs/architecture.adoc’s note on `_registerCategoryGlyphs — SDF images need an actual distance field, not a plain antialiased raster, or edges blur). Its approach is more general (lazy, on-demand recoloring via a styleimagemissing listener and a query-string-encoded icon-image id, vs. our upfront per-distinct-color registration) but swapping in ~800 lines of unfamiliar third-party logic for something already working and understood wasn’t a clear win — no bug it would fix, no capability we’re missing.

interactivity

Not investigated in depth — "makes interactivity easier with MapLibre GL JS". Our own click/hover handling (gpx.js) is already small and specific to this app’s needs.

maplibre-gl-vector-text-protocol

Loads KML/GPX/TopoJSON/OSM directly into MapLibre client-side. Not a fit: our GPX/FIT handling is server-side (lib/maptool/gpx.rb/fit.rb) specifically so we can compute track stats, POI category styling, clustering, etc. — a generic client-side loader wouldn’t give us any of that.

markdown-handlebars

Considered, not adopted. Renders Markdown-with-{{handlebars}} as HTML. Our waypoint popup content isn’t Markdown — it’s park4night’s own semi-structured text format (formatDescription in gpx.js parses Label: value lines and turns Services/ Activities into icon tags) — a generic templater would replace the wrong layer of that logic, and would mean trusting a new, unaudited HTML-rendering path for untrusted (uploaded-file) content in place of our already-reviewed escaping.

source-arcgis-rest, source-wms

Add ArcGIS REST / WMS raster layers as MapLibre sources. No current need — we don’t have an ArcGIS or WMS data source to point at. wms explicitly noted by the user as maybe useful in the future.

On unmerged feature branches (less vetted — not on main yet)

Plugin What it is

overview (branch maplibre-gl-overview)

A minimap/inset control, any corner, respects pitch/bearing. Live demo: https://raw.githack.com/nationalparkservice/npmap5-plugins/maplibre-gl-overview/examples/index.html. Note: MapLibre GL JS has no first-party minimap of its own — this wouldn’t be more "official" than any other third-party minimap plugin, just NPS-flavored. No minimap has been requested for this app; would be a nice-to-have, not a fix for anything.

carto (branch maplibre-gl-carto-source)

Adds a vector-tile source backed by Carto.com-hosted data. Only useful if we actually have a Carto-hosted dataset to point at — we don’t right now.

wms (branch maplibre-gl-wms-source)

WMS raster layer source. Noted by the user as possibly handy later; no current use case.

Pending upstream: symbol artwork revisions

https://github.com/nationalparkservice/symbol-library/pull/226 ("npmap-hfc standardization 2024") — a large (169-file), still-open/unmerged artwork revision pass on the old standalone repo, open since January 2024. Of the icons this app actually uses, three have revised artwork proposed there:

  • bicycle-trail (our sport_cycling/vtt)

  • campground (our tourism_camp_site)

  • pets-on-leash (our animaux)

Plus filename-only renames (e.g. motor-bike-trail → motorbike-trail, sea-plane → seaplane) and a handful of new icons not relevant to our current PARK4NIGHT_TAGS mapping (e-bike, foraging-gathering, seaplane, toilet, windmill). Deliberately not pulled in — it’s an unmerged draft, could still change. Worth revisiting once it lands on main in whichever repo ends up canonical.

Park Tiles (the NPS basemap theme)

Design lineage

Explicitly traces back to the National Park Service’s iconic print brochure maps produced at the Harpers Ferry Center — the Park Tiles team consulted HFC cartographers directly, adapting the same visual language for digital display. This is also the design lineage behind the Unigrid system (Massimo Vignelli’s 1970s NPS brochure/signage template), one of the most respected government design programs.

The four style variants

  • Standard — the default; used in the NPS mobile app and most of nps.gov.

  • Aerial — integrates an imagery underlay.

  • Slate — dark grey, lets overlay data stand out; also deliberately chosen to work well for low-vision users with inverted browser color settings.

  • Light — another neutral choice for data-overlay contexts.

Why we can’t use the actual tile service

Their basemap data pipeline blends NPS’s own enterprise GIS data (roads/trails/buildings/parking/POIs/boundaries) with USGS/Census federal data and, for context outside park boundaries (streets, coastlines, buildings, terrain/hillshade), OpenStreetMap data pre-processed by Mapbox as part of their commercial Atlas service — a paid, non-sublicensable data license scoped to NPS’s own use. Separately, the cartography is explicitly designed for park visitors (trailhead/park-unit labeling prioritized), not general-purpose worldwide mapping. Both are why this app uses OpenFreeMap Liberty as its actual basemap, not Park Tiles — see `docs/architecture.adoc’s "Offline maps" section.

Recreating the color choices is a different matter — not the kind of thing a data license restricts — and is what OFFLINE_THEME in public/js/map.js actually does (see docs/architecture.adoc).

Public style JSON (source for the real colors we did pull)

Of Park Tiles' four variants, only Imagery is served from a plain, unauthenticated URL:

https://www.nps.gov/lib/npmap.js/style/ck72fwp2642dv07o7tbqinvz4.json

("Park Tiles 4 Imagery", 129 layers — a genuine Mapbox/MapLibre style spec, found via npmap.js’s own bundled `baselayers.json config.) Standard, Slate, and Light resolve through Mapbox Studio’s private Styles API using an access token instead (`style_id`s below) — visible in `npmap.js’s own bundle, but not something to fetch using someone else’s embedded credentials, even when technically reachable:

Variant Mapbox Studio style_id

Standard

ck58pyquo009v01p99xebegr9

Slate

ck5cpvc2e0avf01p9zaw4co8o

Light

ck5cpia2u0auf01p9vbugvcpv

Colors actually pulled from the Imagery style JSON and used in OFFLINE_THEME: background (hsl(40, 37%, 97%), a warm cream), the park/protected-area green (#b3e378), the two road-importance tiers (#fdefbe/#fef7dd), and the park-boundary line color (#546619, dark olive). The rest of OFFLINE_THEME extends that same warm/olive family by eye rather than from a sourced value.

Legend / cartographic hierarchy

The legend page documents NPS’s own road/trail classification standard (primary/secondary/local/4WD/private/service roads; conventional/paved/ boardwalk trails; public/private buildings), each shown across all four variants. Keyed to NPS’s internal "NPS geospatial data standard for roads," not OSM’s highway=* tagging scheme — informative as design reference, not directly portable onto our OSM-derived data without reinterpreting the mapping ourselves.

NPMap4 (the older, Leaflet-based generation)

https://www.nps.gov/lib/npmap.js/4.2.1/ — predecessor to npmap5, Leaflet-based, MIT-licensed. Superseded but still live. Two things worth noting from it:

  • Geocoder control — example: https://www.nps.gov/lib/npmap.js/4.2.1/examples/controls/geocoder-control.html. Config is geocoderControl: { searchPlaces: true }: a search box that resolves NPS park units by name/unit code, or a street address, or raw coordinates, and jumps the map there. The concept (type a place/address/coordinates, jump to it) is genuinely transferable and not NPS-specific — could be built for this app with any geocoder (e.g. OSM’s free Nominatim), independent of anything NPS. Not implemented; noted as a candidate feature if wanted later.

  • Confirmed not a source for basemap tiles we could use — same nps-parkTiles* naming and same underlying Mapbox Atlas-licensed data pipeline as npmap5’s Park Tiles (see Park Tiles (the NPS basemap theme)).