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()}. */
