sis-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From desruisse...@apache.org
Subject [sis] branch geoapi-4.0 updated: Add "Azimuthal Equidistant (Spherical)" projection (no EPSG code). The main purpose will be to provide an approximation of the derivative.
Date Thu, 19 Mar 2020 22:28:25 GMT
This is an automated email from the ASF dual-hosted git repository.

desruisseaux pushed a commit to branch geoapi-4.0
in repository https://gitbox.apache.org/repos/asf/sis.git


The following commit(s) were added to refs/heads/geoapi-4.0 by this push:
     new f8aa040  Add "Azimuthal Equidistant (Spherical)" projection (no EPSG code). The main
purpose will be to provide an approximation of the derivative.
f8aa040 is described below

commit f8aa040d08e24ec7cf8eae5f3642fb883ef2f257
Author: Martin Desruisseaux <martin.desruisseaux@geomatys.com>
AuthorDate: Thu Mar 19 23:27:28 2020 +0100

    Add "Azimuthal Equidistant (Spherical)" projection (no EPSG code).
    The main purpose will be to provide an approximation of the derivative.
---
 .../provider/AzimuthalEquidistantSpherical.java    |  83 ++++++++++
 .../provider/ModifiedAzimuthalEquidistant.java     |  14 +-
 .../operation/projection/AzimuthalEquidistant.java | 172 +++++++++++++++++++++
 .../projection/ModifiedAzimuthalEquidistant.java   |   9 +-
 ...g.opengis.referencing.operation.OperationMethod |   1 +
 .../referencing/provider/ProvidersTest.java        |   1 +
 .../projection/AzimuthalEquidistantTest.java       | 106 +++++++++++++
 .../sis/test/suite/ReferencingTestSuite.java       |   1 +
 8 files changed, 379 insertions(+), 8 deletions(-)

diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/AzimuthalEquidistantSpherical.java
b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/AzimuthalEquidistantSpherical.java
new file mode 100644
index 0000000..ebaea11
--- /dev/null
+++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/AzimuthalEquidistantSpherical.java
@@ -0,0 +1,83 @@
+/*
+ * 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.internal.referencing.provider;
+
+import javax.xml.bind.annotation.XmlTransient;
+import org.opengis.parameter.ParameterDescriptorGroup;
+import org.opengis.referencing.operation.PlanarProjection;
+import org.apache.sis.parameter.Parameters;
+import org.apache.sis.referencing.operation.projection.NormalizedProjection;
+
+
+/**
+ * The provider for <cite>"Azimuthal Equidistant (Spherical)"</cite> projection.
+ * This projection method has no EPSG code.
+ *
+ * @author  Martin Desruisseaux (Geomatys)
+ * @version 1.1
+ *
+ * @see <a href="http://geotiff.maptools.org/proj_list/azimuthal_equidistant.html">GeoTIFF
parameters for Azimuthal Equidistant</a>
+ *
+ * @since 1.1
+ * @module
+ */
+@XmlTransient
+public final class AzimuthalEquidistantSpherical extends MapProjection {
+    /**
+     * For cross-version compatibility.
+     */
+    private static final long serialVersionUID = -1152512250113874950L;
+
+    /**
+     * The group of all parameters expected by this coordinate operation.
+     */
+    static final ParameterDescriptorGroup PARAMETERS;
+    static {
+        PARAMETERS = builder().setCodeSpace(null, null)
+                .addName("Azimuthal Equidistant (Spherical)")
+                .createGroupForMapProjection(
+                        ModifiedAzimuthalEquidistant.LATITUDE_OF_ORIGIN,
+                        ModifiedAzimuthalEquidistant.LONGITUDE_OF_ORIGIN,
+                        ModifiedAzimuthalEquidistant.FALSE_EASTING,
+                        ModifiedAzimuthalEquidistant.FALSE_NORTHING);
+    }
+
+    /**
+     * Constructs a new provider.
+     */
+    public AzimuthalEquidistantSpherical() {
+        super(PARAMETERS);
+    }
+
+    /**
+     * Returns the operation type for this map projection.
+     */
+    @Override
+    public Class<PlanarProjection> getOperationType() {
+        return PlanarProjection.class;
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @return the map projection created from the given parameter values.
+     */
+    @Override
+    protected final NormalizedProjection createProjection(final Parameters parameters) {
+        return new org.apache.sis.referencing.operation.projection.AzimuthalEquidistant(this,
parameters);
+    }
+}
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/ModifiedAzimuthalEquidistant.java
b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/ModifiedAzimuthalEquidistant.java
index 9b2abd1..5c2a680 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/ModifiedAzimuthalEquidistant.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/provider/ModifiedAzimuthalEquidistant.java
@@ -19,11 +19,11 @@ package org.apache.sis.internal.referencing.provider;
 import javax.xml.bind.annotation.XmlTransient;
 import org.opengis.parameter.ParameterDescriptor;
 import org.opengis.parameter.ParameterDescriptorGroup;
+import org.opengis.referencing.operation.PlanarProjection;
+import org.apache.sis.parameter.Parameters;
 import org.apache.sis.parameter.ParameterBuilder;
 import org.apache.sis.metadata.iso.citation.Citations;
-import org.apache.sis.parameter.Parameters;
 import org.apache.sis.referencing.operation.projection.NormalizedProjection;
-import org.opengis.referencing.operation.PlanarProjection;
 
 
 /**
@@ -52,6 +52,7 @@ public final class ModifiedAzimuthalEquidistant extends MapProjection {
      * <table class="sis">
      *   <caption>Parameter names</caption>
      *   <tr><td> EPSG:    </td><td> Latitude of natural origin </td></tr>
+     *   <tr><td> OGC:     </td><td> latitude_of_origin </td></tr>
      *   <tr><td> GeoTIFF: </td><td> CenterLat </td></tr>
      *   <tr><td> Proj4:   </td><td> lat_0 </td></tr>
      * </table>
@@ -66,6 +67,7 @@ public final class ModifiedAzimuthalEquidistant extends MapProjection {
      * <table class="sis">
      *   <caption>Parameter names</caption>
      *   <tr><td> EPSG:    </td><td> Longitude of natural origin
</td></tr>
+     *   <tr><td> OGC:     </td><td> central_meridian </td></tr>
      *   <tr><td> GeoTIFF: </td><td> CenterLong </td></tr>
      *   <tr><td> Proj4:   </td><td> lon_0 </td></tr>
      * </table>
@@ -80,6 +82,7 @@ public final class ModifiedAzimuthalEquidistant extends MapProjection {
      * <table class="sis">
      *   <caption>Parameter names</caption>
      *   <tr><td> EPSG:    </td><td> False easting </td></tr>
+     *   <tr><td> OGC:     </td><td> false_easting </td></tr>
      *   <tr><td> GeoTIFF: </td><td> FalseEasting </td></tr>
      *   <tr><td> Proj4:   </td><td> x_0 </td></tr>
      * </table>
@@ -94,6 +97,7 @@ public final class ModifiedAzimuthalEquidistant extends MapProjection {
      * <table class="sis">
      *   <caption>Parameter names</caption>
      *   <tr><td> EPSG:    </td><td> False northing </td></tr>
+     *   <tr><td> OGC:     </td><td> false_northing </td></tr>
      *   <tr><td> GeoTIFF: </td><td> FalseNorthing </td></tr>
      *   <tr><td> Proj4:   </td><td> y_0 </td></tr>
      * </table>
@@ -102,8 +106,9 @@ public final class ModifiedAzimuthalEquidistant extends MapProjection
{
 
     /**
      * Returns a parameter with the same names and identifiers than the given parameter,
-     * except OGC, ESRI and netCDF names which are omitted. We omit those names for now
+     * except (OGC), ESRI and netCDF names which are omitted. We omit those names for now
      * because we have not seen a reference about what those parameter names should be.
+     * The OGC names are kept despite that because it uses the same names for most projection.
      * This may be revisited in future SIS versions.
      *
      * <p>The OGC and GeoTIFF names kept by this method are actually the names for
@@ -111,8 +116,7 @@ public final class ModifiedAzimuthalEquidistant extends MapProjection
{
      */
     private static ParameterBuilder erase(final ParameterBuilder builder, ParameterDescriptor<?>
template) {
         return builder.addNamesAndIdentifiers(template)                         // Copy from
this parameter…
-                      .rename(Citations.OGC,    (CharSequence[]) null)          // … except
for those names.
-                      .rename(Citations.ESRI,   (CharSequence[]) null)
+                      .rename(Citations.ESRI,   (CharSequence[]) null)          // … except
for those names.
                       .rename(Citations.NETCDF, (CharSequence[]) null);
     }
 
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/AzimuthalEquidistant.java
b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/AzimuthalEquidistant.java
new file mode 100644
index 0000000..b860114
--- /dev/null
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/AzimuthalEquidistant.java
@@ -0,0 +1,172 @@
+/*
+ * 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 java.util.EnumMap;
+import org.opengis.referencing.operation.Matrix;
+import org.opengis.referencing.operation.OperationMethod;
+import org.opengis.parameter.ParameterDescriptor;
+import org.apache.sis.parameter.Parameters;
+import org.apache.sis.util.Workaround;
+
+import static java.lang.Math.*;
+import static org.apache.sis.internal.referencing.provider.ModifiedAzimuthalEquidistant.*;
+
+
+/**
+ * <cite>Azimuthal Equidistant (Spherical)</cite> projection.
+ * This projection method has no EPSG code.
+ * See the following references for an overview:
+ * <ul>
+ *   <li><a href="https://en.wikipedia.org/wiki/Azimuthal_equidistant_projection">Azimuthal
equidistant projection</a></li>
+ *   <li><a href="https://mathworld.wolfram.com/AzimuthalEquidistantProjection.html">Azimuthal
Equidistant Projection</a></li>
+ * </ul>
+ *
+ * Current implementation supports only the spherical case.
+ * For ellipsoidal formulas, the {@link ModifiedAzimuthalEquidistant} provides an approximation
+ * valid under 800 kilometres of the projection centre.
+ *
+ * @author  Martin Desruisseaux (Geomatys)
+ * @version 1.1
+ *
+ * @see ModifiedAzimuthalEquidistant
+ *
+ * @since 1.1
+ * @module
+ */
+public class AzimuthalEquidistant extends NormalizedProjection {
+    /**
+     * For compatibility with different versions during deserialization.
+     */
+    private static final long serialVersionUID = -6969752149232210847L;
+
+    /**
+     * Sine and cosine of the latitude of origin φ₀.
+     */
+    private final double sinφ0, cosφ0;
+
+    /**
+     * Work around for RFE #4093999 in Sun's bug database
+     * ("Relax constraint on placement of this()/super() call in constructors").
+     */
+    @Workaround(library="JDK", version="1.8")
+    private static Initializer initializer(final OperationMethod method, final Parameters
parameters) {
+        final EnumMap<ParameterRole, ParameterDescriptor<Double>> roles = new
EnumMap<>(ParameterRole.class);
+        roles.put(ParameterRole.LATITUDE_OF_CONFORMAL_SPHERE_RADIUS, LATITUDE_OF_ORIGIN);
+        roles.put(ParameterRole.CENTRAL_MERIDIAN,                    LONGITUDE_OF_ORIGIN);
+        roles.put(ParameterRole.FALSE_EASTING,                       FALSE_EASTING);
+        roles.put(ParameterRole.FALSE_NORTHING,                      FALSE_NORTHING);
+        return new Initializer(method, parameters, roles, (byte) 0);
+    }
+
+    /**
+     * Creates a Azimuthal Equidistant projection from the given parameters.
+     * The {@code method} argument can be the description of one of the following:
+     *
+     * <ul>
+     *   <li><cite>"Azimuthal Equidistant (Spherical)"</cite>.</li>
+     * </ul>
+     *
+     * @param method      description of the projection parameters.
+     * @param parameters  the parameter values of the projection to create.
+     */
+    public AzimuthalEquidistant(final OperationMethod method, final Parameters parameters)
{
+        this(initializer(method, parameters));
+    }
+
+    /**
+     * Work around for RFE #4093999 in Sun's bug database
+     * ("Relax constraint on placement of this()/super() call in constructors").
+     */
+    @Workaround(library="JDK", version="1.8")
+    private AzimuthalEquidistant(final Initializer initializer) {
+        super(initializer);
+        final double φ0 = toRadians(initializer.getAndStore(LATITUDE_OF_ORIGIN));
+        cosφ0 = cos(φ0);
+        sinφ0 = sin(φ0);
+    }
+
+    /**
+     * Converts the specified (λ,φ) coordinate and stores the (<var>x</var>,<var>y</var>)
result in {@code dstPts}.
+     *
+     * @return the matrix of the projection derivative at the given source position,
+     *         or {@code null} if the {@code derivate} argument is {@code false}.
+     * @throws ProjectionException if the coordinate can not be converted.
+     */
+    @Override
+    public Matrix transform(final double[] srcPts, final int srcOff,
+                            final double[] dstPts, final int dstOff,
+                            final boolean derivate) throws ProjectionException
+    {
+        final double λ    = srcPts[srcOff  ];
+        final double φ    = srcPts[srcOff+1];
+        final double cosλ = cos(λ);
+        final double sinλ = sin(λ);
+        final double cosφ = cos(φ);
+        final double sinφ = sin(φ);
+        final double c    = acos(sinφ0*sinφ + cosφ0*cosφ*cosλ);
+        final double k    = abs(c) >= ANGULAR_TOLERANCE ? c/sin(c) : 1;
+        if (dstPts != null) {
+            dstPts[dstOff  ] = k * cosφ*sinλ;
+            dstPts[dstOff+1] = k * (cosφ0*sinφ - sinφ0*cosφ*cosλ);
+        }
+        if (!derivate) {
+            return null;
+        }
+        throw new ProjectionException("Derivative not yet implemented.");
+    }
+
+    /**
+     * Converts the specified (<var>x</var>,<var>y</var>) coordinates
+     * and stores the result in {@code dstPts} (angles in radians).
+     */
+    @Override
+    protected void inverseTransform(final double[] srcPts, final int srcOff,
+                                    final double[] dstPts, final int dstOff)
+            throws ProjectionException
+    {
+        final double x    = srcPts[srcOff  ];
+        final double y    = srcPts[srcOff+1];
+        final double D    = hypot(x, y);
+        final double sinD = sin(D);
+        final double cosD = cos(D);
+        dstPts[dstOff  ]  = atan2(x*sinD, (cosφ0*cosD*D - sinφ0*sinD*y));
+        dstPts[dstOff+1]  = asin(cosD*sinφ0 + sinD*cosφ0*y/D);
+    }
+
+    /**
+     * Returns the names of additional internal parameters which need to be taken in account
when
+     * comparing two {@code AzimuthalEquidistant} projections or formatting them in debug
mode.
+     *
+     * <p>We could report any of the internal parameters. But since they are all derived
from φ₀ and
+     * the {@linkplain #eccentricity eccentricity} and since the eccentricity is already
reported by
+     * the super-class, we report only φ₀ as a representative of the internal parameters.</p>
+     */
+    @Override
+    final String[] getInternalParameterNames() {
+        return new String[] {"φ₀"};
+    }
+
+    /**
+     * Returns the values of additional internal parameters which need to be taken in account
when
+     * comparing two {@code ObliqueStereographic} projections or formatting them in debug
mode.
+     */
+    @Override
+    final double[] getInternalParameterValues() {
+        return new double[] {(cosφ0 < PI/4) ? acos(cosφ0) : asin(sinφ0)};
+    }
+}
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/ModifiedAzimuthalEquidistant.java
b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/ModifiedAzimuthalEquidistant.java
index 9b6bf32..daf94fd 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/ModifiedAzimuthalEquidistant.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/ModifiedAzimuthalEquidistant.java
@@ -45,7 +45,10 @@ import static org.apache.sis.internal.referencing.provider.ModifiedAzimuthalEqui
  *
  * @author  Martin Desruisseaux (Geomatys)
  * @version 1.1
- * @since   1.1
+ *
+ * @see AzimuthalEquidistant
+ *
+ * @since 1.1
  * @module
  */
 public class ModifiedAzimuthalEquidistant extends NormalizedProjection {
@@ -187,8 +190,8 @@ public class ModifiedAzimuthalEquidistant extends NormalizedProjection
{
                + (s4/120 * (H2*(4 - 7*H2) - 3*(G*G)*(1 - 7*H2)))
                - (s5/48  * GH);
         if (dstPts != null) {
-            dstPts[dstOff  ] = c*sinα;
-            dstPts[dstOff+1] = c*cosα;
+            dstPts[dstOff  ] = c * sinα;
+            dstPts[dstOff+1] = c * cosα;
         }
         if (!derivate) {
             return null;
diff --git a/core/sis-referencing/src/main/resources/META-INF/services/org.opengis.referencing.operation.OperationMethod
b/core/sis-referencing/src/main/resources/META-INF/services/org.opengis.referencing.operation.OperationMethod
index b549967..11937c1 100644
--- a/core/sis-referencing/src/main/resources/META-INF/services/org.opengis.referencing.operation.OperationMethod
+++ b/core/sis-referencing/src/main/resources/META-INF/services/org.opengis.referencing.operation.OperationMethod
@@ -56,6 +56,7 @@ org.apache.sis.internal.referencing.provider.ObliqueMercatorTwoPoints
 org.apache.sis.internal.referencing.provider.ObliqueMercatorTwoPointsCenter
 org.apache.sis.internal.referencing.provider.Orthographic
 org.apache.sis.internal.referencing.provider.ModifiedAzimuthalEquidistant
+org.apache.sis.internal.referencing.provider.AzimuthalEquidistantSpherical
 org.apache.sis.internal.referencing.provider.ZonedTransverseMercator
 org.apache.sis.internal.referencing.provider.Sinusoidal
 org.apache.sis.internal.referencing.provider.Polyconic
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/provider/ProvidersTest.java
b/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/provider/ProvidersTest.java
index 7bc59ed..0e68378 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/provider/ProvidersTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/provider/ProvidersTest.java
@@ -105,6 +105,7 @@ public final strictfp class ProvidersTest extends TestCase {
             ObliqueMercatorTwoPointsCenter.class,
             Orthographic.class,
             ModifiedAzimuthalEquidistant.class,
+            AzimuthalEquidistantSpherical.class,
             ZonedTransverseMercator.class,
             SatelliteTracking.class,
             Sinusoidal.class,
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/AzimuthalEquidistantTest.java
b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/AzimuthalEquidistantTest.java
new file mode 100644
index 0000000..b2f071f
--- /dev/null
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/projection/AzimuthalEquidistantTest.java
@@ -0,0 +1,106 @@
+/*
+ * 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.referencing.operation.TransformException;
+import org.apache.sis.internal.referencing.provider.MapProjection;
+import org.apache.sis.test.DependsOn;
+import org.junit.Test;
+import org.opengis.util.FactoryException;
+
+
+/**
+ * Tests the {@link AzimuthalEquidistant} class.
+ *
+ * @author  Martin Desruisseaux (Geomatys)
+ * @version 1.1
+ * @since   1.1
+ * @module
+ */
+@DependsOn(NormalizedProjectionTest.class)
+public strictfp class AzimuthalEquidistantTest extends MapProjectionTestCase {
+    /**
+     * Returns the method to be tested.
+     */
+    MapProjection method() {
+        return new org.apache.sis.internal.referencing.provider.AzimuthalEquidistantSpherical();
+    }
+
+    /**
+     * Tests the forward projection using test point given in Snyder page 337.
+     * The Snyder's test uses a sphere of radius R=3 and a center at 40°N and 100°W.
+     * The test in this class modify the longitude to 10°W for avoiding to mix wraparound
+     * considerations in this test.
+     *
+     * @throws FactoryException if an error occurred while creating the projection.
+     * @throws TransformException if an error occurred while projecting the test point.
+     */
+    @Test
+    public void testSpherical() throws FactoryException, TransformException {
+        createCompleteProjection(method(),
+                  3,            // Semi-major axis
+                  3,            // Semi-minor axis
+                -10,            // Longitude of natural origin (central-meridian)
+                 40,            // Latitude of natural origin
+                Double.NaN,     // Standard parallel 1
+                Double.NaN,     // Standard parallel 2
+                Double.NaN,     // Scale factor
+                  0,            // False easting
+                  0);           // False Northing
+
+        tolerance = 2E-7;
+        verifyTransform(new double[] {
+            -170,               // Was 1OO°E in Snyder test, shifted by 90° in our test.
+             -20                // 20°S
+        }, new double[] {
+            -5.8311398,
+             5.5444634
+        });
+    }
+
+    /**
+     * Tests the point published in EPSG guidance note.
+     *
+     * @throws FactoryException if an error occurred while creating the projection.
+     * @throws TransformException if an error occurred while projecting the test point.
+     */
+    @Test
+    public void testEPSGPoint() throws FactoryException, TransformException {
+        createCompleteProjection(method(),
+                CLARKE_A,                       // Semi-major axis (Clarke 1866)
+                CLARKE_B,                       // Semi-minor axis
+                138 + (10 +  7.48/60)/60,       // Longitude of natural origin (central-meridian)
+                  9 + (32 + 48.15/60)/60,       // Latitude of natural origin
+                Double.NaN,                     // Standard parallel 1
+                Double.NaN,                     // Standard parallel 2
+                Double.NaN,                     // Scale factor
+                40000,                          // False easting
+                60000);                         // False Northing
+        /*
+         * Since we are testing spherical formulas with a sample point calculated
+         * for ellipsoidal formulas, we have to use a high tolerance threshold.
+         */
+        tolerance = 20;
+        verifyTransform(new double[] {
+            138 + (11 + 34.908/60)/60,          // 138°11'34.908"E
+              9 + (35 + 47.493/60)/60           //   9°35'47.493"N
+        }, new double[] {
+            42665.90,
+            65509.82
+        });
+    }
+}
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/test/suite/ReferencingTestSuite.java
b/core/sis-referencing/src/test/java/org/apache/sis/test/suite/ReferencingTestSuite.java
index 7d9facb..1d86008 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/test/suite/ReferencingTestSuite.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/test/suite/ReferencingTestSuite.java
@@ -192,6 +192,7 @@ import org.junit.BeforeClass;
     org.apache.sis.referencing.operation.projection.PolyconicTest.class,
     org.apache.sis.referencing.operation.projection.MollweideTest.class,
     org.apache.sis.referencing.operation.projection.OrthographicTest.class,
+    org.apache.sis.referencing.operation.projection.AzimuthalEquidistantTest.class,
     org.apache.sis.referencing.operation.projection.ModifiedAzimuthalEquidistantTest.class,
     org.apache.sis.referencing.operation.projection.SatelliteTrackingTest.class,
 


Mime
View raw message