diff --git a/src/objectliterals.jsdoc b/src/objectliterals.jsdoc index 8534aef970..bbd675ff59 100644 --- a/src/objectliterals.jsdoc +++ b/src/objectliterals.jsdoc @@ -850,6 +850,8 @@ * @property {Array.|undefined} symbolizers Symbolizers * (that apply if no rules are provided or where none of the provided rules * apply). + * @property {string|undefined} name Name. + * @property {string|undefined} title Title. * @todo stability experimental */ diff --git a/src/ol/parser/ogc/sldparser_v1.js b/src/ol/parser/ogc/sldparser_v1.js index 52825b2f24..a48c20dbcc 100644 --- a/src/ol/parser/ogc/sldparser_v1.js +++ b/src/ol/parser/ogc/sldparser_v1.js @@ -57,11 +57,6 @@ ol.parser.ogc.SLD_v1 = function() { this.readChildNodes(node, 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) { ++this.featureTypeCounter; var obj = { @@ -200,7 +195,8 @@ ol.parser.ogc.SLD_v1 = function() { var symbolizer; if (goog.isDef(config.externalGraphic)) { config.width = config.height = config.size; - symbolizer = new ol.style.Icon(config); + symbolizer = new ol.style.Icon( + /** @type {ol.style.IconOptions} */(config)); } else { symbolizer = new ol.style.Shape(config); } @@ -345,86 +341,30 @@ ol.parser.ogc.SLD_v1 = function() { }, 'UserStyle': function(style) { var node = this.createElementNS('sld:UserStyle'); - if (style.name) { - this.writeNode('Name', style.name, null, node); + var name = style.getName(), title = style.getTitle(); + if (!goog.isNull(name)) { + this.writeNode('Name', name, null, node); } - if (style.title) { - this.writeNode('Title', style.title, null, node); + if (!goog.isNull(title)) { + this.writeNode('Title', title, null, node); } - if (style.description) { - this.writeNode('Abstract', style.description, 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')); + // TODO sorting by zIndex + this.writeNode('FeatureTypeStyle', style, null, node); return node; }, 'FeatureTypeStyle': function(style) { 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(); for (var i = 0, ii = rules.length; i < ii; ++i) { 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; }, 'Rule': function(rule) { @@ -436,7 +376,7 @@ ol.parser.ogc.SLD_v1 = function() { if (!goog.isNull(rule.getTitle())) { this.writeNode('Title', rule.title, null, node); } - if (rule.elseFilter) { + if (rule.elseFilter === true) { this.writeNode('ElseFilter', null, null, node); } else if (filter) { this.writeNode('Filter', filter, 'http://www.opengis.net/ogc', node); @@ -457,7 +397,6 @@ ol.parser.ogc.SLD_v1 = function() { if (symbolizers) { for (var i = 0, ii = symbolizers.length; i < ii; ++i) { symbolizer = symbolizers[i]; - // TODO other types of symbolizers if (symbolizer instanceof ol.style.Text) { type = 'Text'; } else if (symbolizer instanceof ol.style.Stroke) { @@ -546,11 +485,8 @@ ol.parser.ogc.SLD_v1 = function() { 'TextSymbolizer': function(symbolizer) { var node = this.createElementNS('sld:TextSymbolizer'); var text = symbolizer.getText(); - // TODO in SLD optional, but in ol3 required? this.writeNode('Label', text, null, node); - // TODO in SLD optional, but in ol3 required? this.writeNode('Font', symbolizer, null, node); - // TODO map align to labelAnchorPoint etc. var stroke = symbolizer.getStroke(); if (!goog.isNull(stroke)) { this.writeNode('Halo', stroke, null, node); diff --git a/src/ol/style/style.js b/src/ol/style/style.js index d7e0d38022..224ec2578c 100644 --- a/src/ol/style/style.js +++ b/src/ol/style/style.js @@ -40,6 +40,19 @@ ol.style.Style = function(options) { this.symbolizers_ = goog.isDef(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) { this.rules_ = rules; }; + + +/** + * @return {Array.} + */ +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_; +};