blob: 3a0da83b38886f6668a643423517567e1aabf8e2 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.sis.referencing.operation.projection;
import org.opengis.util.FactoryException;
import org.opengis.referencing.operation.TransformException;
import org.apache.sis.parameter.Parameters;
import org.apache.sis.internal.referencing.Formulas;
import org.apache.sis.internal.referencing.provider.Equirectangular;
import org.apache.sis.io.wkt.Convention;
import org.apache.sis.referencing.operation.transform.CoordinateDomain;
import org.apache.sis.referencing.operation.transform.MathTransformFactoryMock;
import org.apache.sis.test.ReferencingAssert;
import org.junit.Test;
import static java.lang.Double.NaN;
import static java.lang.StrictMath.toRadians;
import static org.apache.sis.internal.metadata.ReferencingServices.AUTHALIC_RADIUS;
/**
* Tests the affine transform created by the {@link Equirectangular} class. This map projection is a
* special case since the transform is implemented by an affine transform instead than a class from
* the {@link org.apache.sis.referencing.operation.projection} package.
*
* @author Martin Desruisseaux (Geomatys)
* @since 0.6
* @version 0.8
* @module
*/
public final strictfp class EquirectangularTest extends MapProjectionTestCase {
/**
* Initializes a simple Equirectangular projection on sphere. This method is different than the
* {@code createNormalizedProjection(boolean)} method in all other test classes, because it does
* not create an instance of {@link NormalizedProjection}. Instead, it creates an affine transform
* for the whole projection (not only the normalized part).
*/
private void createCompleteProjection() throws FactoryException {
final Equirectangular provider = new Equirectangular();
final Parameters parameters = parameters(provider, false);
transform = new MathTransformFactoryMock(provider).createParameterizedTransform(parameters);
tolerance = Formulas.LINEAR_TOLERANCE; // Not NORMALIZED_TOLERANCE since this is not a NormalizedProjection.
validate();
}
/**
* Tests the WKT formatting of an Equirectangular projection. While the projection is implemented by
* an affine transform, the WKT formatter should handle this projection in a special way and shows the
* projection parameters instead than the affine transform parameters (except in "show internal" mode).
*
* @throws FactoryException if an error occurred while creating the map projection.
*/
@Test
public void testWKT() throws FactoryException {
createCompleteProjection();
assertWktEquals(
"PARAM_MT[“Equirectangular”,\n" +
" PARAMETER[“semi_major”, 6371007.0],\n" +
" PARAMETER[“semi_minor”, 6371007.0]]");
ReferencingAssert.assertWktEquals(Convention.WKT2,
"PARAM_MT[“Equidistant Cylindrical (Spherical)”,\n" +
" PARAMETER[“semi_major”, 6371007.0, LENGTHUNIT[“metre”, 1]],\n" +
" PARAMETER[“semi_minor”, 6371007.0, LENGTHUNIT[“metre”, 1]]]", transform);
ReferencingAssert.assertWktEquals(Convention.WKT2_SIMPLIFIED,
"Param_MT[“Equidistant Cylindrical (Spherical)”,\n" +
" Parameter[“semi_major”, 6371007.0, Unit[“metre”, 1]],\n" +
" Parameter[“semi_minor”, 6371007.0, Unit[“metre”, 1]]]", transform);
ReferencingAssert.assertWktEquals(Convention.INTERNAL,
"Param_MT[“Affine parametric transformation”,\n" +
" Parameter[“A0”, 111195.04881760638, Id[“EPSG”, 8623]],\n" +
" Parameter[“B1”, 111195.04881760638, Id[“EPSG”, 8640]]]", transform);
}
/**
* Tests a simple transform on a sphere.
*
* @throws FactoryException if an error occurred while creating the map projection.
* @throws TransformException if an error occurred while projecting a point.
*/
@Test
public void testSimpleTransform() throws FactoryException, TransformException {
createCompleteProjection();
verifyTransform(
new double[] { // (λ,φ) coordinates in degrees to project.
0, 0,
2, 0,
0, 3
},
new double[] { // Expected (x,y) results in metres.
0, 0,
AUTHALIC_RADIUS*toRadians(2), 0,
0, AUTHALIC_RADIUS*toRadians(3)
});
}
/**
* Tests conversion of random points. This test is actually of limited interest since the Equirectangular
* projection is implemented by an affine transform, which has been tested elsewhere.
*
* @throws FactoryException if an error occurred while creating the map projection.
* @throws TransformException if an error occurred while projecting a point.
*/
@Test
public void testRandomPoints() throws FactoryException, TransformException {
createCompleteProjection(new Equirectangular(),
WGS84_A, // Semi-major axis length
WGS84_B, // Semi-minor axis length
0.5, // Central meridian
0, // Latitude of origin (none)
20, // Standard parallel 1
NaN, // Standard parallel 2
NaN, // Scale factor (none)
200, // False easting
100); // False northing
tolerance = Formulas.LINEAR_TOLERANCE; // Not NORMALIZED_TOLERANCE since this is not a NormalizedProjection.
derivativeDeltas = new double[] {100, 100};
verifyInDomain(CoordinateDomain.GEOGRAPHIC, 0);
}
}