org.geotoolkit.coverage
Class GridSampleDimension

Object
  extended by GridSampleDimension
All Implemented Interfaces:
Serializable, SampleDimension

@Immutable
public class GridSampleDimension
extends Object
implements SampleDimension, Serializable

Describes the data values for a coverage as a list of categories. For a grid coverage a sample dimension is a band. Sample values in a band may be organized in categories. This GridSampleDimension implementation is capable to differentiate qualitative and quantitative categories. For example an image of sea surface temperature (SST) could very well defines the following categories:

[0]       : no data
[1]       : cloud
[2]       : land
[10..210] : temperature to be converted into Celsius degrees through a linear equation
In this example, sample values in range [10..210] defines a quantitative category, while all others categories are qualitative. The difference between those two kinds of category is that the Category.getSampleToGeophysics() method returns a non-null transform if and only if the category is quantitative.

While this class can be used with arbitrary coverage, the primary target for this implementation is grid coverage storing their sample values as integers. This explain the "Grid" prefix in the class name.

Since:
1.2
Version:
3.11
Author:
Martin Desruisseaux (IRD, Geomatys)
See Also:
SampleDimensionPanel, Serialized Form
Module:
coverage/geotk-coverage (download)    View source code for this class

Constructor Summary
  GridSampleDimension(CharSequence description)
          Constructs a sample dimension with specified name and no category.
  GridSampleDimension(CharSequence description, Category[] categories, Unit<?> units)
          Constructs a sample dimension with an arbitrary set of categories, which may be both quantitative and qualitative.
  GridSampleDimension(CharSequence description, CharSequence[] categoriesNames)
          Constructs a sample dimension with a set of qualitative categories only.
  GridSampleDimension(CharSequence description, CharSequence[] names, Color[] colors)
          Constructs a sample dimension with a set of qualitative categories and colors.
  GridSampleDimension(CharSequence description, SampleDimensionType type, ColorInterpretation color, Color[] palette, CharSequence[] categories, double[] nodata, double minimum, double maximum, double scale, double offset, Unit<?> unit)
          Constructs a sample dimension with the specified properties.
protected GridSampleDimension(GridSampleDimension other)
          Constructs a new sample dimension with the same categories and units than the specified sample dimension.
 
Method Summary
static GridSampleDimension castOrCopy(SampleDimension sd)
          Returns the content of the given OpenGIS's sample dimension as a Geotk implementation of GridSampleDimension.
 boolean equals(Object object)
          Compares the specified object with this sample dimension for equality.
 GridSampleDimension geophysics(boolean geo)
          Returns the geophysics or packed view of this sample dimension.
 Category getBackground()
          Returns a default category to use for background.
 List<Category> getCategories()
          Returns all categories in this sample dimension.
 Category getCategory(double sample)
          Returns the category for the specified sample value.
 InternationalString[] getCategoryNames()
          Returns a sequence of category names for the values contained in this sample dimension.
 ColorInterpretation getColorInterpretation()
          Deprecated. No replacement.
 ColorModel getColorModel()
          Returns a color model for this sample dimension.
 ColorModel getColorModel(int visibleBand, int numBands)
          Returns a color model for this sample dimension.
 ColorModel getColorModel(int visibleBand, int numBands, int type)
          Returns a color model for this sample dimension.
 InternationalString getDescription()
          Gets the sample dimension title or description.
 String getLabel(double value, Locale locale)
          Returns a string representation of a sample value.
 double getMaximumValue()
          Returns the maximum value occurring in this sample dimension (inclusive).
 double getMinimumValue()
          Returns the minimum value occurring in this sample dimension (inclusive).
 double[] getNoDataValues()
          Returns the values to indicate "no data" for this sample dimension.
 double getOffset()
          Returns the value to add to grid values for this sample dimension.
 int[][] getPalette()
          Deprecated. No replacement.
 PaletteInterpretation getPaletteInterpretation()
          Deprecated. No replacement.
 NumberRange<?> getRange()
          Returns the range of values in this sample dimension.
 SampleDimensionType getSampleDimensionType()
          Returns a code value indicating grid value data type.
 MathTransform1D getSampleToGeophysics()
          Returns the transfer function from sample values to geophysics values.
 double getScale()
          Returns the value which is multiplied to grid values for this sample dimension.
 Unit<?> getUnits()
          Returns the unit information for this sample dimension.
 int hashCode()
          Returns a hash value for this sample dimension.
 boolean isRangeSigned()
          Returns true if the range includes negative values.
 GridSampleDimension rescale(double scale, double offset)
          Returns a sample dimension using new scale and offset coefficients.
 String toString()
          Returns a string representation of this sample dimension.
 
