sis-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From desruisse...@apache.org
Subject [sis] 04/04: GridDerivation.subgrid[…) needs to transform the `areaOfInterest` envelope if the CRSs are not equal.
Date Wed, 02 Sep 2020 14:09:58 GMT
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 acb88719cc1951935b25e77c0b863de0cc6e184a
Author: Martin Desruisseaux <martin.desruisseaux@geomatys.com>
AuthorDate: Wed Sep 2 16:08:56 2020 +0200

    GridDerivation.subgrid[…) needs to transform the `areaOfInterest` envelope if the CRSs
are not equal.
---
 .../apache/sis/coverage/grid/GridDerivation.java   |  7 ++-
 .../sis/coverage/grid/GridDerivationTest.java      | 70 ++++++++++++++++++++--
 2 files changed, 69 insertions(+), 8 deletions(-)

diff --git a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridDerivation.java
b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridDerivation.java
index 2d21a2c..4d197e0 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridDerivation.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridDerivation.java
@@ -514,7 +514,7 @@ public class GridDerivation {
      * @see #getIntersection()
      * @see #getSubsamplings()
      */
-    public GridDerivation subgrid(final Envelope areaOfInterest, double... resolution) {
+    public GridDerivation subgrid(Envelope areaOfInterest, double... resolution) {
         ensureSubgridNotSet();
         final boolean isEnvelopeOnly = base.isEnvelopeOnly() && (resolution == null
|| resolution.length == 0);
         MathTransform cornerToCRS = isEnvelopeOnly ? MathTransforms.identity(base.envelope.getDimension())
@@ -550,6 +550,9 @@ public class GridDerivation {
             if (isEnvelopeOnly) {
                 if (areaOfInterest != null) {
                     intersection = new GeneralEnvelope(base.envelope);
+                    if (baseToAOI != null && !baseToAOI.isIdentity()) {
+                        areaOfInterest = Envelopes.transform(baseToAOI.inverse(), areaOfInterest);
+                    }
                     intersection.intersect(areaOfInterest);
                 }
                 return this;
@@ -936,7 +939,7 @@ public class GridDerivation {
             /*
              * Intersection should be non-null only if we have not been able to compute more
reliable properties
              * (grid extent and "grid to CRS" transform). It should happen only if `gridToCRS`
is null, but we
-             * nevertheless pass it to the constructor as a matter of principle.
+             * nevertheless pass that transform to the constructor as a matter of principle.
              */
             if (intersection != null) {
                 return new GridGeometry(PixelInCell.CELL_CENTER, base.gridToCRS, intersection,
rounding);
diff --git a/core/sis-feature/src/test/java/org/apache/sis/coverage/grid/GridDerivationTest.java
b/core/sis-feature/src/test/java/org/apache/sis/coverage/grid/GridDerivationTest.java
index 0d207b7..d84e827 100644
--- a/core/sis-feature/src/test/java/org/apache/sis/coverage/grid/GridDerivationTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/coverage/grid/GridDerivationTest.java
@@ -189,6 +189,9 @@ public final strictfp class GridDerivationTest extends TestCase {
                 0,   0.5, -90,
                 0.5, 0,  -180,
                 0,   0,     1));
+        /*
+         * Consistency checks before to test the `subgrid(…)` operation.
+         */
         GridGeometry grid = new GridGeometry(PixelInCell.CELL_CORNER, gridToCRS, envelope,
GridRoundingMode.NEAREST);
         assertExtentEquals(new long[] {370, 40}, new long[] {389, 339}, grid.getExtent());
         assertEnvelopeEquals(envelope, grid.getEnvelope(), STRICT);
@@ -227,6 +230,47 @@ public final strictfp class GridDerivationTest extends TestCase {
     }
 
     /**
+     * Tests {@link GridDerivation#subgrid(Envelope, double...)} using an envelope in a CRS
different than the
+     * grid geometry CRS. This test constructs the same grid geometry than {@link #testSubgridFromEnvelope()}
+     * and tests the same request with only axis order flipped.
+     *
+     * @throws TransformException if an error occurred during computation.
+     */
+    @Test
+    @DependsOnMethod("testSubgridFromEnvelope")
+    public void testSubgridFromEnvelopeDifferentCRS() throws TransformException {
+        final GeneralEnvelope envelope = new GeneralEnvelope(HardCodedCRS.WGS84_φλ);
+        envelope.setRange(0, -70, +80);
+        envelope.setRange(1,   5,  15);
+        final MathTransform gridToCRS = MathTransforms.linear(new Matrix3(
+                0,   0.5, -90,
+                0.5, 0,  -180,
+                0,   0,     1));
+        /*
+         * Same grid geometry than `testSubgridFromEnvelope()` with consistency checks omitted.
+         */
+        GridGeometry grid = new GridGeometry(PixelInCell.CELL_CORNER, gridToCRS, envelope,
GridRoundingMode.NEAREST);
+        /*
+         * Same request than the one used by `testSubgridFromEnvelope()` but with different
axis order.
+         * The resulting subgrid should have the same extent than the one in `testSubgridFromEnvelope()`.
+         */
+        envelope.setCoordinateReferenceSystem(HardCodedCRS.WGS84);
+        envelope.setRange(1, -50, +30);
+        envelope.setRange(0,   8,  12);
+        grid = grid.derive().subgrid(envelope, 2, 1).build();
+        assertSame(HardCodedCRS.WGS84_φλ, grid.getCoordinateReferenceSystem());
+        assertExtentEquals(new long[] {94, 40}, new long[] {95, 119}, grid.getExtent());
+        /*
+         * Before to check envelope, we need to restore the same axis order as specified
in the grid geometry.
+         * The envelope below is identical to the one used in `testSubgridFromEnvelope()`.
+         */
+        envelope.setCoordinateReferenceSystem(HardCodedCRS.WGS84_φλ);
+        envelope.setRange(0, -50, +30);
+        envelope.setRange(1,   8,  12);
+        assertEnvelopeEquals(envelope, grid.getEnvelope(), STRICT);
+    }
+
+    /**
      * Tests {@link GridDerivation#slice(DirectPosition)}.
      */
     @Test
@@ -462,15 +506,29 @@ public final strictfp class GridDerivationTest extends TestCase {
     }
 
     /**
-     * Tests {@link GridDerivation#subgrid(GridGeometry)} when the two envelopes contain
only an envelope.
+     * Tests {@link GridDerivation#subgrid(GridGeometry)} when the two grid geometries contain
only an envelope.
      */
     @Test
     public void testWithEnvelopeOnly() {
-        final GridGeometry g1 = new GridGeometry(null, new Envelope2D(null, 10, 20, 110,
70));
-        final GridGeometry g2 = new GridGeometry(null, new Envelope2D(null, -5, 25, 100,
90));
-        final GridGeometry r  = g1.derive().subgrid(g2).build();
-        assertTrue(r.isEnvelopeOnly());
-        assertEnvelopeEquals(new Envelope2D(null, 10, 25, 85, 65), r.getEnvelope(), STRICT);
+        Envelope2D   domain   = new Envelope2D(HardCodedCRS.WGS84, 10, 20, 110, 70);
+        Envelope2D   request  = new Envelope2D(HardCodedCRS.WGS84, -5, 25, 100, 90);
+        Envelope2D   expected = new Envelope2D(HardCodedCRS.WGS84, 10, 25,  85, 65);
+        GridGeometry grid1    = new GridGeometry(null, domain);
+        GridGeometry grid2    = new GridGeometry(null, request);
+        GridGeometry subgrid  = grid1.derive().subgrid(grid2).build();
+        assertTrue(subgrid.isEnvelopeOnly());
+        assertEnvelopeEquals(expected, subgrid.getEnvelope(), STRICT);
+        /*
+         * Test same envelope but with different axis order. The request uses a different
CRS,
+         * but the result shall stay in the same CRS than the initial grid geometry.
+         */
+        request.setCoordinateReferenceSystem(HardCodedCRS.WGS84_φλ);
+        request.setRect(25, -5, 90, 100);
+        grid2   = new GridGeometry(null, request);
+        subgrid = grid1.derive().subgrid(grid2).build();
+        assertSame(HardCodedCRS.WGS84, subgrid.getCoordinateReferenceSystem());
+        assertTrue(subgrid.isEnvelopeOnly());
+        assertEnvelopeEquals(expected, subgrid.getEnvelope(), STRICT);
     }
 
     /**


Mime
View raw message