nakarte

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

commit 22ef619a4cfe5049fd442b1be4d0c95eca409c98
parent 572b840e2772ced155f5c8bb16fe8b265bb9c9df
Author: Sergej Orlov <wladimirych@gmail.com>
Date:   Thu,  8 Dec 2016 22:24:56 +0300

[configure layers] added Norway maps with baat token

Diffstat:
Msrc/layers.js | 90++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------------
Asrc/lib/leaflet.layer.nordeskart/norderskart.js | 89+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/lib/notifications/notifications.js | 11++++++++---
3 files changed, 154 insertions(+), 36 deletions(-)

diff --git a/src/layers.js b/src/layers.js @@ -5,6 +5,7 @@ import 'lib/leaflet.layer.bing/bing'; import config from './config'; import 'lib/leaflet.layer.soviet-topomaps-grid/soviet-topomaps-grid'; import 'lib/leaflet.layer.westraPasses/westraPasses'; +import 'lib/leaflet.layer.nordeskart/norderskart'; export default function getLayers() { const layers = [ @@ -279,7 +280,7 @@ export default function getLayers() { layers: [ { // Вместо 404 отдают 500 для отсутствующих тайлов - title: 'UT map', + title: 'Norway UT map', order: 500, isOverlay: false, isDefault: false, @@ -287,30 +288,52 @@ export default function getLayers() { {code: 'Nu', tms: false, maxNativeZoom: 16, print: true, jnx: true, scaleDependent: true} ) }, - // { - // title: '', - // order: 0, - // isOverlay: true, - // isDefault: false, - // layer: null - // }, - // { - // title: '', - // order: 0, - // isOverlay: true, - // isDefault: false, - // layer: null - // }, + { + title: 'Norway paper map', + order: 1031, + isOverlay: true, + isDefault: false, + layer: new L.TileLayer.Nordeskart('http://opencache.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=toporaster3&zoom={z}&x={x}&y={y}&gkt={baatToken}', + {code: 'Np', maxNativeZoom: 16, tms: false, print: true, jnx: true, scaleDependent: true} + ) + }, + { + title: 'Norway map', + order: 1032, + isOverlay: true, + isDefault: false, + layer: new L.TileLayer.Nordeskart('http://opencache.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=topo2&zoom={z}&x={x}&y={y}&gkt={baatToken}', + {code: 'Nm', tms: false, print: true, jnx: true, scaleDependent: true} + ) + }, + { + title: 'Norway summer trails', + order: 2000, + isOverlay: true, + isDefault: false, + layer: L.tileLayer("http://dntutnotilesprod.cloudapp.net/tilestache/dnt_sommer/{z}/{x}/{y}.png", + {code: 'Ns', tms: false, print: true, jnx: true, scaleDependent: true} + ) + }, + { + title: 'Norway winter trails', + order: 2001, + isOverlay: true, + isDefault: false, + layer: L.tileLayer("http://dntutnotilesprod.cloudapp.net/tilestache/dnt_vinter/{z}/{x}/{y}.png", + {code: 'Nw', tms: false, print: true, jnx: true, scaleDependent: true} + ) + }, { // Вместо 404 отдают 500 для отсутствующих тайлов title: 'Norway roads', - order: 500, + description: '<a href="http://kart.finn.no/">http://kart.finn.no/</a>', + order: 503, isOverlay: false, isDefault: false, layer: L.tileLayer("http://maptiles1.finncdn.no/tileService/1.0.3/normap/{z}/{x}/{y}.png", {code: 'Nr', tms: false, print: true, jnx: true, scaleDependent: true} ) - }] }, { @@ -318,7 +341,7 @@ export default function getLayers() { layers: [ { title: 'Czech basic', - order: 501, + order: 504, isOverlay: false, isDefault: false, layer: L.tileLayer("https://m{s}.mapserver.mapy.cz/base-m/{z}-{x}-{y}", @@ -327,7 +350,7 @@ export default function getLayers() { }, { title: 'Czhch tourist', - order: 502, + order: 505, isOverlay: false, isDefault: false, layer: L.tileLayer("https://m{s}.mapserver.mapy.cz/wturist-m/{z}-{x}-{y}", @@ -336,7 +359,7 @@ export default function getLayers() { }, { title: 'Czech summer', - order: 503, + order: 506, isOverlay: false, isDefault: false, layer: L.tileLayer("https://m{s}.mapserver.mapy.cz/turist_aquatic-m/{z}-{x}-{y}", @@ -345,7 +368,7 @@ export default function getLayers() { }, { title: 'Czech winter', - order: 504, + order: 507, isOverlay: false, isDefault: false, layer: L.tileLayer("https://m{s}.mapserver.mapy.cz/wturist_winter-m/{z}-{x}-{y}", @@ -354,31 +377,24 @@ export default function getLayers() { }, { title: 'Czech geographical', - order: 505, + order: 508, isOverlay: false, isDefault: false, layer: L.tileLayer("https://m{s}.mapserver.mapy.cz/zemepis-m/{z}-{x}-{y}", {code: 'Czg', tms: false, print: true, jnx: true, subdomains: '1234', scaleDependent: true} ) }] - }, - // { - // title: '', - // order: 0, - // isOverlay: true, - // isDefault: false, - // layer: null - // }, + } ]; // TODO: move it to tests const codes = {}; + const orders = {}; for (let group of layers) { for (let layer of group.layers) { - layer = layer.layer; - if (!layer.options) { + if (!layer.layer.options) { throw new Error('Layer without options: ' + layer.title); } - let code = layer.options.code; + let code = layer.layer.options.code; if (!code) { throw new Error('Layer without code: ' + layer.title); } @@ -386,6 +402,14 @@ export default function getLayers() { throw new Error(`Duplicate layer code "${code}"`); } codes[code] = 1; + let order = layer.order; + if (!order) { + throw new Error('Layer without order: ' + layer.title); + } + if (order in orders) { + throw new Error(`Duplicate layer order "${order}"`); + } + orders[order] = 1; } } return layers; diff --git a/src/lib/leaflet.layer.nordeskart/norderskart.js b/src/lib/leaflet.layer.nordeskart/norderskart.js @@ -0,0 +1,89 @@ +import L from 'leaflet'; +import {fetch} from 'lib/xhr-promise/xhr-promise'; +import {formatXhrError, notify} from 'lib/notifications/notifications'; + +function parseResponse(s) { + let data; + try { + data = JSON.parse(s); + } catch (e) { + throw new Error('invalid JSON'); + } + if (!data.token) { + throw new Error('no token in response'); + } + return data.token; +} + +function getToken() { + return fetch('https://www.ut.no/kart/HentBaatToken/', {timeout: 10000}) + .then(function(xhr) { + try { + return {token: parseResponse(xhr.responseText)} + } catch (e) { + console.log(e); + return {error: 'Server returned invalid token for Norway map'} + } + }, + function(xhr) { + return {error: formatXhrError(xhr, 'token for Norway map')} + } + ); +} + +L.TileLayer.Nordeskart = L.TileLayer.extend({ + options: { + tokenUpdateInterval: 5 * 60 * 1000 + }, + + initialize: function(url, options) { + this.__url = url; + L.TileLayer.prototype.initialize.call(this, '', options); + }, + + baatTokenUpToDate: function() { + let nextUpdate = 0; + if (window.localStorage) { + nextUpdate = parseInt(localStorage.getItem('baatTokenNextUpdate'), 10) || 0; + } + return Date.now() < nextUpdate && localStorage.getItem('baatToken'); + }, + + storeBaatToken: function(token) { + if (window.localStorage) { + localStorage.setItem('baatToken', token); + localStorage.setItem('baatTokenNextUpdate', Date.now().toString() + this.options.tokenUpdateInterval); + } + }, + + periodicTokenUpdate: function() { + if (!this._map) { + return; + } + getToken().then((data) => { + if (data.error) { + notify(data.error); + } else { + if (data.token !== this.options.baatToken) { + this.options.baatToken = data.token; + if (!this._url) { + this.setUrl(this.__url); + } + } + this.storeBaatToken(data.token); + } + setTimeout(() => this.periodicTokenUpdate(), this.options.tokenUpdateInterval); + }); + }, + + onAdd: function(map) { + const token = this.baatTokenUpToDate(); + if (token) { + this.options.baatToken = token; + this.setUrl(this.__url); + } + this.periodicTokenUpdate(); + return L.TileLayer.prototype.onAdd.call(this, map); + } + } +); diff --git a/src/lib/notifications/notifications.js b/src/lib/notifications/notifications.js @@ -6,10 +6,15 @@ function prompt(message, value) { return window.prompt(message, value); } -function notifyXhrError(xhr, whatWasDownloading, level) { +function formatXhrError(xhr, whatWasDownloading) { const reason = xhr.status === 0 ? 'network error' : `server response is ${xhr.status}`; const message = `Failed to download ${whatWasDownloading}: ${reason}`; + return message; +} + +function notifyXhrError(xhr, whatWasDownloading, level) { + const message = formatXhrError(xhr, whatWasDownloading); notify(message, level); } -export {notify, prompt, notifyXhrError}; -\ No newline at end of file +export {notify, prompt, notifyXhrError, formatXhrError}; +\ No newline at end of file