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 2022/09/21 16:03:10 UTC

[sis] 01/02: Rename `GridGeometry.reduce(…)` as `selectDimensions(…)`. The previous name was confusing about what is reduced. Renamed also `CRS.reduce(…)` for consistency.

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 b85b941c25a587a60a5bd06c28d46991fb0105b6
Author: Martin Desruisseaux <ma...@geomatys.com>
AuthorDate: Wed Sep 21 15:32:10 2022 +0200

    Rename `GridGeometry.reduce(…)` as `selectDimensions(…)`.
    The previous name was confusing about what is reduced.
    Renamed also `CRS.reduce(…)` for consistency.
---
 .../apache/sis/gui/coverage/CoverageCanvas.java    |  2 +-
 .../apache/sis/coverage/grid/DimensionReducer.java |  2 +-
 .../apache/sis/coverage/grid/GridCoverage2D.java   |  4 +--
 .../apache/sis/coverage/grid/GridDerivation.java   | 12 ++++----
 .../org/apache/sis/coverage/grid/GridExtent.java   | 29 +++++++++++++----
 .../org/apache/sis/coverage/grid/GridGeometry.java | 25 ++++++++++++---
 .../apache/sis/coverage/grid/SliceGeometry.java    |  8 ++---
 .../internal/coverage/j2d/DeferredProperty.java    |  2 +-
 .../apache/sis/coverage/grid/GridExtentTest.java   |  8 ++---
 .../apache/sis/coverage/grid/GridGeometryTest.java | 16 +++++-----
 .../main/java/org/apache/sis/portrayal/Canvas.java |  2 +-
 .../main/java/org/apache/sis/referencing/CRS.java  | 26 ++++++++++++++--
 .../java/org/apache/sis/referencing/CRSTest.java   | 36 +++++++++++-----------
 .../report/CoordinateReferenceSystems.java         |  2 +-
 .../aggregate/ConcatenatedGridCoverage.java        |  2 +-
 15 files changed, 114 insertions(+), 62 deletions(-)

