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
This commit is contained in:
@@ -41,6 +41,7 @@
|
|||||||
|
|
||||||
// If the above rule does not apply, use a smaller pointRadius.
|
// If the above rule does not apply, use a smaller pointRadius.
|
||||||
var elseRule = new OpenLayers.Rule({
|
var elseRule = new OpenLayers.Rule({
|
||||||
|
elseFilter: true,
|
||||||
symbolizer: {"Point": {pointRadius: 20}}});
|
symbolizer: {"Point": {pointRadius: 20}}});
|
||||||
|
|
||||||
style.addRules([rule, elseRule]);
|
style.addRules([rule, elseRule]);
|
||||||
@@ -69,7 +70,7 @@
|
|||||||
|
|
||||||
popupControl.activate();
|
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({
|
var store = new OpenLayers.Format.GeoRSS({
|
||||||
createFeatureFromItem: createFeatureFromItem});
|
createFeatureFromItem: createFeatureFromItem});
|
||||||
|
|
||||||
rss = store.read(req.responseXML);
|
rss = store.read(req.responseText);
|
||||||
|
|
||||||
// get the title of the RSS feed
|
markerLayer.setName("Some images from Flickr");
|
||||||
var title = req.responseXML.getElementsByTagName("title")[0]
|
|
||||||
.firstChild.nodeValue;
|
|
||||||
|
|
||||||
markerLayer.setName(title);
|
|
||||||
markerLayer.addFeatures(rss);
|
markerLayer.addFeatures(rss);
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -207,9 +207,16 @@ OpenLayers.Format.SLD = OpenLayers.Class(OpenLayers.Format.XML, {
|
|||||||
if (filter && filter.length > 0) {
|
if (filter && filter.length > 0) {
|
||||||
var rule = this.parseFilter(filter[0]);
|
var rule = this.parseFilter(filter[0]);
|
||||||
} else {
|
} else {
|
||||||
// rule applies to all features (no filter or ElseFilter)
|
// start with an empty rule that always applies
|
||||||
var rule = new OpenLayers.Rule();
|
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;
|
rule.name = name;
|
||||||
|
|
||||||
// SCALE DENOMINATORS
|
// SCALE DENOMINATORS
|
||||||
|
|||||||
@@ -20,6 +20,16 @@ OpenLayers.Rule = OpenLayers.Class({
|
|||||||
*/
|
*/
|
||||||
name: 'default',
|
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
|
* Property: symbolizer
|
||||||
* {Object} Hash of styles for this rule. Contains hashes of feature
|
* {Object} Hash of styles for this rule. Contains hashes of feature
|
||||||
|
|||||||
+44
-17
@@ -111,10 +111,11 @@ OpenLayers.Style = OpenLayers.Class({
|
|||||||
var style = OpenLayers.Util.extend({}, this.defaultStyle);
|
var style = OpenLayers.Util.extend({}, this.defaultStyle);
|
||||||
|
|
||||||
var rules = this.rules;
|
var rules = this.rules;
|
||||||
var draw = rules.length == 0 ? true : false;
|
|
||||||
|
|
||||||
var rule;
|
var rule;
|
||||||
for (var i=0; i<rules.length; i++) {
|
var elseRules = [];
|
||||||
|
var appliedRules = false;
|
||||||
|
for(var i=0; i<rules.length; i++) {
|
||||||
rule = rules[i];
|
rule = rules[i];
|
||||||
// does the rule apply?
|
// does the rule apply?
|
||||||
var applies = rule.evaluate(feature);
|
var applies = rule.evaluate(feature);
|
||||||
@@ -133,32 +134,58 @@ OpenLayers.Style = OpenLayers.Class({
|
|||||||
rule.maxScaleDenominator, feature);
|
rule.maxScaleDenominator, feature);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (draw && rule.CLASS_NAME == "OpenLayers.Rule") {
|
if(applies) {
|
||||||
// apply plain rules only if no other applied (ElseFilter)
|
if(rule instanceof OpenLayers.Rule && rule.elseFilter) {
|
||||||
applies = false;
|
elseRules.push(rule);
|
||||||
|
} else {
|
||||||
|
appliedRules = true;
|
||||||
|
this.applySymbolizer(rule, style, feature);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (applies) {
|
// if no other rules apply, apply the rules with else filters
|
||||||
draw = true;
|
if(appliedRules == false && elseRules.length > 0) {
|
||||||
|
appliedRules = true;
|
||||||
// determine which symbolizer (Point, Line, Polygon) to use
|
for(var i=0; i<elseRules.length; i++) {
|
||||||
var symbolizerPrefix = feature.geometry ?
|
this.applySymbolizer(elseRules[i], style, feature);
|
||||||
this.getSymbolizerPrefix(feature.geometry) :
|
|
||||||
OpenLayers.Style.SYMBOLIZER_PREFIXES[0];
|
|
||||||
|
|
||||||
// merge the style with the current style
|
|
||||||
var symbolizer = this.rules[i].symbolizer[symbolizerPrefix];
|
|
||||||
OpenLayers.Util.extend(style, symbolizer);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// calculate literals for all styles in the propertyStyles cache
|
// calculate literals for all styles in the propertyStyles cache
|
||||||
this.createLiterals(style, feature);
|
this.createLiterals(style, feature);
|
||||||
style.display = draw ? "" : "none";
|
|
||||||
|
// don't display if there were rules but none applied
|
||||||
|
if(rules.length > 0 && appliedRules == false) {
|
||||||
|
style.display = "none";
|
||||||
|
} else {
|
||||||
|
style.display = "";
|
||||||
|
}
|
||||||
|
|
||||||
return style;
|
return style;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method: applySymbolizer
|
||||||
|
*
|
||||||
|
* Parameters:
|
||||||
|
* rule - {OpenLayers.Rule}
|
||||||
|
* style - {Object}
|
||||||
|
* feature - {<OpenLayer.Feature.Vector>}
|
||||||
|
*
|
||||||
|
* 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
|
* Method: createLiterals
|
||||||
* creates literals for all style properties that have an entry in
|
* creates literals for all style properties that have an entry in
|
||||||
|
|||||||
@@ -88,6 +88,33 @@
|
|||||||
t.eq(createdStyle.fillColor, baseStyle.fillColor, "Correct style for rule that does not apply to fid=\"2\".");
|
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) {
|
function test_Style_destroy(t) {
|
||||||
t.plan(1);
|
t.plan(1);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user