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 e398ff15a233c535b008ce7b89ed91e52a837b74
Author: Martin Desruisseaux <[email protected]>
AuthorDate: Mon Jun 16 15:24:46 2025 +0200

    Better error message saying why a `LinearInterpolator1D` cannot be inverted.
---
 .../main/org/apache/sis/referencing/internal/Resources.java    |  5 +++++
 .../org/apache/sis/referencing/internal/Resources.properties   |  1 +
 .../apache/sis/referencing/internal/Resources_fr.properties    |  1 +
 .../sis/referencing/operation/provider/Interpolation1D.java    | 10 ++++++++--
 .../referencing/operation/transform/LinearInterpolator1D.java  |  7 +++++--
 .../sis/referencing/operation/transform/MathTransforms.java    |  1 +
 .../main/org/apache/sis/storage/netcdf/base/Grid.java          |  3 +--
 7 files changed, 22 insertions(+), 6 deletions(-)

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 53f34f02a2..96af716fd4 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
@@ -447,6 +447,11 @@ public class Resources extends IndexedResourceBundle {
          */
         public static final short NonConformCRS_3 = 73;
 
+        /**
+         * This interpolated transform is not invertible because the values 
are not ordered.
+         */
+        public static final short NonInvertibleBecauseUnordered = 108;
+
         /**
          * Non invertible {0}×{1} matrix.
          */
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 e6cf43f04e..edb2538662 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
@@ -105,6 +105,7 @@ NoConvergenceForPoints_2          = No convergence for 
points {0} and {1}.
 NonInvertibleMatrix_2             = Non invertible {0}\u00d7{1} matrix.
 NonInvertibleOperation_1          = Cannot invert the \u201c{0}\u201d 
operation.
 NonInvertibleTransform            = Transform is not invertible.
+NonInvertibleBecauseUnordered     = This interpolated transform is not 
invertible because the values are not ordered.
 NonLinearUnitConversion_2         = Unit conversion from \u201c{0}\u201d to 
\u201c{1}\u201d is non-linear.
 NonMonotonicSequence_1            = The \u201c{0}\u201d sequence is not 
monotonic.
 NonPerpendicularDirections_2      = Axis directions {0} and {1} are not 
perpendicular.
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 9313c58a53..94495000ef 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
@@ -110,6 +110,7 @@ NoConvergenceForPoints_2          = Le calcul ne converge 
pas pour les points {0
 NonInvertibleMatrix_2             = Matrice {0}\u00d7{1} non inversible.
 NonInvertibleOperation_1          = Ne peut pas inverser l\u2019op\u00e9ration 
\u00ab\u202f{0}\u202f\u00bb.
 NonInvertibleTransform            = La transformation n\u2019est pas 
inversible.
+NonInvertibleBecauseUnordered     = Cette transformation n\u2019est pas 
inversible parce que les valeurs ne sont pas ordonn\u00e9es.
 NonLinearUnitConversion_2         = La conversion des unit\u00e9s 
\u00ab\u202f{0}\u202f\u00bb vers \u00ab\u202f{1}\u202f\u00bb n\u2019est pas 
lin\u00e9aire.
 NonMonotonicSequence_1            = La s\u00e9quence 
\u00ab\u202f{0}\u202f\u00bb n\u2019est pas monotone.
 NonPerpendicularDirections_2      = Les directions {0} et {1} ne sont pas 
perpendiculaires.
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/provider/Interpolation1D.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/provider/Interpolation1D.java
index 6238c2837e..15e019fe92 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/provider/Interpolation1D.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/provider/Interpolation1D.java
@@ -23,6 +23,7 @@ import org.opengis.referencing.cs.CoordinateSystem;
 import org.opengis.referencing.operation.Conversion;
 import org.opengis.referencing.operation.MathTransform;
 import org.apache.sis.referencing.operation.transform.MathTransforms;
+import org.apache.sis.referencing.factory.InvalidGeodeticParameterException;
 import org.apache.sis.metadata.iso.citation.Citations;
 import org.apache.sis.parameter.ParameterBuilder;
 import org.apache.sis.parameter.Parameters;
@@ -81,10 +82,15 @@ public final class Interpolation1D extends AbstractProvider 
{
      * @param  context  the parameter values together with its context.
      * @return the created math transform.
      * @throws ParameterNotFoundException if a required parameter was not 
found.
+     * @throws InvalidGeodeticParameterException if a preimage is specified 
and its sequence of values is not monotonic.
      */
     @Override
-    public MathTransform createMathTransform(final Context context) {
+    public MathTransform createMathTransform(final Context context) throws 
InvalidGeodeticParameterException {
         final Parameters pv = 
Parameters.castOrWrap(context.getCompletedParameters());
-        return MathTransforms.interpolate(pv.getValue(PREIMAGE), 
pv.getValue(VALUES));
+        try {
+            return MathTransforms.interpolate(pv.getValue(PREIMAGE), 
pv.getValue(VALUES));
+        } catch (IllegalArgumentException e) {
+            throw new InvalidGeodeticParameterException(e.getMessage(), e);
+        }
     }
 }
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/transform/LinearInterpolator1D.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/transform/LinearInterpolator1D.java
index 3bf41bce5f..2f2b981a21 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/transform/LinearInterpolator1D.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/transform/LinearInterpolator1D.java
@@ -173,7 +173,7 @@ final class LinearInterpolator1D extends 
AbstractMathTransform1D implements Seri
         if (preimage != null) {
             final MathTransform1D indexToValues = tr;
             try {
-                tr = create(preimage.clone()).inverse();                       
         // preimageToIndex transform.
+                tr = create(preimage.clone()).inverse();    // Transform from 
`preimage` to index used as input.
             } catch (NoninvertibleTransformException e) {
                 throw new 
IllegalArgumentException(Resources.format(Resources.Keys.NonMonotonicSequence_1,
 "preimage"), e);
             }
@@ -292,7 +292,10 @@ final class LinearInterpolator1D extends 
AbstractMathTransform1D implements Seri
      */
     @Override
     public MathTransform1D inverse() throws NoninvertibleTransformException {
-        return (inverse != null) ? inverse : super.inverse();
+        if (inverse != null) {
+            return inverse;
+        }
+        throw new 
NoninvertibleTransformException(Resources.format(Resources.Keys.NonInvertibleBecauseUnordered));
     }
 
     /**
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/transform/MathTransforms.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/transform/MathTransforms.java
index d8a3877179..7be5444319 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/transform/MathTransforms.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/operation/transform/MathTransforms.java
@@ -294,6 +294,7 @@ public final class MathTransforms extends Static {
      *
      * @param  preimage  the input values (<var>x</var>) in the function 
domain, or {@code null}.
      * @param  values    the output values (<var>y</var>) in the function 
range, or {@code null}.
+     * @throws IllegalArgumentException if {@code preimage} is non-null and 
the sequence of values is not monotonic.
      * @return the <i>y=f(x)</i> function.
      *
      * @see org.opengis.coverage.InterpolationMethod
diff --git 
a/endorsed/src/org.apache.sis.storage.netcdf/main/org/apache/sis/storage/netcdf/base/Grid.java
 
b/endorsed/src/org.apache.sis.storage.netcdf/main/org/apache/sis/storage/netcdf/base/Grid.java
index f42a685c8a..d0012013a9 100644
--- 
a/endorsed/src/org.apache.sis.storage.netcdf/main/org/apache/sis/storage/netcdf/base/Grid.java
+++ 
b/endorsed/src/org.apache.sis.storage.netcdf/main/org/apache/sis/storage/netcdf/base/Grid.java
@@ -33,7 +33,6 @@ import 
org.apache.sis.referencing.operation.builder.LocalizationGridException;
 import org.apache.sis.coverage.grid.PixelInCell;
 import org.apache.sis.coverage.grid.GridExtent;
 import org.apache.sis.coverage.grid.GridGeometry;
-import org.apache.sis.coverage.grid.IllegalGridGeometryException;
 import org.apache.sis.storage.DataStoreException;
 import org.apache.sis.storage.netcdf.internal.Resources;
 import org.apache.sis.util.Exceptions;
@@ -533,7 +532,7 @@ findFree:       for (int srcDim : 
axis.gridDimensionIndices) {
                 }
             }
             geometry = new GridGeometry(getExtent(axes), anchor, gridToCRS, 
crs);
-        } catch (FactoryException | TransformException | 
IllegalGridGeometryException ex) {
+        } catch (FactoryException | TransformException | RuntimeException ex) {
             canNotCreate(decoder, "getGridGeometry", 
Resources.Keys.CanNotCreateGridGeometry_3, ex);
         }
         return geometry;

Reply via email to