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 72d03efe73 Add an option for requesting (longitude, latitude) axis 
order in base CRS.
72d03efe73 is described below

commit 72d03efe73cc3fa908d5df5a889d6a8898250ef7
Author: Martin Desruisseaux <martin.desruisse...@geomatys.com>
AuthorDate: Fri Sep 23 16:07:37 2022 +0200

    Add an option for requesting (longitude, latitude) axis order in base CRS.
---
 .../referencing/GeodeticObjectBuilder.java         | 39 +++++++++++++++++++---
 .../referencing/GeodeticObjectBuilderTest.java     |  6 +++-
 2 files changed, 40 insertions(+), 5 deletions(-)

diff --git 
a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/GeodeticObjectBuilder.java
 
b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/GeodeticObjectBuilder.java
index bbd3da6fd4..4845172946 100644
--- 
a/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/GeodeticObjectBuilder.java
+++ 
b/core/sis-referencing/src/main/java/org/apache/sis/internal/referencing/GeodeticObjectBuilder.java
@@ -58,6 +58,7 @@ import org.apache.sis.measure.Latitude;
 import org.apache.sis.referencing.Builder;
 import org.apache.sis.referencing.CommonCRS;
 import org.apache.sis.referencing.IdentifiedObjects;
+import org.apache.sis.referencing.cs.AxesConvention;
 import org.apache.sis.parameter.Parameters;
 
 
@@ -111,6 +112,13 @@ public class GeodeticObjectBuilder extends 
Builder<GeodeticObjectBuilder> {
      */
     private final Locale locale;
 
+    /**
+     * Whether to use the axis order defined by {@link 
AxesConvention#NORMALIZED}.
+     *
+     * @see CommonCRS#normalizedGeographic()
+     */
+    private boolean normalizedAxisOrder;
+
     /**
      * Creates a new builder with default locale and set of factories.
      */
@@ -136,6 +144,21 @@ public class GeodeticObjectBuilder extends 
Builder<GeodeticObjectBuilder> {
         return Collections.singletonMap(IdentifiedObject.NAME_KEY, 
template.getName());
     }
 
+    /**
+     * Sets whether axes should be in (longitude, latitude) order instead of 
(latitude, longitude).
+     * This flag applies to geographic CRS created by this builder.
+     *
+     * @param  normalized  whether axes should be in (longitude, latitude) 
order instead of (latitude, longitude).
+     * @return {@code this}, for method call chaining.
+     *
+     * @see AxesConvention#NORMALIZED
+     * @see CommonCRS#normalizedGeographic()
+     */
+    public GeodeticObjectBuilder setNormalizedAxisOrder(final boolean 
normalized) {
+        normalizedAxisOrder = normalized;
+        return this;
+    }
+
     /**
      * Sets the domain of validity as a geographic bounding box set to the 
specified values.
      * The bounding box crosses the anti-meridian if {@code 
eastBoundLongitude} &lt; {@code westBoundLongitude}.
@@ -483,22 +506,30 @@ public class GeodeticObjectBuilder extends 
Builder<GeodeticObjectBuilder> {
      * @throws FactoryException if an error occurred while building the 
projected CRS.
      */
     public ProjectedCRS createProjectedCRS() throws FactoryException {
-        GeographicCRS crs = CommonCRS.WGS84.geographic();
+        GeographicCRS crs = getBaseCRS();
         if (datum != null) {
             crs = factories.getCRSFactory().createGeographicCRS(name(datum), 
datum, crs.getCoordinateSystem());
         }
         return createProjectedCRS(crs, factories.getStandardProjectedCS());
     }
 
+    /**
+     * Returns the CRS to use as the base of a projected CRS.
+     *
+     * @todo {@code CommonCRS.WGS84} should be {@code CommonCRS.DEFAULT}, but 
the latter is not public.
+     */
+    private GeographicCRS getBaseCRS() {
+        return normalizedAxisOrder ? CommonCRS.defaultGeographic() : 
CommonCRS.WGS84.geographic();
+    }
+
     /**
      * Creates a geographic CRS.
      *
-     * @param  normalized  whether axes should be in (longitude, latitude) 
order instead of (latitude, longitude).
      * @return the geographic coordinate reference system.
      * @throws FactoryException if an error occurred while building the 
geographic CRS.
      */
-    public GeographicCRS createGeographicCRS(final boolean normalized) throws 
FactoryException {
-        final GeographicCRS crs = normalized ? CommonCRS.WGS84.geographic() : 
CommonCRS.defaultGeographic();
+    public GeographicCRS createGeographicCRS() throws FactoryException {
+        final GeographicCRS crs = getBaseCRS();
         if (datum != null) properties.putIfAbsent(GeographicCRS.NAME_KEY, 
datum.getName());
         return factories.getCRSFactory().createGeographicCRS(properties, 
datum, crs.getCoordinateSystem());
     }
diff --git 
a/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/GeodeticObjectBuilderTest.java
 
b/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/GeodeticObjectBuilderTest.java
index 38f295b7d6..f914360b5a 100644
--- 
a/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/GeodeticObjectBuilderTest.java
+++ 
b/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/GeodeticObjectBuilderTest.java
@@ -18,6 +18,7 @@ package org.apache.sis.internal.referencing;
 
 import java.util.function.BiConsumer;
 import org.opengis.util.FactoryException;
+import org.opengis.referencing.cs.AxisDirection;
 import org.opengis.referencing.crs.ProjectedCRS;
 import org.opengis.parameter.ParameterValueGroup;
 import org.apache.sis.measure.Units;
@@ -25,6 +26,7 @@ import org.apache.sis.test.TestCase;
 import org.junit.Test;
 
 import static org.junit.Assert.*;
+import static org.opengis.test.Assert.assertAxisDirectionsEqual;
 
 
 /**
@@ -49,9 +51,11 @@ public final strictfp class GeodeticObjectBuilderTest 
extends TestCase {
         assertSame(b, b.setParameter("Longitude of natural origin", 40, 
Units.DEGREE));
         assertSame(b, b.setParameter("Scale factor at natural origin", 0.5, 
Units.UNITY));
         assertSame(b, b.changeConversion("Mercator (Spherical)", null));
-        final ProjectedCRS crs = b.createProjectedCRS();
+        final ProjectedCRS crs = 
b.setNormalizedAxisOrder(true).createProjectedCRS();
         final ParameterValueGroup p = 
crs.getConversionFromBase().getParameterValues();
         assertEquals(40,  p.parameter("Longitude of natural 
origin").doubleValue(), STRICT);
         assertEquals(0.5, p.parameter("Scale factor at natural 
origin").doubleValue(), STRICT);
+        assertAxisDirectionsEqual("baseCRS", 
crs.getBaseCRS().getCoordinateSystem(),
+                                  AxisDirection.EAST, AxisDirection.NORTH);
     }
 }

Reply via email to