Methods inherited from class Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
 

Constructor Detail

GridSampleDimension

public GridSampleDimension(CharSequence description)
Constructs a sample dimension with specified name and no category.

Parameters:
description - The sample dimension title or description, or null if none. This is the value to be returned by getDescription().
Since:
2.3

GridSampleDimension

public GridSampleDimension(CharSequence description,
                           CharSequence[] categoriesNames)
Constructs a sample dimension with a set of qualitative categories only. This constructor expects only a sequence of category names for the values contained in a sample dimension. This allows for names to be assigned to numerical values. The first entry in the sequence relates to a cell value of zero. For example: [0]="Background", [1]="Water", [2]="Forest", [3]="Urban". The created sample dimension will have no unit and a default set of colors.

Parameters:
description - The sample dimension title or description, or null for the default (the name of what looks like the "main" category). This is the value to be returned by getDescription().
categoriesNames - Sequence of category names for the values contained in a sample dimension, as String or InternationalString objects.
Since:
2.3

GridSampleDimension

public GridSampleDimension(CharSequence description,
                           CharSequence[] names,
                           Color[] colors)
Constructs a sample dimension with a set of qualitative categories and colors. This constructor expects a sequence of category names for the values contained in a sample dimension. This allows for names to be assigned to numerical values. The first entry in the sequence relates to a cell value of zero. For example: [0]="Background", [1]="Water", [2]="Forest", [3]="Urban". The created sample dimension will have no unit and a default set of colors.

Parameters:
description - The sample dimension title or description, or null for the default (the name of what looks like the "main" category). This is the value to be returned by getDescription().
names - Sequence of category names for the values contained in a sample dimension, as String or InternationalString objects.
colors - Color to assign to each category. This array must have the same length than names.
Since:
2.3

GridSampleDimension

public GridSampleDimension(CharSequence description,
                           SampleDimensionType type,
                           ColorInterpretation color,
                           Color[] palette,
                           CharSequence[] categories,
                           double[] nodata,
                           double minimum,
                           double maximum,
                           double scale,
                           double offset,
                           Unit<?> unit)
Constructs a sample dimension with the specified properties. For convenience, any argument which is not a double primitive can be null, and any char sequence can be either a String or InternationalString object.

This constructor allows the construction of a GridSampleDimension without explicit construction of Category objects. An heuristic approach is used for dispatching the informations into a set of Category objects. However, this constructor still less general and provides less fine-grain control than the constructor expecting an array of Category objects.

The table below lists the methods which will return the parameters given to this constructor, together with their default value (from heuristic rules).

 Parameter   Returned by   Default value 
 description   getDescription()   The name of what looks like the "main" category. 
 type   getSampleDimensionType()   Computed automatically from the [minimum..maximum] range. 
 color   getColorInterpretation()   Usually ColorInterpretation.PALETTE_INDEX
 palette   getColorModel()   Usually grayscale. 
 categories   getCategoryNames()   No category. 
 nodata   getNoDataValues()   No pad value. 
 minimum   getMinimumValue()   
 maximum   getMaximumValue()   
 scale   getScale()   
 offset   getOffset()   
 unit   getUnits()   

