Skip to content

Commit

Permalink
Insert MIXED node layers as layer.Group in Map
Browse files Browse the repository at this point in the history
  • Loading branch information
olive committed Apr 14, 2016
1 parent c135364 commit 3b216e0
Show file tree
Hide file tree
Showing 5 changed files with 174 additions and 100 deletions.
154 changes: 59 additions & 95 deletions contribs/gmf/src/directives/layertree.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ goog.require('gmf.TreeManager');
goog.require('ngeo.CreatePopup');
goog.require('ngeo.LayerHelper');
goog.require('ngeo.LayertreeController');
goog.require('ol.Collection');
goog.require('ol.array');
goog.require('ol.layer.Tile');

Expand All @@ -23,9 +22,8 @@ gmf.module.value('gmfLayertreeTemplate',
var subTemplateUrl = gmf.baseTemplateUrl + '/layertree.html';
return '<div ngeo-layertree="gmfLayertreeCtrl.tree" ' +
'ngeo-layertree-map="gmfLayertreeCtrl.map" ' +
'ngeo-layertree-nodelayer="gmfLayertreeCtrl.getLayer(node, depth)" ' +
'ngeo-layertree-listeners="gmfLayertreeCtrl.listeners(treeScope, ' +
'treeCtrl)" ' +
'ngeo-layertree-nodelayer="gmfLayertreeCtrl.getLayer(node, parentCtrl, depth)" ' +
'ngeo-layertree-listeners="gmfLayertreeCtrl.listeners(treeScope, treeCtrl)" ' +
'ngeo-layertree-templateurl="' + subTemplateUrl + '">' +
'</div>';
});
Expand Down Expand Up @@ -180,15 +178,43 @@ gmf.LayertreeController = function($http, $sce, $scope, ngeoCreatePopup,
};


/**
* LayertreeController.prototype.prepareLayer_ - inject metadata into the layer
* @private
* @param {GmfThemesNode} node Layer tree node.
* @param {ol.layer.Base} layer The OpenLayers layer or group for the node.
*/
gmf.LayertreeController.prototype.prepareLayer_ = function(node, layer) {
var type = gmf.Themes.getNodeType(node);
var ids = this.getNodeIds_(node);
if (goog.isDefAndNotNull(layer)) {
layer.set('querySourceIds', ids);
layer.set('layerName', node.name);

var isMerged = type === gmf.Themes.NodeType.NOT_MIXED_GROUP;
layer.set('isMerged', isMerged);

// If layer is 'unchecked', set it to invisible.
var metadata = node.metadata;
if (node.children === undefined && goog.isDefAndNotNull(metadata)) {
if (metadata['isChecked'] != 'true') {
layer.setVisible(false);
}
}
}
}


