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 3e79841b4c Post-merge adjustments in `VerticalDatumTypes`. 3e79841b4c is described below commit 3e79841b4c2fc5eac551b2ff9e8540853125c7c0 Author: Martin Desruisseaux <martin.desruisse...@geomatys.com> AuthorDate: Mon Apr 22 12:54:51 2024 +0200 Post-merge adjustments in `VerticalDatumTypes`. --- .../apache/sis/io/wkt/GeodeticObjectParser.java | 5 ++- .../main/org/apache/sis/referencing/CommonCRS.java | 6 +++- .../sis/referencing/StandardDefinitions.java | 3 +- .../referencing/factory/GeodeticObjectFactory.java | 4 +-- .../apache/sis/referencing/internal/Legacy.java | 2 +- .../referencing/internal/VerticalDatumTypes.java | 39 +++++++++++++++++----- .../operation/CoordinateOperationRegistry.java | 2 +- .../privy/EllipsoidalHeightCombiner.java | 3 +- .../internal/VerticalDatumTypesTest.java | 12 +++++++ 9 files changed, 55 insertions(+), 21 deletions(-) diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/io/wkt/GeodeticObjectParser.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/io/wkt/GeodeticObjectParser.java index 659162db6a..613eabf205 100644 --- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/io/wkt/GeodeticObjectParser.java +++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/io/wkt/GeodeticObjectParser.java @@ -689,7 +689,6 @@ class GeodeticObjectParser extends MathTransformParser implements Comparator<Coo * @throws ParseException if an element cannot be parsed. * @throws FactoryException if the factory cannot create the coordinate system. */ - @SuppressWarnings("deprecation") private CoordinateSystem parseCoordinateSystem(final Element parent, String type, int dimension, final boolean isWKT1, final Unit<?> defaultUnit, final Datum datum) throws ParseException, FactoryException { @@ -772,8 +771,8 @@ class GeodeticObjectParser extends MathTransformParser implements Comparator<Coo Unit<?> unit = defaultUnit; // Depth, height or time axis unit. switch (type) { /* - * Cartesian — we can create axes only for geodetic datum, in which case the axes are for - * two-dimensional Projected or three-dimensional Geocentric CRS. + * Cartesian — we can create axes only for geodetic datum, in which case the axes + * are for two- or three-dimensional Projected or three-dimensional Geocentric CRS. */ case WKTKeywords.Cartesian: { if (datum != null && !(datum instanceof GeodeticDatum)) { diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/CommonCRS.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/CommonCRS.java index de5cd6e482..8abad5348b 100644 --- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/CommonCRS.java +++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/CommonCRS.java @@ -1467,7 +1467,11 @@ public enum CommonCRS { if (isEPSG) { object = StandardDefinitions.createVerticalDatum(datum); } else { - // BAROMETRIC and ELLIPSOIDAL cases. + /* + * All cases where the first constructor argument is `false`, currently BAROMETRIC and + * ELLIPSOIDAL. The way to construct the ellipsoidal pseudo-method shall be equivalent + * to a call to `VerticalDatumTypes.ellipsoidal()`. + */ RealizationMethod method = null; if (this != OTHER_SURFACE) { method = RealizationMethod.valueOf(name()); diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/StandardDefinitions.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/StandardDefinitions.java index f872175d90..882f14cc30 100644 --- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/StandardDefinitions.java +++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/StandardDefinitions.java @@ -74,7 +74,6 @@ import org.apache.sis.measure.Units; import static org.apache.sis.metadata.privy.ReferencingServices.AUTHALIC_RADIUS; // Specific to the geoapi-3.1 and geoapi-4.0 branches: -import org.opengis.referencing.datum.RealizationMethod; import static org.opengis.referencing.ObjectDomain.DOMAIN_OF_VALIDITY_KEY; @@ -348,7 +347,7 @@ final class StandardDefinitions { case 5103: name = "North American Vertical Datum 1988"; alias = "NAVD88"; break; default: throw new AssertionError(code); } - return new DefaultVerticalDatum(properties(code, name, alias, true), RealizationMethod.GEOID); + return new DefaultVerticalDatum(properties(code, name, alias, true), null); } /** diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/GeodeticObjectFactory.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/GeodeticObjectFactory.java index a3b869bed1..5d66b76bff 100644 --- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/GeodeticObjectFactory.java +++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/GeodeticObjectFactory.java @@ -918,11 +918,11 @@ public class GeodeticObjectFactory extends AbstractFactory implements CRSFactory } /** - * Creates a vertical datum from an enumerated type value. + * Creates a vertical datum from a realization method. * The default implementation creates a {@link DefaultVerticalDatum} instance. * * @param properties name and other properties to give to the new object. - * @param method the realization method the vertical datum, or {@code null} if none. + * @param method the realization method of the vertical datum, or {@code null} if none. * @throws FactoryException if the object creation failed. * * @see DefaultVerticalDatum#DefaultVerticalDatum(Map, RealizationMethod) diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/Legacy.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/Legacy.java index 9707a27c18..16c9a508c9 100644 --- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/Legacy.java +++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/Legacy.java @@ -97,7 +97,7 @@ public final class Legacy { } /** - * The standard three-dimensional Cartesian CS as defined by ISO 19111. + * The standard three-dimensional geocentric Cartesian CS as defined by ISO 19111. * * @param unit the linear unit of the desired coordinate system, or {@code null} for metres. * @return the ISO 19111 coordinate system. diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/VerticalDatumTypes.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/VerticalDatumTypes.java index b209366666..d1e2e82a46 100644 --- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/VerticalDatumTypes.java +++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/VerticalDatumTypes.java @@ -40,24 +40,36 @@ public final class VerticalDatumTypes { /** * A pseudo-realization method for ellipsoidal heights that are measured along * the normal to the ellipsoid used in the definition of horizontal datum. + * <strong>The use of this method is deprecated</strong> as ellipsoidal height + * should never be separated from the horizontal components according ISO 19111. * - * <p>Identifier: {@code CS_DatumType.CS_VD_Ellipsoidal}</p> + * <h4>Legacy</h4> + * This type was associated to code 2000 in the {@code Vert_Datum} element of the legacy WKT 1 format. + * The UML identifier was {@code CS_DatumType.CS_VD_Ellipsoidal}. + * + * @see org.apache.sis.referencing.CommonCRS.Vertical#ELLIPSOIDAL */ - private static final String ELLIPSOIDAL = "ELLIPSOIDAL"; + static final String ELLIPSOIDAL = "ELLIPSOIDAL"; /** - * A vertical datum for orthometric heights that are measured along the plumb line. + * A vertical datum type for orthometric heights that are measured along the plumb line. * - * <p>Identifier: {@code CS_DatumType.CS_VD_Orthometric}</p> + * <h4>Legacy</h4> + * This type was associated to code 2001 in the {@code Vert_Datum} element of the legacy WKT 1 format. + * The UML identifier was {@code CS_DatumType.CS_VD_Orthometric}. */ private static final String ORTHOMETRIC = "ORTHOMETRIC"; /** - * A vertical datum for origin of the vertical axis based on atmospheric pressure. + * A vertical datum type for origin of the vertical axis based on atmospheric pressure. + * + * <h4>Legacy</h4> + * This type was associated to code 2003 in the {@code Vert_Datum} element of the legacy WKT 1 format. + * The UML identifier was {@code CS_DatumType.CS_VD_AltitudeBarometric}. * - * <p>Identifier: {@code CS_DatumType.CS_VD_AltitudeBarometric}</p> + * @see org.apache.sis.referencing.CommonCRS.Vertical#BAROMETRIC */ - private static final String BAROMETRIC = "BAROMETRIC"; + static final String BAROMETRIC = "BAROMETRIC"; /** * Do not allow instantiation of this class. @@ -67,6 +79,13 @@ public final class VerticalDatumTypes { /** * Returns a pseudo-realization method for ellipsoidal heights. + * <strong>The use of this method is deprecated</strong> as ellipsoidal height + * should never be separated from the horizontal components according ISO 19111. + * + * <h4>Maintenance note</h4> + * If the implementation of this method is modified, search for {@code RealizationMethod.valueOf} + * at least in {@link org.apache.sis.referencing.CommonCRS.Vertical#datum()} and make sure that + * the code is equivalent. * * @return the ellipsoidal pseudo-realization method. */ @@ -113,7 +132,7 @@ public final class VerticalDatumTypes { */ public static int toLegacy(final RealizationMethod method) { if (method != null) { - switch (method.name()) { + switch (method.name().toUpperCase(Locale.US)) { case ORTHOMETRIC: return 2001; // CS_VD_Orthometric case ELLIPSOIDAL: return 2002; // CS_VD_Ellipsoidal case BAROMETRIC: return 2003; // CS_VD_AltitudeBarometric @@ -128,6 +147,7 @@ public final class VerticalDatumTypes { * Returns the vertical datum type from a realization method. * If the given method cannot be mapped to a legacy type, then this method returns "other surface". * This is because the vertical datum type was a mandatory property in legacy OGC/ISO standards. + * This method is used for writing GML documents older than GML 3.2. * * @param method the realization method, or {@code null}. * @return the vertical datum type name (never null). @@ -142,7 +162,8 @@ public final class VerticalDatumTypes { } /** - * Returns the realization method from a name. + * Returns the realization method from a vertical datum type. + * This method is used for reading GML documents older than GML 3.2. * * @param type the vertical datum type, or {@code null}. * @return the realization method, or {@code null} if none. diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/CoordinateOperationRegistry.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/CoordinateOperationRegistry.java index def3586a9b..45f05c2ace 100644 --- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/CoordinateOperationRegistry.java +++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/CoordinateOperationRegistry.java @@ -1195,7 +1195,7 @@ class CoordinateOperationRegistry { } /** - * If the given CRS is two-dimensional, append an ellipsoidal height to it. + * If the given CRS is two-dimensional, appends an ellipsoidal height to it. * It is caller's responsibility to ensure that the given CRS is geographic. */ private CoordinateReferenceSystem toGeodetic3D(CoordinateReferenceSystem crs, diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/privy/EllipsoidalHeightCombiner.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/privy/EllipsoidalHeightCombiner.java index d87655d6cc..c8791dbd93 100644 --- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/privy/EllipsoidalHeightCombiner.java +++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/privy/EllipsoidalHeightCombiner.java @@ -35,7 +35,6 @@ import org.opengis.referencing.datum.VerticalDatum; import org.opengis.referencing.operation.Conversion; import org.opengis.referencing.operation.CoordinateOperationFactory; import org.apache.sis.referencing.IdentifiedObjects; -import org.apache.sis.referencing.internal.VerticalDatumTypes; import org.apache.sis.metadata.iso.extent.Extents; import org.apache.sis.util.ArgumentChecks; import org.apache.sis.util.ArraysExt; @@ -115,7 +114,7 @@ public final class EllipsoidalHeightCombiner { final CoordinateReferenceSystem vertical = components[i]; if (vertical instanceof VerticalCRS) { final VerticalDatum datum = ((VerticalCRS) vertical).getDatum(); - if (datum != null && VerticalDatumTypes.ellipsoidal(datum.getRealizationMethod().orElse(null))) { + if (ReferencingUtilities.isEllipsoidalHeight(datum)) { int axisPosition = 0; CoordinateSystem cs = null; CoordinateReferenceSystem crs = null; diff --git a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/internal/VerticalDatumTypesTest.java b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/internal/VerticalDatumTypesTest.java index 4061d9b3c4..8e98da4827 100644 --- a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/internal/VerticalDatumTypesTest.java +++ b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/internal/VerticalDatumTypesTest.java @@ -17,6 +17,7 @@ package org.apache.sis.referencing.internal; import org.opengis.referencing.datum.RealizationMethod; +import org.apache.sis.referencing.CommonCRS; import org.apache.sis.util.ArraysExt; // Test dependencies @@ -38,6 +39,17 @@ public final class VerticalDatumTypesTest extends TestCase { public VerticalDatumTypesTest() { } + /** + * Verifies name constraint with values defined in {@link org.apache.sis.referencing.CommonCRS.Vertical}. + * Some enumeration values must have the same names as the constants defined in {@link VerticalDatumTypes}, + * because the realization method is obtained by a call to {@link RealizationMethod#valueOf(String)}. + */ + @Test + public void verifyNameConstraint() { + assertEquals(VerticalDatumTypes.ELLIPSOIDAL, CommonCRS.Vertical.ELLIPSOIDAL.name()); + assertEquals(VerticalDatumTypes.BAROMETRIC, CommonCRS.Vertical.BAROMETRIC.name()); + } + /** * Tests the {@link VerticalDatumTypes#fromLegacy(int)} method. */