Class GridDerivation
GridDerivation
are created by calls to GridGeometry.derive()
.
Properties of the desired grid geometry can be specified by calls to the following methods,
in that order (each method is optional):
rounding(GridRoundingMode)
,margin(int...)
and/orchunkSize(int...)
in any ordersubgrid(GridGeometry)
,subgrid(Envelope, double...)
orsubgrid(GridExtent, int...)
slice(DirectPosition)
and/orsliceByRatio(double, int...)
build()
.
The getIntersection()
method can also be invoked for the GridExtent
part without subsampling.
All methods in this class preserve the number of dimensions. For example, the slice(DirectPosition)
method sets
the grid size to 1 in all dimensions specified by the slice point,
but does not remove those dimensions from the grid geometry.
For dimensionality reduction, see GridGeometry.selectDimensions(int[])
.
- Since:
- 1.0
- Version:
- 1.3
- See Also:
-
Field Summary
FieldsModifier and TypeFieldDescriptionprotected final GridGeometry
The base grid geometry from which to derive a new grid geometry.private GridExtent
The sub-extent ofbase
grid geometry to use for the new grid geometry.private int[]
If the grid is divided in tiles or chunks, the size of the chunks.private GridClippingMode
Whether to clip the derived grid extent to the original grid extent.private GeneralEnvelope
Intersection between the grid envelope and the area of interest, computed when only envelopes are available.private boolean
private int[]
If non-null, the extent will be expanded by that amount of cells on each grid dimension.private int[]
The maximum subsampling values (inclusive), ornull
if none.private int[]
List of grid dimensions that are modified by thecornerToCRS
transform, or null for all dimensions.private GridRoundingMode
Controls behavior of rounding from floating point values to integers.private GridExtent
Same asbaseExtent
(expanded), but takes resolution or subsampling in account.private String
Ifsubgrid(Envelope, double...)
orslice(DirectPosition)
has been invoked, the method name.private LinearTransform
The conversion from the derived grid to the original grid, ornull
if no subsampling is applied. -
Constructor Summary
ConstructorsModifierConstructorDescriptionprotected
GridDerivation
(GridGeometry base) Creates a new builder for deriving a grid geometry from the specified base. -
Method Summary
Modifier and TypeMethodDescriptionbuild()
Builds a grid geometry with the configuration specified by the other methods in thisGridDerivation
class.chunkSize
(int... cellCounts) Specifies the size of tiles or chunks in the base grid geometry.clipping
(GridClippingMode mode) Specifies whether to clip the derived grid extent to the extent of the base grid geometry.private org.opengis.referencing.operation.MathTransform
dropUnusedDimensions
(org.opengis.referencing.operation.MathTransform gridToCRS, int dimension) Drops the source dimensions that are not needed for producing the target dimensions.private void
Verifies that a sub-grid has not yet been defined.private org.opengis.referencing.operation.MathTransform
findBaseToAOI
(org.opengis.referencing.crs.CoordinateReferenceSystem target) Returns the transform from the CRS of the base grid to the CRS of user supplied argument.private GridExtent
getBaseExtentExpanded
(boolean nonNull) Returns the extent of the modified grid geometry, ignoring subsampling or changes in resolution.private double[]
Returns the point of interest of currentbaseExtent
, keeping only the remaining dimensions afterdropUnusedDimensions(MathTransform, int)
execution.int[]
Returns the strides for accessing cells along each axis of the base grid.int[]
Returns the offsets to be subtracted from pixel coordinates before subsampling.margin
(int... cellCounts) Specifies an amount of cells by which to expandGridExtent
after rounding.maximumSubsampling
(int... subsampling) Specifies the maximum subsampling values (inclusive) for each dimension.rounding
(GridRoundingMode mode) Controls behavior of rounding from floating point values to integers.private int
roundSubsampling
(double scale, int dimension) Rounds a subsampling value according the currentRoundingMode
.private void
setBaseExtentClipped
(GeneralEnvelope... indices) SetsbaseExtent
to the given envelope clipped to the previous extent.slice
(org.opengis.geometry.DirectPosition slicePoint) Requests a grid geometry for a slice at the given "real world" position.sliceByRatio
(double sliceRatio, int... dimensionsToKeep) Requests a grid geometry for a slice at the given relative position.subgrid
(GridExtent areaOfInterest, int... subsampling) Requests a grid geometry over a sub-region of the base grid geometry and optionally with subsampling.subgrid
(GridGeometry areaOfInterest) Adapts the base grid for the geographic area and resolution of the given grid geometry.subgrid
(org.opengis.geometry.Envelope areaOfInterest, double... resolution) Requests a grid geometry over a sub-envelope and optionally with a coarser resolution.private GridDerivation
subsample
(int... subsampling) Applies a subsampling on the grid geometry to build.private double
tolerance
(int dimension) Returns a tolerance factor for comparing scale factors in the given dimension.toString()
Returns a string representation of thisGridDerivation
for debugging purpose.private TreeTable
Returns a tree representation of thisGridDerivation
.private static int[]
validateCellCounts
(String property, int[] values, int defaultValue) Returns a copy of thevalues
array with trailingdefaultValue
trimmed.private WraparoundAdjustment
wraparound
(org.opengis.referencing.operation.MathTransform baseToAOI, org.opengis.referencing.operation.MathTransform gridToCRS) Creates an instance of the helper class for shifting positions and envelopes inside the grid.
-
Field Details
-
base
The base grid geometry from which to derive a new grid geometry. -
rounding
Controls behavior of rounding from floating point values to integers.- See Also:
-
clipping
Whether to clip the derived grid extent to the original grid extent.- See Also:
-
margin
private int[] marginIf non-null, the extent will be expanded by that amount of cells on each grid dimension. This array is non-null only if at least one non-zero margin has been specified. Trailing zero values are omitted (consequently this array may be shorter thanGridExtent
number of dimensions).- See Also:
-
chunkSize
private int[] chunkSizeIf the grid is divided in tiles or chunks, the size of the chunks. This is used for snapping grid size to multiple values of chunk size. If non-null, cannot be empty. Trailing 1 values are omitted.- See Also:
-
maximumSubsampling
private int[] maximumSubsamplingThe maximum subsampling values (inclusive), ornull
if none.- See Also:
-
isBaseExtentExpanded
private boolean isBaseExtentExpandedTells whether thebaseExtent
has been expanded by addition of margin and rounding to chunk size. We have this flag because it is not always convenient to add margin immediately, depending on how thebaseExtent
has been updated.- See Also:
-
#getBaseExtentExpanded()
-
baseExtent
The sub-extent ofbase
grid geometry to use for the new grid geometry. This is the intersection ofbase.extent
with any area of interest specified to asubgrid(…)
method, potentially with some grid size set to 1 by aslice(DirectPosition)
method. This extent is not scaled or subsampled for a given resolution. It may be expanded according themargin
andchunkSize
values, depending on whether theisBaseExtentExpanded
flag value istrue
.This extent is initialized to
base.extent
if no slice, scale or sub-grid has been requested. This field may benull
if the base grid geometry does not define any extent. A successful call toGridGeometry.requireGridToCRS(boolean)
guarantees that this field is non-null.- See Also:
-
scaledExtent
Same asbaseExtent
(expanded), but takes resolution or subsampling in account. This isnull
if no scale or subsampling has been applied. Margin and chunk size shall be applied beforescaledExtent
is computed. -
toBase
The conversion from the derived grid to the original grid, ornull
if no subsampling is applied. A non-null conversion exists only in case of subsampling, because otherwise the derived grid shares the same coordinate space than the base grid. If non-null, the transform has the following properties:- The transform has no shear, no rotation, no axis flip.
- Scale factors on the diagonal are the subsampling values.
Those values are strictly positive integers, except if computed by
subgrid(Envelope, double...)
. - Translation terms in the last column are integers between 0 inclusive and subsampling factors exclusive.
Those values are positive integers, except if computed by
subgrid(Envelope, double...)
.
- See Also:
-
modifiedDimensions
private int[] modifiedDimensionsList of grid dimensions that are modified by thecornerToCRS
transform, or null for all dimensions. The length of this array is the number of dimensions of the given Area Of Interest (AOI). Each value in this array is between 0 inclusive andextent.getDimension()
exclusive. This is a temporary information set bydropUnusedDimensions(MathTransform, int)
and cleared when no longer needed. -
subGridSetter
Ifsubgrid(Envelope, double...)
orslice(DirectPosition)
has been invoked, the method name. This is used for preventing those methods to be invoked twice or out-of-order, which is currently not supported. -
intersection
Intersection between the grid envelope and the area of interest, computed when only envelopes are available. Normally we do not compute this envelope directly; instead we compute the grid extent and the "grid to CRS" transform. This envelope is computed only if it cannot be computed from other grid geometry properties.- See Also:
-
-
Constructor Details
-
GridDerivation
Creates a new builder for deriving a grid geometry from the specified base.- Parameters:
base
- the base to use as a template for deriving a new grid geometry.- See Also:
-
-
Method Details
-
ensureSubgridNotSet
private void ensureSubgridNotSet()Verifies that a sub-grid has not yet been defined. This method is invoked for enforcing the method call order defined in javadoc. -
rounding
Controls behavior of rounding from floating point values to integers. This setting modifies computations performed by the following methods (it has no effect on other methods in thisGridDerivation
class): If this method is never invoked, the default value isGridRoundingMode.NEAREST
. If this method is invoked too late, anIllegalStateException
is thrown.- Parameters:
mode
- the new rounding mode.- Returns:
this
for method call chaining.- Throws:
IllegalStateException
- ifsubgrid(Envelope, double...)
orslice(DirectPosition)
has already been invoked.
-
clipping
Specifies whether to clip the derived grid extent to the extent of the base grid geometry. The default value isGridClippingMode.STRICT
.- Parameters:
mode
- whether to clip the derived grid extent.- Returns:
this
for method call chaining.- Throws:
IllegalStateException
- ifsubgrid(Envelope, double...)
orslice(DirectPosition)
has already been invoked.- Since:
- 1.1
-
margin
Specifies an amount of cells by which to expandGridExtent
after rounding. This setting modifies computations performed by the following methods: For each dimension i of the grid computed by above methods, the low grid coordinate is subtracted bycellCount[i]
and the high grid coordinate is increased bycellCount[i]
. This calculation is done in units of the base grid cells, i.e. before subsampling. For example if subsampling is 2, then a margin of 6 cells specified with this method will result in a margin of 3 cells in the grid extent computed by thebuild()
method.Use case: if the caller wants to apply bilinear interpolations in an image, (s)he will need 1 more pixel on each image border. If the caller wants to apply bi-cubic interpolations, (s)he will need 2 more pixels on each image border.If this method is never invoked, the default value is zero for all dimensions. If this method is invoked too late, anIllegalStateException
is thrown. If thecellCounts
array length is shorter than the grid dimension, then zero is assumed for all missing dimensions.- Parameters:
cellCounts
- number of cells by which to expand the grid extent.- Returns:
this
for method call chaining.- Throws:
IllegalArgumentException
- if a value is negative.IllegalStateException
- ifsubgrid(Envelope, double...)
orslice(DirectPosition)
has already been invoked.- See Also:
-
chunkSize
Specifies the size of tiles or chunks in the base grid geometry. If a chunk size is specified, then the grid extent computed bybuild()
will span an integer amount of chunks. The grid coordinates (0, 0, …) locate the corner of a chunk.This property operates on the same methods than the margin. If both a margin and a chunk size are specified, then margins are added first and the resulting grid coordinates are rounded to chunk size. This calculation is done in units of the base grid cells, i.e. before subsampling. For example if subsampling is 2, then a tile size of 20×20 pixels specified with this method will result in a tile size of 10×10 cells in the grid extent computed by the
build()
method.If this method is never invoked, the default value is one for all dimensions. If this method is invoked too late, an
IllegalStateException
is thrown. If thecellCounts
array length is shorter than the grid dimension, then one is assumed for all missing dimensions.- Parameters:
cellCounts
- number of cells in all tiles or chunks.- Returns:
this
for method call chaining.- Throws:
IllegalArgumentException
- if a value is zero or negative.IllegalStateException
- ifsubgrid(Envelope, double...)
orslice(DirectPosition)
has already been invoked.- Since:
- 1.1
-
maximumSubsampling
Specifies the maximum subsampling values (inclusive) for each dimension. If a subsampling value is greater than a specified value in the corresponding dimension, the subsampling will be clamped to the specified maximal value. Setting a maximum value of 1 in a dimension is equivalent to disabling subsampling in that dimension.If this method is never invoked, then there is no maximum value. If this method is invoked too late, an
IllegalStateException
is thrown. If thecellCounts
array length is shorter than the grid dimension, then all missing dimensions have no maximum value.- Parameters:
subsampling
- maximal subsampling values (inclusive).- Returns:
this
for method call chaining.- Throws:
IllegalArgumentException
- if a value is zero or negative.IllegalStateException
- ifsubgrid(Envelope, double...)
orslice(DirectPosition)
has already been invoked.- Since:
- 1.1
-
validateCellCounts
Returns a copy of thevalues
array with trailingdefaultValue
trimmed. Returnsnull
if all values are trimmed. This method verifies that values are valid.- Parameters:
property
- argument name to use in error message in case of errors.values
- user supplied values.- Returns:
- values to save in
GridDerivation
.
-
subgrid
Adapts the base grid for the geographic area and resolution of the given grid geometry. The new grid geometry will cover the spatiotemporal region given byareaOfInterest
envelope (coordinate operations are applied as needed if the Coordinate Reference Systems are not the same). The new grid geometry resolution will be integer multiples of thebase
grid geometry resolution.Usage: This method can be helpful for implementation ofIfGridCoverageResource.read(GridGeometry, int...)
. Example:gridExtent
contains only an envelope, then this method delegates tosubgrid(Envelope, double...)
. Otherwise ifgridExtent
contains only an extent, then this method delegates tosubgrid(GridExtent, int...)
. Otherwise the following information are mandatory:- Extent in
areaOfInterest
. - Grid to CRS conversion in
areaOfInterest
. - Grid to CRS conversion in
base
grid.
- Coordinate reference system in
areaOfInterest
. - Coordinate reference system in
base
grid. - Extent in
base
grid.
Notes:
- This method can be invoked only once.
- This method cannot be used together with another
subgrid(…)
method. - Rounding mode, clipping mode, margin and chunk size, if different than default values, should be set before to invoke this method.
- Slicing can be applied after this method.
- This method does not reduce the number of dimensions of the grid geometry.
For dimensionality reduction, see
GridGeometry.selectDimensions(int[])
.
- Parameters:
areaOfInterest
- the area of interest and desired resolution as a grid geometry.- Returns:
this
for method call chaining.- Throws:
DisjointExtentException
- if the given grid of interest does not intersect the grid extent.IncompleteGridGeometryException
- if a mandatory property of a grid geometry is absent.IllegalGridGeometryException
- if an error occurred while converting the envelope coordinates to grid coordinates.IllegalStateException
- if asubgrid(…)
orslice(…)
method has already been invoked.- See Also:
- Extent in
-
subgrid
Requests a grid geometry over a sub-envelope and optionally with a coarser resolution. The given envelope does not need to be expressed in the same coordinate reference system (CRS) than the CRS of the base grid geometry; coordinate conversions or transformations will be applied as needed. That envelope CRS may have fewer dimensions than the base grid geometry CRS, in which case grid dimensions not mapped to envelope dimensions will be returned unchanged. The target resolution, if provided, shall be in same units and same order than the given envelope axes. If the length ofresolution
array is less than the number of dimensions ofareaOfInterest
, then no subsampling will be applied on the missing dimensions.Notes:
- This method can be invoked only once.
- This method cannot be used together with another
subgrid(…)
method. - Rounding mode, clipping mode, margin and chunk size, if different than default values, should be set before to invoke this method.
- Slicing can be applied after this method.
- This method does not reduce the number of dimensions of the grid geometry.
For dimensionality reduction, see
GridGeometry.selectDimensions(int[])
. - If the given envelope is known to be expressed in the same CRS than the grid geometry,
then the CRS of the envelope
can be left unspecified (
null
). It may give a slight performance improvement by avoiding the check for coordinate transformation. - Subsampling computed by this method may be fractional. Consequently, calls to
getSubsampling()
andgetSubsamplingOffsets()
after this method may cause anIllegalStateException
to be thrown.
- Parameters:
areaOfInterest
- the desired spatiotemporal region in any CRS (transformations will be applied as needed), ornull
for not restricting the sub-grid to a sub-area.resolution
- the desired resolution in the same units and order than the axes of the given envelope, ornull
or an empty array if no subsampling is desired. The array length should be equal to theareaOfInterest
dimension, but this is not mandatory (zero or missing values mean no sub-sampling, extraneous values are ignored).- Returns:
this
for method call chaining.- Throws:
DisjointExtentException
- if the given area of interest does not intersect the grid extent.IncompleteGridGeometryException
- if the base grid geometry has no extent, no "grid to CRS" transform, or no CRS (unlessareaOfInterest
has no CRS neither, in which case the CRS are assumed the same).IllegalGridGeometryException
- if an error occurred while converting the envelope coordinates to grid coordinates.IllegalStateException
- if asubgrid(…)
orslice(…)
method has already been invoked.- See Also:
-
findBaseToAOI
private org.opengis.referencing.operation.MathTransform findBaseToAOI(org.opengis.referencing.crs.CoordinateReferenceSystem target) throws org.opengis.util.FactoryException Returns the transform from the CRS of the base grid to the CRS of user supplied argument.- Parameters:
target
- the CRS of the user supplied argument (envelope ou position).- Returns:
- transform from base grid to user argument.
- Throws:
org.opengis.util.FactoryException
-
wraparound
private WraparoundAdjustment wraparound(org.opengis.referencing.operation.MathTransform baseToAOI, org.opengis.referencing.operation.MathTransform gridToCRS) throws org.opengis.referencing.operation.TransformException Creates an instance of the helper class for shifting positions and envelopes inside the grid.- Parameters:
baseToAOI
- the transform computed byfindBaseToAOI(CoordinateReferenceSystem)
, ornull
if same as the CRS of the base grid geometry.gridToCRS
- the transform computed bydropUnusedDimensions(MathTransform, int)
(the transform from grid coordinates to the CRS of user supplied AOI/POI).- Throws:
org.opengis.referencing.operation.TransformException
-
dropUnusedDimensions
private org.opengis.referencing.operation.MathTransform dropUnusedDimensions(org.opengis.referencing.operation.MathTransform gridToCRS, int dimension) throws org.opengis.util.FactoryException, org.opengis.referencing.operation.TransformException Drops the source dimensions that are not needed for producing the target dimensions. The retained source dimensions are stored inmodifiedDimensions
. This method is invoked in an effort to make the transform invertible.- Parameters:
gridToCRS
- transform from grid coordinates to AOI coordinates.dimension
- value ofcornerToCRS.getTargetDimensions()
.- Throws:
org.opengis.util.FactoryException
org.opengis.referencing.operation.TransformException
-
getPointOfInterest
private double[] getPointOfInterest()Returns the point of interest of currentbaseExtent
, keeping only the remaining dimensions afterdropUnusedDimensions(MathTransform, int)
execution. The position is in units ofbase
grid coordinates.This method assumes that the transform will be used with a "cell corner to CRS" transform instead of the usual "cell center to CRS".
-
setBaseExtentClipped
SetsbaseExtent
to the given envelope clipped to the previous extent. This method shall be invoked for clipping only, without any subsampling applied. The context for invoking this method is:subgrid(GridGeometry)
before subsampling is applied.subgrid(Envelope, double...)
before resolution is applied.
- Parameters:
indices
- the envelopes to intersect in units ofbase
grid coordinates. Shall contain at least one element.- Throws:
DisjointExtentException
- if the given envelope does not intersect the grid extent.- See Also:
-
subgrid
Requests a grid geometry over a sub-region of the base grid geometry and optionally with subsampling. The given grid geometry must have the same number of dimension than the base grid geometry. If the length ofsubsampling
array is less than the number of dimensions, then no subsampling will be applied on the missing dimensions.Notes:
- This method can be invoked only once.
- This method cannot be used together with another
subgrid(…)
method. - Rounding mode, clipping mode, margin and chunk size, if different than default values, should be set before to invoke this method.
- Slicing can be applied after this method.
- This method does not reduce the number of dimensions of the grid geometry.
For dimensionality reduction, see
GridGeometry.selectDimensions(int[])
.
- Parameters:
areaOfInterest
- the desired grid extent in unit of base grid cell (i.e. ignoring subsampling), ornull
for not restricting the sub-grid to a sub-area.subsampling
- the subsampling to apply on each grid dimension, ornull
if none. All values shall be greater than zero. If the array length is shorter than the number of dimensions, missing values are assumed to be 1.- Returns:
this
for method call chaining.- Throws:
DisjointExtentException
- if the given area of interest does not intersect the grid extent.IncompleteGridGeometryException
- if the base grid geometry has no extent, no "grid to CRS" transform, or no CRS (unlessareaOfInterest
has no CRS neither, in which case the CRS are assumed the same).IllegalStateException
- if asubgrid(…)
orslice(…)
method has already been invoked.- Since:
- 1.1
- See Also:
-
subsample
Applies a subsampling on the grid geometry to build. This method can be invoked as an alternative tosubgrid(…)
methods if only the resolution needs to be changed. The extent of the built grid geometry will be derived fromgetIntersection()
as below for each dimension i:- The low is divided by
subsampling[i]
, rounded toward zero. - The size is divided by
subsampling[i]
, rounded toward zero. - The high is recomputed from above low and size.
Preconditions
This method assumes that subsampling are divisors of chunk sizes and are not greater than the maximum subsampling. It is caller responsibility to ensure that those preconditions are met.- Parameters:
subsampling
- the subsampling to apply on each grid dimension. All values shall be greater than zero. If the array length is shorter than the number of dimensions, missing values are assumed to be 1.- Returns:
this
for method call chaining.- Throws:
IllegalStateException
- if a subsampling has already been set, for example by a call tosubgrid(…)
.- See Also:
- The low is divided by
-
slice
Requests a grid geometry for a slice at the given "real world" position. The given position can be expressed in any coordinate reference system (CRS). The position should not define a coordinate for all dimensions, otherwise the slice would degenerate to a single point. Dimensions can be left unspecified either by assigning toslicePoint
a CRS without those dimensions, or by assigning the NaN value to some coordinates.Example: if the coordinate reference system of base grid geometry has (longitude, latitude, time) axes, then a (longitude, latitude) slice at time t can be created with one of the following two positions:- A three-dimensional position with (
Double.NaN
,Double.NaN
, t) coordinates. - A one-dimensional position with (t) coordinate and the coordinate reference system set to the temporal component of the grid geometry CRS.
Notes:
- This method can be invoked after
subgrid(Envelope, double...)
, but not before. - If a non-default rounding mode is desired, it should be specified before to invoke this method.
- This method does not reduce the number of dimensions of the grid geometry.
For dimensionality reduction, see
GridGeometry.selectDimensions(int[])
. - If the given point is known to be expressed in the same CRS than the grid geometry,
then the CRS of the point
can be left unspecified (
null
). It may give a slight performance improvement by avoiding the check for coordinate transformation.
- Parameters:
slicePoint
- the coordinates where to get a slice. If no coordinate reference system is associated, this method assumes that the slice point CRS is the CRS of the base grid geometry.- Returns:
this
for method call chaining.- Throws:
IncompleteGridGeometryException
- if the base grid geometry has no extent, no "grid to CRS" transform, or no CRS (unlessslicePoint
has no CRS neither, in which case the CRS are assumed the same).IllegalGridGeometryException
- if an error occurred while converting the point coordinates to grid coordinates.PointOutsideCoverageException
- if the given point is outside the grid extent.
- A three-dimensional position with (
-
sliceByRatio
Requests a grid geometry for a slice at the given relative position. The relative position is specified by a ratio between 0 and 1 where 0 maps to low grid coordinates, 1 maps to high grid coordinates and 0.5 maps to the median position. The slicing is applied on all dimensions except the specified dimensions to keep.Example: given a n-dimensional cube, the following call creates a slice of the two first dimensions (numbered 0 and 1, typically the dimensions of x and y axes) located at the center (ratio 0.5) of all other dimensions (typically z and/or t axes):- Parameters:
sliceRatio
- the ratio to apply on all grid dimensions except the ones to keep.dimensionsToKeep
- the grid dimension to keep unchanged.- Returns:
this
for method call chaining.- Throws:
IncompleteGridGeometryException
- if the base grid geometry has no extent.IndexOutOfBoundsException
- if adimensionsToKeep
value is out of bounds.
-
build
Builds a grid geometry with the configuration specified by the other methods in thisGridDerivation
class.- Returns:
- the modified grid geometry. May be the
base
grid geometry if no change apply. - Throws:
IllegalGridGeometryException
- if the grid geometry cannot be computed because of arguments given to asubgrid(…)
or other methods.- See Also:
-
getBaseExtentExpanded
- Parameters:
nonNull
- whether the returned value should be guaranteed non-null.- Throws:
IncompleteGridGeometryException
- ifnonNull
istrue
and the grid geometry has no extent.- See Also:
-
#setBaseExtentClipped(GeneralEnvelope)
-
getIntersection
Returns the extent of the modified grid geometry, ignoring subsampling or changes in resolution. This is the intersection of thebase
grid geometry with the (grid or geospatial) envelope given to asubgrid(…)
method, expanded by the specified margin (if any) and potentially with some grid sizes set to 1 if aslice(…)
method has been invoked. The returned extent is in units of thebase
grid cells, i.e. subsampling is ignored.This method can be invoked after
build()
for getting additional information.- Returns:
- intersection of grid geometry extents in units of
base
grid cells. - Throws:
IncompleteGridGeometryException
- if the base grid geometry has no extent.
-
getSubsampling
public int[] getSubsampling()Returns the strides for accessing cells along each axis of the base grid. Those values define part of the conversion from derived grid coordinates (x, y, z) to base grid coordinates (x′, y′, z′) as below (generalize to as many dimensions as needed):- x′ = s₀⋅x + t₀
- y′ = s₁⋅y + t₁
- z′ = s₂⋅z + t₂
getSubsamplingOffsets()
returns the {t₀, t₁, t₂} values. All subsampling values are strictly positive integers.Application to iterationsThis method can be invoked after
Iteration overareaOfInterest
grid coordinates with a stride Δx=1 corresponds to an iteration inbase
grid coordinates with a stride of Δx′=s₀, a stride Δy=1 corresponds to a stride Δy′=s₁, etc.build()
for getting additional information. Ifsubgrid(GridExtent, int...)
has been invoked, then this method returns the values that were given in thesubsampling
argument.- Returns:
- an estimation of the strides for accessing cells along each axis of
base
grid. - Throws:
IllegalStateException
- if the subsampling factors are not integers. It may happen if the derived grid has been constructed by a call tosubgrid(Envelope, double...)
.- Since:
- 1.1
- See Also:
-
roundSubsampling
private int roundSubsampling(double scale, int dimension) Rounds a subsampling value according the currentRoundingMode
. IfmaximumSubsampling
values have been specified, then subsampling is clamped if needed. If achunkSize
has been specified, then the subsampling will be a divisor of that size. This is necessary for avoiding a drift of subsampled pixel coordinates computed from tile coordinates.Drift example: if the tile size is 16 pixels and the subsampling is 3, then the subsampled tile size is ⌊16/3⌋ = 5 pixels. Pixel coordinates for each tile is as below:Tile and pixel coordinates for subsampling of 3 pixels Tile index Pixel coordinate Subsampled pixel coordinate 0 0 0 1 16 5 2 32 10 3 48 16 GridCoverageResource
implementations, it would require to read the last row of tile #2 and insert those data as the first row of tile #3. It does not only make implementations much more difficult, but also hurts performance because fetching a single tile would actually require the "physical" reading of 2 or more tiles.- Parameters:
scale
- the scale factor to round.dimension
- the dimension of the scale factor to round.
-
tolerance
private double tolerance(int dimension) Returns a tolerance factor for comparing scale factors in the given dimension. The tolerance is such that the errors of pixel coordinates computed using the scale factor should not be greater than 0.5 pixel. -
getSubsamplingOffsets
public int[] getSubsamplingOffsets()Returns the offsets to be subtracted from pixel coordinates before subsampling. In a conversion from derived grid to base grid coordinates (the opposite direction of subsampling), the offset is the value to add after multiplication by the subsampling factor. It may be negative.This method can be invoked after
build()
for getting additional information.- Returns:
- conversion from the new grid to the original grid specified to the constructor.
- Throws:
IllegalStateException
- if the subsampling offsets are not integers. It may happen if the derived grid has been constructed by a call tosubgrid(Envelope, double...)
.- Since:
- 1.1
- See Also:
-
toTree
Returns a tree representation of thisGridDerivation
. The tree representation is for debugging purpose only and may change in any future SIS version.- Parameters:
locale
- the locale to use for textual labels.- Returns:
- a tree representation of this
GridDerivation
.
-
toString
Returns a string representation of thisGridDerivation
for debugging purpose. The returned string is implementation dependent and may change in any future version.
-