nakarte

Source code of https://map.sikmir.ru (fork)
git clone git://git.sikmir.ru/nakarte
Log | Files | Refs | LICENSE

commit 9cbc6a3f564907661cd277d193cc0f8c41445c8e
parent f8403411461084cf352c1e983060d2fce9cdbc05
Author: Sergej Orlov <wladimirych@gmail.com>
Date:   Wed,  4 Jul 2018 16:43:45 +0300

[layers] refactoring: group layares using separate groups definitions

Diffstat:
Msrc/layers.js | 254+++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------
1 file changed, 176 insertions(+), 78 deletions(-)

diff --git a/src/layers.js b/src/layers.js @@ -13,9 +13,6 @@ import {StravaHeatmap} from 'lib/leaflet.layer.strava-heatmap'; export default function getLayers() { const layers = [ - { - group: 'Default layers', - layers: [ { title: 'OpenStreetMap', description: 'OSM default style', @@ -403,11 +400,6 @@ export default function getLayers() { } }) }, - ] - }, - { - group: 'OpenStreetMap alternatives', - layers: [ { title: 'OpenTopoMap', isDefault: false, @@ -453,11 +445,6 @@ export default function getLayers() { } ) }, - ] - }, - { - group: 'Topo maps', - layers: [ { title: 'Eurasia 25km', description: '1975-80', @@ -544,12 +531,7 @@ export default function getLayers() { shortName: 'montenegro_250' } ) - } - ] - }, - { - group: 'Mountains maps', - layers: [ + }, { title: 'Mountains by Aleksey Tsvetkov', description: 'Tian Shan, Dzungaria, <a href="http://pereval.g-utka.ru/">http://pereval.g-utka.ru/</a>', @@ -571,11 +553,7 @@ export default function getLayers() { shortName: 'tsvetkov_mountains' } ) - }] - }, - { - group: 'Miscellaneous', - layers: [ + }, { title: 'Bing imagery acquisition dates', isDefault: false, @@ -744,12 +722,6 @@ export default function getLayers() { } ) }, - ] - }, - - { - group: 'Norway <a href="https://www.ut.no/kart/">https://www.ut.no/kart/</a>', - layers: [ { // Вместо 404 отдают 500 для отсутствующих тайлов title: 'Norway UT map', @@ -852,11 +824,7 @@ export default function getLayers() { shortName: 'norway_roads' } ) - }] - }, - { - group: 'Czech <a href="https://mapy.cz">https://mapy.cz</a>', - layers: [ + }, { title: 'Czech base', isDefault: false, @@ -936,10 +904,96 @@ export default function getLayers() { shortName: 'czech_geo' } ) - }] - } + } ]; + const groupsDefs = [ + { + title: 'Default layers', + layers: [ + 'OpenStreetMap', + 'ESRI Sat', + 'Yandex map', + 'Yandex Satellite', + 'Google', + 'Google Satellite', + 'Google Terrain', + 'Bing Sat', + 'marshruty.ru', + 'Topomapper 1km', + 'Topo 10km', + 'GGC 2 km', + 'ArbaletMO', + 'Slazav mountains', + 'GGC 1km', + 'Topo 1km', + 'GGC 500m', + 'Topo 500m', + 'GGC 250m', + 'Slazav map', + 'Races', + 'O-sport', + 'Soviet topo maps grid', + 'Wikimapia', + 'Mountain passes (Westra)' + ], + }, + { + title: 'OpenStreetMap alternatives', + layers: [ + 'OpenTopoMap', + 'OpenCycleMap', + 'OSM Outdoors'], + }, + { + title: 'Topo maps', + layers: [ + 'Eurasia 25km', + 'Caucasus 1km', + 'Caucasus 500m', + 'Topo 250m', + 'Montenegro topo 250m'], + }, + { + title: 'Mountains maps', + layers: ['Mountains by Aleksey Tsvetkov'], + }, + { + title: 'Miscellaneous', + layers: ['Bing imagery acquisition dates', + 'geocaching.su', + 'OpenStreetMap GPS traces', + 'Strava heatmap (all)', + 'Strava heatmap (run)', + 'Strava heatmap (ride)', + 'Strava heatmap (winter)', + 'Strava heatmap lowres (all)', + 'Strava heatmap lowres (run)', + 'Strava heatmap lowres (ride)', + 'Strava heatmap lowres (winter)'], + + }, + { + title: 'Norway <a href="https://www.ut.no/kart/">https://www.ut.no/kart/</a>', + layers: ['Norway UT map', + 'Norway paper map', + 'Norway map', + 'Norway summer trails', + 'Norway winter trails', + 'Norway roads'], + + }, + { + title: 'Czech <a href="https://mapy.cz">https://mapy.cz</a>', + layers: ['Czech base', + 'Czech tourist', + 'Czech summer', + 'Czech winter', + 'Czech geographical'], + + }]; + + const titlesByOrder = [ // common base layers "OpenStreetMap", @@ -1008,69 +1062,113 @@ export default function getLayers() { "geocaching.su", ]; + // assign order to layers const orderByTitle = {}; for (let i=0; i < titlesByOrder.length; i++) { const title = titlesByOrder[i]; orderByTitle[title] = i + 1; } - for (let group of layers) { - for (let layer of group.layers) { - const title = layer.title; - layer.order = orderByTitle[title]; - if (!layer.order) { - throw new Error(`Layer title not found in titlesByOrder list: ${title}`) + for (let layer of layers) { + const title = layer.title; + layer.order = orderByTitle[title]; + if (!layer.order) { + throw new Error(`Layer title not found in titlesByOrder list: ${title}`) + } + } + + // divide layers by groups + const grouppedLayers = []; + const layersByTitle = {}; + for (let layer of layers) { + layersByTitle[layer.title] = layer; + } + for (let groupDef of groupsDefs) { + let group = {group: groupDef.title, layers: []}; + grouppedLayers.push(group); + for (let title of groupDef.layers) { + let layer = layersByTitle[title]; + if (!layer) { + throw new Error(`Unknown layer in groups definitions: ${title}`) } + group.layers.push(layer); } } + // TODO: move it to tests const codes = new Set(); const titles = new Set(); const shortNames = new Set(); - for (let group of layers) { - for (let layer of group.layers) { - const {title, layer: {options}} = layer; - if (!options) { - throw new Error(`Layer without options: ${layer.title}`); - } - if (titles.has(title)) { - throw new Error(`Duplicate layer title "${title}"`); - } - titles.add(title); - const { - code, - shortName, - print, - isOverlay, - isOverlayTransparent - } = options; - if (!code) { - throw new Error('Layer without code: ' + layer.title); + for (let layer of layers) { + const {title, layer: {options}} = layer; + if (!options) { + throw new Error(`Layer without options: ${layer.title}`); + } + if (titles.has(title)) { + throw new Error(`Duplicate layer title "${title}"`); + } + titles.add(title); + const { + code, + shortName, + print, + isOverlay, + isOverlayTransparent + } = options; + if (!code) { + throw new Error('Layer without code: ' + layer.title); + } + if (codes.has(code)) { + throw new Error(`Duplicate layer code "${code}"`); + } + codes.add(code); + + if (print) { + if (isOverlay && (isOverlayTransparent === undefined)) { + throw new Error('Overlay layer without isOverlayTransparent: ' + layer.title); } - if (codes.has(code)) { - throw new Error(`Duplicate layer code "${code}"`); + if (!shortName) { + throw new Error('Layer without shortName: ' + layer.title); } - codes.add(code); - - if (print) { - if (isOverlay && (isOverlayTransparent === undefined)) { - throw new Error('Overlay layer without isOverlayTransparent: ' + layer.title); - } - if (!shortName) { - throw new Error('Layer without shortName: ' + layer.title); - } - if (shortNames.has(shortName)) { - throw new Error(`Duplicate layer shortName "${shortName}"`); - } - shortNames.add(shortName); + if (shortNames.has(shortName)) { + throw new Error(`Duplicate layer shortName: "${shortName}"`); } + shortNames.add(shortName); } } + + // check order definition + let seenOverlay = false; for (let title of titlesByOrder) { if (!titles.has(title)) { throw new Error(`Unknown layer title in order list: ${title}`); } + let isOverlay = layersByTitle[title]; + if (isOverlay) { + seenOverlay = true; + } else { + if (seenOverlay) { + throw new Error(`Base layer after overlays: ${title}`); + } + } } - return layers; + // check groups definitions + const seenLayerTitles = new Set(); + for (let group of groupsDefs) { + for (let title of group.layers) { + if (seenLayerTitles.has(title)) { + throw new Error(`Duplicate layer in groups definition: ${title}`) + } + seenLayerTitles.add(title); + } + } + // unknown layers in groupsDefs already checked, check only that all layers assigned to groups + for (let title of titles) { + if (!seenLayerTitles.has(title)) { + throw new Error(`Layer not assigned to any group: ${title}`); + } + } + + return grouppedLayers; }