You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sis.apache.org by de...@apache.org on 2024/04/05 17:19:14 UTC

(sis) branch geoapi-4.0 updated (4ec3a9b103 -> c39f9ef256)

This is an automated email from the ASF dual-hosted git repository.

desruisseaux pushed a change to branch geoapi-4.0
in repository https://gitbox.apache.org/repos/asf/sis.git


    from 4ec3a9b103 Resolve a few warnings (not all) about the deprecated `VerticalDatumType` code list.
     new cfb0e166e2 Post-merge cleanup. The `DefaultGeocentricCRS` class and its factory methods are marked as deprecated since 2.0 instead of 1.5 because we will not deprecate that class in the branch that depends on GeoAPI 3.0, because there is no replacement. The replacements will need to wait for GeoAPI 3.1.
     new c39f9ef256 Update for the removal of deprecated ImageDatum, ImageCRS and UserDefinedCS interfaces. Those interfaces were defined in ISO 19111:2007 but removed in ISO 19111:2019.

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../org/apache/sis/buildtools/book/GEOAPI.lst      |   3 -
 .../org/apache/sis/buildtools/book/OGC.lst         |   2 -
 .../main/org/apache/sis/util/iso/Types.java        |   4 +-
 .../apache/sis/metadata/PropertyAccessorTest.java  |   2 +-
 .../sis/openoffice/ReferencingFunctions.java       |  11 +-
 .../main/org/apache/sis/io/wkt/Convention.java     |   7 +-
 .../apache/sis/io/wkt/GeodeticObjectParser.java    |  27 ++--
 .../main/org/apache/sis/referencing/CRS.java       |  20 ++-
 .../apache/sis/referencing/crs/AbstractCRS.java    |   3 +-
 .../sis/referencing/crs/DefaultEngineeringCRS.java |  12 +-
 .../sis/referencing/crs/DefaultGeocentricCRS.java  |   2 +-
 .../sis/referencing/crs/DefaultImageCRS.java       |  71 ++--------
 .../org/apache/sis/referencing/crs/SubTypes.java   |   4 -
 .../org/apache/sis/referencing/cs/AbstractCS.java  |   5 +-
 .../sis/referencing/cs/DefaultUserDefinedCS.java   |  51 +-------
 .../org/apache/sis/referencing/cs/SubTypes.java    |   5 -
 .../sis/referencing/datum/AbstractDatum.java       |   5 +-
 .../sis/referencing/datum/DefaultImageDatum.java   |  68 +---------
 .../org/apache/sis/referencing/datum/SubTypes.java |   4 -
 .../referencing/factory/AuthorityFactoryProxy.java |  32 +----
 .../factory/ConcurrentAuthorityFactory.java        |  56 +-------
 .../factory/GeodeticAuthorityFactory.java          |  52 +-------
 .../referencing/factory/GeodeticObjectFactory.java | 143 +--------------------
 .../factory/MultiAuthoritiesFactory.java           |  47 +------
 .../sis/referencing/internal/EPSGFactoryProxy.java |   6 -
 .../referencing/internal/EPSGFactoryProxyCRS.java  |   9 +-
 .../internal/EPSGFactoryProxyDatum.java            |   7 -
 .../apache/sis/referencing/internal/Resources.java |   5 +
 .../sis/referencing/internal/Resources.properties  |   1 +
 .../referencing/internal/Resources_fr.properties   |   1 +
 .../operation/AbstractCoordinateOperation.java     |   2 +-
 .../referencing/operation/SubOperationInfo.java    |   6 +-
 .../operation/TransformedCoordinateSet.java        |   2 +-
 .../sis/xml/bind/referencing/CD_ImageDatum.java    |  14 +-
 .../sis/xml/bind/referencing/CS_UserDefinedCS.java |  14 +-
 .../sis/referencing/AuthorityFactoriesTest.java    |   3 +-
 .../referencing/factory/AuthorityFactoryMock.java  |   3 +
 .../operation/provider/ProvidersTest.java          |   1 -
 geoapi/snapshot                                    |   2 +-
 39 files changed, 119 insertions(+), 593 deletions(-)


(sis) 02/02: Update for the removal of deprecated ImageDatum, ImageCRS and UserDefinedCS interfaces. Those interfaces were defined in ISO 19111:2007 but removed in ISO 19111:2019.

Posted by de...@apache.org.
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 c39f9ef2560e2a003f0801b602fb126cb06f3e49
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Fri Apr 5 19:18:04 2024 +0200

    Update for the removal of deprecated ImageDatum, ImageCRS and UserDefinedCS interfaces.
    Those interfaces were defined in ISO 19111:2007 but removed in ISO 19111:2019.
---
 .../org/apache/sis/buildtools/book/GEOAPI.lst      |   3 -
 .../org/apache/sis/buildtools/book/OGC.lst         |   2 -
 .../sis/openoffice/ReferencingFunctions.java       |  11 +-
 .../main/org/apache/sis/io/wkt/Convention.java     |   7 +-
 .../apache/sis/io/wkt/GeodeticObjectParser.java    |  27 ++---
 .../apache/sis/referencing/crs/AbstractCRS.java    |   3 +-
 .../sis/referencing/crs/DefaultEngineeringCRS.java |  12 +-
 .../sis/referencing/crs/DefaultImageCRS.java       |  71 ++---------
 .../org/apache/sis/referencing/crs/SubTypes.java   |   4 -
 .../org/apache/sis/referencing/cs/AbstractCS.java  |   5 +-
 .../sis/referencing/cs/DefaultUserDefinedCS.java   |  51 +-------
 .../org/apache/sis/referencing/cs/SubTypes.java    |   5 -
 .../sis/referencing/datum/AbstractDatum.java       |   5 +-
 .../sis/referencing/datum/DefaultImageDatum.java   |  68 +----------
 .../org/apache/sis/referencing/datum/SubTypes.java |   4 -
 .../referencing/factory/AuthorityFactoryProxy.java |  32 ++---
 .../factory/ConcurrentAuthorityFactory.java        |  54 ---------
 .../factory/GeodeticAuthorityFactory.java          |  50 --------
 .../referencing/factory/GeodeticObjectFactory.java | 133 +--------------------
 .../factory/MultiAuthoritiesFactory.java           |  45 -------
 .../sis/referencing/internal/EPSGFactoryProxy.java |   6 -
 .../referencing/internal/EPSGFactoryProxyCRS.java  |   7 --
 .../internal/EPSGFactoryProxyDatum.java            |   7 --
 .../referencing/operation/SubOperationInfo.java    |   6 +-
 .../sis/xml/bind/referencing/CD_ImageDatum.java    |  14 +--
 .../sis/xml/bind/referencing/CS_UserDefinedCS.java |  14 +--
 .../sis/referencing/AuthorityFactoriesTest.java    |   3 +-
 geoapi/snapshot                                    |   2 +-
 28 files changed, 80 insertions(+), 571 deletions(-)

diff --git a/buildSrc/src/main/resources/org/apache/sis/buildtools/book/GEOAPI.lst b/buildSrc/src/main/resources/org/apache/sis/buildtools/book/GEOAPI.lst
index fa371b7c86..98b792e99c 100644
--- a/buildSrc/src/main/resources/org/apache/sis/buildtools/book/GEOAPI.lst
+++ b/buildSrc/src/main/resources/org/apache/sis/buildtools/book/GEOAPI.lst
@@ -101,8 +101,6 @@ GriddedDataPositionalAccuracy
 Identification
 IdentifiedObject
 Identifier
-ImageCRS
-ImageDatum
 ImageDescription
 ImagingCondition
 Individual
@@ -223,7 +221,6 @@ Trigger
 UML
 Usability
 Usage
-UserDefinedCS
 ValidatorContainer
 Validators
 VectorSpatialRepresentation
diff --git a/buildSrc/src/main/resources/org/apache/sis/buildtools/book/OGC.lst b/buildSrc/src/main/resources/org/apache/sis/buildtools/book/OGC.lst
index 771ccac556..7cc85d7506 100644
--- a/buildSrc/src/main/resources/org/apache/sis/buildtools/book/OGC.lst
+++ b/buildSrc/src/main/resources/org/apache/sis/buildtools/book/OGC.lst
@@ -17,7 +17,6 @@ CD_Datum
 CD_Ellipsoid
 CD_EngineeringDatum
 CD_GeodeticDatum
-CD_ImageDatum
 CD_PixelInCell
 CD_PrimeMeridian
 CD_TemporalDatum
@@ -53,7 +52,6 @@ CS_PolarCS
 CS_RangeMeaning
 CS_SphericalCS
 CS_TimeCS
-CS_UserDefinedCS
 CS_VerticalCS
 CV_ContinuousCoverage
 CV_Coverage
diff --git a/endorsed/src/org.apache.sis.openoffice/main/org/apache/sis/openoffice/ReferencingFunctions.java b/endorsed/src/org.apache.sis.openoffice/main/org/apache/sis/openoffice/ReferencingFunctions.java
index 2701a8bf28..2fbfc7b4d3 100644
--- a/endorsed/src/org.apache.sis.openoffice/main/org/apache/sis/openoffice/ReferencingFunctions.java
+++ b/endorsed/src/org.apache.sis.openoffice/main/org/apache/sis/openoffice/ReferencingFunctions.java
@@ -45,6 +45,10 @@ import org.apache.sis.storage.base.CodeType;
 // Specific to the geoapi-3.1 and geoapi-4.0 branches:
 import org.opengis.referencing.ObjectDomain;
 
+// Specific to the geoapi-4.0 branch:
+import org.opengis.referencing.crs.CRSAuthorityFactory;
+import org.apache.sis.referencing.factory.GeodeticAuthorityFactory;
+
 
 /**
  * Implements the {@link XReferencing} methods to make available to Apache OpenOffice.
@@ -120,7 +124,12 @@ public class ReferencingFunctions extends CalcAddins implements XReferencing {
                         type = CodeType.guess(codeOrPath);
                     }
                     if (type.equals(CodeType.URN)) {
-                        object = CRS.getAuthorityFactory(null).createObject(codeOrPath);
+                        CRSAuthorityFactory factory = CRS.getAuthorityFactory(null);
+                        if (factory instanceof GeodeticAuthorityFactory) {
+                            object = ((GeodeticAuthorityFactory) factory).createObject(codeOrPath);
+                        } else {
+                            object = factory.createCoordinateReferenceSystem(codeOrPath);
+                        }
                     } else if (type.isCRS) {
                         object = CRS.forCode(codeOrPath);
                     } else {
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/io/wkt/Convention.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/io/wkt/Convention.java
index e7541c1555..032e1bdd53 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/io/wkt/Convention.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/io/wkt/Convention.java
@@ -196,12 +196,7 @@ public enum Convention {
      *   <li>{@code Remarks} element is formatted for all
      *       {@linkplain org.apache.sis.referencing.AbstractIdentifiedObject identified objects},
      *       not only CRS or coordinate operations.</li>
-     *   <li>Additional attributes not defined by ISO 19162 may be formatted:
-     *     <ul>
-     *       <li>{@code ImageDatum} includes the {@linkplain org.apache.sis.referencing.datum.DefaultImageDatum#getPixelInCell() Pixel in Cell} code.</li>
-     *       <li>{@code TemporalDatum} includes the {@linkplain org.apache.sis.referencing.datum.DefaultTemporalDatum#getOrigin() Origin} date.</li>
-     *     </ul>
-     *   </li>
+     *   <li>Additional attributes not defined by ISO 19162 may be formatted.</li>
      * </ul>
      *
      * This convention is used only for debugging purpose.
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 ae5252bdc6..56001c098e 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
@@ -85,6 +85,10 @@ import org.apache.sis.util.privy.Strings;
 import org.apache.sis.util.resources.Errors;
 import org.apache.sis.util.iso.Types;
 
+// Specific to the geoapi-4.0 branch:
+import org.apache.sis.referencing.crs.DefaultImageCRS;
+import org.apache.sis.referencing.datum.DefaultImageDatum;
+
 
 /**
  * Well Known Text (WKT) parser for referencing objects. This include, but is not limited too,
@@ -1560,11 +1564,10 @@ class GeodeticObjectParser extends MathTransformParser implements Comparator<Coo
      *
      * @param  mode    {@link #FIRST}, {@link #OPTIONAL} or {@link #MANDATORY}.
      * @param  parent  the parent element.
-     * @return the {@code "ImageDatum"} element as an {@link ImageDatum} object.
+     * @return the {@code "ImageDatum"} element.
      * @throws ParseException if the {@code "ImageDatum"} element cannot be parsed.
      */
