Use layer id instead of name for hash
- to make it work across languages and on translation changes - with legacy support for old names
This commit is contained in:
parent
3d60b05422
commit
d60b1ad15f
4 changed files with 105 additions and 22 deletions
|
|
@ -12,6 +12,15 @@ BR.LayersConfig = L.Class.extend({
|
||||||
'Waymarked_Trails-Hiking'
|
'Waymarked_Trails-Hiking'
|
||||||
],
|
],
|
||||||
|
|
||||||
|
legacyNameToIdMap: {
|
||||||
|
'OpenStreetMap': 'standard',
|
||||||
|
'OpenStreetMap.de': 'osm-mapnik-german_style',
|
||||||
|
'OpenTopoMap': 'OpenTopoMap',
|
||||||
|
'Esri World Imagery': 'Esri.WorldImagery',
|
||||||
|
'Cycling (Waymarked Trails)': 'Waymarked_Trails-Cycling',
|
||||||
|
'Hiking (Waymarked Trails)': 'Waymarked_Trails-Hiking'
|
||||||
|
},
|
||||||
|
|
||||||
initialize: function (map) {
|
initialize: function (map) {
|
||||||
this._map = map;
|
this._map = map;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -33,18 +33,17 @@ BR.ControlLayers = L.Control.Layers.extend({
|
||||||
|
|
||||||
getLayer: function (name) {
|
getLayer: function (name) {
|
||||||
for (var i = 0; i < this._layers.length; i++) {
|
for (var i = 0; i < this._layers.length; i++) {
|
||||||
if (this._layers[i] && this._layers[i].name === name) {
|
var obj = this._layers[i];
|
||||||
return this._layers[i];
|
if (obj.name === name) {
|
||||||
}
|
return obj;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
},
|
},
|
||||||
|
|
||||||
activateLayer: function (name) {
|
activateLayer: function (layer) {
|
||||||
var obj = this.getLayer(name);
|
this._map.addLayer(layer);
|
||||||
if (obj) {
|
|
||||||
this._map.addLayer(obj.layer);
|
|
||||||
}
|
|
||||||
return obj;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
activateFirstLayer: function () {
|
activateFirstLayer: function () {
|
||||||
|
|
|
||||||
|
|
@ -293,6 +293,28 @@ BR.LayersTab = BR.ControlLayers.extend({
|
||||||
return layer;
|
return layer;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
getLayerById: function (id) {
|
||||||
|
for (var i = 0; i < this._layers.length; i++) {
|
||||||
|
var obj = this._layers[i];
|
||||||
|
if (obj.layer.id === id) {
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
|
||||||
|
getLayerByLegacyName: function (legacyName) {
|
||||||
|
var obj = null;
|
||||||
|
var id = this.layersConfig.legacyNameToIdMap[legacyName];
|
||||||
|
|
||||||
|
if (id) {
|
||||||
|
obj = this.getLayerById(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
},
|
||||||
|
|
||||||
saveRemoveActiveLayers: function () {
|
saveRemoveActiveLayers: function () {
|
||||||
this.saveLayers = this.removeActiveLayers();
|
this.saveLayers = this.removeActiveLayers();
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -85,12 +85,42 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_parseLayers: function (layersParam, layerSeparator) {
|
||||||
|
var layers = layersParam.split(layerSeparator).map(L.bind(function (layerEncoded) {
|
||||||
|
var obj = null;
|
||||||
|
var layerString = decodeURIComponent(layerEncoded);
|
||||||
|
|
||||||
|
if (layerString) {
|
||||||
|
obj = this._getLayerFromString(layerString);
|
||||||
|
}
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
}, this));
|
||||||
|
|
||||||
|
return layers;
|
||||||
|
},
|
||||||
|
|
||||||
parseLayers: function (layersParam) {
|
parseLayers: function (layersParam) {
|
||||||
// legacy support for '-' layer separator
|
var countFoundLayers = function (count, obj) {
|
||||||
var layerSeparator = layersParam.indexOf('-') !== -1 ? '-' : this.options.layerSeparator;
|
if (obj) {
|
||||||
var layers = layersParam.split(layerSeparator).map(function (layerEncoded) {
|
count++;
|
||||||
return decodeURIComponent(layerEncoded);
|
}
|
||||||
});
|
return count;
|
||||||
|
};
|
||||||
|
|
||||||
|
var layers = this._parseLayers(layersParam, this.options.layerSeparator);
|
||||||
|
var found = layers.reduce(countFoundLayers, 0);
|
||||||
|
|
||||||
|
if (found < layers.length) {
|
||||||
|
// legacy support for name instead of id and '-' layer separator
|
||||||
|
var layersLegacy = this._parseLayers(layersParam, '-');
|
||||||
|
var foundLegacy = layersLegacy.reduce(countFoundLayers, 0);
|
||||||
|
|
||||||
|
if (foundLegacy > found) {
|
||||||
|
layers = layersLegacy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return layers;
|
return layers;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
@ -100,13 +130,14 @@
|
||||||
|
|
||||||
layersControl.removeActiveLayers();
|
layersControl.removeActiveLayers();
|
||||||
|
|
||||||
layers.forEach(function(name, index, array) {
|
layers.forEach(L.bind(function(obj, index, array) {
|
||||||
if (!name) return;
|
if (obj) {
|
||||||
var obj = layersControl.activateLayer(name);
|
layersControl.activateLayer(obj.layer);
|
||||||
if (obj && !obj.overlay) {
|
if (obj && !obj.overlay) {
|
||||||
added = true;
|
added = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
}, this));
|
||||||
|
|
||||||
if (!added) {
|
if (!added) {
|
||||||
// if we couldn't add layers (removed or invalid name), add the default one
|
// if we couldn't add layers (removed or invalid name), add the default one
|
||||||
|
|
@ -117,11 +148,33 @@
|
||||||
formatLayers: function () {
|
formatLayers: function () {
|
||||||
var objList = this.options.layersControl.getActiveLayers();
|
var objList = this.options.layersControl.getActiveLayers();
|
||||||
var layerList = objList.map(L.bind(function (obj) {
|
var layerList = objList.map(L.bind(function (obj) {
|
||||||
return encodeURIComponent(obj.name);
|
return encodeURIComponent(this._toLayerString(obj));
|
||||||
}, this));
|
}, this));
|
||||||
|
|
||||||
return layerList.join(this.options.layerSeparator)
|
return layerList.join(this.options.layerSeparator)
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_toLayerString: function (obj) {
|
||||||
|
return obj.layer.id ? obj.layer.id : obj.name;
|
||||||
|
},
|
||||||
|
|
||||||
|
_getLayerFromString: function (layerString) {
|
||||||
|
var layersControl = this.options.layersControl;
|
||||||
|
var obj = layersControl.getLayerById(layerString);
|
||||||
|
|
||||||
|
if (!obj) {
|
||||||
|
// fallback to name for custom and config layers
|
||||||
|
obj = layersControl.getLayer(layerString);
|
||||||
|
|
||||||
|
if (!obj) {
|
||||||
|
// legacy layer name support
|
||||||
|
obj = layersControl.getLayerByLegacyName(layerString);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
},
|
||||||
|
|
||||||
removeFrom: function(map) {
|
removeFrom: function(map) {
|
||||||
if (this.changeTimeout) {
|
if (this.changeTimeout) {
|
||||||
clearTimeout(this.changeTimeout);
|
clearTimeout(this.changeTimeout);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue