Adding more support for sld:TextSymbolizer parsing. Reading TextSymbolizer, Label, Font, Halo, and Radius. Writing symbolizer fontWeight and fontStyle as sld:CssParameters. Writing sld:Halo and sld:Radius. r=ahocevar (closes #1984)
git-svn-id: http://svn.openlayers.org/trunk/openlayers@9064 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
@@ -159,6 +159,44 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, {
|
|||||||
"MaxScaleDenominator": function(node, rule) {
|
"MaxScaleDenominator": function(node, rule) {
|
||||||
rule.maxScaleDenominator = parseFloat(this.getChildValue(node));
|
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;
|
||||||
|
},
|
||||||
|
"Label": function(node, symbolizer) {
|
||||||
|
// only supporting literal or property name
|
||||||
|
var obj = {};
|
||||||
|
this.readChildNodes(node, obj);
|
||||||
|
if(obj.property) {
|
||||||
|
symbolizer.label = "${" + obj.property + "}";
|
||||||
|
} else {
|
||||||
|
var value = this.readOgcExpression(node);
|
||||||
|
if(value) {
|
||||||
|
symbolizer.label = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Font": function(node, symbolizer) {
|
||||||
|
this.readChildNodes(node, symbolizer);
|
||||||
|
},
|
||||||
|
"Halo": function(node, symbolizer) {
|
||||||
|
// halo has a fill, so send fresh object
|
||||||
|
var obj = {};
|
||||||
|
this.readChildNodes(node, obj);
|
||||||
|
symbolizer.haloRadius = obj.haloRadius;
|
||||||
|
symbolizer.haloColor = obj.fillColor;
|
||||||
|
symbolizer.haloOpacity = obj.fillOpacity;
|
||||||
|
},
|
||||||
|
"Radius": function(node, symbolizer) {
|
||||||
|
var radius = this.readOgcExpression(node);
|
||||||
|
if(radius != null) {
|
||||||
|
// radius is only used for halo
|
||||||
|
symbolizer.haloRadius = radius;
|
||||||
|
}
|
||||||
|
},
|
||||||
"LineSymbolizer": function(node, rule) {
|
"LineSymbolizer": function(node, rule) {
|
||||||
// OpenLayers doesn't do painter's order, instead we extend
|
// OpenLayers doesn't do painter's order, instead we extend
|
||||||
var symbolizer = rule.symbolizer["Line"] || {};
|
var symbolizer = rule.symbolizer["Line"] || {};
|
||||||
@@ -285,7 +323,9 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, {
|
|||||||
"fill": "fillColor",
|
"fill": "fillColor",
|
||||||
"fill-opacity": "fillOpacity",
|
"fill-opacity": "fillOpacity",
|
||||||
"font-family": "fontFamily",
|
"font-family": "fontFamily",
|
||||||
"font-size": "fontSize"
|
"font-size": "fontSize",
|
||||||
|
"font-weight": "fontWeight",
|
||||||
|
"font-style": "fontStyle"
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -603,9 +643,17 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, {
|
|||||||
}
|
}
|
||||||
// add in optional Font
|
// add in optional Font
|
||||||
if(symbolizer.fontFamily != null ||
|
if(symbolizer.fontFamily != null ||
|
||||||
symbolizer.fontSize != null) {
|
symbolizer.fontSize != null ||
|
||||||
|
symbolizer.fontWeight != null ||
|
||||||
|
symbolizer.fontStyle != null) {
|
||||||
this.writeNode("Font", symbolizer, node);
|
this.writeNode("Font", symbolizer, node);
|
||||||
}
|
}
|
||||||
|
// add in optional Halo
|
||||||
|
if(symbolizer.haloRadius != null ||
|
||||||
|
symbolizer.haloColor != null ||
|
||||||
|
symbolizer.haloOpacity != null) {
|
||||||
|
this.writeNode("Halo", symbolizer, node);
|
||||||
|
}
|
||||||
// add in optional Fill
|
// add in optional Fill
|
||||||
if(symbolizer.fillColor != null ||
|
if(symbolizer.fillColor != null ||
|
||||||
symbolizer.fillOpacity != null) {
|
symbolizer.fillOpacity != null) {
|
||||||
@@ -630,6 +678,20 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, {
|
|||||||
node
|
node
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
if(symbolizer.fontWeight) {
|
||||||
|
this.writeNode(
|
||||||
|
"CssParameter",
|
||||||
|
{symbolizer: symbolizer, key: "fontWeight"},
|
||||||
|
node
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if(symbolizer.fontStyle) {
|
||||||
|
this.writeNode(
|
||||||
|
"CssParameter",
|
||||||
|
{symbolizer: symbolizer, key: "fontStyle"},
|
||||||
|
node
|
||||||
|
);
|
||||||
|
}
|
||||||
return node;
|
return node;
|
||||||
},
|
},
|
||||||
"Label": function(label) {
|
"Label": function(label) {
|
||||||
@@ -660,6 +722,24 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, {
|
|||||||
}
|
}
|
||||||
return node;
|
return node;
|
||||||
},
|
},
|
||||||
|
"Halo": function(symbolizer) {
|
||||||
|
var node = this.createElementNSPlus("Halo");
|
||||||
|
if(symbolizer.haloRadius) {
|
||||||
|
this.writeNode("Radius", symbolizer.haloRadius, node);
|
||||||
|
}
|
||||||
|
if(symbolizer.haloColor || symbolizer.haloOpacity) {
|
||||||
|
this.writeNode("Fill", {
|
||||||
|
fillColor: symbolizer.haloColor,
|
||||||
|
fillOpacity: symbolizer.haloOpacity
|
||||||
|
}, node);
|
||||||
|
}
|
||||||
|
return node;
|
||||||
|
},
|
||||||
|
"Radius": function(value) {
|
||||||
|
return node = this.createElementNSPlus("Radius", {
|
||||||
|
value: value
|
||||||
|
});
|
||||||
|
},
|
||||||
"PolygonSymbolizer": function(symbolizer) {
|
"PolygonSymbolizer": function(symbolizer) {
|
||||||
var node = this.createElementNSPlus("PolygonSymbolizer");
|
var node = this.createElementNSPlus("PolygonSymbolizer");
|
||||||
if(symbolizer.fillColor != undefined ||
|
if(symbolizer.fillColor != undefined ||
|
||||||
|
|||||||
@@ -32,6 +32,26 @@
|
|||||||
'<CssParameter name="stroke">#000000</CssParameter>' +
|
'<CssParameter name="stroke">#000000</CssParameter>' +
|
||||||
'</Stroke>' +
|
'</Stroke>' +
|
||||||
'</PolygonSymbolizer>' +
|
'</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>' +
|
||||||
'<Rule>' +
|
'<Rule>' +
|
||||||
'<Name>betonbekleding</Name>' +
|
'<Name>betonbekleding</Name>' +
|
||||||
@@ -105,7 +125,7 @@
|
|||||||
'</StyledLayerDescriptor>';
|
'</StyledLayerDescriptor>';
|
||||||
|
|
||||||
function test_read(t) {
|
function test_read(t) {
|
||||||
t.plan(8);
|
t.plan(18);
|
||||||
|
|
||||||
var parser = new OpenLayers.Format.SLD.v1_0_0();
|
var parser = new OpenLayers.Format.SLD.v1_0_0();
|
||||||
var xml = new OpenLayers.Format.XML();
|
var xml = new OpenLayers.Format.XML();
|
||||||
@@ -125,6 +145,21 @@
|
|||||||
t.ok(layer, "first named layer exists");
|
t.ok(layer, "first named layer exists");
|
||||||
t.ok(layer.userStyles instanceof Array, "(AAA161) layer has array of user styles");
|
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.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(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
|
// check the first user style
|
||||||
style = layer.userStyles[0];
|
style = layer.userStyles[0];
|
||||||
@@ -187,7 +222,11 @@
|
|||||||
"label": "This is the ${city} in ${state}.",
|
"label": "This is the ${city} in ${state}.",
|
||||||
"fontFamily": "Arial",
|
"fontFamily": "Arial",
|
||||||
"fontSize": 10,
|
"fontSize": 10,
|
||||||
"fillColor": "blue"
|
"fillColor": "blue",
|
||||||
|
"fontWeight": "bold",
|
||||||
|
"fontStyle": "normal",
|
||||||
|
"haloRadius": 2,
|
||||||
|
"haloColor": "white"
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
var node = parser.writers["sld"]["TextSymbolizer"].apply(
|
var node = parser.writers["sld"]["TextSymbolizer"].apply(
|
||||||
@@ -206,7 +245,15 @@
|
|||||||
'<Font>' +
|
'<Font>' +
|
||||||
'<CssParameter name="font-family">Arial</CssParameter>' +
|
'<CssParameter name="font-family">Arial</CssParameter>' +
|
||||||
'<CssParameter name="font-size">10</CssParameter>' +
|
'<CssParameter name="font-size">10</CssParameter>' +
|
||||||
|
'<CssParameter name="font-weight">bold</CssParameter>' +
|
||||||
|
'<CssParameter name="font-style">normal</CssParameter>' +
|
||||||
'</Font>' +
|
'</Font>' +
|
||||||
|
'<Halo>' +
|
||||||
|
'<Radius>2</Radius>' +
|
||||||
|
'<Fill>' +
|
||||||
|
'<CssParameter name="fill">white</CssParameter>' +
|
||||||
|
'</Fill>' +
|
||||||
|
'</Halo>' +
|
||||||
'<Fill>' +
|
'<Fill>' +
|
||||||
'<CssParameter name="fill">blue</CssParameter>' +
|
'<CssParameter name="fill">blue</CssParameter>' +
|
||||||
'</Fill>' +
|
'</Fill>' +
|
||||||
|
|||||||
Reference in New Issue
Block a user