feat(cctv): add Houston TranStar camera pack

Register the keyless TranStar snapshot catalog as a live CCTV source,
synthesize frame URLs from validated numeric camera ids, and keep the
nearest cameras to Houston's metro cores under the existing catalog ceiling.
This commit is contained in:
Matt Van Horn authored and Matt Van Horn committed 2026-10-16 18:26:01 -07:00
1 parent 1df2a272cf
commit 052435473e
12 files changed
+613 -2

No files matched your search

+18 -1
View File
@@ -1072,6 +1072,23 @@ By default the 250 cameras nearest downtown Vancouver and Victoria load.
The Open Government Licence – British Columbia attribution is registered in the
Data attribution popover.
## Houston TranStar CCTV source pack
The CCTV catalog adds Greater Houston traffic cameras from Houston TranStar
alongside the other live packs. The server reads the keyless camera list at
`https://traffic.houstontranstar.org/data/layers/cctvSnapshots_json.js` and
keeps cameras with a numeric snapshot id inside the metro bounding box. Frame
URLs are built from each camera id under
`https://www.houstontranstar.org/snapshots/cctv/<id>.jpg`; they are never taken
from the payload. Dedicated `dir` values become high-confidence headings;
`None` uses the shared id-hash fallback at low confidence.
By default the 250 cameras nearest downtown, Uptown, the Medical Center, IAH
and Galveston load. `CCTV_HOUSTON_MAX_SOURCES` sets the pack cap (8–400) and
`CCTV_HOUSTON_ENABLED=0` turns the pack off. The catalog-wide ceiling stays at
4,000 and is shared round-robin, so adding this pack does not silently drop
another region.
## Location control ownership
City/POI rows, search/reset bindings, location readouts and the orbit indicator
@@ -3366,7 +3383,7 @@ its criteria cannot be silently ignored.
| Satellites | CelesTrak | `src/data/satellites.js` | `/api/celestrak` | 120s |
| Space Missions (30d) | Launch Library 2 + CelesTrak | `src/data/rocketLaunches.js` | `/api/launches` + `/api/celestrak/active` | 5 min |
| Traffic | Selectable TomTom / OpenStreetMap / Hybrid roads; optional TomTom flow (BYOK) | `src/data/traffic.js` | browser-direct OpenFreeMap tiles; `/api/tomtom` for flow | viewport-driven; capped tile cache |
| CCTV | Austin + Caltrans (CA) + TfL London + Ontario 511 + Fintraffic (FI) + DriveBC (BC) + TxDOT (TX) + Estonia (Tallinn, Tarktee) + Live Traffic NSW + Open Calgary Open Data + Statens vegvesen (NO, stills + live HLS) + King County (WA) Open Data + WSDOT (WA) Open Data + NYC DOT TMC (opt-in) + City of Toronto RESCU + Catalonia (Servei Català de Trànsit) + Street View fallback | `src/data/cctv.js` | `/api/cctv` | 10s (active) |
| CCTV | Austin + Caltrans (CA) + TfL London + Ontario 511 + Fintraffic (FI) + DriveBC (BC) + TxDOT (TX) + Estonia (Tallinn, Tarktee) + Live Traffic NSW + Open Calgary Open Data + Statens vegvesen (NO, stills + live HLS) + King County (WA) Open Data + WSDOT (WA) Open Data + NYC DOT TMC (opt-in) + City of Toronto RESCU + Catalonia (Servei Català de Trànsit) + Houston TranStar + Street View fallback | `src/data/cctv.js` | `/api/cctv` | 10s (active) |
| Radio | Radio Browser (public-domain station directory) | `src/data/radio.js` | `/api/radio/stations`, `/api/radio/click/:uuid` | 45 min directory refresh |
| Transit 🚌 | Operator GTFS-Realtime VehiclePositions (7 keyless regions, `src/data/transitFeeds.js`) | `src/layers/transit/` via `src/app/layers/transit.js` | `/api/transit` | 15s (poll + delayed playback) |
| Bikeshare 🚲 | GBFS (Lyft + BCycle + Social Bicycles + PBSC incl. Bike Share Toronto, Bike Itaú (Brazil) and Bicing (Barcelona) + Urban Sharing, Entur, JCDecaux NO + nextbike (AMBici)) | `src/data/bikeshare.js` | `/api/gbfs` | 60s |