git-svn-id: http://svn.openlayers.org/trunk/openlayers@10349 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
448 lines
19 KiB
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>
|