OpenLayers OpenLayers

Ticket #1458: 1458-r6638-A1.patch

File 1458-r6638-A1.patch, 98.9 kB (added by ahocevar, 8 months ago)

same as above (hopefully again with html preview), but with the Format/SLD subfolder that was missing in the previous two patches.

  • examples/sld.html

    old new  
    66            width: 800px; 
    77            height: 475px; 
    88            border: 1px solid black; 
     9            background: #ccddff; 
    910        } 
    1011    </style> 
    1112    <script src="../lib/Firebug/firebug.js"></script> 
     
    1112    <script src="../lib/Firebug/firebug.js"></script> 
    1213    <script src="../lib/OpenLayers.js"></script> 
    1314    <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()); 
    1822 
    19         function load(){ 
    20            OpenLayers.loadURL("tasmania/sld-tasmania.xml", "", null, init); 
     23            OpenLayers.loadURL("tasmania/sld-tasmania.xml", null, null, complete); 
     24 
    2125        } 
    2226         
    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) { 
    2940 
    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 
    4047            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)); 
    5883             
    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            ); 
    6387            map.addControl(hover); 
    6488            hover.activate(); 
    6589        } 
     
    6589        } 
    6690         
    6791        // set a new style when the radio button changes 
    68         function setStyle(styleName) { 
    69             gmlLayers[2].styleMap.styles["default"] = styles["WaterBodies"][styleName]; 
     92        function setStyle(index) { 
     93            gmlLayers[2].styleMap.styles["default"] = sld.namedLayers["WaterBodies"].userStyles[index]; 
    7094            // change the style of the features of the WaterBodies layer 
    7195            gmlLayers[2].redraw(); 
    7296        } 
     
    7296        } 
    7397    </script> 
    7498  </head> 
    75   <body onload="load()"> 
     99  <body onload="init()"> 
    76100    <div id="map"></div> 
    77101    <p>This example uses a <a target="_blank" href="tasmania/sld-tasmania.xml">SLD 
    78     file</a> to style the vector features. The style to be used is either 
    79     determined by the NamedLayer and IsDefault properties in the sld file, or 
    80     can directly be applied by addressing a style from the styles 
    81     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> 
    82106    <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/> 
    92117    </form> 
    93118  </body> 
    94119</html> 
  • examples/tasmania/sld-tasmania.xml

    old new  
    11<?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"> 
    39  <sld:NamedLayer> 
    410    <sld:Name>WaterBodies</sld:Name> 
    511    <sld:UserStyle> 
     
    5561          <sld:Name>testRuleNameElse</sld:Name> 
    5662          <sld:Title>title</sld:Title> 
    5763          <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> 
    5984        </sld:Rule> 
    6085      </sld:FeatureTypeStyle> 
    6186    </sld:UserStyle> 
     
    123148          <sld:Name>testRuleNameHoverElse</sld:Name> 
    124149          <sld:Title>title</sld:Title> 
    125150          <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/> 
    152152          <sld:PolygonSymbolizer> 
    153153            <sld:Fill> 
    154154              <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> 
    156159              </sld:CssParameter> 
    157160            </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> 
    158175          </sld:PolygonSymbolizer> 
    159176        </sld:Rule> 
    160177      </sld:FeatureTypeStyle> 
     
    160177      </sld:FeatureTypeStyle> 
    161178    </sld:UserStyle> 
    162179 
    163  
    164180    <sld:UserStyle> 
    165181      <sld:Name>Attribute Filter Styler</sld:Name> 
    166182      <sld:Title>Attribute Filter Styler</sld:Title> 
     
    220236        </sld:Rule> 
    221237      </sld:FeatureTypeStyle> 
    222238    </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     
    256240    <sld:UserStyle> 
    257241      <sld:Name>Styler Test WATER_TYPE</sld:Name> 
    258242      <sld:Title>Styler Test WATER_TYPE</sld:Title> 
     
    429413        </sld:Rule> 
    430414      </sld:FeatureTypeStyle> 
    431415    </sld:UserStyle> 
    432  
     416     
    433417    <sld:UserStyle> 
    434418      <sld:Name>Styler Test PropertyIsLike</sld:Name> 
    435419      <sld:Title>Styler Test PropertyIsLike</sld:Title> 
     
    460444      </sld:FeatureTypeStyle> 
    461445    </sld:UserStyle> 
    462446 
    463  
    464447    <sld:UserStyle> 
    465448      <sld:Name>Styler Test PropertyIsBetween</sld:Name> 
    466449      <sld:Title>Styler Test PropertyIsBetween</sld:Title> 
     
    478461            <ogc:PropertyIsBetween> 
    479462              <ogc:PropertyName>AREA</ogc:PropertyName> 
    480463              <ogc:LowerBoundary> 
    481                 <ogc:Literal>1060000000</ogc:Literal> 
     464                <ogc:Literal>1064866676</ogc:Literal> 
    482465              </ogc:LowerBoundary> 
    483466              <ogc:UpperBoundary> 
    484                 <ogc:Literal>1070000000</ogc:Literal> 
     467                <ogc:Literal>1065512599</ogc:Literal> 
    485468              </ogc:UpperBoundary> 
    486469            </ogc:PropertyIsBetween> 
    487470          </ogc:Filter> 
     
    496479      </sld:FeatureTypeStyle> 
    497480    </sld:UserStyle> 
    498481 
     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 
    499499  </sld:NamedLayer> 
    500500 
    501501  <sld:NamedLayer> 
     
    503503    <sld:UserStyle> 
    504504      <sld:Name>RoadsDefault</sld:Name> 
    505505      <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> 
    519521    </sld:UserStyle> 
    520522  </sld:NamedLayer> 
    521523 
     
    524526    <sld:UserStyle> 
    525527      <sld:Name>DefaultCities</sld:Name> 
    526528      <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> 
    539543    </sld:UserStyle> 
    540544  </sld:NamedLayer> 
    541545 
     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   
    542577</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 */ 
     16OpenLayers.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.