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

commit c4812a3ed5541362842f5d68e93f8a2bf6172243
Author: Martin Desruisseaux <[email protected]>
AuthorDate: Wed Jun 22 15:05:18 2022 +0200

    Add a `DefaultEllipsoid.getRadius(double)` method for computing radius at a 
given latitude.
---
 .../apache/sis/internal/referencing/Formulas.java   | 17 ++++++++++++++++-
 .../sis/internal/referencing/package-info.java      |  2 +-
 .../sis/referencing/datum/DefaultEllipsoid.java     | 21 ++++++++++++++++++++-
 .../apache/sis/referencing/datum/package-info.java  |  2 +-
 .../sis/internal/referencing/FormulasTest.java      | 15 ++++++++++++++-
 .../sis/referencing/datum/DefaultEllipsoidTest.java | 14 +++++++++++++-
 6 files changed, 65 insertions(+), 6 deletions(-)

diff --git 
a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Formulas.java
 
b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Formulas.java
index ce7408cb28..04f0fd89ea 100644
--- 
a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Formulas.java
+++ 
b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/Formulas.java
@@ -33,7 +33,7 @@ import static 
org.apache.sis.internal.metadata.ReferencingServices.NAUTICAL_MILE
  * do not want to expose publicly those arbitrary values (or at least not in a 
too direct way).
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.2
+ * @version 1.3
  * @since   0.4
  * @module
  */
@@ -185,6 +185,21 @@ public final class Formulas extends Static {
         return a * (r / (1 - (1 - r*r) * (sinφ*sinφ)));
     }
 
+    /**
+     * Returns the radius at the given latitude.
+     *
+     * @param  ellipsoid  the ellipsoid for which to compute the radius.
+     * @param  φ          the latitude in radians where to compute the radius.
+     * @return radius at latitude φ.
+     */
+    public static double getRadius(final Ellipsoid ellipsoid, final double φ) {
+        final double a  = ellipsoid.getSemiMajorAxis();
+        final double b  = ellipsoid.getSemiMinorAxis();
+        double at = a * Math.cos(φ); at *= at;
+        double bt = b * Math.sin(φ); bt *= bt;
+        return Math.sqrt((a*a*at + b*b*bt) / (at + bt));
+    }
+
     /**
      * Computes the semi-minor axis length from the given semi-major axis and 
inverse flattening factor.
      *
diff --git 
a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/package-info.java
 
b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/package-info.java
index b31caf3f54..887a7ac9d0 100644
--- 
a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/package-info.java
+++ 
b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/package-info.java
@@ -24,7 +24,7 @@
  * may change in incompatible ways in any future version without notice.
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.2
+ * @version 1.3
  * @since   0.3
  * @module
  */
diff --git 
a/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultEllipsoid.java
 
b/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultEllipsoid.java
index bf46665a7b..3d48028d81 100644
--- 
a/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultEllipsoid.java
+++ 
b/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultEllipsoid.java
@@ -104,7 +104,7 @@ import static 
org.apache.sis.util.ArgumentChecks.ensureNonNull;
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
  * @author  Cédric Briançon (Geomatys)
- * @version 1.0
+ * @version 1.3
  *
  * @see org.apache.sis.referencing.CommonCRS#ellipsoid()
  * @see 
org.apache.sis.referencing.factory.GeodeticAuthorityFactory#createEllipsoid(String)
@@ -380,6 +380,25 @@ public class DefaultEllipsoid extends 
AbstractIdentifiedObject implements Ellips
         return Formulas.getAuthalicRadius(getSemiMajorAxis(), 
getSemiMinorAxis());
     }
 
+    /**
+     * Returns the radius at the given latitude.
+     * Special cases:
+     *
+     * <ul>
+     *   <li>If φ =   0°, then this is the same value as {@link 
#getSemiMajorAxis()}.</li>
+     *   <li>If φ = ±90°, then this is the same value as {@link 
#getSemiMinorAxis()}.</li>
+     *   <li>If φ is NaN, then this method returns NaN.</li>
+     * </ul>
+     *
+     * @param  φ  latitude in degrees, from -90° to +90° inclusive.
+     * @return radius at the given latitude.
+     *
+     * @since 1.3
+     */
+    public double getRadius(final double φ) {
+        return Formulas.getRadius(this, Math.toRadians(φ));
+    }
+
     /**
      * The ratio of the distance between the center and a focus of the ellipse 
to the length of its semi-major axis.
      * The eccentricity can alternately be computed from the equation: ℯ = 
√(2f - f²) where <var>f</var> is the
diff --git 
a/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/package-info.java
 
b/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/package-info.java
index a54013f42b..6cf8b8268d 100644
--- 
a/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/package-info.java
+++ 
b/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/package-info.java
@@ -53,7 +53,7 @@
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
  * @author  Cédric Briançon (Geomatys)
- * @version 1.1
+ * @version 1.3
  * @since   0.4
  * @module
  */
