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:
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