package au.org.aurin.wif.io; import java.awt.Color; import javax.xml.transform.TransformerException; import org.geotools.factory.CommonFactoryFinder; import org.geotools.filter.Filter; import org.geotools.styling.FeatureTypeConstraint; import org.geotools.styling.FeatureTypeStyle; import org.geotools.styling.Fill; import org.geotools.styling.PolygonSymbolizer; import org.geotools.styling.Rule; import org.geotools.styling.SLDTransformer; import org.geotools.styling.Stroke; import org.geotools.styling.Style; import org.geotools.styling.StyleBuilder; import org.geotools.styling.StyleFactory; import org.geotools.styling.StyledLayerDescriptor; import org.geotools.styling.UserLayer; import org.opengis.filter.FilterFactory2; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; /** * * @author <a href="mailto:marcosnr@unimelb.edu.au"> Marcos Nino-Ruiz * marcosnr@unimelb.edu.au</a> - 2012 */ @Component public class GeodataStyler { /** * logger. */ private static final Logger LOGGER = LoggerFactory .getLogger(GeodataStyler.class); public StyledLayerDescriptor getSuitabilityStyle(String columnName) { LOGGER.debug("creating a style for suitability column: for", columnName); StyleFactory sf = CommonFactoryFinder.getStyleFactory(); FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2(); UserLayer layer = sf.createUserLayer(); layer.setName("layer"); StyledLayerDescriptor sld = sf.createStyledLayerDescriptor(); sld.setName("sld"); sld.setTitle("Example"); sld.setAbstract("Example Style Layer Descriptor"); // define constraint limited what features the sld applies to FeatureTypeConstraint constraint = sf.createFeatureTypeConstraint( "Feature", Filter.INCLUDE, null); layer.layerFeatureConstraints().add(constraint); // // create a "user defined" style Style style = sf.createStyle(); style.setName("style"); style.getDescription().setTitle("User Style"); style.getDescription().setAbstract("Definition of Style"); // define feature type styles used to actually define how features are // rendered FeatureTypeStyle featureTypeStyle = sf.createFeatureTypeStyle(); // RULE 1 // first rule to draw cities Rule rule1 = sf.createRule(); rule1.setName("rule1"); rule1.getDescription().setTitle("City"); rule1.getDescription().setAbstract("Rule for drawing cities"); rule1.setFilter(ff.less(ff.property("POPULATION"), ff.literal(50000))); // // create the graphical mark used to represent a city Stroke stroke = sf.stroke(ff.literal("#000000"), null, null, null, null, null, null); Fill fill = sf.fill(null, ff.literal(Color.BLUE), ff.literal(1.0)); StyleBuilder styleBuilder = new StyleBuilder(); PolygonSymbolizer polygonSymbolizer = styleBuilder.createPolygonSymbolizer(Color.BLUE); polygonSymbolizer.getFill().setOpacity(ff.literal(0.5)); // 50% blue polygonSymbolizer.setStroke(styleBuilder.createStroke(Color.BLACK, 2.0)); // will create a default feature type style and rule etc... //Style style = styleBuilder.createStyle(polygonSymbolizer); rule1.symbolizers().add(polygonSymbolizer); featureTypeStyle.rules().add(rule1); style.featureTypeStyles().add(featureTypeStyle); layer.userStyles().add(style); sld.layers().add(layer); // // create the parser with the sld configuration // org.geotools.xml.Configuration configuration = new // org.geotools.sld.SLDConfiguration(); // Parser parser = new org.geotools.xml.Parser(configuration); // // the xml instance document above // InputStream xml = new FileInputStream("markTest.sld"); // // parse // StyledLayerDescriptor sld = (StyledLayerDescriptor) parser.parse(xml); // DuplicatingStyleVisitor xerox = new DuplicatingStyleVisitor(); // style.accepts( xerox ); // Style copy = (Style) xerox.getCopy(); return sld; } public String getSuitabilityStyleXML(String columnName) throws TransformerException { SLDTransformer transformer = new SLDTransformer(); StyledLayerDescriptor suitabilityStyle = getSuitabilityStyle(columnName); return transformer.transform(suitabilityStyle); } }