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_;
+};