Class GridGeometry
- All Implemented Interfaces:
Serializable,LenientComparable
GridGeometry contains:
- A grid extent (a.k.a. grid envelope),
often inferred from the
RenderedImagesize. - A grid to CRS transform, which may be inferred from the grid extent and the georeferenced envelope.
- A georeferenced envelope, which can be inferred from the grid extent and the grid to CRS transform.
- An optional Coordinate Reference System (CRS) specified as part of the georeferenced envelope. This CRS is the target of the grid to CRS transform.
- An estimation of
grid resolutionalong each CRS axes, computed from the grid to CRS transform and eventually from the grid extent. - An indication of whether conversion for some axes is linear or not.
GridGeometry knows nothing about RenderedImage,
but GridCoverage2D has this information and may use it for providing a missing grid extent.
By default, any request for an undefined property will throw an IncompleteGridGeometryException.
In order to check if a property is defined, use isDefined(int).
Non-linear referencing
A key property is the "grid to CRS" conversion, which defines how to map pixel coordinates to "real world" coordinates such as latitudes and longitudes. This relationship is often linear (an affine transform), but not necessarily;GridGeometry accepts non-linear conversions as well. Non-linear conversions may occur with images
using localization grids,
but non-linear conversions should not be used for expressing map projections (projections should be specified
in the Coordinate Reference System (CRS) instead).
Some applications cannot handle non-linear "grid to CRS" conversions.
For example, encoding an image in a GeoTIFF file is much simpler if the "grid to CRS" conversion is linear.
The DomainLinearizer class can be used for replacing non-linear conversions by linear approximations.
Multi-threading
GridGeometry instances are immutable and thread-safe.
The same instance can be shared by different GridCoverage instances.- Since:
- 1.0
- See Also:
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final intA bitmask to specify the validity of the Coordinate Reference System property.protected final ImmutableEnvelopeThe geodetic envelope, ornullif unknown.static final intA bitmask to specify the validity of the geodetic envelope property.protected final GridExtentThe valid domain of a grid coverage, ornullif unknown.static final intA bitmask to specify the validity of the grid extent property.static final intA bitmask to specify the validity of the geographic bounding box.static final intA bitmask to specify the validity of thegrid to CRS
transform.protected final MathTransformThe conversion from grid indices to "real world" coordinates, ornullif unknown.static final intA bitmask to specify the validity of the "real world" coordinates of cell at indices (0, 0, …, 0).protected final double[]An estimation of the grid resolution, in units of the CRS axes.static final intA bitmask to specify the validity of the grid resolution.static final intA bitmask to specify the validity of the temporal period.static final GridGeometryAn "empty" grid geometry with no value defined. -
Constructor Summary
ConstructorsModifierConstructorDescriptionGridGeometry(GridExtent extent, PixelInCell anchor, MathTransform gridToCRS, CoordinateReferenceSystem crs) Creates a new grid geometry from a grid extent and a mapping from cell coordinates to "real world" coordinates.GridGeometry(GridExtent extent, Envelope envelope, GridOrientation orientation) Creates an axis-aligned grid geometry with an extent and an envelope.protectedGridGeometry(GridGeometry other) Creates a new grid geometry with the same values as the given grid geometry.GridGeometry(GridGeometry other, GridExtent extent, MathTransform toOther) Creates a new grid geometry derived from the given grid geometry with a new extent and a modified transform.GridGeometry(GridGeometry lower, GridGeometry upper) Creates a new grid geometry as the concatenation of the two specified grid geometries.GridGeometry(PixelInCell anchor, MathTransform gridToCRS, Envelope envelope, GridRoundingMode rounding) Creates a new grid geometry from a geospatial envelope and a mapping from cell coordinates to "real world" coordinates.GridGeometry(Envelope envelope) Creates a grid geometry with only an envelope. -
Method Summary
Modifier and TypeMethodDescriptionbooleancontains(GridGeometry other) Returnstrueif this grid geometry contains the given grid geometry within a tolerance of ½ cell.createImageCRS(String name, PixelInCell anchor) Creates a one-, two- or three-dimensional coordinate reference system for cell indices in the grid.createTransformTo(GridGeometry target, PixelInCell anchor) Creates a transform from cell coordinates in this grid to cell coordinates in the given grid.derive()Returns an object that can be used for creating a new grid geometry derived from this grid geometry.booleanCompares the specified object with this grid geometry for equality.booleanequals(Object object, ComparisonMode mode) Compares the specified object with this grid geometry for equality.extentOf(GridGeometry other, PixelInCell include, GridRoundingMode rounding) Returns the coordinate range of another grid geometry in units of cells of this grid geometry.Returns the "real world" coordinate reference system.final intReturns the number of dimensions of the grid.Returns the bounding box of "real world" coordinates for this grid geometry.Returns the "real world" bounding box of this grid geometry transformed to the given CRS.Returns the valid coordinate range of a grid coverage.Returns the approximate latitude and longitude coordinates of the grid.getGridToCRS(PixelInCell anchor) Returns the conversion from grid coordinates to "real world" coordinates.getLinearGridToCRS(PixelInCell anchor) Returns a linear approximation of the conversion from grid coordinates to "real world" coordinates.double[]Returns the "real world" coordinates of the cell at indices (0, 0, … 0).double[]getResolution(boolean allowEstimates) Returns an estimation of the grid resolution, in units of the coordinate reference system axes.Instant[]Returns the start time and end time of coordinates of the grid.intReturns a hash value for this grid geometry.booleanintersects(GridGeometry other) Returnstrueif this grid geometry intersects the given grid geometry.booleanisConversionLinear(int... targets) Indicates whether the grid to CRS conversion is linear for all the specified CRS axes.booleanisDefined(int bitmask) Returnstrueif all the properties specified by the argument are set.relocate(GridExtent newExtent) Returns a grid geometry with the given grid extent, which implies a new "real world" computation.selectDimensions(int... indices) Returns a grid geometry that encompass only some dimensions of this grid geometry.final GridGeometryshiftGrid(long... translation) Translates grid coordinates by the given number of cells without changing "real world" coordinates.shiftGrid(long[] translation, boolean negate) Translates grid coordinates by the given number of cells, optionally in the reverse direction.Translates the grid to lower coordinate values of zero without changing the "real world" coordinates.Returns a string representation of this grid geometry.Returns a tree representation of some elements of this grid geometry.upsample(int[] periods) Deprecated.upsample(long... periods) Creates a new grid geometry upsampled by the given number of cells along each grid dimensions.
-
Field Details
-
CRS
public static final int CRSA bitmask to specify the validity of the Coordinate Reference System property.- See Also:
-
ENVELOPE
public static final int ENVELOPEA bitmask to specify the validity of the geodetic envelope property.- See Also:
-
EXTENT
public static final int EXTENTA bitmask to specify the validity of the grid extent property.- See Also:
-
GRID_TO_CRS
public static final int GRID_TO_CRSA bitmask to specify the validity of thegrid to CRS
transform.- See Also:
-
ORIGIN
public static final int ORIGINA bitmask to specify the validity of the "real world" coordinates of cell at indices (0, 0, …, 0).- Since:
- 1.5
- See Also:
-
RESOLUTION
public static final int RESOLUTIONA bitmask to specify the validity of the grid resolution.- See Also:
-
GEOGRAPHIC_EXTENT
public static final int GEOGRAPHIC_EXTENTA bitmask to specify the validity of the geographic bounding box. This information can sometimes be derived from the envelope and the CRS. It is an optional element even with a complete grid geometry since the coordinate reference system is not required to have an horizontal component.- See Also:
-
TEMPORAL_EXTENT
public static final int TEMPORAL_EXTENTA bitmask to specify the validity of the temporal period. This information can sometimes be derived from the envelope and the CRS. It is an optional element even with a complete grid geometry since the coordinate reference system is not required to have a temporal component.- See Also:
-
extent
The valid domain of a grid coverage, ornullif unknown. The lowest valid grid coordinate is zero forBufferedImage, but may be non-zero for arbitraryRenderedImage. A grid with 512 cells can have a minimum coordinate of 0 and maximum of 511.- See Also:
-
envelope
The geodetic envelope, ornullif unknown. If non-null, this envelope is usually the gridextenttransformed to real world coordinates. The Coordinate Reference System} (CRS) of this envelope defines the "real world" CRS of this grid geometry.- See Also:
-
gridToCRS
The conversion from grid indices to "real world" coordinates, ornullif unknown. If non-null, the conversion shall map cell center. This conversion is usually, but not necessarily, affine.- See Also:
-
resolution
protected final double[] resolutionAn estimation of the grid resolution, in units of the CRS axes. Computed fromgridToCRS, eventually together withextent. May benullif unknown. If non-null, the array length is equal to the number of CRS dimensions.- See Also:
-
UNDEFINED
An "empty" grid geometry with no value defined. All getter methods invoked on this instance will causeIncompleteGridGeometryExceptionto be thrown. This instance can be used as a place-holder when the grid geometry cannot be obtained.
-
-
Constructor Details
-
GridGeometry
Creates a new grid geometry with the same values as the given grid geometry. This is a copy constructor for subclasses.- Parameters:
other- the other grid geometry to copy.
-
GridGeometry
public GridGeometry(GridGeometry other, GridExtent extent, MathTransform toOther) throws TransformException Creates a new grid geometry derived from the given grid geometry with a new extent and a modified transform. This constructor is used for creating a grid geometry over a subregion (for example with the grid extent computed byGridDerivation.subgrid(Envelope, double...)) or grid geometry for a subsampled raster.Conversion between old and new grid geometry
IftoOtheris non-null, it defines the conversion from grid coordinates of givenextentto grid coordinates ofother. That transform should be a scale and a translation only, but more complex transforms are accepted. ThecornerToCRStransform of the new grid geometry will be set to the following concatenation:
The new grid geometry envelope will be computed from the new extent and transform, then clipped to the envelope of the other grid geometry. This clip is for preventing the envelope to become larger under the effect of subsampling because each cell become larger. The clip is not applied whenthis.cornerToCRS=toOther→other.cornerToCRStoOtherisnullbecause in such case, we presume that the grid extent has been changed for another reason than subsampling (e.g. application of a margin, in which case we want the envelope to be expanded).- Parameters:
other- the other grid geometry to copy.extent- the new extent for the grid geometry to construct, ornullif none.toOther- transform from this grid coordinates toothergrid coordinates, ornullif none.- Throws:
NullPointerException- ifextentisnulland the other grid geometry contains no other information.TransformException- if the math transform cannot compute the geospatial envelope from the grid extent.- Since:
- 1.2
- See Also:
-
GridGeometry
public GridGeometry(GridExtent extent, PixelInCell anchor, MathTransform gridToCRS, CoordinateReferenceSystem crs) Creates a new grid geometry from a grid extent and a mapping from cell coordinates to "real world" coordinates. At least one ofextent,gridToCRSorcrsarguments shall be non-null. IfgridToCRSis non-null, thenanchorshall be non-null too with one of the following values:PixelInCell.CELL_CENTERif conversions of cell indices bygridToCRSgive "real world" coordinates close to the center of each cell.PixelInCell.CELL_CORNERif conversions of cell indices bygridToCRSgive "real world" coordinates at the corner of each cell. The cell corner is the one for which all grid indices have the smallest values (closest to negative infinity).
API note
There is no default value foranchorbecause experience shows that images shifted by ½ pixel (with pixels that may be tens of kilometres large) is a recurrent problem. We want to encourage developers to always think about wether their grid to CRS transform is mapping pixel corner or center.Upcoming API generalization: theextenttype of this method may be changed toGridEnvelopeinterface in a future Apache SIS version. This is pending GeoAPI update. In addition, thePixelInCellcode list currently defined in theorg.opengis.referencing.datumpackage may move in another package in a future GeoAPI version because this type is no longer defined by the ISO 19111 standard after the 2018 revision.- Parameters:
extent- the valid extent of grid coordinates, ornullif unknown.anchor- Cell center for OGC conventions or cell corner for Java2D/JAI conventions.gridToCRS- the mapping from grid coordinates to "real world" coordinates, ornullif unknown.crs- the coordinate reference system of the "real world" coordinates, ornullif unknown.- Throws:
NullPointerException- ifextent,gridToCRSandcrsarguments are all null.MismatchedDimensionException- if the math transform and the CRS do not have consistent dimensions.IllegalGridGeometryException- if the math transform cannot compute the geospatial envelope or resolution from the grid extent.
-
GridGeometry
public GridGeometry(PixelInCell anchor, MathTransform gridToCRS, Envelope envelope, GridRoundingMode rounding) Creates a new grid geometry from a geospatial envelope and a mapping from cell coordinates to "real world" coordinates. At least one ofgridToCRSorenvelopearguments shall be non-null. IfgridToCRSis non-null, thenanchorshall be non-null too with one of the values documented in theconstructor expecting a grid extent.The given envelope shall encompass all cell surfaces, from the left border of leftmost cell to the right border of the rightmost cell and similarly along other axes. This constructor tries to store a geospatial envelope close to the specified envelope, but there is no guarantee that the envelope returned by
getEnvelope()will be equal to the given envelope. The envelope stored in the newGridGeometrymay be slightly smaller, larger or shifted because the floating point values used in geospatial envelope cannot always be mapped to the integer coordinates used inGridExtent. The rules for deciding whether coordinates should be rounded toward nearest integers, to floor or to ceil values are specified by theGridRoundingModeargument.Because of the uncertainties explained in above paragraph, this constructor should be used only in last resort, when the grid extent is unknown. For determinist results, developers should prefer the constructor using grid extent as much as possible. In particular, this constructor is not suitable for computing grid geometry of tiles in a tiled image, because the above-cited uncertainties may result in apparently random black lines between tiles.
Upcoming API change: ThePixelInCellcode list currently defined in theorg.opengis.referencing.datumpackage may move in another package in a future GeoAPI version because this type is no longer defined by the ISO 19111 standard after the 2018 revision. This code list may be taken by ISO 19123 in a future revision.- Parameters:
anchor- Cell center for OGC conventions or cell corner for Java2D/JAI conventions.gridToCRS- the mapping from grid coordinates to "real world" coordinates, ornullif unknown.envelope- the geospatial envelope, including its coordinate reference system if available. There is no guarantee that the envelope actually stored in theGridGeometrywill be equal to this specified envelope.rounding- controls behavior of rounding from floating point values to integers.- Throws:
IllegalGridGeometryException- if the math transform cannot compute the grid extent or the resolution.
-
GridGeometry
Creates an axis-aligned grid geometry with an extent and an envelope. This constructor can be used when the grid to CRS transform is unknown. If only the coordinate reference system is known, then the envelope coordinates can be all NaN.The main purpose of this constructor is to create "desired" grid geometries, for example for use in read or resample operations. For grid geometries describing preexisting data, it is safer and more flexible to use one of the constructors expecting a
MathTransformargument.Dimension order
The given envelope shall always declare dimensions in same order as the given extent. This constructor may reorder axes iforientationisGridOrientation.DISPLAY, but in such case this constructor will derive a new envelope and a new CRS from the given envelope.- Parameters:
extent- the valid extent of grid coordinates, ornullif unknown.envelope- the envelope together with CRS of the "real world" coordinates, ornullif unknown.orientation- high-level description of desired characteristics of thegridToCRStransform. Ignored (can be null) ifenvelopeis null.- Throws:
NullPointerException- ifextentandenvelopearguments are both null, or ifenvelopeis non-null butorientationis null.MismatchedDimensionException- if the envelope does not have the same number of dimensions than the grid extent.- Since:
- 1.1
- See Also:
-
GridGeometry
Creates a grid geometry with only an envelope.- Parameters:
envelope- the envelope together with CRS of the "real world" coordinates.- Throws:
IllegalArgumentException- if the envelope has no CRS and only NaN coordinate values.- Since:
- 1.4
-
GridGeometry
Creates a new grid geometry as the concatenation of the two specified grid geometries. The number of dimensions of the new grid geometry is the sum of the number of dimensions of the two specified grid geometries. The dimensions of the lower grid geometry are first, followed by the dimensions of the upper grid geometry.- Parameters:
lower- the grid geometry providing the lowest dimensions.upper- the grid geometry providing the highest dimensions.- Throws:
IncompleteGridGeometryException- if a property presents in one grid geometry is absent in the other.IllegalArgumentException- if the concatenation results in duplicated grid axis types.FactoryException- if the geodetic factory failed to create the compound CRS.- Since:
- 1.5
- See Also:
-
-
Method Details
-
getDimension
public final int getDimension()Returns the number of dimensions of the grid. This is typically the same than the number of envelope dimensions or the number of coordinate reference system dimensions, but not necessarily.- Returns:
- the number of grid dimensions.
- See Also:
-
getExtent
Returns the valid coordinate range of a grid coverage. The lowest valid grid coordinate is zero forBufferedImage, but may be non-zero for arbitraryRenderedImage. A grid with 512 cells can have a minimum coordinate of 0 and maximum of 511.Upcoming API generalization: the return type of this method may be changed toGridEnvelopeinterface in a future Apache SIS version. This is pending GeoAPI update.- Returns:
- the valid extent of grid coordinates (never
null). - Throws:
IncompleteGridGeometryException- if this grid geometry has no extent — i.e.isDefined(EXTENT)returnedfalse.
-
getGridToCRS
Returns the conversion from grid coordinates to "real world" coordinates. The conversion is often an affine transform, but not necessarily. Conversions from cell indices to geospatial coordinates can be performed for example as below:Callers must specify whether they want the "real world" coordinates of cell center or cell corner. The cell corner is the one for which all grid indices have the smallest values (closest to negative infinity). As a rule of thumb:MathTransform gridToCRS = gridGeometry.getGridToCRS(PixelInCell.CELL_CENTER); DirectPosition indicesOfCell = new GeneralDirectPosition(2, 3, 4): DirectPosition aPixelCenter = gridToCRS.transform(indicesOfCell, null);- Use
PixelInCell.CELL_CENTERfor transforming points. - Use
PixelInCell.CELL_CORNERfor transforming envelopes with inclusive lower coordinates and exclusive upper coordinates.
API note
There is no default value foranchorbecause experience shows that images shifted by ½ pixel (with pixels that may be tens of kilometres large) is a recurrent problem. We want to encourage developers to always think about wether the desired grid to CRS transform shall map pixel corner or center.- Parameters:
anchor- the cell part to map (center or corner).- Returns:
- the conversion from grid coordinates to "real world" coordinates (never
null). - Throws:
IllegalArgumentException- if the givenanchoris not a known code list value.IncompleteGridGeometryException- if this grid geometry has no transform — i.e.isDefined(GRID_TO_CRS)returnedfalse.
- Use
-
getLinearGridToCRS
Returns a linear approximation of the conversion from grid coordinates to "real world" coordinates. If the value returned bygetGridToCRS(PixelInCell)is already an instance ofLinearTransform, then it is returned as is. Otherwise this method computes the tangent of the transform at the grid extent point of interest (usually the center of the grid).- Parameters:
anchor- the cell part to map (center or corner).- Returns:
- linear approximation of the conversion from grid coordinates to "real world" coordinates.
- Throws:
IllegalArgumentException- if the givenanchoris not a known code list value.IncompleteGridGeometryException- if this grid geometry has no transform, or if the transform is non-linear but this grid geometry has no extent.TransformException- if an error occurred while computing the tangent.- Since:
- 1.3
-
getCoordinateReferenceSystem
Returns the "real world" coordinate reference system.- Returns:
- the coordinate reference system (never
null). - Throws:
IncompleteGridGeometryException- if this grid geometry has no CRS — i.e.isDefined(CRS)returnedfalse.
-
getEnvelope
Returns the bounding box of "real world" coordinates for this grid geometry. This envelope is computed from the grid extent, which is transformed to the "real world" coordinate system. The initial envelope encompasses all cell surfaces, from the left border of leftmost cell to the right border of the rightmost cell and similarly along other axes. If this grid geometry is a subgrid, then the envelope is also clipped to the envelope of the original (non subsampled) grid geometry.- Returns:
- the bounding box in "real world" coordinates (never
null). - Throws:
IncompleteGridGeometryException- if this grid geometry has no envelope — i.e.isDefined(ENVELOPE)returnedfalse.
-
getEnvelope
Returns the "real world" bounding box of this grid geometry transformed to the given CRS. This envelope is computed from the grid extent if available, or from the envelope otherwise.- Parameters:
crs- the desired coordinate reference system for the returned envelope.- Returns:
- the bounding box in "real world" coordinates (never
null). - Throws:
IncompleteGridGeometryException- if this grid geometry has no extent and no envelope.TransformException- if the envelope cannot be transformed to the specified CRS.- Since:
- 1.2
-
getGeographicExtent
Returns the approximate latitude and longitude coordinates of the grid. The prime meridian is Greenwich, but the geodetic reference frame is not necessarily WGS 84. This is computed from the envelope if the coordinate reference system contains an horizontal component such as a geographic or projected CRS.API note
This method does not throwIncompleteGridGeometryExceptionbecause the geographic extent may be absent even with a complete grid geometry. Grid geometries are not required to have a spatial component on Earth surface; a raster could be a vertical profile for example.- Returns:
- the geographic bounding box in "real world" coordinates.
-
getTemporalExtent
Returns the start time and end time of coordinates of the grid. If the grid has no temporal dimension, then this method returns an empty array. If only the start time or end time is defined, then returns an array of length 1. Otherwise this method returns an array of length 2 with the start time in the first element and the end time in the last element.- Returns:
- time range as an array of length 0 (if none), 1 or 2.
-
getOrigin
public double[] getOrigin()Returns the "real world" coordinates of the cell at indices (0, 0, … 0). The returned coordinates map the cell corner. This method computes the origin from the "grid to CRS" transform if available. If that transform is not available, then the minimal coordinate values of the envelope are returned.- Returns:
- the "real world" coordinates of the cell at indices (0, 0, … 0).
- Throws:
IncompleteGridGeometryException- if this grid geometry has no origin — i.e.isDefined(ORIGIN)returnedfalse.- Since:
- 1.5
-
getResolution
public double[] getResolution(boolean allowEstimates) Returns an estimation of the grid resolution, in units of the coordinate reference system axes. The length of the returned array is the number of CRS dimensions, withresolution[0]being the resolution along the first CRS axis,resolution[1]the resolution along the second CRS axis, etc. Note that this axis order is not necessarily the same as grid axis order.If the resolution at CRS dimension i is not a constant factor (i.e. the
isConversionLinear(i)returnsfalse), thenresolution[i]is set to one of the following values:Double.NaNifallowEstimatesisfalse.- An arbitrary representative resolution otherwise.
Current implementation computes the resolution at
grid center, but different implementations may use alternative algorithms.
- Parameters:
allowEstimates- whether to provide some values even for resolutions that are not constant factors.- Returns:
- an estimation of the grid resolution (never
null). - Throws:
IncompleteGridGeometryException- if this grid geometry has no resolution — i.e.isDefined(RESOLUTION)returnedfalse.
-
isConversionLinear
public boolean isConversionLinear(int... targets) Indicates whether the grid to CRS conversion is linear for all the specified CRS axes. The conversion from grid coordinates to real world coordinates is often linear for some dimensions, typically the horizontal ones at indices 0 and 1. But the vertical dimension (usually at index 2) is often non-linear, for example with data at 0, 5, 10, 100 and 1000 metres.- Parameters:
targets- indices of CRS axes. This is not necessarily the same as indices of grid axes.- Returns:
trueif the conversion from grid coordinates to "real world" coordinates is linear for all the given CRS dimension.
-
isDefined
public boolean isDefined(int bitmask) Returnstrueif all the properties specified by the argument are set. If this method returnstrue, then invoking the corresponding getter methods will not throwIncompleteGridGeometryException.- Parameters:
bitmask- any combination ofCRS,ENVELOPE,EXTENT,GRID_TO_CRSand derived bit masks.- Returns:
trueif all specified properties are defined (i.e. invoking the corresponding getter methods will not throwIncompleteGridGeometryException).- Throws:
IllegalArgumentException- if the specified bitmask is not a combination of known masks.- See Also:
-
derive
Returns an object that can be used for creating a new grid geometry derived from this grid geometry.GridDerivationdoes not change the state of thisGridGeometrybut instead creates new instances as needed. Examples of modifications include clipping to a sub-area or applying a sub-sampling.Each
GridDerivationinstance can be used only once and should be used in a single thread.GridDerivationpreserves the number of dimensions. For example, slicing sets the grid size to 1 in all dimensions specified by a slice point, but does not remove those dimensions from the grid geometry. For dimensionality reduction, seeselectDimensions(int[]).Example
For clipping this grid geometry to a sub-area, one can use:GridGeometry gg = ...; Envelope areaOfInterest = ...; gg = gg.derive().rounding(GridRoundingMode.ENCLOSING) .subgrid(areaOfInterest).build();- Returns:
- an object for deriving a grid geometry from
this.
-
upsample
Creates a new grid geometry upsampled by the given number of cells along each grid dimensions. This method multiplies low and high coordinates by the given periods, then scales thegrid to CRStransform for compensating the grid change. The grid geometryenvelopeis preserved after upsampling.Number of arguments
Theperiodsarray length should be equal to the number of grid dimensions. If the array is shorter, missing values default to 1 (i.e. samplings in unspecified dimensions are unchanged). If the array is longer, extraneous values are ignored.- Parameters:
periods- the upsampling factors for each dimension of this grid geometry.- Returns:
- the upsampled grid geometry, or
thisis upsampling results in the same extent. - Throws:
IllegalArgumentException- if a period is not greater than zero.- Since:
- 1.5
- See Also:
-
upsample
Deprecated.Use the version withlongintegers instead ofint. Small overviews of large images require large subsampling factors.Creates a new upsampled grid geometry (32-bits version). Seeupsample(long...)for details.- Parameters:
periods- the upsampling factors for each dimension of this grid geometry.- Returns:
- the upsampled grid geometry, or
thisis upsampling results in the same extent. - Throws:
IllegalArgumentException- if a period is not greater than zero.- Since:
- 1.3
-
shiftGrid
Translates grid coordinates by the given number of cells without changing "real world" coordinates. The returned grid has the same size than this grid, i.e. both low and high grid coordinates are displaced by the same number of cells. The "grid to CRS" transforms are adjusted accordingly in order to map to the same "real world" coordinates.Number of arguments
Thetranslationarray length should be equal to the number of dimensions. If the array is shorter, missing values default to 0 (i.e. no translation in unspecified dimensions). If the array is longer, extraneous values are ignored.- Parameters:
translation- translation to apply on each grid axis in order.- Returns:
- a grid geometry whose coordinates (both low and high ones) and the "grid to CRS" transforms have been translated by given numbers. If the given translation is a no-op (no value or only 0 ones), then this grid is returned as is.
- Throws:
ArithmeticException- if the translation results in coordinates that overflow 64-bits integer.- Since:
- 1.3
- See Also:
-
shiftGrid
Translates grid coordinates by the given number of cells, optionally in the reverse direction. Invoking this method is equivalent to invokingshiftGrid(long...), except that this method use the negative values of the given translation terms if thenegateargument istrue.- Parameters:
translation- translation to apply on each grid axis in order. Can be an array of any length.negate- whether to use the negative values of the given translation terms.- Returns:
- a grid geometry whose coordinates (both low and high ones) and the "grid to CRS" transforms have been translated by given numbers. If the given translation is a no-op (no value or only 0 ones), then this grid is returned as is.
- Throws:
ArithmeticException- if the translation results in coordinates that overflow 64-bits integer.- Since:
- 1.5
-
shiftGridToZeros
Translates the grid to lower coordinate values of zero without changing the "real world" coordinates. The returned grid has the same size than this grid, i.e. both low and high grid coordinates are displaced by the same number of cells. The "grid to CRS" transforms are adjusted accordingly in order to map to the same "real world" coordinates.- Returns:
- a grid geometry whose lower coordinates are zeros.
- Throws:
ArithmeticException- if the translation results in upper coordinates that overflow 64-bits integer.- Since:
- 1.5
-
relocate
Returns a grid geometry with the given grid extent, which implies a new "real world" computation. The "grid to CRS" transforms and the resolution stay the same as thisGridGeometry. The "real world" envelope is recomputed for the new grid extent using the "grid to CRS" transforms.The given extent is taken verbatim; this method does no clipping. The given extent does not need to intersect the extent of this grid geometry.
- Parameters:
newExtent- extent of the grid geometry to return.- Returns:
- grid geometry with the given extent. May be
thisif there is no change. - Throws:
TransformException- if the geospatial envelope cannot be recomputed with the new grid extent.- Since:
- 1.3
-
selectDimensions
Returns a grid geometry that encompass only some dimensions of this grid geometry. The specified dimensions will be copied into a new grid geometry if necessary. The selection is applied on grid extent dimensions; they are not necessarily the same as the envelope dimensions. The given dimensions must be in strictly ascending order without duplicated values. The number of dimensions of the sub grid geometry will bedimensions.length.This method performs a dimensionality reduction. This method cannot be used for changing dimension order. The converse operation is the concatenation.
- Parameters:
indices- the grid (not CRS) dimensions to select, in strictly increasing order.- Returns:
- the sub-grid geometry, or
thisif the given array contains all dimensions of this grid geometry. - Throws:
IndexOutOfBoundsException- if an index is out of bounds.- Since:
- 1.3
- See Also:
-
createImageCRS
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. If the "real world" CRS is an instance ofSingleCRS, then the derived CRS has the following properties:GeneralDerivedCRS.getBaseCRS()isgetCoordinateReferenceSystem().GeneralDerivedCRS.getConversionFromBase()is the inverse ofgetGridToCRS(PixelInCell).
CompoundCRS, then only the firstSingleCRS(the head) is used. This is usually (but not necessarily) the horizontal component of the spatial CRS. The result is usually two-dimensional, but 1 and 3 dimensions are also possible.Because of above relationship, it is possible to use the derived CRS in a chain of operations with (for example)
CRS.findOperation(…).- Parameters:
name- name of the CRS to create.anchor- the cell part to map (center or corner).- Returns:
- a derived CRS for coordinates (cell indices) associated to the grid extent.
- Throws:
IncompleteGridGeometryException- if the CRS, grid extent or "grid to CRS" transform is missing.- Since:
- 1.3
-
createTransformTo
public MathTransform createTransformTo(GridGeometry target, PixelInCell anchor) throws TransformException Creates a transform from cell coordinates in this grid to cell coordinates in the given grid. The returned transform handles change of Coordinate Reference System and wraparound axes (e.g. longitude axis crossing the ±180° meridian) if applicable.Note: the transform created by this method may be non-invertible.
- Parameters:
target- the grid which will be the target of returned transform.anchor-CELL_CENTERfor OGC conventions orCELL_CORNERfor Java2D/JAI conventions.- Returns:
- transform from cell coordinates in this grid to cell coordinates in the given grid.
- Throws:
IncompleteGridGeometryException- if there is not enough information in the two grid geometries.TransformException- if the math transform cannot be created.- Since:
- 1.1
-
extentOf
public GridExtent extentOf(GridGeometry other, PixelInCell include, GridRoundingMode rounding) throws TransformException Returns the coordinate range of another grid geometry in units of cells of this grid geometry. This method gets the transform between cell coordinates and uses it for converting the extent of theothergrid geometry. The grid coordinates are rounded to integers in a way specified by theGridRoundingModeargument. The result does not need to be contained or to intersect the extent of this grid geometry.The
includeargument specifies whether to transform cell corners or cell centers:- With
CELL_CENTER, the returned extent contains the cell centers ofother. - With
CELL_CORNER, the returned extent contains the cell corners ofother. It includes both lower and upper corners, thus covering the full cell areas.
An extent of cell centers may be smaller than an extent of cell areas by a size, on each border, of ½ of the size of the cells of
other.Note that if the transformation involves, for example, a rotation or a map projection, then the returned extent may encompass more cells than the real extent of
other. See envelope transformations for more information.- Parameters:
other- the other grid geometry from which to get the extent in units of this grid geometry.include-CELL_CENTERfor an extent containing cell centers, orCELL_CORNERfor an extent containing all cell corners (i.e. full areas).rounding- whether to round grid coordinates to nearest, enclosing or contained bounds.- Returns:
- the extent of the other grid geometry in cell units of this grid geometry.
- Throws:
IncompleteGridGeometryException- if there is not enough information in the two grid geometries.TransformException- if the grid extent cannot be transformed to the units of this grid geometry.- Since:
- 1.5
- With
-
intersects
Returnstrueif this grid geometry intersects the given grid geometry. This method compares the coordinates of the two grid extents when possible, or between the two envelopes otherwise (fallback). This method may conservatively returntrueif an accurate answer would be expensive to compute. Therefore, a return value oftrueis not a guarantee that the two grids really intersect. However, a return value offalseguarantees that the two grids do not intersect.The comparison is performed in units of this grid geometry by converting the other grid if necessary. Consequently, if the CRS and "grid to CRS" transform are not the same in the two grids, then this method may not be symmetric. In other words, it is not guaranteed that
A.intersects(B) = B.intersects(A)for all (A, B) pairs.- Parameters:
other- the other grid geometry to test for intersection.- Returns:
- whether the other grid geometry intersects or may intersect this grid geometry.
- Throws:
IncompleteGridGeometryException- if there is not enough information in the two grid geometries.- Since:
- 1.5
- See Also:
-
contains
Returnstrueif this grid geometry contains the given grid geometry within a tolerance of ½ cell. This method compares the coordinates of the two grid extents when possible, or between the two envelopes otherwise (fallback). The comparison is exact if the two grids use the same CRS and "grid to CRS". Otherwise, a coordinate transformations may be applied with the following approximations:- The comparison is between extents containing cell centers.
Because the
otherextent may be smaller compared to an extent computed over cell areas, this approach introduces a tolerance of ½ cell in units of theothergrid. - Cell coordinates are rounded to nearest integers.
This approach adds another tolerance of ½ cell in units of
thisgrid. - If the coordinate transformation between the two grids is non-linear or produces a rotation,
the transformed extent of
othermay contain more cells that the reality. In such cases, this method may returnfalseeven if a more extensive test would have returnedtrue.
falseif an accurate answer would be too expensive (because of the last point in above list), or if the coordinates cannot be transformed.Usage
This method behavior is well defined when the two grids are members of the same image mosaic or pyramid: same CRS together with "grid to CRS" transforms that differ only by scale and translation factors with integer values. For other cases, this method should be considered as merely a hint because of above approximations.- Parameters:
other- the other grid geometry to test for inclusion.- Returns:
- whether the other grid geometry is contained in this grid geometry.
- Throws:
IncompleteGridGeometryException- if there is not enough information in the two grid geometries.- Since:
- 1.5
- See Also:
- The comparison is between extents containing cell centers.
Because the
-
equals
Compares the specified object with this grid geometry for equality. This method delegates toequals(object, ComparisonMode.STRICT).- Specified by:
equalsin interfaceLenientComparable- Overrides:
equalsin classObject- Parameters:
object- the object to compare with.- Returns:
trueif the given object is equal to this grid geometry.- See Also:
-
equals
Compares the specified object with this grid geometry for equality. If the mode isComparisonMode.IGNORE_METADATAor more flexible, then the axis types are ignored.- Specified by:
equalsin interfaceLenientComparable- Parameters:
object- the object to compare with this grid geometry for equality.mode- the strictness level of the comparison.- Returns:
trueif the given object is equal to this grid geometry.- Since:
- 1.1
- See Also:
-
hashCode
-
toString
Returns a string representation of this grid geometry. The returned string is implementation dependent and may change in any future version. Current implementation is equivalent to a call totoTree(Locale, int)with at leastEXTENT,ENVELOPEandCRSflags. Whether more flags are present or not is unspecified. -
toTree
Returns a tree representation of some elements of this grid geometry. The tree representation is for debugging or logging purposes and may change in any future SIS version.- Parameters:
locale- the locale to use for textual labels.bitmask- combination ofEXTENT,ENVELOPE,CRS,GRID_TO_CRS,ORIGIN,RESOLUTION,GEOGRAPHIC_EXTENTandTEMPORAL_EXTENT.- Returns:
- a tree representation of the specified elements.
-
longintegers instead ofint.