/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2002-2008, 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.shape; import java.awt.geom.AffineTransform; import junit.framework.TestCase; import org.geotools.data.shapefile.shp.ShapeType; import org.geotools.referencing.ReferencingFactoryFinder; import org.geotools.referencing.operation.matrix.GeneralMatrix; import org.opengis.geometry.DirectPosition; import org.opengis.geometry.MismatchedDimensionException; import org.opengis.referencing.operation.MathTransform; import org.opengis.referencing.operation.Matrix; import org.opengis.referencing.operation.NoninvertibleTransformException; import org.opengis.referencing.operation.TransformException; /** * * * * @source $URL$ */ public class GeometryHandlerUtilitiesTest extends TestCase { private static final double ACCURACY = 0.00000001; public static final AffineTransform at = AffineTransform.getScaleInstance(2, .5); public static final String ALBERS = "PROJCS[\"BC_Albers\",GEOGCS[\"GCS_North_American_1983\",DATUM[\"North_American_Datum_1983\",SPHEROID[\"GRS_1980\",6378137,298.257222101],TOWGS84[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]],PRIMEM[\"Greenwich\",0],UNIT[\"Degree\",0.017453292519943295]],PROJECTION[\"Albers\"],PARAMETER[\"False_Easting\",1000000],PARAMETER[\"False_Northing\",0],PARAMETER[\"Central_Meridian\",-126],PARAMETER[\"Standard_Parallel_1\",50],PARAMETER[\"Standard_Parallel_2\",58.5],PARAMETER[\"Latitude_Of_Origin\",45],UNIT[\"Meter\",1]]"; public static final MathTransform CANT_TRANSFORM_3RD_ELEMENT = new MathTransform() { public int getDimSource() { // TODO Auto-generated method stub return 0; } public int getSourceDimensions() { // TODO Auto-generated method stub return 0; } public int getDimTarget() { // TODO Auto-generated method stub return 0; } public int getTargetDimensions() { // TODO Auto-generated method stub return 0; } public DirectPosition transform(DirectPosition arg0, DirectPosition arg1) throws MismatchedDimensionException, TransformException { // TODO Auto-generated method stub return null; } public void transform(double[] src, int srcOffset, double[] dest, int destOffset, int numPoints) throws TransformException { for (int i = srcOffset; i < srcOffset + numPoints * 2; i++) { if(i == 4 || i == 5) throw new TransformException("boom"); } } public void transform(float[] arg0, int arg1, float[] arg2, int arg3, int arg4) throws TransformException { // TODO Auto-generated method stub } public void transform(float[] arg0, int arg1, double[] arg2, int arg3, int arg4) throws TransformException { // TODO Auto-generated method stub } public void transform(double[] arg0, int arg1, float[] arg2, int arg3, int arg4) throws TransformException { // TODO Auto-generated method stub } public Matrix derivative(DirectPosition arg0) throws MismatchedDimensionException, TransformException { // TODO Auto-generated method stub return null; } public MathTransform inverse() throws NoninvertibleTransformException { // TODO Auto-generated method stub return null; } public boolean isIdentity() { // TODO Auto-generated method stub return false; } public String toWKT() throws UnsupportedOperationException { // TODO Auto-generated method stub return null; } }; public static final MathTransform CANT_TRANSFORM_FIRST_ELEMENT = new MathTransform() { public int getDimSource() { // TODO Auto-generated method stub return 0; } public int getSourceDimensions() { // TODO Auto-generated method stub return 0; } public int getDimTarget() { // TODO Auto-generated method stub return 0; } public int getTargetDimensions() { // TODO Auto-generated method stub return 0; } public DirectPosition transform(DirectPosition arg0, DirectPosition arg1) throws MismatchedDimensionException, TransformException { // TODO Auto-generated method stub return null; } public void transform(double[] src, int srcOffset, double[] dest, int destOffset, int numPoints) throws TransformException { for (int i = srcOffset * 2; i < srcOffset + numPoints * 2; i++) { if(i == 0 || i == 1) throw new TransformException("boom"); } } public void transform(float[] arg0, int arg1, float[] arg2, int arg3, int arg4) throws TransformException { // TODO Auto-generated method stub } public void transform(float[] arg0, int arg1, double[] arg2, int arg3, int arg4) throws TransformException { // TODO Auto-generated method stub } public void transform(double[] arg0, int arg1, float[] arg2, int arg3, int arg4) throws TransformException { // TODO Auto-generated method stub } public Matrix derivative(DirectPosition arg0) throws MismatchedDimensionException, TransformException { // TODO Auto-generated method stub return null; } public MathTransform inverse() throws NoninvertibleTransformException { // TODO Auto-generated method stub return null; } public boolean isIdentity() { // TODO Auto-generated method stub return false; } public String toWKT() throws UnsupportedOperationException { // TODO Auto-generated method stub return null; } }; public static final MathTransform NEVER_TRANSFORM = new MathTransform() { public int getDimSource() { // TODO Auto-generated method stub return 0; } public int getSourceDimensions() { // TODO Auto-generated method stub return 0; } public int getDimTarget() { // TODO Auto-generated method stub return 0; } public int getTargetDimensions() { // TODO Auto-generated method stub return 0; } public DirectPosition transform(DirectPosition arg0, DirectPosition arg1) throws MismatchedDimensionException, TransformException { // TODO Auto-generated method stub return null; } public void transform(double[] arg0, int arg1, double[] arg2, int arg3, int arg4) throws TransformException { throw new TransformException("exception"); } public void transform(float[] arg0, int arg1, float[] arg2, int arg3, int arg4) throws TransformException { // TODO Auto-generated method stub } public void transform(float[] arg0, int arg1, double[] arg2, int arg3, int arg4) throws TransformException { // TODO Auto-generated method stub } public void transform(double[] arg0, int arg1, float[] arg2, int arg3, int arg4) throws TransformException { // TODO Auto-generated method stub } public Matrix derivative(DirectPosition arg0) throws MismatchedDimensionException, TransformException { // TODO Auto-generated method stub return null; } public MathTransform inverse() throws NoninvertibleTransformException { // TODO Auto-generated method stub return null; } public boolean isIdentity() { // TODO Auto-generated method stub return false; } public String toWKT() throws UnsupportedOperationException { // TODO Auto-generated method stub return null; } }; public void testTransform() throws Exception { double[] src = new double[] { 1, 1, 2, 2, 3, 3, 4, 4, 5, 5 }; double[] dest = new double[8]; MathTransform mt = ReferencingFactoryFinder.getMathTransformFactory(null) .createAffineTransform(new GeneralMatrix( at)); GeometryHandlerUtilities.transform(ShapeType.ARC, mt, src, dest, dest.length / 2); assertEquals(2d, dest[0], ACCURACY); assertEquals(.5d, dest[1], ACCURACY); assertEquals(4d, dest[2], ACCURACY); assertEquals(1d, dest[3], ACCURACY); assertEquals(6d, dest[4], ACCURACY); assertEquals(1.5d, dest[5], ACCURACY); assertEquals(8d, dest[6], ACCURACY); assertEquals(2d, dest[7], ACCURACY); src = new double[] { 1, 1, 2, 2, 3, 3, 4, 4, 5, 5 }; dest = new double[8]; mt = NEVER_TRANSFORM; try { GeometryHandlerUtilities.transform(ShapeType.ARC, mt, src, dest, dest.length / 2); assertFalse("Shouldn't get here", true); } catch (Exception e) { //correct } dest = new double[] { 1, 1, 2, 2, 3, 3, 4, 4 }; mt = CANT_TRANSFORM_FIRST_ELEMENT; GeometryHandlerUtilities.transform(ShapeType.POLYGON, mt, src, dest, dest.length / 2); assertEquals(2d, dest[0], ACCURACY); assertEquals(2d, dest[1], ACCURACY); assertEquals(2d, dest[2], ACCURACY); assertEquals(2d, dest[3], ACCURACY); assertEquals(3d, dest[4], ACCURACY); assertEquals(3d, dest[5], ACCURACY); assertEquals(4d, dest[6], ACCURACY); assertEquals(4d, dest[7], ACCURACY); dest = new double[] { 1, 1, 2, 2, 3, 3, 4, 4 }; mt = CANT_TRANSFORM_3RD_ELEMENT; GeometryHandlerUtilities.transform(ShapeType.POLYGON, mt, src, dest, dest.length / 2); assertEquals(1d, dest[0], ACCURACY); assertEquals(1d, dest[1], ACCURACY); assertEquals(2d, dest[2], ACCURACY); assertEquals(2d, dest[3], ACCURACY); assertEquals(2d, dest[4], ACCURACY); assertEquals(2d, dest[5], ACCURACY); assertEquals(4d, dest[6], ACCURACY); assertEquals(4d, dest[7], ACCURACY); } }