Parameters:
description - The sample dimension title or description.
type - The grid value data type (which indicate the number of bits for the data type).
color - The color interpretation.
palette - The color palette associated with the sample dimension. If categories is non-null, then both arrays usually have the same length. However, this constructor is tolerant about the array length.
categories - A sequence of category names for the values contained in the sample dimension.
nodata - The values to indicate "no data". The [minimum..maximum] range may or may not includes the nodata values; the range will be adjusted as needed.
minimum - The lower sample value, inclusive. If categories was non-null, then minimum is usually 0.
maximum - The upper sample value, inclusive as well. If categories was non-null, then maximum is often equals to categories.length-1.
scale - The value which is multiplied to grid values, or 1 if none.
offset - The value to add to grid values, or 0 if none.
unit - The unit information for this sample dimension.
Throws:
IllegalArgumentException - if the range [minimum..maximum] is not valid.

GridSampleDimension

public GridSampleDimension(CharSequence description,
                           Category[] categories,
                           Unit<?> units)
                    throws IllegalArgumentException
Constructs a sample dimension with an arbitrary set of categories, which may be both quantitative and qualitative. It is possible to specify more than one quantitative categories, providing that their sample value ranges do not overlap. Quantitative categories can map sample values to geophysics values using arbitrary relation (not necessarily linear).

Parameters:
description - The sample dimension title or description, or null for the default (the name of what looks like the "main" category). This is the value to be returned by getDescription().
categories - The list of categories, or null if none.
units - The unit information for this sample dimension. May be null if no category has units. This unit apply to values obtained after the sampleToGeophysics transformation.
Throws:
IllegalArgumentException - if categories contains incompatible categories. If may be the case for example if two or more categories have overlapping ranges of sample values.
Since:
2.3

GridSampleDimension

protected GridSampleDimension(GridSampleDimension other)
Constructs a new sample dimension with the same categories and units than the specified sample dimension.

Parameters:
other - The other sample dimension, or null.
Method Detail

castOrCopy

public static GridSampleDimension castOrCopy(SampleDimension sd)
Returns the content of the given OpenGIS's sample dimension as a Geotk implementation of GridSampleDimension.

Parameters:
sd - The sample dimension to wrap into a Geotk implementation.
Returns:
The given sample dimension as a GridSampleDimension instance.

getSampleDimensionType

public SampleDimensionType getSampleDimensionType()
Returns a code value indicating grid value data type. This will also indicate the number of bits for the data type.

Specified by:
getSampleDimensionType in interface SampleDimension
Returns:
A code value indicating grid value data type.

getDescription

public InternationalString getDescription()
Gets the sample dimension title or description. This string may be null if no description is present.

Specified by:
getDescription in interface SampleDimension
Returns:
The title or description of this sample dimension.

getCategoryNames

public InternationalString[] getCategoryNames()
                                       throws IllegalStateException
Returns a sequence of category names for the values contained in this sample dimension. This allows for names to be assigned to numerical values. The first entry in the sequence relates to a cell value of zero. For example:
[0] Background
[1] Water
[2] Forest
[3] Urban

Specified by:
getCategoryNames in interface SampleDimension
Returns:
The sequence of category names for the values contained in this sample dimension, or null if there is no category in this sample dimension.
Throws:
IllegalStateException - if a sequence can't be mapped because some category use negative or non-integer sample values.
See Also:
getCategories(), getCategory(double)

getCategories

public List<Category> getCategories()
Returns all categories in this sample dimension. Note that a Category object may apply to an arbitrary range of sample values. Consequently, the first element in this collection may not be directly related to the sample value 0.

Returns:
The list of categories in this sample dimension, or null if none.
See Also:
getCategoryNames(), getCategory(double)

getCategory

public Category getCategory(double sample)
Returns the category for the specified sample value. If this method can't maps a category to the specified value, then it returns null.

