Skip to content

Commit fe64b91

Browse files
timathomasclaude
andcommitted
Canada + Alaska: sites for all 13 provinces, global satellite, NRCan topo (VISION row 141)
Alaska was close already; Canada had nothing. Two concrete defects fixed and one new region added to the sites database. Satellite. USGS orthoimagery has a hole at z9-z11 over mainland Alaska (Denali, Fairbanks, Anchorage, Kenai all 404 there while z8 and z12 return imagery), and outside the US it answers 200 with an opaque solid-white PNG rather than a 404 — white paint, not a blank to fall through. A base layer can now declare an `underlay`, so Satellite draws Sentinel-2 cloudless 2024 beneath USGS, and the tile protocol swaps that known placeholder for a transparent tile on a length-then-SHA-256 match. One mechanism, no per-region branching. Banff goes from 100% white to 0%; Seattle still shows sharp USGS on top. Canada Topo. New base from NRCan's Canada Base Map. Its labels live in a second cache, which drove a `companions` mechanism in the pack downloader so a Canadian offline pack saves place names too — hidden from the pack list, cascade-deleted. Capped at z15, the cache's real ceiling; the service advertises LOD 0-23 and 404s above 15. Sites. 15,985 across all 13 provinces and territories, taking the database to 109,893. BC leads with 4,157, including 649 BC Recreation Sites from the province's own register — where most free Crown-land camping is — with camp-site counts, driving directions and closure warnings on the cards. Boondock Zones do not exist in Canada and won't, being derived from USFS ownership and MVUM roads, so the loader now treats a missing zones file as "no zones here" rather than failing the region, which otherwise meant no Canadian sites loaded at all. Three traps worth recording. `s2cloudless-2017` is advertised CC BY 4.0 but serves empty 116-byte tiles. Overpass `area[ISO3166-2]` times out on provinces this size, so extracts are by bounding box — and `load_osm` never clipped, because US extracts were area-scoped and did not need to; unclipped, BC carried 2,233 features belonging to Alberta, Washington and Yukon. And NRCan 404s above z15. The 2024 imagery is CC BY-NC-SA 4.0, accepted deliberately (Tim): the app is free and GPL, so NonCommercial holds, and the CC BY alternative is a 2016 mosaic too old for reading ground cover. Credit is carried on the map, in the Guide, in ATTRIBUTION.md and on the offline pack. This is the one dependency to revisit if Boondock Map ever goes commercial; `s2cloudless_3857` is the CC BY fallback. All four new services registered in upstream_sources.json, BC's export mirrored to data-pipeline/backups (547 KB gzipped), and check_upstream.py taught two new probe modes so the weekly report stays truthful rather than crying wolf. Verified by driving the real app in headless Brave: Banff and Denali imagery, Canada Topo drawing, Canadian sites loading per region, Tongass rendering 923 trail and 25 MVUM features. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 parent 36e7f56 commit fe64b91

29 files changed

Lines changed: 723 additions & 61 deletions

README.md

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ Waypoints and tracks sync automatically to iCloud Drive, making your saved spots
1515
## Features
1616

