blob: d41565810126caf5b434c9a1eeb58c24446974b5 [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.internal.referencing.Formulas;
import org.apache.sis.internal.referencing.provider.MapProjection;
import org.apache.sis.internal.referencing.provider.PolarStereographicA;
import org.apache.sis.internal.referencing.provider.PolarStereographicB;
import org.apache.sis.internal.referencing.provider.PolarStereographicC;
import org.apache.sis.internal.referencing.provider.PolarStereographicNorth;
import org.apache.sis.internal.referencing.provider.PolarStereographicSouth;
import org.apache.sis.referencing.operation.transform.CoordinateDomain;
import org.apache.sis.referencing.operation.transform.MathTransformFactoryMock;
import org.apache.sis.parameter.Parameters;
import org.apache.sis.test.DependsOnMethod;
import org.apache.sis.test.DependsOn;
import org.junit.Test;
import static java.lang.Double.NaN;
import static java.lang.StrictMath.*;
/**
* Tests the {@link PolarStereographic} class.
*
* @author Martin Desruisseaux (Geomatys)
* @since 0.6
* @version 0.8
* @module
*/
@DependsOn(NormalizedProjectionTest.class)
public final strictfp class PolarStereographicTest extends MapProjectionTestCase {
/**
* Creates a new instance of {@link PolarStereographic}.
*
* @param ellipse {@code false} for a sphere, or {@code true} for WGS84 ellipsoid.
* @param latitudeOfOrigin The latitude of origin, in decimal degrees.
*/
private void createNormalizedProjection(final MapProjection method) {
final Parameters parameters = parameters(method, false);
NormalizedProjection projection = new PolarStereographic(method, parameters);
projection = new ProjectionResultComparator(projection,
new PolarStereographic.Spherical((PolarStereographic) projection));
transform = projection;
tolerance = NORMALIZED_TOLERANCE;
validate();
}
/**
* Verifies the consistency between spherical and elliptical formulas in the South pole.
*
* @throws FactoryException if an error occurred while creating the map projection.
* @throws TransformException if an error occurred while projecting a coordinate.
*/
@Test
public void testSphericalCaseSouth() throws FactoryException, TransformException {
createNormalizedProjection(new PolarStereographicSouth());
final double delta = toRadians(100.0 / 60) / 1852; // Approximatively 100 metres.
derivativeDeltas = new double[] {delta, delta};
verifyInDomain(CoordinateDomain.GEOGRAPHIC_RADIANS_SOUTH, 56763886);
}
/**
* Verifies the consistency between spherical and elliptical formulas in the North pole.
* This is the same formulas than the South case, but with the sign of some coefficients negated.
*
* @throws FactoryException if an error occurred while creating the map projection.
* @throws TransformException if an error occurred while projecting a coordinate.
*/
@Test
@DependsOnMethod("testSphericalCaseSouth")
public void testSphericalCaseNorth() throws FactoryException, TransformException {
createNormalizedProjection(new PolarStereographicNorth());
final double delta = toRadians(100.0 / 60) / 1852; // Approximatively 100 metres.
derivativeDeltas = new double[] {delta, delta};
verifyInDomain(CoordinateDomain.GEOGRAPHIC_RADIANS_NORTH, 56763886);
}
/**
* Tests <cite>"Stereographic North Pole"</cite>. The tested point is adapted from
* <a href="http://www.remotesensing.org/geotiff/proj_list/polar_stereographic.html">Polar Stereographic
* on remotesensing.org</a>.
*
* @throws FactoryException if an error occurred while creating the map projection.
* @throws TransformException if an error occurred while projecting a coordinate.
*/
@Test
public void testPolarStereographicNorth() throws FactoryException, TransformException {
final PolarStereographicNorth method = new PolarStereographicNorth();
final Parameters pg = parameters(method, true);
pg.parameter("standard_parallel_1").setValue(71.0);
pg.parameter("central_meridian").setValue(-96.0);
transform = new MathTransformFactoryMock(method).createParameterizedTransform(pg);
tolerance = 0.02;
verifyTransform(new double[] {
-121 - (20 + 22.380/60)/60, // 121°20'22.380"W
39 + ( 6 + 4.508/60)/60 // 39°06'04.508"N
}, new double[] {
-2529570,
-5341800
});
}
/**
* Tests the <cite>Polar Stereographic (variant A)</cite> case (EPSG:9810).
* This test is defined in GeoAPI conformance test suite.
*
* @throws FactoryException if an error occurred while creating the map projection.
* @throws TransformException if an error occurred while projecting a coordinate.
*
* @see org.opengis.test.referencing.ParameterizedTransformTest#testPolarStereographicA()
*/
@Test
public void testPolarStereographicA() throws FactoryException, TransformException {
createGeoApiTest(new PolarStereographicA()).testPolarStereographicA();
}
/**
* Tests the <cite>Polar Stereographic (variant B)</cite> case (EPSG:9829).
* This test is defined in GeoAPI conformance test suite.
*
* @throws FactoryException if an error occurred while creating the map projection.
* @throws TransformException if an error occurred while projecting a coordinate.
*
* @see org.opengis.test.referencing.ParameterizedTransformTest#testPolarStereographicB()
*/
@Test
public void testPolarStereographicB() throws FactoryException, TransformException {
createGeoApiTest(new PolarStereographicB()).testPolarStereographicB();
}
/**
* Tests the <cite>Polar Stereographic (variant C)</cite> case (EPSG:9830).
* This test is defined in GeoAPI conformance test suite.
*
* @throws FactoryException if an error occurred while creating the map projection.
* @throws TransformException if an error occurred while projecting a coordinate.
*
* @see org.opengis.test.referencing.ParameterizedTransformTest#testPolarStereographicC()
*/
@Test
public void testPolarStereographicC() throws FactoryException, TransformException {
createGeoApiTest(new PolarStereographicC()).testPolarStereographicC();
}
/**
* Verifies the consistency of elliptical formulas with the spherical formulas.
* This test compares the results of elliptical formulas with the spherical ones
* for some random points.
*
* @throws FactoryException if an error occurred while creating the map projection.
* @throws TransformException if an error occurred while projecting a coordinate.
*/
private void compareEllipticalWithSpherical(final CoordinateDomain domain, final double latitudeOfOrigin,
final long randomSeed) throws FactoryException, TransformException
{
createCompleteProjection(new PolarStereographicA(),
6371007, // Semi-major axis length
6371007, // Semi-minor axis length
0.5, // Central meridian
latitudeOfOrigin, // Latitude of origin
NaN, // Standard parallel 1 (none)
NaN, // Standard parallel 2 (none)
0.994, // Scale factor
200, // False easting
100); // False northing
tolerance = Formulas.LINEAR_TOLERANCE;
compareEllipticalWithSpherical(domain, randomSeed);
}
/**
* Verifies the consistency of elliptical formulas with the spherical formulas.
* This test compares the results of elliptical formulas with the spherical ones
* for some random points.
*
* @throws FactoryException if an error occurred while creating the map projection.
* @throws TransformException if an error occurred while projecting a coordinate.
*/
@Test
@DependsOnMethod({"testSphericalCaseSouth", "testSphericalCaseNorth"})
public void compareEllipticalWithSpherical() throws FactoryException, TransformException {
compareEllipticalWithSpherical(CoordinateDomain.GEOGRAPHIC_SOUTH_POLE, -90, 17326686);
compareEllipticalWithSpherical(CoordinateDomain.GEOGRAPHIC_NORTH_POLE, +90, 970559366);
}
}