/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2002-2012, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotools.renderer.lite; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import org.geotools.factory.CommonFactoryFinder; import org.geotools.styling.FeatureTypeStyle; import org.geotools.styling.LineSymbolizer; import org.geotools.styling.Rule; import org.geotools.styling.StyleFactory2; import org.geotools.styling.UomOgcMapping; import org.junit.Before; import org.junit.Test; import org.opengis.filter.FilterFactory2; import junit.framework.Assert; public class UnitRescaleTest { private StyleFactory2 sf; private FilterFactory2 ff; @Before public void setUp() throws Exception { sf = (StyleFactory2) CommonFactoryFinder.getStyleFactory(null); ff = CommonFactoryFinder.getFilterFactory2(null); } @Test public void testUOMEncodingLineSymbolizer() throws Exception { LineSymbolizer lineSymbolizer = sf.createLineSymbolizer(); lineSymbolizer.setUnitOfMeasure(UomOgcMapping.METRE.getUnit()); lineSymbolizer.setStroke(sf.createStroke(ff.literal("#0000FF"), ff.literal("3"))); Rule rule = sf.createRule(); rule.symbolizers().add(lineSymbolizer); Rule[] rules = new Rule[] { rule }; FeatureTypeStyle featureTypeStyle = sf.createFeatureTypeStyle(rules); List<FeatureTypeStyle> featureTypeStyles = new ArrayList<FeatureTypeStyle>(); featureTypeStyles.add(featureTypeStyle); double dpi90 = 25.4 / 0.28; double widthAtDpi90 = 10714.286; Assert.assertEquals(widthAtDpi90, getStrokeWidth(featureTypeStyles, rules, dpi90), 0.1); Assert.assertEquals(widthAtDpi90 * 2, getStrokeWidth(featureTypeStyles, rules, dpi90 * 2), 0.5); Assert.assertEquals(widthAtDpi90 * 3, getStrokeWidth(featureTypeStyles, rules, dpi90 * 3), 0.5); Assert.assertEquals(widthAtDpi90 * 4, getStrokeWidth(featureTypeStyles, rules, dpi90 * 4), 0.5); Assert.assertEquals(widthAtDpi90 * 5, getStrokeWidth(featureTypeStyles, rules, dpi90 * 5), 0.5); } private double getStrokeWidth(List<FeatureTypeStyle> featureTypeStyles, Rule[] rules, double dpi) { ArrayList<LiteFeatureTypeStyle> lfts = new ArrayList<LiteFeatureTypeStyle>(); for (FeatureTypeStyle fts : featureTypeStyles) { List<Rule> ruleList = new ArrayList<Rule>(Arrays.asList(rules)); List<Rule> elseRuleList = new ArrayList<Rule>(); LiteFeatureTypeStyle s = new LiteFeatureTypeStyle(null, null, ruleList, elseRuleList, fts.getTransformation()); lfts.add(s); } Map hints = new HashMap(); hints.put("dpi", new Double(dpi)); StreamingRenderer renderer = new StreamingRenderer(); renderer.scaleDenominator = 1; renderer.setRendererHints(hints); renderer.applyUnitRescale(lfts); for (LiteFeatureTypeStyle s : lfts) { Rule r = s.ruleList[0]; LineSymbolizer rescaledLineSymbolizer = (LineSymbolizer) r.getSymbolizers()[0]; return rescaledLineSymbolizer.getStroke().getWidth().evaluate(null, Double.class); } // this should not happen return -1; } }