diff --git a/application/sis-javafx/src/main/java/org/apache/sis/gui/coverage/CoverageCanvas.java b/application/sis-javafx/src/main/java/org/apache/sis/gui/coverage/CoverageCanvas.java
index eab02b084d..448dba6e0d 100644
--- a/application/sis-javafx/src/main/java/org/apache/sis/gui/coverage/CoverageCanvas.java
+++ b/application/sis-javafx/src/main/java/org/apache/sis/gui/coverage/CoverageCanvas.java
@@ -680,7 +680,7 @@ public class CoverageCanvas extends MapCanvasAWT {
          */
         Envelope bounds = null;
         if (domain != null) {
-            domain = domain.reduce(xyDimensions);
+            domain = domain.selectDimensions(xyDimensions);
             if (domain.isDefined(GridGeometry.ENVELOPE)) {
                 bounds = domain.getEnvelope();
             }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/DimensionReducer.java b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/DimensionReducer.java
index 568cd1cc3d..a3059a10fe 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/DimensionReducer.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/DimensionReducer.java
@@ -66,7 +66,7 @@ final class DimensionReducer {
                     dimensions = AxisDirections.indicesOfLenientMapping(targetCS, sourceCS);
                     if (dimensions != null) {
                         Arrays.sort(dimensions);
-                        reducedCRS = CRS.reduce(targetCRS, dimensions);
+                        reducedCRS = CRS.selectDimensions(targetCRS, dimensions);
                     }
                 }
             }
diff --git a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoverage2D.java b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoverage2D.java
index 28a9b41b91..9f29c7440e 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoverage2D.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoverage2D.java
@@ -456,12 +456,12 @@ public class GridCoverage2D extends GridCoverage {
      * @return the two-dimensional part of the grid geometry.
      *
      * @see #getGridGeometry()
-     * @see GridGeometry#reduce(int...)
+     * @see GridGeometry#selectDimensions(int[])
      */
     public GridGeometry getGridGeometry2D() {
         GridGeometry g = gridGeometry2D.get();
         if (g == null) {
-            g = gridGeometry.reduce(xDimension, yDimension);
+            g = gridGeometry.selectDimensions(xDimension, yDimension);
             if (!gridGeometry2D.compareAndSet(null, g)) {
                 GridGeometry other = gridGeometry2D.get();
                 if (other != null) return other;
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 6b82fbe6e7..d76d2e3c8f 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
@@ -75,14 +75,14 @@ import org.opengis.coverage.PointOutsideCoverageException;
  * <p>All methods in this class preserve the number of dimensions. For example the {@link #slice(DirectPosition)} method sets
  * the {@linkplain GridExtent#getSize(int) grid size} to 1 in all dimensions specified by the <cite>slice point</cite>,
  * but does not remove those dimensions from the grid geometry.
- * For dimensionality reduction, see {@link GridGeometry#reduce(int...)}.</p>
+ * For dimensionality reduction, see {@link GridGeometry#selectDimensions(int[])}.</p>
  *
  * @author  Martin Desruisseaux (Geomatys)
  * @author  Alexis Manin (Geomatys)
  * @version 1.3
  *
  * @see GridGeometry#derive()
- * @see GridGeometry#reduce(int...)
+ * @see GridGeometry#selectDimensions(int[])
  *
  * @since 1.0
  * @module
@@ -459,7 +459,7 @@ public class GridDerivation {
      *       if different than default values, should be set before to invoke this method.</li>
      *   <li>{@linkplain #slice(DirectPosition) Slicing} can be applied after this method.</li>
      *   <li>This method does not reduce the number of dimensions of the grid geometry.
-     *       For dimensionality reduction, see {@link GridGeometry#reduce(int...)}.</li>
+     *       For dimensionality reduction, see {@link GridGeometry#selectDimensions(int[])}.</li>
      * </ul>
      *
      * @param  areaOfInterest  the area of interest and desired resolution as a grid geometry.
@@ -565,7 +565,7 @@ public class GridDerivation {
      *       if different than default values, should be set before to invoke this method.</li>
      *   <li>{@linkplain #slice(DirectPosition) Slicing} can be applied after this method.</li>
      *   <li>This method does not reduce the number of dimensions of the grid geometry.
-     *       For dimensionality reduction, see {@link GridGeometry#reduce(int...)}.</li>
+     *       For dimensionality reduction, see {@link GridGeometry#selectDimensions(int[])}.</li>
      *   <li>If the given envelope is known to be expressed in the same CRS than the grid geometry,
      *       then the {@linkplain Envelope#getCoordinateReferenceSystem() CRS of the envelope}
      *       can be left unspecified ({@code null}). It may give a slight performance improvement
@@ -848,7 +848,7 @@ public class GridDerivation {
      *       if different than default values, should be set before to invoke this method.</li>
      *   <li>{@linkplain #slice(DirectPosition) Slicing} can be applied after this method.</li>
      *   <li>This method does not reduce the number of dimensions of the grid geometry.
-     *       For dimensionality reduction, see {@link GridGeometry#reduce(int...)}.</li>
+     *       For dimensionality reduction, see {@link GridGeometry#selectDimensions(int[])}.</li>
      * </ul>
      *
      * @param  areaOfInterest  the desired grid extent in unit of base grid cell (i.e. ignoring subsampling),
@@ -976,7 +976,7 @@ public class GridDerivation {
      *   <li>If a non-default rounding mode is desired, it should be {@linkplain #rounding(GridRoundingMode) specified}
      *       before to invoke this method.</li>
      *   <li>This method does not reduce the number of dimensions of the grid geometry.
-     *       For dimensionality reduction, see {@link GridGeometry#reduce(int...)}.</li>
+     *       For dimensionality reduction, see {@link GridGeometry#selectDimensions(int[])}.</li>
      *   <li>If the given point is known to be expressed in the same CRS than the grid geometry,
      *       then the {@linkplain DirectPosition#getCoordinateReferenceSystem() CRS of the point}
      *       can be left unspecified ({@code null}). It may give a slight performance improvement
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 1e6f66f825..7e75053252 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
@@ -634,7 +634,7 @@ public class GridExtent implements GridEnvelope, LenientComparable, Serializable
      *
      * @return the number of dimensions.
      *
-     * @see #reduceDimension(int[])
+     * @see #selectDimensions(int[])
      */
     @Override
     public final int getDimension() {
@@ -1242,6 +1242,8 @@ public class GridExtent implements GridEnvelope, LenientComparable, Serializable
      * @return a new grid extent with the specified dimension added.
      * @throws IllegalArgumentException if the low coordinate value is greater than the high coordinate value.
      *
+     * @see #selectDimensions(int...)
+     *
      * @since 1.1
      */
     public GridExtent insertDimension(final int offset, final DimensionNameType axisType, final long low, long high, final boolean isHighIncluded) {
@@ -1286,15 +1288,30 @@ public class GridExtent implements GridEnvelope, LenientComparable, Serializable
      * @throws IndexOutOfBoundsException if an index is out of bounds.
      *
      * @see #getSubspaceDimensions(int)
-     * @see GridGeometry#reduce(int...)
+     * @see GridGeometry#selectDimensions(int...)
      *
-     * @since 1.1
+     * @since 1.3
      */
-    public GridExtent reduceDimension(int... dimensions) {
+    public GridExtent selectDimensions(int... dimensions) {
         dimensions = verifyDimensions(dimensions, getDimension());
         return (dimensions != null) ? reorder(dimensions) : this;
     }
 
+    /**
+     * Returns a grid extent that encompass only some dimensions of this grid extent.
+     *
+     * @param  dimensions  the dimensions to select, in strictly increasing order.
+     * @return the sub-envelope, or {@code this} if the given array contains all dimensions of this grid extent.
+     *
+     * @since 1.1
+     *
+     * @deprecated Renamed {@link #selectDimensions(int...)} for clarity.
+     */
+    @Deprecated
+    public GridExtent reduceDimension(int... dimensions) {
+        return selectDimensions(dimensions);
+    }
+
     /**
      * Verifies the validity of a given {@code dimensions} argument.
      *
@@ -1477,7 +1494,7 @@ public class GridExtent implements GridEnvelope, LenientComparable, Serializable
      * grid borders.</div>
      *
      * This method does not reduce the number of dimensions of the grid extent.
-     * For dimensionality reduction, see {@link #reduceDimension(int[])}.
+     * For dimensionality reduction, see {@link #selectDimensions(int[])}.
      *
      * <h4>Number of arguments</h4>
      * The {@code periods} array length should be equal to the {@linkplain #getDimension() number of dimensions}.
@@ -1580,7 +1597,7 @@ public class GridExtent implements GridEnvelope, LenientComparable, Serializable
      * in the given point will be rounded to nearest integer.
      *
      * <p>This method does not reduce the number of dimensions of the grid extent.
-     * For dimensionality reduction, see {@link #reduceDimension(int[])}.</p>
+     * For dimensionality reduction, see {@link #selectDimensions(int[])}.</p>
      *
      * @param  slicePoint           where to take a slice. NaN values are handled as if their dimensions were absent.
      * @param  modifiedDimensions   mapping from {@code slicePoint} dimensions to this {@code GridExtent} dimensions,
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 936b9b0888..5bc761668d 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
@@ -751,7 +751,7 @@ public class GridGeometry implements LenientComparable, Serializable {
      *
      * @return the number of grid dimensions.
      *
-     * @see #reduce(int...)
+     * @see #selectDimensions(int[])
      * @see GridExtent#getDimension()
      */
     public final int getDimension() {
@@ -1370,7 +1370,7 @@ public class GridGeometry implements LenientComparable, Serializable {
      * Each {@code GridDerivation} instance can be used only once and should be used in a single thread.
      * {@code GridDerivation} preserves the number of dimensions. For example {@linkplain GridDerivation#slice slicing}
      * sets the {@linkplain GridExtent#getSize(int) grid size} to 1 in all dimensions specified by a <cite>slice point</cite>,
-     * but does not remove those dimensions from the grid geometry. For dimensionality reduction, see {@link #reduce(int...)}.
+     * but does not remove those dimensions from the grid geometry. For dimensionality reduction, see {@link #selectDimensions(int[])}.
      *
      * @return an object for deriving a grid geometry from {@code this}.
      */
@@ -1536,10 +1536,12 @@ public class GridGeometry implements LenientComparable, Serializable {
      * @throws IndexOutOfBoundsException if an index is out of bounds.
      *
      * @see GridExtent#getSubspaceDimensions(int)
-     * @see GridExtent#reduceDimension(int[])
-     * @see org.apache.sis.referencing.CRS#reduce(CoordinateReferenceSystem, int...)
+     * @see GridExtent#selectDimensions(int[])
+     * @see org.apache.sis.referencing.CRS#selectDimensions(CoordinateReferenceSystem, int[])
+     *
+     * @since 1.3
      */
-    public GridGeometry reduce(int... dimensions) {
+    public GridGeometry selectDimensions(int... dimensions) {
         dimensions = GridExtent.verifyDimensions(dimensions, getDimension());
         if (dimensions != null) try {
             return new SliceGeometry(this, null, dimensions, null).reduce(null, -1);
@@ -1549,6 +1551,19 @@ public class GridGeometry implements LenientComparable, Serializable {
         return this;
     }
 
+    /**
+     * Returns a grid geometry that encompass only some dimensions of this grid geometry.
+     *
+     * @param  dimensions  the grid (not CRS) dimensions to select, in strictly increasing order.
+     * @return the sub-grid geometry, or {@code this} if the given array contains all dimensions of this grid geometry.
+     *
+     * @deprecated Renamed {@link #selectDimensions(int...)} for clarity and consistency with {@link GridExtent}.
+     */
+    @Deprecated
+    public GridGeometry reduce(int... dimensions) {
+        return selectDimensions(dimensions);
+    }
+
     /**
      * Creates a one-, two- or three-dimensional coordinate reference system for cell indices in the grid.
      * This method returns a CRS which is derived from the "real world" CRS or a subset of it.
diff --git a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/SliceGeometry.java b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/SliceGeometry.java
index 45276f1598..bccddf4432 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/SliceGeometry.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/SliceGeometry.java
@@ -42,7 +42,7 @@ import org.apache.sis.util.resources.Errors;
 
 /**
  * Builds a grid geometry for a slice in a {@link GridCoverage}. This is the implementation of
- * {@link GridGeometry#reduce(int...)} and {@link ImageRenderer#getImageGeometry(int)} methods.
+ * {@link GridGeometry#selectDimensions(int[])} and {@link ImageRenderer#getImageGeometry(int)} methods.
  *
  * <p>This class implements {@link Function} for allowing {@code apply(…)} to be invoked from outside this package.
  * That function is invoked (indirectly) by {@link org.apache.sis.internal.coverage.j2d.TiledImage#getProperty(String)}.</p>
@@ -130,7 +130,7 @@ final class SliceGeometry implements Function<RenderedImage, GridGeometry> {
      * @param  dimCRS          desired number of CRS dimensions, or -1 for automatic.
      * @throws FactoryException if an error occurred while separating the "grid to CRS" transform.
      *
-     * @see GridGeometry#reduce(int...)
+     * @see GridGeometry#selectDimensions(int[])
      */
     final GridGeometry reduce(final GridExtent relativeExtent, final int dimCRS) throws FactoryException {
         GridExtent    extent      = geometry.extent;
@@ -177,7 +177,7 @@ final class SliceGeometry implements Function<RenderedImage, GridGeometry> {
             extent = sliceExtent;
         }
         if (extent != null) {
-            extent = extent.reduceDimension(gridDimensions);
+            extent = extent.selectDimensions(gridDimensions);
         }
         GeneralEnvelope subArea = null;
         if (useSubExtent && cornerToCRS != null) try {
@@ -195,7 +195,7 @@ final class SliceGeometry implements Function<RenderedImage, GridGeometry> {
         ImmutableEnvelope envelope = geometry.envelope;
         if (envelope != null) {
             if (subArea != null || envelope.getDimension() != n) {
-                final CoordinateReferenceSystem crs = CRS.reduce(envelope.getCoordinateReferenceSystem(), crsDimensions);
+                final CoordinateReferenceSystem crs = CRS.selectDimensions(envelope.getCoordinateReferenceSystem(), crsDimensions);
                 final double[] min = new double[n];
                 final double[] max = new double[n];
                 for (int i=0; i<n; i++) {
diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/coverage/j2d/DeferredProperty.java b/core/sis-feature/src/main/java/org/apache/sis/internal/coverage/j2d/DeferredProperty.java
index 498b0a9180..18743cdb45 100644
--- a/core/sis-feature/src/main/java/org/apache/sis/internal/coverage/j2d/DeferredProperty.java
+++ b/core/sis-feature/src/main/java/org/apache/sis/internal/coverage/j2d/DeferredProperty.java
@@ -121,7 +121,7 @@ public final class DeferredProperty {
         @Override
         public GridGeometry apply(final RenderedImage image) {
             final GridExtent extent = grid.getExtent();
-            return grid.reduce(dimX, dimY).translate(
+            return grid.selectDimensions(dimX, dimY).translate(
                     Math.subtractExact(image.getMinX(), extent.getLow(dimX)),
                     Math.subtractExact(image.getMinY(), extent.getLow(dimY)));
         }
diff --git a/core/sis-feature/src/test/java/org/apache/sis/coverage/grid/GridExtentTest.java b/core/sis-feature/src/test/java/org/apache/sis/coverage/grid/GridExtentTest.java
index 71081a3b2e..d0e1869669 100644
--- a/core/sis-feature/src/test/java/org/apache/sis/coverage/grid/GridExtentTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/coverage/grid/GridExtentTest.java
@@ -184,19 +184,19 @@ public final strictfp class GridExtentTest extends TestCase {
     }
 
     /**
-     * Tests {@link GridExtent#reduceDimension(int[])}.
+     * Tests {@link GridExtent#selectDimensions(int[])}.
      */
     @Test
-    public void testReduceDimension() {
+    public void testSelectDimensions() {
         final GridExtent extent = create3D();
-        GridExtent reduced = extent.reduceDimension(0, 1);
+        GridExtent reduced = extent.selectDimensions(0, 1);
         assertEquals("dimension", 2, reduced.getDimension());
         assertExtentEquals(reduced, 0, 100, 499);
         assertExtentEquals(reduced, 1, 200, 799);
         assertEquals(DimensionNameType.COLUMN, reduced.getAxisType(0).get());
         assertEquals(DimensionNameType.ROW,    reduced.getAxisType(1).get());
 
-        reduced = extent.reduceDimension(2);
+        reduced = extent.selectDimensions(2);
         assertEquals("dimension", 1, reduced.getDimension());
         assertExtentEquals(reduced, 0, 40, 49);
         assertEquals(DimensionNameType.TIME, reduced.getAxisType(0).get());
diff --git a/core/sis-feature/src/test/java/org/apache/sis/coverage/grid/GridGeometryTest.java b/core/sis-feature/src/test/java/org/apache/sis/coverage/grid/GridGeometryTest.java
index fc47a135b5..86fcf19682 100644
--- a/core/sis-feature/src/test/java/org/apache/sis/coverage/grid/GridGeometryTest.java
+++ b/core/sis-feature/src/test/java/org/apache/sis/coverage/grid/GridGeometryTest.java
@@ -551,10 +551,10 @@ public final strictfp class GridGeometryTest extends TestCase {
     }
 
     /**
-     * Tests {@link GridGeometry#reduce(int...)}.
+     * Tests {@link GridGeometry#selectDimensions(int[])}.
      */
     @Test
-    public void testReduce() {
+    public void testSelectDimensions() {
         final GridGeometry grid = new GridGeometry(
                 new GridExtent(null, new long[] {336, 20, 4}, new long[] {401, 419, 10}, true),
                 PixelInCell.CELL_CORNER, MathTransforms.linear(new Matrix4(
@@ -565,7 +565,7 @@ public final strictfp class GridGeometryTest extends TestCase {
         /*
          * Tests on the two first dimensions.
          */
-        GridGeometry reduced = grid.reduce(0, 1);
+        GridGeometry reduced = grid.selectDimensions(0, 1);
         assertNotSame(grid, reduced);
         assertExtentEquals(new long[] {336, 20}, new long[] {401, 419}, reduced.getExtent());
         assertSame("CRS", HardCodedCRS.WGS84, reduced.getCoordinateReferenceSystem());
@@ -577,7 +577,7 @@ public final strictfp class GridGeometryTest extends TestCase {
         /*
          * Tests on the last dimension.
          */
-        reduced = grid.reduce(2);
+        reduced = grid.selectDimensions(2);
         assertNotSame(grid, reduced);
         assertExtentEquals(new long[] {4}, new long[] {10}, reduced.getExtent());
         assertSame("CRS", HardCodedCRS.GRAVITY_RELATED_HEIGHT, reduced.getCoordinateReferenceSystem());
@@ -594,12 +594,12 @@ public final strictfp class GridGeometryTest extends TestCase {
     }
 
     /**
-     * Tests {@link GridGeometry#reduce(int...)} with a {@code gridToCRS} transform having a constant value
+     * Tests {@link GridGeometry#selectDimensions(int[])} with a {@code gridToCRS} transform having a constant value
      * in one dimension. This method tests indirectly {@link SliceGeometry#findTargetDimensions(MathTransform,
      * GridExtent, double[], int[], int)}.
      */
     @Test
-    public void testReduceScalelessDimension() {
+    public void testRemoveScalelessDimension() {
         final GridGeometry grid = new GridGeometry(
                 new GridExtent(null, new long[] {336, 20, 4}, new long[] {401, 419, 10}, true),
                 PixelInCell.CELL_CORNER, MathTransforms.linear(new Matrix4(
@@ -608,7 +608,7 @@ public final strictfp class GridGeometryTest extends TestCase {
                         0,   0,   0,    3,   // All scale coefficients set to 0.
                         0,   0,   0,    1)), HardCodedCRS.GEOID_3D);
 
-        GridGeometry reduced = grid.reduce(0, 1);
+        GridGeometry reduced = grid.selectDimensions(0, 1);
         MathTransform tr = reduced.getGridToCRS(PixelInCell.CELL_CORNER);
         /*
          * If the boolean argument given to the `GridGeometry(GridGeometry, int[], boolean)` constructor was false,
@@ -630,7 +630,7 @@ public final strictfp class GridGeometryTest extends TestCase {
          * Test again by keeping the dimension without scale instead of discarding it.
          * We have to skip `verifyGridToCRS(reduced)` because matrix is non-invertible.
          */
-        reduced = grid.reduce(2);
+        reduced = grid.selectDimensions(2);
         tr = reduced.getGridToCRS(PixelInCell.CELL_CORNER);
         assertMatrixEquals("gridToCRS", new Matrix2(0, 3, 0, 1), MathTransforms.getMatrix(tr), STRICT);
     }
diff --git a/core/sis-portrayal/src/main/java/org/apache/sis/portrayal/Canvas.java b/core/sis-portrayal/src/main/java/org/apache/sis/portrayal/Canvas.java
index 7e7c1f3a30..1075d4085b 100644
--- a/core/sis-portrayal/src/main/java/org/apache/sis/portrayal/Canvas.java
+++ b/core/sis-portrayal/src/main/java/org/apache/sis/portrayal/Canvas.java
@@ -1087,7 +1087,7 @@ public class Canvas extends Observable implements Localized {
             analyzer.addSourceDimensions(displayDimensions);
             final LinearTransform           newObjectiveToDisplay = MathTransforms.tangent(analyzer.separate().inverse(), newPOI);
             final int[]                     objectiveDimensions   = analyzer.getTargetDimensions();
-            final CoordinateReferenceSystem newObjectiveCRS       = CRS.reduce(crs, objectiveDimensions);
+            final CoordinateReferenceSystem newObjectiveCRS       = CRS.selectDimensions(crs, objectiveDimensions);
             final MathTransform             dimensionSelect       = MathTransforms.linear(
                     Matrices.createDimensionSelect(newPOI.getDimension(), objectiveDimensions));
             /*
diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/CRS.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/CRS.java
index 6f11b645a3..fa1e593e74 100644
--- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/CRS.java
+++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/CRS.java
@@ -952,9 +952,11 @@ public final class CRS extends Static {
      * @see #getComponentAt(CoordinateReferenceSystem, int, int)
      * @see #compound(CoordinateReferenceSystem...)
      *
-     * @since 1.0
+     * @since 1.3
      */
-    public static CoordinateReferenceSystem reduce(final CoordinateReferenceSystem crs, final int... dimensions) throws FactoryException {
+    public static CoordinateReferenceSystem selectDimensions(final CoordinateReferenceSystem crs,
+            final int... dimensions) throws FactoryException
+    {
         ArgumentChecks.ensureNonNull("dimensions", dimensions);
         if (crs == null) {
             return null;
@@ -978,6 +980,24 @@ public final class CRS extends Static {
         return compound(components.toArray(new CoordinateReferenceSystem[components.size()]));
     }
 
+    /**
+     * Gets or creates a coordinate reference system with a subset of the dimensions of the given CRS.
+     *
+     * @param  crs         the CRS to reduce the dimensionality.
+     * @param  dimensions  the dimensions to retain.
+     * @return a coordinate reference system for the given dimensions.
+     * @throws FactoryException if the geodetic factory failed to create a compound CRS.
+     *
+     * @since 1.0
+     *
+     * @deprecated Renamed {@link #selectDimensions(CoordinateReferenceSystem, int...)} for clarity and consistency with
+     *             {@link org.apache.sis.coverage.grid.GridExtent} and {@link org.apache.sis.coverage.grid.GridGeometry}.
+     */
+    @Deprecated
+    public static CoordinateReferenceSystem reduce(final CoordinateReferenceSystem crs, final int... dimensions) throws FactoryException {
+        return selectDimensions(crs, dimensions);
+    }
+
     /**
      * Adds the components of reduced CRS into the given list.
      * This method may invoke itself recursively for walking through compound CRS.
@@ -1354,7 +1374,7 @@ public final class CRS extends Static {
      *         or can not be decomposed for dimensions in the [{@code lower} … {@code upper}] range.
      * @throws IndexOutOfBoundsException if the given index are out of bounds.
      *
-     * @see #reduce(CoordinateReferenceSystem, int...)
+     * @see #selectDimensions(CoordinateReferenceSystem, int[])
      * @see org.apache.sis.geometry.GeneralEnvelope#subEnvelope(int, int)
      *
      * @since 0.5
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/CRSTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/CRSTest.java
index 80421469b2..37083eed3c 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/CRSTest.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/CRSTest.java
@@ -407,27 +407,27 @@ public final strictfp class CRSTest extends TestCase {
     }
 
     /**
-     * Tests {@link CRS#reduce(CoordinateReferenceSystem, int...)} in the simpler case where
-     * there is no three-dimensional geographic CRS to separate.
+     * Tests {@link CRS#selectDimensions(CoordinateReferenceSystem, int[])} in the simpler case
+     * where there is no three-dimensional geographic CRS to separate.
      *
      * @throws FactoryException if an error occurred while creating a compound CRS.
      *
      * @since 1.0
      */
     @Test
-    public void testReduce() throws FactoryException {
-        assertSame(HardCodedCRS.TIME,                     CRS.reduce(HardCodedCRS.GEOID_4D, 3));
-        assertSame(HardCodedCRS.GRAVITY_RELATED_HEIGHT,   CRS.reduce(HardCodedCRS.GEOID_4D, 2));
-        assertSame(HardCodedCRS.WGS84,                    CRS.reduce(HardCodedCRS.GEOID_4D, 0, 1));
-        assertSame(HardCodedCRS.GEOID_4D,                 CRS.reduce(HardCodedCRS.GEOID_4D, 0, 1, 2, 3));
-        assertSame(HardCodedCRS.NESTED,                   CRS.reduce(HardCodedCRS.NESTED,   0, 1, 2, 3));
-        assertSame(HardCodedCRS.GEOID_3D,                 CRS.reduce(HardCodedCRS.NESTED,   0, 1, 2));
-        assertEqualsIgnoreMetadata(HardCodedCRS.GEOID_3D, CRS.reduce(HardCodedCRS.GEOID_4D, 0, 1, 2));
+    public void testSelectDimensions() throws FactoryException {
+        assertSame(HardCodedCRS.TIME,                     CRS.selectDimensions(HardCodedCRS.GEOID_4D, 3));
+        assertSame(HardCodedCRS.GRAVITY_RELATED_HEIGHT,   CRS.selectDimensions(HardCodedCRS.GEOID_4D, 2));
+        assertSame(HardCodedCRS.WGS84,                    CRS.selectDimensions(HardCodedCRS.GEOID_4D, 0, 1));
+        assertSame(HardCodedCRS.GEOID_4D,                 CRS.selectDimensions(HardCodedCRS.GEOID_4D, 0, 1, 2, 3));
+        assertSame(HardCodedCRS.NESTED,                   CRS.selectDimensions(HardCodedCRS.NESTED,   0, 1, 2, 3));
+        assertSame(HardCodedCRS.GEOID_3D,                 CRS.selectDimensions(HardCodedCRS.NESTED,   0, 1, 2));
+        assertEqualsIgnoreMetadata(HardCodedCRS.GEOID_3D, CRS.selectDimensions(HardCodedCRS.GEOID_4D, 0, 1, 2));
     }
 
     /**
-     * Tests {@link CRS#reduce(CoordinateReferenceSystem, int...)} with a three-dimensional geographic CRS
-     * to be reduced to a two-dimensional CRS.
+     * Tests {@link CRS#selectDimensions(CoordinateReferenceSystem, int[])} with
+     * a three-dimensional geographic CRS to be reduced to a two-dimensional CRS.
      *
      * @throws FactoryException if an error occurred while creating a CRS.
      *
@@ -436,13 +436,13 @@ public final strictfp class CRSTest extends TestCase {
     @Test
     public void testReduceGeographic3D() throws FactoryException {
         final GeographicCRS crs = HardCodedCRS.WGS84_3D;
-        assertSame(CommonCRS.Vertical.ELLIPSOIDAL.crs(),   CRS.reduce(crs, 2));
-        assertSame(CommonCRS.WGS84.normalizedGeographic(), CRS.reduce(crs, 0, 1));
+        assertSame(CommonCRS.Vertical.ELLIPSOIDAL.crs(),   CRS.selectDimensions(crs, 2));
+        assertSame(CommonCRS.WGS84.normalizedGeographic(), CRS.selectDimensions(crs, 0, 1));
     }
 
     /**
-     * Tests {@link CRS#reduce(CoordinateReferenceSystem, int...)} with a three-dimensional projected CRS
-     * to be reduced to a two-dimensional CRS.
+     * Tests {@link CRS#selectDimensions(CoordinateReferenceSystem, int[])} with
+     * a three-dimensional projected CRS to be reduced to a two-dimensional CRS.
      *
      * @throws FactoryException if an error occurred while creating a CRS.
      *
@@ -451,8 +451,8 @@ public final strictfp class CRSTest extends TestCase {
     @Test
     public void testReduceProjected3D() throws FactoryException {
         final ProjectedCRS crs = HardCodedConversions.mercator3D();
-        assertSame(CommonCRS.Vertical.ELLIPSOIDAL.crs(), CRS.reduce(crs, 2));
-        assertEqualsIgnoreMetadata(HardCodedConversions.mercator(), CRS.reduce(crs, 0, 1));
+        assertSame(CommonCRS.Vertical.ELLIPSOIDAL.crs(), CRS.selectDimensions(crs, 2));
+        assertEqualsIgnoreMetadata(HardCodedConversions.mercator(), CRS.selectDimensions(crs, 0, 1));
     }
 
     /**
diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/report/CoordinateReferenceSystems.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/report/CoordinateReferenceSystems.java
index d24443bdcd..1d474f1fc7 100644
--- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/report/CoordinateReferenceSystems.java
+++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/report/CoordinateReferenceSystems.java
@@ -618,7 +618,7 @@ public final strictfp class CoordinateReferenceSystems extends AuthorityCodesRep
 
 
     /**
-     * A row with an natural ordering that use the first part of the name before to use the authority code.
+     * A row with a natural ordering that use the first part of the name before to use the authority code.
      * We use only the part of the name prior some keywords (e.g. {@code "zone"}).
      * For example if the following codes:
      *
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/ConcatenatedGridCoverage.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/ConcatenatedGridCoverage.java
index b3672cffa7..80fab101ea 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/ConcatenatedGridCoverage.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/ConcatenatedGridCoverage.java
@@ -20,6 +20,7 @@ import java.util.List;
 import java.util.ArrayList;
 import java.util.logging.Logger;
 import java.awt.image.RenderedImage;
+import org.opengis.referencing.operation.TransformException;
 import org.apache.sis.coverage.SampleDimension;
 import org.apache.sis.coverage.grid.GridExtent;
 import org.apache.sis.coverage.grid.GridGeometry;
@@ -36,7 +37,6 @@ import org.apache.sis.util.logging.Logging;
 
 // Branch-dependent imports
 import org.opengis.coverage.CannotEvaluateException;
-import org.opengis.referencing.operation.TransformException;
 
 
 /**