SLD format rewrite. Adds a versioned parser with read and write support. This does not come with full support for ogc:expression parsing, but makes for easy future enhancements. r=ahocevar (closes #1458)

git-svn-id: http://svn.openlayers.org/trunk/openlayers@6645 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
Tim Schaub
2008-03-27 17:18:05 +00:00
parent 6b1903b5a3
commit 3b267f5334
11 changed files with 1620 additions and 719 deletions

View File

@@ -6,89 +6,114 @@
width: 800px;
height: 475px;
border: 1px solid black;
background: #ccddff;
}
</style>
<script src="../lib/Firebug/firebug.js"></script>
<script src="../lib/OpenLayers.js"></script>
<script type="text/javascript">
var lon = 5;
var lat = 40;
var zoom = 5;
var map, layer, gmlLayers, styles, waterStyle, hover;
var map, sld, gmlLayers;
var format = new OpenLayers.Format.SLD();
function init() {
map = new OpenLayers.Map('map');
map.addControl(new OpenLayers.Control.LayerSwitcher());
OpenLayers.loadURL("tasmania/sld-tasmania.xml", null, null, complete);
function load(){
OpenLayers.loadURL("tasmania/sld-tasmania.xml", "", null, init);
}
function init(req){
map = new OpenLayers.Map('map');
layer = new OpenLayers.Layer.WMS( "OpenLayers WMS",
"http://labs.metacarta.com/wms/vmap0", {layers: 'basic'} );
map.addLayer(layer);
map.zoomToExtent(new OpenLayers.Bounds(143,-39,150,-45));
sld = new OpenLayers.Format.SLD().read(req.responseText,
{withNamedLayer: true});
styles = sld[1];
// for the hover style, we do not want to use the SLD default as
// base style
styles["WaterBodies"]["Hover Styler"].defaultStyle = OpenLayers.Util.extend({},
OpenLayers.Feature.Vector.style["select"]);
gmlLayers = [
// use the sld UserStyle named "Default Styler"
new OpenLayers.Layer.GML("StateBoundaries",
"tasmania/TasmaniaStateBoundaries.xml", {
styleMap: new OpenLayers.StyleMap(styles["WaterBodies"])}),
new OpenLayers.Layer.GML("Roads",
"tasmania/TasmaniaRoads.xml", {
styleMap: new OpenLayers.StyleMap(styles["Roads"])}),
new OpenLayers.Layer.GML("WaterBodies",
"tasmania/TasmaniaWaterBodies.xml", {
styleMap: new OpenLayers.StyleMap(styles["WaterBodies"])}),
new OpenLayers.Layer.GML("Cities",
"tasmania/TasmaniaCities.xml", {
styleMap: new OpenLayers.StyleMap(styles["Cities"])})];
for (var i=0; i<gmlLayers.length; i++) {
map.addLayer(gmlLayers[i]);
function getDefaultStyle(sld, layerName) {
var styles = sld.namedLayers[layerName].userStyles;
var style;
for(var i=0; i<styles.length; ++i) {
style = styles[i];
if(style.isDefault) {
break;
}
}
return style;
}
function complete(req) {
sld = format.read(req.responseXML || req.responseText);
var hoverStyle = sld.namedLayers["WaterBodies"].userStyles[1];
hoverStyle.defaultStyle = OpenLayers.Util.extend(
{}, OpenLayers.Feature.Vector.style["select"]
);
gmlLayers = [
// use the sld UserStyle named "Default Styler"
new OpenLayers.Layer.GML(
"StateBoundaries",
"tasmania/TasmaniaStateBoundaries.xml",
{
styleMap: new OpenLayers.StyleMap(
getDefaultStyle(sld, "Land")
),
isBaseLayer: true
}
),
new OpenLayers.Layer.GML(
"Roads",
"tasmania/TasmaniaRoads.xml",
{styleMap: new OpenLayers.StyleMap(getDefaultStyle(sld, "Roads"))}
),
new OpenLayers.Layer.GML(
"WaterBodies",
"tasmania/TasmaniaWaterBodies.xml",
{
styleMap: new OpenLayers.StyleMap({
"default": getDefaultStyle(sld, "WaterBodies"),
"select": hoverStyle
})
}
),
new OpenLayers.Layer.GML(
"Cities",
"tasmania/TasmaniaCities.xml",
{styleMap: new OpenLayers.StyleMap(getDefaultStyle(sld, "Cities"))}
)
];
hover = new OpenLayers.Control.SelectFeature(gmlLayers[2], {
hover: true,
renderIntent: "Hover Styler"
});
map.addLayers(gmlLayers);
map.zoomToExtent(new OpenLayers.Bounds(143,-39,150,-45));
var hover = new OpenLayers.Control.SelectFeature(
gmlLayers[2], {hover: true}
);
map.addControl(hover);
hover.activate();
}
// set a new style when the radio button changes
function setStyle(styleName) {
gmlLayers[2].styleMap.styles["default"] = styles["WaterBodies"][styleName];
function setStyle(index) {
gmlLayers[2].styleMap.styles["default"] = sld.namedLayers["WaterBodies"].userStyles[index];
// change the style of the features of the WaterBodies layer
gmlLayers[2].redraw();
}
</script>
</head>
<body onload="load()">
<body onload="init()">
<div id="map"></div>
<p>This example uses a <a target="_blank" href="tasmania/sld-tasmania.xml">SLD
file</a> to style the vector features. The style to be used is either
determined by the NamedLayer and IsDefault properties in the sld file, or
can directly be applied by addressing a style from the styles
hash with the UserStyle name from the sld file as key. Select a new style for the WaterBodies layer below:<p>
file</a> to style the vector features. To construct layers that use styles
from SLD, create a StyleMap for the layer that uses one of the userStyles in the
namedLayers object of the return from format.read().</p>
<p>Select a new style for the WaterBodies layer below:</p>
<form>
<input type="radio" name="style" onclick="setStyle(this.value)" checked="checked" value="default">Default Styler (zoom in to see more features)</input><br/>
<input type="radio" name="style" onclick="setStyle(this.value)" value="Styler Test PropertyIsEqualTo">Styler Test PropertyIsEqualTo</input><br/>
<input type="radio" name="style" onclick="setStyle(this.value)" value="Styler Test Not FeatureId">Styler Test Not FeatureId</input><br/>
<input type="radio" name="style" onclick="setStyle(this.value)" value="Styler Test WATER_TYPE">Styler Test WATER_TYPE</input><br/>
<input type="radio" name="style" onclick="setStyle(this.value)" value="Styler Test PropertyIsGreaterThanOrEqualTo">Styler Test PropertyIsGreaterThanOrEqualTo</input><br/>
<input type="radio" name="style" onclick="setStyle(this.value)" value="Styler Test PropertyIsLessThanOrEqualTo">Styler Test PropertyIsLessThanOrEqualTo</input><br/>
<input type="radio" name="style" onclick="setStyle(this.value)" value="Styler Test PropertyIsGreaterThan">Styler Test PropertyIsGreaterThan</input><br/>
<input type="radio" name="style" onclick="setStyle(this.value)" value="Styler Test PropertyIsLessThan">Styler Test PropertyIsLessThan</input><br/>
<input type="radio" name="style" onclick="setStyle(this.value)" value="Styler Test PropertyIsLike">Styler Test PropertyIsLike</input><br/>
<input type="radio" name="style" onclick="setStyle(this.value)" checked="checked" value="0">Default Styler (zoom in to see more features)</input><br/>
<input type="radio" name="style" onclick="setStyle(this.value)" value="3">Styler Test PropertyIsEqualTo</input><br/>
<input type="radio" name="style" onclick="setStyle(this.value)" value="4">Styler Test WATER_TYPE</input><br/>
<input type="radio" name="style" onclick="setStyle(this.value)" value="5">Styler Test PropertyIsGreaterThanOrEqualTo</input><br/>
<input type="radio" name="style" onclick="setStyle(this.value)" value="6">Styler Test PropertyIsLessThanOrEqualTo</input><br/>
<input type="radio" name="style" onclick="setStyle(this.value)" value="7">Styler Test PropertyIsGreaterThan</input><br/>
<input type="radio" name="style" onclick="setStyle(this.value)" value="8">Styler Test PropertyIsLessThan</input><br/>
<input type="radio" name="style" onclick="setStyle(this.value)" value="9">Styler Test PropertyIsLike</input><br/>
<input type="radio" name="style" onclick="setStyle(this.value)" value="10">Styler Test PropertyIsBetween</input><br/>
<input type="radio" name="style" onclick="setStyle(this.value)" value="11">Styler Test FeatureId</input><br/>
</form>
</body>
</html>

View File

@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<sld:StyledLayerDescriptor xmlns:sld="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink">
<sld:StyledLayerDescriptor version="1.0.0"
xmlns:sld="http://www.opengis.net/sld"
xmlns:ogc="http://www.opengis.net/ogc"
xmlns:gml="http://www.opengis.net/gml"
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">
<sld:NamedLayer>
<sld:Name>WaterBodies</sld:Name>
<sld:UserStyle>
@@ -55,7 +61,26 @@
<sld:Name>testRuleNameElse</sld:Name>
<sld:Title>title</sld:Title>
<sld:Abstract>Abstract</sld:Abstract>
<ogc:ElseFilter/>
<sld:ElseFilter/>
<sld:PolygonSymbolizer>
<sld:Fill>
<sld:CssParameter name="fill">#aaaaff</sld:CssParameter>
<sld:CssParameter name="fill-opacity">
<ogc:Literal>0.5</ogc:Literal>
</sld:CssParameter>
</sld:Fill>
<sld:Stroke>
<sld:CssParameter name="stroke">
<ogc:Literal>#C0C0C0</ogc:Literal>
</sld:CssParameter>
<sld:CssParameter name="stroke-opacity">
<ogc:Literal>1</ogc:Literal>
</sld:CssParameter>
<sld:CssParameter name="stroke-width">
<ogc:Literal>1</ogc:Literal>
</sld:CssParameter>
</sld:Stroke>
</sld:PolygonSymbolizer>
</sld:Rule>
</sld:FeatureTypeStyle>
</sld:UserStyle>
@@ -123,44 +148,35 @@
<sld:Name>testRuleNameHoverElse</sld:Name>
<sld:Title>title</sld:Title>
<sld:Abstract>Abstract</sld:Abstract>
<ogc:ElseFilter/>
</sld:Rule>
</sld:FeatureTypeStyle>
</sld:UserStyle>
<sld:UserStyle>
<sld:Name>Attribute Filter Styler</sld:Name>
<sld:Title>Attribute Filter Styler</sld:Title>
<sld:FeatureTypeStyle>
<sld:Name>attribute filter type</sld:Name>
<sld:Title>attribute filter type</sld:Title>
<sld:FeatureTypeName>Feature</sld:FeatureTypeName>
<sld:SemanticTypeIdentifier>generic:geometry</sld:SemanticTypeIdentifier>
<!-- Attribute filters -->
<sld:Rule>
<sld:Name>rulePropertyIsEqualTo</sld:Name>
<sld:Title>rulePropertyIsEqualTo</sld:Title>
<sld:Abstract>rulePropertyIsEqualTo</sld:Abstract>
<ogc:Filter>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>name</ogc:PropertyName>
<ogc:Literal>My simple Polygon</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Filter>
<sld:ElseFilter/>
<sld:PolygonSymbolizer>
<sld:Fill>
<sld:CssParameter name="fill">
<ogc:Literal>#000033</ogc:Literal>
<ogc:Literal>black</ogc:Literal>
</sld:CssParameter>
<sld:CssParameter name="fill-opacity">
<ogc:Literal>0.5</ogc:Literal>
</sld:CssParameter>
</sld:Fill>
<sld:Stroke>
<sld:CssParameter name="stroke">
<ogc:Literal>fuchsia</ogc:Literal>
</sld:CssParameter>
<sld:CssParameter name="stroke-opacity">
<ogc:Literal>0.5</ogc:Literal>
</sld:CssParameter>
<sld:CssParameter name="stroke-width">
<ogc:Literal>5</ogc:Literal>
</sld:CssParameter>
<sld:CssParameter name="stroke-dashoffset">
<ogc:Literal>0</ogc:Literal>
</sld:CssParameter>
</sld:Stroke>
</sld:PolygonSymbolizer>
</sld:Rule>
</sld:FeatureTypeStyle>
</sld:UserStyle>
<sld:UserStyle>
<sld:Name>Attribute Filter Styler</sld:Name>
<sld:Title>Attribute Filter Styler</sld:Title>
@@ -220,39 +236,7 @@
</sld:Rule>
</sld:FeatureTypeStyle>
</sld:UserStyle>
<sld:UserStyle>
<sld:Name>Styler Test Not FeatureId</sld:Name>
<sld:Title>Styler Test Not FeatureId</sld:Title>
<sld:FeatureTypeStyle>
<sld:Name>attribute filter type</sld:Name>
<sld:Title>attribute filter type</sld:Title>
<sld:FeatureTypeName>Feature</sld:FeatureTypeName>
<sld:SemanticTypeIdentifier>generic:geometry</sld:SemanticTypeIdentifier>
<!-- Attribute filters -->
<sld:Rule>
<sld:Name>ruleNotFeatureId</sld:Name>
<sld:Title>ruleNotFeatureId</sld:Title>
<sld:Abstract>ruleNotFeatureId</sld:Abstract>
<ogc:Filter>
<ogc:Not>
<ogc:FeatureId fid="tasmania_water_bodies.7" />
</ogc:Not>
</ogc:Filter>
<sld:PolygonSymbolizer>
<sld:Fill>
<sld:CssParameter name="fill">
<ogc:Literal>red</ogc:Literal>
</sld:CssParameter>
</sld:Fill>
</sld:PolygonSymbolizer>
</sld:Rule>
</sld:FeatureTypeStyle>
</sld:UserStyle>
<sld:UserStyle>
<sld:Name>Styler Test WATER_TYPE</sld:Name>
<sld:Title>Styler Test WATER_TYPE</sld:Title>
@@ -429,7 +413,7 @@
</sld:Rule>
</sld:FeatureTypeStyle>
</sld:UserStyle>
<sld:UserStyle>
<sld:Name>Styler Test PropertyIsLike</sld:Name>
<sld:Title>Styler Test PropertyIsLike</sld:Title>
@@ -460,7 +444,6 @@
</sld:FeatureTypeStyle>
</sld:UserStyle>
<sld:UserStyle>
<sld:Name>Styler Test PropertyIsBetween</sld:Name>
<sld:Title>Styler Test PropertyIsBetween</sld:Title>
@@ -478,10 +461,10 @@
<ogc:PropertyIsBetween>
<ogc:PropertyName>AREA</ogc:PropertyName>
<ogc:LowerBoundary>
<ogc:Literal>1060000000</ogc:Literal>
<ogc:Literal>1064866676</ogc:Literal>
</ogc:LowerBoundary>
<ogc:UpperBoundary>
<ogc:Literal>1070000000</ogc:Literal>
<ogc:Literal>1065512599</ogc:Literal>
</ogc:UpperBoundary>
</ogc:PropertyIsBetween>
</ogc:Filter>
@@ -496,6 +479,23 @@
</sld:FeatureTypeStyle>
</sld:UserStyle>
<sld:UserStyle>
<sld:Name>FeatureId</sld:Name>
<sld:Title>Styler Test FeatureId</sld:Title>
<sld:FeatureTypeStyle>
<sld:Rule>
<ogc:Filter>
<ogc:FeatureId fid="tasmania_water_bodies.4"/>
</ogc:Filter>
<sld:PolygonSymbolizer>
<sld:Fill>
<sld:CssParameter name="fill">blue</sld:CssParameter>
</sld:Fill>
</sld:PolygonSymbolizer>
</sld:Rule>
</sld:FeatureTypeStyle>
</sld:UserStyle>
</sld:NamedLayer>
<sld:NamedLayer>
@@ -503,19 +503,21 @@
<sld:UserStyle>
<sld:Name>RoadsDefault</sld:Name>
<sld:IsDefault>1</sld:IsDefault>
<sld:Rule>
<sld:Name>justAStyler</sld:Name>
<sld:LineSymbolizer>
<sld:Stroke>
<sld:CssParameter name="stroke">
<ogc:Literal>red</ogc:Literal>
</sld:CssParameter>
<sld:CssParameter name="stroke-width">
<ogc:Literal>2</ogc:Literal>
</sld:CssParameter>
</sld:Stroke>
</sld:LineSymbolizer>
</sld:Rule>
<sld:FeatureTypeStyle>
<sld:Rule>
<sld:Name>justAStyler</sld:Name>
<sld:LineSymbolizer>
<sld:Stroke>
<sld:CssParameter name="stroke">
<ogc:Literal>red</ogc:Literal>
</sld:CssParameter>
<sld:CssParameter name="stroke-width">
<ogc:Literal>2</ogc:Literal>
</sld:CssParameter>
</sld:Stroke>
</sld:LineSymbolizer>
</sld:Rule>
</sld:FeatureTypeStyle>
</sld:UserStyle>
</sld:NamedLayer>
@@ -524,19 +526,52 @@
<sld:UserStyle>
<sld:Name>DefaultCities</sld:Name>
<sld:IsDefault>1</sld:IsDefault>
<sld:Rule>
<sld:PointSymbolizer>
<sld:Graphic>
<sld:ExternalGraphic>
<sld:OnlineResource xlink:href="../img/marker.png" />
<sld:Format>image/png</sld:Format>
</sld:ExternalGraphic>
<sld:Size>10</sld:Size>
<sld:Opacity>0.5</sld:Opacity>
</sld:Graphic>
</sld:PointSymbolizer>
</sld:Rule>
<sld:FeatureTypeStyle>
<sld:Rule>
<sld:PointSymbolizer>
<sld:Graphic>
<sld:ExternalGraphic>
<sld:OnlineResource xlink:href="../img/marker.png" />
<sld:Format>image/png</sld:Format>
</sld:ExternalGraphic>
<sld:Opacity>0.5</sld:Opacity>
<sld:Size>10</sld:Size>
</sld:Graphic>
</sld:PointSymbolizer>
</sld:Rule>
</sld:FeatureTypeStyle>
</sld:UserStyle>
</sld:NamedLayer>
<sld:NamedLayer>
<sld:Name>Land</sld:Name>
<sld:UserStyle>
<sld:Name>Land Style</sld:Name>
<sld:IsDefault>1</sld:IsDefault>
<sld:FeatureTypeStyle>
<sld:Rule>
<sld:PolygonSymbolizer>
<sld:Fill>
<sld:CssParameter name="fill">#ccffaa</sld:CssParameter>
<sld:CssParameter name="fill-opacity">
<ogc:Literal>0.5</ogc:Literal>
</sld:CssParameter>
</sld:Fill>
<sld:Stroke>
<sld:CssParameter name="stroke">
<ogc:Literal>#C0C0C0</ogc:Literal>
</sld:CssParameter>
<sld:CssParameter name="stroke-opacity">
<ogc:Literal>1</ogc:Literal>
</sld:CssParameter>
<sld:CssParameter name="stroke-width">
<ogc:Literal>1</ogc:Literal>
</sld:CssParameter>
</sld:Stroke>
</sld:PolygonSymbolizer>
</sld:Rule>
</sld:FeatureTypeStyle>
</sld:UserStyle>
</sld:NamedLayer>
</sld:StyledLayerDescriptor>