Skip to content

Commit

Permalink
[GEOT-3964] UOMRescaleStyleVisitor fails to rescale marks in graphic …
Browse files Browse the repository at this point in the history
…strokes and fills

git-svn-id: http://svn.osgeo.org/geotools/branches/2.7.x@38391 e5c1c795-43da-0310-a71f-fac65c449510
  • Loading branch information
aaime committed Dec 3, 2011
1 parent 0ff3785 commit a514280
Show file tree
Hide file tree
Showing 4 changed files with 119 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,20 +22,23 @@
import javax.measure.unit.SI;
import javax.measure.unit.Unit;

import org.geotools.filter.LiteralExpression;
import org.geotools.styling.Displacement;
import org.geotools.styling.ExternalGraphic;
import org.geotools.styling.Fill;
import org.geotools.styling.Font;
import org.geotools.styling.Graphic;
import org.geotools.styling.LabelPlacement;
import org.geotools.styling.LinePlacement;
import org.geotools.styling.LineSymbolizer;
import org.geotools.styling.Mark;
import org.geotools.styling.PointPlacement;
import org.geotools.styling.PointSymbolizer;
import org.geotools.styling.PolygonSymbolizer;
import org.geotools.styling.Stroke;
import org.geotools.styling.TextSymbolizer;
import org.opengis.filter.expression.Expression;
import org.opengis.filter.expression.Literal;
import org.opengis.style.GraphicalSymbol;

