Adding point, line, polygon, text, and raster symbolizer constructors. This paves the way for rendering multiple symbolizers per rule. The SLD parser now successfully round-trips documents with multiple symbolizers and multiple FeatureTypeStyle elements (through the symbolizer zIndex property). The Style2 (yes, ack) constructor is used to represent a collection of rules with multiple symbolizers. Style2 objects are currently only used by the SLD parser if the multipleSymbolizer property is set to true. Future enhancements to the renderers can be made to account for multiple symbolizers. r=ahocevar (closes #2760).
git-svn-id: http://svn.openlayers.org/trunk/openlayers@10560 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
65
examples/sld-parser.html
Normal file
65
examples/sld-parser.html
Normal file
@@ -0,0 +1,65 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>OpenLayers SLD Parser</title>
|
||||
<link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
|
||||
<link rel="stylesheet" href="style.css" type="text/css" />
|
||||
<script src="../lib/OpenLayers.js"></script>
|
||||
<style>
|
||||
#input {
|
||||
width: 90%;
|
||||
height: 300px;
|
||||
}
|
||||
#output {
|
||||
width: 90%;
|
||||
height: 300px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1 id="title">SLD Parser</h1>
|
||||
|
||||
<div id="shortdesc">Parsing Styled Layer Descriptor (SLD) documents with the SLD format.</div>
|
||||
|
||||
<textarea id="input">paste SLD here</textarea><br>
|
||||
<input type="checkbox" id="symbolizers" checked="checked"><label for="symbolizers">Maintain multiple symbolizers and FeatureTypeStyle elements</label><br>
|
||||
<input type="checkbox" id="array"><label for="array">Compile an array of named styles instead of an object.</label><br>
|
||||
<input type="button" id="button" value="Parse SLD">
|
||||
|
||||
<div id="docs">
|
||||
This example uses the SLD format to parse SLD documents pasted into the textarea above.
|
||||
A rough representation of the parsed style is shown in the textarea below.
|
||||
</div>
|
||||
|
||||
<textarea id="output"></textarea>
|
||||
|
||||
<script>
|
||||
|
||||
var button = document.getElementById("button");
|
||||
var input = document.getElementById("input");
|
||||
var output = document.getElementById("output");
|
||||
var symbolizers = document.getElementById("symbolizers");
|
||||
var array = document.getElementById("array");
|
||||
|
||||
var json = new OpenLayers.Format.JSON();
|
||||
|
||||
var format, obj;
|
||||
|
||||
button.onclick = function() {
|
||||
var str = input.value;
|
||||
format = new OpenLayers.Format.SLD({
|
||||
multipleSymbolizers: !!symbolizers.checked,
|
||||
namedLayersAsArray: !!array.checked
|
||||
});
|
||||
obj = format.read(str);
|
||||
try {
|
||||
output.value = json.write(obj, true);
|
||||
} catch (err) {
|
||||
output.value = "Trouble: " + err;
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -227,6 +227,7 @@
|
||||
"OpenLayers/Layer/PointTrack.js",
|
||||
"OpenLayers/Layer/GML.js",
|
||||
"OpenLayers/Style.js",
|
||||
"OpenLayers/Style2.js",
|
||||
"OpenLayers/StyleMap.js",
|
||||
"OpenLayers/Rule.js",
|
||||
"OpenLayers/Format.js",
|
||||
@@ -303,6 +304,12 @@
|
||||
"OpenLayers/Control/ZoomOut.js",
|
||||
"OpenLayers/Control/ZoomPanel.js",
|
||||
"OpenLayers/Control/EditingToolbar.js",
|
||||
"OpenLayers/Symbolizer.js",
|
||||
"OpenLayers/Symbolizer/Point.js",
|
||||
"OpenLayers/Symbolizer/Line.js",
|
||||
"OpenLayers/Symbolizer/Polygon.js",
|
||||
"OpenLayers/Symbolizer/Text.js",
|
||||
"OpenLayers/Symbolizer/Raster.js",
|
||||
"OpenLayers/Lang.js",
|
||||
"OpenLayers/Lang/en.js"
|
||||
); // etc.
|
||||
|
||||
@@ -39,6 +39,27 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, {
|
||||
* {String} Schema location for a particular minor version.
|
||||
*/
|
||||
schemaLocation: null,
|
||||
|
||||
/**
|
||||
* APIProperty: multipleSymbolizers
|
||||
* {Boolean} Support multiple symbolizers per rule. Default is false. if
|
||||
* true, an OpenLayers.Style2 instance will be created to represent
|
||||
* user styles instead of an OpenLayers.Style instace. The
|
||||
* OpenLayers.Style2 class allows collections of rules with multiple
|
||||
* symbolizers, but is not currently useful for client side rendering.
|
||||
* If multiple symbolizers is true, multiple FeatureTypeStyle elements
|
||||
* are preserved in reading/writing by setting symbolizer zIndex values.
|
||||
* In addition, the <defaultSymbolizer> property is ignored if
|
||||
* multiple symbolizers are supported (defaults should be applied
|
||||
* when rendering).
|
||||
*/
|
||||
multipleSymbolizers: false,
|
||||
|
||||
/**
|
||||
* Property: featureTypeCounter
|
||||
* {Number} Private counter for multiple feature type styles.
|
||||
*/
|
||||
featureTypeCounter: null,
|
||||
|
||||
/**
|
||||
* APIProperty: defaultSymbolizer.
|
||||
@@ -138,8 +159,15 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, {
|
||||
},
|
||||
"UserStyle": function(node, layer) {
|
||||
var obj = {defaultsPerSymbolizer: true, rules: []};
|
||||
this.featureTypeCounter = -1;
|
||||
this.readChildNodes(node, obj);
|
||||
var style = new OpenLayers.Style(this.defaultSymbolizer, obj);
|
||||
var style;
|
||||
if (this.multipleSymbolizers) {
|
||||
delete obj.defaultsPerSymbolizer;
|
||||
style = new OpenLayers.Style2(obj);
|
||||
} else {
|
||||
style = new OpenLayers.Style(this.defaultSymbolizer, obj);
|
||||
}
|
||||
layer.userStyles.push(style);
|
||||
},
|
||||
"IsDefault": function(node, style) {
|
||||
@@ -148,18 +176,21 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, {
|
||||
}
|
||||
},
|
||||
"FeatureTypeStyle": function(node, style) {
|
||||
// OpenLayers doesn't have a place for FeatureTypeStyle
|
||||
// Name, Title, Abstract, FeatureTypeName, or
|
||||
// SemanticTypeIdentifier so, we make a temporary object
|
||||
// and later just use the Rule(s).
|
||||
++this.featureTypeCounter;
|
||||
var obj = {
|
||||
rules: []
|
||||
rules: this.multipleSymbolizers ? style.rules : []
|
||||
};
|
||||
this.readChildNodes(node, obj);
|
||||
style.rules = obj.rules;
|
||||
if (!this.multipleSymbolizers) {
|
||||
style.rules = obj.rules;
|
||||
}
|
||||
},
|
||||
"Rule": function(node, obj) {
|
||||
var rule = new OpenLayers.Rule();
|
||||
var config;
|
||||
if (this.multipleSymbolizers) {
|
||||
config = {symbolizers: []};
|
||||
}
|
||||
var rule = new OpenLayers.Rule(config);
|
||||
this.readChildNodes(node, rule);
|
||||
obj.rules.push(rule);
|
||||
},
|
||||
@@ -173,11 +204,18 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, {
|
||||
rule.maxScaleDenominator = parseFloat(this.getChildValue(node));
|
||||
},
|
||||
"TextSymbolizer": function(node, rule) {
|
||||
// OpenLayers doens't do painter's order, instead we extend
|
||||
var symbolizer = rule.symbolizer["Text"] || {};
|
||||
this.readChildNodes(node, symbolizer);
|
||||
// in case it didn't exist before
|
||||
rule.symbolizer["Text"] = symbolizer;
|
||||
var config = {};
|
||||
this.readChildNodes(node, config);
|
||||
if (this.multipleSymbolizers) {
|
||||
config.zIndex = this.featureTypeCounter;
|
||||
rule.symbolizers.push(
|
||||
new OpenLayers.Symbolizer.Text(config)
|
||||
);
|
||||
} else {
|
||||
rule.symbolizer["Text"] = OpenLayers.Util.applyDefaults(
|
||||
config, rule.symbolizer["Text"]
|
||||
);
|
||||
}
|
||||
},
|
||||
"Label": function(node, symbolizer) {
|
||||
// only supporting literal or property name
|
||||
@@ -211,11 +249,18 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, {
|
||||
}
|
||||
},
|
||||
"RasterSymbolizer": function(node, rule) {
|
||||
// OpenLayers doesn't do painter's order, instead we extend
|
||||
var symbolizer = rule.symbolizer["Raster"] || {};
|
||||
this.readChildNodes(node, symbolizer);
|
||||
// in case it didn't exist before
|
||||
rule.symbolizer["Raster"] = symbolizer;
|
||||
var config = {};
|
||||
this.readChildNodes(node, config);
|
||||
if (this.multipleSymbolizers) {
|
||||
config.zIndex = this.featureTypeCounter;
|
||||
rule.symbolizers.push(
|
||||
new OpenLayers.Symbolizer.Raster(config)
|
||||
);
|
||||
} else {
|
||||
rule.symbolizer["Raster"] = OpenLayers.Util.applyDefaults(
|
||||
config, rule.symbolizer["Raster"]
|
||||
);
|
||||
}
|
||||
},
|
||||
"Geometry": function(node, obj) {
|
||||
obj.geometry = {};
|
||||
@@ -236,32 +281,55 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, {
|
||||
});
|
||||
},
|
||||
"LineSymbolizer": function(node, rule) {
|
||||
// OpenLayers doesn't do painter's order, instead we extend
|
||||
var symbolizer = rule.symbolizer["Line"] || {};
|
||||
this.readChildNodes(node, symbolizer);
|
||||
// in case it didn't exist before
|
||||
rule.symbolizer["Line"] = symbolizer;
|
||||
var config = {};
|
||||
this.readChildNodes(node, config);
|
||||
if (this.multipleSymbolizers) {
|
||||
config.zIndex = this.featureTypeCounter;
|
||||
rule.symbolizers.push(
|
||||
new OpenLayers.Symbolizer.Line(config)
|
||||
);
|
||||
} else {
|
||||
rule.symbolizer["Line"] = OpenLayers.Util.applyDefaults(
|
||||
config, rule.symbolizer["Line"]
|
||||
);
|
||||
}
|
||||
},
|
||||
"PolygonSymbolizer": function(node, rule) {
|
||||
// OpenLayers doens't do painter's order, instead we extend
|
||||
var symbolizer = rule.symbolizer["Polygon"] || {
|
||||
var config = {
|
||||
fill: false,
|
||||
stroke: false
|
||||
};
|
||||
this.readChildNodes(node, symbolizer);
|
||||
// in case it didn't exist before
|
||||
rule.symbolizer["Polygon"] = symbolizer;
|
||||
if (!this.multipleSymbolizers) {
|
||||
config = rule.symbolizer["Polygon"] || config;
|
||||
}
|
||||
this.readChildNodes(node, config);
|
||||
if (this.multipleSymbolizers) {
|
||||
config.zIndex = this.featureTypeCounter;
|
||||
rule.symbolizers.push(
|
||||
new OpenLayers.Symbolizer.Polygon(config)
|
||||
);
|
||||
} else {
|
||||
rule.symbolizer["Polygon"] = config;
|
||||
}
|
||||
},
|
||||
"PointSymbolizer": function(node, rule) {
|
||||
// OpenLayers doens't do painter's order, instead we extend
|
||||
var symbolizer = rule.symbolizer["Point"] || {
|
||||
var config = {
|
||||
fill: false,
|
||||
stroke: false,
|
||||
graphic: false
|
||||
};
|
||||
this.readChildNodes(node, symbolizer);
|
||||
// in case it didn't exist before
|
||||
rule.symbolizer["Point"] = symbolizer;
|
||||
if (!this.multipleSymbolizers) {
|
||||
config = rule.symbolizer["Point"] || config;
|
||||
}
|
||||
this.readChildNodes(node, config);
|
||||
if (this.multipleSymbolizers) {
|
||||
config.zIndex = this.featureTypeCounter;
|
||||
rule.symbolizers.push(
|
||||
new OpenLayers.Symbolizer.Point(config)
|
||||
);
|
||||
} else {
|
||||
rule.symbolizer["Point"] = config;
|
||||
}
|
||||
},
|
||||
"Stroke": function(node, symbolizer) {
|
||||
symbolizer.stroke = true;
|
||||
@@ -566,7 +634,53 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, {
|
||||
}
|
||||
|
||||
// add FeatureTypeStyles
|
||||
this.writeNode("FeatureTypeStyle", style, node);
|
||||
if (this.multipleSymbolizers && 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];
|
||||
if (rule.symbolizers) {
|
||||
ruleMap = {};
|
||||
for (var j=0, jj=rule.symbolizers.length; j<jj; ++j) {
|
||||
symbolizer = rule.symbolizers[j];
|
||||
zIndex = symbolizer.zIndex;
|
||||
if (!(zIndex in ruleMap)) {
|
||||
clone = rule.clone();
|
||||
clone.symbolizers = [];
|
||||
ruleMap[zIndex] = clone;
|
||||
}
|
||||
ruleMap[zIndex].symbolizers.push(symbolizer.clone());
|
||||
}
|
||||
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(rule.clone());
|
||||
}
|
||||
}
|
||||
// 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 = style.clone();
|
||||
clone.rules = rulesByZ[zValues[i]];
|
||||
this.writeNode("FeatureTypeStyle", clone, node);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
this.writeNode("FeatureTypeStyle", style, node);
|
||||
}
|
||||
|
||||
return node;
|
||||
},
|
||||
@@ -626,17 +740,28 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, {
|
||||
);
|
||||
}
|
||||
|
||||
// add in symbolizers (relies on geometry type keys)
|
||||
var types = OpenLayers.Style.SYMBOLIZER_PREFIXES;
|
||||
var type, symbolizer;
|
||||
for(var i=0, len=types.length; i<len; ++i) {
|
||||
type = types[i];
|
||||
symbolizer = rule.symbolizer[type];
|
||||
if(symbolizer) {
|
||||
if (this.multipleSymbolizers && rule.symbolizers) {
|
||||
var symbolizer;
|
||||
for (var i=0, ii=rule.symbolizers.length; i<ii; ++i) {
|
||||
symbolizer = rule.symbolizers[i];
|
||||
type = symbolizer.CLASS_NAME.split(".").pop();
|
||||
this.writeNode(
|
||||
type + "Symbolizer", symbolizer, node
|
||||
);
|
||||
}
|
||||
} else {
|
||||
// add in symbolizers (relies on geometry type keys)
|
||||
var types = OpenLayers.Style.SYMBOLIZER_PREFIXES;
|
||||
for(var i=0, len=types.length; i<len; ++i) {
|
||||
type = types[i];
|
||||
symbolizer = rule.symbolizer[type];
|
||||
if(symbolizer) {
|
||||
this.writeNode(
|
||||
type + "Symbolizer", symbolizer, node
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
return node;
|
||||
|
||||
@@ -925,8 +1050,12 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, {
|
||||
if(symbolizer.graphicName) {
|
||||
this.writeNode("WellKnownName", symbolizer.graphicName, node);
|
||||
}
|
||||
this.writeNode("Fill", symbolizer, node);
|
||||
this.writeNode("Stroke", symbolizer, node);
|
||||
if (symbolizer.fill !== false) {
|
||||
this.writeNode("Fill", symbolizer, node);
|
||||
}
|
||||
if (symbolizer.stroke !== false) {
|
||||
this.writeNode("Stroke", symbolizer, node);
|
||||
}
|
||||
return node;
|
||||
},
|
||||
"WellKnownName": function(name) {
|
||||
@@ -967,4 +1096,4 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, {
|
||||
|
||||
CLASS_NAME: "OpenLayers.Format.SLD.v1"
|
||||
|
||||
});
|
||||
});
|
||||
@@ -6,6 +6,11 @@
|
||||
/**
|
||||
* @requires OpenLayers/Util.js
|
||||
* @requires OpenLayers/Style.js
|
||||
* @requires OpenLayers/Symbolizer/Point.js
|
||||
* @requires OpenLayers/Symbolizer/Line.js
|
||||
* @requires OpenLayers/Symbolizer/Polygon.js
|
||||
* @requires OpenLayers/Symbolizer/Text.js
|
||||
* @requires OpenLayers/Symbolizer/Raster.js
|
||||
*/
|
||||
|
||||
/**
|
||||
@@ -24,7 +29,7 @@ OpenLayers.Rule = OpenLayers.Class({
|
||||
* APIProperty: name
|
||||
* {String} name of this rule
|
||||
*/
|
||||
name: 'default',
|
||||
name: null,
|
||||
|
||||
/**
|
||||
* Property: title
|
||||
@@ -73,6 +78,17 @@ OpenLayers.Rule = OpenLayers.Class({
|
||||
*/
|
||||
symbolizer: null,
|
||||
|
||||
/**
|
||||
* Property: symbolizers
|
||||
* {Array} Collection of symbolizers associated with this rule. If
|
||||
* provided at construction, the symbolizers array has precedence
|
||||
* over the deprecated symbolizer property. Note that multiple
|
||||
* symbolizers are not currently supported by the vector renderers.
|
||||
* Rules with multiple symbolizers are currently only useful for
|
||||
* maintaining elements in an SLD document.
|
||||
*/
|
||||
symbolizers: null,
|
||||
|
||||
/**
|
||||
* APIProperty: minScaleDenominator
|
||||
* {Number} or {String} minimum scale at which to draw the feature.
|
||||
@@ -103,6 +119,9 @@ OpenLayers.Rule = OpenLayers.Class({
|
||||
initialize: function(options) {
|
||||
this.symbolizer = {};
|
||||
OpenLayers.Util.extend(this, options);
|
||||
if (this.symbolizers) {
|
||||
delete this.symbolizer;
|
||||
}
|
||||
this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_");
|
||||
},
|
||||
|
||||
@@ -115,6 +134,7 @@ OpenLayers.Rule = OpenLayers.Class({
|
||||
this.symbolizer[i] = null;
|
||||
}
|
||||
this.symbolizer = null;
|
||||
delete this.symbolizers;
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -187,16 +207,25 @@ OpenLayers.Rule = OpenLayers.Class({
|
||||
*/
|
||||
clone: function() {
|
||||
var options = OpenLayers.Util.extend({}, this);
|
||||
// clone symbolizer
|
||||
options.symbolizer = {};
|
||||
var value, type;
|
||||
for(var key in this.symbolizer) {
|
||||
value = this.symbolizer[key];
|
||||
type = typeof value;
|
||||
if(type === "object") {
|
||||
options.symbolizer[key] = OpenLayers.Util.extend({}, value);
|
||||
} else if(type === "string") {
|
||||
options.symbolizer[key] = value;
|
||||
if (this.symbolizers) {
|
||||
// clone symbolizers
|
||||
var len = this.symbolizers.length;
|
||||
options.symbolizers = new Array(len);
|
||||
for (var i=0; i<len; ++i) {
|
||||
options.symbolizers[i] = this.symbolizers[i].clone();
|
||||
}
|
||||
} else {
|
||||
// clone symbolizer
|
||||
options.symbolizer = {};
|
||||
var value, type;
|
||||
for(var key in this.symbolizer) {
|
||||
value = this.symbolizer[key];
|
||||
type = typeof value;
|
||||
if(type === "object") {
|
||||
options.symbolizer[key] = OpenLayers.Util.extend({}, value);
|
||||
} else if(type === "string") {
|
||||
options.symbolizer[key] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
// clone filter
|
||||
|
||||
106
lib/OpenLayers/Style2.js
Normal file
106
lib/OpenLayers/Style2.js
Normal file
@@ -0,0 +1,106 @@
|
||||
/**
|
||||
* @requires OpenLayers/Rule.js
|
||||
* @requires OpenLayers/Symbolizer/Point.js
|
||||
* @requires OpenLayers/Symbolizer/Line.js
|
||||
* @requires OpenLayers/Symbolizer/Polygon.js
|
||||
* @requires OpenLayers/Symbolizer/Text.js
|
||||
* @requires OpenLayers/Symbolizer/Raster.js
|
||||
*/
|
||||
|
||||
/**
|
||||
* Class: OpenLayers.Style2
|
||||
* This class represents a collection of rules for rendering features.
|
||||
*/
|
||||
OpenLayers.Style2 = OpenLayers.Class({
|
||||
|
||||
/**
|
||||
* Property: id
|
||||
* {String} A unique id for this session.
|
||||
*/
|
||||
id: null,
|
||||
|
||||
/**
|
||||
* APIProperty: name
|
||||
* {String} Style identifier.
|
||||
*/
|
||||
name: null,
|
||||
|
||||
/**
|
||||
* APIProperty: title
|
||||
* {String} Title of this style.
|
||||
*/
|
||||
title: null,
|
||||
|
||||
/**
|
||||
* APIProperty: description
|
||||
* {String} Description of this style.
|
||||
*/
|
||||
description: null,
|
||||
|
||||
/**
|
||||
* APIProperty: layerName
|
||||
* {<String>} Name of the layer that this style belongs to, usually
|
||||
* according to the NamedLayer attribute of an SLD document.
|
||||
*/
|
||||
layerName: null,
|
||||
|
||||
/**
|
||||
* APIProperty: isDefault
|
||||
* {Boolean}
|
||||
*/
|
||||
isDefault: false,
|
||||
|
||||
/**
|
||||
* APIProperty: rules
|
||||
* {Array(<OpenLayers.Rule>)} Collection of rendering rules.
|
||||
*/
|
||||
rules: null,
|
||||
|
||||
/**
|
||||
* Constructor: OpenLayers.Style2
|
||||
* Creates a style representing a collection of rendering rules.
|
||||
*
|
||||
* Parameters:
|
||||
* config - {Object} An object containing properties to be set on the
|
||||
* style. Any documented properties may be set at construction.
|
||||
*
|
||||
* Return:
|
||||
* {<OpenLayers.Style2>} A new style object.
|
||||
*/
|
||||
initialize: function(config) {
|
||||
OpenLayers.Util.extend(this, config);
|
||||
this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_");
|
||||
},
|
||||
|
||||
/**
|
||||
* APIMethod: destroy
|
||||
* nullify references to prevent circular references and memory leaks
|
||||
*/
|
||||
destroy: function() {
|
||||
for (var i=0, len=this.rules.length; i<len; i++) {
|
||||
this.rules[i].destroy();
|
||||
}
|
||||
delete this.rules;
|
||||
},
|
||||
|
||||
/**
|
||||
* APIMethod: clone
|
||||
* Clones this style.
|
||||
*
|
||||
* Returns:
|
||||
* {<OpenLayers.Style2>} Clone of this style.
|
||||
*/
|
||||
clone: function() {
|
||||
var config = OpenLayers.Util.extend({}, this);
|
||||
// clone rules
|
||||
if (this.rules) {
|
||||
config.rules = [];
|
||||
for (var i=0, len=this.rules.length; i<len; ++i) {
|
||||
config.rules.push(this.rules[i].clone());
|
||||
}
|
||||
}
|
||||
return new OpenLayers.Style2(config);
|
||||
},
|
||||
|
||||
CLASS_NAME: "OpenLayers.Style2"
|
||||
});
|
||||
46
lib/OpenLayers/Symbolizer.js
Normal file
46
lib/OpenLayers/Symbolizer.js
Normal file
@@ -0,0 +1,46 @@
|
||||
/**
|
||||
* Class: OpenLayers.Symbolizer
|
||||
* Base class representing a symbolizer used for feature rendering.
|
||||
*/
|
||||
OpenLayers.Symbolizer = OpenLayers.Class({
|
||||
|
||||
|
||||
/**
|
||||
* APIProperty: zIndex
|
||||
* {Number} The zIndex determines the rendering order for a symbolizer.
|
||||
* Symbolizers with larger zIndex values are rendered over symbolizers
|
||||
* with smaller zIndex values. Default is 0.
|
||||
*/
|
||||
zIndex: 0,
|
||||
|
||||
/**
|
||||
* Constructor: OpenLayers.Symbolizer
|
||||
* Instances of this class are not useful. See one of the subclasses.
|
||||
*
|
||||
* Parameters:
|
||||
* config - {Object} An object containing properties to be set on the
|
||||
* symbolizer. Any documented symbolizer property can be set at
|
||||
* construction.
|
||||
*
|
||||
* Returns:
|
||||
* A new symbolizer.
|
||||
*/
|
||||
initialize: function(config) {
|
||||
OpenLayers.Util.extend(this, config);
|
||||
},
|
||||
|
||||
/**
|
||||
* APIMethod: clone
|
||||
* Create a copy of this symbolizer.
|
||||
*
|
||||
* Returns a symbolizer of the same type with the same properties.
|
||||
*/
|
||||
clone: function() {
|
||||
var Type = eval(this.CLASS_NAME);
|
||||
return new Type(OpenLayers.Util.extend({}, this));
|
||||
},
|
||||
|
||||
CLASS_NAME: "OpenLayers.Symbolizer"
|
||||
|
||||
});
|
||||
|
||||
64
lib/OpenLayers/Symbolizer/Line.js
Normal file
64
lib/OpenLayers/Symbolizer/Line.js
Normal file
@@ -0,0 +1,64 @@
|
||||
/**
|
||||
* @requires OpenLayers/Symbolizer.js
|
||||
*/
|
||||
|
||||
/**
|
||||
* Class: OpenLayers.Symbolizer.Line
|
||||
* A symbolizer used to render line features.
|
||||
*/
|
||||
OpenLayers.Symbolizer.Line = OpenLayers.Class(OpenLayers.Symbolizer, {
|
||||
|
||||
/**
|
||||
* APIProperty: strokeColor
|
||||
* {String} Color for line stroke. This is a RGB hex value (e.g. "#ff0000"
|
||||
* for red).
|
||||
*/
|
||||
strokeColor: null,
|
||||
|
||||
/**
|
||||
* APIProperty: strokeOpacity
|
||||
* {Number} Stroke opacity (0-1).
|
||||
*/
|
||||
strokeOpacity: null,
|
||||
|
||||
/**
|
||||
* APIProperty: strokeWidth
|
||||
* {Number} Pixel stroke width.
|
||||
*/
|
||||
strokeWidth: null,
|
||||
|
||||
/**
|
||||
* APIProperty: strokeLinecap
|
||||
* {String} Stroke cap type ("butt", "round", or "square").
|
||||
*/
|
||||
strokeLinecap: null,
|
||||
|
||||
/**
|
||||
* Property: strokeDashstyle
|
||||
* {String} Stroke dash style according to the SLD spec. Note that the
|
||||
* OpenLayers values for strokeDashstyle ("dot", "dash", "dashdot",
|
||||
* "longdash", "longdashdot", or "solid") will not work in SLD, but
|
||||
* most SLD patterns will render correctly in OpenLayers.
|
||||
*/
|
||||
strokeDashstyle: "solid",
|
||||
|
||||
/**
|
||||
* Constructor: OpenLayers.Symbolizer.Line
|
||||
* Create a symbolizer for rendering lines.
|
||||
*
|
||||
* Parameters:
|
||||
* config - {Object} An object containing properties to be set on the
|
||||
* symbolizer. Any documented symbolizer property can be set at
|
||||
* construction.
|
||||
*
|
||||
* Returns:
|
||||
* A new line symbolizer.
|
||||
*/
|
||||
initialize: function(config) {
|
||||
OpenLayers.Symbolizer.prototype.initialize.apply(this, arguments);
|
||||
},
|
||||
|
||||
CLASS_NAME: "OpenLayers.Symbolizer.Line"
|
||||
|
||||
});
|
||||
|
||||
136
lib/OpenLayers/Symbolizer/Point.js
Normal file
136
lib/OpenLayers/Symbolizer/Point.js
Normal file
@@ -0,0 +1,136 @@
|
||||
/**
|
||||
* @requires OpenLayers/Symbolizer.js
|
||||
*/
|
||||
|
||||
/**
|
||||
* Class: OpenLayers.Symbolizer.Point
|
||||
* A symbolizer used to render point features.
|
||||
*/
|
||||
OpenLayers.Symbolizer.Point = OpenLayers.Class(OpenLayers.Symbolizer, {
|
||||
|
||||
/**
|
||||
* APIProperty: strokeColor
|
||||
* {String} Color for line stroke. This is a RGB hex value (e.g. "#ff0000"
|
||||
* for red).
|
||||
*/
|
||||
strokeColor: null,
|
||||
|
||||
/**
|
||||
* APIProperty: strokeOpacity
|
||||
* {Number} Stroke opacity (0-1).
|
||||
*/
|
||||
strokeOpacity: null,
|
||||
|
||||
/**
|
||||
* APIProperty: strokeWidth
|
||||
* {Number} Pixel stroke width.
|
||||
*/
|
||||
strokeWidth: null,
|
||||
|
||||
/**
|
||||
* APIProperty: strokeLinecap
|
||||
* {String} Stroke cap type ("butt", "round", or "square").
|
||||
*/
|
||||
strokeLinecap: null,
|
||||
|
||||
/**
|
||||
* Property: strokeDashstyle
|
||||
* {String} Stroke dash style according to the SLD spec. Note that the
|
||||
* OpenLayers values for strokeDashstyle ("dot", "dash", "dashdot",
|
||||
* "longdash", "longdashdot", or "solid") will not work in SLD, but
|
||||
* most SLD patterns will render correctly in OpenLayers.
|
||||
*/
|
||||
strokeDashstyle: "solid",
|
||||
|
||||
/**
|
||||
* APIProperty: fillColor
|
||||
* {String} RGB hex fill color (e.g. "#ff0000" for red).
|
||||
*/
|
||||
fillColor: null,
|
||||
|
||||
/**
|
||||
* APIProperty: fillOpacity
|
||||
* {Number} Fill opacity (0-1).
|
||||
*/
|
||||
fillOpacity: null,
|
||||
|
||||
/**
|
||||
* APIProperty: pointRadius
|
||||
* {Number} Pixel point radius.
|
||||
*/
|
||||
pointRadius: null,
|
||||
|
||||
/**
|
||||
* APIProperty: externalGraphic
|
||||
* {String} Url to an external graphic that will be used for rendering
|
||||
* points.
|
||||
*/
|
||||
externalGraphic: null,
|
||||
|
||||
/**
|
||||
* APIProperty: graphicWidth
|
||||
* {Number} Pixel width for sizing an external graphic.
|
||||
*/
|
||||
graphicWidth: null,
|
||||
|
||||
/**
|
||||
* APIProperty: graphicHeight
|
||||
* {Number} Pixel height for sizing an external graphic.
|
||||
*/
|
||||
graphicHeight: null,
|
||||
|
||||
/**
|
||||
* APIProperty: graphicOpacity
|
||||
* {Number} Opacity (0-1) for an external graphic.
|
||||
*/
|
||||
graphicOpacity: null,
|
||||
|
||||
/**
|
||||
* APIProperty: graphicXOffset
|
||||
* {Number} Pixel offset along the positive x axis for displacing an
|
||||
* external graphic.
|
||||
*/
|
||||
graphicXOffset: null,
|
||||
|
||||
/**
|
||||
* APIProperty: graphicYOffset
|
||||
* {Number} Pixel offset along the positive y axis for displacing an
|
||||
* external graphic.
|
||||
*/
|
||||
graphicYOffset: null,
|
||||
|
||||
/**
|
||||
* APIProperty: rotation
|
||||
* {Number} The rotation of a graphic in the clockwise direction about its
|
||||
* center point (or any point off center as specified by
|
||||
* <graphicXOffset> and <graphicYOffset>).
|
||||
*/
|
||||
rotation: null,
|
||||
|
||||
/**
|
||||
* APIProperty: graphicName
|
||||
* {String} Named graphic to use when rendering points. Supported values
|
||||
* include "circle", "square", "star", "x", "cross", and "triangle".
|
||||
*/
|
||||
graphicName: null,
|
||||
|
||||
/**
|
||||
* Constructor: OpenLayers.Symbolizer.Point
|
||||
* Create a symbolizer for rendering points.
|
||||
*
|
||||
* Parameters:
|
||||
* config - {Object} An object containing properties to be set on the
|
||||
* symbolizer. Any documented symbolizer property can be set at
|
||||
* construction.
|
||||
*
|
||||
* Returns:
|
||||
* A new point symbolizer.
|
||||
*/
|
||||
initialize: function(config) {
|
||||
OpenLayers.Symbolizer.prototype.initialize.apply(this, arguments);
|
||||
},
|
||||
|
||||
CLASS_NAME: "OpenLayers.Symbolizer.Point"
|
||||
|
||||
});
|
||||
|
||||
76
lib/OpenLayers/Symbolizer/Polygon.js
Normal file
76
lib/OpenLayers/Symbolizer/Polygon.js
Normal file
@@ -0,0 +1,76 @@
|
||||
/**
|
||||
* @requires OpenLayers/Symbolizer.js
|
||||
*/
|
||||
|
||||
/**
|
||||
* Class: OpenLayers.Symbolizer.Polygon
|
||||
* A symbolizer used to render line features.
|
||||
*/
|
||||
OpenLayers.Symbolizer.Polygon = OpenLayers.Class(OpenLayers.Symbolizer, {
|
||||
|
||||
/**
|
||||
* APIProperty: strokeColor
|
||||
* {String} Color for line stroke. This is a RGB hex value (e.g. "#ff0000"
|
||||
* for red).
|
||||
*/
|
||||
strokeColor: null,
|
||||
|
||||
/**
|
||||
* APIProperty: strokeOpacity
|
||||
* {Number} Stroke opacity (0-1).
|
||||
*/
|
||||
strokeOpacity: null,
|
||||
|
||||
/**
|
||||
* APIProperty: strokeWidth
|
||||
* {Number} Pixel stroke width.
|
||||
*/
|
||||
strokeWidth: null,
|
||||
|
||||
/**
|
||||
* APIProperty: strokeLinecap
|
||||
* {String} Stroke cap type ("butt", "round", or "square").
|
||||
*/
|
||||
strokeLinecap: null,
|
||||
|
||||
/**
|
||||
* Property: strokeDashstyle
|
||||
* {String} Stroke dash style according to the SLD spec. Note that the
|
||||
* OpenLayers values for strokeDashstyle ("dot", "dash", "dashdot",
|
||||
* "longdash", "longdashdot", or "solid") will not work in SLD, but
|
||||
* most SLD patterns will render correctly in OpenLayers.
|
||||
*/
|
||||
strokeDashstyle: "solid",
|
||||
|
||||
/**
|
||||
* APIProperty: fillColor
|
||||
* {String} RGB hex fill color (e.g. "#ff0000" for red).
|
||||
*/
|
||||
fillColor: null,
|
||||
|
||||
/**
|
||||
* APIProperty: fillOpacity
|
||||
* {Number} Fill opacity (0-1).
|
||||
*/
|
||||
fillOpacity: null,
|
||||
|
||||
/**
|
||||
* Constructor: OpenLayers.Symbolizer.Polygon
|
||||
* Create a symbolizer for rendering polygons.
|
||||
*
|
||||
* Parameters:
|
||||
* config - {Object} An object containing properties to be set on the
|
||||
* symbolizer. Any documented symbolizer property can be set at
|
||||
* construction.
|
||||
*
|
||||
* Returns:
|
||||
* A new polygon symbolizer.
|
||||
*/
|
||||
initialize: function(config) {
|
||||
OpenLayers.Symbolizer.prototype.initialize.apply(this, arguments);
|
||||
},
|
||||
|
||||
CLASS_NAME: "OpenLayers.Symbolizer.Polygon"
|
||||
|
||||
});
|
||||
|
||||
29
lib/OpenLayers/Symbolizer/Raster.js
Normal file
29
lib/OpenLayers/Symbolizer/Raster.js
Normal file
@@ -0,0 +1,29 @@
|
||||
/**
|
||||
* @requires OpenLayers/Symbolizer.js
|
||||
*/
|
||||
|
||||
/**
|
||||
* Class: OpenLayers.Symbolizer.Raster
|
||||
* A symbolizer used to render raster images.
|
||||
*/
|
||||
OpenLayers.Symbolizer.Raster = OpenLayers.Class(OpenLayers.Symbolizer, {
|
||||
|
||||
/**
|
||||
* Constructor: OpenLayers.Symbolizer.Raster
|
||||
* Create a symbolizer for rendering rasters.
|
||||
*
|
||||
* Parameters:
|
||||
* config - {Object} An object containing properties to be set on the
|
||||
* symbolizer. Any documented symbolizer property can be set at
|
||||
* construction.
|
||||
*
|
||||
* Returns:
|
||||
* A new raster symbolizer.
|
||||
*/
|
||||
initialize: function(config) {
|
||||
OpenLayers.Symbolizer.prototype.initialize.apply(this, arguments);
|
||||
},
|
||||
|
||||
CLASS_NAME: "OpenLayers.Symbolizer.Raster"
|
||||
|
||||
});
|
||||
60
lib/OpenLayers/Symbolizer/Text.js
Normal file
60
lib/OpenLayers/Symbolizer/Text.js
Normal file
@@ -0,0 +1,60 @@
|
||||
/**
|
||||
* @requires OpenLayers/Symbolizer.js
|
||||
*/
|
||||
|
||||
/**
|
||||
* Class: OpenLayers.Symbolizer.Text
|
||||
* A symbolizer used to render text labels for features.
|
||||
*/
|
||||
OpenLayers.Symbolizer.Text = OpenLayers.Class(OpenLayers.Symbolizer, {
|
||||
|
||||
/**
|
||||
* APIProperty: label
|
||||
* {String} The text for the label.
|
||||
*/
|
||||
label: null,
|
||||
|
||||
/**
|
||||
* APIProperty: fontFamily
|
||||
* {String} The font family for the label.
|
||||
*/
|
||||
fontFamily: null,
|
||||
|
||||
/**
|
||||
* APIProperty: fontSize
|
||||
* {String} The font size for the label.
|
||||
*/
|
||||
fontSize: null,
|
||||
|
||||
/**
|
||||
* APIProperty: fontWeight
|
||||
* {String} The font weight for the label.
|
||||
*/
|
||||
fontWeight: null,
|
||||
|
||||
/**
|
||||
* Property: fontStyle
|
||||
* {String} The font style for the label.
|
||||
*/
|
||||
fontStyle: null,
|
||||
|
||||
/**
|
||||
* Constructor: OpenLayers.Symbolizer.Text
|
||||
* Create a symbolizer for rendering text labels.
|
||||
*
|
||||
* Parameters:
|
||||
* config - {Object} An object containing properties to be set on the
|
||||
* symbolizer. Any documented symbolizer property can be set at
|
||||
* construction.
|
||||
*
|
||||
* Returns:
|
||||
* A new text symbolizer.
|
||||
*/
|
||||
initialize: function(config) {
|
||||
OpenLayers.Symbolizer.prototype.initialize.apply(this, arguments);
|
||||
},
|
||||
|
||||
CLASS_NAME: "OpenLayers.Symbolizer.Text"
|
||||
|
||||
});
|
||||
|
||||
@@ -2,6 +2,11 @@
|
||||
<head>
|
||||
<script src="../../../lib/OpenLayers.js"></script>
|
||||
<script type="text/javascript">
|
||||
|
||||
var xml = new OpenLayers.Format.XML();
|
||||
function readXML(id) {
|
||||
return xml.read(document.getElementById(id).firstChild.nodeValue);
|
||||
}
|
||||
|
||||
var sld =
|
||||
'<StyledLayerDescriptor version="1.0.0" ' +
|
||||
@@ -439,9 +444,422 @@
|
||||
|
||||
t.xml_eq(got, expected, "Successfully round tripped RasterSymbolizer");
|
||||
}
|
||||
|
||||
function test_zIndex(t) {
|
||||
t.plan(1);
|
||||
|
||||
var format = new OpenLayers.Format.SLD.v1_0_0({
|
||||
multipleSymbolizers: true
|
||||
});
|
||||
|
||||
// three zIndex values -> three FeatureTypeStyle elements
|
||||
var style = new OpenLayers.Style2({
|
||||
rules: [
|
||||
new OpenLayers.Rule({
|
||||
filter: new OpenLayers.Filter.Comparison({
|
||||
type: OpenLayers.Filter.Comparison.EQUAL_TO,
|
||||
property: "foo",
|
||||
value: "bar"
|
||||
}),
|
||||
minScaleDenominator: 100000,
|
||||
maxScaleDenominator: 200000,
|
||||
symbolizers: [
|
||||
new OpenLayers.Symbolizer.Line({
|
||||
strokeColor: "green",
|
||||
strokeWidth: 2,
|
||||
zIndex: 2
|
||||
}),
|
||||
new OpenLayers.Symbolizer.Line({
|
||||
strokeColor: "red",
|
||||
strokeWidth: 3,
|
||||
zIndex: -1
|
||||
}),
|
||||
new OpenLayers.Symbolizer.Line({
|
||||
strokeColor: "blue",
|
||||
strokeWidth: 1,
|
||||
zIndex: 5
|
||||
})
|
||||
]
|
||||
}),
|
||||
new OpenLayers.Rule({
|
||||
filter: new OpenLayers.Filter.Comparison({
|
||||
type: OpenLayers.Filter.Comparison.EQUAL_TO,
|
||||
property: "foo",
|
||||
value: "baz"
|
||||
}),
|
||||
symbolizers: [
|
||||
new OpenLayers.Symbolizer.Line({
|
||||
strokeColor: "#000000",
|
||||
strokeWidth: 2,
|
||||
zIndex: 2
|
||||
})
|
||||
]
|
||||
})
|
||||
]
|
||||
});
|
||||
|
||||
var got = format.writeNode("sld:UserStyle", style);
|
||||
var exp = readXML("zindex_test.sld").documentElement;
|
||||
t.xml_eq(got, exp, "duplicated rules to write zIndex as FeatureTypeStyle elements");
|
||||
|
||||
}
|
||||
|
||||
function test_read_FeatureTypeStyles(t) {
|
||||
|
||||
t.plan(13);
|
||||
|
||||
var format = new OpenLayers.Format.SLD.v1_0_0({
|
||||
multipleSymbolizers: true,
|
||||
namedLayersAsArray: true
|
||||
});
|
||||
var doc = readXML("line_linewithborder.sld");
|
||||
|
||||
var obj = format.read(doc);
|
||||
|
||||
t.eq(obj.namedLayers.length, 1, "got one named layer");
|
||||
var namedLayer = obj.namedLayers[0];
|
||||
|
||||
t.eq(namedLayer.userStyles.length, 1, "got one user style");
|
||||
var userStyle = namedLayer.userStyles[0];
|
||||
t.ok(userStyle instanceof OpenLayers.Style2, "user style represented with OpenLayers.Style2");
|
||||
|
||||
// check rules and symbolizers
|
||||
var rule, symbolizer;
|
||||
|
||||
t.eq(userStyle.rules.length, 2, "pulled two rules (from two FeatureTypeStyle elements)");
|
||||
rule = userStyle.rules[0];
|
||||
t.ok(rule instanceof OpenLayers.Rule, "first rule is an OpenLayers.Rule");
|
||||
|
||||
t.eq(rule.symbolizers && rule.symbolizers.length, 1, "first rule has one symbolizer");
|
||||
symbolizer = rule.symbolizers[0];
|
||||
t.ok(symbolizer instanceof OpenLayers.Symbolizer, "first symbolizer in first rule is an OpenLayers.Symbolizer");
|
||||
t.ok(symbolizer instanceof OpenLayers.Symbolizer.Line, "first symbolizer in first rule is an OpenLayers.Symbolizer.Line");
|
||||
t.eq(symbolizer.zIndex, 0, "symbolizer from first FeatureTypeStyle element has zIndex 0");
|
||||
|
||||
rule = userStyle.rules[1];
|
||||
t.eq(rule.symbolizers && rule.symbolizers.length, 1, "second rule has one symbolizer");
|
||||
symbolizer = rule.symbolizers[0];
|
||||
t.ok(symbolizer instanceof OpenLayers.Symbolizer, "first symbolizer in second rule is an OpenLayers.Symbolizer");
|
||||
t.ok(symbolizer instanceof OpenLayers.Symbolizer.Line, "first symbolizer in second rule is an OpenLayers.Symbolizer.Line");
|
||||
t.eq(symbolizer.zIndex, 1, "symbolizer from second FeatureTypeStyle element has zIndex 1");
|
||||
|
||||
}
|
||||
|
||||
function test_roundtrip(t) {
|
||||
|
||||
t.plan(5);
|
||||
|
||||
var format = new OpenLayers.Format.SLD.v1_0_0({
|
||||
multipleSymbolizers: true,
|
||||
namedLayersAsArray: true
|
||||
});
|
||||
var doc, out;
|
||||
|
||||
// two FeatureTypeStyle elements and line symbolizers
|
||||
doc = readXML("line_linewithborder.sld");
|
||||
out = format.write(format.read(doc));
|
||||
t.xml_eq(out, doc.documentElement, "round-tripped line_linewithborder.sld");
|
||||
|
||||
// three FeatureTypeStyle elements and line symbolizers
|
||||
doc = readXML("line_attributebasedline.sld");
|
||||
out = format.write(format.read(doc));
|
||||
t.xml_eq(out, doc.documentElement, "round-tripped line_attributebasedline.sld");
|
||||
|
||||
// point symbolizer and text symbolizer
|
||||
doc = readXML("point_pointwithdefaultlabel.sld");
|
||||
out = format.write(format.read(doc));
|
||||
t.xml_eq(out, doc.documentElement, "round-tripped point_pointwithdefaultlabel.sld");
|
||||
|
||||
// polygon symbolizer with fill only
|
||||
doc = readXML("polygon_simplepolygon.sld");
|
||||
out = format.write(format.read(doc));
|
||||
t.xml_eq(out, doc.documentElement, "round-tripped polygon_simplepolygon.sld");
|
||||
|
||||
// polygon symbolizer and text symbolizer with halo
|
||||
doc = readXML("polygon_labelhalo.sld");
|
||||
out = format.write(format.read(doc));
|
||||
t.xml_eq(out, doc.documentElement, "round-tripped polygon_labelhalo.sld");
|
||||
|
||||
}
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="line_linewithborder.sld"><!--
|
||||
<StyledLayerDescriptor version="1.0.0"
|
||||
xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd"
|
||||
xmlns="http://www.opengis.net/sld"
|
||||
xmlns:ogc="http://www.opengis.net/ogc"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<NamedLayer>
|
||||
<Name>Line with border</Name>
|
||||
<UserStyle>
|
||||
<Title>SLD Cook Book: Line w2th border</Title>
|
||||
<FeatureTypeStyle>
|
||||
<Rule>
|
||||
<LineSymbolizer>
|
||||
<Stroke>
|
||||
<CssParameter name="stroke">#333333</CssParameter>
|
||||
<CssParameter name="stroke-width">5</CssParameter>
|
||||
<CssParameter name="stroke-linecap">round</CssParameter>
|
||||
</Stroke>
|
||||
</LineSymbolizer>
|
||||
</Rule>
|
||||
</FeatureTypeStyle>
|
||||
<FeatureTypeStyle>
|
||||
<Rule>
|
||||
<LineSymbolizer>
|
||||
<Stroke>
|
||||
<CssParameter name="stroke">#6699FF</CssParameter>
|
||||
<CssParameter name="stroke-width">3</CssParameter>
|
||||
<CssParameter name="stroke-linecap">round</CssParameter>
|
||||
</Stroke>
|
||||
</LineSymbolizer>
|
||||
</Rule>
|
||||
</FeatureTypeStyle>
|
||||
</UserStyle>
|
||||
</NamedLayer>
|
||||
</StyledLayerDescriptor>
|
||||
--></div>
|
||||
<div id="line_attributebasedline.sld"><!--
|
||||
<StyledLayerDescriptor version="1.0.0"
|
||||
xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd"
|
||||
xmlns="http://www.opengis.net/sld"
|
||||
xmlns:ogc="http://www.opengis.net/ogc"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<NamedLayer>
|
||||
<Name>Attribute-based line</Name>
|
||||
<UserStyle>
|
||||
<Title>SLD Cook Book: Attribute-based line</Title>
|
||||
<FeatureTypeStyle>
|
||||
<Rule>
|
||||
<Name>local-road</Name>
|
||||
<ogc:Filter>
|
||||
<ogc:PropertyIsEqualTo>
|
||||
<ogc:PropertyName>type</ogc:PropertyName>
|
||||
<ogc:Literal>local-road</ogc:Literal>
|
||||
</ogc:PropertyIsEqualTo>
|
||||
</ogc:Filter>
|
||||
<LineSymbolizer>
|
||||
<Stroke>
|
||||
<CssParameter name="stroke">#009933</CssParameter>
|
||||
<CssParameter name="stroke-width">2</CssParameter>
|
||||
</Stroke>
|
||||
</LineSymbolizer>
|
||||
</Rule>
|
||||
</FeatureTypeStyle>
|
||||
<FeatureTypeStyle>
|
||||
<Rule>
|
||||
<Name>secondary</Name>
|
||||
<ogc:Filter>
|
||||
<ogc:PropertyIsEqualTo>
|
||||
<ogc:PropertyName>type</ogc:PropertyName>
|
||||
<ogc:Literal>secondary</ogc:Literal>
|
||||
</ogc:PropertyIsEqualTo>
|
||||
</ogc:Filter>
|
||||
<LineSymbolizer>
|
||||
<Stroke>
|
||||
<CssParameter name="stroke">#0055CC</CssParameter>
|
||||
<CssParameter name="stroke-width">3</CssParameter>
|
||||
</Stroke>
|
||||
</LineSymbolizer>
|
||||
</Rule>
|
||||
</FeatureTypeStyle>
|
||||
<FeatureTypeStyle>
|
||||
<Rule>
|
||||
<Name>highway</Name>
|
||||
<ogc:Filter>
|
||||
<ogc:PropertyIsEqualTo>
|
||||
<ogc:PropertyName>type</ogc:PropertyName>
|
||||
<ogc:Literal>highway</ogc:Literal>
|
||||
</ogc:PropertyIsEqualTo>
|
||||
</ogc:Filter>
|
||||
<LineSymbolizer>
|
||||
<Stroke>
|
||||
<CssParameter name="stroke">#FF0000</CssParameter>
|
||||
<CssParameter name="stroke-width">6</CssParameter>
|
||||
</Stroke>
|
||||
</LineSymbolizer>
|
||||
</Rule>
|
||||
</FeatureTypeStyle>
|
||||
</UserStyle>
|
||||
</NamedLayer>
|
||||
</StyledLayerDescriptor>
|
||||
--></div>
|
||||
<div id="point_pointwithdefaultlabel.sld"><!--
|
||||
<StyledLayerDescriptor version="1.0.0"
|
||||
xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd"
|
||||
xmlns="http://www.opengis.net/sld"
|
||||
xmlns:ogc="http://www.opengis.net/ogc"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<NamedLayer>
|
||||
<Name>Point with default label</Name>
|
||||
<UserStyle>
|
||||
<Title>GeoServer SLD Cook Book: Point with default label</Title>
|
||||
<FeatureTypeStyle>
|
||||
<Rule>
|
||||
<PointSymbolizer>
|
||||
<Graphic>
|
||||
<Mark>
|
||||
<WellKnownName>circle</WellKnownName>
|
||||
<Fill>
|
||||
<CssParameter name="fill">#FF0000</CssParameter>
|
||||
</Fill>
|
||||
</Mark>
|
||||
<Size>6</Size>
|
||||
</Graphic>
|
||||
</PointSymbolizer>
|
||||
<TextSymbolizer>
|
||||
<Label>
|
||||
<ogc:PropertyName>name</ogc:PropertyName>
|
||||
</Label>
|
||||
<Fill>
|
||||
<CssParameter name="fill">#000000</CssParameter>
|
||||
</Fill>
|
||||
</TextSymbolizer>
|
||||
</Rule>
|
||||
</FeatureTypeStyle>
|
||||
</UserStyle>
|
||||
</NamedLayer>
|
||||
</StyledLayerDescriptor>
|
||||
--></div>
|
||||
<div id="polygon_simplepolygon.sld"><!--
|
||||
<StyledLayerDescriptor version="1.0.0"
|
||||
xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd"
|
||||
xmlns="http://www.opengis.net/sld"
|
||||
xmlns:ogc="http://www.opengis.net/ogc"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<NamedLayer>
|
||||
<Name>Simple polygon</Name>
|
||||
<UserStyle>
|
||||
<Title>SLD Cook Book: Simple polygon</Title>
|
||||
<FeatureTypeStyle>
|
||||
<Rule>
|
||||
<PolygonSymbolizer>
|
||||
<Fill>
|
||||
<CssParameter name="fill">#000080</CssParameter>
|
||||
</Fill>
|
||||
</PolygonSymbolizer>
|
||||
</Rule>
|
||||
</FeatureTypeStyle>
|
||||
</UserStyle>
|
||||
</NamedLayer>
|
||||
</StyledLayerDescriptor>
|
||||
--></div>
|
||||
<div id="polygon_labelhalo.sld"><!--
|
||||
<StyledLayerDescriptor version="1.0.0"
|
||||
xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd"
|
||||
xmlns="http://www.opengis.net/sld"
|
||||
xmlns:ogc="http://www.opengis.net/ogc"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<NamedLayer>
|
||||
<Name>Label halo</Name>
|
||||
<UserStyle>
|
||||
<Title>SLD Cook Book: Label halo</Title>
|
||||
<FeatureTypeStyle>
|
||||
<Rule>
|
||||
<PolygonSymbolizer>
|
||||
<Fill>
|
||||
<CssParameter name="fill">#40FF40</CssParameter>
|
||||
</Fill>
|
||||
<Stroke>
|
||||
<CssParameter name="stroke">#FFFFFF</CssParameter>
|
||||
<CssParameter name="stroke-width">2</CssParameter>
|
||||
</Stroke>
|
||||
</PolygonSymbolizer>
|
||||
<TextSymbolizer>
|
||||
<Label>
|
||||
<ogc:PropertyName>name</ogc:PropertyName>
|
||||
</Label>
|
||||
<Halo>
|
||||
<Radius>3</Radius>
|
||||
<Fill>
|
||||
<CssParameter name="fill">#FFFFFF</CssParameter>
|
||||
</Fill>
|
||||
</Halo>
|
||||
</TextSymbolizer>
|
||||
</Rule>
|
||||
</FeatureTypeStyle>
|
||||
</UserStyle>
|
||||
</NamedLayer>
|
||||
</StyledLayerDescriptor>
|
||||
--></div>
|
||||
<div id="zindex_test.sld"><!--
|
||||
<sld:UserStyle xmlns:sld="http://www.opengis.net/sld">
|
||||
<sld:FeatureTypeStyle>
|
||||
<sld:Rule>
|
||||
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
|
||||
<ogc:PropertyIsEqualTo>
|
||||
<ogc:PropertyName>foo</ogc:PropertyName>
|
||||
<ogc:Literal>bar</ogc:Literal>
|
||||
</ogc:PropertyIsEqualTo>
|
||||
</ogc:Filter>
|
||||
<sld:MinScaleDenominator>100000</sld:MinScaleDenominator>
|
||||
<sld:MaxScaleDenominator>200000</sld:MaxScaleDenominator>
|
||||
<sld:LineSymbolizer>
|
||||
<sld:Stroke>
|
||||
<sld:CssParameter name="stroke">red</sld:CssParameter>
|
||||
<sld:CssParameter name="stroke-width">3</sld:CssParameter>
|
||||
</sld:Stroke>
|
||||
</sld:LineSymbolizer>
|
||||
</sld:Rule>
|
||||
</sld:FeatureTypeStyle>
|
||||
<sld:FeatureTypeStyle>
|
||||
<sld:Rule>
|
||||
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
|
||||
<ogc:PropertyIsEqualTo>
|
||||
<ogc:PropertyName>foo</ogc:PropertyName>
|
||||
<ogc:Literal>bar</ogc:Literal>
|
||||
</ogc:PropertyIsEqualTo>
|
||||
</ogc:Filter>
|
||||
<sld:MinScaleDenominator>100000</sld:MinScaleDenominator>
|
||||
<sld:MaxScaleDenominator>200000</sld:MaxScaleDenominator>
|
||||
<sld:LineSymbolizer>
|
||||
<sld:Stroke>
|
||||
<sld:CssParameter name="stroke">green</sld:CssParameter>
|
||||
<sld:CssParameter name="stroke-width">2</sld:CssParameter>
|
||||
</sld:Stroke>
|
||||
</sld:LineSymbolizer>
|
||||
</sld:Rule>
|
||||
<sld:Rule>
|
||||
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
|
||||
<ogc:PropertyIsEqualTo>
|
||||
<ogc:PropertyName>foo</ogc:PropertyName>
|
||||
<ogc:Literal>baz</ogc:Literal>
|
||||
</ogc:PropertyIsEqualTo>
|
||||
</ogc:Filter>
|
||||
<sld:LineSymbolizer>
|
||||
<sld:Stroke>
|
||||
<sld:CssParameter name="stroke">#000000</sld:CssParameter>
|
||||
<sld:CssParameter name="stroke-width">2</sld:CssParameter>
|
||||
</sld:Stroke>
|
||||
</sld:LineSymbolizer>
|
||||
</sld:Rule>
|
||||
</sld:FeatureTypeStyle>
|
||||
<sld:FeatureTypeStyle>
|
||||
<sld:Rule>
|
||||
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
|
||||
<ogc:PropertyIsEqualTo>
|
||||
<ogc:PropertyName>foo</ogc:PropertyName>
|
||||
<ogc:Literal>bar</ogc:Literal>
|
||||
</ogc:PropertyIsEqualTo>
|
||||
</ogc:Filter>
|
||||
<sld:MinScaleDenominator>100000</sld:MinScaleDenominator>
|
||||
<sld:MaxScaleDenominator>200000</sld:MaxScaleDenominator>
|
||||
<sld:LineSymbolizer>
|
||||
<sld:Stroke>
|
||||
<sld:CssParameter name="stroke">blue</sld:CssParameter>
|
||||
<sld:CssParameter name="stroke-width">1</sld:CssParameter>
|
||||
</sld:Stroke>
|
||||
</sld:LineSymbolizer>
|
||||
</sld:Rule>
|
||||
</sld:FeatureTypeStyle>
|
||||
</sld:UserStyle>
|
||||
--></div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
|
||||
function test_clone(t) {
|
||||
|
||||
t.plan(7);
|
||||
t.plan(9);
|
||||
|
||||
var rule = new OpenLayers.Rule({
|
||||
name: "test rule",
|
||||
@@ -81,6 +81,30 @@
|
||||
|
||||
rule.destroy();
|
||||
clone.destroy();
|
||||
|
||||
// test multiple symbolizers
|
||||
rule = new OpenLayers.Rule({
|
||||
name: "test rule",
|
||||
minScaleDenominator: 10,
|
||||
maxScaleDenominator: 20,
|
||||
filter: new OpenLayers.Filter.Comparison({
|
||||
type: OpenLayers.Filter.Comparison.EQUAL_TO,
|
||||
property: "prop",
|
||||
value: "value"
|
||||
}),
|
||||
symbolizers: [
|
||||
new OpenLayers.Symbolizer.Line({
|
||||
strokeColor: "black"
|
||||
})
|
||||
]
|
||||
});
|
||||
clone = rule.clone();
|
||||
|
||||
t.eq(clone.symbolizers.length, 1, "clone has one symbolizer");
|
||||
t.ok(clone.symbolizers[0] !== rule.symbolizers[0], "clone has different symbolizers than original");
|
||||
|
||||
clone.destroy();
|
||||
rule.destroy();
|
||||
|
||||
}
|
||||
|
||||
|
||||
56
tests/Style2.html
Normal file
56
tests/Style2.html
Normal file
@@ -0,0 +1,56 @@
|
||||
<html>
|
||||
<head>
|
||||
<script src="../lib/OpenLayers.js"></script>
|
||||
<script type="text/javascript">
|
||||
|
||||
function test_constructor(t) {
|
||||
t.plan(4);
|
||||
|
||||
var rules = [
|
||||
new OpenLayers.Rule({
|
||||
symbolizer: {fillColor: "red"},
|
||||
filter: new OpenLayers.Filter.Comparison({
|
||||
type: OpenLayers.Filter.Comparison.EQUAL_TO,
|
||||
property: "type",
|
||||
value: "fire engine"
|
||||
})
|
||||
}),
|
||||
new OpenLayers.Rule({
|
||||
symbolizer: {fillColor: "yellow"},
|
||||
filter: new OpenLayers.Filter.Comparison({
|
||||
type: OpenLayers.Filter.Comparison.EQUAL_TO,
|
||||
property: "type",
|
||||
value: "sports car"
|
||||
})
|
||||
})
|
||||
];
|
||||
var style = new OpenLayers.Style2({rules: rules});
|
||||
t.ok(style instanceof OpenLayers.Style2, "correct type");
|
||||
t.eq(style.rules.length, 2, "correct number of rules added");
|
||||
t.ok(style.rules[0] === rules[0], "correct first rule added");
|
||||
t.ok(style.rules[1] === rules[1], "correct second rule added");
|
||||
}
|
||||
|
||||
function test_destroy(t) {
|
||||
t.plan(1);
|
||||
|
||||
var style = new OpenLayers.Style2({
|
||||
rules: [
|
||||
new OpenLayers.Rule({
|
||||
symbolizers: [
|
||||
new OpenLayers.Symbolizer.Point({
|
||||
fillColor: "fuchsia"
|
||||
})
|
||||
]
|
||||
})
|
||||
]
|
||||
});
|
||||
style.destroy();
|
||||
t.ok(!style.rules, "rules array gone");
|
||||
}
|
||||
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body></body>
|
||||
</html>
|
||||
31
tests/Symbolizer.html
Normal file
31
tests/Symbolizer.html
Normal file
@@ -0,0 +1,31 @@
|
||||
<html>
|
||||
<head>
|
||||
<script src="../lib/OpenLayers.js"></script>
|
||||
<script type="text/javascript">
|
||||
|
||||
function test_constructor(t) {
|
||||
t.plan(2);
|
||||
|
||||
var symbolizer = new OpenLayers.Symbolizer({foo: "bar"});
|
||||
|
||||
t.ok(symbolizer instanceof OpenLayers.Symbolizer, "correct type");
|
||||
t.eq(symbolizer.foo, "bar", "constructor applies config properties");
|
||||
|
||||
}
|
||||
|
||||
function test_clone(t) {
|
||||
t.plan(2);
|
||||
|
||||
var symbolizer = new OpenLayers.Symbolizer({foo: "bar"});
|
||||
var clone = symbolizer.clone();
|
||||
|
||||
t.ok(clone instanceof OpenLayers.Symbolizer, "correct type");
|
||||
t.eq(clone.foo, "bar", "clone copies properties");
|
||||
|
||||
}
|
||||
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body></body>
|
||||
</html>
|
||||
32
tests/Symbolizer/Line.html
Normal file
32
tests/Symbolizer/Line.html
Normal file
@@ -0,0 +1,32 @@
|
||||
<html>
|
||||
<head>
|
||||
<script src="../../lib/OpenLayers.js"></script>
|
||||
<script type="text/javascript">
|
||||
|
||||
function test_constructor(t) {
|
||||
t.plan(3);
|
||||
|
||||
var symbolizer = new OpenLayers.Symbolizer.Line({foo: "bar"});
|
||||
|
||||
t.ok(symbolizer instanceof OpenLayers.Symbolizer, "instance of OpenLayers.Symbolizer");
|
||||
t.ok(symbolizer instanceof OpenLayers.Symbolizer.Line, "instance of OpenLayers.Symbolizer.Line");
|
||||
t.eq(symbolizer.foo, "bar", "constructor applies config properties");
|
||||
|
||||
}
|
||||
|
||||
function test_clone(t) {
|
||||
t.plan(2);
|
||||
|
||||
var symbolizer = new OpenLayers.Symbolizer.Line({foo: "bar"});
|
||||
var clone = symbolizer.clone();
|
||||
|
||||
t.ok(clone instanceof OpenLayers.Symbolizer.Line, "correct type");
|
||||
t.eq(clone.foo, "bar", "clone copies properties");
|
||||
|
||||
}
|
||||
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body></body>
|
||||
</html>
|
||||
32
tests/Symbolizer/Point.html
Normal file
32
tests/Symbolizer/Point.html
Normal file
@@ -0,0 +1,32 @@
|
||||
<html>
|
||||
<head>
|
||||
<script src="../../lib/OpenLayers.js"></script>
|
||||
<script type="text/javascript">
|
||||
|
||||
function test_constructor(t) {
|
||||
t.plan(3);
|
||||
|
||||
var symbolizer = new OpenLayers.Symbolizer.Point({foo: "bar"});
|
||||
|
||||
t.ok(symbolizer instanceof OpenLayers.Symbolizer, "instance of OpenLayers.Symbolizer");
|
||||
t.ok(symbolizer instanceof OpenLayers.Symbolizer.Point, "instance of OpenLayers.Symbolizer.Point");
|
||||
t.eq(symbolizer.foo, "bar", "constructor applies config properties");
|
||||
|
||||
}
|
||||
|
||||
function test_clone(t) {
|
||||
t.plan(2);
|
||||
|
||||
var symbolizer = new OpenLayers.Symbolizer.Point({foo: "bar"});
|
||||
var clone = symbolizer.clone();
|
||||
|
||||
t.ok(clone instanceof OpenLayers.Symbolizer.Point, "correct type");
|
||||
t.eq(clone.foo, "bar", "clone copies properties");
|
||||
|
||||
}
|
||||
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body></body>
|
||||
</html>
|
||||
32
tests/Symbolizer/Polygon.html
Normal file
32
tests/Symbolizer/Polygon.html
Normal file
@@ -0,0 +1,32 @@
|
||||
<html>
|
||||
<head>
|
||||
<script src="../../lib/OpenLayers.js"></script>
|
||||
<script type="text/javascript">
|
||||
|
||||
function test_constructor(t) {
|
||||
t.plan(3);
|
||||
|
||||
var symbolizer = new OpenLayers.Symbolizer.Polygon({foo: "bar"});
|
||||
|
||||
t.ok(symbolizer instanceof OpenLayers.Symbolizer, "instance of OpenLayers.Symbolizer");
|
||||
t.ok(symbolizer instanceof OpenLayers.Symbolizer.Polygon, "instance of OpenLayers.Symbolizer.Polygon");
|
||||
t.eq(symbolizer.foo, "bar", "constructor applies config properties");
|
||||
|
||||
}
|
||||
|
||||
function test_clone(t) {
|
||||
t.plan(2);
|
||||
|
||||
var symbolizer = new OpenLayers.Symbolizer.Polygon({foo: "bar"});
|
||||
var clone = symbolizer.clone();
|
||||
|
||||
t.ok(clone instanceof OpenLayers.Symbolizer.Polygon, "correct type");
|
||||
t.eq(clone.foo, "bar", "clone copies properties");
|
||||
|
||||
}
|
||||
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body></body>
|
||||
</html>
|
||||
32
tests/Symbolizer/Raster.html
Normal file
32
tests/Symbolizer/Raster.html
Normal file
@@ -0,0 +1,32 @@
|
||||
<html>
|
||||
<head>
|
||||
<script src="../../lib/OpenLayers.js"></script>
|
||||
<script type="text/javascript">
|
||||
|
||||
function test_constructor(t) {
|
||||
t.plan(3);
|
||||
|
||||
var symbolizer = new OpenLayers.Symbolizer.Raster({foo: "bar"});
|
||||
|
||||
t.ok(symbolizer instanceof OpenLayers.Symbolizer, "instance of OpenLayers.Symbolizer");
|
||||
t.ok(symbolizer instanceof OpenLayers.Symbolizer.Raster, "instance of OpenLayers.Symbolizer.Raster");
|
||||
t.eq(symbolizer.foo, "bar", "constructor applies config properties");
|
||||
|
||||
}
|
||||
|
||||
function test_clone(t) {
|
||||
t.plan(2);
|
||||
|
||||
var symbolizer = new OpenLayers.Symbolizer.Raster({foo: "bar"});
|
||||
var clone = symbolizer.clone();
|
||||
|
||||
t.ok(clone instanceof OpenLayers.Symbolizer.Raster, "correct type");
|
||||
t.eq(clone.foo, "bar", "clone copies properties");
|
||||
|
||||
}
|
||||
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body></body>
|
||||
</html>
|
||||
32
tests/Symbolizer/Text.html
Normal file
32
tests/Symbolizer/Text.html
Normal file
@@ -0,0 +1,32 @@
|
||||
<html>
|
||||
<head>
|
||||
<script src="../../lib/OpenLayers.js"></script>
|
||||
<script type="text/javascript">
|
||||
|
||||
function test_constructor(t) {
|
||||
t.plan(3);
|
||||
|
||||
var symbolizer = new OpenLayers.Symbolizer.Text({foo: "bar"});
|
||||
|
||||
t.ok(symbolizer instanceof OpenLayers.Symbolizer, "instance of OpenLayers.Symbolizer");
|
||||
t.ok(symbolizer instanceof OpenLayers.Symbolizer.Text, "instance of OpenLayers.Symbolizer.Text");
|
||||
t.eq(symbolizer.foo, "bar", "constructor applies config properties");
|
||||
|
||||
}
|
||||
|
||||
function test_clone(t) {
|
||||
t.plan(2);
|
||||
|
||||
var symbolizer = new OpenLayers.Symbolizer.Text({foo: "bar"});
|
||||
var clone = symbolizer.clone();
|
||||
|
||||
t.ok(clone instanceof OpenLayers.Symbolizer.Text, "correct type");
|
||||
t.eq(clone.foo, "bar", "clone copies properties");
|
||||
|
||||
}
|
||||
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body></body>
|
||||
</html>
|
||||
@@ -182,7 +182,14 @@
|
||||
<li>Strategy/Save.html</li>
|
||||
<li>Strategy/Refresh.html</li>
|
||||
<li>Style.html</li>
|
||||
<li>Style2.html</li>
|
||||
<li>StyleMap.html</li>
|
||||
<li>Symbolizer.html</li>
|
||||
<li>Symbolizer/Line.html</li>
|
||||
<li>Symbolizer/Point.html</li>
|
||||
<li>Symbolizer/Polygon.html</li>
|
||||
<li>Symbolizer/Raster.html</li>
|
||||
<li>Symbolizer/Text.html</li>
|
||||
<li>Tile.html</li>
|
||||
<li>Tile/Image.html</li>
|
||||
<li>Tile/Image/IFrame.html</li>
|
||||
|
||||
Reference in New Issue
Block a user