Package org.apache.sis.storage.aggregate
Class CoverageAggregator
Object
CoverageAggregator
Creates a grid coverage resource from an aggregation of an arbitrary number of other resources.
Example:
a collection of
All source coverages should share the same CRS and have the same ranges (sample dimensions).
If this is not the case, then the source coverages will be grouped in different aggregates
with an uniform CRS and set of ranges in each sub-aggregates.
More specifically, GridCoverage
instances may represent the same phenomenon
(for example Sea Surface Temperature) over the same geographic area but at different dates and times.
CoverageAggregator
can be used for building a single data cube with a time axis.CoverageAggregator
organizes resources as below,
except that parent nodes having only one child are omitted:
Where:Root aggregate ├─ All coverages with same sample dimensions #1 │ └─ ... └─ All coverages with same sample dimensions #2 ├─ Coverages with equivalent reference systems #1 │ └─ ... └─ Coverages with equivalent reference systems #2 ├─ Slices with compatible "grid to CRS" #1 ├─ Slices with compatible "grid to CRS" #2 └─ ...
- Equivalent reference systems means two
CoordinateReferenceSystem
instances for whichUtilities.equalsIgnoreMetadata(Object, Object)
returnstrue
. - Compatible grid to CRS means two grid to CRS transforms which are identical (with small tolerance for rounding errors) except for the translation terms, with the additional condition that the translations, when expressed in units of grid cell indices, can differ only by integer amounts of cells.
- Slices means source coverages declared to this aggregator by calls to
add(…)
methods, after they have been incorporated in a data cube by this aggregator. Above tree does not contain the individual slices, but data cubes containing all slices that can fit.
Multi-threading and concurrency
Alladd(…)
methods can be invoked concurrently from arbitrary threads.
It is okay to load GridCoverageResource
instances in parallel threads
and add those resources to CoverageAggregator
without synchronization.
However, the final build()
method is not thread-safe;
that method shall be invoked from a single thread after all sources have been added
and no more addition are in progress.- Since:
- 1.3
Defined in the sis-storage
module
-
Constructor Summary
ConstructorsConstructorDescriptionCoverageAggregator
(StoreListeners listeners) Creates an initially empty aggregator. -
Method Summary
Modifier and TypeMethodDescriptionvoid
add
(GridCoverageResource resource) Adds the given resource.void
addAll
(Stream<? extends GridCoverageResource> resources) Adds all grid resources provided by the given stream.void
addComponents
(Aggregate resource) Adds all components of the given aggregate.build()
Builds a resource which is the aggregation or concatenation of all components added to this aggregator.Returns the algorithm to apply when more than one grid coverage can be found at the same grid index.void
setMergeStrategy
(MergeStrategy strategy) Sets the algorithm to apply when more than one grid coverage can be found at the same grid index.Returns a string representation for debugging purposes.
-
Constructor Details
-
CoverageAggregator
Creates an initially empty aggregator.- Parameters:
listeners
- listeners of the parent resource, ornull
if none. This is usually the listeners of theDataStore
.
-
-
Method Details
-
addAll
Adds all grid resources provided by the given stream. This method can be invoked from any thread. It delegates toadd(GridCoverageResource)
for each element in the stream.- Parameters:
resources
- resources to add.- Throws:
DataStoreException
- if a resource cannot be used.
-
add
Adds the given resource. This method can be invoked from any thread. This method does not recursively decomposes anAggregate
into its component.- Parameters:
resource
- resource to add.- Throws:
DataStoreException
- if the resource cannot be used.
-
addComponents
Adds all components of the given aggregate. This method can be invoked from any thread. It delegates toadd(GridCoverageResource)
for each component in the aggregate which is an instance ofGridCoverageResource
. Components that are themselves instance ofAggregate
are decomposed recursively.- Parameters:
resource
- resource to add.- Throws:
DataStoreException
- if a component of the resource cannot be used.- TODO:
- Instead of ignoring non-coverage instances, we should put them in a separated aggregate.
-
getMergeStrategy
Returns the algorithm to apply when more than one grid coverage can be found at the same grid index. This is the most recent value set by a call tosetMergeStrategy(MergeStrategy)
, ornull
if no strategy has been specified. In the latter case, aSubspaceNotSpecifiedException
will be thrown byGridCoverage.render(GridExtent)
if more than one source coverage (slice) is found for a specified grid index.- Returns:
- algorithm to apply for merging source coverages at the same grid index, or
null
if none.
-
setMergeStrategy
Sets the algorithm to apply when more than one grid coverage can be found at the same grid index. The new strategy applies to the next coverages to be added; previously added coverage may or may not be impacted by this change (see below). Consequently, this method should usually be invoked before to add the first coverage.Effect on previously added coverages
The merge strategy of previously added coverages is not modified by this method call, except for coverages (slices) that become part of the same aggregatedGridCoverageResource
(data cube) than a coverage added after this method call. In such case, the strategy set by this call tosetMergeStrategy(…)
prevails. Said otherwise, the merge strategy of a data cube is the strategy which was active at the time of the most recently added slice.- Parameters:
strategy
- new algorithm to apply for merging source coverages at the same grid index, ornull
if none.
-
build
Builds a resource which is the aggregation or concatenation of all components added to this aggregator. The returned resource will be an instance ofGridCoverageResource
if possible, or an instance ofAggregate
if some heterogeneity in grid geometries or sample dimensions prevent the concatenation of all coverages in a single resource.This method is not thread safe. If the
add(…)
andaddAll(…)
methods were invoked in background threads, then all additions must be finished before this method is invoked.- Returns:
- the aggregation or concatenation of all components added to this aggregator.
-
toString
Returns a string representation for debugging purposes.
-