OpenLayers OpenLayers

Changeset 7333

Show
Ignore:
Timestamp:
06/09/08 13:18:35 (3 months ago)
Author:
tschaub
Message:

Adding support for TextSymbolizer writing in the SLD format. Thanks to Bart for the original patch. This provides basic expression handling for text labels. Read support later. r=ahocevar (closes #1542)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/openlayers/lib/OpenLayers/Format/SLD/v1.js

    r7324 r7333  
    426426        "stroke-linecap": "strokeLinecap", 
    427427        "fill": "fillColor", 
    428         "fill-opacity": "fillOpacity" 
     428        "fill-opacity": "fillOpacity", 
     429        "font-family": "fontFamily", 
     430        "font-size": "fontSize" 
    429431    }, 
    430432     
     
    732734                    value: obj.symbolizer[obj.key] 
    733735                }); 
     736            }, 
     737            "TextSymbolizer": function(symbolizer) { 
     738                var node = this.createElementNSPlus("TextSymbolizer"); 
     739                // add in optional Label 
     740                if(symbolizer.label != null) { 
     741                    this.writeNode(node, "Label", symbolizer.label); 
     742                } 
     743                // add in optional Font 
     744                if(symbolizer.fontFamily != null || 
     745                   symbolizer.fontSize != null) { 
     746                    this.writeNode(node, "Font", symbolizer); 
     747                } 
     748                // add in optional Fill 
     749                if(symbolizer.fillColor != null || 
     750                   symbolizer.fillOpacity != null) { 
     751                    this.writeNode(node, "Fill", symbolizer); 
     752                } 
     753                return node; 
     754            }, 
     755            "Font": function(symbolizer) { 
     756                var node = this.createElementNSPlus("Font"); 
     757                // add in CssParameters 
     758                if(symbolizer.fontFamily) { 
     759                    this.writeNode( 
     760                        node, "CssParameter", 
     761                        {symbolizer: symbolizer, key: "fontFamily"} 
     762                    ); 
     763                } 
     764                if(symbolizer.fontSize) { 
     765                    this.writeNode( 
     766                        node, "CssParameter", 
     767                        {symbolizer: symbolizer, key: "fontSize"} 
     768                    ); 
     769                } 
     770                return node; 
     771            }, 
     772            "Label": function(label) { 
     773                // only the simplest of ogc:expression handled 
     774                // {label: "some text and a ${propertyName}"} 
     775                var node = this.createElementNSPlus("Label"); 
     776                var tokens = label.split("${"); 
     777                node.appendChild(this.createTextNode(tokens[0])); 
     778                var item, last; 
     779                for(var i=1; i<tokens.length; i++) { 
     780                    item = tokens[i]; 
     781                    last = item.indexOf("}");  
     782                    if(last > 0) { 
     783                        this.writeNode( 
     784                            node, "ogc:PropertyName", 
     785                            {property: item.substring(0, last)} 
     786                        ); 
     787                        node.appendChild( 
     788                            this.createTextNode(item.substring(++last)) 
     789                        ); 
     790                    } else { 
     791                        // no ending }, so this is a literal ${ 
     792                        node.appendChild( 
     793                            this.createTextNode("${" + item) 
     794                        ); 
     795                    } 
     796                } 
     797                return node; 
    734798            }, 
    735799            "PolygonSymbolizer": function(symbolizer) { 
  • trunk/openlayers/lib/OpenLayers/Style.js

    r7173 r7333  
    354354 * same as the main geometry types 
    355355 */ 
    356 OpenLayers.Style.SYMBOLIZER_PREFIXES = ['Point', 'Line', 'Polygon']; 
     356OpenLayers.Style.SYMBOLIZER_PREFIXES = ['Point', 'Line', 'Polygon', 'Text']; 
  • trunk/openlayers/tests/Format/SLD/v1_0_0.html

    r6818 r7333  
    151151    } 
    152152     
     153    function test_writeTextSymbolizer(t) { 
     154        t.plan(1); 
     155        var parser = new OpenLayers.Format.SLD.v1_0_0(); 
     156        var symbolizer = { 
     157            "Text": { 
     158                "label": "This is the ${city} in ${state}.", 
     159                "fontFamily": "Arial", 
     160                "fontSize": 10, 
     161                "fillColor": "blue" 
     162            } 
     163        }; 
     164        var node = parser.writers["sld"]["TextSymbolizer"].apply( 
     165            parser, [symbolizer["Text"]] 
     166        ); 
     167         
     168        var expected = 
     169            '<TextSymbolizer xmlns="http://www.opengis.net/sld">' + 
     170                '<Label>' + 
     171                    'This is the ' + 
     172                    '<ogc:PropertyName xmlns:ogc="http://www.opengis.net/ogc">city</ogc:PropertyName>' + 
     173                    ' in ' + 
     174                    '<ogc:PropertyName xmlns:ogc="http://www.opengis.net/ogc">state</ogc:PropertyName>' + 
     175                    '.' + 
     176                '</Label>' + 
     177                '<Font>' + 
     178                    '<CssParameter name="font-family">Arial</CssParameter>' + 
     179                    '<CssParameter name="font-size">10</CssParameter>' + 
     180                '</Font>' + 
     181                '<Fill>' + 
     182                    '<CssParameter name="fill">blue</CssParameter>' + 
     183                '</Fill>' +  
     184            '</TextSymbolizer>'; 
     185         
     186        t.xml_eq(node, expected, "TextSymbolizer correctly written"); 
     187         
     188    } 
    153189 
    154190    </script>