/** @see org.geotools.styling.StyleVisitor#visit(org.geotools.styling.Symbolizer) */ public void visit(Symbolizer sym) { if (sym instanceof PointSymbolizer) { visit((PointSymbolizer) sym); } if (sym instanceof LineSymbolizer) { visit((LineSymbolizer) sym); } if (sym instanceof PolygonSymbolizer) { visit((PolygonSymbolizer) sym); } if (sym instanceof TextSymbolizer) { visit((TextSymbolizer) sym); } if (sym instanceof RasterSymbolizer) { visit((RasterSymbolizer) sym); } }
/** * Returns an estimate of the rendering buffer needed to properly display this layer taking into * consideration the constant stroke sizes in the feature type styles. * * @param styles the feature type styles to be applied to the layer * @return an estimate of the buffer that should be used to properly display a layer rendered * with the specified styles */ private int findRenderingBuffer(List<LiteFeatureTypeStyle> styles) { final MetaBufferEstimator rbe = new MetaBufferEstimator(); for (LiteFeatureTypeStyle lfts : styles) { Rule[] rules = lfts.elseRules; for (int j = 0; j < rules.length; j++) { rbe.visit(rules[j]); } rules = lfts.ruleList; for (int j = 0; j < rules.length; j++) { rbe.visit(rules[j]); } } if (!rbe.isEstimateAccurate()) LOGGER.fine( "Assuming rendering buffer = " + rbe.getBuffer() + ", but estimation is not accurate, you may want to set a buffer manually"); // the actual amount we have to grow the rendering area by is half of the stroke/symbol // sizes // plus one extra pixel for antialiasing effects return (int) Math.round(rbe.getBuffer() / 2.0 + 1); }
@Test public void testUnreachableExternalGraphic() throws Exception { File file = new File(TestData.getResource(this, "draw.png").toURI()); URL resource = new File(file.getParent(), "draw-not-there.png").toURI().toURL(); PointSymbolizer ps = sb.createPointSymbolizer( sb.createGraphic( null, null, sb.createExternalGraphic(resource, "image/png"))); ps.getGraphic().setSize(sb.literalExpression(null)); Style style = sb.createStyle(ps); MetaBufferEstimator rbe = new MetaBufferEstimator(); rbe.visit(style); assertEquals(0, rbe.getBuffer()); assertFalse(rbe.isEstimateAccurate()); }
/** * @see org.geotools.styling.StyleVisitor#visit(org.geotools.styling.Symbolizer) */ public void visit(Symbolizer sym) { if (sym instanceof PointSymbolizer) { visit((PointSymbolizer) sym); } if (sym instanceof LineSymbolizer) { visit((LineSymbolizer) sym); } if (sym instanceof PolygonSymbolizer) { visit((PolygonSymbolizer) sym); } if (sym instanceof TextSymbolizer) { visit((TextSymbolizer) sym); } if (sym instanceof RasterSymbolizer) { visit((RasterSymbolizer) sym); } }
/** * @see org.geotools.styling.StyleVisitor#visit(org.geotools.styling.Symbolizer) */ public void visit(Symbolizer sym) { if (sym instanceof PointSymbolizer) { visit((PointSymbolizer) sym); } if (sym instanceof LineSymbolizer) { visit((LineSymbolizer) sym); } if (sym instanceof PolygonSymbolizer) { visit((PolygonSymbolizer) sym); } if (sym instanceof TextSymbolizer) { visit((TextSymbolizer) sym); } if (sym instanceof RasterSymbolizer) { visit((RasterSymbolizer) sym); } }
@Test public void testConstantFunction() { Function cos = ff.function("cos", ff.literal(Math.toRadians(Math.PI))); Symbolizer ls = sb.createLineSymbolizer(sb.createStroke(sb.colorExpression(Color.BLACK), cos)); Rule r = sb.createRule(new Symbolizer[] {ls}); MetaBufferEstimator rbe = new MetaBufferEstimator(); // cos(pi) == 1 rbe.visit(r); assertEquals(1, rbe.getBuffer()); assertTrue(rbe.isEstimateAccurate()); }
@Test public void testSimpleStroke() { Style style = sb.createStyle(sb.createLineSymbolizer(sb.createStroke(10.0))); MetaBufferEstimator rbe = new MetaBufferEstimator(); rbe.visit(style); assertEquals(10, rbe.getBuffer()); assertTrue(rbe.isEstimateAccurate()); }
@Test public void testNonIntegerStroke() { Style style = sb.createStyle(sb.createLineSymbolizer(sb.createStroke(10.8))); MetaBufferEstimator rbe = new MetaBufferEstimator(); rbe.visit(style); assertEquals(11, rbe.getBuffer()); assertTrue(rbe.isEstimateAccurate()); }
@Test public void testLiteralParseGraphics() { Graphic g = sb.createGraphic(); g.setSize(sb.literalExpression("10.0")); MetaBufferEstimator rbe = new MetaBufferEstimator(); rbe.visit(g); assertEquals(11, rbe.getBuffer()); assertTrue(rbe.isEstimateAccurate()); } }
@Test public void testNpePreventionStroke() { Style style = sb.createStyle( sb.createLineSymbolizer( sb.createStroke( sb.colorExpression(Color.BLACK), sb.literalExpression(null)))); MetaBufferEstimator rbe = new MetaBufferEstimator(); rbe.visit(style); assertEquals(1, rbe.getBuffer()); assertTrue(rbe.isEstimateAccurate()); }
@Test public void testTextNoStroke() { Style style = sb.createStyle(sb.createTextSymbolizer()); MetaBufferEstimator rbe = new MetaBufferEstimator(); assertEquals(0, rbe.getBuffer()); assertTrue(rbe.isEstimateAccurate()); rbe.visit(style); assertEquals(15, rbe.getBuffer()); assertTrue(rbe.isEstimateAccurate()); }
@Test public void testLiteralParseStroke() { Style style = sb.createStyle( sb.createLineSymbolizer( sb.createStroke( sb.colorExpression(Color.BLACK), sb.literalExpression("10.0")))); MetaBufferEstimator rbe = new MetaBufferEstimator(); rbe.visit(style); assertEquals(10, rbe.getBuffer()); assertTrue(rbe.isEstimateAccurate()); }
@Test public void testMultiSymbolizers() { Symbolizer ls = sb.createLineSymbolizer(sb.createStroke(10.8)); Symbolizer ps = sb.createPolygonSymbolizer(sb.createStroke(12), sb.createFill()); Rule r = sb.createRule(new Symbolizer[] {ls, ps}); MetaBufferEstimator rbe = new MetaBufferEstimator(); rbe.visit(r); assertEquals(12, rbe.getBuffer()); assertTrue(rbe.isEstimateAccurate()); }
@Test public void testTextDisplaced() { TextSymbolizer ts = sb.createTextSymbolizer(); ts.setFont(sb.createFont("Arial", 20)); PointPlacement pp = sb.createPointPlacement(1, 1, 10, 10, 0); ts.setLabelPlacement(pp); Style style = sb.createStyle(ts); MetaBufferEstimator rbe = new MetaBufferEstimator(); rbe.visit(style); // 20 (font) + 20 * 0.5 (anchor) + 10 (offset) assertEquals(40, rbe.getBuffer()); assertTrue(rbe.isEstimateAccurate()); }
@Test public void testEnvironmentWidth() { Symbolizer ls = sb.createLineSymbolizer( sb.createStroke( sb.colorExpression(Color.BLACK), ff.function("env", ff.literal("thickness"), ff.literal(10)))); Rule r = sb.createRule(new Symbolizer[] {ls}); MetaBufferEstimator rbe = new MetaBufferEstimator(); // no env variable, fall back on the default value rbe.visit(r); assertEquals(10, rbe.getBuffer()); assertTrue(rbe.isEstimateAccurate()); // set the env variable EnvFunction.setLocalValue("thickness", 15); try { rbe.visit(r); assertEquals(15, rbe.getBuffer()); assertTrue(rbe.isEstimateAccurate()); } finally { EnvFunction.clearLocalValues(); } }
@Test public void testSimpleGraphic() { PointSymbolizer ps = sb.createPointSymbolizer( sb.createGraphic(null, sb.createMark(sb.MARK_CIRCLE), null)); ps.getGraphic().setSize(sb.literalExpression(15)); Style style = sb.createStyle(ps); MetaBufferEstimator rbe = new MetaBufferEstimator(); rbe.visit(style); assertEquals(16, rbe.getBuffer()); assertTrue(rbe.isEstimateAccurate()); }
@Test public void testMath() { Add add = ff.add(ff.literal("5"), ff.literal("-2")); Symbolizer ls = sb.createLineSymbolizer(sb.createStroke(sb.colorExpression(Color.BLACK), add)); Rule r = sb.createRule(new Symbolizer[] {ls}); MetaBufferEstimator rbe = new MetaBufferEstimator(); // 5-2 = 3 rbe.visit(r); assertEquals(3, rbe.getBuffer()); assertTrue(rbe.isEstimateAccurate()); }
@Test public void testPropertyWidth() { Symbolizer ls = sb.createLineSymbolizer( sb.createStroke( sb.colorExpression(Color.BLACK), sb.attributeExpression("gimbo"))); Symbolizer ps = sb.createPolygonSymbolizer(sb.createStroke(12), sb.createFill()); Rule r = sb.createRule(new Symbolizer[] {ls, ps}); MetaBufferEstimator rbe = new MetaBufferEstimator(); rbe.visit(r); assertEquals(12, rbe.getBuffer()); assertTrue(!rbe.isEstimateAccurate()); }
@Test public void testReachableExternalGraphic() { URL resource = TestData.getResource(this, "draw.png"); PointSymbolizer ps = sb.createPointSymbolizer( sb.createGraphic( null, null, sb.createExternalGraphic(resource, "image/png"))); ps.getGraphic().setSize(sb.literalExpression(null)); Style style = sb.createStyle(ps); MetaBufferEstimator rbe = new MetaBufferEstimator(); rbe.visit(style); assertEquals(24, rbe.getBuffer()); assertTrue(rbe.isEstimateAccurate()); }
/** * Computes the rendering buffer for this layer * * @param style * @param scaleDenominator */ static int computeLayerBuffer(Style style, double scaleDenominator) { final double TOLERANCE = 1e-6; MetaBufferEstimator estimator = new MetaBufferEstimator(); for (FeatureTypeStyle fts : style.featureTypeStyles()) { for (Rule rule : fts.rules()) { if (((rule.getMinScaleDenominator() - TOLERANCE) <= scaleDenominator) && ((rule.getMaxScaleDenominator() + TOLERANCE) > scaleDenominator)) { estimator.visit(rule); } } } // we get any estimate, it's better than nothing... return estimator.getBuffer(); }