public class OperationJAI extends Operation2D
OperationDescriptor
for interoperability with Java Advanced Imaging. This class help to
leverage the rich set of JAI operators in an GeoAPI framework. OperationJAI
inherits
operation name and argument types from OperationDescriptor
, except the source argument
type (usually RenderedImage.class
) which is set to
GridCoverage2D.class
. If there is only one source argument, it will be
renamed "source"
for better compliance with OpenGIS usage.
The entry point for applying an operation is the usual doOperation
method. The default implementation forward the call to other methods for different bits of tasks,
resulting in the following chain of calls:
doOperation
:the entry point. resampleToCommonGeometry
:reprojects all sources to the same coordinate reference system. deriveGridCoverage
:gets the destination properties. deriveSampleDimension
:gets the destination sample dimensions. deriveCategory
:gets the destination categories. deriveRange
:gets the expected range of values. deriveUnit
:gets the destination units. createRenderedImage
:the actual call to JAI.createNS
.
Modifier and Type | Class and Description |
---|---|
protected static class |
OperationJAI.Parameters
A block of parameters for a
GridCoverage2D processed by a OperationJAI . |
Modifier and Type | Field and Description |
---|---|
protected OperationDescriptor |
operation
The JAI's operation descriptor.
|
protected static String |
RENDERED_MODE
The rendered mode for JAI operation.
|
PRIMARY_SOURCE_INDEX, SOURCE_0
descriptor
Modifier | Constructor and Description |
---|---|
|
OperationJAI(OperationDescriptor operation)
Constructs a grid coverage operation backed by a JAI operation.
|
protected |
OperationJAI(OperationDescriptor operation,
ParameterDescriptorGroup descriptor)
Constructs a grid coverage operation backed by a JAI operation.
|
|
OperationJAI(String operation)
Constructs a grid coverage operation from a JAI operation name.
|
|
OperationJAI(String operationName,
OperationDescriptor operation)
Constructs a grid coverage operation backed by a JAI operation.
|
Modifier and Type | Method and Description |
---|---|
protected RenderedImage |
createRenderedImage(ParameterBlockJAI parameters,
RenderingHints hints)
Applies the JAI operation.
|
protected Category |
deriveCategory(Category[] categories,
OperationJAI.Parameters parameters)
Returns the quantitative category for a single sample
dimension in the target grid coverage.
|
protected GridCoverage2D |
deriveGridCoverage(GridCoverage2D[] sources,
OperationJAI.Parameters parameters)
Applies a JAI operation to a grid coverage.
|
protected InternationalString |
deriveName(GridCoverage2D[] sources,
int primarySourceIndex,
OperationJAI.Parameters parameters)
Returns a name for the target grid coverage based on the given
sources.
|
protected NumberRange |
deriveRange(NumberRange[] ranges,
OperationJAI.Parameters parameters)
Returns the range of value for a single sample dimension in
the target grid coverage.
|
protected GridSampleDimension[] |
deriveSampleDimension(GridSampleDimension[][] bandLists,
OperationJAI.Parameters parameters)
Returns the sample dimensions for the target grid coverage.
|
protected Unit<?> |
deriveUnit(Unit<?>[] units,
OperationJAI.Parameters parameters)
Returns the unit of data for a single sample dimension in
the target grid coverage.
|
Coverage |
doOperation(ParameterValueGroup parameters,
Hints hints)
Applies a process operation to a grid coverage.
|
boolean |
equals(Object object)
Compares the specified object with this operation for equality.
|
protected void |
extractSources(ParameterValueGroup parameters,
Collection<GridCoverage2D> sources,
String[] sourceNames)
Extraction of the sources from the parameter called SOURCES.
|
static JAI |
getJAI(RenderingHints hints)
Returns the
JAI instance to use for operations on RenderedImage . |
protected static OperationDescriptor |
getOperationDescriptor(String name)
Returns the operation descriptor for the specified JAI operation name.
|
protected Map<String,?> |
getProperties(RenderedImage data,
CoordinateReferenceSystem crs,
InternationalString name,
MathTransform gridToCRS,
GridCoverage2D[] sources,
OperationJAI.Parameters parameters)
Prepares the properties to be given to the coverage created by the
deriveGridCoverage method. |
protected static int |
getQuantitative(Category[] categories)
Returns the index of the quantitative category, providing that there is one and only one
quantitative category.
|
protected void |
handleJAIEXTParams(ParameterBlockJAI parameters,
ParameterValueGroup parameters2)
Extension point for adding to the JAI
ParameterBlockJAI object the parameters defined
in the ParameterValueGroup , which can be read by the JAI-EXT operations. |
protected static void |
handleROINoDataInternal(ParameterBlockJAI parameters,
GridCoverage2D sourceCoverage,
String operationName,
int roiIndex,
int noDataIndex)
This method can be used for merging input coverage properties (ROI and NoData) with the ones
provided as input in the ParameterBlock instance.
|
protected static Map<String,Object> |
handleROINoDataProperties(Map<String,Object> properties,
ParameterBlockJAI parameters,
GridCoverage2D sourceCoverage,
String operationName,
int roiIndex,
int noDataIndex,
int backgroundIndex)
This method can be used for creating a property Map to set to the new coverage generated by
the current operation.
|
int |
hashCode()
Returns a hash value for this operation.
|
protected ParameterBlockJAI |
prepareParameters(ParameterValueGroup parameters)
Copies parameter values from the specified
ParameterValueGroup to the ParameterBlockJAI , except the sources. |
protected void |
resampleToCommonGeometry(GridCoverage2D[] sources,
CoordinateReferenceSystem crs2D,
MathTransform2D gridToCrs2D,
Hints hints)
Resamples all sources grid coverages to the same two-dimensional
geometry before to apply the operation.
|
extractSources, getFactory
getDescription, getDocURL, getName, getNumSources, getParameters, getVendor, getVersion, toString
protected static final String RENDERED_MODE
protected final OperationDescriptor operation
public OperationJAI(String operation) throws OperationNotFoundException
OperationDescriptor
from the specified operation name using the default
JAI
instance.operation
- JAI operation nameOperationNotFoundException
- if no JAI descriptor was found for the given name.public OperationJAI(OperationDescriptor operation)
"rendered"
mode (which is the case for most JAI operations).operation
- The JAI operation descriptor.public OperationJAI(String operationName, OperationDescriptor operation)
"rendered"
mode (which is the case for most JAI operations).operationName
- JAI operation nameoperation
- The JAI operation descriptor.protected OperationJAI(OperationDescriptor operation, ParameterDescriptorGroup descriptor)
"rendered"
mode (which is the case for most JAI operations).operation
- The JAI operation descriptor.descriptor
- The OGC parameters descriptor.protected static OperationDescriptor getOperationDescriptor(String name) throws OperationNotFoundException
JAI
instance and looks for the "rendered" mode.name
- The operation name.OperationNotFoundException
- if no JAI descriptor was found for the given name.protected ParameterBlockJAI prepareParameters(ParameterValueGroup parameters)
ParameterValueGroup
to the ParameterBlockJAI
, except the sources.
Note: it would be possible to use ImagingParameters.parameters
directly in
some occasions. However, we perform an unconditional copy instead because some operations may
change the values.
parameters
- The ParameterValueGroup
to be copied.ParameterValueGroup
as a JAI block.public Coverage doOperation(ParameterValueGroup parameters, Hints hints) throws CoverageProcessingException
GridCoverage2D
s use the same coordinate reference
system (at least for the two-dimensional part) with the same gridToCRS
relationship.
deriveGridCoverage(org.geotools.coverage.grid.GridCoverage2D[], org.geotools.coverage.processing.OperationJAI.Parameters)
. The sources in the ParameterBlock
are
RenderedImage
objects obtained from GridCoverage2D.getRenderedImage()
.
GridCoverage2D.geophysics(false)
.
doOperation
in class AbstractOperation
parameters
- List of name value pairs for the parameters required for the operation.hints
- A set of rendering hints, or null
if none.CoverageProcessingException
- if the operation can't be applied.deriveGridCoverage(org.geotools.coverage.grid.GridCoverage2D[], org.geotools.coverage.processing.OperationJAI.Parameters)
protected void resampleToCommonGeometry(GridCoverage2D[] sources, CoordinateReferenceSystem crs2D, MathTransform2D gridToCrs2D, Hints hints) throws InvalidGridGeometryException, CannotReprojectException
doOperation
method. Only the two-dimensional part is reprojected
(usually the spatial component of a CRS). Extra dimension (if any) are left unchanged. Extra
dimensions are typically time axis or depth. Note that extra dimensions are
not forced to a common geometry; only the two dimensions that apply to a
PlanarImage
are. This is because the extra dimensions don't need to
be compatible for all operations. For example if a source image is a slice in a time series,
a second source image could be a slice in the frequency representation of this time series.
Subclasses should override this method if they want to specify target grid geometry and coordinate reference system different than the default ones. For example if a subclass wants to force all images to be referenced in a WGS 84 CRS, then it may overrides this method as below:
protected void resampleToCommonGeometry(...) { crs2D = DefaultGeographicCRS.WGS84; super.resampleToCommonGeometry(sources, crs2D, gridToCrs2D, hints); }
sources
- The source grid coverages to resample. This array is updated in-place as
needed (for example if a grid coverage is replaced by a projected one).crs2D
- The target coordinate reference system to use, or null
for a default
one.gridToCrs2D
- The target "grid to coordinate reference system" transform, or null
for a default one.hints
- The rendering hints, or null
if none.InvalidGridGeometryException
- if a source coverage has an unsupported grid geometry.CannotReprojectException
- if a grid coverage can't be resampled for some other reason.protected GridCoverage2D deriveGridCoverage(GridCoverage2D[] sources, OperationJAI.Parameters parameters)
doOperation(org.opengis.parameter.ParameterValueGroup, org.geotools.util.factory.Hints)
. The default implementation performs the following steps:
deriveSampleDimension(...)
method.
createRenderedImage(javax.media.jai.ParameterBlockJAI, java.awt.RenderingHints)
.
GridCoverage2D
object.
sources
- The source coverages.parameters
- Parameters, rendering hints and coordinate reference system to use.doOperation(org.opengis.parameter.ParameterValueGroup, org.geotools.util.factory.Hints)
,
deriveSampleDimension(org.geotools.coverage.GridSampleDimension[][], org.geotools.coverage.processing.OperationJAI.Parameters)
,
JAI.createNS(java.lang.String, java.awt.image.renderable.ParameterBlock, java.awt.RenderingHints)
protected Map<String,?> getProperties(RenderedImage data, CoordinateReferenceSystem crs, InternationalString name, MathTransform gridToCRS, GridCoverage2D[] sources, OperationJAI.Parameters parameters)
deriveGridCoverage
method. The default implementation returns null
.data
- The RenderedImage
created by this operation.crs
- The coordinate reference system assigned to the coverage this OperationJAI
will produce.name
- The name assigned to the coverage this OperationJAI
will produce.gridToCRS
- The transform from grid to crs
to be
assigned to the coverage this OperationJAI
will produce.sources
- The sources to be assigned to the coverage this OperationJAI
will
produce.parameters
- The parameters that were used by this OperationJAI
.Map
with the properties generated by this OperationJAI
or null if
we haven't any.protected static int getQuantitative(Category[] categories)
categories
contains 0, 2 or more quantitative category,
then this method returns -1
.categories
- The categories to test.-1
if none can be choosen.protected GridSampleDimension[] deriveSampleDimension(GridSampleDimension[][] bandLists, OperationJAI.Parameters parameters)
deriveGridCoverage
with a bandLists
argument initialized as
below:
bandLists
array length is equals to the number of source coverages.
bandLists[i]
array length is equals to the number of sample
dimensions in the source coverage i.
bandLists[source][band]
.
This method shall returns an array with a length equals to the number of bands in the
target image. If the sample dimensions can't be determined, then this method is allowed to
returns null
.
The default implementation iterates among all bands and invokes the deriveCategory
and deriveUnit
methods for each of them. Subclasses
should override this method if they know a more accurate algorithm for determining sample
dimensions.
bandLists
- The set of sample dimensions for each source GridCoverage2D
s.parameters
- Parameters, rendering hints and coordinate reference system to use.null
if
unknown.deriveCategory(org.geotools.coverage.Category[], org.geotools.coverage.processing.OperationJAI.Parameters)
,
deriveUnit(javax.measure.Unit<?>[], org.geotools.coverage.processing.OperationJAI.Parameters)
protected Category deriveCategory(Category[] categories, OperationJAI.Parameters parameters)
deriveSampleDimension
method for each
band in the target image. The default implementation creates a default category from the
target range of values returned by deriveRange
.categories
- The quantitative categories from every sources. For unary operations like,
this array has a length of 1. For binary operations like "add"
and "multiply"
, this array has a length of 2.parameters
- Parameters, rendering hints and coordinate reference system to use.null
if
unknown.protected NumberRange deriveRange(NumberRange[] ranges, OperationJAI.Parameters parameters)
deriveCategory
method for each band in the target image.
Subclasses should override this method in order to compute the target range of values. For
example, the "add"
operation may implements this method as below:
double min = ranges[0].getMinimum() + ranges[1].getMinimum(); double max = ranges[0}.getMaximum() + ranges[1}.getMaximum(); return new NumberRange(min, max);
ranges
- The range of values from every sources. For unary operations this array has a
length of 1. For binary operations like "add"
and "multiply"
, this array
has a length of 2.parameters
- Parameters, rendering hints and coordinate reference system to use.null
if unknow.protected Unit<?> deriveUnit(Unit<?>[] units, OperationJAI.Parameters parameters)
deriveSampleDimension
method for each band in the target
image. Subclasses should override this method in order to compute the target units from the
source units. For example a "multiply"
operation may implement this method as below:
if (units[0]!=null && units[1]!=null) { return units[0].multiply
(units[1]); } else { return super.deriveUnit(units, cs, parameters); }
units
- The units from every sources. For unary operations this array has a length of 1.
For binary operations like "add"
and "multiply"
, this array has a length
of 2.parameters
- Parameters, rendering hints and coordinate reference system to use.null
if unknow.protected InternationalString deriveName(GridCoverage2D[] sources, int primarySourceIndex, OperationJAI.Parameters parameters)
deriveGridCoverage
method. The default implementation returns the operation name followed by the source name
between parenthesis, for example "Add(Sea Surface Temperature)".sources
- The sources grid coverage.primarySourceIndex
- The index of what seems to be the primary source, or -1
if
none of unknown.parameters
- Parameters, rendering hints and coordinate reference system to use.protected RenderedImage createRenderedImage(ParameterBlockJAI parameters, RenderingHints hints)
operation
. The JAI
instance to use can be fetch from getJAI(java.awt.RenderingHints)
. The default implementation returns the
following:
Subclasses may override this method in order to invokes a different JAI operation according the parameters.getJAI(hints).createNS(operation.getName(), parameters, hints)
parameters
- The parameters to be given to JAI.hints
- The rendering hints to be given to JAI.public static final JAI getJAI(RenderingHints hints)
JAI
instance to use for operations on RenderedImage
. If no JAI
instance is defined for the Hints.JAI_INSTANCE
key, then the default instance is
returned.hints
- The rendering hints, or null
if none.null
).public boolean equals(Object object)
equals
in class AbstractOperation
object
- The object to compare with this operation.true
if the given object is equals to this operation.public int hashCode()
AbstractOperation
hashCode
in class AbstractOperation
protected void handleJAIEXTParams(ParameterBlockJAI parameters, ParameterValueGroup parameters2)
ParameterBlockJAI
object the parameters defined
in the ParameterValueGroup
, which can be read by the JAI-EXT operations.
Notice that if you are using JAI, the new parameters will not be accepted by the ParameterBlockJAI
instance.
parameters
- ParameterBlockJAI
instance used by the current JAI-EXT/JAI
operationparameters2
- ParameterValueGroup
instance containing input operation parametersprotected static Map<String,Object> handleROINoDataProperties(Map<String,Object> properties, ParameterBlockJAI parameters, GridCoverage2D sourceCoverage, String operationName, int roiIndex, int noDataIndex, int backgroundIndex)
properties
- parameters
- sourceCoverage
- operationName
- roiIndex
- noDataIndex
- backgroundIndex
- Map
containing all the coverage properties and also ROI
and NoData
if presentprotected static void handleROINoDataInternal(ParameterBlockJAI parameters, GridCoverage2D sourceCoverage, String operationName, int roiIndex, int noDataIndex)
parameters
- sourceCoverage
- operationName
- roiIndex
- noDataIndex
- protected void extractSources(ParameterValueGroup parameters, Collection<GridCoverage2D> sources, String[] sourceNames) throws ParameterNotFoundException, InvalidParameterValueException
parameters
- sources
- ParameterNotFoundException
InvalidParameterValueException
Copyright © 1996–2019 Geotools. All rights reserved.