diff --git 
a/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/FormulasTest.java
 
b/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/FormulasTest.java
index 82d02f979d..aae1391c78 100644
--- 
a/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/FormulasTest.java
+++ 
b/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/FormulasTest.java
@@ -17,6 +17,7 @@
 package org.apache.sis.internal.referencing;
 
 import java.util.Collections;
+import org.opengis.referencing.datum.Ellipsoid;
 import org.apache.sis.internal.metadata.ReferencingServices;
 import org.apache.sis.measure.Longitude;
 import org.apache.sis.measure.Units;
@@ -32,7 +33,7 @@ import static org.junit.Assert.*;
  * Tests {@link Formulas}.
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.1
+ * @version 1.3
  * @since   0.4
  * @module
  */
@@ -122,4 +123,16 @@ public final strictfp class FormulasTest extends TestCase {
                 Collections.singletonMap(DefaultEllipsoid.NAME_KEY, "Bessel 
1841"), 6377397.155, 299.1528128, Units.METRE);
         assertEquals(6382644.571, Formulas.radiusOfConformalSphere(ellipsoid, 
StrictMath.toRadians(52.156160556)), 0.001);
     }
+
+    /**
+     * Tests {@link Formulas#getRadius(Ellipsoid, double)}.
+     */
+    @Test
+    public void testGetRadius() {
+        final Ellipsoid e = HardCodedDatum.WGS84.getEllipsoid();
+        assertEquals(e.getSemiMajorAxis(), Formulas.getRadius(e,  0),         
0.01);
+        assertEquals(e.getSemiMinorAxis(), Formulas.getRadius(e, +Math.PI/2), 
0.01);
+        assertEquals(e.getSemiMinorAxis(), Formulas.getRadius(e, -Math.PI/2), 
0.01);
+        assertEquals(6372824, Formulas.getRadius(e, Math.toRadians(30)), 0.5);
+    }
 }
diff --git 
a/core/sis-referencing/src/test/java/org/apache/sis/referencing/datum/DefaultEllipsoidTest.java
 
b/core/sis-referencing/src/test/java/org/apache/sis/referencing/datum/DefaultEllipsoidTest.java
index 83a6f54a48..ff869a23a3 100644
--- 
a/core/sis-referencing/src/test/java/org/apache/sis/referencing/datum/DefaultEllipsoidTest.java
+++ 
b/core/sis-referencing/src/test/java/org/apache/sis/referencing/datum/DefaultEllipsoidTest.java
@@ -31,7 +31,7 @@ import static org.apache.sis.test.ReferencingAssert.*;
  * Tests the {@link DefaultEllipsoid} class.
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
- * @version 0.8
+ * @version 1.3
  * @since   0.4
  * @module
  */
@@ -123,6 +123,18 @@ public final strictfp class DefaultEllipsoidTest extends 
TestCase {
         assertEquals("GRS80",  6371007, GRS80 .getAuthalicRadius(), 0.2);
     }
 
+    /**
+     * Tests {@link DefaultEllipsoid#getRadius(double)}.
+     */
+    @Test
+    public void testRadius() {
+        final DefaultEllipsoid e = 
DefaultEllipsoid.castOrCopy(GeodeticDatumMock.WGS84.getEllipsoid());
+        assertEquals(6378137, e.getRadius( 0),  0.5);
+        assertEquals(6372824, e.getRadius( 30), 0.5);
+        assertEquals(6356752, e.getRadius(+90), 0.5);
+        assertEquals(6356752, e.getRadius(-90), 0.5);
+    }
+
     /**
      * Tests {@link DefaultEllipsoid#toWKT()}.
      */

Reply via email to