From 34b41fd5b6df5b685e69482d9b74ff00528641db Mon Sep 17 00:00:00 2001 From: h4badger <204420093+h4badger@users.noreply.github.com> Date: Wed, 2 Sep 2026 02:07:13 -0700 Subject: [PATCH] Add topographic map layers (#1891) This adds two optional map tile providers: - OpenTopoMap - USGS They are disabled by default, but can be quite useful for visualizing repeater sites with terrain features visible. --- config.example.json | 8 ++++++++ public/map-tile-providers.js | 7 +++++++ 2 files changed, 15 insertions(+) diff --git a/config.example.json b/config.example.json index 5d7ff0f9..ac8d971c 100644 --- a/config.example.json +++ b/config.example.json @@ -90,10 +90,18 @@ "provider": "", "token": "" }, + "_comment_opentopomap": "OpenTopoMap topographical tile provider. Limited to zoom level 17.", + "opentopomap": { + "enabled": false + }, "_comment_stamen": "Stamen (hosted by Stadia). WARNING: Tokens are sent to the browser. Apply origin/referrer restrictions.", "stamen": { "enabled": false, "token": "" + }, + "_comment_usgs": "USGS topographical tile provider. Limited to zoom level 16.", + "usgs": { + "enabled": false } } } diff --git a/public/map-tile-providers.js b/public/map-tile-providers.js index 71fb5a7d..aadff608 100644 --- a/public/map-tile-providers.js +++ b/public/map-tile-providers.js @@ -57,8 +57,11 @@ 'positron-dark': { provider: 'carto', label: 'Carto Positron', url: function() { return _getCartoBase() + '/light_all/{z}/{x}/{y}{r}.png' + _getCartoKey(); }, invertFilter: INVERT_CSS, type: 'dark', attribution: '© OpenStreetMap © CartoDB', maxZoom: 19 }, 'osm-standard': { provider: 'osm', label: 'OSM Standard', url: _getOsmUrl, invertFilter: null, type: 'light', attribution: '© OpenStreetMap contributors, Maps © Mapbox/Thunderforest/MapTiler', maxZoom: 18 }, 'osm-dark': { provider: 'osm', label: 'OSM Standard', url: _getOsmUrl, invertFilter: INVERT_CSS, type: 'dark', attribution: '© OpenStreetMap contributors, Maps © Mapbox/Thunderforest/MapTiler', maxZoom: 18 }, + 'opentopomap': { provider: 'opentopomap', label: 'OpenTopoMap', url: function() { return 'https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png'; }, invertFilter: null, type: 'light', attribution: '© OpenStreetMap contributors, SRTM, © OpenTopoMap (CC-BY-SA)', maxZoom: 17 }, 'stamen-toner-lite': { provider: 'stamen', label: 'Stamen Toner Lite', url: _getStamenUrl, invertFilter: null, type: 'light', attribution: '© Stadia Maps © Stamen Design © OpenStreetMap', maxZoom: 20 }, 'stamen-toner-dark': { provider: 'stamen', label: 'Stamen Toner Lite', url: _getStamenUrl, invertFilter: INVERT_CSS, type: 'dark', attribution: '© Stadia Maps © Stamen Design © OpenStreetMap', maxZoom: 20 }, + 'usgs-topo': { provider: 'usgs', label: 'USGS Topographic', url: function() { return 'https://basemap.nationalmap.gov/arcgis/rest/services/USGSTopo/MapServer/tile/{z}/{y}/{x}'; }, invertFilter: null, type: 'light', attribution: 'U.S. Geological Survey, National Geospatial Program', maxZoom: 16 }, + 'usgs-imagery': { provider: 'usgs', label: 'USGS Imagery', url: function() { return 'https://basemap.nationalmap.gov/arcgis/rest/services/USGSImageryTopo/MapServer/tile/{z}/{y}/{x}'; }, invertFilter: null, type: 'light', attribution: 'U.S. Geological Survey, National Geospatial Program', maxZoom: 16 }, 'esri-darkgray-labels': { provider: 'esri', label: 'Esri Dark Gray Canvas', url: function() { return 'https://server.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Dark_Gray_Base/MapServer/tile/{z}/{y}/{x}'; }, invertFilter: null, type: 'dark', attribution: 'Tiles © Esri', maxZoom: 19 } }; @@ -73,6 +76,8 @@ var HAS_CARTO = !_cfg || !_cfg.providers || !_cfg.providers.carto || _cfg.providers.carto.enabled !== false; var HAS_OSM = _cfg && _cfg.providers && _cfg.providers.osm && _cfg.providers.osm.enabled; + var HAS_OPENTOPOMAP = _cfg && _cfg.providers && _cfg.providers.opentopomap && _cfg.providers.opentopomap.enabled; + var HAS_USGS = _cfg && _cfg.providers && _cfg.providers.usgs && _cfg.providers.usgs.enabled; var HAS_STAMEN = _cfg && _cfg.providers && _cfg.providers.stamen && _cfg.providers.stamen.enabled && !!_cfg.providers.stamen.token; var HAS_ESRI = true; // Kept for backwards compatibility @@ -81,7 +86,9 @@ var style = BASE_STYLES[key]; if (style.provider === 'carto' && HAS_CARTO) REGISTRY[key] = style; if (style.provider === 'osm' && HAS_OSM) REGISTRY[key] = style; + if (style.provider === 'opentopomap' && HAS_OPENTOPOMAP) REGISTRY[key] = style; if (style.provider === 'stamen' && HAS_STAMEN) REGISTRY[key] = style; + if (style.provider === 'usgs' && HAS_USGS) REGISTRY[key] = style; if (style.provider === 'esri' && HAS_ESRI) REGISTRY[key] = style; }