Parameters:
sample - The value (can be one of NaN values).
Returns:
The category for the supplied value, or null if none.
See Also:
getCategories(), getCategoryNames()

getBackground

public Category getBackground()
Returns a default category to use for background. A background category is used when an image is resampled (for example reprojected in an other coordinate system) and the resampled image do not fit in a rectangular area. It can also be used in various situation where a reasonable "no data" category is needed. The default implementation try to returns one of the no data values. If no suitable category is found, then a default one is returned.

Returns:
A category to use as background for the "Resample" operation. Never null.

getNoDataValues

public double[] getNoDataValues()
                         throws IllegalStateException
Returns the values to indicate "no data" for this sample dimension. The default implementation deduces the "no data" values from the list of categories supplied at construction time. The rules are:

Together with getOffset() and getScale(), this method provides a limited way to transform sample values into geophysics values. However, the recommended way is to use the sampleToGeophysics transform instead, which is more general and take care of converting automatically "no data" values into NaN.

Specified by:
getNoDataValues in interface SampleDimension
Returns:
The values to indicate no data values for this sample dimension, or null if not applicable.
Throws:
IllegalStateException - if some qualitative categories use a range of non-integer values.
See Also:
getSampleToGeophysics()

getMinimumValue

public double getMinimumValue()
Returns the minimum value occurring in this sample dimension (inclusive). The default implementation fetches this value from the categories supplied at construction time. If the minimum value can't be computed, then this method returns Double.NEGATIVE_INFINITY.

Specified by:
getMinimumValue in interface SampleDimension
See Also:
getRange()

getMaximumValue

public double getMaximumValue()
Returns the maximum value occurring in this sample dimension (inclusive). The default implementation fetches this value from the categories supplied at construction time. If the maximum value can't be computed, then this method returns Double.POSITIVE_INFINITY.

Specified by:
getMaximumValue in interface SampleDimension
See Also:
getRange()

getRange

public NumberRange<?> getRange()
Returns the range of values in this sample dimension. This is the union of the range of values of every categories, excluding NaN values. A NumberRange object gives more informations than getMinimumValue() and getMaximumValue() methods since it contains also the data type (integer, float, etc.) and inclusion/exclusion informations.

Returns:
The range of values. May be null if this sample dimension has no non-NaN value.
See Also:
Category.getRange(), getMinimumValue(), getMaximumValue()
TODO:
We should do a better job in CategoryList.getRange() when selecting the appropriate data type. TypeMap.getSampleDimensionType(Range) may be of some help.

isRangeSigned

public boolean isRangeSigned()
Returns true if the range includes negative values. If this sample dimension does not declare any quantitative category, then this method returns false.

Some color models, especially IndexColorModel, support only unsigned integer. For such color models, any SampleDimension for which this method return true will require special handling.

Returns:
true if the range includes negative values.
Since:
3.11

getLabel

public String getLabel(double value,
                       Locale locale)
Returns a string representation of a sample value. This method try to returns a representation of the geophysics value; the transformation is automatically applied when necessary. More specifically:

Parameters:
value - The sample value (can be one of NaN values).
locale - Locale to use for formatting, or null for the default locale.
Returns:
A string representation of the geophysics value, or null if there is none.
TODO:
What should we do when the value can't be formatted? GridSampleDimension returns null if there is no category or if an exception is thrown, but CategoryList returns "Untitled" if the value is an unknown NaN, and try to format the number anyway in other cases.

getUnits

public Unit<?> getUnits()
Returns the unit information for this sample dimension. May returns null if this dimension has no units. This unit apply to values obtained after the sampleToGeophysics transformation.

Specified by:
getUnits in interface SampleDimension
See Also:
getSampleToGeophysics()

getOffset

public double getOffset()
                 throws IllegalStateException
