diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2016-05-16 18:27:23 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2016-05-16 18:27:23 +0200 |
commit | 173f32bfffbdbe3861e81681e8ee8c3a1afde737 (patch) | |
tree | 25c6d47830b4e52187117de1dbaefd4d3f70781a | |
parent | 8ea59c0b255bcab448656ad9fa91afb96d54967c (diff) | |
download | Chimère-173f32bfffbdbe3861e81681e8ee8c3a1afde737.tar.bz2 Chimère-173f32bfffbdbe3861e81681e8ee8c3a1afde737.zip |
OL3: add a layer switcher
-rw-r--r-- | chimere/static/chimere/css/styles.css | 45 | ||||
-rw-r--r-- | chimere/static/chimere/js/jquery.chimere.js | 73 |
2 files changed, 118 insertions, 0 deletions
diff --git a/chimere/static/chimere/css/styles.css b/chimere/static/chimere/css/styles.css index 645bfa5..a6b6cda 100644 --- a/chimere/static/chimere/css/styles.css +++ b/chimere/static/chimere/css/styles.css @@ -1228,3 +1228,48 @@ div.pp_default .pp_expand{ right: 12em; left: auto; } + + +.LayerSwitcher { + width:20em; + margin:0.5em; + padding:0.5em; + z-index:100; + position: absolute; + background-color: rgba(255,255,255,0.7); +} + +.LayerSwitcher .LayerClickDiv, .LayerSwitcher .LayerClickDiv * { + cursor:pointer; +} + +.LayerClickDiv { + margin: 0.1em; + line-height: 1em; +} + +.LayerSwitcher .Separator { + border-bottom:1px solid #999999; + margin:0.5em; +} +.LayerSwitcher .check { + border:1px solid #999999; + height:1em; + width:1em; + background:transparent; + float:left; + margin: 0 0.5em 0 0; +} +.LayerSwitcher .checkbox { + /* border-radius:0.2em; */ +} +.LayerSwitcher .checkbox.checked { + background:#666666; +} +.LayerSwitcher .radiobutton { + border-radius:1em; +} +.LayerSwitcher .radiobutton.checked { + background:#666666; +} + diff --git a/chimere/static/chimere/js/jquery.chimere.js b/chimere/static/chimere/js/jquery.chimere.js index e1509ba..25c9be8 100644 --- a/chimere/static/chimere/js/jquery.chimere.js +++ b/chimere/static/chimere/js/jquery.chimere.js @@ -18,6 +18,62 @@ See the file COPYING for details. var extra_url; +// Create a simple layer switcher in element div: +var LayerSwitcher = function(options){ + var o = this.options = options || {}; + var map = this.map = options.map; + + // element to render in: + var $div; + if(!o.div){ + $div = $('<div class="LayerSwitcher">'); $(document.body).append($div); + o.div = $div[0]; + } else { + var $div = typeof o.div == 'string' ? $('#'+o.div) : $(o.div); + $div.addClass("LayerSwitcher"); + } + this.div = o.div; + + var $baseDiv = $('<div class="BaseLayerDiv">'); + var $overDiv = $('<div class="OverlayDiv">'); + $div.append($baseDiv, $overDiv); + + + // array with layers: + var layers = map.getLayers().getArray(); + + // turn off other baselayers: + var otherBLoff = function(layer){ + $.each(layers, function(i,l){ + if(l!==layer && l.get('baselayer')) + { l.setVisible(false); } + }); + }; + + // go through each layer, render control and set handlers: + $.each(layers, function(i,l){ + var BL = l.get('baselayer'); + var $li = $('<div class="check">'); + l.getVisible() ? $li.addClass('checked') : $li.removeClass('checked') ; + BL ? $li.addClass('radiobutton') : $li.addClass('checkbox') ; + var $ll = $('<label>'+l.get('name')+'</label>'); + var $ld = $('<div class="LayerClickDiv">').click(function(){ + l.setVisible(!l.getVisible()); + l.get('baselayer') ? otherBLoff(l) :0; + }); //toggle viz on click + $ld.append($li,$ll); + BL ? $baseDiv.append($ld) : $overDiv.append($ld) ; + // bind checkbox state to layer event: + l.on('change:visible', function(e){ + this.getVisible() ? $li.addClass('checked') : $li.removeClass('checked') ; + }); // bind + }); // each + if($baseDiv.children()[0] && $overDiv.children()[0]){ + $baseDiv.after('<div class="Separator">'); + } + +}; // LayerSwitcher + function transformExtent(extent) { return ol.proj.transformExtent( extent, EPSG_DISPLAY_PROJECTION, EPSG_PROJECTION); @@ -162,10 +218,12 @@ function transform(obj) { defaults.map_layers = [ new ol.layer.Tile({ style: 'Road', + name: 'Road', source: new ol.source.MapQuest({layer: 'osm'}) }), new ol.layer.Tile({ style: 'Aerial', + name: 'Aerial', visible: false, source: new ol.source.MapQuest({layer: 'sat'}) })]; @@ -225,6 +283,13 @@ function transform(obj) { /* Create map object */ settings.map = map = new ol.Map(map_options); + // only display the first layer + $.each(settings.map.getLayers().getArray(), function(i, layer){ + if (i > 0){ + layer.setVisible(false); + } + }); + /* Manage permalink */ /* OL3-deprecated permalink if (!settings.edition){ @@ -323,6 +388,11 @@ function transform(obj) { } */ + settings.layerSwitcher = new LayerSwitcher({ + map: settings.map, + div: 'layerSwitcher' + }); + /* marker layer */ settings.iconStyles = new Object(); settings.dbFeatures = new ol.Collection(); @@ -803,6 +873,9 @@ function transform(obj) { setCurrentPosition: function(lonlat){ settings.current_position = lonlat; }, + addLayer: function(layer){ + settings.map.addLayer(layer); + }, zoomOnCluster: function(feature){ if(!feature.cluster) // if not cluster { |