package org.geotools.referencing.operation.projection; import static org.geotools.referencing.operation.projection.MapProjection.AbstractProvider.*; import static org.junit.Assert.*; import org.geotools.parameter.ParameterGroup; import org.geotools.referencing.ReferencingFactoryFinder; import org.junit.Test; import org.opengis.parameter.ParameterDescriptor; import org.opengis.parameter.ParameterValue; import org.opengis.parameter.ParameterValueGroup; import org.opengis.referencing.operation.MathTransform; import org.opengis.referencing.operation.MathTransformFactory; public class CassiniSoldnerTest { /** * Tests the example provided by the EPSG guidance. * See "OGP Surveying and Positioning Guidance Note number 7, part 2 – April 2009", page 36 */ @Test public void testEpsgExample() throws Exception { MathTransformFactory mtFactory = ReferencingFactoryFinder.getMathTransformFactory(null); final ParameterValueGroup parameters = mtFactory.getDefaultParameters("Cassini-Soldner"); // build the transformation using the guidance provided values final double feetToMeter = 0.3048; // ft -> mt final double linkToMeter = 0.66 * feetToMeter; // Clark's links -> mt parameter(SEMI_MAJOR, parameters).setValue(20926348 * feetToMeter); parameter(SEMI_MINOR, parameters).setValue(20855233 * feetToMeter); parameter(LATITUDE_OF_ORIGIN, parameters).setValue(dmsToDegree(10, 26, 30)); parameter(CENTRAL_MERIDIAN, parameters).setValue(-dmsToDegree(61, 20, 0)); parameter(FALSE_EASTING, parameters).setValue(430000.00 * linkToMeter); parameter(FALSE_NORTHING, parameters).setValue(325000.00 * linkToMeter); MathTransform transform = mtFactory.createParameterizedTransform(parameters); // results as provided by the EPSG guidance final double[] point = new double[] { -62, 10 }; final double[] expected = new double[] { 66644.94 * linkToMeter, 82536.22 * linkToMeter }; // check forward transform final double[] forward = new double[2]; transform.transform(point, 0, forward, 0, 1); assertEquals(expected[0], forward[0], 1e-1); assertEquals(expected[1], forward[1], 1e-1); // check inverse transform final double[] inverse = new double[2]; transform.inverse().transform(expected, 0, inverse, 0, 1); assertEquals(point[0], inverse[0], 1e-4); assertEquals(inverse[1], inverse[1], 1e-4); } /** * Extracts the {@link ParameterValue} for a certain {@link ParameterDescriptor} */ ParameterValue parameter(ParameterDescriptor param, ParameterValueGroup group) { return group.parameter(param.getName().getCode()); } /** * Converts a DMS value into degrees */ double dmsToDegree(double degrees, double minutes, double seconds) { return degrees + (minutes + seconds / 60) / 60; } }