Class InterpolatedGeocentricTransform

All Implemented Interfaces:
Serializable, Parameterized, Lenient­Comparable, Math­Transform

public class InterpolatedGeocentricTransform extends DatumShiftTransform
Transforms between two geographic CRS by performing geocentric translations interpolated from a grid file. This transform is used mainly for "France geocentric interpolation" (ESPG:9655) datum shifts, but Apache SIS implementation allows the use for other regions.


This class transforms two- or three- dimensional coordinates from a geographic CRS to another geographic CRS. The changes between source and target coordinates are small (usually less than 400 metres), but vary for every position. Those changes are provided in a datum shift grid, usually loaded from one or two files.

Many datum shift grids like NADCON and NTv2 apply the changes directly on geographic coordinates. This relatively simple case is handled by Interpolated­Transform. But the Interpolated­Geocentric­Transform algorithm uses the grid in a more complex way:

  1. Convert input geographic coordinate (λ,φ) to geocentric coordinate (X,Y,Z).
  2. Ask Datum­Shift­Grid for the offset to apply for coordinate (λ,φ). But instead of returning a (Δλ, Δφ) offset, the grid shall return a (ΔX, ΔY, ΔZ) offset.
  3. Convert the shifted geocentric coordinate (X+ΔX, Y+ΔY, Z+ΔZ) back to a geographic coordinate.
Source: IGN document NTG_88​.pdf, "Grille de paramètres de transformation de coordonnées" at Note however that the signs of (ΔX, ΔY, ΔZ) values expected by this class are the opposite of the signs used in NTG_88 document. This is because NTG_88 grid defines shifts from target to source, while this class expects shifts from source to target.

Note: this algorithm is not the same as a (theoretical) Ellipsoid­To­Centric­TransformInterpolated­Transform → (inverse of Ellipsoid­To­Centric­Transform) concatenation because the Datum­Shift­Grid inputs are geographic coordinates even if the interpolated grid values are in geocentric space.

Performance consideration

Interpolated­Molodensky­Transform performs the same calculation more efficiently at the cost of a few centimetres error. Both classes are instantiated in the same way and expect the same inputs.
See Also:

Defined in the sis-referencing module

  • Constructor Details

    • InterpolatedGeocentricTransform

      protected InterpolatedGeocentricTransform(Ellipsoid source, boolean isSource3D, Ellipsoid target, boolean isTarget3D, DatumShiftGrid<Angle,Length> grid)
      Creates a transform from the specified parameters. This Interpolated­Geocentric­Transform class expects coordinate values in the following order and units:
      1. longitudes in radians relative to the prime meridian (usually Greenwich),
      2. latitudes in radians,
      3. optionally heights above the ellipsoid, in same units than the source ellipsoid axes.
      For converting geographic coordinates in degrees, Interpolated­Geocentric­Transform instances need to be concatenated with the following affine transforms:
      • Normalization before Interpolated­Geocentric­Transform:
        • Conversion of (λ,φ) from degrees to radians.
      • Denormalization after Interpolated­Geocentric­Transform:
        • Conversion of (λ,φ) from radians to degrees.
      After Interpolated­Geocentric­Transform construction, the full conversion chain including the above affine transforms can be created by Datum­Shift­Transform​.get­Contextual­Parameters().complete­Transform(factory, this)}.
      source - the source ellipsoid.
      is­Source3D - true if the source coordinates have a height.
      target - the target ellipsoid.
      is­Target3D - true if the target coordinates have a height.
      grid - the grid of datum shifts from source to target datum. The Datum­Shift­Grid​.interpolate­In­Cell(…) method shall compute (ΔX, ΔY, ΔZ) translations from source to target in the unit of source ellipsoid axes.
      See Also:
  • Method Details