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 58df212721234f7f8df65e5e35bb6319af40094d
Author: Martin Desruisseaux <martin.desruisse...@geomatys.com>
AuthorDate: Thu Apr 13 13:00:10 2023 +0200

    Complete API with a few convenience methods:
    - `CoverageAggregator.add(GridCoverage)` method in addition to existing 
methods working on resources.
    - `GridCoverageProcessor.selectSampleDimensions(…)` in complement to 
`selectGridDimensions(…)`.
---
 .../sis/coverage/grid/GridCoverageProcessor.java   | 27 +++++++++++++++++++++-
 .../sis/storage/aggregate/CoverageAggregator.java  | 26 ++++++++++++++++++++-
 .../apache/sis/storage/aggregate/GridSlice.java    | 15 +++++++++++-
 .../sis/storage/aggregate/GroupByTransform.java    |  2 +-
 4 files changed, 66 insertions(+), 4 deletions(-)

diff --git 
a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoverageProcessor.java
 
b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoverageProcessor.java
index b56fd29e0f..9394a7c603 100644
--- 
a/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoverageProcessor.java
+++ 
b/core/sis-feature/src/main/java/org/apache/sis/coverage/grid/GridCoverageProcessor.java
@@ -594,6 +594,7 @@ public class GridCoverageProcessor implements Cloneable {
      * @since 1.3
      */
     public GridCoverage resample(final GridCoverage source, final 
CoordinateReferenceSystem target) throws TransformException {
+        ArgumentChecks.ensureNonNull("source", source);
         ArgumentChecks.ensureNonNull("target", target);
         return resample(source, new GridGeometry(null, 
PixelInCell.CELL_CENTER, null, target));
     }
@@ -610,6 +611,7 @@ public class GridCoverageProcessor implements Cloneable {
      * @since 1.4
      */
     public GridCoverage reduceDimensionality(final GridCoverage source) {
+        ArgumentChecks.ensureNonNull("source", source);
         return 
DimensionalityReduction.reduce(source.getGridGeometry()).apply(source);
     }
 
@@ -654,6 +656,7 @@ public class GridCoverageProcessor implements Cloneable {
      * @since 1.4
      */
     public GridCoverage removeGridDimensions(final GridCoverage source, final 
int... gridAxesToRemove) {
+        ArgumentChecks.ensureNonNull("source", source);
         var reduction = 
DimensionalityReduction.remove(source.getGridGeometry(), gridAxesToRemove);
         reduction.ensureIsSlice();
         return reduction.apply(source);
@@ -704,15 +707,37 @@ public class GridCoverageProcessor implements Cloneable {
      * @since 1.4
      */
     public GridCoverage selectGridDimensions(final GridCoverage source, final 
int... gridAxesToPass) {
+        ArgumentChecks.ensureNonNull("source", source);
         var reduction = 
DimensionalityReduction.select(source.getGridGeometry(), gridAxesToPass);
         reduction.ensureIsSlice();
         return reduction.apply(source);
     }
 
+    /**
+     * Selects a subset of sample dimensions (bands) in the given coverage.
+     * This method can also be used for changing sample dimension order or
+     * for repeating the same sample dimension from the source coverage.
+     * If the specified {@code bands} indices select all sample dimensions
+     * in the same order, then {@code source} is returned directly.
+     *
+     * @param  source  the coverage in which to select sample dimensions.
+     * @param  bands   indices of sample dimensions to retain.
+     * @return coverage width selected sample dimensions.
+     * @throws IllegalArgumentException if a sample dimension index is invalid.
+     *
+     * @see ImageProcessor#selectBands(RenderedImage, int...)
+     *
+     * @since 1.4
+     */
+    public GridCoverage selectSampleDimensions(final GridCoverage source, 
final int... bands) {
+        ArgumentChecks.ensureNonNull("source", source);
+        return aggregateRanges(new GridCoverage[] {source}, new int[][] 
{bands});
+    }
+
     /**
      * Aggregates in a single coverage the ranges of all specified coverages, 
in order.
      * The {@linkplain GridCoverage#getSampleDimensions() list of sample 
dimensions} of
-     * the aggregated coverage will be the concatenation of the lists of all 
sources.
+     * the aggregated coverage will be the concatenation of the lists from all 
sources.
      *
      * <p>This convenience method delegates to {@link 
#aggregateRanges(GridCoverage[], int[][])}.
      * See that method for more information on restrictions.</p>
diff --git 
a/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/CoverageAggregator.java
 
b/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/CoverageAggregator.java
index 4b353fce0e..cdba29f5e0 100644
--- 
a/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/CoverageAggregator.java
+++ 
b/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/CoverageAggregator.java
@@ -36,6 +36,7 @@ import org.apache.sis.storage.DataStoreContentException;
 import org.apache.sis.storage.GridCoverageResource;
 import org.apache.sis.storage.event.StoreListeners;
 import org.apache.sis.coverage.grid.GridCoverage;
+import org.apache.sis.coverage.grid.IllegalGridGeometryException;
 import org.apache.sis.coverage.SubspaceNotSpecifiedException;
 import org.apache.sis.util.collection.BackingStoreException;
 
@@ -89,7 +90,7 @@ import org.apache.sis.util.collection.BackingStoreException;
  * and no more addition are in progress.
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.3
+ * @version 1.4
  * @since   1.3
  */
 public final class CoverageAggregator extends Group<GroupBySample> {
@@ -141,6 +142,8 @@ public final class CoverageAggregator extends 
Group<GroupBySample> {
      *
      * @param  resources  resources to add.
      * @throws DataStoreException if a resource cannot be used.
+     *
+     * @see #add(GridCoverageResource)
      */
     public void addAll(final Stream<? extends GridCoverageResource> resources) 
throws DataStoreException {
         try {
@@ -156,6 +159,27 @@ public final class CoverageAggregator extends 
Group<GroupBySample> {
         }
     }
 
+    /**
+     * Adds the given coverage. This method can be invoked from any thread.
+     *
+     * @param  coverage  coverage to add.
+     *
+     * @since 1.4
+     */
+    public void add(final GridCoverage coverage) {
+        final GroupBySample bySample = GroupBySample.getOrAdd(members, 
coverage.getSampleDimensions());
+        final GridSlice slice = new GridSlice(coverage);
+        final List<GridSlice> slices;
+        try {
+            slices = slice.getList(bySample.members, strategy).members;
+        } catch (NoninvertibleTransformException e) {
+            throw new IllegalGridGeometryException(e);
+        }
+        synchronized (slices) {
+            slices.add(slice);
+        }
+    }
+
     /**
      * Adds the given resource. This method can be invoked from any thread.
      * This method does <em>not</em> recursively decomposes an {@link 
Aggregate} into its component.
diff --git 
a/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/GridSlice.java
 
b/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/GridSlice.java
index 489af18d74..cc8bff034f 100644
--- 
a/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/GridSlice.java
+++ 
b/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/GridSlice.java
@@ -26,8 +26,10 @@ import 
org.opengis.referencing.operation.NoninvertibleTransformException;
 import org.apache.sis.referencing.operation.matrix.MatrixSIS;
 import org.apache.sis.storage.GridCoverageResource;
 import org.apache.sis.storage.DataStoreException;
+import org.apache.sis.coverage.grid.GridCoverage;
 import org.apache.sis.coverage.grid.GridGeometry;
 import org.apache.sis.coverage.grid.GridExtent;
+import org.apache.sis.internal.storage.MemoryGridResource;
 import org.apache.sis.internal.util.Numerics;
 import org.apache.sis.internal.util.Strings;
 import org.apache.sis.util.Numbers;
@@ -42,7 +44,7 @@ import org.apache.sis.util.Numbers;
  * are grouped by "grid to CRS" transform in the {@link 
GroupByTransform#members} list.
  *
  * @author  Martin Desruisseaux (Geomatys)
- * @version 1.3
+ * @version 1.4
  * @since   1.3
  */
 final class GridSlice {
@@ -63,6 +65,17 @@ final class GridSlice {
      */
     private final long[] offset;
 
+    /**
+     * Creates a new slice for the specified coverage.
+     *
+     * @param  slice  coverage associated to this slice.
+     */
+    GridSlice(final GridCoverage slice) {
+        resource = new MemoryGridResource(null, slice);
+        geometry = slice.getGridGeometry();
+        offset   = new long[geometry.getDimension()];
+    }
+
     /**
      * Creates a new slice for the specified resource.
      *
diff --git 
a/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/GroupByTransform.java
 
b/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/GroupByTransform.java
index aef7c80bd9..540483160e 100644
--- 
a/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/GroupByTransform.java
+++ 
b/storage/sis-storage/src/main/java/org/apache/sis/storage/aggregate/GroupByTransform.java
@@ -112,7 +112,7 @@ final class GroupByTransform extends Group<GridSlice> {
     }
 
     /**
-     * Returns dimensions to aggregate, in order of recommendation.
+     * Returns grid dimensions to aggregate, in order of recommendation.
      * Aggregations should use the first dimension in the returned list.
      *
      * @todo A future version should add {@code findMosaicDimensions()}, which 
should be tested first.

Reply via email to