/**
* Visitor used for rescaling a Style given a map scale (e.g., meters per pixel) and taking into
Expand Down Expand Up @@ -107,7 +110,7 @@ protected Expression rescale(Expression unscaled, double mapScale, Unit<Length>
if (unscaled == null || unscaled.equals(Expression.NIL))
return unscaled;

if (unscaled instanceof LiteralExpression && unscaled.evaluate(null, Double.class) != null) {
if (unscaled instanceof Literal && unscaled.evaluate(null, Double.class) != null) {
// if given Expression is a literal, we can return a literal
double rescaled = rescale(unscaled.evaluate(null, Double.class), mapScale, uom);
return ff.literal(rescaled);
Expand Down Expand Up @@ -174,6 +177,8 @@ protected void rescaleStroke(Stroke stroke, double mapScale, Unit<Length> uom) {
stroke.setWidth(rescale(stroke.getWidth(), mapScale, uom));
stroke.setDashArray(rescale(stroke.getDashArray(), mapScale, uom));
stroke.setDashOffset(rescale(stroke.getDashOffset(), mapScale, uom));
rescale(stroke.getGraphicFill(), mapScale, uom);
rescale(stroke.getGraphicStroke(), mapScale, uom);
}
}

Expand All @@ -183,10 +188,25 @@ public void visit(PointSymbolizer ps) {
PointSymbolizer copy = (PointSymbolizer) pages.peek();

Graphic copyGraphic = copy.getGraphic();
copyGraphic.setSize(rescale(copyGraphic.getSize(), mapScale, copy.getUnitOfMeasure()));
rescale(copyGraphic, mapScale, copy.getUnitOfMeasure());
copy.setUnitOfMeasure(NonSI.PIXEL);
}

private void rescale(Graphic graphic, double mapScale, Unit<Length> unit) {
if(graphic != null) {
graphic.setSize(rescale(graphic.getSize(), mapScale, unit));
if(graphic.graphicalSymbols() != null) {
for (GraphicalSymbol gs : graphic.graphicalSymbols()) {
if(gs instanceof Mark) {
Mark mark = (Mark) gs;
rescaleStroke(mark.getStroke(), mapScale, unit);
rescaleFill(mark.getFill(), mapScale, unit);
}
}
}
}
}

@Override
public void visit(LineSymbolizer line) {
super.visit(line);
Expand All @@ -202,21 +222,16 @@ public void visit(PolygonSymbolizer poly) {
super.visit(poly);
PolygonSymbolizer copy = (PolygonSymbolizer) pages.peek();

Stroke copyStroke = copy.getStroke();
rescaleStroke(copyStroke, mapScale, copy.getUnitOfMeasure());
rescaleStroke(copy.getStroke(), mapScale, copy.getUnitOfMeasure());
rescaleFill(copy.getFill(), mapScale, copy.getUnitOfMeasure());
copy.setUnitOfMeasure(NonSI.PIXEL);
}

// rescales the graphic fill, if available
Fill copyFill = copy.getFill();
private void rescaleFill(Fill copyFill, double mapScale, Unit<Length> unit) {
// rescale the graphic fill, if any
if (copyFill != null) {
Graphic copyGraphic = copyFill.getGraphicFill();
if (copyGraphic != null) {
copyGraphic.setSize(rescale(copyGraphic.getSize(), mapScale, copy
.getUnitOfMeasure()));
copyFill.setGraphicFill(copyGraphic);
}
copy.setFill(copyFill);
rescale(copyFill.getGraphicFill(), mapScale, unit);
}
copy.setUnitOfMeasure(NonSI.PIXEL);
}

@SuppressWarnings("deprecation")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,18 @@

import java.awt.Color;

import javax.measure.unit.SI;

import junit.framework.TestCase;

import org.geotools.factory.CommonFactoryFinder;
import org.geotools.filter.IllegalFilterException;
import org.geotools.styling.FeatureTypeStyle;
import org.geotools.styling.Fill;
import org.geotools.styling.Font;
import org.geotools.styling.LineSymbolizer;
import org.geotools.styling.Mark;
import org.geotools.styling.PolygonSymbolizer;
import org.geotools.styling.RasterSymbolizer;
import org.geotools.styling.Rule;
import org.geotools.styling.Stroke;
Expand Down Expand Up @@ -139,4 +145,40 @@ public void testTextSymbolizer() throws Exception {
assertEquals("20", clone.getOptions().get(TextSymbolizer.MAX_DISPLACEMENT_KEY));
}

public void testRescaleGraphicFillStrokes() {
// create a graphic that needs rescaling
StyleBuilder sb = new StyleBuilder();

// a graphic stroke
Stroke stroke = sb.createStroke();
stroke.setColor(null);
stroke.setGraphicStroke(sb.createGraphic(null, sb.createMark("square", null, sb.createStroke(1)), null));

// a graphic fill
Fill fill = sb.createFill();
fill.setColor(null);
fill.setGraphicFill(sb.createGraphic(null, sb.createMark("square", null, sb.createStroke(2)), null));

// a polygon and line symbolizer using them
PolygonSymbolizer ps = sb.createPolygonSymbolizer(stroke, fill);

// rescale it
ps.accept(visitor);
PolygonSymbolizer rps = (PolygonSymbolizer) visitor.getCopy();
Mark rm = (Mark) rps.getStroke().getGraphicStroke().graphicalSymbols().get(0);
assertEquals(2.0, rm.getStroke().getWidth().evaluate(null));
rm = (Mark) rps.getFill().getGraphicFill().graphicalSymbols().get(0);
assertEquals(4.0, rm.getStroke().getWidth().evaluate(null));


// a line symbolizer that uses a graphic stroke
LineSymbolizer ls = sb.createLineSymbolizer(stroke);

// rescale it
ls.accept(visitor);
LineSymbolizer lps = (LineSymbolizer) visitor.getCopy();
rm = (Mark) lps.getStroke().getGraphicStroke().graphicalSymbols().get(0);
assertEquals(2.0, rm.getStroke().getWidth().evaluate(null));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -33,21 +33,25 @@
import org.geotools.styling.Fill;
import org.geotools.styling.Font;
import org.geotools.styling.LinePlacement;
import org.geotools.styling.LineSymbolizer;
import org.geotools.styling.LineSymbolizerImpl;
import org.geotools.styling.Mark;
import org.geotools.styling.PointPlacement;
import org.geotools.styling.PointSymbolizer;
import org.geotools.styling.PointSymbolizerImpl;
import org.geotools.styling.PolygonSymbolizer;
import org.geotools.styling.PolygonSymbolizerImpl;
import org.geotools.styling.Rule;
import org.geotools.styling.Stroke;
import org.geotools.styling.StyleBuilder;
import org.geotools.styling.Symbolizer;
import org.geotools.styling.TextSymbolizer;
import org.geotools.styling.TextSymbolizerImpl;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;
import org.opengis.filter.FilterFactory2;
import org.opengis.filter.expression.Expression;
import org.opengis.style.LineSymbolizer;
import org.opengis.style.PolygonSymbolizer;
import org.opengis.style.GraphicalSymbol;

import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry;
Expand Down Expand Up @@ -577,4 +581,43 @@ public void testVisitLineSymbolizer_ExpressionWithFeatureAttribute()
Assert.fail(e2.getClass().getSimpleName() + " should not be thrown.");
}
}

public void testRescaleGraphicFillStrokes() {
// create a graphic that needs rescaling
StyleBuilder sb = new StyleBuilder();

// a graphic stroke
Stroke stroke = sb.createStroke();
stroke.setColor(null);
stroke.setGraphicStroke(sb.createGraphic(null, sb.createMark("square", null, sb.createStroke(1)), null));

// a graphic fill
Fill fill = sb.createFill();
fill.setColor(null);
fill.setGraphicFill(sb.createGraphic(null, sb.createMark("square", null, sb.createStroke(2)), null));

// a polygon and line symbolizer using them
PolygonSymbolizer ps = sb.createPolygonSymbolizer(stroke, fill);
ps.setUnitOfMeasure(SI.METER);

// rescale it
UomRescaleStyleVisitor visitor = new UomRescaleStyleVisitor(10);
ps.accept(visitor);
PolygonSymbolizer rps = (PolygonSymbolizer) visitor.getCopy();
Mark rm = (Mark) rps.getStroke().getGraphicStroke().graphicalSymbols().get(0);
assertEquals(10.0, rm.getStroke().getWidth().evaluate(null));
rm = (Mark) rps.getFill().getGraphicFill().graphicalSymbols().get(0);
assertEquals(20.0, rm.getStroke().getWidth().evaluate(null));


// a line symbolizer that uses a graphic stroke
LineSymbolizer ls = sb.createLineSymbolizer(stroke);
ls.setUnitOfMeasure(SI.METER);

// rescale it
ls.accept(visitor);
LineSymbolizer lps = (LineSymbolizer) visitor.getCopy();
rm = (Mark) lps.getStroke().getGraphicStroke().graphicalSymbols().get(0);
assertEquals(10.0, rm.getStroke().getWidth().evaluate(null));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -876,7 +876,7 @@ private java.awt.Font styleFont(Object feature, Font curr,
styleCode = styleCode | java.awt.Font.BOLD;
}

int size = evalToInt(curr.getFontSize(), feature, 10);
float size = evalToFloat(curr.getSize(), feature, 10);

return javaFont.deriveFont(styleCode, size);
}
Expand Down Expand Up @@ -1090,7 +1090,7 @@ public TexturePaint getTexturePaint(org.geotools.styling.Graphic gr,
.getWidth() > 0) ? shapeBounds.getWidth()
/ shapeBounds.getHeight() : 1.0;

int size = evalToInt(gr.getSize(), feature, 16);
double size = evalToDouble(gr.getSize(), feature, 16);
final double sizeX = size * shapeAspectRatio; // apply the aspect
// ratio to fix the
// sample's width.
Expand Down

0 comments on commit a514280

Please sign in to comment.