/* * This file is part of the GeoLatte project. * * GeoLatte 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, either version 3 of the License, or * (at your option) any later version. * * GeoLatte 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. * * You should have received a copy of the GNU Lesser General Public License * along with GeoLatte. If not, see <http://www.gnu.org/licenses/>. * * Copyright (C) 2010 - 2011 and Ownership of code is shared by: * Qmino bvba - Esperantolaan 4 - 3001 Heverlee (http://www.qmino.com) * Geovise bvba - Generaal Eisenhowerlei 9 - 2140 Antwerpen (http://www.geovise.com) */ package org.geolatte.maprenderer.sld; import net.opengis.se.v_1_1_0.PolygonSymbolizerType; import org.geolatte.geom.jts.JTS; import org.geolatte.maprenderer.map.MapGraphics; import org.geolatte.maprenderer.shape.ShapeAdapter; import org.geolatte.test.MockPolygonFeature; import org.geolatte.test.TestSupport; import org.junit.Before; import org.junit.Test; import java.awt.geom.Point2D; import java.awt.image.RenderedImage; import java.io.IOException; import static org.geolatte.test.TestSupport.assertImageEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; /** * @author Karel Maesen, Geovise BVBA * creation-date: 9/11/11 */ public class TestPolygonSymbolizer extends BaseFeatureTypeStyleTest { PolygonSymbolizer symbolizer; PolygonSymbolizerType type; @Before public void before(){ super.before(); type = SLD.instance().read(xmlSymbolizer, PolygonSymbolizerType.class); symbolizer = new PolygonSymbolizer(type); } @Test public void testGetGeometryProperty() { assertEquals("centerline", symbolizer.getGeometryProperty()); } @Test public void test_default_uom_is_pixel() { assertEquals(UOM.PIXEL, symbolizer.getUOM()); } @Test public void test_perpendicularOffset(){ Value<Float> perOffset = symbolizer.getPerpendicularOffset(); assertEquals(UOM.PIXEL, perOffset.uom()); assertEquals(Float.valueOf(10f), perOffset.value()); } @Test public void testDisplacement(){ assertEquals(new Point2D.Float(5f, 10f), symbolizer.getDisplacement()); } @Test public void testSymbolizeSimple() throws Exception { type = SLD.instance().read(simpleSymbolizer, PolygonSymbolizerType.class); testCase("polygonSymbolizer-simple.png"); } @Test public void testSymbolizeNoFill() throws Exception { type = SLD.instance().read(noFillSymbolizer, PolygonSymbolizerType.class); testCase("polygonSymbolizer-nofill.png"); } @Test public void testSymbolizeNoStroke() throws Exception { type = SLD.instance().read(noStrokeSymbolizer, PolygonSymbolizerType.class); testCase("polygonSymbolizer-nostroke.png"); } //TODO -- add test case for polygon with perpendicular offset //TODO -- add test case for polygon with displacement //TODO -- add test case for donut polygon private void testCase(String testCaseName) throws IOException { symbolizer = new PolygonSymbolizer(type); MapGraphics g = createMapGraphics(100, 10000); //a horizontal line in the middle of the image. MockPolygonFeature feature = MockPolygonFeature.createRect(3000, 3000, 6000, 6000); ShapeAdapter adapter = new ShapeAdapter(g.getTransform()); symbolizer.symbolize(g, JTS.to(feature.getGeometry())); RenderedImage img = g.createRendering(); TestSupport.writeImageToDisk(img, testCaseName, "PNG"); assertImageEquals("expected-" + testCaseName, img); } @Test public void testIllegalSymbolizerSpecification(){ String test = "<PolygonSymbolizer version=\"1.1.0\"" + " xmlns=\"http://www.opengis.net/se\"" + " xmlns:ogc=\"http://www.opengis.net/ogc\">" + "<Geometry>\n" + " <ogc:PropertyName>\ncenterline\n</ogc:PropertyName>\n" + "</Geometry>" + "<Fill>" + "<SvgParameter name=\"fill\">#00FF00</SvgParameter> " + "</Fill>" + "<Displacement>" + " <DisplacementX> hunderd pixels </DisplacementX>" + " <DisplacementY>10.0</DisplacementY>" + "</Displacement>" + "<Stroke>" + " <SvgParameter name=\"stroke\">\n#FF0000\n</SvgParameter>\n" + "</Stroke>" + "<PerpendicularOffset>\n" + "10\n" + "</PerpendicularOffset>"+ "</PolygonSymbolizer>"; type = SLD.instance().read(test, PolygonSymbolizerType.class); try { symbolizer = new PolygonSymbolizer(type); fail(); } catch (Exception e) { //OK } } String xmlSymbolizer = "<PolygonSymbolizer version=\"1.1.0\"" + " xmlns=\"http://www.opengis.net/se\"" + " xmlns:ogc=\"http://www.opengis.net/ogc\">" + "<Geometry>\n" + " <ogc:PropertyName>\ncenterline\n</ogc:PropertyName>\n" + "</Geometry>" + "<Fill>" + "<SvgParameter name=\"fill\">#00FF00</SvgParameter> " + "<SvgParameter name=\"fill-opacity\">0.6</SvgParameter> " + "</Fill>" + "<Displacement>" + " <DisplacementX>5.0</DisplacementX>" + " <DisplacementY>10.0</DisplacementY>" + "</Displacement>" + "<Stroke>" + " <SvgParameter name=\"stroke\">\n#FF0000\n</SvgParameter>\n" + " <SvgParameter name=\"stroke-width\">1</SvgParameter>" + " <SvgParameter name=\"stroke-opacity\">1</SvgParameter>" + "</Stroke>" + "<PerpendicularOffset>\n" + "10\n" + "</PerpendicularOffset>"+ "</PolygonSymbolizer>"; String simpleSymbolizer = "<PolygonSymbolizer version=\"1.1.0\"" + " xmlns=\"http://www.opengis.net/se\"" + " xmlns:ogc=\"http://www.opengis.net/ogc\">" + "<Geometry>\n" + " <ogc:PropertyName>\ncenterline\n</ogc:PropertyName>\n" + "</Geometry>" + "<Fill>" + "<SvgParameter name=\"fill\">#00FF00</SvgParameter> " + "<SvgParameter name=\"fill-opacity\">1.0</SvgParameter> " + "</Fill>" + "<Stroke>" + " <SvgParameter name=\"stroke\">\n#FF0000\n</SvgParameter>\n" + " <SvgParameter name=\"stroke-width\">1</SvgParameter>" + " <SvgParameter name=\"stroke-opacity\">1</SvgParameter>" + "</Stroke>" + "</PolygonSymbolizer>"; String noFillSymbolizer = "<PolygonSymbolizer version=\"1.1.0\"" + " xmlns=\"http://www.opengis.net/se\"" + " xmlns:ogc=\"http://www.opengis.net/ogc\">" + "<Geometry>\n" + " <ogc:PropertyName>\ncenterline\n</ogc:PropertyName>\n" + "</Geometry>" + "<Stroke>" + " <SvgParameter name=\"stroke\">\n#FF0000\n</SvgParameter>\n" + " <SvgParameter name=\"stroke-width\">1</SvgParameter>" + " <SvgParameter name=\"stroke-opacity\">1</SvgParameter>" + "</Stroke>" + "</PolygonSymbolizer>"; String noStrokeSymbolizer = "<PolygonSymbolizer version=\"1.1.0\"" + " xmlns=\"http://www.opengis.net/se\"" + " xmlns:ogc=\"http://www.opengis.net/ogc\">" + "<Geometry>\n" + " <ogc:PropertyName>\ncenterline\n</ogc:PropertyName>\n" + "</Geometry>" + "<Fill>" + "<SvgParameter name=\"fill\">#00FF00</SvgParameter> " + "<SvgParameter name=\"fill-opacity\">0.6</SvgParameter> " + "</Fill>" + "</PolygonSymbolizer>"; }