From 1faf641806a4c063fbdb8dd905b08676677acd47 Mon Sep 17 00:00:00 2001 From: ahocevar Date: Sun, 3 Feb 2008 17:48:19 +0000 Subject: [PATCH] evaluation of else filter in SLD. r=tschaub (closes #1317) git-svn-id: http://svn.openlayers.org/trunk/openlayers@5978 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf --- examples/georss-flickr.html | 11 +++--- lib/OpenLayers/Format/SLD.js | 9 ++++- lib/OpenLayers/Rule.js | 10 ++++++ lib/OpenLayers/Style.js | 67 +++++++++++++++++++++++++----------- tests/test_Style.html | 27 +++++++++++++++ 5 files changed, 96 insertions(+), 28 deletions(-) diff --git a/examples/georss-flickr.html b/examples/georss-flickr.html index 7780bef6d0..bc76d0b601 100644 --- a/examples/georss-flickr.html +++ b/examples/georss-flickr.html @@ -41,6 +41,7 @@ // If the above rule does not apply, use a smaller pointRadius. var elseRule = new OpenLayers.Rule({ + elseFilter: true, symbolizer: {"Point": {pointRadius: 20}}}); style.addRules([rule, elseRule]); @@ -69,7 +70,7 @@ popupControl.activate(); - OpenLayers.loadURL("xml/georss-flickr.xml", "", null, afterload); + OpenLayers.loadURL("xml/georss-flickr.xml", null, window, afterload); } @@ -88,13 +89,9 @@ var store = new OpenLayers.Format.GeoRSS({ createFeatureFromItem: createFeatureFromItem}); - rss = store.read(req.responseXML); + rss = store.read(req.responseText); - // get the title of the RSS feed - var title = req.responseXML.getElementsByTagName("title")[0] - .firstChild.nodeValue; - - markerLayer.setName(title); + markerLayer.setName("Some images from Flickr"); markerLayer.addFeatures(rss); } diff --git a/lib/OpenLayers/Format/SLD.js b/lib/OpenLayers/Format/SLD.js index 942f73b540..24a20df762 100644 --- a/lib/OpenLayers/Format/SLD.js +++ b/lib/OpenLayers/Format/SLD.js @@ -207,9 +207,16 @@ OpenLayers.Format.SLD = OpenLayers.Class(OpenLayers.Format.XML, { if (filter && filter.length > 0) { var rule = this.parseFilter(filter[0]); } else { - // rule applies to all features (no filter or ElseFilter) + // start with an empty rule that always applies var rule = new OpenLayers.Rule(); + // and check if the rule is an ElseFilter + var elseFilter = this.getElementsByTagNameNS(xmlNode, this.ogcns, + "ElseFilter"); + if (elseFilter && elseFilter.length > 0) { + rule.elseFilter = true; + } } + rule.name = name; // SCALE DENOMINATORS diff --git a/lib/OpenLayers/Rule.js b/lib/OpenLayers/Rule.js index c207688b92..9f6cb3329c 100644 --- a/lib/OpenLayers/Rule.js +++ b/lib/OpenLayers/Rule.js @@ -20,6 +20,16 @@ OpenLayers.Rule = OpenLayers.Class({ */ name: 'default', + /** + * Property: elseFilter + * {Boolean} Determines whether this rule is only to be applied only if + * no other rules match (ElseFilter according to the SLD specification). + * Default is false. For instances of OpenLayers.Rule, if elseFilter is + * false, the rule will always apply. For subclasses, the else property is + * ignored. + */ + elseFilter: false, + /** * Property: symbolizer * {Object} Hash of styles for this rule. Contains hashes of feature diff --git a/lib/OpenLayers/Style.js b/lib/OpenLayers/Style.js index a5f1dd920b..3ac971d03e 100644 --- a/lib/OpenLayers/Style.js +++ b/lib/OpenLayers/Style.js @@ -111,12 +111,13 @@ OpenLayers.Style = OpenLayers.Class({ var style = OpenLayers.Util.extend({}, this.defaultStyle); var rules = this.rules; - var draw = rules.length == 0 ? true : false; var rule; - for (var i=0; i 0) { + appliedRules = true; + for(var i=0; i 0 && appliedRules == false) { + style.display = "none"; + } else { + style.display = ""; + } return style; }, + /** + * Method: applySymbolizer + * + * Parameters: + * rule - {OpenLayers.Rule} + * style - {Object} + * feature - {} + * + * Returns: + * {Object} A style with new symbolizer applied. + */ + applySymbolizer: function(rule, style, feature) { + var symbolizerPrefix = feature.geometry ? + this.getSymbolizerPrefix(feature.geometry) : + OpenLayers.Style.SYMBOLIZER_PREFIXES[0]; + + // merge the style with the current style + var symbolizer = rule.symbolizer[symbolizerPrefix]; + return OpenLayers.Util.extend(style, symbolizer); + }, + /** * Method: createLiterals * creates literals for all style properties that have an entry in diff --git a/tests/test_Style.html b/tests/test_Style.html index 17d3184cba..3c9af04ea2 100644 --- a/tests/test_Style.html +++ b/tests/test_Style.html @@ -87,6 +87,33 @@ createdStyle = style.createStyle(feature); t.eq(createdStyle.fillColor, baseStyle.fillColor, "Correct style for rule that does not apply to fid=\"2\"."); } + + function test_Style_createStyle(t) { + t.plan(2); + var style = new OpenLayers.Style(); + var rule = new OpenLayers.Rule({ + id: Math.random() + }); + var elseRule = new OpenLayers.Rule({ + id: Math.random(), + elseFilter: true + }); + style.addRules([rule, elseRule]); + + // test that applySymbolizer is only called with rule + style.applySymbolizer = function(r) { + t.eq(r.id, rule.id, "(plain) applySymbolizer called with correct rule"); + } + style.createStyle(new OpenLayers.Feature.Vector()); + + rule.evaluate = function() {return false;}; + style.applySymbolizer = function(r) { + t.eq(r.id, elseRule.id, "(else) applySymbolizer called with correct rule"); + } + style.createStyle(new OpenLayers.Feature.Vector()); + + + } function test_Style_destroy(t) { t.plan(1);