Returns the value to add to grid values for this sample dimension. This attribute is typically used when the sample dimension represents elevation data. The transformation equation is:
offset + scale*sample
Together with getScale() and getNoDataValues(), this method provides a limited way to transform sample values into geophysics values. However, the recommended way is to use the sampleToGeophysics transform instead, which is more general and take care of converting automatically "no data" values into NaN.

Specified by:
getOffset in interface SampleDimension
Returns:
The offset to add to grid values.
Throws:
IllegalStateException - if the transform from sample to geophysics values is not a linear relation.
See Also:
getSampleToGeophysics(), rescale(double, double)

getScale

public double getScale()
Returns the value which is multiplied to grid values for this sample dimension. This attribute is typically used when the sample dimension represents elevation data. The transformation equation is:
offset + scale*sample
Together with getOffset() and getNoDataValues(), this method provides a limited way to transform sample values into geophysics values. However, the recommended way is to use the sampleToGeophysics transform instead, which is more general and take care of converting automatically "no data" values into NaN.

Specified by:
getScale in interface SampleDimension
Returns:
The scale to multiply to grid value.
Throws:
IllegalStateException - if the transform from sample to geophysics values is not a linear relation.
See Also:
getSampleToGeophysics(), rescale(double, double)

getSampleToGeophysics

public MathTransform1D getSampleToGeophysics()
Returns the transfer function from sample values to geophysics values. If this sample dimension has no category, then this method returns null. If all sample values are already geophysics values (including NaN for "no data" values), then this method returns an identity transform. Otherwise, this method returns a transform expecting sample values as input and computing geophysics value as output. This transform will take care of converting all "no data values" into NaN values.

The sampleToGeophysics.inverse() transform is capable to differentiate NaN values to get back the original sample value.

Specified by:
getSampleToGeophysics in interface SampleDimension
Returns:
The transfer function from sample to geophysics values, or null if this sample dimension do not defines any transform (which is not the same that defining an identity transform).
See Also:
getScale(), getOffset(), getNoDataValues(), rescale(double, double)

geophysics

public GridSampleDimension geophysics(boolean geo)
Returns the geophysics or packed view of this sample dimension. By definition, a geophysics sample dimension is a sample dimension with a range of sample values transformed in such a way that the sample to geophysics transform is always the identity transform, or null if no such transform existed in the first place. In other words, the range of sample values in all categories maps directly the "real world" values without the need for any transformation.

GridSampleDimension objects live by pair: a geophysics one (used for computation) and a packed one (used for storing data, usually as integers). The geo argument specifies which object from the pair is wanted, regardless if this method is invoked on the geophysics or packed instance of the pair.

Parameters:
geo - true to get a sample dimension with an identity transform and a range of values matching the geophysics values, or false to get back the packed sample dimension.
Returns:
The sample dimension. Never null, but may be this.
See Also:
Category.geophysics(boolean), GridCoverage2D.view(org.geotoolkit.coverage.grid.ViewType)

getPalette

@Deprecated
public int[][] getPalette()
Deprecated. No replacement.

Color palette associated with the sample dimension. A color palette can have any number of colors. See palette interpretation for meaning of the palette entries. If the grid coverage has no color palette, null will be returned.

Specified by:
getPalette in interface SampleDimension
Returns:
The color palette associated with the sample dimension.
See Also:
getPaletteInterpretation(), getColorInterpretation(), IndexColorModel

getPaletteInterpretation

@Deprecated
public PaletteInterpretation getPaletteInterpretation()
Deprecated. No replacement.

Indicates the type of color palette entry for sample dimensions which have a palette. If a sample dimension has a palette, the color interpretation must be GRAY_INDEX or PALETTE_INDEX. A palette entry type can be Gray, RGB, CMYK or HLS.

Specified by:
getPaletteInterpretation in interface SampleDimension
Returns:
The type of color palette entry for sample dimensions which have a palette.

getColorInterpretation

@Deprecated
public ColorInterpretation getColorInterpretation()
Deprecated. No replacement.

