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 <[email protected]>
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,