/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2005-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.referencing.operation.transform; import org.opengis.parameter.ParameterValueGroup; import org.opengis.referencing.FactoryException; import org.opengis.referencing.datum.Ellipsoid; import org.opengis.referencing.operation.TransformException; import org.opengis.referencing.operation.MathTransform; import org.opengis.referencing.operation.MathTransformFactory; import org.geotools.referencing.ReferencingFactoryFinder; import org.geotools.referencing.datum.DefaultEllipsoid; import org.geotools.geometry.GeneralDirectPosition; import org.junit.*; import static org.junit.Assert.*; /** * Tests the {@link GeocentricTranslation} class. * * * @source $URL$ * @version $Id$ * @author Martin Desruisseaux (IRD) */ public final class GeocentricTranslationTest { /** * Test case using example from EPSG Guidance Note number 7 part 2 (May 2005), * section 2.4.3.1. */ @Test public void testTranslation() throws FactoryException, TransformException { final String classification = "Geocentric translations (geog2d domain)"; final MathTransformFactory factory = ReferencingFactoryFinder.getMathTransformFactory(null); final ParameterValueGroup param = factory.getDefaultParameters(classification); param.parameter("dx").setValue( 84.87); param.parameter("dy").setValue( 96.49); param.parameter("dz").setValue(116.95); final MathTransform test = factory.createParameterizedTransform(param); final GeneralDirectPosition position = new GeneralDirectPosition(3); position.setOrdinate(0, 3771793.97); position.setOrdinate(1, 140253.34); position.setOrdinate(2, 5124304.35); assertSame(position, test.transform(position, position)); assertEquals(3771878.84, position.getOrdinate(0), 1E-5); assertEquals( 140349.83, position.getOrdinate(1), 1E-5); assertEquals(5124421.30, position.getOrdinate(2), 1E-5); } /** * Test case using example from EPSG Guidance Note number 7 part 2 (May 2005), * section 2.4.3.2.1. */ @Test public void testSevenParam() throws FactoryException, TransformException { final String classification = "Position Vector transformation (geog2d domain)"; final MathTransformFactory factory = ReferencingFactoryFinder.getMathTransformFactory(null); final ParameterValueGroup param = factory.getDefaultParameters(classification); param.parameter("dx") .setValue(0.000); param.parameter("dy") .setValue(0.000); param.parameter("dz") .setValue(4.5); param.parameter("ex") .setValue(0.000); param.parameter("ey") .setValue(0.000); param.parameter("ez") .setValue(0.554); param.parameter("ppm").setValue(0.219); final MathTransform test = factory.createParameterizedTransform(param); final GeneralDirectPosition position = new GeneralDirectPosition(3); position.setOrdinate(0, 3657660.66); position.setOrdinate(1, 255768.55); position.setOrdinate(2, 5201382.11); assertSame(position, test.transform(position, position)); assertEquals(3657660.78, position.getOrdinate(0), 1E-2); assertEquals( 255778.43, position.getOrdinate(1), 1E-5); assertEquals(5201387.75, position.getOrdinate(2), 1E-2); } /** * Test case using example from EPSG Guidance Note number 7 part 2 (May 2005), * section 2.4.3.2.2. */ @Test public void testFrameRotation() throws FactoryException, TransformException { final String classification = "Coordinate Frame rotation (geog2d domain)"; final MathTransformFactory factory = ReferencingFactoryFinder.getMathTransformFactory(null); final ParameterValueGroup param = factory.getDefaultParameters(classification); param.parameter("dx") .setValue( 0.000); param.parameter("dy") .setValue( 0.000); param.parameter("dz") .setValue( 4.5); param.parameter("ex") .setValue( 0.000); param.parameter("ey") .setValue( 0.000); param.parameter("ez") .setValue(-0.554); param.parameter("ppm").setValue( 0.219); final MathTransform test = factory.createParameterizedTransform(param); final GeneralDirectPosition position = new GeneralDirectPosition(3); position.setOrdinate(0, 3657660.66); position.setOrdinate(1, 255768.55); position.setOrdinate(2, 5201382.11); assertSame(position, test.transform(position, position)); assertEquals(3657660.78, position.getOrdinate(0), 1E-2); assertEquals( 255778.43, position.getOrdinate(1), 1E-5); assertEquals(5201387.75, position.getOrdinate(2), 1E-2); } /** * Tests the creation with geocentric transforms. * Note: the expected values here are approximatives since we didn't used * an external source of test points for this test. */ @Test public void testGeotoolsExtensions() throws FactoryException, TransformException { final String classification = "Coordinate Frame rotation (geog2d domain)"; final MathTransformFactory factory = ReferencingFactoryFinder.getMathTransformFactory(null); final ParameterValueGroup param = factory.getDefaultParameters(classification); final Ellipsoid sourceEllipsoid = DefaultEllipsoid.INTERNATIONAL_1924; final Ellipsoid targetEllipsoid = DefaultEllipsoid.WGS84; param.parameter("dx") .setValue( 0.000); param.parameter("dy") .setValue( 0.000); param.parameter("dz") .setValue( 4.5); param.parameter("ex") .setValue( 0.000); param.parameter("ey") .setValue( 0.000); param.parameter("ez") .setValue(-0.554); param.parameter("ppm").setValue( 0.219); param.parameter("src_dim").setValue(3); param.parameter("tgt_dim").setValue(3); param.parameter("src_semi_major").setValue(sourceEllipsoid.getSemiMajorAxis()); param.parameter("src_semi_minor").setValue(sourceEllipsoid.getSemiMinorAxis()); param.parameter("tgt_semi_major").setValue(targetEllipsoid.getSemiMajorAxis()); param.parameter("tgt_semi_minor").setValue(targetEllipsoid.getSemiMinorAxis()); final MathTransform test = factory.createParameterizedTransform(param); final GeneralDirectPosition position = new GeneralDirectPosition(3); position.setOrdinate(0, 4.00); // Longitude position.setOrdinate(1, 55.00); // Latitude position.setOrdinate(2, -191.61); // Height assertSame(position, test.transform(position, position)); assertEquals( 4.00, position.getOrdinate(0), 1E-2); assertEquals(55.00, position.getOrdinate(1), 1E-2); assertEquals( 3.23, position.getOrdinate(2), 1E-2); } }