Class AbstractCoordinateOperation
- Object
-
- FormattableObject
-
- AbstractIdentifiedObject
-
- AbstractCoordinateOperation
-
- All Implemented Interfaces:
Serializable
,Deprecable
,LenientComparable
,IdentifiedObject
,CoordinateOperation
- Direct Known Subclasses:
DefaultConversion
,DefaultPassThroughOperation
,DefaultTransformation
public class AbstractCoordinateOperation extends AbstractIdentifiedObject implements CoordinateOperation
Describes the operation for transforming coordinates in the source CRS to coordinates in the target CRS. Coordinate operations contain a math transform, which does the actual work of transforming coordinates, together with the following information:- The source and target CRS.
- The interpolation CRS if a CRS other than source and target is needed for interpolating.
- In conversion and transformation subclasses, a description of the operation method together with the parameter values.
- The domain of validity.
- An estimation of the operation accuracy.
InstantiationThis class is conceptually abstract, even if it is technically possible to instantiate it. Typical applications should create instances of the most specific subclass prefixed byDefault
instead. An exception to this rule may occur when it is not possible to identify the exact operation type.Immutability and thread safetyThis base class is immutable and thus thread-safe if the property values (not necessarily the map itself) given to the constructor are also immutable. Most SIS subclasses and related classes are immutable under similar conditions. This means that unless otherwise noted in the javadoc,CoordinateOperation
instances created using only SIS factories and static constants can be shared by many objects and passed between threads without synchronization.- Since:
- 0.6
- See Also:
- Serialized Form
Defined in the
sis-referencing
module
-
-
Field Summary
-
Fields inherited from class AbstractIdentifiedObject
DEPRECATED_KEY, LOCALE_KEY
-
Fields inherited from interface CoordinateOperation
COORDINATE_OPERATION_ACCURACY_KEY, DOMAIN_OF_VALIDITY_KEY, OPERATION_VERSION_KEY, SCOPE_KEY
-
Fields inherited from interface IdentifiedObject
ALIAS_KEY, IDENTIFIERS_KEY, NAME_KEY, REMARKS_KEY
-
-
Constructor Summary
Constructors Modifier Constructor Description AbstractCoordinateOperation(Map<String,?> properties, CoordinateReferenceSystem sourceCRS, CoordinateReferenceSystem targetCRS, CoordinateReferenceSystem interpolationCRS, MathTransform transform)
Creates a coordinate operation from the given properties.protected
AbstractCoordinateOperation(CoordinateOperation operation)
Creates a new coordinate operation with the same values than the specified one.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description static AbstractCoordinateOperation
castOrCopy(CoordinateOperation object)
Returns a SIS coordinate operation implementation with the values of the given arbitrary implementation.protected long
computeHashCode()
Invoked byhashCode()
for computing the hash code when first needed.boolean
equals(Object object, ComparisonMode mode)
Compares this coordinate operation with the specified object for equality.protected String
formatTo(Formatter formatter)
Formats this coordinate operation in Well Known Text (WKT) version 2 format.Collection<PositionalAccuracy>
getCoordinateOperationAccuracy()
Returns an estimation of the impact of this operation on point accuracy.Extent
getDomainOfValidity()
Returns the area or region or timeframe in which this coordinate operation is valid.Class<? extends CoordinateOperation>
getInterface()
Returns the GeoAPI interface implemented by this class.CoordinateReferenceSystem
getInterpolationCRS()
Returns the CRS which is neither the source CRS or target CRS but still required for performing the operation.double
getLinearAccuracy()
Returns an estimation of positional accuracy in metres, orNaN
if unknown.MathTransform
getMathTransform()
Returns the object for transforming coordinates in the source CRS to coordinates in the target CRS.String
getOperationVersion()
Returns the version of the coordinate operation.InternationalString
getScope()
Returns a description of domain of usage, or limitations of usage, for which this operation is valid.CoordinateReferenceSystem
getSourceCRS()
Returns the source CRS, ornull
if unspecified.CoordinateReferenceSystem
getTargetCRS()
Returns the target CRS, ornull
if unspecified.Set<Integer>
getWrapAroundChanges()
Returns the indices of target dimensions where "wrap around" may happen as a result of this coordinate operation.boolean
isDefiningConversion()
-
Methods inherited from class AbstractIdentifiedObject
castOrCopy, equals, getAlias, getDescription, getIdentifiers, getName, getRemarks, hashCode, isDeprecated, isHeuristicMatchForName
-
Methods inherited from class FormattableObject
print, toString, toString, toWKT
-
Methods inherited from class Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
-
Methods inherited from interface IdentifiedObject
getAlias, getIdentifiers, getName, getRemarks, toWKT
-
-
-
-
Constructor Detail
-
AbstractCoordinateOperation
public AbstractCoordinateOperation(Map<String,?> properties, CoordinateReferenceSystem sourceCRS, CoordinateReferenceSystem targetCRS, CoordinateReferenceSystem interpolationCRS, MathTransform transform)
Creates a coordinate operation from the given properties. The properties given in argument follow the same rules than for the super-class constructor. Additionally, the following properties are understood by this constructor:Recognized properties (non exhaustive list) Property name Value type Returned by "operationVersion" String
getOperationVersion()
"coordinateOperationAccuracy" PositionalAccuracy
(optionally as array)getCoordinateOperationAccuracy()
"domainOfValidity" Extent
getDomainOfValidity()
"scope" InternationalString
orString
getScope()
Defined in parent class (reminder) "name" Identifier
orString
AbstractIdentifiedObject.getName()
"alias" GenericName
orCharSequence
(optionally as array)AbstractIdentifiedObject.getAlias()
"identifiers" Identifier
(optionally as array)AbstractIdentifiedObject.getIdentifiers()
"remarks" InternationalString
orString
AbstractIdentifiedObject.getRemarks()
ConstraintsAll arguments exceptproperties
can benull
. If non-null, the dimension of CRS arguments shall be related to thetransform
argument as below:- Dimension of
sourceCRS
shall be equal to the transform source dimension minus the dimension of theinterpolationCRS
(if any). - Dimension of
targetCRS
shall be equal to the transform target dimension, minus the dimension of theinterpolationCRS
(if any).
interpolationCRS
is non-null, then the giventransform
shall expect input coordinates in the following order:- Coordinates of the interpolation CRS. Example: (x,y) in a vertical transform.
- Coordinates of the source CRS. Example: (z) in a vertical transform.
- Parameters:
properties
- the properties to be given to the identified object.sourceCRS
- the source CRS, ornull
if unspecified.targetCRS
- the target CRS, ornull
if unspecified.interpolationCRS
- the CRS of additional coordinates needed for the operation, ornull
if none.transform
- transform from positions in the source CRS to positions in the target CRS, ornull
if unspecified.
- Dimension of
-
AbstractCoordinateOperation
protected AbstractCoordinateOperation(CoordinateOperation operation)
Creates a new coordinate operation with the same values than the specified one. This copy constructor provides a way to convert an arbitrary implementation into a SIS one or a user-defined one (as a subclass), usually in order to leverage some implementation-specific API.This constructor performs a shallow copy, i.e. the properties are not cloned.
- Parameters:
operation
- the coordinate operation to copy.- See Also:
castOrCopy(CoordinateOperation)
-
-
Method Detail
-
castOrCopy
public static AbstractCoordinateOperation castOrCopy(CoordinateOperation object)
Returns a SIS coordinate operation implementation with the values of the given arbitrary implementation. This method performs the first applicable action in the following choices:- If the given object is
null
, then this method returnsnull
. - Otherwise if the given object is an instance of
Transformation
,Conversion
,Projection
,CylindricalProjection
,ConicProjection
,PlanarProjection
,PassThroughOperation
orConcatenatedOperation
, then this method delegates to thecastOrCopy(…)
method of the corresponding SIS subclass. Note that if the given object implements more than one of the above-cited interfaces, then thecastOrCopy(…)
method to be used is unspecified. - Otherwise if the given object is already an instance of
AbstractCoordinateOperation
, then it is returned unchanged. - Otherwise a new
AbstractCoordinateOperation
instance is created using the copy constructor and returned. Note that this is a shallow copy operation, since the other properties contained in the given object are not recursively copied.
- Parameters:
object
- the object to get as a SIS implementation, ornull
if none.- Returns:
- a SIS implementation containing the values of the given object (may be the
given object itself), or
null
if the argument was null.
- If the given object is
-
getInterface
public Class<? extends CoordinateOperation> getInterface()
Returns the GeoAPI interface implemented by this class. The default implementation returnsCoordinateOperation.class
. Subclasses implementing a more specific GeoAPI interface shall override this method.- Overrides:
getInterface
in classAbstractIdentifiedObject
- Returns:
- the coordinate operation interface implemented by this class.
-
isDefiningConversion
public boolean isDefiningConversion()
Returnstrue
if this coordinate operation is for the definition of a derived or projected CRS. The standard (ISO 19111) approach constructs defining conversion as an operation of typeConversion
with null source and target CRS. But SIS supports also defining conversions with non-null CRS provided that:GeneralDerivedCRS.getBaseCRS()
is the source CRS of this operation, andGeneralDerivedCRS.getConversionFromBase()
is this operation instance.
true
, the source and target CRS are not marshalled in XML documents.- Returns:
true
if this coordinate operation is for the definition of a derived or projected CRS.
-
getSourceCRS
public CoordinateReferenceSystem getSourceCRS()
Returns the source CRS, ornull
if unspecified. The source CRS is mandatory for transformations only. This information is optional for conversions according the ISO 19111 standard, but Apache SIS tries to provide that CRS in most cases anyway.- Specified by:
getSourceCRS
in interfaceCoordinateOperation
- Returns:
- the source CRS, or
null
if not available.
-
getTargetCRS
public CoordinateReferenceSystem getTargetCRS()
Returns the target CRS, ornull
if unspecified. The target CRS is mandatory for transformations only. This information is optional for conversions according the ISO 19111 standard, but Apache SIS tries to provide that CRS in most cases anyway.- Specified by:
getTargetCRS
in interfaceCoordinateOperation
- Returns:
- the target CRS, or
null
if not available.
-
getInterpolationCRS
public CoordinateReferenceSystem getInterpolationCRS()
Returns the CRS which is neither the source CRS or target CRS but still required for performing the operation.Example: some transformations of vertical coordinates (h) require the horizontal coordinates (φ,λ) in order to interpolate in a grid. This method returns the CRS of the grid where such interpolations are performed.- Returns:
- the CRS (neither source or target CRS) required for interpolating the values, or
null
if none.
-
getOperationVersion
public String getOperationVersion()
Returns the version of the coordinate operation. Different versions of a coordinate transformation may exist because of the stochastic nature of the parameters. In principle this property is irrelevant to coordinate conversions, but Apache SIS accepts it anyway.- Specified by:
getOperationVersion
in interfaceCoordinateOperation
- Returns:
- the coordinate operation version, or
null
in none.
-
getCoordinateOperationAccuracy
public Collection<PositionalAccuracy> getCoordinateOperationAccuracy()
Returns an estimation of the impact of this operation on point accuracy. The positional accuracy gives position error estimates for target coordinates of this coordinate operation, assuming no errors in source coordinates.- Specified by:
getCoordinateOperationAccuracy
in interfaceCoordinateOperation
- Returns:
- the position error estimations, or an empty collection if not available.
- See Also:
getLinearAccuracy()
-
getLinearAccuracy
public double getLinearAccuracy()
Returns an estimation of positional accuracy in metres, orNaN
if unknown. The default implementation tries to infer a value from the metadata returned bygetCoordinateOperationAccuracy()
using SIS-specific heuristics.Current implementationThe current implementation uses the heuristic rules listed below. Note that those rules may change in any future SIS version.- If at least one quantitative result is found with a linear unit, then returns the largest result value converted to metres.
- Otherwise if the operation is a conversion, then returns 0 since a conversion is by definition accurate up to rounding errors.
- Otherwise if the operation is a transformation,
then checks if the datum shift were applied with the help of Bursa-Wolf parameters.
If a datum shift has been applied, returns 25 meters.
If a datum shift should have been applied but has been omitted, returns 3000 meters.
Note: the 3000 meters value is higher than the highest value (999 meters) found in the EPSG database version 6.7. The 25 meters value is the next highest value found in the EPSG database for a significant number of transformations.
- Otherwise if the operation is a concatenated operation,
returns the sum of the accuracy of all components.
This is a conservative scenario where we assume that errors cumulate linearly.
Note: this is not necessarily the "worst case" scenario since the accuracy could be worst if the math transforms are highly non-linear.
- Returns:
- the accuracy estimation (always in meters), or NaN if unknown.
- See Also:
CRS.getLinearAccuracy(CoordinateOperation)
-
getDomainOfValidity
public Extent getDomainOfValidity()
Returns the area or region or timeframe in which this coordinate operation is valid.- Specified by:
getDomainOfValidity
in interfaceCoordinateOperation
- Returns:
- the coordinate operation valid domain, or
null
if not available.
-
getScope
public InternationalString getScope()
Returns a description of domain of usage, or limitations of usage, for which this operation is valid.- Specified by:
getScope
in interfaceCoordinateOperation
- Returns:
- a description of domain of usage, or
null
if none.
-
getMathTransform
public MathTransform getMathTransform()
Returns the object for transforming coordinates in the source CRS to coordinates in the target CRS.Use with interpolation CRSIf the interpolation CRS is non-null, then the math transform input coordinates shall by (interpolation, source) tuples: for each value to transform, the interpolation point coordinates shall be first, followed by the source coordinates.Example: in a transformation between two vertical CRS, if the source coordinates are (z) values but the coordinate operation additionally requires (x,y) values for interpolation purpose, then the math transform input coordinates shall be (x,y,z) tuples in that order.The interpolation coordinates will pass through the operation and appear in the math transform outputs, in the same order than inputs.- Specified by:
getMathTransform
in interfaceCoordinateOperation
- Returns:
- the transform from source to target CRS, or
null
if not applicable.
-
getWrapAroundChanges
public Set<Integer> getWrapAroundChanges()
Returns the indices of target dimensions where "wrap around" may happen as a result of this coordinate operation. If such change exists, then this is usually the longitude axis when the source CRS uses the [-180 … +180]° range and the target CRS uses the [0 … 360]° range, or the converse. If there is no change, then this is an empty set.Inverse relationship: sometime the target dimensions returned by this method can be mapped directly to wraparound axes in source CRS, but this is not always the case. For example consider the following operation chain:source projected CRS ⟶ base CRS ⟶ target geographic CRSIn this example, a wraparound axis in the target CRS (the longitude) can be mapped to a wraparound axis in the base CRS. But there is no corresponding wraparound axis in the source CRS because the easting axis in projected CRS does not have a wraparound range meaning. We could argue that axis directions match, but such matching is not guaranteed to exist sinceProjectedCRS
is a special case ofGeneralDerivedCRS
and derived CRS can have rotations.The default implementation infers this set by inspecting the source and target coordinate system axes. It returns the indices of all target axes having
RangeMeaning.WRAPAROUND
and for which the following condition holds: a colinear source axis exists with compatible unit of measurement, and the range (taking unit conversions in account) or range meaning of those source and target axes are not the same.- Returns:
- indices of target dimensions where "wrap around" may happen as a result of this coordinate operation.
- Since:
- 0.8
-
equals
public boolean equals(Object object, ComparisonMode mode)
Compares this coordinate operation with the specified object for equality. If themode
argument isComparisonMode.STRICT
orBY_CONTRACT
, then all available properties are compared including the domain of validity and the scope.- Specified by:
equals
in interfaceLenientComparable
- Overrides:
equals
in classAbstractIdentifiedObject
- Parameters:
object
- the object to compare tothis
.mode
-STRICT
for performing a strict comparison, orIGNORE_METADATA
for ignoring properties that do not make a difference in the numerical results of coordinate operations.- Returns:
true
if both objects are equal for the given comparison mode.- See Also:
AbstractIdentifiedObject.computeHashCode()
,Utilities.deepEquals(Object, Object, ComparisonMode)
-
computeHashCode
protected long computeHashCode()
Invoked byhashCode()
for computing the hash code when first needed. SeeAbstractIdentifiedObject.computeHashCode()
for more information.- Overrides:
computeHashCode
in classAbstractIdentifiedObject
- Returns:
- the hash code value. This value may change in any future Apache SIS version.
-
formatTo
protected String formatTo(Formatter formatter)
Formats this coordinate operation in Well Known Text (WKT) version 2 format.- Overrides:
formatTo
in classAbstractIdentifiedObject
- Parameters:
formatter
- the formatter to use.- Returns:
"CoordinateOperation"
.- See Also:
- WKT 2 specification §17
-
-