/**
* Create and return a layer corresponding to the ngeo layertree's node.
* This function will only create a layer for each "top-level" (depth 1) groups.
*
* On "not mixed" type nodes, the returned layer will be an ol.layer.Image (WMS)
* with each name of node's children as LAYERS parameters.
*
* On "mixed" type node, the returned layer will be an ol.layer.Group with
* a collection of layers that corresponds to each children of the node.
* On "mixed" type node, the returned layer will be an ol.layer.Group
*
* If the parent node is "mixed", the child layer freshly created will be added to it
*
* All layer created will receive:
* - A 'querySourceId' parameter with the node id as value.
Expand All @@ -200,58 +226,47 @@ gmf.LayertreeController = function($http, $sce, $scope, ngeoCreatePopup,
* If the node metadata 'isChecked' value is false, the layer visibility will
* be set to false.
* @param {GmfThemesNode} node Layer tree node.
* @param {number=} opt_depth ngeo layertree node depth.
* @param {boolean=} opt_createWMS True to allow create wms layer.
* @param {ngeo.LayertreeController} parentCtrl parent controller of the node
* @param {number} depth ngeo layertree node depth.
* @return {ol.layer.Base} The OpenLayers layer or group for the node.
* @export
*/
gmf.LayertreeController.prototype.getLayer = function(node, opt_depth,
opt_createWMS) {
gmf.LayertreeController.prototype.getLayer = function(node, parentCtrl, depth) {
var type = gmf.Themes.getNodeType(node);
var layer = null;

if (opt_depth === 1) {
if (depth === 1) {
switch (type) {
case gmf.Themes.NodeType.MIXED_GROUP:
return this.getLayerCaseMixedGroup_(node);
layer = this.getLayerCaseMixedGroup_(node);
break;
case gmf.Themes.NodeType.NOT_MIXED_GROUP:
layer = this.getLayerCaseNotMixedGroup_(node);
this.prepareLayer_(node, layer);
break;
// no default
}
switch (type) {
case gmf.Themes.NodeType.WMTS:
layer = this.getLayerCaseWMTS_(node);
break;
case gmf.Themes.NodeType.WMS:
case gmf.Themes.NodeType.EXTERNAL_WMS:
var url = node.url || this.gmfWmsUrl_;
layer = opt_createWMS ?
this.layerHelper_.createBasicWMSLayer(url, node.name) : null;
break;
// no default
}
}

if (goog.isDefAndNotNull(layer)) {
var ids = this.getNodeIds_(node);
layer.set('querySourceIds', ids);
layer.set('layerName', node.name);

var isMerged = type === gmf.Themes.NodeType.NOT_MIXED_GROUP;
layer.set('isMerged', isMerged);

this.dataLayerGroup_.getLayers().insertAt(0, layer);

// If layer is 'unchecked', set it to invisible.
var metadata = node.metadata;
if (node.children === undefined && goog.isDefAndNotNull(metadata)) {
if (metadata['isChecked'] != 'true') {
layer.setVisible(false);
}
}
return layer;
}

//depth > 1 && parent is not a MIXED_GROUP;
if (!parentCtrl || gmf.Themes.getNodeType(parentCtrl['node']) !== gmf.Themes.NodeType.MIXED_GROUP) {
return null;
}
//depth > 1 && parent is a MIXED group
switch (type) {
case gmf.Themes.NodeType.WMTS:
layer = this.getLayerCaseWMTS_(node);
break;
case gmf.Themes.NodeType.WMS:
case gmf.Themes.NodeType.EXTERNAL_WMS:
var url = node.url || this.gmfWmsUrl_;
layer = this.layerHelper_.createBasicWMSLayer(url, node.name);
break;
// no default
}
this.prepareLayer_(node, layer);
parentCtrl['layer'].getLayers().push(layer);
return layer;
};

Expand All @@ -264,23 +279,7 @@ gmf.LayertreeController.prototype.getLayer = function(node, opt_depth,
* @private
*/
gmf.LayertreeController.prototype.getLayerCaseMixedGroup_ = function(node) {
var i;
var layers = new ol.Collection();
var layer, subNode;
var subNodes = [];
var nodeNames = [];
this.getFlatNodes_(node, subNodes);
for (i = 0; i < subNodes.length; i++) {
subNode = subNodes[i];
// Create all sublayers include wms layers;
layer = this.getLayer(subNode, 1, true);
if (goog.isDefAndNotNull(layer)) {
layers.push(layer);
nodeNames.push(subNode.name);
}
}
var group = this.layerHelper_.createBasicGroup(layers);

var group = this.layerHelper_.createBasicGroup();
// Keep a reference to this group.
this.groupNodeStates_[goog.getUid(group)] = [];
return group;
Expand Down Expand Up @@ -545,13 +544,6 @@ gmf.LayertreeController.prototype.getNodeState = function(treeCtrl) {
case gmf.Themes.NodeType.WMTS:
case gmf.Themes.NodeType.EXTERNAL_WMS:
if (firstParentTreeLayer instanceof ol.layer.Group) {
// If layer is not define (That occures the first time, because the
// layer is just in the first parent group) add it to current tree to
// save time next.
if (!goog.isDefAndNotNull(layer)) {
this.addLayerToLeaf_(treeCtrl);
layer = treeCtrl.layer;
}
// Get style of this node depending if the relative layer is visible.
style = goog.isDefAndNotNull(layer) && layer.getVisible() ?
'on' : 'off';
Expand Down Expand Up @@ -602,34 +594,6 @@ gmf.LayertreeController.prototype.getNodeState = function(treeCtrl) {
};


/**
* Get the layer corresponding to the given layertree node from the layer
* group "top level" layertree and add this layer to the given layertree.
* @param {ngeo.LayertreeController} treeCtrl ngeo layertree controller, from
* the current node.
* @private
*/
gmf.LayertreeController.prototype.addLayerToLeaf_ = function(treeCtrl) {
var groupTree = this.retrieveFirstParentTree_(treeCtrl);
var layers = this.layerHelper_.getFlatLayers(groupTree.layer);
var node = treeCtrl.node;
var source, l, i;
for (i = 0; i < layers.length; i++) {
l = layers[i];
source = l.getSource();
if (source instanceof ol.source.WMTS &&
source.getLayer() === node.name) {
treeCtrl.layer = l;
break;
} else if (source instanceof ol.source.ImageWMS &&
source.getParams()['LAYERS'] === node.name) {
treeCtrl.layer = l;
break;
}
}
};


/**
* Update the LAYERS parameter of the source of the given WMS layer.
* @param {ol.layer.Image} layer The WMS layer.
Expand Down
24 changes: 21 additions & 3 deletions contribs/gmf/src/services/permalink.js
Original file line number Diff line number Diff line change
Expand Up @@ -579,7 +579,13 @@ gmf.Permalink.prototype.initLayers_ = function() {
// to any change happening to the existing layers and any added or
// removed ones.
layers.forEach(function(layer) {
this.registerLayer_(layer, true);
if (layer instanceof ol.layer.Group) {
layer.getLayers().forEach(function(l) {
this.registerLayer_(l, true);
}, this);
} else {
this.registerLayer_(layer, true);
}
}, this);

var layersUid = goog.getUid(layers);
Expand Down Expand Up @@ -622,7 +628,13 @@ gmf.Permalink.prototype.initMergedLayer_ = function(layer, layerNames) {
gmf.Permalink.prototype.handleLayersAdd_ = function(evt) {
var layer = evt.element;
goog.asserts.assertInstanceof(layer, ol.layer.Base);
this.registerLayer_(layer);
if (layer instanceof ol.layer.Group) {
layer.getLayers().forEach(function(l) {
this.registerLayer_(l, true);
}, this);
} else {
this.registerLayer_(layer, true);
}
};


Expand All @@ -633,7 +645,13 @@ gmf.Permalink.prototype.handleLayersAdd_ = function(evt) {
gmf.Permalink.prototype.handleLayersRemove_ = function(evt) {
var layer = evt.element;
goog.asserts.assertInstanceof(layer, ol.layer.Base);
this.unregisterLayer_(layer);
if (layer instanceof ol.layer.Group) {
layer.getLayers().forEach(function(l) {
this.unregisterLayer_(l);
}, this);
} else {
this.unregisterLayer_(layer);
}
};


Expand Down
92 changes: 92 additions & 0 deletions contribs/gmf/test/spec/controllers/gmflayertreecontroller.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
/*global describe beforeEach inject expect it themes spyOn*/
/*eslint no-undef: "error"*/

goog.require('gmf.LayertreeController');
goog.require('gmf.test.data.themes');
goog.require('ol.Map');
goog.require('ol.layer.Group');
goog.require('ol.layer.Layer');
goog.require('ol.layer.Image');

describe('GmfLayertree', function() {

var $controller, $rootScope, $scope;
var controllerBindings, gmfLayertreeCtrl, osmThemeNode, mixedNode, nonMixedNode;
var map = new ol.Map({layers : []});

beforeEach(inject(function(_$controller_, _$rootScope_) {
$controller = _$controller_;
$rootScope = _$rootScope_;
$scope = $rootScope.$new();
controllerBindings = {
openLinksInNewWindowFn : function() {
return false
},
map : map
};
gmfLayertreeCtrl = $controller('GmfLayertreeController',
{
$scope: $scope,
gmfWmsUrl : ''
},
controllerBindings
);

osmThemeNode = themes['themes'].filter(function(theme) {
return theme.name === 'OSM';
})[0];
mixedNode = osmThemeNode.children.filter(function(node) {
return node.name === 'OSM function';
})[0];
nonMixedNode = osmThemeNode.children.filter(function(node) {
return node.name === 'Layers';
})[0];

spyOn(gmfLayertreeCtrl, 'prepareLayer_');

}));

it('getLayer should return ol.layer.Group in case of a MIXED node', function() {
var parentTreeCtrl = {
node : osmThemeNode,
depth : 1,
layer : null
};

var layer = gmfLayertreeCtrl.getLayer(mixedNode, parentTreeCtrl, 1);

expect(layer).toBeDefined();
expect(layer instanceof ol.layer.Group).toBeTruthy();
});

it('getLayer should add layer to the parent node in case of parent node is MIXED', function() {
var parentTreeCtrl = {
node : mixedNode,
depth : 1,
layer : gmfLayertreeCtrl.getLayer(mixedNode, osmThemeNode, 1)
};
var childNode = mixedNode.children[0];
var layer = gmfLayertreeCtrl.getLayer(childNode, parentTreeCtrl, 2);

expect(layer).toBeDefined();
expect(layer instanceof ol.layer.Layer).toBeTruthy();
expect(gmfLayertreeCtrl.prepareLayer_).toHaveBeenCalledWith(childNode, layer);
expect(parentTreeCtrl.layer.getLayers().getLength()).toBe(1);
expect(parentTreeCtrl.layer.getLayers().item(0)).toBe(layer);
});

it('getLayer should create a ol.layer.Image in case of a NON-MIXED group', function() {
var parentTreeCtrl = {
node : osmThemeNode,
depth : 1,
layer : null
};

var layer = gmfLayertreeCtrl.getLayer(nonMixedNode, parentTreeCtrl, 1);

expect(layer).toBeDefined();
expect(layer instanceof ol.layer.Image).toBeTruthy();
expect(gmfLayertreeCtrl.prepareLayer_).toHaveBeenCalledWith(nonMixedNode, layer);
})

});

0 comments on commit 3b216e0

Please sign in to comment.