OpenLayers OpenLayers

Changeset 5978

Show
Ignore:
Timestamp:
02/03/08 12:48:19 (1 year ago)
Author:
ahocevar
Message:

evaluation of else filter in SLD. r=tschaub (closes #1317)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/openlayers/examples/georss-flickr.html

    r5964 r5978  
    4242            // If the above rule does not apply, use a smaller pointRadius. 
    4343            var elseRule = new OpenLayers.Rule({ 
     44                    elseFilter: true, 
    4445                    symbolizer: {"Point": {pointRadius: 20}}}); 
    4546             
     
    7071            popupControl.activate(); 
    7172             
    72             OpenLayers.loadURL("xml/georss-flickr.xml", "", null, afterload); 
     73            OpenLayers.loadURL("xml/georss-flickr.xml", null, window, afterload); 
    7374             
    7475        } 
     
    8990                    createFeatureFromItem: createFeatureFromItem}); 
    9091 
    91             rss = store.read(req.responseXML); 
     92            rss = store.read(req.responseText); 
    9293 
    93             // get the title of the RSS feed 
    94             var title = req.responseXML.getElementsByTagName("title")[0] 
    95                     .firstChild.nodeValue; 
    96                      
    97             markerLayer.setName(title); 
     94            markerLayer.setName("Some images from Flickr"); 
    9895            markerLayer.addFeatures(rss); 
    9996        } 
  • trunk/openlayers/lib/OpenLayers/Format/SLD.js

    r5964 r5978  
    208208            var rule = this.parseFilter(filter[0]); 
    209209        } else { 
    210             // rule applies to all features (no filter or ElseFilter) 
     210            // start with an empty rule that always applies 
    211211            var rule = new OpenLayers.Rule(); 
    212         } 
     212            // and check if the rule is an ElseFilter 
     213            var elseFilter = this.getElementsByTagNameNS(xmlNode, this.ogcns, 
     214                "ElseFilter"); 
     215            if (elseFilter && elseFilter.length > 0) { 
     216                rule.elseFilter = true; 
     217            } 
     218        } 
     219         
    213220        rule.name = name; 
    214221         
  • trunk/openlayers/lib/OpenLayers/Rule.js

    r5964 r5978  
    2121    name: 'default', 
    2222 
     23    /** 
     24     * Property: elseFilter 
     25     * {Boolean} Determines whether this rule is only to be applied only if 
     26     * no other rules match (ElseFilter according to the SLD specification).  
     27     * Default is false.  For instances of OpenLayers.Rule, if elseFilter is 
     28     * false, the rule will always apply.  For subclasses, the else property is  
     29     * ignored. 
     30     */ 
     31    elseFilter: false, 
     32     
    2333    /** 
    2434     * Property: symbolizer 
  • trunk/openlayers/lib/OpenLayers/Style.js

    r5964 r5978  
    112112         
    113113        var rules = this.rules; 
    114         var draw = rules.length == 0 ? true : false; 
    115114 
    116115        var rule; 
    117         for (var i=0; i<rules.length; i++) { 
     116        var elseRules = []; 
     117        var appliedRules = false; 
     118        for(var i=0; i<rules.length; i++) { 
    118119            rule = rules[i]; 
    119             // does the rule apply?         
     120            // does the rule apply? 
    120121            var applies = rule.evaluate(feature); 
    121122             
     
    133134                        rule.maxScaleDenominator, feature); 
    134135            } 
    135              
    136             if (draw && rule.CLASS_NAME == "OpenLayers.Rule") { 
    137                 // apply plain rules only if no other applied (ElseFilter) 
    138                 applies = false; 
    139             } 
    140  
    141             if (applies) { 
    142                 draw = true; 
    143  
    144                 // determine which symbolizer (Point, Line, Polygon) to use 
    145                 var symbolizerPrefix = feature.geometry ? 
    146                         this.getSymbolizerPrefix(feature.geometry) : 
    147                         OpenLayers.Style.SYMBOLIZER_PREFIXES[0]; 
    148  
    149                 // merge the style with the current style 
    150                 var symbolizer = this.rules[i].symbolizer[symbolizerPrefix]; 
    151                 OpenLayers.Util.extend(style, symbolizer); 
     136 
     137            if(applies) { 
     138                if(rule instanceof OpenLayers.Rule && rule.elseFilter) { 
     139                    elseRules.push(rule); 
     140                } else { 
     141                    appliedRules = true; 
     142                    this.applySymbolizer(rule, style, feature); 
     143                } 
     144            } 
     145        } 
     146         
     147        // if no other rules apply, apply the rules with else filters 
     148        if(appliedRules == false && elseRules.length > 0) { 
     149            appliedRules = true; 
     150            for(var i=0; i<elseRules.length; i++) { 
     151                this.applySymbolizer(elseRules[i], style, feature); 
    152152            } 
    153153        } 
     
    155155        // calculate literals for all styles in the propertyStyles cache 
    156156        this.createLiterals(style, feature); 
    157         style.display = draw ? "" : "none"; 
     157 
     158        // don't display if there were rules but none applied 
     159        if(rules.length > 0 && appliedRules == false) { 
     160            style.display = "none"; 
     161        } else { 
     162            style.display = ""; 
     163        } 
    158164         
    159165        return style; 
     166    }, 
     167     
     168    /** 
     169     * Method: applySymbolizer 
     170     * 
     171     * Parameters: 
     172     * rule - {OpenLayers.Rule} 
     173     * style - {Object} 
     174     * feature - {<OpenLayer.Feature.Vector>} 
     175     * 
     176     * Returns: 
     177     * {Object} A style with new symbolizer applied. 
     178     */ 
     179    applySymbolizer: function(rule, style, feature) { 
     180        var symbolizerPrefix = feature.geometry ? 
     181                this.getSymbolizerPrefix(feature.geometry) : 
     182                OpenLayers.Style.SYMBOLIZER_PREFIXES[0]; 
     183 
     184        // merge the style with the current style 
     185        var symbolizer = rule.symbolizer[symbolizerPrefix]; 
     186        return OpenLayers.Util.extend(style, symbolizer); 
    160187    }, 
    161188     
  • trunk/openlayers/tests/test_Style.html

    r5964 r5978  
    8888        t.eq(createdStyle.fillColor, baseStyle.fillColor, "Correct style for rule that does not apply to fid=\"2\"."); 
    8989    } 
     90     
     91    function test_Style_createStyle(t) { 
     92        t.plan(2); 
     93        var style = new OpenLayers.Style(); 
     94        var rule = new OpenLayers.Rule({ 
     95            id: Math.random() 
     96        }); 
     97        var elseRule = new OpenLayers.Rule({ 
     98            id: Math.random(), 
     99            elseFilter: true 
     100        }); 
     101        style.addRules([rule, elseRule]); 
     102 
     103        // test that applySymbolizer is only called with rule 
     104        style.applySymbolizer = function(r) { 
     105            t.eq(r.id, rule.id, "(plain) applySymbolizer called with correct rule"); 
     106        } 
     107        style.createStyle(new OpenLayers.Feature.Vector()); 
     108 
     109        rule.evaluate = function() {return false;}; 
     110        style.applySymbolizer = function(r) { 
     111            t.eq(r.id, elseRule.id, "(else) applySymbolizer called with correct rule"); 
     112        } 
     113        style.createStyle(new OpenLayers.Feature.Vector()); 
     114 
     115 
     116    } 
    90117 
    91118    function test_Style_destroy(t) {