package org.geotools.styling.builder; import static org.junit.Assert.*; import java.awt.Color; import java.util.List; import javax.measure.unit.SI; import org.geotools.filter.function.CategorizeFunction; import org.geotools.styling.ExternalGraphic; import org.geotools.styling.Font; import org.geotools.styling.Graphic; import org.geotools.styling.PointPlacement; import org.geotools.styling.PointSymbolizer; import org.geotools.styling.Rule; import org.geotools.styling.Style; import org.geotools.styling.TextSymbolizer; import org.junit.Test; import org.opengis.filter.Filter; import org.opengis.filter.expression.Function; import org.opengis.style.Fill; import org.opengis.style.GraphicalSymbol; import org.opengis.style.Mark; import org.opengis.style.Stroke; /** * * * @source $URL$ */ public class CookbookPointTest extends AbstractStyleTest { @Test public void testSimple() { Style style = new GraphicBuilder().size(6).mark().name("circle").fill().color(Color.RED) .buildStyle(); // print(style); // round up the basic elements and check its simple StyleCollector collector = new StyleCollector(); style.accept(collector); assertSimpleStyle(collector); // check the size PointSymbolizer ps = (PointSymbolizer) collector.symbolizers.get(0); Graphic graphic = ps.getGraphic(); assertEquals(6, (int) graphic.getSize().evaluate(null, Integer.class)); // check the mark List<GraphicalSymbol> symbols = graphic.graphicalSymbols(); assertEquals(1, symbols.size()); Mark mark = (Mark) symbols.get(0); assertEquals("circle", mark.getWellKnownName().evaluate(null)); assertEquals(Color.RED, mark.getFill().getColor().evaluate(null, Color.class)); } @Test public void testPointWithStroke() { MarkBuilder mb = new GraphicBuilder().size(6).mark().name("circle"); mb.fill().color(Color.RED); mb.stroke().width(2).color(Color.BLUE); Style style = mb.buildStyle(); // print(style); // round up the basic elements and check its simple StyleCollector collector = new StyleCollector(); style.accept(collector); assertSimpleStyle(collector); // check the size PointSymbolizer ps = (PointSymbolizer) collector.symbolizers.get(0); Graphic graphic = ps.getGraphic(); assertEquals(6, (int) graphic.getSize().evaluate(null, Integer.class)); // check the mark List<GraphicalSymbol> symbols = graphic.graphicalSymbols(); assertEquals(1, symbols.size()); Mark mark = (Mark) symbols.get(0); assertEquals("circle", mark.getWellKnownName().evaluate(null)); assertEquals(Color.RED, mark.getFill().getColor().evaluate(null, Color.class)); Stroke stroke = mark.getStroke(); assertEquals(Color.BLUE, stroke.getColor().evaluate(null, Color.class)); assertEquals(2, (int) stroke.getWidth().evaluate(null, Integer.class)); } @Test public void testRotatedSquare() { Style style = new GraphicBuilder().size(12).rotation(45).mark().name("square").fill() .color(Color.GREEN).buildStyle(); // print(style); // round up the basic elements and check its simple StyleCollector collector = new StyleCollector(); style.accept(collector); assertSimpleStyle(collector); // check the size and rotation PointSymbolizer ps = (PointSymbolizer) collector.symbolizers.get(0); Graphic graphic = ps.getGraphic(); assertEquals(12, (int) graphic.getSize().evaluate(null, Integer.class)); assertEquals(45, (int) graphic.getRotation().evaluate(null, Integer.class)); // check the mark List<GraphicalSymbol> symbols = graphic.graphicalSymbols(); assertEquals(1, symbols.size()); Mark mark = (Mark) symbols.get(0); assertEquals("square", mark.getWellKnownName().evaluate(null)); assertEquals(Color.GREEN, mark.getFill().getColor().evaluate(null, Color.class)); } @Test public void testTransparentTriangle() { MarkBuilder mb = new GraphicBuilder().size(12).mark().name("triangle"); mb.fill().color(Color.RED).opacity(0.2); mb.stroke().color(Color.BLUE).width(2); Style style = mb.buildStyle(); // print(style); // round up the basic elements and check its simple StyleCollector collector = new StyleCollector(); style.accept(collector); assertSimpleStyle(collector); // check the size and rotation PointSymbolizer ps = (PointSymbolizer) collector.symbolizers.get(0); Graphic graphic = ps.getGraphic(); assertEquals(12, (int) graphic.getSize().evaluate(null, Integer.class)); // check the mark List<GraphicalSymbol> symbols = graphic.graphicalSymbols(); assertEquals(1, symbols.size()); Mark mark = (Mark) symbols.get(0); assertEquals("triangle", mark.getWellKnownName().evaluate(null)); Fill fill = mark.getFill(); assertEquals(Color.RED, fill.getColor().evaluate(null, Color.class)); assertEquals(0.2, (double) fill.getOpacity().evaluate(null, Double.class), 0); Stroke stroke = mark.getStroke(); assertEquals(Color.BLUE, stroke.getColor().evaluate(null, Color.class)); assertEquals(2, (int) stroke.getWidth().evaluate(null, Integer.class)); } @Test public void testPointAsGraphics() { Style style = new GraphicBuilder().size(32).externalGraphic("smileyface.png", "image/png") .buildStyle(); // print(style); // round up the basic elements and check its simple StyleCollector collector = new StyleCollector(); style.accept(collector); assertSimpleStyle(collector); // check the size and rotation PointSymbolizer ps = (PointSymbolizer) collector.symbolizers.get(0); Graphic graphic = ps.getGraphic(); assertEquals(32, (int) graphic.getSize().evaluate(null, Integer.class)); // check the mark List<GraphicalSymbol> symbols = graphic.graphicalSymbols(); assertEquals(1, symbols.size()); ExternalGraphic eg = (ExternalGraphic) symbols.get(0); assertEquals("image/png", eg.getFormat()); assertEquals("smileyface.png", eg.getOnlineResource().getLinkage().toString()); } @Test public void testPointDefaultLabel() { RuleBuilder rb = new RuleBuilder(); rb.point().graphic().size(6).mark().name("circle").fill().color(Color.RED); rb.text().label("name").fill().color(Color.BLACK); Style style = rb.buildStyle(); // round up the basic elements and check its simple StyleCollector collector = new StyleCollector(); style.accept(collector); basicPointWithLabelAssertions(collector); TextSymbolizer ps = (TextSymbolizer) collector.symbolizers.get(1); assertEquals(ff.property("name"), ps.getLabel()); assertEquals(Color.BLACK, ps.getFill().getColor().evaluate(null, Color.class)); } @Test public void testPointStyledLabel() { RuleBuilder rb = new RuleBuilder(); rb.point().graphic().size(6).mark().name("circle").fill().color(Color.RED); TextSymbolizerBuilder tb = rb.text().label("name"); tb.fill().color(Color.BLACK); tb.newFont().familyName("Arial").size(12).styleName(Font.Style.NORMAL) .weightName(Font.Weight.BOLD); tb.pointPlacement().displacement().x(0).y(5); tb.pointPlacement().anchor().x(0.5); Style style = rb.buildStyle(); // round up the basic elements and check its simple StyleCollector collector = new StyleCollector(); style.accept(collector); basicPointWithLabelAssertions(collector); TextSymbolizer ps = (TextSymbolizer) collector.symbolizers.get(1); assertEquals(ff.property("name"), ps.getLabel()); assertEquals(Color.BLACK, ps.getFill().getColor().evaluate(null, Color.class)); // font Font font = ps.getFont(); assertEquals("Arial", font.getFamily().get(0).evaluate(null, String.class)); assertEquals(12, (int) font.getSize().evaluate(null, Integer.class)); assertEquals(Font.Style.NORMAL, font.getStyle().evaluate(null, String.class)); assertEquals(Font.Weight.BOLD, font.getWeight().evaluate(null, String.class)); // placement PointPlacement pp = (PointPlacement) ps.getLabelPlacement(); assertEquals(0.5, pp.getAnchorPoint().getAnchorPointX().evaluate(null, Double.class), 0); assertEquals(0, pp.getAnchorPoint().getAnchorPointY().evaluate(null, Double.class), 0); assertEquals(0, (int) pp.getDisplacement().getDisplacementX().evaluate(null, Integer.class)); assertEquals(5, (int) pp.getDisplacement().getDisplacementY().evaluate(null, Integer.class)); } @Test public void testPointRotatedLabel() { RuleBuilder rb = new RuleBuilder(); rb.point().graphic().size(6).mark().name("circle").fill().color(Color.RED); TextSymbolizerBuilder tb = rb.text().label("name"); tb.fill().color(Color.BLACK); tb.newFont().familyName("Arial").size(12).styleName(Font.Style.NORMAL) .weightName(Font.Weight.BOLD); tb.pointPlacement().displacement().x(0).y(5); tb.pointPlacement().anchor().x(0.5); tb.pointPlacement().rotation(-45); Style style = rb.buildStyle(); // round up the basic elements and check its simple StyleCollector collector = new StyleCollector(); style.accept(collector); basicPointWithLabelAssertions(collector); TextSymbolizer ps = (TextSymbolizer) collector.symbolizers.get(1); assertEquals(ff.property("name"), ps.getLabel()); assertEquals(Color.BLACK, ps.getFill().getColor().evaluate(null, Color.class)); // font Font font = ps.getFont(); assertEquals("Arial", font.getFamily().get(0).evaluate(null, String.class)); assertEquals(12, (int) font.getSize().evaluate(null, Integer.class)); assertEquals(Font.Style.NORMAL, font.getStyle().evaluate(null, String.class)); assertEquals(Font.Weight.BOLD, font.getWeight().evaluate(null, String.class)); // placement PointPlacement pp = (PointPlacement) ps.getLabelPlacement(); assertEquals(-45, pp.getRotation().evaluate(null, Double.class), 0.0); assertEquals(0.5, pp.getAnchorPoint().getAnchorPointX().evaluate(null, Double.class), 0); assertEquals(0, pp.getAnchorPoint().getAnchorPointY().evaluate(null, Double.class), 0); assertEquals(0, (int) pp.getDisplacement().getDisplacementX().evaluate(null, Integer.class)); assertEquals(5, (int) pp.getDisplacement().getDisplacementY().evaluate(null, Integer.class)); } private void basicPointWithLabelAssertions(StyleCollector collector) { assertEquals(1, collector.featureTypeStyles.size()); assertEquals(1, collector.rules.size()); assertEquals(2, collector.symbolizers.size()); // check the size and rotation of the point symbolizer PointSymbolizer ps = (PointSymbolizer) collector.symbolizers.get(0); Graphic graphic = ps.getGraphic(); assertEquals(6, (int) graphic.getSize().evaluate(null, Integer.class)); // check the mark List<GraphicalSymbol> symbols = graphic.graphicalSymbols(); assertEquals(1, symbols.size()); Mark mark = (Mark) symbols.get(0); assertEquals("circle", mark.getWellKnownName().evaluate(null)); Fill fill = mark.getFill(); assertEquals(Color.RED, fill.getColor().evaluate(null, Color.class)); } @Test public void testAttributeBasedPoint() { Mark mark = (Mark) new MarkBuilder().name("circle").fill().color(new Color(0, 51, 204)) .buildRoot(); FeatureTypeStyleBuilder fts = new FeatureTypeStyleBuilder(); fts.rule().name("SmallPop").title("1 to 50000").filter("pop < 50000").point().graphic() .size(8).mark().reset(mark); fts.rule().name("MediumPop").title("50000 to 100000") .filter("pop between 50000 and 100000").point().graphic().size(12).mark() .reset(mark); fts.rule().name("LargePop").title("Greater than 100000").filter("pop >= 100000").point() .graphic().size(16).mark().reset(mark); Style style = fts.buildStyle(); // print(style); StyleCollector collector = new StyleCollector(); style.accept(collector); assertEquals(1, collector.featureTypeStyles.size()); assertEquals(3, collector.rules.size()); assertEquals(3, collector.symbolizers.size()); // check rules and styles checkAttributeBasedRule(collector.rules.get(0), ff.less(ff.property("pop"), ff.literal("50000")), 8); checkAttributeBasedRule(collector.rules.get(1), ff.between(ff.property("pop"), ff.literal("50000"), ff.literal("100000")), 12); checkAttributeBasedRule(collector.rules.get(2), ff.greaterOrEqual(ff.property("pop"), ff.literal("100000")), 16); } @Test public void testCagetorizeBasedPoint() { Function size = ff.function("categorize", ff.property("pop"), ff.literal(8), ff.literal(50000), ff.literal(12), ff.literal(100000), ff.literal(16)); Style style = new GraphicBuilder().size(size).mark().name("circle").fill() .color(new Color(0, 51, 204)).buildStyle(); // print(style); StyleCollector collector = new StyleCollector(); style.accept(collector); assertSimpleStyle(collector); // check the function is there were we expect it PointSymbolizer ps = (PointSymbolizer) collector.symbolizers.get(0); Graphic graphic = ps.getGraphic(); assertTrue(graphic.getSize() instanceof CategorizeFunction); } private void checkAttributeBasedRule(Rule rule, Filter filter, int size) { assertEquals(filter, rule.getFilter()); assertEquals(1, rule.getSymbolizers().length); PointSymbolizer ps = (PointSymbolizer) rule.getSymbolizers()[0]; assertEquals(size, (int) ps.getGraphic().getSize().evaluate(null, Integer.class)); } @Test public void testZoomBasedPoint() { Mark mark = (Mark) new MarkBuilder().name("circle").fill().color(Color.RED).buildRoot(); FeatureTypeStyleBuilder fts = new FeatureTypeStyleBuilder(); fts.rule().name("Large").max(160000000).point().graphic().size(12).mark().reset(mark); fts.rule().name("Medium").min(160000000).max(320000000).point().graphic().size(8).mark() .reset(mark); fts.rule().name("Small").min(320000000).point().graphic().size(4).mark().reset(mark); Style style = fts.buildStyle(); // print(style); StyleCollector collector = new StyleCollector(); style.accept(collector); assertEquals(1, collector.featureTypeStyles.size()); assertEquals(3, collector.rules.size()); assertEquals(3, collector.symbolizers.size()); // check rules and styles checkScaleBasedRule(collector.rules.get(0), "Large", 0, 160000000, 12); checkScaleBasedRule(collector.rules.get(1), "Medium", 160000000, 320000000, 8); checkScaleBasedRule(collector.rules.get(2), "Small", 320000000, Double.POSITIVE_INFINITY, 4); } private void checkScaleBasedRule(Rule rule, String name, double minDenominator, double maxDenominator, int size) { assertEquals(name, rule.getName()); assertEquals(minDenominator, rule.getMinScaleDenominator(), 0.0); assertEquals(maxDenominator, rule.getMaxScaleDenominator(), 0.0); assertEquals(1, rule.getSymbolizers().length); PointSymbolizer ps = (PointSymbolizer) rule.getSymbolizers()[0]; assertEquals(size, (int) ps.getGraphic().getSize().evaluate(null, Integer.class)); } @Test public void testUomPoint() { Style style = new PointSymbolizerBuilder().uom(SI.METER).graphic().size(50).mark() .name("circle").fill().color(Color.RED).buildStyle(); // print(style); StyleCollector collector = new StyleCollector(); style.accept(collector); assertSimpleStyle(collector); PointSymbolizer ps = (PointSymbolizer) collector.symbolizers.get(0); assertEquals(SI.METER, ps.getUnitOfMeasure()); } }