deal with elseFilter, some cleanup
This commit is contained in:
committed by
Bart van den Eijnden
parent
a7fe89c05d
commit
91e834674c
@@ -850,6 +850,8 @@
|
|||||||
* @property {Array.<ol.style.Symbolizer>|undefined} symbolizers Symbolizers
|
* @property {Array.<ol.style.Symbolizer>|undefined} symbolizers Symbolizers
|
||||||
* (that apply if no rules are provided or where none of the provided rules
|
* (that apply if no rules are provided or where none of the provided rules
|
||||||
* apply).
|
* apply).
|
||||||
|
* @property {string|undefined} name Name.
|
||||||
|
* @property {string|undefined} title Title.
|
||||||
* @todo stability experimental
|
* @todo stability experimental
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -57,11 +57,6 @@ ol.parser.ogc.SLD_v1 = function() {
|
|||||||
this.readChildNodes(node, obj);
|
this.readChildNodes(node, obj);
|
||||||
layer.userStyles.push(new ol.style.Style(obj));
|
layer.userStyles.push(new ol.style.Style(obj));
|
||||||
},
|
},
|
||||||
'IsDefault': function(node, style) {
|
|
||||||
if (this.getChildValue(node) === '1') {
|
|
||||||
style.isDefault = true;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
'FeatureTypeStyle': function(node, style) {
|
'FeatureTypeStyle': function(node, style) {
|
||||||
++this.featureTypeCounter;
|
++this.featureTypeCounter;
|
||||||
var obj = {
|
var obj = {
|
||||||
@@ -200,7 +195,8 @@ ol.parser.ogc.SLD_v1 = function() {
|
|||||||
var symbolizer;
|
var symbolizer;
|
||||||
if (goog.isDef(config.externalGraphic)) {
|
if (goog.isDef(config.externalGraphic)) {
|
||||||
config.width = config.height = config.size;
|
config.width = config.height = config.size;
|
||||||
symbolizer = new ol.style.Icon(config);
|
symbolizer = new ol.style.Icon(
|
||||||
|
/** @type {ol.style.IconOptions} */(config));
|
||||||
} else {
|
} else {
|
||||||
symbolizer = new ol.style.Shape(config);
|
symbolizer = new ol.style.Shape(config);
|
||||||
}
|
}
|
||||||
@@ -345,86 +341,30 @@ ol.parser.ogc.SLD_v1 = function() {
|
|||||||
},
|
},
|
||||||
'UserStyle': function(style) {
|
'UserStyle': function(style) {
|
||||||
var node = this.createElementNS('sld:UserStyle');
|
var node = this.createElementNS('sld:UserStyle');
|
||||||
if (style.name) {
|
var name = style.getName(), title = style.getTitle();
|
||||||
this.writeNode('Name', style.name, null, node);
|
if (!goog.isNull(name)) {
|
||||||
|
this.writeNode('Name', name, null, node);
|
||||||
}
|
}
|
||||||
if (style.title) {
|
if (!goog.isNull(title)) {
|
||||||
this.writeNode('Title', style.title, null, node);
|
this.writeNode('Title', title, null, node);
|
||||||
}
|
}
|
||||||
if (style.description) {
|
// TODO sorting by zIndex
|
||||||
this.writeNode('Abstract', style.description, null, node);
|
this.writeNode('FeatureTypeStyle', style, null, node);
|
||||||
}
|
|
||||||
if (style.isDefault) {
|
|
||||||
this.writeNode('IsDefault', style.isDefault, null, node);
|
|
||||||
}
|
|
||||||
if (style.rules) {
|
|
||||||
// group style objects by symbolizer zIndex
|
|
||||||
var rulesByZ = {
|
|
||||||
0: []
|
|
||||||
};
|
|
||||||
var zValues = [0];
|
|
||||||
var rule, ruleMap, symbolizer, zIndex, clone;
|
|
||||||
for (var i = 0, ii = style.rules.length; i < ii; ++i) {
|
|
||||||
rule = style.rules[i];
|
|
||||||
var symbolizers = rule.getSymbolizers();
|
|
||||||
if (symbolizers) {
|
|
||||||
ruleMap = {};
|
|
||||||
for (var j = 0, jj = symbolizers.length; j < jj; ++j) {
|
|
||||||
symbolizer = symbolizers[j];
|
|
||||||
zIndex = symbolizer.zIndex;
|
|
||||||
if (!(zIndex in ruleMap)) {
|
|
||||||
// TODO check if clone works?
|
|
||||||
clone = goog.object.clone(rule);
|
|
||||||
clone.setSymbolizers([]);
|
|
||||||
ruleMap[zIndex] = clone;
|
|
||||||
}
|
|
||||||
// TODO check if clone works
|
|
||||||
ruleMap[zIndex].getSymbolizers().push(
|
|
||||||
goog.object.clone(symbolizer));
|
|
||||||
}
|
|
||||||
for (zIndex in ruleMap) {
|
|
||||||
if (!(zIndex in rulesByZ)) {
|
|
||||||
zValues.push(zIndex);
|
|
||||||
rulesByZ[zIndex] = [];
|
|
||||||
}
|
|
||||||
rulesByZ[zIndex].push(ruleMap[zIndex]);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// no symbolizers in rule
|
|
||||||
rulesByZ[0].push(goog.object.clone(rule));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// write one FeatureTypeStyle per zIndex
|
|
||||||
zValues.sort();
|
|
||||||
var rules;
|
|
||||||
for (var i = 0, ii = zValues.length; i < ii; ++i) {
|
|
||||||
rules = rulesByZ[zValues[i]];
|
|
||||||
if (rules.length > 0) {
|
|
||||||
clone = goog.object.clone(style);
|
|
||||||
clone.setRules(rulesByZ[zValues[i]]);
|
|
||||||
this.writeNode('FeatureTypeStyle', clone, null, node);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.writeNode('FeatureTypeStyle', style, null, node);
|
|
||||||
}
|
|
||||||
return node;
|
|
||||||
},
|
|
||||||
'IsDefault': function(bool) {
|
|
||||||
var node = this.createElementNS('sld:IsDefault');
|
|
||||||
node.appendChild(this.createTextNode((bool) ? '1' : '0'));
|
|
||||||
return node;
|
return node;
|
||||||
},
|
},
|
||||||
'FeatureTypeStyle': function(style) {
|
'FeatureTypeStyle': function(style) {
|
||||||
var node = this.createElementNS('sld:FeatureTypeStyle');
|
var node = this.createElementNS('sld:FeatureTypeStyle');
|
||||||
// OpenLayers currently stores no Name, Title, Abstract,
|
|
||||||
// FeatureTypeName, or SemanticTypeIdentifier information
|
|
||||||
// related to FeatureTypeStyle
|
|
||||||
// add in rules
|
|
||||||
var rules = style.getRules();
|
var rules = style.getRules();
|
||||||
for (var i = 0, ii = rules.length; i < ii; ++i) {
|
for (var i = 0, ii = rules.length; i < ii; ++i) {
|
||||||
this.writeNode('Rule', rules[i], null, node);
|
this.writeNode('Rule', rules[i], null, node);
|
||||||
}
|
}
|
||||||
|
var symbolizers = style.getSymbolizers();
|
||||||
|
if (symbolizers.length > 0) {
|
||||||
|
// wrap this in a Rule with an ElseFilter
|
||||||
|
var rule = new ol.style.Rule({symbolizers: symbolizers});
|
||||||
|
rule.elseFilter = true;
|
||||||
|
this.writeNode('Rule', rule, null, node);
|
||||||
|
}
|
||||||
return node;
|
return node;
|
||||||
},
|
},
|
||||||
'Rule': function(rule) {
|
'Rule': function(rule) {
|
||||||
@@ -436,7 +376,7 @@ ol.parser.ogc.SLD_v1 = function() {
|
|||||||
if (!goog.isNull(rule.getTitle())) {
|
if (!goog.isNull(rule.getTitle())) {
|
||||||
this.writeNode('Title', rule.title, null, node);
|
this.writeNode('Title', rule.title, null, node);
|
||||||
}
|
}
|
||||||
if (rule.elseFilter) {
|
if (rule.elseFilter === true) {
|
||||||
this.writeNode('ElseFilter', null, null, node);
|
this.writeNode('ElseFilter', null, null, node);
|
||||||
} else if (filter) {
|
} else if (filter) {
|
||||||
this.writeNode('Filter', filter, 'http://www.opengis.net/ogc', node);
|
this.writeNode('Filter', filter, 'http://www.opengis.net/ogc', node);
|
||||||
@@ -457,7 +397,6 @@ ol.parser.ogc.SLD_v1 = function() {
|
|||||||
if (symbolizers) {
|
if (symbolizers) {
|
||||||
for (var i = 0, ii = symbolizers.length; i < ii; ++i) {
|
for (var i = 0, ii = symbolizers.length; i < ii; ++i) {
|
||||||
symbolizer = symbolizers[i];
|
symbolizer = symbolizers[i];
|
||||||
// TODO other types of symbolizers
|
|
||||||
if (symbolizer instanceof ol.style.Text) {
|
if (symbolizer instanceof ol.style.Text) {
|
||||||
type = 'Text';
|
type = 'Text';
|
||||||
} else if (symbolizer instanceof ol.style.Stroke) {
|
} else if (symbolizer instanceof ol.style.Stroke) {
|
||||||
@@ -546,11 +485,8 @@ ol.parser.ogc.SLD_v1 = function() {
|
|||||||
'TextSymbolizer': function(symbolizer) {
|
'TextSymbolizer': function(symbolizer) {
|
||||||
var node = this.createElementNS('sld:TextSymbolizer');
|
var node = this.createElementNS('sld:TextSymbolizer');
|
||||||
var text = symbolizer.getText();
|
var text = symbolizer.getText();
|
||||||
// TODO in SLD optional, but in ol3 required?
|
|
||||||
this.writeNode('Label', text, null, node);
|
this.writeNode('Label', text, null, node);
|
||||||
// TODO in SLD optional, but in ol3 required?
|
|
||||||
this.writeNode('Font', symbolizer, null, node);
|
this.writeNode('Font', symbolizer, null, node);
|
||||||
// TODO map align to labelAnchorPoint etc.
|
|
||||||
var stroke = symbolizer.getStroke();
|
var stroke = symbolizer.getStroke();
|
||||||
if (!goog.isNull(stroke)) {
|
if (!goog.isNull(stroke)) {
|
||||||
this.writeNode('Halo', stroke, null, node);
|
this.writeNode('Halo', stroke, null, node);
|
||||||
|
|||||||
@@ -40,6 +40,19 @@ ol.style.Style = function(options) {
|
|||||||
this.symbolizers_ = goog.isDef(options.symbolizers) ?
|
this.symbolizers_ = goog.isDef(options.symbolizers) ?
|
||||||
options.symbolizers : [];
|
options.symbolizers : [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {?string}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
this.name_ = goog.isDef(options.name) ?
|
||||||
|
options.name : null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {?string}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
this.title_ = goog.isDef(options.title) ?
|
||||||
|
options.title : null;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -223,3 +236,27 @@ ol.style.Style.prototype.getRules = function() {
|
|||||||
ol.style.Style.prototype.setRules = function(rules) {
|
ol.style.Style.prototype.setRules = function(rules) {
|
||||||
this.rules_ = rules;
|
this.rules_ = rules;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return {Array.<ol.style.Symbolizer>}
|
||||||
|
*/
|
||||||
|
ol.style.Style.prototype.getSymbolizers = function() {
|
||||||
|
return this.symbolizers_;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return {?string}
|
||||||
|
*/
|
||||||
|
ol.style.Style.prototype.getName = function() {
|
||||||
|
return this.name_;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return {?string}
|
||||||
|
*/
|
||||||
|
ol.style.Style.prototype.getTitle = function() {
|
||||||
|
return this.title_;
|
||||||
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user