/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2007-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.cs; import javax.measure.unit.SI; import javax.measure.unit.Unit; import javax.measure.quantity.Length; import org.opengis.referencing.cs.AxisDirection; import org.opengis.referencing.cs.CoordinateSystem; import org.opengis.referencing.cs.CoordinateSystemAxis; import org.opengis.referencing.operation.Matrix; import org.geotools.referencing.operation.matrix.GeneralMatrix; import org.junit.*; import static org.junit.Assert.*; /** * Tests the {@link AbstractCS} class. * * * * @source $URL$ * @version $Id$ * @author Martin Desruisseaux */ public final class AbstractCSTest { /** * Tests the swapping of axis. */ @Test public void testAxisSwapping() { CoordinateSystem cs1, cs2; cs1 = new DefaultEllipsoidalCS("cs1", DefaultCoordinateSystemAxis.GEODETIC_LONGITUDE, DefaultCoordinateSystemAxis.GEODETIC_LATITUDE); cs2 = new DefaultEllipsoidalCS("cs2", DefaultCoordinateSystemAxis.GEODETIC_LATITUDE, DefaultCoordinateSystemAxis.GEODETIC_LONGITUDE); assertTrue(AbstractCS.swapAndScaleAxis(cs1, cs1).isIdentity()); assertTrue(AbstractCS.swapAndScaleAxis(cs2, cs2).isIdentity()); compareMatrix(cs1, cs2, new double[] { 0, 1, 0, 1, 0, 0, 0, 0, 1 }); cs1 = new DefaultEllipsoidalCS("cs1", DefaultCoordinateSystemAxis.GEODETIC_LONGITUDE, DefaultCoordinateSystemAxis.GEODETIC_LATITUDE, DefaultCoordinateSystemAxis.ELLIPSOIDAL_HEIGHT); cs2 = new DefaultEllipsoidalCS("cs2", DefaultCoordinateSystemAxis.GEODETIC_LATITUDE, DefaultCoordinateSystemAxis.GEODETIC_LONGITUDE, DefaultCoordinateSystemAxis.ELLIPSOIDAL_HEIGHT); compareMatrix(cs1, cs2, new double[] { 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 }); cs1 = new DefaultCartesianCS("cs1", DefaultCoordinateSystemAxis.ELLIPSOIDAL_HEIGHT, DefaultCoordinateSystemAxis.EASTING, DefaultCoordinateSystemAxis.NORTHING); cs2 = new DefaultCartesianCS("cs2", DefaultCoordinateSystemAxis.SOUTHING, DefaultCoordinateSystemAxis.EASTING, DefaultCoordinateSystemAxis.ELLIPSOIDAL_HEIGHT); compareMatrix(cs1, cs2, new double[] { 0, 0,-1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1 }); } /** * Compares the matrix computes by {@link AbstractCS#swapAndScaleAxis} with the specified one. */ private static void compareMatrix(final CoordinateSystem cs1, final CoordinateSystem cs2, final double[] expected) { final Matrix matrix = AbstractCS.swapAndScaleAxis(cs1, cs2); final int numRow = matrix.getNumRow(); final int numCol = matrix.getNumCol(); assertEquals(expected.length, numRow*numCol); final Matrix em = new GeneralMatrix(numRow, numCol, expected); assertEquals(em, matrix); } /** * Tests {@link AbstractCS#axisUsingUnit}. */ @Test public void testAxisUsingUnit() { assertNull("Should detect that no axis change is needed", DefaultCartesianCS.PROJECTED.axisUsingUnit(SI.METER)); final Unit<Length> KILOMETER = SI.KILO(SI.METER); final CoordinateSystemAxis[] axis = DefaultCartesianCS.PROJECTED.axisUsingUnit(KILOMETER); assertNotNull(axis); assertEquals("Expected two-dimensional", 2, axis.length); assertEquals(KILOMETER, axis[0].getUnit()); assertEquals(KILOMETER, axis[1].getUnit()); assertEquals(AxisDirection.EAST, axis[0].getDirection()); assertEquals(AxisDirection.NORTH, axis[1].getDirection()); assertEquals("Easting", axis[0].getName().getCode()); assertEquals("Northing", axis[1].getName().getCode()); } /** * Tests {@link AbstractCS#standard}. */ @Test public void testStandards() { CoordinateSystem cs; cs = DefaultCartesianCS .GRID; assertSame(cs, AbstractCS.standard(cs)); cs = DefaultCartesianCS .GEOCENTRIC; assertSame(cs, AbstractCS.standard(cs)); cs = DefaultCartesianCS .GENERIC_2D; assertSame(cs, AbstractCS.standard(cs)); cs = DefaultCartesianCS .GENERIC_3D; assertSame(cs, AbstractCS.standard(cs)); cs = DefaultCartesianCS .PROJECTED; assertSame(cs, AbstractCS.standard(cs)); cs = DefaultEllipsoidalCS.GEODETIC_2D; assertSame(cs, AbstractCS.standard(cs)); cs = DefaultEllipsoidalCS.GEODETIC_3D; assertSame(cs, AbstractCS.standard(cs)); cs = DefaultSphericalCS .GEOCENTRIC; assertSame(cs, AbstractCS.standard(cs)); cs = DefaultTimeCS .DAYS; assertSame(cs, AbstractCS.standard(cs)); cs = DefaultVerticalCS .ELLIPSOIDAL_HEIGHT; assertSame(cs, AbstractCS.standard(cs)); cs = DefaultVerticalCS .GRAVITY_RELATED_HEIGHT; assertSame("\"Standard\" vertical axis should be forced to ellipsoidal height.", DefaultVerticalCS.ELLIPSOIDAL_HEIGHT, AbstractCS.standard(cs)); } }