This is an automated email from the ASF dual-hosted git repository. desruisseaux pushed a commit to branch geoapi-4.0 in repository https://gitbox.apache.org/repos/asf/sis.git
The following commit(s) were added to refs/heads/geoapi-4.0 by this push: new 6b413e8 Make `GridGeometry.getEnvelope(CoordinateReferenceSystem)` a little bit more robust. 6b413e8 is described below commit 6b413e8db06b719f0ef5e6a72d6dff5ab08851af Author: Martin Desruisseaux <martin.desruisse...@geomatys.com> AuthorDate: Thu Jan 20 11:07:19 2022 +0100 Make `GridGeometry.getEnvelope(CoordinateReferenceSystem)` a little bit more robust. --- .../org/apache/sis/coverage/grid/GridExtent.java | 2 ++ .../org/apache/sis/coverage/grid/GridGeometry.java | 23 ++++++++++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridExtent.java b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridExtent.java index 866b38d..a754ff6 100644 --- a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridExtent.java +++ b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridExtent.java @@ -955,6 +955,8 @@ public class GridExtent implements GridEnvelope, LenientComparable, Serializable * @throws TransformException if the envelope can not be computed with the given transform. * * @see #GridExtent(AbstractEnvelope, GridRoundingMode, int[], GridExtent, int[]) + * + * @see GridGeometry#getEnvelope(CoordinateReferenceSystem) */ final GeneralEnvelope toCRS(final MathTransform cornerToCRS, final MathTransform gridToCRS, final Envelope fallback) throws TransformException diff --git a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridGeometry.java b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridGeometry.java index 84b0402..0ef45e2 100644 --- a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridGeometry.java +++ b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridGeometry.java @@ -914,16 +914,31 @@ public class GridGeometry implements LenientComparable, Serializable { bitmask = GRID_TO_CRS; errorKey = Resources.Keys.UnspecifiedTransform; } else try { + /* + * At this point the envelope should never be null because of invariants enforced by constructors. + * But we nevertheless perform some paranoiac checks. If we fail to transform the envelope, its okay. + * The main transform is the one operating on grid extent. The envelope transformation is for taking + * in account singularity points (mostly poles) and in case this grid geometry is a sub-grid geometry, + * in which case the envelope may have been clipped and we want to keep that clip. + */ + final boolean onlyEnvelope = (extent == null || cornerToCRS == null); final CoordinateOperation op = findOperation(sourceCRS, crs, geographicBBox()); - final Envelope clip = (envelope != null) ? Envelopes.transform(op, envelope) : null; - if (extent == null || cornerToCRS == null) { - return clip; + Envelope clip; + try { + clip = Envelopes.transform(op, envelope); + if (onlyEnvelope) return clip; + } catch (TransformException e) { + if (onlyEnvelope) throw e; + recoverableException("getEnvelope", e); + clip = null; } MathTransform tr = MathTransforms.concatenate(cornerToCRS, op.getMathTransform()); final GeneralEnvelope env = extent.toCRS(tr, tr, clip); env.setCoordinateReferenceSystem(op.getTargetCRS()); env.normalize(); - env.intersect(clip); + if (clip != null) { + env.intersect(clip); + } return env; } catch (FactoryException e) { throw new TransformException(e);