Ticket #1458: 1458-r6638-A1.patch
| File 1458-r6638-A1.patch, 98.9 kB (added by ahocevar, 8 months ago) |
|---|
-
examples/sld.html
old new 6 6 width: 800px; 7 7 height: 475px; 8 8 border: 1px solid black; 9 background: #ccddff; 9 10 } 10 11 </style> 11 12 <script src="../lib/Firebug/firebug.js"></script> … … 11 12 <script src="../lib/Firebug/firebug.js"></script> 12 13 <script src="../lib/OpenLayers.js"></script> 13 14 <script type="text/javascript"> 14 var lon = 5; 15 var lat = 40; 16 var zoom = 5; 17 var map, layer, gmlLayers, styles, waterStyle, hover; 15 16 var map, sld, gmlLayers; 17 var format = new OpenLayers.Format.SLD(); 18 function init() { 19 20 map = new OpenLayers.Map('map'); 21 map.addControl(new OpenLayers.Control.LayerSwitcher()); 18 22 19 function load(){20 OpenLayers.loadURL("tasmania/sld-tasmania.xml", "", null, init); 23 OpenLayers.loadURL("tasmania/sld-tasmania.xml", null, null, complete); 24 21 25 } 22 26 23 function init(req){ 24 map = new OpenLayers.Map('map'); 25 layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 26 "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'} ); 27 map.addLayer(layer); 28 map.zoomToExtent(new OpenLayers.Bounds(143,-39,150,-45)); 27 function getDefaultStyle(sld, layerName) { 28 var styles = sld.namedLayers[layerName].userStyles; 29 var style; 30 for(var i=0; i<styles.length; ++i) { 31 style = styles[i]; 32 if(style.isDefault) { 33 break; 34 } 35 } 36 return style; 37 } 38 39 function complete(req) { 29 40 30 sld = new OpenLayers.Format.SLD().read(req.responseText, 31 {withNamedLayer: true}); 32 33 styles = sld[1]; 34 35 // for the hover style, we do not want to use the SLD default as 36 // base style 37 styles["WaterBodies"]["Hover Styler"].defaultStyle = OpenLayers.Util.extend({}, 38 OpenLayers.Feature.Vector.style["select"]); 39 41 sld = format.read(req.responseXML || req.responseText); 42 var hoverStyle = sld.namedLayers["WaterBodies"].userStyles[1]; 43 hoverStyle.defaultStyle = OpenLayers.Util.extend( 44 {}, OpenLayers.Feature.Vector.style["select"] 45 ); 46 40 47 gmlLayers = [ 41 // use the sld UserStyle named "Default Styler" 42 new OpenLayers.Layer.GML("StateBoundaries", 43 "tasmania/TasmaniaStateBoundaries.xml", { 44 styleMap: new OpenLayers.StyleMap(styles["WaterBodies"])}), 45 new OpenLayers.Layer.GML("Roads", 46 "tasmania/TasmaniaRoads.xml", { 47 styleMap: new OpenLayers.StyleMap(styles["Roads"])}), 48 new OpenLayers.Layer.GML("WaterBodies", 49 "tasmania/TasmaniaWaterBodies.xml", { 50 styleMap: new OpenLayers.StyleMap(styles["WaterBodies"])}), 51 new OpenLayers.Layer.GML("Cities", 52 "tasmania/TasmaniaCities.xml", { 53 styleMap: new OpenLayers.StyleMap(styles["Cities"])})]; 54 55 for (var i=0; i<gmlLayers.length; i++) { 56 map.addLayer(gmlLayers[i]); 57 } 48 // use the sld UserStyle named "Default Styler" 49 new OpenLayers.Layer.GML( 50 "StateBoundaries", 51 "tasmania/TasmaniaStateBoundaries.xml", 52 { 53 styleMap: new OpenLayers.StyleMap( 54 getDefaultStyle(sld, "Land") 55 ), 56 isBaseLayer: true 57 } 58 ), 59 new OpenLayers.Layer.GML( 60 "Roads", 61 "tasmania/TasmaniaRoads.xml", 62 {styleMap: new OpenLayers.StyleMap(getDefaultStyle(sld, "Roads"))} 63 ), 64 new OpenLayers.Layer.GML( 65 "WaterBodies", 66 "tasmania/TasmaniaWaterBodies.xml", 67 { 68 styleMap: new OpenLayers.StyleMap({ 69 "default": getDefaultStyle(sld, "WaterBodies"), 70 "select": hoverStyle 71 }) 72 } 73 ), 74 new OpenLayers.Layer.GML( 75 "Cities", 76 "tasmania/TasmaniaCities.xml", 77 {styleMap: new OpenLayers.StyleMap(getDefaultStyle(sld, "Cities"))} 78 ) 79 ]; 80 81 map.addLayers(gmlLayers); 82 map.zoomToExtent(new OpenLayers.Bounds(143,-39,150,-45)); 58 83 59 hover = new OpenLayers.Control.SelectFeature(gmlLayers[2], { 60 hover: true, 61 renderIntent: "Hover Styler" 62 }); 84 var hover = new OpenLayers.Control.SelectFeature( 85 gmlLayers[2], {hover: true} 86 ); 63 87 map.addControl(hover); 64 88 hover.activate(); 65 89 } … … 65 89 } 66 90 67 91 // set a new style when the radio button changes 68 function setStyle( styleName) {69 gmlLayers[2].styleMap.styles["default"] = s tyles["WaterBodies"][styleName];92 function setStyle(index) { 93 gmlLayers[2].styleMap.styles["default"] = sld.namedLayers["WaterBodies"].userStyles[index]; 70 94 // change the style of the features of the WaterBodies layer 71 95 gmlLayers[2].redraw(); 72 96 } … … 72 96 } 73 97 </script> 74 98 </head> 75 <body onload=" load()">99 <body onload="init()"> 76 100 <div id="map"></div> 77 101 <p>This example uses a <a target="_blank" href="tasmania/sld-tasmania.xml">SLD 78 file</a> to style the vector features. T he style to be used is either79 determined by the NamedLayer and IsDefault properties in the sld file, or80 can directly be applied by addressing a style from the styles81 hash with the UserStyle name from the sld file as key. Select a new style for the WaterBodies layer below:<p>102 file</a> to style the vector features. To construct layers that use styles 103 from SLD, create a StyleMap for the layer that uses one of the userStyles in the 104 namedLayers object of the return from format.read().</p> 105 <p>Select a new style for the WaterBodies layer below:</p> 82 106 <form> 83 <input type="radio" name="style" onclick="setStyle(this.value)" checked="checked" value="default">Default Styler (zoom in to see more features)</input><br/> 84 <input type="radio" name="style" onclick="setStyle(this.value)" value="Styler Test PropertyIsEqualTo">Styler Test PropertyIsEqualTo</input><br/> 85 <input type="radio" name="style" onclick="setStyle(this.value)" value="Styler Test Not FeatureId">Styler Test Not FeatureId</input><br/> 86 <input type="radio" name="style" onclick="setStyle(this.value)" value="Styler Test WATER_TYPE">Styler Test WATER_TYPE</input><br/> 87 <input type="radio" name="style" onclick="setStyle(this.value)" value="Styler Test PropertyIsGreaterThanOrEqualTo">Styler Test PropertyIsGreaterThanOrEqualTo</input><br/> 88 <input type="radio" name="style" onclick="setStyle(this.value)" value="Styler Test PropertyIsLessThanOrEqualTo">Styler Test PropertyIsLessThanOrEqualTo</input><br/> 89 <input type="radio" name="style" onclick="setStyle(this.value)" value="Styler Test PropertyIsGreaterThan">Styler Test PropertyIsGreaterThan</input><br/> 90 <input type="radio" name="style" onclick="setStyle(this.value)" value="Styler Test PropertyIsLessThan">Styler Test PropertyIsLessThan</input><br/> 91 <input type="radio" name="style" onclick="setStyle(this.value)" value="Styler Test PropertyIsLike">Styler Test PropertyIsLike</input><br/> 107 <input type="radio" name="style" onclick="setStyle(this.value)" checked="checked" value="0">Default Styler (zoom in to see more features)</input><br/> 108 <input type="radio" name="style" onclick="setStyle(this.value)" value="3">Styler Test PropertyIsEqualTo</input><br/> 109 <input type="radio" name="style" onclick="setStyle(this.value)" value="4">Styler Test WATER_TYPE</input><br/> 110 <input type="radio" name="style" onclick="setStyle(this.value)" value="5">Styler Test PropertyIsGreaterThanOrEqualTo</input><br/> 111 <input type="radio" name="style" onclick="setStyle(this.value)" value="6">Styler Test PropertyIsLessThanOrEqualTo</input><br/> 112 <input type="radio" name="style" onclick="setStyle(this.value)" value="7">Styler Test PropertyIsGreaterThan</input><br/> 113 <input type="radio" name="style" onclick="setStyle(this.value)" value="8">Styler Test PropertyIsLessThan</input><br/> 114 <input type="radio" name="style" onclick="setStyle(this.value)" value="9">Styler Test PropertyIsLike</input><br/> 115 <input type="radio" name="style" onclick="setStyle(this.value)" value="10">Styler Test PropertyIsBetween</input><br/> 116 <input type="radio" name="style" onclick="setStyle(this.value)" value="11">Styler Test FeatureId</input><br/> 92 117 </form> 93 118 </body> 94 119 </html> -
examples/tasmania/sld-tasmania.xml
old new 1 1 <?xml version="1.0" encoding="UTF-8"?> 2 <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"> 2 <sld:StyledLayerDescriptor version="1.0.0" 3 xmlns:sld="http://www.opengis.net/sld" 4 xmlns:ogc="http://www.opengis.net/ogc" 5 xmlns:gml="http://www.opengis.net/gml" 6 xmlns:xlink="http://www.w3.org/1999/xlink" 7 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 8 xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd"> 3 9 <sld:NamedLayer> 4 10 <sld:Name>WaterBodies</sld:Name> 5 11 <sld:UserStyle> … … 55 61 <sld:Name>testRuleNameElse</sld:Name> 56 62 <sld:Title>title</sld:Title> 57 63 <sld:Abstract>Abstract</sld:Abstract> 58 <ogc:ElseFilter/> 64 <sld:ElseFilter/> 65 <sld:PolygonSymbolizer> 66 <sld:Fill> 67 <sld:CssParameter name="fill">#aaaaff</sld:CssParameter> 68 <sld:CssParameter name="fill-opacity"> 69 <ogc:Literal>0.5</ogc:Literal> 70 </sld:CssParameter> 71 </sld:Fill> 72 <sld:Stroke> 73 <sld:CssParameter name="stroke"> 74 <ogc:Literal>#C0C0C0</ogc:Literal> 75 </sld:CssParameter> 76 <sld:CssParameter name="stroke-opacity"> 77 <ogc:Literal>1</ogc:Literal> 78 </sld:CssParameter> 79 <sld:CssParameter name="stroke-width"> 80 <ogc:Literal>1</ogc:Literal> 81 </sld:CssParameter> 82 </sld:Stroke> 83 </sld:PolygonSymbolizer> 59 84 </sld:Rule> 60 85 </sld:FeatureTypeStyle> 61 86 </sld:UserStyle> … … 123 148 <sld:Name>testRuleNameHoverElse</sld:Name> 124 149 <sld:Title>title</sld:Title> 125 150 <sld:Abstract>Abstract</sld:Abstract> 126 <ogc:ElseFilter/> 127 </sld:Rule> 128 </sld:FeatureTypeStyle> 129 </sld:UserStyle> 130 131 132 133 <sld:UserStyle> 134 <sld:Name>Attribute Filter Styler</sld:Name> 135 <sld:Title>Attribute Filter Styler</sld:Title> 136 <sld:FeatureTypeStyle> 137 <sld:Name>attribute filter type</sld:Name> 138 <sld:Title>attribute filter type</sld:Title> 139 <sld:FeatureTypeName>Feature</sld:FeatureTypeName> 140 <sld:SemanticTypeIdentifier>generic:geometry</sld:SemanticTypeIdentifier> 141 <!-- Attribute filters --> 142 <sld:Rule> 143 <sld:Name>rulePropertyIsEqualTo</sld:Name> 144 <sld:Title>rulePropertyIsEqualTo</sld:Title> 145 <sld:Abstract>rulePropertyIsEqualTo</sld:Abstract> 146 <ogc:Filter> 147 <ogc:PropertyIsEqualTo> 148 <ogc:PropertyName>name</ogc:PropertyName> 149 <ogc:Literal>My simple Polygon</ogc:Literal> 150 </ogc:PropertyIsEqualTo> 151 </ogc:Filter> 151 <sld:ElseFilter/> 152 152 <sld:PolygonSymbolizer> 153 153 <sld:Fill> 154 154 <sld:CssParameter name="fill"> 155 <ogc:Literal>#000033</ogc:Literal> 155 <ogc:Literal>black</ogc:Literal> 156 </sld:CssParameter> 157 <sld:CssParameter name="fill-opacity"> 158 <ogc:Literal>0.5</ogc:Literal> 156 159 </sld:CssParameter> 157 160 </sld:Fill> 161 <sld:Stroke> 162 <sld:CssParameter name="stroke"> 163 <ogc:Literal>fuchsia</ogc:Literal> 164 </sld:CssParameter> 165 <sld:CssParameter name="stroke-opacity"> 166 <ogc:Literal>0.5</ogc:Literal> 167 </sld:CssParameter> 168 <sld:CssParameter name="stroke-width"> 169 <ogc:Literal>5</ogc:Literal> 170 </sld:CssParameter> 171 <sld:CssParameter name="stroke-dashoffset"> 172 <ogc:Literal>0</ogc:Literal> 173 </sld:CssParameter> 174 </sld:Stroke> 158 175 </sld:PolygonSymbolizer> 159 176 </sld:Rule> 160 177 </sld:FeatureTypeStyle> … … 160 177 </sld:FeatureTypeStyle> 161 178 </sld:UserStyle> 162 179 163 164 180 <sld:UserStyle> 165 181 <sld:Name>Attribute Filter Styler</sld:Name> 166 182 <sld:Title>Attribute Filter Styler</sld:Title> … … 220 236 </sld:Rule> 221 237 </sld:FeatureTypeStyle> 222 238 </sld:UserStyle> 223 224 <sld:UserStyle> 225 <sld:Name>Styler Test Not FeatureId</sld:Name> 226 <sld:Title>Styler Test Not FeatureId</sld:Title> 227 <sld:FeatureTypeStyle> 228 <sld:Name>attribute filter type</sld:Name> 229 <sld:Title>attribute filter type</sld:Title> 230 <sld:FeatureTypeName>Feature</sld:FeatureTypeName> 231 <sld:SemanticTypeIdentifier>generic:geometry</sld:SemanticTypeIdentifier> 232 <!-- Attribute filters --> 233 <sld:Rule> 234 <sld:Name>ruleNotFeatureId</sld:Name> 235 <sld:Title>ruleNotFeatureId</sld:Title> 236 <sld:Abstract>ruleNotFeatureId</sld:Abstract> 237 <ogc:Filter> 238 <ogc:Not> 239 <ogc:FeatureId fid="tasmania_water_bodies.7" /> 240 </ogc:Not> 241 </ogc:Filter> 242 <sld:PolygonSymbolizer> 243 <sld:Fill> 244 <sld:CssParameter name="fill"> 245 <ogc:Literal>red</ogc:Literal> 246 </sld:CssParameter> 247 </sld:Fill> 248 </sld:PolygonSymbolizer> 249 </sld:Rule> 250 </sld:FeatureTypeStyle> 251 </sld:UserStyle> 252 253 254 255 239 256 240 <sld:UserStyle> 257 241 <sld:Name>Styler Test WATER_TYPE</sld:Name> 258 242 <sld:Title>Styler Test WATER_TYPE</sld:Title> … … 429 413 </sld:Rule> 430 414 </sld:FeatureTypeStyle> 431 415 </sld:UserStyle> 432 416 433 417 <sld:UserStyle> 434 418 <sld:Name>Styler Test PropertyIsLike</sld:Name> 435 419 <sld:Title>Styler Test PropertyIsLike</sld:Title> … … 460 444 </sld:FeatureTypeStyle> 461 445 </sld:UserStyle> 462 446 463 464 447 <sld:UserStyle> 465 448 <sld:Name>Styler Test PropertyIsBetween</sld:Name> 466 449 <sld:Title>Styler Test PropertyIsBetween</sld:Title> … … 478 461 <ogc:PropertyIsBetween> 479 462 <ogc:PropertyName>AREA</ogc:PropertyName> 480 463 <ogc:LowerBoundary> 481 <ogc:Literal>106 0000000</ogc:Literal>464 <ogc:Literal>1064866676</ogc:Literal> 482 465 </ogc:LowerBoundary> 483 466 <ogc:UpperBoundary> 484 <ogc:Literal>10 70000000</ogc:Literal>467 <ogc:Literal>1065512599</ogc:Literal> 485 468 </ogc:UpperBoundary> 486 469 </ogc:PropertyIsBetween> 487 470 </ogc:Filter> … … 496 479 </sld:FeatureTypeStyle> 497 480 </sld:UserStyle> 498 481 482 <sld:UserStyle> 483 <sld:Name>FeatureId</sld:Name> 484 <sld:Title>Styler Test FeatureId</sld:Title> 485 <sld:FeatureTypeStyle> 486 <sld:Rule> 487 <ogc:Filter> 488 <ogc:FeatureId fid="tasmania_water_bodies.4"/> 489 </ogc:Filter> 490 <sld:PolygonSymbolizer> 491 <sld:Fill> 492 <sld:CssParameter name="fill">blue</sld:CssParameter> 493 </sld:Fill> 494 </sld:PolygonSymbolizer> 495 </sld:Rule> 496 </sld:FeatureTypeStyle> 497 </sld:UserStyle> 498 499 499 </sld:NamedLayer> 500 500 501 501 <sld:NamedLayer> … … 503 503 <sld:UserStyle> 504 504 <sld:Name>RoadsDefault</sld:Name> 505 505 <sld:IsDefault>1</sld:IsDefault> 506 <sld:Rule> 507 <sld:Name>justAStyler</sld:Name> 508 <sld:LineSymbolizer> 509 <sld:Stroke> 510 <sld:CssParameter name="stroke"> 511 <ogc:Literal>red</ogc:Literal> 512 </sld:CssParameter> 513 <sld:CssParameter name="stroke-width"> 514 <ogc:Literal>2</ogc:Literal> 515 </sld:CssParameter> 516 </sld:Stroke> 517 </sld:LineSymbolizer> 518 </sld:Rule> 506 <sld:FeatureTypeStyle> 507 <sld:Rule> 508 <sld:Name>justAStyler</sld:Name> 509 <sld:LineSymbolizer> 510 <sld:Stroke> 511 <sld:CssParameter name="stroke"> 512 <ogc:Literal>red</ogc:Literal> 513 </sld:CssParameter> 514 <sld:CssParameter name="stroke-width"> 515 <ogc:Literal>2</ogc:Literal> 516 </sld:CssParameter> 517 </sld:Stroke> 518 </sld:LineSymbolizer> 519 </sld:Rule> 520 </sld:FeatureTypeStyle> 519 521 </sld:UserStyle> 520 522 </sld:NamedLayer> 521 523 … … 524 526 <sld:UserStyle> 525 527 <sld:Name>DefaultCities</sld:Name> 526 528 <sld:IsDefault>1</sld:IsDefault> 527 <sld:Rule> 528 <sld:PointSymbolizer> 529 <sld:Graphic> 530 <sld:ExternalGraphic> 531 <sld:OnlineResource xlink:href="../img/marker.png" /> 532 <sld:Format>image/png</sld:Format> 533 </sld:ExternalGraphic> 534 <sld:Size>10</sld:Size> 535 <sld:Opacity>0.5</sld:Opacity> 536 </sld:Graphic> 537 </sld:PointSymbolizer> 538 </sld:Rule> 529 <sld:FeatureTypeStyle> 530 <sld:Rule> 531 <sld:PointSymbolizer> 532 <sld:Graphic> 533 <sld:ExternalGraphic> 534 <sld:OnlineResource xlink:href="../img/marker.png" /> 535 <sld:Format>image/png</sld:Format> 536 </sld:ExternalGraphic> 537 <sld:Opacity>0.5</sld:Opacity> 538 <sld:Size>10</sld:Size> 539 </sld:Graphic> 540 </sld:PointSymbolizer> 541 </sld:Rule> 542 </sld:FeatureTypeStyle> 539 543 </sld:UserStyle> 540 544 </sld:NamedLayer> 541 545 546 <sld:NamedLayer> 547 <sld:Name>Land</sld:Name> 548 <sld:UserStyle> 549 <sld:Name>Land Style</sld:Name> 550 <sld:IsDefault>1</sld:IsDefault> 551 <sld:FeatureTypeStyle> 552 <sld:Rule> 553 <sld:PolygonSymbolizer> 554 <sld:Fill> 555 <sld:CssParameter name="fill">#ccffaa</sld:CssParameter> 556 <sld:CssParameter name="fill-opacity"> 557 <ogc:Literal>0.5</ogc:Literal> 558 </sld:CssParameter> 559 </sld:Fill> 560 <sld:Stroke> 561 <sld:CssParameter name="stroke"> 562 <ogc:Literal>#C0C0C0</ogc:Literal> 563 </sld:CssParameter> 564 <sld:CssParameter name="stroke-opacity"> 565 <ogc:Literal>1</ogc:Literal> 566 </sld:CssParameter> 567 <sld:CssParameter name="stroke-width"> 568 <ogc:Literal>1</ogc:Literal> 569 </sld:CssParameter> 570 </sld:Stroke> 571 </sld:PolygonSymbolizer> 572 </sld:Rule> 573 </sld:FeatureTypeStyle> 574 </sld:UserStyle> 575 </sld:NamedLayer> 576 542 577 </sld:StyledLayerDescriptor> -
lib/OpenLayers/Format/SLD/v1.js
old new 1 /* Copyright (c) 2006-2008 MetaCarta, Inc., published under the Clear BSD 2 * license. See http://svn.openlayers.org/trunk/openlayers/license.txt for the 3 * full text of the license. */ 4 5 /** 6 * @requires OpenLayers/Format/SLD.js 7 */ 8 9 /** 10 * Class: OpenLayers.Format.SLD.v1 11 * Superclass for SLD version 1 parsers. 12 * 13 * Inherits from: 14 * - <OpenLayers.Format.XML> 15 */ 16 OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.XML, { 17 18 /** 19 * Property: namespaces 20 * {Object} Mapping of namespace aliases to namespace URIs. 21 */ 22 namespaces: { 23 sld: "http://www.opengis.net/sld", 24 ogc: "http://www.opengis.net/ogc", 25 xlink: "http://www.w3.org/1999/xlink", 26 xsi: "http://www.w3.org/2001/XMLSchema-instance" 27 }, 28 29 /** 30 * Property: defaultPrefix 31 */ 32 defaultPrefix: "sld", 33 34 /** 35 * Property: schemaLocation 36 * {String} Schema location for a particular minor version. 37 */ 38 schemaLocation: null, 39 40 /** 41 * APIProperty: defaultSymbolizer. 42 * {Object} A symbolizer with the SLD defaults. 43 */ 44 defaultSymbolizer: { 45 fillColor: "#808080", 46 fillOpacity: 1, 47 strokeColor: "#000000", 48 strokeOpacity: 1, 49 strokeWidth: 1, 50 pointRadius: 6 51 }, 52 53 /** 54 * Constructor: OpenLayers.Format.SLD.v1 55 * Instances of this class are not created directly. Use the 56 * <OpenLayers.Format.SLD> constructor instead. 57 * 58 * Parameters: 59 * options - {Object} An optional object whose properties will be set on 60 * this instance. 61 */ 62 initialize: function(options) { 63 OpenLayers.Format.XML.prototype.initialize.apply(this, [options]); 64 }, 65 66 /** 67 * Method: read 68 * 69 * Parameters: 70 * data - {DOMElement} An SLD document element. 71 * 72 * Returns: 73 * {Object} An object representing the SLD. 74 */ 75 read: function(data) { 76 var sld = { 77 namedLayers: {} 78 }; 79 this.readChildNodes(data, sld); 80 return sld; 81 }, 82 83 /** 84 * Property: readers 85 * Contains public functions, grouped by namespace prefix, that will 86 * be applied when a namespaced node is found matching the function 87 * name. The function will be applied in the scope of this parser 88 * with two arguments: the node being read and a context object passed 89 * from the parent. 90 */ 91 readers: { 92 "sld": { 93 "StyledLayerDescriptor": function(node, sld) { 94 sld.version = node.getAttribute("version"); 95 this.readChildNodes(node, sld); 96 }, 97 "Name": function(node, obj) { 98 obj.name = this.getChildValue(node); 99 }, 100 "Title": function(node, obj) { 101 obj.title = this.getChildValue(node); 102 }, 103 "Abstract": function(node, obj) { 104 obj.description = this.getChildValue(node); 105 }, 106 "NamedLayer": function(node, sld) { 107 var layer = { 108 userStyles: [], 109 namedStyles: [] 110 }; 111 this.readChildNodes(node, layer); 112 // give each of the user styles this layer name 113 for(var i=0; i<layer.userStyles.length; ++i) { 114 layer.userStyles[i].layerName = layer.name; 115 } 116 sld.namedLayers[layer.name] = layer; 117 }, 118 "NamedStyle": function(node, layer) { 119 layer.namedStyles.push( 120 this.getChildName(node.firstChild) 121 ); 122 }, 123 "UserStyle": function(node, layer) { 124 var style = new OpenLayers.Style(this.defaultSymbolizer); 125 this.readChildNodes(node, style); 126 layer.userStyles.push(style); 127 }, 128 "IsDefault": function(node, style) { 129 if(this.getChildValue(node) == "1") { 130 style.isDefault = true; 131 } 132 }, 133 "FeatureTypeStyle": function(node, style) { 134 // OpenLayers doesn't have a place for FeatureTypeStyle 135 // Name, Title, Abstract, FeatureTypeName, or 136 // SemanticTypeIdentifier so, we make a temporary object 137 // and later just use the Rule(s). 138 var obj = { 139 rules: [] 140 }; 141 this.readChildNodes(node, obj); 142 style.rules = obj.rules; 143 }, 144 "Rule": function(node, obj) { 145 // Rule elements are represented as OpenLayers.Rule instances. 146 // Filter elements are represented as instances of 147 // OpenLayers.Rule subclasses. 148 var config = { 149 rules: [], 150 symbolizer: {} 151 }; 152 this.readChildNodes(node, config); 153 // Now we've either got zero or one rules (from filters) 154 var rule; 155 if(config.rules.length == 0) { 156 delete config.rules; 157 rule = new OpenLayers.Rule(config); 158 } else { 159 rule = config.rules[0]; 160 delete config.rules; 161 OpenLayers.Util.extend(rule, config); 162 } 163 obj.rules.push(rule); 164 }, 165 "ElseFilter": function(node, rule) { 166 rule.elseFilter = true; 167 }, 168 "MinScaleDenominator": function(node, rule) { 169 rule.minScaleDenominator = this.getChildValue(node); 170 }, 171 "MaxScaleDenominator": function(node, rule) { 172 rule.maxScaleDenominator = this.getChildValue(node); 173 }, 174 "LineSymbolizer": function(node, rule) { 175 // OpenLayers doens't do painter's order, instead we extend 176 var symbolizer = rule.symbolizer["Line"] || {}; 177 this.readChildNodes(node, symbolizer); 178 // in case it didn't exist before 179 rule.symbolizer["Line"] = symbolizer; 180 }, 181 "PolygonSymbolizer": function(node, rule) { 182 // OpenLayers doens't do painter's order, instead we extend 183 var symbolizer = rule.symbolizer["Polygon"] || {}; 184 this.readChildNodes(node, symbolizer); 185 // in case it didn't exist before 186 rule.symbolizer["Polygon"] = symbolizer; 187 }, 188 "PointSymbolizer": function(node, rule) { 189 // OpenLayers doens't do painter's order, instead we extend 190 var symbolizer = rule.symbolizer["Point"] || {}; 191 this.readChildNodes(node, symbolizer); 192 // in case it didn't exist before 193 rule.symbolizer["Point"] = symbolizer; 194 }, 195 "Stroke": function(node, symbolizer) { 196 this.readChildNodes(node, symbolizer); 197 }, 198 "Fill": function(node, symbolizer) { 199 this.readChildNodes(node, symbolizer); 200 }, 201 "CssParameter": function(node, symbolizer) { 202 var cssProperty = node.getAttribute("name"); 203 var symProperty = this.cssMap[cssProperty]; 204 if(symProperty) { 205 // Limited support for parsing of OGC expressions 206 var value = this.readOgcExpression(node); 207 // always string, could be an empty string 208 if(value) { 209 symbolizer[symProperty] = value; 210 } 211 } 212 }, 213 "Graphic": function(node, symbolizer) { 214 var graphic = {}; 215 // painter's order not respected here, clobber previous with next 216 this.readChildNodes(node, graphic); 217 // directly properties with names that match symbolizer properties 218 var properties = [ 219 "strokeColor", "strokeWidth", "strokeOpacity", 220 "strokeLinecap", "fillColor", "fillOpacity", 221 "graphicName", "rotation", "graphicFormat" 222 ]; 223 var prop, value; 224 for(var i=0; i<properties.length; ++i) { 225 prop = properties[i]; 226 value = graphic[prop]; 227 if(value != undefined) { 228 symbolizer[prop] = value; 229 } 230 } 231 // set other generic properties with specific graphic property names 232 if(graphic.opacity != undefined) { 233 symbolizer.graphicOpacity = graphic.opacity; 234 } 235 if(graphic.size != undefined) { 236 symbolizer.pointRadius = graphic.size; 237 } 238 if(graphic.href != undefined) { 239 symbolizer.externalGraphic = graphic.href; 240 } 241 }, 242 "ExternalGraphic": function(node, graphic) { 243 this.readChildNodes(node, graphic); 244 }, 245 "Mark": function(node, graphic) { 246 this.readChildNodes(node, graphic); 247 }, 248 "WellKnownName": function(node, graphic) { 249 graphic.graphicName = this.getChildValue(node); 250 }, 251 "Opacity": function(node, obj) { 252 // No support for parsing of OGC expressions 253 var opacity = this.getChildValue(node); 254 // always string, could be empty string 255 if(opacity) { 256 obj.opacity = opacity; 257 } 258 }, 259 "Size": function(node, obj) { 260 // No support for parsing of OGC expressions 261 var size = this.getChildValue(node); 262 // always string, could be empty string 263 if(size) { 264 obj.size = size; 265 } 266 }, 267 "Rotation": function(node, obj) { 268 // No support for parsing of OGC expressions 269 var rotation = this.getChildValue(node); 270 // always string, could be empty string 271 if(rotation) { 272 obj.rotation = rotation; 273 } 274 }, 275 "OnlineResource": function(node, obj) { 276 obj.href = this.getAttributeNS( 277 node, this.namespaces.xlink, "href" 278 ); 279 }, 280 "Format": function(node, graphic) { 281 graphic.graphicFormat = this.getChildValue(node); 282 } 283 }, 284 "ogc": { 285 "Filter": function(node, rule) { 286 // Filters correspond to subclasses of OpenLayers.Rule. 287 // Since they contain information we don't persist, we 288 // create a temporary object and then pass on the rules 289 // (ogc:Filter) to the parent rule (sld:Rule). 290 var filter = { 291 fids: [], 292 rules: [] 293 }; 294 this.readChildNodes(node, filter); 295 if(filter.fids.length > 0) { 296 rule.rules.push(new OpenLayers.Rule.FeatureId({ 297 fids: filter.fids 298 })); 299 } 300 if(filter.rules.length > 0) { 301 rule.rules = rule.rules.concat(filter.rules); 302 } 303 }, 304 "FeatureId": function(node, filter) { 305 var fid = node.getAttribute("fid"); 306 if(fid) { 307 filter.fids.push(fid); 308 } 309 }, 310 "And": function(node, filter) { 311 var rule = new OpenLayers.Rule.Logical({ 312 type: OpenLayers.Rule.Logical.AND 313 }); 314 // since FeatureId rules may be nested here, make room for them 315 rule.fids = []; 316 this.readChildNodes(node, rule); 317 if(rule.fids.length > 0) { 318 rule.rules.push(new OpenLayers.Rule.FeatureId({ 319 fids: rule.fids 320 })); 321 } 322 delete rule.fids; 323 filter.rules.push(rule); 324 }, 325 "Or": function(node, filter) { 326 var rule = new OpenLayers.Rule.Logical({ 327 type: OpenLayers.Rule.Logical.OR 328 }); 329 // since FeatureId rules may be nested here, make room for them 330 rule.fids = []; 331 this.readChildNodes(node, rule); 332 if(rule.fids.length > 0) { 333 rule.rules.push(new OpenLayers.Rule.FeatureId({ 334 fids: rule.fids 335 })); 336 } 337 delete rule.fids; 338 filter.rules.push(rule); 339 }, 340 "Not": function(node, filter) { 341 var rule = new OpenLayers.Rule.Logical({ 342 type: OpenLayers.Rule.Logical.NOT 343 }); 344 // since FeatureId rules may be nested here, make room for them 345 rule.fids = []; 346 this.readChildNodes(node, rule); 347 if(rule.fids.length > 0) { 348 rule.rules.push(new OpenLayers.Rule.FeatureId({ 349 fids: rule.fids 350 })); 351 } 352 delete rule.fids; 353 filter.rules.push(rule); 354 }, 355 "PropertyIsEqualTo": function(node, filter) { 356 var rule = new OpenLayers.Rule.Comparison({ 357 type: OpenLayers.Rule.Comparison.EQUAL_TO 358 }); 359 this.readChildNodes(node, rule); 360 filter.rules.push(rule); 361 }, 362 "PropertyIsNotEqualTo": function(node, filter) { 363 var rule = new OpenLayers.Rule.Comparison({ 364 type: OpenLayers.Rule.Comparison.NOT_EQUAL_TO 365 }); 366 this.readChildNodes(node, rule); 367 filter.rules.push(rule); 368 }, 369 "PropertyIsLessThan": function(node, filter) { 370 var rule = new OpenLayers.Rule.Comparison({ 371 type: OpenLayers.Rule.Comparison.LESS_THAN 372 }); 373 this.readChildNodes(node, rule); 374 filter.rules.push(rule); 375 }, 376 "PropertyIsGreaterThan": function(node, filter) { 377 var rule = new OpenLayers.Rule.Comparison({ 378 type: OpenLayers.Rule.Comparison.GREATER_THAN 379 }); 380 this.readChildNodes(node, rule); 381 filter.rules.push(rule); 382 }, 383 "PropertyIsLessThanOrEqualTo": function(node, filter) { 384 var rule = new OpenLayers.Rule.Comparison({ 385 type: OpenLayers.Rule.Comparison.LESS_THAN_OR_EQUAL_TO 386 }); 387 this.readChildNodes(node, rule); 388 filter.rules.push(rule); 389 }, 390 "PropertyIsGreaterThanOrEqualTo": function(node, filter) { 391 var rule = new OpenLayers.Rule.Comparison({ 392 type: OpenLayers.Rule.Comparison.GREATER_THAN_OR_EQUAL_TO 393 }); 394 this.readChildNodes(node, rule); 395 filter.rules.push(rule); 396 }, 397 "PropertyIsBetween": function(node, filter) { 398 var rule = new OpenLayers.Rule.Comparison({ 399 type: OpenLayers.Rule.Comparison.BETWEEN 400 }); 401 this.