Returns the color interpretation of the sample dimension. A sample dimension can be an index into a color palette or be a color model component. If the sample dimension is not assigned a color interpretation the value is ColorInterpretation.UNDEFINED.

Specified by:
getColorInterpretation in interface SampleDimension

getColorModel

public ColorModel getColorModel()
Returns a color model for this sample dimension. The default implementation creates a color model with 1 band using each category colors as returned by Category.getColors(). The returned color model will typically use DataBuffer.TYPE_FLOAT if this sample dimension is geophysics, or an integer data type otherwise.

Note that GridCoverage2D.getSampleDimension(int) returns special implementations of GridSampleDimension. In this particular case, the color model created by this getColorModel() method will have the same number of bands than the grid coverage RenderedImage.

Returns:
The requested color model, suitable for RenderedImage objects with values in the getRange() range. May be null if this sample dimension has no category.

getColorModel

public ColorModel getColorModel(int visibleBand,
                                int numBands)
Returns a color model for this sample dimension. The default implementation create the color model using each category colors as returned by Category.getColors(). The returned color model will typically use DataBuffer.TYPE_FLOAT if this sample dimension is geophysics, or an integer data type otherwise.

Parameters:
visibleBand - The band to be made visible (usually 0). All other bands, if any will be ignored.
numBands - The number of bands for the color model (usually 1). The returned color model will renderer only the visibleBand and ignore the others, but the existence of all numBands will be at least tolerated. Supplemental bands, even invisible, are useful for processing with Java Advanced Imaging.
Returns:
The requested color model, suitable for RenderedImage objects with values in the getRange() range. May be null if this sample dimension has no category.
TODO:
This method may be deprecated in a future version. It it strange to use only one SampleDimension object for creating a multi-bands color model. Logically, we would expect as many SampleDimensions as bands.

getColorModel

public ColorModel getColorModel(int visibleBand,
                                int numBands,
                                int type)
Returns a color model for this sample dimension. The default implementation create the color model using each category colors as returned by Category.getColors().

Parameters:
visibleBand - The band to be made visible (usually 0). All other bands, if any will be ignored.
numBands - The number of bands for the color model (usually 1). The returned color model will renderer only the visibleBand and ignore the others, but the existence of all numBands will be at least tolerated. Supplemental bands, even invisible, are useful for processing with Java Advanced Imaging.
type - The data type that has to be used for the sample model.
Returns:
The requested color model, suitable for RenderedImage objects with values in the getRange() range. May be null if this sample dimension has no category.
TODO:
This method may be deprecated in a future version. It it strange to use only one SampleDimension object for creating a multi-bands color model. Logically, we would expect as many SampleDimensions as bands.

rescale

public GridSampleDimension rescale(double scale,
                                   double offset)
Returns a sample dimension using new scale and offset coefficients. Other properties like the sample value range, no data values and colors are unchanged.

Parameters:
scale - The value which is multiplied to grid values for the new sample dimension.
offset - The value to add to grid values for the new sample dimension.
Returns:
The scaled sample dimension.
See Also:
getScale(), getOffset(), Category.rescale(org.opengis.referencing.operation.MathTransform1D)

hashCode

public int hashCode()
Returns a hash value for this sample dimension. This value need not remain consistent between different implementations of the same class.

Overrides:
hashCode in class Object

equals

public boolean equals(Object object)
Compares the specified object with this sample dimension for equality.

Overrides:
equals in class Object
Parameters:
object - The object to compare with.
Returns:
true if the given object is equals to this sample dimension.

toString

public String toString()
Returns a string representation of this sample dimension. This string is for debugging purpose only and may change in future version. The default implementation format the sample value range, then the list of categories. A "*" mark is put in front of what seems the "main" category.

Overrides:
toString in class Object


Copyright © 2009-2013 Geotoolkit.org. All Rights Reserved.