Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[udig-devel] Snippet : A methode used to create Style for a discrete value

hello,

here a little UNOFFICIAL (unsupported, to your own risk, without garanty on anything ) snippet about Style (based on somelse code, don't remember where (a test class maybe):



/**
* this function build a polygon style usable to color a discrete attribute into a feature. (kind of soil,...)
     * of course length(colors) is equal to length(setofdata)
     * @param name : the name of the discret attribute to color
* @param colors : an array of color, One color by discrete value, can be null (choose a ramdom color in that case)
     * @param setofdata : all the real discrete values
* @param schema : the FeatureType ( use FeatureSource FS = theLayer.getResource(FeatureSource.class, null); FS.getSchema())
     * @return Style : the style
     * @throws IllegalFilterException
     */
public static Style buildTypedStyle(String name,Color[] colors,String[] setofdata, FeatureType schema) throws IllegalFilterException {

            int count =setofdata.length;



            //grab attribute col

        StyleBuilder sb = new StyleBuilder();
        FilterFactory ff = sb.getFilterFactory();
        StyleFactory sf = sb.getStyleFactory();
        Style ret = sb.createStyle();
AttributeExpression value = sb.getFilterFactory ().createAttributeExpression(schema, name);


Rule[] rules = new Rule[count+1]; // one more in order to add the ELSE rule entry

            for (int i=0;i<count;i++)
            {


LikeFilterImpl cf1 = (LikeFilterImpl) ff.createLikeFilter();

LiteralExpression le = ff.createLiteralExpression (setofdata[i]);
                cf1.setValue(value);
                cf1.setPattern(le,"*","?","\\"); //+"*"
                rules[i] = sf.createRule();
                rules[i].setFilter(cf1);
                Color c;
                if (colors== null)
                    c = createRandomColor();
                else
                {
                    c = colors[i];
                    //if (c== null)
                    //    c = createRandomColor();
                }
PolygonSymbolizer symb1 = sb.createPolygonSymbolizer (c, Color.black, 1.0);
                rules[i].setSymbolizers(new Symbolizer[] { symb1 });


            }



            // we build the  else
            rules[count] = sf.createRule();

PolygonSymbolizer elsePoly = sb.createPolygonSymbolizer (Color.white, 1.0);
            rules[count].setSymbolizers(new Symbolizer[] { elsePoly });
            rules[count].setIsElseFilter(true);

            FeatureTypeStyle ft = sf.createFeatureTypeStyle(rules);
            ft.setFeatureTypeName("Feature");
            ft.setName(name);
            ret.addFeatureTypeStyle(ft);



            return ret;



        }


    private static Random random = new Random();
    public static Color createRandomColor() {
return new Color(random.nextInt(200), random.nextInt(200), random.nextInt(200));
    }

        private Color createColor(String text) {
            int i = Integer.decode("0x" + text).intValue();

            return Color.decode("" + i);
        }


have fun

be aware : can't be editable because of some uggly problem with Style/ XML serialization (the problem is possibly fixed i do not check lately)




okay here a code to apply  :


StyleLayer sl = new StyleLayer(selectedLayer);
StyleBlackboard sbb = sl.getStyleBlackboard();
sbb.put(SLDContent.ID, style);
sl.setStyleBlackboard(sbb);
sl.apply();






jacques divol


Back to the top