# Class DatumShiftTransform

Object
FormattableObject
AbstractMathTransform
DatumShiftTransform

All Implemented Interfaces:
  `Serializable`, `Parameterized`, `LenientComparable`, `Printable`, `MathTransform`

Direct Known Subclasses:
  `InterpolatedGeocentricTransform`, `InterpolatedTransform`, `MolodenskyTransform`

public abstract class DatumShiftTransform extends AbstractMathTransform implements Serializable
Transforms between two CRS (usually geographic) based on different datum. A datum shift may be needed when two CRS use different ellipsoids as approximation of the shape of the Earth. Sometimes two CRS use the same ellipsoid but with different anchor point (i.e. their coordinate systems have their origin in different locations).

There is many different datum shift methods, ranging from transformations as simple as adding a constant offset to geographic coordinates, to more complex transformations involving conversions to geocentric coordinates and/or interpolations in a datum shift grid. The simple cases like adding a constant offset are handled by other `MathTransform` implementations like `LinearTransform`. More complex methods are subclasses of this `DatumShiftTransform` base class, but users should not assume that this is the case of every transforms performing a datum shift.

## Datum shift methods overview

The two CRS's ellipsoids have slightly different scale and rotation in space, and their center are located in a slightly different position. Consequently, geodetic datum shifts are often approximated by a constant scale, rotation and translation applied on geocentric coordinates. Those approximations are handled in SIS by concatenations of `EllipsoidToCentricTransform` with `LinearTransform` instead of a specific `DatumShiftTransform` subclass.

If the geodetic datum shifts is approximated only by a geocentric translation without any scale or rotation, and if an error of a few centimetres it acceptable, then the `MolodenskyTransform` subclass can be used as an approximation of the above method. The Molodensky method requires less floating point operations since it applies directly on geographic coordinates, without conversions to geocentric coordinates.

Some countries go one step further and allow the above geocentric translations to be non-constant. Instead, a different geocentric translation is interpolated for each geographic input coordinates. This case is handled by the `InterpolatedGeocentricTransform` subclass.

A simpler alternative to the above is to interpolate translations to apply directly on geographic coordinates. This is the approach taken by NADCON and NTv2 grids. SIS handles those datum shifts with the `InterpolatedTransform` subclass.

Since:
  0.7
See Also:
  - `DatumShiftGrid`
  - Serialized Form

- ## Nested Class Summary

  ### Nested classes/interfaces inherited from class AbstractMathTransform

  `AbstractMathTransform​.Inverse`

- ## Method Summary

  Modifier and Type
  Method
  Description
  `protected ContextualParameters`
  `getContextualParameters()`
  Returns the parameters used for creating the complete transformation.
  `ParameterValueGroup`
  `getParameterValues()`
  Returns the internal parameter values of this `DatumShiftTransform` instance (ignoring context).

  ### Methods inherited from class AbstractMathTransform

  `derivative, equals, formatTo, getDomain, getParameterDescriptors, getSourceDimensions, getTargetDimensions, hashCode, inverse, isIdentity, transform, transform, transform, transform, transform, transform, tryConcatenate, tryConcatenate`

  ### 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 MathTransform

  `toWKT`

- ## Method Details

  - ### getParameterValues

    @Debug public ParameterValueGroup getParameterValues()
    Returns the internal parameter values of this `DatumShiftTransform` instance (ignoring context). The parameters returned by this method do not necessarily describe the whole datum shift process, because `DatumShiftTransform` instances are often preceeded and followed by linear conversions. It may be conversions between degrees and radians units, or conversions from geodetic coordinates to grid indices.

    #### Example

    The chain of transforms of an `InterpolatedGeocentricTransform` is:
    [ π/180 0 -λ 0 ⋅ (π/180) 0 π/180 0 0 0 1 ]
    →
    1. Geographic to geocentric conversion
    2. Geocentric interpolation
    3. Geocentric to geographic conversion
    →
    [ 180/π 0 λ 0 0 180/π 0 0 0 1 ]
    This method returns the parameters for the part in the middle of above example. The content of this part is highly implementation-dependent and used mostly for debugging purposes. The parameters that describe the process as a whole are rather given by `getContextualParameters()`.
    Specified by:
      `getParameterValues` in interface `Parameterized`
    Overrides:
      `getParameterValues` in class `AbstractMathTransform`
    Returns:
      the internal parameter values for this transform.
    See Also:
      - `AbstractMathTransform​.getContextualParameters()`
      - `SingleOperation​.getParameterValues()`

  - ### getContextualParameters

    protected ContextualParameters getContextualParameters()
    Returns the parameters used for creating the complete transformation. Those parameters describe a sequence of normalize → `this` → denormalize transforms, not including axis swapping. Those parameters are used for formatting Well Known Text (WKT) and error messages.
    Overrides:
      `getContextualParameters` in class `AbstractMathTransform`
    Returns:
      the parameter values for the normalize → `this` → denormalize chain of transforms.