Files
openlayers/tests/Format/SLD/v1_0_0.html

448 lines
19 KiB
HTML

<html>
<head>
<script src="../../../lib/OpenLayers.js"></script>
<script type="text/javascript">
var sld =
'<StyledLayerDescriptor version="1.0.0" ' +
'xmlns="http://www.opengis.net/sld" ' +
'xmlns:gml="http://www.opengis.net/gml" ' +
'xmlns:ogc="http://www.opengis.net/ogc" ' +
'xmlns:xlink="http://www.w3.org/1999/xlink" ' +
'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
'xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd">' +
'<NamedLayer>' +
'<Name>AAA161</Name>' +
'<UserStyle>' +
'<FeatureTypeStyle>' +
'<Rule>' +
'<Name>stortsteen</Name>' +
'<ogc:Filter>' +
'<ogc:PropertyIsEqualTo>' +
'<ogc:PropertyName>CTE</ogc:PropertyName>' +
'<ogc:Literal>V0305</ogc:Literal>' +
'</ogc:PropertyIsEqualTo>' +
'</ogc:Filter>' +
'<MaxScaleDenominator>50000</MaxScaleDenominator>' +
'<PolygonSymbolizer>' +
'<Fill>' +
'<CssParameter name="fill">#ffffff</CssParameter>' +
'</Fill>' +
'<Stroke>' +
'<CssParameter name="stroke">#000000</CssParameter>' +
'</Stroke>' +
'</PolygonSymbolizer>' +
'<TextSymbolizer>' +
'<Label>' +
'<ogc:PropertyName>FOO</ogc:PropertyName>' +
'</Label>' +
'<Font>' +
'<CssParameter name="font-family">Arial</CssParameter>' +
'<CssParameter name="font-size">14</CssParameter>' +
'<CssParameter name="font-weight">bold</CssParameter>' +
'<CssParameter name="font-style">normal</CssParameter>' +
'</Font>' +
'<Halo>' +
'<Radius>3</Radius>' +
'<Fill>' +
'<CssParameter name="fill">#ffffff</CssParameter>' +
'</Fill>' +
'</Halo>' +
'<Fill>' +
'<CssParameter name="fill">#000000</CssParameter>' +
'</Fill>' +
'</TextSymbolizer>' +
'</Rule>' +
'<Rule>' +
'<Name>betonbekleding</Name>' +
'<ogc:Filter>' +
'<ogc:PropertyIsLessThan>' +
'<ogc:PropertyName>CTE</ogc:PropertyName>' +
'<ogc:Literal>1000</ogc:Literal>' +
'</ogc:PropertyIsLessThan>' +
'</ogc:Filter>' +
'<MaxScaleDenominator>50000</MaxScaleDenominator>' +
'<PolygonSymbolizer>' +
'<Fill>' +
'<CssParameter name="fill">#ffff00</CssParameter>' +
'</Fill>' +
'<Stroke>' +
'<CssParameter name="stroke">#0000ff</CssParameter>' +
'</Stroke>' +
'</PolygonSymbolizer>' +
'</Rule>' +
'</FeatureTypeStyle>' +
'</UserStyle>' +
'</NamedLayer>' +
'<NamedLayer>' +
'<Name>Second Layer</Name>' +
'<UserStyle>' +
'<FeatureTypeStyle>' +
'<Rule>' +
'<Name>first rule second layer</Name>' +
'<ogc:Filter>' +
'<ogc:Or>' +
'<ogc:PropertyIsBetween>' +
'<ogc:PropertyName>number</ogc:PropertyName>' +
'<ogc:LowerBoundary>' +
'<ogc:Literal>1064866676</ogc:Literal>' +
'</ogc:LowerBoundary>' +
'<ogc:UpperBoundary>' +
'<ogc:Literal>1065512599</ogc:Literal>' +
'</ogc:UpperBoundary>' +
'</ogc:PropertyIsBetween>' +
'<ogc:PropertyIsLike wildCard="*" singleChar="." escape="!">' +
'<ogc:PropertyName>cat</ogc:PropertyName>' +
'<ogc:Literal>*dog.food!*good</ogc:Literal>' +
'</ogc:PropertyIsLike>' +
'<ogc:Not>' +
'<ogc:PropertyIsLessThanOrEqualTo>' +
'<ogc:PropertyName>FOO</ogc:PropertyName>' +
'<ogc:Literal>5000</ogc:Literal>' +
'</ogc:PropertyIsLessThanOrEqualTo>' +
'</ogc:Not>' +
'</ogc:Or>' +
'</ogc:Filter>' +
'<MaxScaleDenominator>10000</MaxScaleDenominator>' +
'<PointSymbolizer>' +
'<Graphic>' +
'<Mark>' +
'<WellKnownName>star</WellKnownName>' +
'<Fill>' +
'<CssParameter name="fill">lime</CssParameter>' +
'</Fill>' +
'<Stroke>' +
'<CssParameter name="stroke">olive</CssParameter>' +
'<CssParameter name="stroke-width">2</CssParameter>' +
'</Stroke>' +
'</Mark>' +
'</Graphic>' +
'</PointSymbolizer>' +
'</Rule>' +
'</FeatureTypeStyle>' +
'</UserStyle>' +
'</NamedLayer>' +
'</StyledLayerDescriptor>';
function test_read(t) {
t.plan(22);
var xml = new OpenLayers.Format.XML();
var sldxml = xml.read(sld);
// test that format options are considered in read
var parser = new OpenLayers.Format.SLD({
version: "1.0.0",
namedLayersAsArray: true
});
var obj = parser.read(sldxml);
t.ok(obj.namedLayers instanceof Array, "namedLayersAsArray option for read works");
parser = new OpenLayers.Format.SLD.v1_0_0();
var obj = parser.read(sldxml, {namedLayersAsArray: true});
t.ok(obj.namedLayers instanceof Array, "namedLayersAsArray option for read works");
var arrayLen = obj.namedLayers.length;
var obj = parser.read(sldxml);
t.eq(typeof obj.namedLayers, "object", "read returns a namedLayers object by default");
// test the named layer count
var count = 0;
for(var key in obj.namedLayers) {
++count;
}
t.eq(count, arrayLen, "number of named layers in array equals number of named layers in object");
var layer, style, rule;
// check the first named layer
layer = obj.namedLayers["AAA161"];
t.ok(layer, "first named layer exists");
t.ok(layer.userStyles instanceof Array, "(AAA161) layer has array of user styles");
t.eq(layer.userStyles.length, 1, "(AAA161) first layer has a single user style");
t.eq(layer.userStyles[0].rules.length, 2, "(AAA161) first style has two rules");
var rule = layer.userStyles[0].rules[0];
t.ok(rule.filter, "(AAA161) first rule has a filter");
var symbolizer = rule.symbolizer;
t.ok(symbolizer, "(AAA161) first rule has a symbolizer");
var poly = symbolizer["Polygon"];
t.eq(poly.fillColor, "#ffffff", "(AAA161) first rule has proper fill");
t.eq(poly.strokeColor, "#000000", "(AAA161) first rule has proper stroke");
var text = symbolizer["Text"];
t.eq(text.label, "${FOO}", "(AAA161) first rule has proper text label");
t.eq(layer.userStyles[0].propertyStyles["label"], true, "label added to propertyStyles");
t.eq(text.fontFamily, "Arial", "(AAA161) first rule has proper font family");
t.eq(text.fillColor, "#000000", "(AAA161) first rule has proper text fill");
t.eq(text.haloRadius, "3", "(AAA161) first rule has proper halo radius");
t.eq(text.haloColor, "#ffffff", "(AAA161) first rule has proper halo color");
// check the first user style
style = layer.userStyles[0];
t.ok(style instanceof OpenLayers.Style, "(AAA161,0) user style is instance of OpenLayers.Style");
t.eq(style.rules.length, 2, "(AAA161,0) user style has 2 rules");
// check the second rule
rule = style.rules[1];
var feature = {
layer: {
map: {
getScale: function(){
return 40000;
}
}
},
attributes: {
CTE: "900"
}
};
t.ok(typeof rule.maxScaleDenominator == "number", "MaxScaleDenominator is a number");
t.eq(rule.evaluate(feature), true, "numeric filter comparison evaluates correctly");
// etc. I'm convinced read works, really wanted to test write (since examples don't test that)
// I'll add more tests here later.
}
function test_write(t) {
t.plan(3);
// read first - testing that write produces the SLD aboce
var parser = new OpenLayers.Format.SLD.v1_0_0();
var xml = new OpenLayers.Format.XML();
var sldxml = xml.read(sld);
var obj = parser.read(sldxml);
var node = parser.write(obj);
t.xml_eq(node, sld, "SLD correctly written");
obj = parser.read(sldxml, {namedLayersAsArray: true});
node = parser.write(obj);
t.xml_eq(node, sld, "SLD from namedLayers array correctly written");
// test that 0 fill opacity gets written
var symbolizer = {
fillColor: "red",
fillOpacity: 0
};
var root = parser.createElementNSPlus("PolygonSymbolizer");
var got = parser.writeNode("Fill", symbolizer, root);
var expect =
'<Fill xmlns="http://www.opengis.net/sld">' +
'<CssParameter name="fill">red</CssParameter>' +
'<CssParameter name="fill-opacity">0</CssParameter>' +
'</Fill>';
t.xml_eq(got, expect, "zero fill opacity written");
}
function test_writePointSymbolizer(t) {
t.plan(3);
var parser = new OpenLayers.Format.SLD.v1_0_0();
var symbolizer, node, exp;
// test symbolizer with fill color only
symbolizer = {
"fillColor": "blue"
};
node = parser.writeNode("sld:PointSymbolizer", symbolizer);
exp =
'<PointSymbolizer xmlns="http://www.opengis.net/sld">' +
'<Graphic>' +
'<Mark>' +
'<Fill>' +
'<CssParameter name="fill">blue</CssParameter>' +
'</Fill>' +
'<Stroke/>' +
'</Mark>' +
'</Graphic>' +
'</PointSymbolizer>';
t.xml_eq(node, exp, "fillColor only written");
// test symbolizer with stroke color only
symbolizer = {
"strokeColor": "blue"
};
node = parser.writeNode("sld:PointSymbolizer", symbolizer);
exp =
'<PointSymbolizer xmlns="http://www.opengis.net/sld">' +
'<Graphic>' +
'<Mark>' +
'<Fill/>' +
'<Stroke>' +
'<CssParameter name="stroke">blue</CssParameter>' +
'</Stroke>' +
'</Mark>' +
'</Graphic>' +
'</PointSymbolizer>';
t.xml_eq(node, exp, "strokeColor only written");
// test symbolizer with graphic name only
symbolizer = {
"graphicName": "star"
};
node = parser.writeNode("sld:PointSymbolizer", symbolizer);
exp =
'<PointSymbolizer xmlns="http://www.opengis.net/sld">' +
'<Graphic>' +
'<Mark>' +
'<WellKnownName>star</WellKnownName>' +
'<Fill/>' +
'<Stroke/>' +
'</Mark>' +
'</Graphic>' +
'</PointSymbolizer>';
t.xml_eq(node, exp, "graphicName only written");
}
function test_writeLineSymbolizer(t) {
t.plan(1);
var parser = new OpenLayers.Format.SLD.v1_0_0();
var symbolizer, node, exp;
// test symbolizer with fill color only
symbolizer = {
strokeDashstyle: "4 4",
strokeLinecap: "round",
strokeColor: "#0000ff",
strokeWidth: 2
};
node = parser.writeNode("sld:LineSymbolizer", symbolizer);
exp =
'<LineSymbolizer xmlns="http://www.opengis.net/sld">' +
'<Stroke>' +
'<CssParameter name="stroke">#0000ff</CssParameter>' +
'<CssParameter name="stroke-width">2</CssParameter>' +
'<CssParameter name="stroke-dasharray">4 4</CssParameter>' +
'<CssParameter name="stroke-linecap">round</CssParameter>' +
'</Stroke>' +
'</LineSymbolizer>';
t.xml_eq(node, exp, "line symbolizer correctly written");
}
function test_writeTextSymbolizer(t) {
t.plan(1);
var parser = new OpenLayers.Format.SLD.v1_0_0();
var symbolizer = {
"Text": {
"label": "This is the ${city} in ${state}.",
"fontFamily": "Arial",
"fontSize": 10,
"fillColor": "blue",
"fontWeight": "bold",
"fontStyle": "normal",
"haloRadius": 2,
"haloColor": "white"
}
};
var node = parser.writers["sld"]["TextSymbolizer"].apply(
parser, [symbolizer["Text"]]
);
var expected =
'<TextSymbolizer xmlns="http://www.opengis.net/sld">' +
'<Label>' +
'This is the ' +
'<ogc:PropertyName xmlns:ogc="http://www.opengis.net/ogc">city</ogc:PropertyName>' +
' in ' +
'<ogc:PropertyName xmlns:ogc="http://www.opengis.net/ogc">state</ogc:PropertyName>' +
'.' +
'</Label>' +
'<Font>' +
'<CssParameter name="font-family">Arial</CssParameter>' +
'<CssParameter name="font-size">10</CssParameter>' +
'<CssParameter name="font-weight">bold</CssParameter>' +
'<CssParameter name="font-style">normal</CssParameter>' +
'</Font>' +
'<Halo>' +
'<Radius>2</Radius>' +
'<Fill>' +
'<CssParameter name="fill">white</CssParameter>' +
'</Fill>' +
'</Halo>' +
'<Fill>' +
'<CssParameter name="fill">blue</CssParameter>' +
'</Fill>' +
'</TextSymbolizer>';
t.xml_eq(node, expected, "TextSymbolizer correctly written");
}
function test_writeSpatialFilter(t) {
t.plan(1);
var format = new OpenLayers.Format.SLD.v1_0_0();
var rule = new OpenLayers.Rule({
name: "test",
filter: new OpenLayers.Filter.Spatial({
type: OpenLayers.Filter.Spatial.BBOX,
value: new OpenLayers.Bounds(0, 0, 10, 10)
})
});
var sld = format.writeNode("sld:Rule", rule);
var expect =
'<Rule xmlns="http://www.opengis.net/sld">' +
'<Name>test</Name>' +
'<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">' +
'<ogc:BBOX>' +
'<ogc:PropertyName/>' +
'<gml:Box xmlns:gml="http://www.opengis.net/gml">' +
'<gml:coordinates decimal="." cs="," ts=" ">0,0 10,10</gml:coordinates>' +
'</gml:Box>' +
'</ogc:BBOX>' +
'</ogc:Filter>' +
'</Rule>';
t.xml_eq(sld, expect, "rule with spatial filter correctly written");
}
function test_RasterSymbolizer(t) {
t.plan(4);
var format = new OpenLayers.Format.SLD.v1_0_0();
var snippet =
'<sld:RasterSymbolizer xmlns:sld="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc">' +
'<sld:Geometry>' +
'<ogc:PropertyName>geom</ogc:PropertyName>' +
'</sld:Geometry>' +
'<sld:Opacity>1</sld:Opacity>' +
'<sld:ColorMap>' +
'<sld:ColorMapEntry color="#000000" opacity="0.5" quantity="0" label="nodata"/>' +
'<sld:ColorMapEntry color="#00FFFF" quantity="1" label="values"/>' +
'<sld:ColorMapEntry color="#FF0000" quantity="1000" label="values"/>' +
'</sld:ColorMap>' +
'</sld:RasterSymbolizer>';
var expected = new OpenLayers.Format.XML().read(snippet).documentElement;
var symbolizer = {};
format.readNode(expected, {symbolizer: symbolizer});
t.eq(symbolizer.Raster.colorMap[0].quantity, 0, "quantity set correctly");
t.eq(symbolizer.Raster.colorMap[0].opacity, 0.5, "opacity set correctly");
t.eq(symbolizer.Raster.colorMap[1].opacity, undefined, "non-existent opacity results in undefined");
var got = format.writeNode("sld:RasterSymbolizer", symbolizer["Raster"]);
t.xml_eq(got, expected, "Successfully round tripped RasterSymbolizer");
}
</script>
</head>
<body>
</body>
</html>