1717
- **The Boondock basemap:** our own designed terrain map — vector tiles + hillshade relief in the CiDR palette, hairline roads, mountain peaks labeled with elevation in feet
18-
- **Satellite base** (ESRI World Imagery) with a **Topo Overlay** blend — USGS contour lines and elevation figures over the imagery
19-
- **Sites database:** national camping layer — campsites, RV parks, dump stations, water fills, and trailheads as tappable, clustered map points with save-as-waypoint, each drawn as a circle ringed in its type's color carrying that type's logo (tent, RV, dump arrow, water drop, footprints) from about z10.5 (93,000+ places across all 50 states from OSM, Overture, Recreation.gov, and WA DNR; each state loads on demand as you pan)
18+
- **Satellite base** — USGS orthoimagery (~1 m, public domain) over the US, with **Sentinel-2 cloudless 2024** (10 m, CC BY-NC-SA 4.0) drawn beneath it so the map still has imagery in Canada and over the z9–z11 gap in USGS's Alaska coverage; blends with the **Topo Overlay** of USGS contour lines and elevation figures
19+
- **Sites database:** national camping layer — campsites, RV parks, dump stations, water fills, and trailheads as tappable, clustered map points with save-as-waypoint, each drawn as a circle ringed in its type's color carrying that type's logo (tent, RV, dump arrow, water drop, footprints) from about z10.5 (93,000+ places across all 50 US states from OSM, Overture, Recreation.gov and WA DNR, plus every Canadian province and territory from OSM and — in BC — the province's own register of forest recreation sites; each region loads on demand as you pan)
2020
- **Community spots:** traveler-reported places (dump, water, camp…) with amber-ringed dots — anonymous in-app reports pass a spam/profanity filter, publish nightly as *unverified*, and dated check-ins ("still there" / "gone", with comments) promote them to *verified* after two independent confirmations; every card shows when a spot was last confirmed (submission API: `worker/`, publish: `data-pipeline/merge_community.py` + the `community-merge` Action)
2121
- **MVUM Roads overlay:** the true USFS Motor Vehicle Use Map — which forest roads are legal to drive, and in what; self-hosted vector tiles, so it works with no signal
2222
- **More overlays:** Hiking Trails (USFS/NPS), Names & Labels, BLM Public Land status
@@ -51,7 +51,7 @@ _Coming soon_
5151
| Desktop shell | Electron 29 |
5252
| Renderer | React 18 + Vite 5 |
5353
| Map engine | MapLibre GL JS 4 |
54-
| Tile sources | USGS National Map, ESRI World Imagery, OSM, USFS, BLM |
54+
| Tile sources | USGS National Map, Sentinel-2 cloudless (EOX), NRCan Canada Base Map, OSM, USFS, BLM |
5555
| Geocoding | Nominatim (OpenStreetMap) |
5656
| POI search | Overpass API (OpenStreetMap) |
5757
| Weather | Open-Meteo forecast API (CC-BY 4.0) |
@@ -163,7 +163,8 @@ All tile and data sources are free and require no API key.
163163
| Name | Source | Max Zoom |
164164
|---|---|---|
165165
| Boondock | Our style: OpenFreeMap vector tiles (OpenMapTiles/OSM) + Mapzen terrain hillshade via AWS | z19 |
166-
| Satellite | ESRI World Imagery | z19 |
166+
| Satellite | USGS orthoimagery (US) over Sentinel-2 cloudless 2024 (worldwide) | z19 |
167+
| Canada Topo | NRCan Canada Base Map (CBMT geometry + labels, EPSG:3857) | z19 |
167168

168169
### Overlays
169170

@@ -174,9 +175,9 @@ All tile and data sources are free and require no API key.
174175
| BLM Roads | BLM GTLF Public Display (export rendering) | Public + limited public motorized use, z7+; off by default |
175176
| All FS Roads | USFS RoadCore, self-hosted PMTiles | Every FS road, open and closed — works offline; off by default |
176177
| Wildfires | NIFC WFIGS current perimeters (live GeoJSON) | Active fire perimeters, fetched when switched on; off by default |
177-
| Sites | OSM + Overture + Recreation.gov RIDB (+ WA DNR) | Camping/RV/dump/water/trailheads — all 50 states, lazy-loaded per state |
178+
| Sites | OSM + Overture + Recreation.gov RIDB (+ WA DNR, + BC Recreation Sites) | Camping/RV/dump/water/trailheads — all 50 US states and all 13 Canadian provinces/territories, lazy-loaded per region |
178179
| Community spots | In-app traveler reports (`worker/` → nightly merge) | Amber-ringed dots in the Sites layer; check-in validated, unverified → verified |
179-
| Boondock Zones β | Derived from USFS ownership + MVUM roads (`data-pipeline/`) | Heuristic dispersed-camping likelihood polygons, slope-graded — national (empty where no MVUM data exists) |
180+
| Boondock Zones β | Derived from USFS ownership + MVUM roads (`data-pipeline/`) | Heuristic dispersed-camping likelihood polygons, slope-graded — US only (empty where no MVUM data exists; no Canadian equivalent, as the inputs are USFS datasets) |
180181
| Names & Labels | ESRI World Boundaries & Places | Mainly for Satellite |
181182
| Public Land | BLM Surface Management Agency | Who manages each parcel |
182183
| Topo Overlay | USGS National Map | Contours + elevation figures blended over any base |

VISION.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,9 @@ ship date already stated in the row text.
168168
| 138 | The Overture release the pipeline pins no longer exists upstream | 2026-08-22 | | ⬜ **Found 2026-08-22 by listing the bucket.** `data-pipeline/README.md`'s national places query and `ATTRIBUTION.md` both name release **2026-06-17.0**; that prefix now returns **KeyCount 0**. Overture keeps only recent releases — as of today the bucket holds exactly two, `2026-07-22.0` and `2026-08-19.0`. So the documented rebuild recipe **would fail if run today**, which is precisely the failure mode the standing 'treat public datasets as at risk' rule exists to catch, on a source we never registered in `upstream_sources.json`. Two follow-ons: the **schema has moved** (2026-08-19.0 adds `brand`, `basic_category`, `taxonomy`, `operating_status`, and parquet leaf names are unqualified — `bbox.xmin` is reachable via `ColumnSchema.path`, not `path_in_schema`), and a source dataset **`BrightQuery`** appears in the data that `ATTRIBUTION.md` does not list, so its licence needs reading before anything derived from it ships. `ATTRIBUTION.md`'s citation of 2026-06-17.0 stays correct as a record of what the shipped data was built from — the problem is the *rebuild* path, not the history |
169169
| 139 | Sight a point through the camera — photograph a mountain (or aim the phone live), mark a feature you can see (a forest road cut, a meadow, a saddle), and the app estimates where that point sits on the map | 2026-09-03 | | 🟡 **Live crosshair sighting built + verified end-to-end in the real app 2026-09-03; iPhone confirmation pending.** Camera mode and a manual mode (typed *true* bearing + pitch — the paper-map/desktop path) from the toolbar crosshair. New `shared/geomag.js`: the full WMM2025 spherical-harmonic synthesis with the official NOAA/NCEI+BGS coefficients embedded (public domain; registered in `upstream_sources.json`, backup committed to `data-pipeline/backups/`), **pinned against all 12 official NOAA test rows to 0.1 nT and 0.01°** — so the magnetic→true correction row 132 left unmodelled is now computed, and printed in the view. `shared/sight.js` marches the ray through the terrarium DEM with the ridgeline scan's own curvature+refraction constant, bisects the crossing to ~15 m, counts DEM gaps out loud (a missing tile can hide a nearer ridge), and `sightFix` re-marches at the sensor-error edges so the map draws the **strip of ground the aim error actually spans** — honestly miles long on a grazing hit, and flagged — never just a pin. Calibration in three layers: WMM (automatic), **Align on the sun** (the sun's true bearing is known everywhere via `sun.js`, so one tap measures declination residue plus the truck's magnetism together; assumed ±3° raw, ±1.5° aligned), and a persisted manual trim. `sight.test.mjs` pins the march against synthetic DEMs with independent closed-form solutions (flat-plain quadratic with curvature, cliff face, sky miss, gap flags, fan corners vs `destination()`, grazing slope, frame inversion). **Verified by driving the real app** — headless Brave, stubbed GPS + orientation events, real AWS tiles, Cascades near Broken Top — **24/24 checks**: the hit lands on the typed bearing to 0.00°, pitch geometry closes to 0.08° against an *independent* in-harness tile reader, the camera path (magnetic 300° reads **314.0° true, +14.0°** on screen) lands within rounding of the manual path on the same line, and the chip → waypoint save carries full provenance (where from, bearing, pitch, distance) into the notes. *Traps recorded:* the DEM is the precision floor (~50–75 m pixels at z11, and hits land on data edges by construction, so elevations are one-pixel granular); a test harness must never `.remove()` React-managed nodes (crashes the reconciler — cost one debugging round); and from a hillside a −1° ray honestly lands ~100 m out, so self-hits are physics, not bugs. **Needs the actual iPhone** (row 132's open question, doubly): `webkitCompassHeading` with the phone upright, the landscape sign, and a real sun alignment outdoors. Guide got a Sight tab; WMM credited in README + Credits. Photo-after-the-fact and skyline-match refinement remain the v2/v3 stages |
170170
| 140 | Sighting: zoom the camera in on an area to aim precisely, and reach farther than 15 mi | 2026-09-03 | 2026-09-03 | 🟡 **built same day, deployed with row 139's follow-up; iPhone confirm rides with row 139.** *Zoom:* pinch anywhere on the camera stage for continuous 1–8×, or tap the zoom pill to cycle 1→2→4→8×. It is a **pure aiming aid** — the crosshair is the centre of projection, so magnifying the view around it changes no geometry; implemented as a centred CSS scale on the video (works on every device; no dependence on flaky native zoom constraints). *Range:* the march cap rises 25 km → **100 km (62 mi)**, with the step ladder extended (50 m to 5 km, 100 m to 12 km, 150 m to 40 km, 250 m beyond) and `MAX_SIGHT_M` exported so the UI copy can never drift from the engine. Cost is honest: the march still stops at first strike, so only sky-aims and the far uncertainty ray walk the full 100 km (~600 samples, a dozen-odd z11 tiles). New closed-form test pins a 3,000 m wall at 80 km through 437 m of curvature drop. *Recorded limit:* beyond 12 km the step (150–250 m) can stride over a spine narrower than the step, on top of the DEM's own 50–75 m pixel — a distant thin ridge can be overshot, which the Guide now says |
171+
| 141 | Make the app work in Canada and Alaska | 2026-09-05 | 2026-09-05 | 🟡 **built + verified by driving the real app 2026-09-05; not yet deployed.** *Alaska was nearly there already and had two specific holes.* Its sites (1,204) and zones (230) always existed and load; MVUM, trails and RoadCore PMTiles reach it (headless run: Tongass **923 trail + 25 MVUM features** rendered at Juneau, Chugach 36 + 8 at Anchorage). What was broken was **satellite**: USGS orthoimagery has a hole at **z9–z11 over mainland Alaska** — Denali, Fairbanks, Anchorage and Kenai all 404 at exactly those three zooms while z8 and z12 return imagery; Juneau and CONUS are fine. *Canada had nothing.* USGS answers Canadian tiles **200 with an opaque solid-white PNG** (2,419 bytes, one colour, byte-identical at Banff/Whistler/Whitehorse/northern Ontario/Mexico), so it was not even a blank to fall through — it was white paint. **Both fixed by one mechanism:** a base layer may now declare an `underlay`, and Satellite draws **Sentinel-2 cloudless 2024** (EOX) beneath USGS, with the tile protocol swapping that known white placeholder for a transparent tile by length-then-SHA-256 match. No per-region branching — the holes fill themselves. Banff went **100% white → 0% white / 730 colours**; Denali renders the icefield; Seattle still shows sharp USGS on top. **New Canada Topo base** from NRCan's Canada Base Map (CBMT geometry + a separate labels cache, Web Mercator), which drove a `companions` mechanism in the pack downloader so a Canadian offline pack saves its place names too, hidden from the pack list and cascade-deleted. Capped at **z15**, its real cache ceiling — the service advertises LOD 0–23 and 404s above 15. **Sites: 15,985 across all 13 provinces and territories** (13,012 campsites, 1,451 RV parks, 748 trailheads, 535 dumps, 239 water; +3.6 MB), taking the database to **109,893**. BC leads with **4,157**, including **649 BC Recreation Sites** from the province's own register — the Canadian counterpart to RIDB and where most free Crown-land camping is; its cards now carry camp-site count, driving directions and a red **closure** banner (58 sites). `fetch_canada.py` is new; `build_spots.py` made Overture/RIDB optional (neither applies outside the US). **Boondock Zones do not exist in Canada and won't** — they are derived from USFS ownership + MVUM roads; the loader now treats a missing zones file as "no zones here" rather than failing the whole region, which otherwise meant no Canadian sites loaded at all. *Three traps recorded, each caught only by checking.* **(1)** `s2cloudless-2017` is advertised CC BY 4.0 and looks like the free-licence win, but **serves empty 116-byte tiles** — do not "upgrade" to it. **(2)** Overpass `area["ISO3166-2"]` **504s** on provinces this size, so extracts are by bounding box — and `load_osm` never clipped, because US extracts were area-scoped and did not need it. Unclipped, **BC carried 6,390 features of which 2,233 were Alberta's, Washington's and Yukon's**; `--clip-osm` fixed it (NT 224→57). **(3)** NRCan's z16+ 404s, above. Also: BC's driving-direction text arrives with leading whitespace (399 records), CRLFs and hard mid-word truncation, so the pipeline now normalises and cuts at sentence boundaries. **Licence, Tim's call 2026-09-05:** the 2024 imagery is **CC BY-NC-SA 4.0** and that is accepted — the app is free and GPL, so NonCommercial holds, and the 2016 CC BY mosaic was too old for reading ground cover. Credit is carried on the map, in the Guide, in ATTRIBUTION.md and on the offline pack; **this is the one dependency to revisit if Boondock Map ever goes commercial**, with `s2cloudless_3857` as the CC BY fallback. All four new services registered in `upstream_sources.json` (BC's WFS export backed up to `data-pipeline/backups/`, 547 KB gzipped) and `check_upstream.py` taught two new probe modes so the weekly report is green rather than crying wolf. Guide, README, ATTRIBUTION and the region-bounds header all updated. **Still open:** BC forest service roads — the WFS returns real data but the **WMS renders fully transparent PNGs even in its own CRS and bbox**, so a live overlay is not possible; it needs a PMTiles build like RoadCore (row 78 territory). Routing has no Canadian graph, so "Drive me there" simply is not offered there. The app is entirely imperial in a metric country — row 143. Not yet confirmed on a phone. |
172+
| 142 | Topo Lines has a dead band from about z11 to z12.4 (found while verifying row 141) | 2026-09-05 | | ⬜ **Not fixed — reporting rather than widening row 141's scope.** The `contours` overlay is built from three windows; the middle one (`coarse`, USGS sublayers 10,11) is declared `sourceMinzoom: 10, sourceMaxzoom: 14`, but the service only renders those sublayers **at z10**. Verified 2026-09-05 against the open-ocean blank-tile signature (2,231 B, md5 44bacd5d63): Cascades WA, Sierra CA, Rockies CO and Ozarks AR each return 75–144 KB at z10 and exactly the blank tile at z11, z12 and z13. Because the fade window runs 10.5→12.9 and `fine` does not come up until 12.4, a user zooming through roughly **z11–z12.4 sees no contour lines at all**. This is a US-wide defect in the shipped app, not something row 141 introduced. **Likely one-line fix:** set the `coarse` part's `sourceMaxzoom` to 10 so MapLibre overzooms the z10 tiles that do render across the fade window, instead of requesting z11+ tiles that come back empty. Not applied — it wants its own eyeball test in steep country, since overzoomed contour labels may read badly. |
173+
| 143 | Metric units for Canada (and anyone who wants them) | 2026-09-05 | |**Raised while doing row 141, not part of it.** The app is entirely imperial — feet and miles — which is the wrong default in the country row 141 just added. Not a quick toggle: `elev_ft` is baked into the **sites data schema** (every feature in all 63 region files), and there are ~59 `ft`/`mi` literals across the renderer plus conversions in `geo.js`, `router.js`, `sight.js`, `routeGraph.js`, `boondockStyle.js` (peak labels), `Sight.jsx`, `Sidebar.jsx`, `LiveReadout.jsx` and `App.jsx`. Doing it properly means one formatting helper (`fmtDist`, `fmtElev`) that every call site routes through, a persisted preference next to the appearance setting, and leaving the data in feet while converting at display time — rebuilding 63 files to change units would be the wrong move. Worth doing, and worth doing as its own piece of work. |
171174

172175
Guiding scope (Tim, 2026-07-11): replicate the useful features of Campendium +
173176
iOverlander (spot database, amenities, reviews) and Gaia GPS (maps, tracks,

0 commit comments

Comments
 (0)