OpenLayers OpenLayers

Ticket #1542: text.patch

File text.patch, 5.5 kB (added by tschaub, 6 months ago)

write text symbolizers with support for label expressions

  • tests/Format/SLD/v1_0_0.html

    old new  
    150150         
    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>  
    155191</head>  
  • lib/OpenLayers/Format/SLD/v1.js

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

    old new  
    353353 * {Array} prefixes of the sld symbolizers. These are the 
    354354 * same as the main geometry types 
    355355 */ 
    356 OpenLayers.Style.SYMBOLIZER_PREFIXES = ['Point', 'Line', 'Polygon']; 
     356OpenLayers.Style.SYMBOLIZER_PREFIXES = ['Point', 'Line', 'Polygon', 'Text'];