-    @SuppressWarnings("deprecation")
-    private ImageDatum parseImageDatum(final int mode, final Element parent) throws ParseException {
+    private DefaultImageDatum parseImageDatum(final int mode, final Element parent) throws ParseException {
         final Element element = parent.pullElement(mode, WKTKeywords.ImageDatum, WKTKeywords.IDatum);
         if (element == null) {
             return null;
@@ -1572,12 +1575,7 @@ class GeodeticObjectParser extends MathTransformParser implements Comparator<Coo
         final String name = element.pullString("name");
         final PixelInCell pixelInCell = Types.forCodeName(PixelInCell.class,
                 element.pullVoidElement("pixelInCell").keyword, PixelInCell::valueOf);
-        final DatumFactory datumFactory = factories.getDatumFactory();
-        try {
-            return datumFactory.createImageDatum(parseAnchorAndClose(element, name), pixelInCell);
-        } catch (FactoryException exception) {
-            throw element.parseFailed(exception);
-        }
+        return new DefaultImageDatum(parseAnchorAndClose(element, name), pixelInCell);
     }
 
     /**
@@ -1669,21 +1667,20 @@ class GeodeticObjectParser extends MathTransformParser implements Comparator<Coo
      * @return the {@code "ImageCRS"} element as an {@link ImageCRS} object.
      * @throws ParseException if the {@code "ImageCRS"} element cannot be parsed.
      */
-    @SuppressWarnings("deprecation")
-    private ImageCRS parseImageCRS(final int mode, final Element parent) throws ParseException {
+    private DefaultImageCRS parseImageCRS(final int mode, final Element parent) throws ParseException {
         final Element element = parent.pullElement(mode, WKTKeywords.ImageCRS);
         if (element == null) {
             return null;
         }
-        final String     name  = element.pullString("name");
-        final ImageDatum datum = parseImageDatum(MANDATORY, element);
-        final Unit<?>    unit  = parseUnit(element);
+        final String  name  = element.pullString("name");
+        final var     datum = parseImageDatum(MANDATORY, element);
+        final Unit<?> unit  = parseUnit(element);
         final CoordinateSystem cs;
         try {
             cs = parseCoordinateSystem(element, WKTKeywords.Cartesian, 2, false, unit, datum);
             final Map<String,?> properties = parseMetadataAndClose(element, name, datum);
             if (cs instanceof AffineCS) {
-                return factories.getCRSFactory().createImageCRS(properties, datum, (AffineCS) cs);
+                return new DefaultImageCRS(properties, datum, (AffineCS) cs);
             }
         } catch (FactoryException exception) {
             throw element.parseFailed(exception);
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/AbstractCRS.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/AbstractCRS.java
index 1065afe2fb..32f34b8cdc 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/AbstractCRS.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/AbstractCRS.java
@@ -227,8 +227,7 @@ public class AbstractCRS extends AbstractReferenceSystem implements CoordinateRe
      *       {@link org.opengis.referencing.crs.GeocentricCRS} subtypes),
      *       {@link org.opengis.referencing.crs.VerticalCRS},
      *       {@link org.opengis.referencing.crs.TemporalCRS},
-     *       {@link org.opengis.referencing.crs.EngineeringCRS},
-     *       {@link org.opengis.referencing.crs.ImageCRS} or
+     *       {@link org.opengis.referencing.crs.EngineeringCRS} or
      *       {@link org.apache.sis.referencing.cs.DefaultCompoundCS},
      *       then this method delegates to the {@code castOrCopy(…)} method of the corresponding SIS subclass.
      *       Note that if the given object implements more than one of the above-cited interfaces,
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/DefaultEngineeringCRS.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/DefaultEngineeringCRS.java
index 416297c6cd..5a62c3e211 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/DefaultEngineeringCRS.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/DefaultEngineeringCRS.java
@@ -325,8 +325,9 @@ public class DefaultEngineeringCRS extends AbstractCRS implements EngineeringCRS
     @XmlElement(name="linearCS")      private LinearCS      getLinearCS()      {return getCoordinateSystem(LinearCS     .class);}
     @XmlElement(name="polarCS")       private PolarCS       getPolarCS()       {return getCoordinateSystem(PolarCS      .class);}
     @XmlElement(name="sphericalCS")   private SphericalCS   getSphericalCS()   {return getCoordinateSystem(SphericalCS  .class);}
-    @Deprecated(since = "1.5")
-    @XmlElement(name="userDefinedCS") private UserDefinedCS getUserDefinedCS() {return getCoordinateSystem(UserDefinedCS.class);}
+
+    // Types that do not exist anymore in lastest ISO 19111 standard.
+    @XmlElement(name="userDefinedCS") private DefaultUserDefinedCS getUserDefinedCS() {return getCoordinateSystem(DefaultUserDefinedCS.class);}
 
     /**
      * Invoked by JAXB at unmarshalling time.
@@ -337,8 +338,9 @@ public class DefaultEngineeringCRS extends AbstractCRS implements EngineeringCRS
     private void setLinearCS     (final LinearCS      cs) {super.setCoordinateSystem("linearCS",      cs);}
     private void setPolarCS      (final PolarCS       cs) {super.setCoordinateSystem("polarCS",       cs);}
     private void setSphericalCS  (final SphericalCS   cs) {super.setCoordinateSystem("sphericalCS",   cs);}
-    @Deprecated(since = "1.5")
-    private void setUserDefinedCS(final UserDefinedCS cs) {super.setCoordinateSystem("userDefinedCS", cs);}
+
+    // Types that do not exist anymore in lastest ISO 19111 standard.
+    private void setUserDefinedCS(final DefaultUserDefinedCS cs) {super.setCoordinateSystem("userDefinedCS", cs);}
 
     /**
      * The types for which a specialized method exists.
@@ -346,7 +348,7 @@ public class DefaultEngineeringCRS extends AbstractCRS implements EngineeringCRS
      */
     @SuppressWarnings("deprecation")
     private static final Class<?>[] SPECIALIZED_TYPES = {
-        AffineCS.class, SphericalCS.class, CylindricalCS.class, PolarCS.class, LinearCS.class, UserDefinedCS.class
+        AffineCS.class, SphericalCS.class, CylindricalCS.class, PolarCS.class, LinearCS.class, DefaultUserDefinedCS.class
     };
 
     /**
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/DefaultImageCRS.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/DefaultImageCRS.java
index 6eff39afc2..e9e58b45d8 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/DefaultImageCRS.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/DefaultImageCRS.java
@@ -23,8 +23,6 @@ import jakarta.xml.bind.annotation.XmlElement;
 import jakarta.xml.bind.annotation.XmlRootElement;
 import org.opengis.referencing.cs.AffineCS;
 import org.opengis.referencing.cs.CartesianCS;
-import org.opengis.referencing.crs.ImageCRS;
-import org.opengis.referencing.datum.ImageDatum;
 import org.apache.sis.referencing.AbstractReferenceSystem;
 import org.apache.sis.referencing.privy.WKTKeywords;
 import org.apache.sis.referencing.cs.AxesConvention;
@@ -32,6 +30,9 @@ import org.apache.sis.referencing.cs.AbstractCS;
 import org.apache.sis.metadata.privy.ImplementationHelper;
 import org.apache.sis.io.wkt.Formatter;
 
+// Specific to the geoapi-4.0 branch:
+import org.apache.sis.referencing.datum.DefaultImageDatum;
+
 
 /**
  * A 2-dimensional engineering coordinate reference system applied to locations in images.
@@ -61,14 +62,14 @@ import org.apache.sis.io.wkt.Formatter;
  *
  * @since 0.4
  */
-@Deprecated(since = "1.5")
+@Deprecated(since="1.5", forRemoval=true)   // Actually to be moved to an internal package for GML and WKT purposes.
 @XmlType(name = "ImageCRSType", propOrder = {
     "cartesianCS",
     "affineCS",
     "datum"
 })
 @XmlRootElement(name = "ImageCRS")
-public class DefaultImageCRS extends AbstractCRS implements ImageCRS {
+public final class DefaultImageCRS extends AbstractCRS {
     /**
      * Serial number for inter-operability with different versions.
      */
@@ -78,12 +79,11 @@ public class DefaultImageCRS extends AbstractCRS implements ImageCRS {
      * The datum.
      *
      * <p><b>Consider this field as final!</b>
-     * This field is modified only at unmarshalling time by {@link #setDatum(ImageDatum)}</p>
+     * This field is modified only at unmarshalling time.</p>
      *
      * @see #getDatum()
      */
-    @SuppressWarnings("serial")     // Most SIS implementations are serializable.
-    private ImageDatum datum;
+    private DefaultImageDatum datum;
 
     /**
      * Creates a coordinate reference system from the given properties, datum and coordinate system.
@@ -123,12 +123,10 @@ public class DefaultImageCRS extends AbstractCRS implements ImageCRS {
      * @param  properties  the properties to be given to the coordinate reference system.
      * @param  datum       the datum.
      * @param  cs          the coordinate system.
-     *
-     * @see org.apache.sis.referencing.factory.GeodeticObjectFactory#createImageCRS(Map, ImageDatum, AffineCS)
      */
     public DefaultImageCRS(final Map<String,?> properties,
-                           final ImageDatum    datum,
-                           final AffineCS      cs)
+                           final DefaultImageDatum datum,
+                           final AffineCS cs)
     {
         super(properties, cs);
         this.datum = Objects.requireNonNull(datum);
@@ -143,53 +141,6 @@ public class DefaultImageCRS extends AbstractCRS implements ImageCRS {
         datum = original.datum;
     }
 
-    /**
-     * Constructs a new coordinate reference system with the same values as the specified one.
-     * This copy constructor provides a way to convert an arbitrary implementation into a SIS one
-     * or a user-defined one (as a subclass), usually in order to leverage some implementation-specific API.
-     *
-     * <p>This constructor performs a shallow copy, i.e. the properties are not cloned.</p>
-     *
-     * @param  crs  the coordinate reference system to copy.
-     *
-     * @see #castOrCopy(ImageCRS)
-     */
-    protected DefaultImageCRS(final ImageCRS crs) {
-        super(crs);
-        datum = crs.getDatum();
-    }
-
-    /**
-     * Returns a SIS coordinate reference system implementation with the same values as the given
-     * arbitrary implementation. If the given object is {@code null}, then this method returns {@code null}.
-     * Otherwise if the given object is already a SIS implementation, then the given object is returned unchanged.
-     * Otherwise a new SIS implementation is created and initialized to the attribute values of the given object.
-     *
-     * @param  object  the object to get as a SIS implementation, or {@code null} if none.
-     * @return a SIS implementation containing the values of the given object (may be the
-     *         given object itself), or {@code null} if the argument was null.
-     */
-    public static DefaultImageCRS castOrCopy(final ImageCRS object) {
-        return (object == null) || (object instanceof DefaultImageCRS)
-                ? (DefaultImageCRS) object : new DefaultImageCRS(object);
-    }
-
-    /**
-     * Returns the GeoAPI interface implemented by this class.
-     * The SIS implementation returns {@code ImageCRS.class}.
-     *
-     * <h4>Note for implementers</h4>
-     * Subclasses usually do not need to override this method since GeoAPI does not define {@code ImageCRS}
-     * sub-interface. Overriding possibility is left mostly for implementers who wish to extend GeoAPI with
-     * their own set of interfaces.
-     *
-     * @return {@code ImageCRS.class} or a user-defined sub-interface.
-     */
-    @Override
-    public Class<? extends ImageCRS> getInterface() {
-        return ImageCRS.class;
-    }
-
     /**
      * Returns the datum.
      *
@@ -197,7 +148,7 @@ public class DefaultImageCRS extends AbstractCRS implements ImageCRS {
      */
     @Override
     @XmlElement(name = "imageDatum", required = true)
-    public ImageDatum getDatum() {
+    public DefaultImageDatum getDatum() {
         return datum;
     }
 
@@ -287,7 +238,7 @@ public class DefaultImageCRS extends AbstractCRS implements ImageCRS {
      *
      * @see #getDatum()
      */
-    private void setDatum(final ImageDatum value) {
+    private void setDatum(final DefaultImageDatum value) {
         if (datum == null) {
             datum = value;
         } else {
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/SubTypes.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/SubTypes.java
index 1053074749..2b160b158a 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/SubTypes.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/SubTypes.java
@@ -25,7 +25,6 @@ import org.opengis.referencing.crs.EngineeringCRS;
 import org.opengis.referencing.crs.GeocentricCRS;
 import org.opengis.referencing.crs.GeodeticCRS;
 import org.opengis.referencing.crs.GeographicCRS;
-import org.opengis.referencing.crs.ImageCRS;
 import org.opengis.referencing.crs.ProjectedCRS;
 import org.opengis.referencing.crs.TemporalCRS;
 import org.opengis.referencing.crs.VerticalCRS;
@@ -154,9 +153,6 @@ final class SubTypes implements Comparator<Object> {
         if (object instanceof EngineeringCRS) {
             return DefaultEngineeringCRS.castOrCopy((EngineeringCRS) object);
         }
-        if (object instanceof ImageCRS) {
-            return DefaultImageCRS.castOrCopy((ImageCRS) object);
-        }
         if (object instanceof CompoundCRS) {
             return DefaultCompoundCRS.castOrCopy((CompoundCRS) object);
         }
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/cs/AbstractCS.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/cs/AbstractCS.java
index 1bd437faf7..a7a8ca7b3b 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/cs/AbstractCS.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/cs/AbstractCS.java
@@ -323,9 +323,8 @@ public class AbstractCS extends AbstractIdentifiedObject implements CoordinateSy
      *       {@link org.opengis.referencing.cs.CylindricalCS},
      *       {@link org.opengis.referencing.cs.PolarCS},
      *       {@link org.opengis.referencing.cs.LinearCS},
-     *       {@link org.opengis.referencing.cs.VerticalCS},
-     *       {@link org.opengis.referencing.cs.TimeCS} or
-     *       {@link org.opengis.referencing.cs.UserDefinedCS},
+     *       {@link org.opengis.referencing.cs.VerticalCS} or
+     *       {@link org.opengis.referencing.cs.TimeCS}.
      *       then this method delegates to the {@code castOrCopy(…)} method of the corresponding SIS subclass.
      *       Note that if the given object implements more than one of the above-cited interfaces,
      *       then the {@code castOrCopy(…)} method to be used is unspecified.</li>
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/cs/DefaultUserDefinedCS.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/cs/DefaultUserDefinedCS.java
index 677feb5fb1..304f1a38dd 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/cs/DefaultUserDefinedCS.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/cs/DefaultUserDefinedCS.java
@@ -19,7 +19,6 @@ package org.apache.sis.referencing.cs;
 import java.util.Map;
 import jakarta.xml.bind.annotation.XmlType;
 import jakarta.xml.bind.annotation.XmlRootElement;
-import org.opengis.referencing.cs.UserDefinedCS;
 import org.opengis.referencing.cs.CoordinateSystemAxis;
 
 
@@ -48,10 +47,10 @@ import org.opengis.referencing.cs.CoordinateSystemAxis;
  *
  * @deprecated The {@code UserDefinedCS} class has been removed from ISO 19111:2019.
  */
-@Deprecated(since = "1.5")
+@Deprecated(since="1.5", forRemoval=true)   // Actually to be moved to an internal package for GML and WKT purposes.
 @XmlType(name = "UserDefinedCSType")
 @XmlRootElement(name = "UserDefinedCS")
-public class DefaultUserDefinedCS extends AbstractCS implements UserDefinedCS {
+public final class DefaultUserDefinedCS extends AbstractCS {
     /**
      * Serial number for inter-operability with different versions.
      */
@@ -130,52 +129,6 @@ public class DefaultUserDefinedCS extends AbstractCS implements UserDefinedCS {
         super(original, name, axes);
     }
 
-    /**
-     * Creates a new coordinate system with the same values as the specified one.
-     * This copy constructor provides a way to convert an arbitrary implementation into a SIS one
-     * or a user-defined one (as a subclass), usually in order to leverage some implementation-specific API.
-     *
-     * <p>This constructor performs a shallow copy, i.e. the properties are not cloned.</p>
-     *
-     * @param  original  the coordinate system to copy.
-     *
-     * @see #castOrCopy(UserDefinedCS)
-     */
-    protected DefaultUserDefinedCS(final UserDefinedCS original) {
-        super(original);
-    }
-
-    /**
-     * Returns a SIS coordinate system implementation with the same values as the given arbitrary implementation.
-     * If the given object is {@code null}, then this method returns {@code null}.
-     * Otherwise if the given object is already a SIS implementation, then the given object is returned unchanged.
-     * Otherwise a new SIS implementation is created and initialized to the attribute values of the given object.
-     *
-     * @param  object  the object to get as a SIS implementation, or {@code null} if none.
-     * @return a SIS implementation containing the values of the given object (may be the
-     *         given object itself), or {@code null} if the argument was null.
-     */
-    public static DefaultUserDefinedCS castOrCopy(final UserDefinedCS object) {
-        return (object == null) || (object instanceof DefaultUserDefinedCS)
-                ? (DefaultUserDefinedCS) object : new DefaultUserDefinedCS(object);
-    }
-
-    /**
-     * Returns the GeoAPI interface implemented by this class.
-     * The SIS implementation returns {@code UserDefinedCS.class}.
-     *
-     * <h4>Note for implementers</h4>
-     * Subclasses usually do not need to override this method since GeoAPI does not define {@code UserDefinedCS}
-     * sub-interface. Overriding possibility is left mostly for implementers who wish to extend GeoAPI with their
-     * own set of interfaces.
-     *
-     * @return {@code UserDefinedCS.class} or a user-defined sub-interface.
-     */
-    @Override
-    public Class<? extends UserDefinedCS> getInterface() {
-        return UserDefinedCS.class;
-    }
-
     /**
      * {@inheritDoc}
      *
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/cs/SubTypes.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/cs/SubTypes.java
index 3a74904d43..47f7d4b422 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/cs/SubTypes.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/cs/SubTypes.java
@@ -27,7 +27,6 @@ import org.opengis.referencing.cs.LinearCS;
 import org.opengis.referencing.cs.PolarCS;
 import org.opengis.referencing.cs.SphericalCS;
 import org.opengis.referencing.cs.TimeCS;
-import org.opengis.referencing.cs.UserDefinedCS;
 import org.opengis.referencing.cs.VerticalCS;
 import org.apache.sis.referencing.privy.AxisDirections;
 
@@ -56,7 +55,6 @@ final class SubTypes {
      *
      * @see AbstractCS#castOrCopy(CoordinateSystem)
      */
-    @SuppressWarnings("deprecation")
     static AbstractCS castOrCopy(final CoordinateSystem object) {
         if (object instanceof AffineCS) {
             return DefaultAffineCS.castOrCopy((AffineCS) object);
@@ -82,9 +80,6 @@ final class SubTypes {
         if (object instanceof TimeCS) {
             return DefaultTimeCS.castOrCopy((TimeCS) object);
         }
-        if (object instanceof UserDefinedCS) {
-            return DefaultUserDefinedCS.castOrCopy((UserDefinedCS) object);
-        }
         /*
          * Intentionally check for AbstractCS after the interfaces because user may have defined his own
          * subclass implementing the interface. If we were checking for AbstractCS before the interfaces,
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/datum/AbstractDatum.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/datum/AbstractDatum.java
index e379725baf..e62924f482 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/datum/AbstractDatum.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/datum/AbstractDatum.java
@@ -203,9 +203,8 @@ public class AbstractDatum extends AbstractIdentifiedObject implements Datum {
      *   <li>Otherwise if the given object is an instance of
      *       {@link org.opengis.referencing.datum.GeodeticDatum},
      *       {@link org.opengis.referencing.datum.VerticalDatum},
-     *       {@link org.opengis.referencing.datum.TemporalDatum},
-     *       {@link org.opengis.referencing.datum.EngineeringDatum} or
-     *       {@link org.opengis.referencing.datum.ImageDatum},
+     *       {@link org.opengis.referencing.datum.TemporalDatum} or
+     *       {@link org.opengis.referencing.datum.EngineeringDatum},
      *       then this method delegates to the {@code castOrCopy(…)} method of the corresponding SIS subclass.
      *       Note that if the given object implements more than one of the above-cited interfaces,
      *       then the {@code castOrCopy(…)} method to be used is unspecified.</li>
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/datum/DefaultImageDatum.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/datum/DefaultImageDatum.java
index 9100a447af..2dabc1c611 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/datum/DefaultImageDatum.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/datum/DefaultImageDatum.java
@@ -23,7 +23,6 @@ import jakarta.xml.bind.annotation.XmlElement;
 import jakarta.xml.bind.annotation.XmlRootElement;
 import org.opengis.util.GenericName;
 import org.opengis.util.InternationalString;
-import org.opengis.referencing.datum.ImageDatum;
 import org.opengis.referencing.datum.PixelInCell;
 import org.apache.sis.referencing.privy.WKTKeywords;
 import org.apache.sis.metadata.privy.ImplementationHelper;
@@ -56,10 +55,10 @@ import org.opengis.metadata.Identifier;
  *
  * @since 0.4
  */
-@Deprecated(since = "1.5")
+@Deprecated(since="1.5", forRemoval=true)   // Actually to be moved to an internal package for GML and WKT purposes.
 @XmlType(name = "ImageDatumType")
 @XmlRootElement(name = "ImageDatum")
-public class DefaultImageDatum extends AbstractDatum implements ImageDatum {
+public final class DefaultImageDatum extends AbstractDatum {
     /**
      * Serial number for inter-operability with different versions.
      */
@@ -128,59 +127,11 @@ public class DefaultImageDatum extends AbstractDatum implements ImageDatum {
         this.pixelInCell = Objects.requireNonNull(pixelInCell);
     }
 
-    /**
-     * Creates a new datum with the same values as the specified one.
-     * This copy constructor provides a way to convert an arbitrary implementation into a SIS one
-     * or a user-defined one (as a subclass), usually in order to leverage some implementation-specific API.
-     *
-     * <p>This constructor performs a shallow copy, i.e. the properties are not cloned.</p>
-     *
-     * @param  datum  the datum to copy.
-     *
-     * @see #castOrCopy(ImageDatum)
-     */
-    protected DefaultImageDatum(final ImageDatum datum) {
-        super(datum);
-        pixelInCell = datum.getPixelInCell();
-    }
-
-    /**
-     * Returns a SIS datum implementation with the same values as the given arbitrary implementation.
-     * If the given object is {@code null}, then this method returns {@code null}.
-     * Otherwise if the given object is already a SIS implementation, then the given object is returned unchanged.
-     * Otherwise a new SIS implementation is created and initialized to the attribute values of the given object.
-     *
-     * @param  object  the object to get as a SIS implementation, or {@code null} if none.
-     * @return a SIS implementation containing the values of the given object (may be the
-     *         given object itself), or {@code null} if the argument was null.
-     */
-    public static DefaultImageDatum castOrCopy(final ImageDatum object) {
-        return (object == null) || (object instanceof DefaultImageDatum)
-                ? (DefaultImageDatum) object : new DefaultImageDatum(object);
-    }
-
-    /**
-     * Returns the GeoAPI interface implemented by this class.
-     * The SIS implementation returns {@code ImageDatum.class}.
-     *
-     * <h4>Note for implementers</h4>
-     * Subclasses usually do not need to override this method since GeoAPI does not define {@code ImageDatum}
-     * sub-interface. Overriding possibility is left mostly for implementers who wish to extend GeoAPI with
-     * their own set of interfaces.
-     *
-     * @return {@code ImageDatum.class} or a user-defined sub-interface.
-     */
-    @Override
-    public Class<? extends ImageDatum> getInterface() {
-        return ImageDatum.class;
-    }
-
     /**
      * Specification of the way the image grid is associated with the image data attributes.
      *
      * @return the way image grid is associated with image data attributes.
      */
-    @Override
     @XmlElement(required = true)
     public PixelInCell getPixelInCell() {
         return pixelInCell;
@@ -198,19 +149,10 @@ public class DefaultImageDatum extends AbstractDatum implements ImageDatum {
     @Override
     public boolean equals(final Object object, final ComparisonMode mode) {
         if (object == this) {
-            return true;                                                // Slight optimization.
-        }
-        if (!super.equals(object, mode)) {
-            return false;
-        }
-        switch (mode) {
-            case STRICT: {
-                return Objects.equals(pixelInCell, ((DefaultImageDatum) object).pixelInCell);
-            }
-            default: {
-                return Objects.equals(getPixelInCell(), ((ImageDatum) object).getPixelInCell());
-            }
+            return true;        // Slight optimization.
         }
+        return (object instanceof DefaultImageDatum) &&
+                Objects.equals(pixelInCell, ((DefaultImageDatum) object).pixelInCell);
     }
 
     /**
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/datum/SubTypes.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/datum/SubTypes.java
index 49e765c5a5..e5a7af5fcc 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/datum/SubTypes.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/datum/SubTypes.java
@@ -21,7 +21,6 @@ import org.opengis.referencing.datum.GeodeticDatum;
 import org.opengis.referencing.datum.VerticalDatum;
 import org.opengis.referencing.datum.TemporalDatum;
 import org.opengis.referencing.datum.EngineeringDatum;
-import org.opengis.referencing.datum.ImageDatum;
 
 
 /**
@@ -62,9 +61,6 @@ final class SubTypes {
         if (object instanceof EngineeringDatum) {
             return DefaultEngineeringDatum.castOrCopy((EngineeringDatum) object);
         }
-        if (object instanceof ImageDatum) {
-            return DefaultImageDatum.castOrCopy((ImageDatum) object);
-        }
         /*
          * Intentionally check for AbstractDatum after the interfaces because user may have defined his own
          * subclass implementing the interface. If we were checking for AbstractDatum before the interfaces,
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/AuthorityFactoryProxy.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/AuthorityFactoryProxy.java
index 4f7a0b5c3d..abe367a11d 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/AuthorityFactoryProxy.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/AuthorityFactoryProxy.java
@@ -192,9 +192,15 @@ abstract class AuthorityFactoryProxy<T> {
      */
     static final AuthorityFactoryProxy<IdentifiedObject> OBJECT =
         new AuthorityFactoryProxy<IdentifiedObject>(IdentifiedObject.class, AuthorityFactoryIdentifier.ANY) {
-            @Override IdentifiedObject createFromAPI(AuthorityFactory factory, String code) throws FactoryException {
+            @Override IdentifiedObject create(GeodeticAuthorityFactory factory, String code) throws FactoryException {
                 return factory.createObject(code);
             }
+            @Override IdentifiedObject createFromAPI(AuthorityFactory factory, String code) throws FactoryException {
+                if (factory instanceof GeodeticAuthorityFactory) {
+                    return ((GeodeticAuthorityFactory) factory).createObject(code);
+                }
+                throw new FactoryException(Errors.format(Errors.Keys.UnsupportedOperation_1, "createObject"));
+            }
     };
 
     static final AuthorityFactoryProxy<Datum> DATUM =
@@ -217,17 +223,6 @@ abstract class AuthorityFactoryProxy<T> {
             }
     };
 
-    @SuppressWarnings("deprecation")
-    static final AuthorityFactoryProxy<ImageDatum> IMAGE_DATUM =
-        new AuthorityFactoryProxy<ImageDatum>(ImageDatum.class, AuthorityFactoryIdentifier.DATUM) {
-            @Override ImageDatum create(GeodeticAuthorityFactory factory, String code) throws FactoryException {
-                return factory.createImageDatum(code);
-            }
-            @Override ImageDatum createFromAPI(AuthorityFactory factory, String code) throws FactoryException {
-                return datumFactory(factory).createImageDatum(code);
-            }
-    };
-
     static final AuthorityFactoryProxy<ParametricDatum> PARAMETRIC_DATUM =
         new AuthorityFactoryProxy<ParametricDatum>(ParametricDatum.class, AuthorityFactoryIdentifier.DATUM) {
             @Override ParametricDatum create(GeodeticAuthorityFactory factory, String code) throws FactoryException {
@@ -470,17 +465,6 @@ abstract class AuthorityFactoryProxy<T> {
             }
     };
 
-    @SuppressWarnings("deprecation")
-    static final AuthorityFactoryProxy<ImageCRS> IMAGE_CRS =
-        new AuthorityFactoryProxy<ImageCRS>(ImageCRS.class, AuthorityFactoryIdentifier.CRS) {
-            @Override ImageCRS create(GeodeticAuthorityFactory factory, String code) throws FactoryException {
-                return factory.createImageCRS(code);
-            }
-            @Override ImageCRS createFromAPI(AuthorityFactory factory, String code) throws FactoryException {
-                return crsFactory(factory).createImageCRS(code);
-            }
-    };
-
     static final AuthorityFactoryProxy<ProjectedCRS> PROJECTED_CRS =
         new AuthorityFactoryProxy<ProjectedCRS>(ProjectedCRS.class, AuthorityFactoryIdentifier.CRS) {
             @Override ProjectedCRS create(GeodeticAuthorityFactory factory, String code) throws FactoryException {
@@ -563,7 +547,6 @@ abstract class AuthorityFactoryProxy<T> {
         GEOCENTRIC_CRS,     // Special kind of GeodeticCRS.
         VERTICAL_CRS,
         TEMPORAL_CRS,
-        IMAGE_CRS,          // Can be seen as a special kind of EngineeringCRS (even if not shown in hierarchy).
         ENGINEERING_CRS,
         DERIVED_CRS,        // DerivedCRS can be also Vertical, Temporal or Engineering CRS. Give precedence to those.
         COMPOUND_CRS,
@@ -571,7 +554,6 @@ abstract class AuthorityFactoryProxy<T> {
         GEODETIC_DATUM,
         VERTICAL_DATUM,
         TEMPORAL_DATUM,
-        IMAGE_DATUM,        // Can be seen as a special kind of EngineeringDatum (even if not shown in hierarchy).
         ENGINEERING_DATUM,
         DATUM,
         ELLIPSOID,
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/ConcurrentAuthorityFactory.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/ConcurrentAuthorityFactory.java
index d298156a52..fa6331cab3 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/ConcurrentAuthorityFactory.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/ConcurrentAuthorityFactory.java
@@ -1113,33 +1113,6 @@ public abstract class ConcurrentAuthorityFactory<DAO extends GeodeticAuthorityFa
         return create(AuthorityFactoryProxy.ENGINEERING_CRS, code);
     }
 
-    /**
-     * Returns a 2-dimensional engineering coordinate reference system applied to locations in images.
-     * The default implementation performs the following steps:
-     * <ul>
-     *   <li>Return the cached instance for the given code if such instance already exists.</li>
-     *   <li>Otherwise if the Data Access Object (DAO) overrides the {@code createImageCRS(String)}
-     *       method, invoke that method and cache the result for future use.</li>
-     *   <li>Otherwise delegate to the {@link GeodeticAuthorityFactory#createImageCRS(String)}
-     *       method in the parent class. This allows to check if the more generic
-     *       {@link #createCoordinateReferenceSystem(String)} method cached a value before to try that method.</li>
-     * </ul>
-     *
-     * @return the coordinate reference system for the given code.
-     * @throws FactoryException if the object creation failed.
-     *
-     * @deprecated The {@code ImageCRS} class has been removed in ISO 19111:2019.
-     *             It is replaced by {@code EngineeringCRS}.
-     */
-    @Override
-    @Deprecated(since = "1.5")
-    public ImageCRS createImageCRS(final String code) throws FactoryException {
-        if (isDefault(ImageCRS.class)) {
-            return super.createImageCRS(code);
-        }
-        return create(AuthorityFactoryProxy.IMAGE_CRS, code);
-    }
-
     /**
      * Returns an arbitrary datum from a code. The returned object will typically be an
      * The default implementation performs the following steps:
@@ -1280,33 +1253,6 @@ public abstract class ConcurrentAuthorityFactory<DAO extends GeodeticAuthorityFa
         return create(AuthorityFactoryProxy.ENGINEERING_DATUM, code);
     }
 
-    /**
-     * Returns a datum defining the origin of an image coordinate reference system.
-     * The default implementation performs the following steps:
-     * <ul>
-     *   <li>Return the cached instance for the given code if such instance already exists.</li>
-     *   <li>Otherwise if the Data Access Object (DAO) overrides the {@code createImageDatum(String)}
-     *       method, invoke that method and cache the result for future use.</li>
-     *   <li>Otherwise delegate to the {@link GeodeticAuthorityFactory#createImageDatum(String)}
-     *       method in the parent class. This allows to check if the more generic
-     *       {@link #createDatum(String)} method cached a value before to try that method.</li>
-     * </ul>
-     *
-     * @return the datum for the given code.
-     * @throws FactoryException if the object creation failed.
-     *
-     * @deprecated The {@code ImageDatum} class has been removed in ISO 19111:2019.
-     *             It is replaced by {@code EngineeringDatum}.
-     */
-    @Override
-    @Deprecated(since = "1.5")
-    public ImageDatum createImageDatum(final String code) throws FactoryException {
-        if (isDefault(ImageDatum.class)) {
-            return super.createImageDatum(code);
-        }
-        return create(AuthorityFactoryProxy.IMAGE_DATUM, code);
-    }
-
     /**
      * Returns a geometric figure that can be used to describe the approximate shape of the earth.
      * The default implementation performs the following steps:
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/GeodeticAuthorityFactory.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/GeodeticAuthorityFactory.java
index 45f6fa8d79..338d80a203 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/GeodeticAuthorityFactory.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/GeodeticAuthorityFactory.java
@@ -211,8 +211,6 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      *
      * @see org.apache.sis.referencing.AbstractIdentifiedObject
      */
-    @Override
-    @SuppressWarnings("deprecation")
     public abstract IdentifiedObject createObject(String code) throws NoSuchAuthorityCodeException, FactoryException;
 
     /**
@@ -526,30 +524,6 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
         return cast(EngineeringCRS.class, createCoordinateReferenceSystem(code), code);
     }
 
-    /**
-     * Creates a 2-dimensional engineering coordinate reference system applied to locations in images.
-     * Image coordinate reference systems are treated as a separate sub-type because a separate
-     * user community exists for images with its own terms of reference.
-     *
-     * <h4>Default implementation</h4>
-     * The default implementation delegates to {@link #createCoordinateReferenceSystem(String)} and casts the result.
-     * If the result cannot be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
-     *
-     * @param  code  value allocated by authority.
-     * @return the coordinate reference system for the given code.
-     * @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
-     * @throws FactoryException if the object creation failed for some other reason.
-     *
-     * @see org.apache.sis.referencing.crs.DefaultImageCRS
-     *
-     * @deprecated The {@code ImageCRS} class has been removed in ISO 19111:2019.
-     *             It is replaced by {@code EngineeringCRS}.
-     */
-    @Deprecated(since = "1.5")
-    public ImageCRS createImageCRS(final String code) throws NoSuchAuthorityCodeException, FactoryException {
-        return cast(ImageCRS.class, createCoordinateReferenceSystem(code), code);
-    }
-
     /**
      * Creates an arbitrary datum from a code. The returned object will typically be an
      * instance of {@link GeodeticDatum}, {@link VerticalDatum} or {@link TemporalDatum}.
@@ -724,30 +698,6 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
         return cast(EngineeringDatum.class, createDatum(code), code);
     }
 
-    /**
-     * Creates a datum defining the origin of an image coordinate reference system.
-     * An image datum is used in a local context only.
-     * For an image datum, the anchor point is usually either the centre of the image or the corner of the image.
-     *
-     * <h4>Default implementation</h4>
-     * The default implementation delegates to {@link #createDatum(String)} and casts the result.
-     * If the result cannot be casted, then a {@link NoSuchAuthorityCodeException} is thrown.
-     *
-     * @param  code  value allocated by authority.
-     * @return the datum for the given code.
-     * @throws NoSuchAuthorityCodeException if the specified {@code code} was not found.
-     * @throws FactoryException if the object creation failed for some other reason.
-     *
-     * @see org.apache.sis.referencing.datum.DefaultImageDatum
-     *
-     * @deprecated The {@code ImageDatum} class has been removed in ISO 19111:2019.
-     *             It is replaced by {@code EngineeringDatum}.
-     */
-    @Deprecated(since = "1.5")
-    public ImageDatum createImageDatum(final String code) throws NoSuchAuthorityCodeException, FactoryException {
-        return cast(ImageDatum.class, createDatum(code), code);
-    }
-
     /**
      * Creates a geometric figure that can be used to describe the approximate shape of the earth.
      * In mathematical terms, it is a surface formed by the rotation of an ellipse about its minor axis.
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 b3079f115b..0af6cb5ee8 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
@@ -177,7 +177,7 @@ import org.apache.sis.xml.XML;
  * @author  Martin Desruisseaux (IRD, Geomatys)
  * @author  Guilhem Legal (Geomatys)
  * @author  Johann Sorel (Geomatys)
- * @version 1.4
+ * @version 1.5
  * @since   0.6
  */
 public class GeodeticObjectFactory extends AbstractFactory implements CRSFactory, CSFactory, DatumFactory, Parser {
@@ -1201,63 +1201,6 @@ public class GeodeticObjectFactory extends AbstractFactory implements CRSFactory
         return unique("createCompoundCRS", crs);
     }
 
-    /**
-     * Creates an image coordinate reference system.
-     * The default implementation creates a {@link DefaultImageCRS} instance.
-     *
-     * @param  properties  name and other properties to give to the new object.
-     * @param  datum       the image datum to use in created CRS.
-     * @param  cs          the Cartesian or oblique Cartesian coordinate system for the created CRS.
-     * @throws FactoryException if the object creation failed.
-     *
-     * @see DefaultImageCRS#DefaultImageCRS(Map, ImageDatum, AffineCS)
-     * @see GeodeticAuthorityFactory#createImageCRS(String)
-     *
-     * @deprecated The {@code ImageCRS} class has been removed in ISO 19111:2019.
-     *             It is replaced by {@code EngineeringCRS}.
-     */
-    @Override
-    @Deprecated(since = "1.5")
-    public ImageCRS createImageCRS(final Map<String,?> properties,
-            final ImageDatum datum, final AffineCS cs) throws FactoryException
-    {
-        final DefaultImageCRS crs;
-        try {
-            crs = new DefaultImageCRS(complete(properties), datum, cs);
-        } catch (IllegalArgumentException exception) {
-            throw new InvalidGeodeticParameterException(exception);
-        }
-        return unique("createImageCRS", crs);
-    }
-
-    /**
-     * Creates an image datum.
-     * The default implementation creates a {@link DefaultImageDatum} instance.
-     *
-     * @param  properties  Name and other properties to give to the new object.
-     * @param  pixelInCell Specification of the way the image grid is associated with the image data attributes.
-     * @throws FactoryException if the object creation failed.
-     *
-     * @see DefaultImageDatum#DefaultImageDatum(Map, PixelInCell)
-     * @see GeodeticAuthorityFactory#createImageDatum(String)
-     *
-     * @deprecated The {@code ImageDatum} class has been removed in ISO 19111:2019.
-     *             It is replaced by {@code EngineeringDatum}.
-     */
-    @Override
-    @Deprecated(since = "1.5")
-    public ImageDatum createImageDatum(final Map<String,?> properties,
-            final PixelInCell pixelInCell) throws FactoryException
-    {
-        final DefaultImageDatum datum;
-        try {
-            datum = new DefaultImageDatum(complete(properties), pixelInCell);
-        } catch (IllegalArgumentException exception) {
-            throw new InvalidGeodeticParameterException(exception);
-        }
-        return unique("createImageDatum", datum);
-    }
-
     /**
      * Creates a two-dimensional affine coordinate system from the given pair of axis.
      * This coordinate system can be used with image and engineering CRS.
@@ -1490,80 +1433,6 @@ public class GeodeticObjectFactory extends AbstractFactory implements CRSFactory
         return unique("createLinearCS", cs);
     }
 
-    /**
-     * Creates a two-dimensional user defined coordinate system from the given pair of axis.
-     * This coordinate system can be used with engineering CRS.
-     *
-     * <h4>Dependencies</h4>
-     * The components needed by this method can be created by the following methods:
-     * <ol>
-     *   <li>{@link #createCoordinateSystemAxis(Map, String, AxisDirection, Unit)}</li>
-     * </ol>
-     *
-     * The default implementation creates a {@link DefaultUserDefinedCS} instance.
-     *
-     * @param  properties  name and other properties to give to the new object.
-     * @param  axis0       the first  axis.
-     * @param  axis1       the second axis.
-     * @throws FactoryException if the object creation failed.
-     *
-     * @see DefaultUserDefinedCS#DefaultUserDefinedCS(Map, CoordinateSystemAxis, CoordinateSystemAxis)
-     *
-     * @deprecated The {@code UserDefinedCS} class has been removed from ISO 19111:2019.
-     */
-    @Override
-    @Deprecated(since = "1.5")
-    public UserDefinedCS createUserDefinedCS(final Map<String,?> properties,
-            final CoordinateSystemAxis axis0,
-            final CoordinateSystemAxis axis1) throws FactoryException
-    {
-        final DefaultUserDefinedCS cs;
-        try {
-            cs = new DefaultUserDefinedCS(complete(properties), axis0, axis1);
-        } catch (IllegalArgumentException exception) {
-            throw new InvalidGeodeticParameterException(exception);
-        }
-        return unique("createUserDefinedCS", cs);
-    }
-
-    /**
-     * Creates a three-dimensional user defined coordinate system from the given set of axis.
-     * This coordinate system can be used with engineering CRS.
-     *
-     * <h4>Dependencies</h4>
-     * The components needed by this method can be created by the following methods:
-     * <ol>
-     *   <li>{@link #createCoordinateSystemAxis(Map, String, AxisDirection, Unit)}</li>
-     * </ol>
-     *
-     * The default implementation creates a {@link DefaultUserDefinedCS} instance.
-     *
-     * @param  properties  name and other properties to give to the new object.
-     * @param  axis0       the first  axis.
-     * @param  axis1       the second axis.
-     * @param  axis2       the third  axis.
-     * @throws FactoryException if the object creation failed.
-     *
-     * @see DefaultUserDefinedCS#DefaultUserDefinedCS(Map, CoordinateSystemAxis, CoordinateSystemAxis, CoordinateSystemAxis)
-     *
-     * @deprecated The {@code UserDefinedCS} class has been removed from ISO 19111:2019.
-     */
-    @Override
-    @Deprecated(since = "1.5")
-    public UserDefinedCS createUserDefinedCS(final Map<String,?> properties,
-            final CoordinateSystemAxis axis0,
-            final CoordinateSystemAxis axis1,
-            final CoordinateSystemAxis axis2) throws FactoryException
-    {
-        final DefaultUserDefinedCS cs;
-        try {
-            cs = new DefaultUserDefinedCS(complete(properties), axis0, axis1, axis2);
-        } catch (IllegalArgumentException exception) {
-            throw new InvalidGeodeticParameterException(exception);
-        }
-        return unique("createUserDefinedCS", cs);
-    }
-
     /**
      * Creates a coordinate system axis from an abbreviation and a unit.
      * Note that the axis name is constrained by ISO 19111 depending on the coordinate reference system type.
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/MultiAuthoritiesFactory.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/MultiAuthoritiesFactory.java
index 2e9feec087..a3a645da73 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/MultiAuthoritiesFactory.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/MultiAuthoritiesFactory.java
@@ -1080,29 +1080,6 @@ public class MultiAuthoritiesFactory extends GeodeticAuthorityFactory implements
         return create(AuthorityFactoryProxy.ENGINEERING_CRS, code);
     }
 
-    /**
-     * Creates a 2-dimensional engineering coordinate reference system applied to locations in images.
-     * The given code can use any of the following patterns, where <var>version</var> is optional:
-     * <ul>
-     *   <li><var>authority</var>{@code :}<var>code</var></li>
-     *   <li><var>authority</var>{@code :}<var>version</var>{@code :}<var>code</var></li>
-     *   <li><code>urn:ogc:def:<b>crs</b>:</code><var>authority</var>{@code :}<var>version</var>{@code :}<var>code</var></li>
-     *   <li><code>http://www.opengis.net/def/<b>crs</b>/</code><var>authority</var>{@code /}<var>version</var>{@code /}<var>code</var></li>
-     *   <li>{@code http://www.opengis.net/gml/srs/}<var>authority</var>{@code .xml#}<var>code</var></li>
-     * </ul>
-     *
-     * @return the coordinate reference system for the given code.
-     * @throws FactoryException if the object creation failed.
-     *
-     * @deprecated The {@code ImageCRS} class has been removed in ISO 19111:2019.
-     *             It is replaced by {@code EngineeringCRS}.
-     */
-    @Override
-    @Deprecated(since = "1.5")
-    public ImageCRS createImageCRS(final String code) throws FactoryException {
-        return create(AuthorityFactoryProxy.IMAGE_CRS, code);
-    }
-
     /**
      * Creates an arbitrary datum from a code. The returned object will typically be an
      * The given code can use any of the following patterns, where <var>version</var> is optional:
@@ -1193,28 +1170,6 @@ public class MultiAuthoritiesFactory extends GeodeticAuthorityFactory implements
         return create(AuthorityFactoryProxy.ENGINEERING_DATUM, code);
     }
 
-    /**
-     * Creates a datum defining the origin of an image coordinate reference system.
-     * The given code can use any of the following patterns, where <var>version</var> is optional:
-     * <ul>
-     *   <li><var>authority</var>{@code :}<var>code</var></li>
-     *   <li><var>authority</var>{@code :}<var>version</var>{@code :}<var>code</var></li>
-     *   <li><code>urn:ogc:def:<b>datum</b>:</code><var>authority</var>{@code :}<var>version</var>{@code :}<var>code</var></li>
-     *   <li><code>http://www.opengis.net/def/<b>datum</b>/</code><var>authority</var>{@code /}<var>version</var>{@code /}<var>code</var></li>
-     * </ul>
-     *
-     * @return the datum for the given code.
-     * @throws FactoryException if the object creation failed.
-     *
-     * @deprecated The {@code ImageDatum} class has been removed in ISO 19111:2019.
-     *             It is replaced by {@code EngineeringDatum}.
-     */
-    @Override
-    @Deprecated(since = "1.5")
-    public ImageDatum createImageDatum(final String code) throws FactoryException {
-        return create(AuthorityFactoryProxy.IMAGE_DATUM, code);
-    }
-
     /**
      * Creates a geometric figure that can be used to describe the approximate shape of the earth.
      * The given code can use any of the following patterns, where <var>version</var> is optional:
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/EPSGFactoryProxy.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/EPSGFactoryProxy.java
index d6eaeb701f..a4a079fcdf 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/EPSGFactoryProxy.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/EPSGFactoryProxy.java
@@ -65,12 +65,6 @@ public abstract class EPSGFactoryProxy implements AuthorityFactory {
         return factory().getDescriptionText(type, code);
     }
 
-    @Override
-    @SuppressWarnings("deprecation")
-    public final IdentifiedObject createObject(String code) throws FactoryException {
-        return factory().createObject(code);
-    }
-
     @Override
     public final Set<String> getAuthorityCodes(Class<? extends IdentifiedObject> type) throws FactoryException {
         return factory().getAuthorityCodes(type);
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/EPSGFactoryProxyCRS.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/EPSGFactoryProxyCRS.java
index 0f6ca0aa37..d257e5d221 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/EPSGFactoryProxyCRS.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/EPSGFactoryProxyCRS.java
@@ -23,7 +23,6 @@ import org.opengis.referencing.crs.DerivedCRS;
 import org.opengis.referencing.crs.EngineeringCRS;
 import org.opengis.referencing.crs.GeocentricCRS;
 import org.opengis.referencing.crs.GeographicCRS;
-import org.opengis.referencing.crs.ImageCRS;
 import org.opengis.referencing.crs.ProjectedCRS;
 import org.opengis.referencing.crs.TemporalCRS;
 import org.opengis.referencing.crs.VerticalCRS;
@@ -85,12 +84,6 @@ public final class EPSGFactoryProxyCRS extends EPSGFactoryProxy implements CRSAu
         return factory().createGeocentricCRS(code);
     }
 
-    @Override
-    @Deprecated(since = "1.5")
-    public ImageCRS createImageCRS(String code) throws FactoryException {
-        return factory().createImageCRS(code);
-    }
-
     @Override
     public ProjectedCRS createProjectedCRS(String code) throws FactoryException {
         return factory().createProjectedCRS(code);
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/EPSGFactoryProxyDatum.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/EPSGFactoryProxyDatum.java
index ae1f696a1d..399d5dd277 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/EPSGFactoryProxyDatum.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/EPSGFactoryProxyDatum.java
@@ -22,7 +22,6 @@ import org.opengis.referencing.datum.Ellipsoid;
 import org.opengis.referencing.datum.GeodeticDatum;
 import org.opengis.referencing.datum.PrimeMeridian;
 import org.opengis.referencing.datum.EngineeringDatum;
-import org.opengis.referencing.datum.ImageDatum;
 import org.opengis.referencing.datum.TemporalDatum;
 import org.opengis.referencing.datum.VerticalDatum;
 import org.opengis.util.FactoryException;
@@ -75,12 +74,6 @@ public final class EPSGFactoryProxyDatum extends EPSGFactoryProxy implements Dat
         return factory().createEngineeringDatum(code);
     }
 
-    @Override
-    @Deprecated(since = "1.5")
-    public ImageDatum createImageDatum(String code) throws FactoryException {
-        return factory().createImageDatum(code);
-    }
-
     @Override
     public TemporalDatum createTemporalDatum(String code) throws FactoryException {
         return factory().createTemporalDatum(code);
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/SubOperationInfo.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/SubOperationInfo.java
index 06c84c9d90..2c0e08999d 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/SubOperationInfo.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/SubOperationInfo.java
@@ -25,6 +25,9 @@ import org.opengis.util.FactoryException;
 import org.apache.sis.referencing.operation.matrix.Matrices;
 import org.apache.sis.referencing.operation.matrix.MatrixSIS;
 
+// Specific to the geoapi-4.0 branch:
+import org.apache.sis.referencing.crs.DefaultImageCRS;
+
 
 /**
  * Information about the operation from a source component to a target component in {@code CompoundCRS} instances.
@@ -51,14 +54,13 @@ final class SubOperationInfo {
      * {@link ProjectedCRS} and {@link DerivedCRS} are not in this list because we rather use their base CRS
      * as the criterion for determining their type.
      */
-    @SuppressWarnings("deprecation")
     private static final Class<?>[][] COMPATIBLE_TYPES = {
         {GeodeticCRS.class},
         {VerticalCRS.class, GeodeticCRS.class},
         {TemporalCRS.class},
         {ParametricCRS.class},
         {EngineeringCRS.class},
-        {ImageCRS.class}
+        {DefaultImageCRS.class}
     };
 
     /**
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/xml/bind/referencing/CD_ImageDatum.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/xml/bind/referencing/CD_ImageDatum.java
index d0574355b3..2e1c5d77f1 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/xml/bind/referencing/CD_ImageDatum.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/xml/bind/referencing/CD_ImageDatum.java
@@ -17,7 +17,6 @@
 package org.apache.sis.xml.bind.referencing;
 
 import jakarta.xml.bind.annotation.XmlElement;
-import org.opengis.referencing.datum.ImageDatum;
 import org.apache.sis.xml.bind.gco.PropertyType;
 import org.apache.sis.referencing.datum.DefaultImageDatum;
 
@@ -29,8 +28,7 @@ import org.apache.sis.referencing.datum.DefaultImageDatum;
  * @author  Cédric Briançon (Geomatys)
  * @author  Martin Desruisseaux (Geomatys)
  */
-@SuppressWarnings("deprecation")
-public final class CD_ImageDatum extends PropertyType<CD_ImageDatum, ImageDatum> {
+public final class CD_ImageDatum extends PropertyType<CD_ImageDatum, DefaultImageDatum> {
     /**
      * Empty constructor for JAXB only.
      */
@@ -45,14 +43,14 @@ public final class CD_ImageDatum extends PropertyType<CD_ImageDatum, ImageDatum>
      * @return {@code ImageDatum.class}
      */
     @Override
-    protected Class<ImageDatum> getBoundType() {
-        return ImageDatum.class;
+    protected Class<DefaultImageDatum> getBoundType() {
+        return DefaultImageDatum.class;
     }
 
     /**
      * Constructor for the {@link #wrap} method only.
      */
-    private CD_ImageDatum(final ImageDatum datum) {
+    private CD_ImageDatum(final DefaultImageDatum datum) {
         super(datum);
     }
 
@@ -64,7 +62,7 @@ public final class CD_ImageDatum extends PropertyType<CD_ImageDatum, ImageDatum>
      * @return a {@code PropertyType} wrapping the given the element.
      */
     @Override
-    protected CD_ImageDatum wrap(final ImageDatum datum) {
+    protected CD_ImageDatum wrap(final DefaultImageDatum datum) {
         return new CD_ImageDatum(datum);
     }
 
@@ -77,7 +75,7 @@ public final class CD_ImageDatum extends PropertyType<CD_ImageDatum, ImageDatum>
      */
     @XmlElement(name = "ImageDatum")
     public DefaultImageDatum getElement() {
-        return DefaultImageDatum.castOrCopy(metadata);
+        return metadata;
     }
 
     /**
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/xml/bind/referencing/CS_UserDefinedCS.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/xml/bind/referencing/CS_UserDefinedCS.java
index 41ee56e38c..488042cc75 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/xml/bind/referencing/CS_UserDefinedCS.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/xml/bind/referencing/CS_UserDefinedCS.java
@@ -17,7 +17,6 @@
 package org.apache.sis.xml.bind.referencing;
 
 import jakarta.xml.bind.annotation.XmlElement;
-import org.opengis.referencing.cs.UserDefinedCS;
 import org.apache.sis.referencing.cs.DefaultUserDefinedCS;
 import org.apache.sis.xml.bind.gco.PropertyType;
 
@@ -28,8 +27,7 @@ import org.apache.sis.xml.bind.gco.PropertyType;
  *
  * @author  Martin Desruisseaux (Geomatys)
  */
-@SuppressWarnings("deprecation")
-public final class CS_UserDefinedCS extends PropertyType<CS_UserDefinedCS, UserDefinedCS> {
+public final class CS_UserDefinedCS extends PropertyType<CS_UserDefinedCS, DefaultUserDefinedCS> {
     /**
      * Empty constructor for JAXB only.
      */
@@ -44,14 +42,14 @@ public final class CS_UserDefinedCS extends PropertyType<CS_UserDefinedCS, UserD
      * @return {@code UserDefinedCS.class}
      */
     @Override
-    protected Class<UserDefinedCS> getBoundType() {
-        return UserDefinedCS.class;
+    protected Class<DefaultUserDefinedCS> getBoundType() {
+        return DefaultUserDefinedCS.class;
     }
 
     /**
      * Constructor for the {@link #wrap} method only.
      */
-    private CS_UserDefinedCS(final UserDefinedCS cs) {
+    private CS_UserDefinedCS(final DefaultUserDefinedCS cs) {
         super(cs);
     }
 
@@ -63,7 +61,7 @@ public final class CS_UserDefinedCS extends PropertyType<CS_UserDefinedCS, UserD
      * @return a {@code PropertyType} wrapping the given the element.
      */
     @Override
-    protected CS_UserDefinedCS wrap(final UserDefinedCS cs) {
+    protected CS_UserDefinedCS wrap(final DefaultUserDefinedCS cs) {
         return new CS_UserDefinedCS(cs);
     }
 
@@ -76,7 +74,7 @@ public final class CS_UserDefinedCS extends PropertyType<CS_UserDefinedCS, UserD
      */
     @XmlElement(name = "UserDefinedCS")
     public DefaultUserDefinedCS getElement() {
-        return DefaultUserDefinedCS.castOrCopy(metadata);
+        return metadata;
     }
 
     /**
diff --git a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/AuthorityFactoriesTest.java b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/AuthorityFactoriesTest.java
index 7b24a3965d..1592f40443 100644
--- a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/AuthorityFactoriesTest.java
+++ b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/AuthorityFactoriesTest.java
@@ -30,6 +30,7 @@ import org.apache.sis.util.privy.Constants;
 import org.apache.sis.referencing.internal.EPSGFactoryProxy;
 import org.apache.sis.referencing.factory.CommonAuthorityFactory;
 import org.apache.sis.referencing.factory.IdentifiedObjectFinder;
+import org.apache.sis.referencing.factory.GeodeticAuthorityFactory;
 
 // Test dependencies
 import org.junit.jupiter.api.Test;
@@ -160,7 +161,7 @@ public final class AuthorityFactoriesTest extends TestCaseWithLogs {
      */
     @Test
     public void testCreateCRS() throws FactoryException {
-        final CRSAuthorityFactory factory = AuthorityFactories.ALL;
+        final GeodeticAuthorityFactory factory = AuthorityFactories.ALL;
         final CRSAuthorityFactory wms = AuthorityFactories.ALL.getAuthorityFactory(CRSAuthorityFactory.class, Constants.OGC, null);
         CoordinateReferenceSystem actual, expected;
 
diff --git a/geoapi/snapshot b/geoapi/snapshot
index c8e052d679..622eb1227c 160000
--- a/geoapi/snapshot
+++ b/geoapi/snapshot
@@ -1 +1 @@
-Subproject commit c8e052d67955103c0224e2a91c8e5ffe6e751e14
+Subproject commit 622eb1227c8c04cf243747f3426e66565453cbb9


(sis) 01/02: Post-merge cleanup. The `DefaultGeocentricCRS` class and its factory methods are marked as deprecated since 2.0 instead of 1.5 because we will not deprecate that class in the branch that depends on GeoAPI 3.0, because there is no replacement. The replacements will need to wait for GeoAPI 3.1.

Posted by de...@apache.org.
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 cfb0e166e291a96049faff4cb9a9d1c7230f8786
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Fri Apr 5 16:37:00 2024 +0200

    Post-merge cleanup.
    The `DefaultGeocentricCRS` class and its factory methods are marked as deprecated since 2.0 instead of 1.5
    because we will not deprecate that class in the branch that depends on GeoAPI 3.0, because there is no replacement.
    The replacements will need to wait for GeoAPI 3.1.
---
 .../main/org/apache/sis/util/iso/Types.java          |  4 ++--
 .../apache/sis/metadata/PropertyAccessorTest.java    |  2 +-
 .../main/org/apache/sis/referencing/CRS.java         | 20 ++++++++++++++------
 .../sis/referencing/crs/DefaultGeocentricCRS.java    |  2 +-
 .../factory/ConcurrentAuthorityFactory.java          |  2 +-
 .../factory/GeodeticAuthorityFactory.java            |  2 +-
 .../referencing/factory/GeodeticObjectFactory.java   | 10 +++++-----
 .../referencing/factory/MultiAuthoritiesFactory.java |  2 +-
 .../referencing/internal/EPSGFactoryProxyCRS.java    |  2 +-
 .../apache/sis/referencing/internal/Resources.java   |  5 +++++
 .../sis/referencing/internal/Resources.properties    |  1 +
 .../sis/referencing/internal/Resources_fr.properties |  1 +
 .../operation/AbstractCoordinateOperation.java       |  2 +-
 .../operation/TransformedCoordinateSet.java          |  2 +-
 .../referencing/factory/AuthorityFactoryMock.java    |  3 +++
 .../operation/provider/ProvidersTest.java            |  1 -
 16 files changed, 39 insertions(+), 22 deletions(-)

diff --git a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/util/iso/Types.java b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/util/iso/Types.java
index af97040987..fabfd4b0d5 100644
--- a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/util/iso/Types.java
+++ b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/util/iso/Types.java
@@ -506,8 +506,8 @@ public final class Types extends Static {
      * The package prefix (e.g. {@code "CI_"} in {@code "CI_Citation"}) can be omitted.
      * The flexibility is provided for allowing transition to newer ISO standards,
      * which are dropping the package prefixes.
-     * For example, {@code "AxisDirection"} in ISO 19111:2007
-     * has been renamed {@code "AxisDirection"} in ISO 19111:2018.
+     * For example, {@code "CS_AxisDirection"} in ISO 19111:2007
+     * has been renamed {@code "AxisDirection"} in ISO 19111:2019.
      *
      * <p>Only identifiers for the stable part of GeoAPI or for some Apache SIS classes are recognized.
      * This method does not handle the identifiers for interfaces in the {@code geoapi-pending} module.</p>
diff --git a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/PropertyAccessorTest.java b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/PropertyAccessorTest.java
index c54740d362..22c99e5890 100644
--- a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/PropertyAccessorTest.java
+++ b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/PropertyAccessorTest.java
@@ -64,12 +64,12 @@ import static org.apache.sis.metadata.Assertions.assertTitleEquals;
 
 // Specific to the geoapi-3.1 and geoapi-4.0 branches:
 import org.opengis.metadata.content.AttributeGroup;
+import org.opengis.referencing.datum.DatumEnsemble;
 import org.opengis.referencing.ObjectDomain;
 import org.opengis.temporal.Duration;
 
 // Specific to the geoapi-4.0 branch:
 import org.opengis.metadata.citation.Responsibility;
-import org.opengis.referencing.datum.DatumEnsemble;
 
 
 /**
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/CRS.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/CRS.java
index 502d5a95ec..3e50020cb0 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/CRS.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/CRS.java
@@ -958,30 +958,38 @@ public final class CRS extends Static {
 
     /**
      * Returns the epoch to which the coordinates of stations defining the dynamic CRS are referenced.
-     * If the CRS is associated to a {@linkplain DynamicReferenceFrame dynamic datum}, then reference
-     * epoch of that datum is returned. Otherwise if the CRS is {@linkplain CompoundCRS compound},
-     * then the first reference epoch found in a component is returned.
+     * If the CRS is associated to a {@linkplain DynamicReferenceFrame dynamic datum}, then the epoch
+     * of that datum is returned. Otherwise if the CRS is {@linkplain CompoundCRS compound}, then this
+     * method requires that all dynamic components have the same epoch.
      *
      * @param  crs  the coordinate reference frame from which to get the epoch, or {@code null}.
      * @return epoch to which the coordinates of stations defining the dynamic CRS frame are referenced.
+     * @throws GeodeticException if some CRS components haave different epochs.
      *
      * @since 1.5
      */
     public static Optional<Temporal> getFrameReferenceEpoch(final CoordinateReferenceSystem crs) {
+        Temporal epoch = null;
         if (crs instanceof SingleCRS) {
             final Datum datum = ((SingleCRS) crs).getDatum();
             if (datum instanceof DynamicReferenceFrame) {
-                return Optional.of(((DynamicReferenceFrame) datum).getFrameReferenceEpoch());
+                epoch = ((DynamicReferenceFrame) datum).getFrameReferenceEpoch();
             }
         } else if (crs instanceof CompoundCRS) {
             for (SingleCRS component : ((CompoundCRS) crs).getSingleComponents()) {
                 final Datum datum = component.getDatum();
                 if (datum instanceof DynamicReferenceFrame) {
-                    return Optional.of(((DynamicReferenceFrame) datum).getFrameReferenceEpoch());
+                    final Temporal t = ((DynamicReferenceFrame) datum).getFrameReferenceEpoch();
+                    if (t != null) {
+                        if (epoch == null) epoch = t;
+                        else if (!epoch.equals(t)) {
+                            throw new GeodeticException(Resources.format(Resources.Keys.InconsistentEpochs_2, epoch, t));
+                        }
+                    }
                 }
             }
         }
-        return Optional.empty();
+        return Optional.ofNullable(epoch);
     }
 
     /**
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/DefaultGeocentricCRS.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/DefaultGeocentricCRS.java
index fd38c79180..e8cb41b856 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/DefaultGeocentricCRS.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/crs/DefaultGeocentricCRS.java
@@ -79,7 +79,7 @@ import org.apache.sis.io.wkt.Formatter;
  * @since 0.4
  */
 @XmlTransient
-@Deprecated(since = "1.5")
+@Deprecated(since = "2.0")
 public class DefaultGeocentricCRS extends DefaultGeodeticCRS implements GeocentricCRS {
     /**
      * Serial number for inter-operability with different versions.
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/ConcurrentAuthorityFactory.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/ConcurrentAuthorityFactory.java
index f32cffccf1..d298156a52 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/ConcurrentAuthorityFactory.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/ConcurrentAuthorityFactory.java
@@ -942,7 +942,7 @@ public abstract class ConcurrentAuthorityFactory<DAO extends GeodeticAuthorityFa
      *             The {@code GeodeticCRS} parent class should be used instead.
      */
     @Override
-    @Deprecated(since = "1.5")
+    @Deprecated(since = "2.0")
     public GeocentricCRS createGeocentricCRS(final String code) throws FactoryException {
         if (isDefault(GeocentricCRS.class)) {
             return super.createGeocentricCRS(code);
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/GeodeticAuthorityFactory.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/GeodeticAuthorityFactory.java
index 981f93e539..45f6fa8d79 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/GeodeticAuthorityFactory.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/GeodeticAuthorityFactory.java
@@ -338,7 +338,7 @@ public abstract class GeodeticAuthorityFactory extends AbstractFactory implement
      * @deprecated ISO 19111:2019 does not define an explicit class for geocentric CRS.
      *             The {@code GeodeticCRS} parent class should be used instead.
      */
-    @Deprecated(since = "1.5")
+    @Deprecated(since = "2.0")
     public GeocentricCRS createGeocentricCRS(final String code) throws NoSuchAuthorityCodeException, FactoryException {
         return cast(GeocentricCRS.class, createCoordinateReferenceSystem(code), code);
     }
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 2778ac1f24..b3079f115b 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
@@ -146,9 +146,9 @@ import org.apache.sis.xml.XML;
  *     <td>{@link InternationalString} or {@link String}</td>
  *     <td>{@link AbstractDatum#getAnchorDefinition()}</td>
  *   </tr><tr>
-     *     <td>{@value org.opengis.referencing.datum.Datum#ANCHOR_EPOCH_KEY}</td>
-     *     <td>{@link java.time.temporal.Temporal}</td>
-     *     <td>{@link AbstractDatum#getAnchorEpoch()}</td>
+ *     <td>{@value org.opengis.referencing.datum.Datum#ANCHOR_EPOCH_KEY}</td>
+ *     <td>{@link java.time.temporal.Temporal}</td>
+ *     <td>{@link AbstractDatum#getAnchorEpoch()}</td>
  *   </tr><tr>
  *     <td>{@value org.opengis.referencing.IdentifiedObject#REMARKS_KEY}</td>
  *     <td>{@link InternationalString} or {@link String}</td>
@@ -355,7 +355,7 @@ public class GeodeticObjectFactory extends AbstractFactory implements CRSFactory
      *             The {@code GeodeticCRS} parent class should be used instead.
      */
     @Override
-    @Deprecated(since = "1.5")
+    @Deprecated(since = "2.0")
     public GeocentricCRS createGeocentricCRS(final Map<String,?> properties,
             final GeodeticDatum datum, final CartesianCS cs) throws FactoryException
     {
@@ -437,7 +437,7 @@ public class GeodeticObjectFactory extends AbstractFactory implements CRSFactory
      *             The {@code GeodeticCRS} parent class should be used instead.
      */
     @Override
-    @Deprecated(since = "1.5")
+    @Deprecated(since = "2.0")
     public GeocentricCRS createGeocentricCRS(final Map<String,?> properties,
             final GeodeticDatum datum, final SphericalCS cs) throws FactoryException
     {
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/MultiAuthoritiesFactory.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/MultiAuthoritiesFactory.java
index ca2bcea3de..2e9feec087 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/MultiAuthoritiesFactory.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/factory/MultiAuthoritiesFactory.java
@@ -961,7 +961,7 @@ public class MultiAuthoritiesFactory extends GeodeticAuthorityFactory implements
      *             The {@code GeodeticCRS} parent class should be used instead.
      */
     @Override
-    @Deprecated(since = "1.5")
+    @Deprecated(since = "2.0")
     public GeocentricCRS createGeocentricCRS(final String code) throws FactoryException {
         return create(AuthorityFactoryProxy.GEOCENTRIC_CRS, code);
     }
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/EPSGFactoryProxyCRS.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/EPSGFactoryProxyCRS.java
index 1dd3734765..0f6ca0aa37 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/EPSGFactoryProxyCRS.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/EPSGFactoryProxyCRS.java
@@ -80,7 +80,7 @@ public final class EPSGFactoryProxyCRS extends EPSGFactoryProxy implements CRSAu
     }
 
     @Override
-    @Deprecated(since = "1.5")
+    @Deprecated(since = "2.0")
     public GeocentricCRS createGeocentricCRS(String code) throws FactoryException {
         return factory().createGeocentricCRS(code);
     }
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/Resources.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/Resources.java
index 42b7fba5e3..36bf379eae 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/Resources.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/Resources.java
@@ -309,6 +309,11 @@ public class Resources extends IndexedResourceBundle {
          */
         public static final short IncompatibleDatum_2 = 28;
 
+        /**
+         * All dynamic components should have the same epoch, but found “{0}” and “{1}”.
+         */
+        public static final short InconsistentEpochs_2 = 103;
+
         /**
          * Inverse operation uses this parameter value with opposite sign.
          */
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/Resources.properties b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/Resources.properties
index ef5ddb5941..5336e2c8a4 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/Resources.properties
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/Resources.properties
@@ -87,6 +87,7 @@ IllegalParameterValueClass_3      = Parameter \u201c{0}\u201d does not accept va
 IllegalUnitFor_2                  = Unit of measurement \u201c{1}\u201d is not valid for \u201c{0}\u201d values.
 IncompatibleCoordinateSystemTypes = Incompatible coordinate system types.
 IncompatibleDatum_2               = Datum of \u201c{1}\u201d shall be \u201c{0}\u201d.
+InconsistentEpochs_2              = All dynamic components should have the same epoch, but found \u201c{0}\u201d and \u201c{1}\u201d.
 LatitudesAreOpposite_2            = Latitudes {0} and {1} are opposite.
 MismatchedParameterDescriptor_1   = Mismatched descriptor for \u201c{0}\u201d parameter.
 MismatchedPrimeMeridian_2         = Expected the \u201c{0}\u201d prime meridian but found \u201c{1}\u201d.
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/Resources_fr.properties b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/Resources_fr.properties
index 792b7d048b..ccbfa111b4 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/Resources_fr.properties
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/Resources_fr.properties
@@ -92,6 +92,7 @@ IllegalParameterValueClass_3      = Le param\u00e8tre \u00ab\u202f{0}\u202f\u00b
 IllegalUnitFor_2                  = L\u2019unit\u00e9 de mesure \u00ab\u202f{1}\u202f\u00bb n\u2019est pas valide pour les valeurs de \u00ab\u202f{0}\u202f\u00bb.
 IncompatibleCoordinateSystemTypes = Types de syst\u00e8mes de coordonn\u00e9es incompatibles.
 IncompatibleDatum_2               = Le r\u00e9f\u00e9rentiel de \u00ab\u202f{1}\u202f\u00bb doit \u00eatre \u00ab\u202f{0}\u202f\u00bb.
+InconsistentEpochs_2              = Toutes les composantes dynamiques devraient avoir la m\u00eame \u00e9poque de r\u00e9f\u00e9rence, mais on a trouv\u00e9 \u00ab\u202f{0}\u202f\u00bb et \u00ab\u202f{1}\u202f\u00bb.
 LatitudesAreOpposite_2            = Les latitudes {0} et {1} sont oppos\u00e9es.
 MismatchedParameterDescriptor_1   = Le descripteur du param\u00e8tre \u00ab\u202f{0}\u202f\u00bb ne correspond pas.
 MismatchedPrimeMeridian_2         = Le m\u00e9ridien d\u2019origine \u00ab\u202f{0}\u202f\u00bb \u00e9tait attendu, mais \u00ab\u202f{1}\u202f\u00bb a \u00e9t\u00e9 trouv\u00e9.
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/AbstractCoordinateOperation.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/AbstractCoordinateOperation.java
index 3c6683a62b..43f6c32c02 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/AbstractCoordinateOperation.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/AbstractCoordinateOperation.java
@@ -42,6 +42,7 @@ import org.opengis.referencing.operation.CoordinateOperation;
 import org.opengis.referencing.operation.OperationMethod;
 import org.opengis.referencing.operation.MathTransform;
 import org.opengis.referencing.operation.PassThroughOperation;
+import org.opengis.referencing.operation.TransformException;
 import org.opengis.parameter.GeneralParameterValue;
 import org.opengis.parameter.ParameterDescriptorGroup;
 import org.opengis.parameter.ParameterValueGroup;
@@ -76,7 +77,6 @@ import static org.apache.sis.util.Utilities.deepEquals;
 
 // Specific to the geoapi-3.1 and geoapi-4.0 branches:
 import org.opengis.coordinate.CoordinateSet;
-import org.opengis.referencing.operation.TransformException;
 
 
 /**
diff --git a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/TransformedCoordinateSet.java b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/TransformedCoordinateSet.java
index e998216d16..373f089828 100644
--- a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/TransformedCoordinateSet.java
+++ b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/TransformedCoordinateSet.java
@@ -82,7 +82,7 @@ final class TransformedCoordinateSet extends AbstractCoordinateSet implements Un
         final CoordinateMetadata metadata = data.getCoordinateMetadata();
         if (metadata != null) try {
             GeographicBoundingBox aoi = CRS.getGeographicBoundingBox(op);
-            CoordinateMetadata step = new DefaultCoordinateMetadata(op.getSourceCRS(), op.getSourceEpoch().orElse(null));
+            final var step = new DefaultCoordinateMetadata(op.getSourceCRS(), op.getSourceEpoch().orElse(null));
             transform = MathTransforms.concatenate(CRS.findOperation(metadata, step, aoi).getMathTransform(), transform);
         } catch (FactoryException | MismatchedDimensionException e) {
             throw new TransformException(e.getMessage(), e);
diff --git a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/factory/AuthorityFactoryMock.java b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/factory/AuthorityFactoryMock.java
index eb3a284b6b..010e8db29d 100644
--- a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/factory/AuthorityFactoryMock.java
+++ b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/factory/AuthorityFactoryMock.java
@@ -103,6 +103,9 @@ public final class AuthorityFactoryMock extends GeodeticAuthorityFactory impleme
 
     /**
      * Returns the authority codes for the given type.
+     *
+     * @param  type  the type of referencing object for which to get authority codes.
+     * @return the set of authority codes for referencing objects of the given type.
      */
     @Override
     @SuppressWarnings("deprecation")
diff --git a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/operation/provider/ProvidersTest.java b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/operation/provider/ProvidersTest.java
index 581667a272..5bd7bc567f 100644
--- a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/operation/provider/ProvidersTest.java
+++ b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/operation/provider/ProvidersTest.java
@@ -42,7 +42,6 @@ public final class ProvidersTest extends TestCase {
     /**
      * Returns all providers to test.
      */
-    @SuppressWarnings("deprecation")
     private static Class<?>[] methods() {
         return new Class<?>[] {
             Affine.class,