[udig-devel] SLD: How to combine different feature attributes for a TextSymbolizer

Jody Garnett jgarnett at refractions.net
Tue Jun 5 12:18:51 PDT 2007


What you describe is supposed to work in the Filter specification right 
now .. but it is beyond the abilities of our current implementation.

Basically the <label> is allowed to be mixed text ....

<label><propertyName>number</propertyName>; 
<propertyName>London</propertyName>;<propertyName>size</propertyName></label>

For now just use three different text symbolizers, and position them so 
they do not overlap.

Cheers,
Jody
> Hi list,
> I want to show a set of feature attributes (all Strings) as one 
> label in the map next to the point/graphic. Like "1; London; 12" 
> (number of item, name and a status). Since the user can toggle check 
> boxes to switch on/off single values I can not store all information 
> in one feature attribute. Instead of this I have n (currently 5) 
> feature attributes for this. This is the way I thought it's the 
> correct one:
>  
> ---- code ----
> // after each attribute except the last one a seperator like ";"
> // textAttributes is a List of attributes the user wants to be shown
> // Attributes is a enum with all attributes
> Expression[] expressions = new Expression[textAttributes.size()*2-1];
>       int i = 0;
>       for (Attributes a : Attributes.values()){
>        if (textAttributes.contains(a)){
> // attribute expression for the attribute
>         Expression attributeExpression = 
> FilterFactoryFinder.createFilterFactory().createAttributeExpression(a.name());
> // literal expression for the seperator
>         LiteralExpression seperator = 
> FilterFactoryFinder.createFilterFactory().createLiteralExpression(";");
>         expressions[i++]=attributeExpression;
>         if (i<expressions.length){
>          expressions[i++]=seperator;
>         }
>        }
>       }
> // Filter to concatenate strings
>       FilterFunction_strConcat concatFunction = new 
> FilterFunction_strConcat();
>       concatFunction.setArgs(expressions);
> // create TextSymbolizer (fill and font are handled above... not 
> interesting here)
>       myStyleBuilder.createTextSymbolizer(fill, new Font[] 
> {gtFont},null, concatFunction, placement, null));
> ---- code ----
> My first problem was to find a possibility to concatenate strings. 
> Since 
> http://udig.refractions.net/docs/api-geotools/org/geotools/filter/function/FilterFunction_strConcat.html has 
> a very poor javadoc explanation I just guessed that this function is 
> the correct one.
>  
> What happend?
> Independet of the number of attributes I want to show (2,3,4,5) only 
> the first attribute combined with the first seperator (";") is drawn. 
> So I got "London;" instead of "London;1;3". If I flip the order of 
> attributes I get "1;" instead of "1;London;3". As I said only the 
> first two expressions (one attribute, one literal) are included. Since 
> these two are included I guess that the FilterFunction_strConcat is 
> the correct way. Can someone help me with this?
> I debuged it and the expressions array is build correct, has no null 
> elements and all seems ok.
>  
> Thank you,
> tony roth
> ------------------------------------------------------------------------
>
> _______________________________________________
> User-friendly Desktop Internet GIS (uDig)
> http://udig.refractions.net
> http://lists.refractions.net/mailman/listinfo/udig-devel
>   



More information about the udig-devel mailing list