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;
