Class InterpolatedMolodenskyTransform
- Object
-
- FormattableObject
-
- AbstractMathTransform
-
- DatumShiftTransform
-
- InterpolatedMolodenskyTransform
-
- All Implemented Interfaces:
Serializable
,Parameterized
,LenientComparable
,MathTransform
public class InterpolatedMolodenskyTransform extends DatumShiftTransform
Transforms between two geographic CRS by performing geocentric translations interpolated from a grid file, but using Molodensky approximation. This transformation is conceptually defined as a translation in geocentric coordinates as performed byInterpolatedGeocentricTransform
, but uses the Molodensy (non-abridged) approximation for performance reasons. Errors are less than 3 centimetres for the "France geocentric interpolation" (ESPG:9655). By comparison, the finest accuracy reported in the grid file for France is 5 centimetres.AlgorithmThis 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 interpolated translations directly on geographic coordinates. This relatively simple case is handled by
InterpolatedTransform
. But in theInterpolatedMolodenskyTransform
case, the interpolated translations are rather the (tX, tY, tZ) parameters of a Molodensky transformation.- Since:
- 0.7
- See Also:
InterpolatedGeocentricTransform
, Serialized Form
Defined in the
sis-referencing
module
-
-
Field Summary
Fields Modifier and Type Field Description protected double
eccentricitySquared
The square of eccentricity of the source ellipsoid.protected double
semiMajor
Semi-major axis length (a) of the source ellipsoid.protected double
tX
Shift along the geocentric X axis (toward prime meridian) in units of the semi-major axis of the source ellipsoid.protected double
tY
Shift along the geocentric Y axis (toward 90°E) in units of the semi-major axis of the source ellipsoid.protected double
tZ
Shift along the geocentric Z axis (toward north pole) in units of the semi-major axis of the source ellipsoid.
-
Constructor Summary
Constructors Modifier Constructor Description protected
InterpolatedMolodenskyTransform(Ellipsoid source, boolean isSource3D, Ellipsoid target, boolean isTarget3D, DatumShiftGrid<Angle,Length> grid)
Creates a transform from the specified parameters.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description protected int
computeHashCode()
Computes a hash value for this transform.static MathTransform
createGeodeticTransformation(MathTransformFactory factory, Ellipsoid source, boolean isSource3D, Ellipsoid target, boolean isTarget3D, DatumShiftGrid<Angle,Length> grid)
Creates a transformation between two geographic CRS.boolean
equals(Object object, ComparisonMode mode)
Compares the specified object with this math transform for equality.ParameterDescriptorGroup
getParameterDescriptors()
Returns a description of the internal parameters of thisInterpolatedMolodenskyTransform
transform.ParameterValueGroup
getParameterValues()
Returns a copy of internal parameter values of this transform.int
getSourceDimensions()
Gets the dimension of input points.int
getTargetDimensions()
Gets the dimension of output points.MathTransform
inverse()
Returns the inverse of this interpolated Molodensky transform.Matrix
transform(double[] srcPts, int srcOff, double[] dstPts, int dstOff, boolean derivate)
Transforms the (λ,φ) or (λ,φ,h) coordinates between two geographic CRS, and optionally returns the derivative at that location.void
transform(double[] srcPts, int srcOff, double[] dstPts, int dstOff, int numPts)
Transforms the (λ,φ) or (λ,φ,h) coordinates between two geographic CRS.-
Methods inherited from class DatumShiftTransform
getContextualParameters
-
Methods inherited from class AbstractMathTransform
derivative, equals, formatTo, hashCode, isIdentity, transform, transform, transform, transform, 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
-
-
-
-
Field Detail
-
tX
protected final double tX
Shift along the geocentric X axis (toward prime meridian) in units of the semi-major axis of the source ellipsoid.- See Also:
BursaWolfParameters.tX
-
tY
protected final double tY
Shift along the geocentric Y axis (toward 90°E) in units of the semi-major axis of the source ellipsoid.- See Also:
BursaWolfParameters.tY
-
tZ
protected final double tZ
Shift along the geocentric Z axis (toward north pole) in units of the semi-major axis of the source ellipsoid.- See Also:
BursaWolfParameters.tZ
-
semiMajor
protected final double semiMajor
Semi-major axis length (a) of the source ellipsoid.
-
eccentricitySquared
protected final double eccentricitySquared
The square of eccentricity of the source ellipsoid. This can be computed by ℯ² = (a²-b²)/a² where a is the semi-major axis length and b is the semi-minor axis length.
-
-
Constructor Detail
-
InterpolatedMolodenskyTransform
protected InterpolatedMolodenskyTransform(Ellipsoid source, boolean isSource3D, Ellipsoid target, boolean isTarget3D, DatumShiftGrid<Angle,Length> grid)
Creates a transform from the specified parameters. ThisInterpolatedMolodenskyTransform
class expects coordinate values in the following order and units:- longitudes in radians relative to the prime meridian (usually Greenwich),
- latitudes in radians,
- optionally heights above the ellipsoid, in same units than the source ellipsoid axes.
InterpolatedMolodenskyTransform
instances need to be concatenated with the following affine transforms:- Normalization before
InterpolatedMolodenskyTransform
:- Conversion of (λ,φ) from degrees to radians.
- Denormalization after
InterpolatedMolodenskyTransform
:- Conversion of (λ,φ) from radians to degrees.
InterpolatedMolodenskyTransform
construction, the full conversion chain including the above affine transforms can be created byDatumShiftTransform.getContextualParameters().completeTransform(factory, this)}
.- Parameters:
source
- the source ellipsoid.isSource3D
-true
if the source coordinates have a height.target
- the target ellipsoid.isTarget3D
-true
if the target coordinates have a height.grid
- the grid of datum shifts from source to target datum. TheDatumShiftGrid.interpolateInCell(…)
method shall compute (ΔX, ΔY, ΔZ) translations from source to target in the unit of source ellipsoid axes.- See Also:
createGeodeticTransformation(MathTransformFactory, Ellipsoid, boolean, Ellipsoid, boolean, DatumShiftGrid)
-
-
Method Detail
-
createGeodeticTransformation
public static MathTransform createGeodeticTransformation(MathTransformFactory factory, Ellipsoid source, boolean isSource3D, Ellipsoid target, boolean isTarget3D, DatumShiftGrid<Angle,Length> grid) throws FactoryException
Creates a transformation between two geographic CRS. This factory method combines theInterpolatedMolodenskyTransform
instance with the steps needed for converting values between degrees to radians. The transform works with input and output coordinates in the following units:- longitudes in degrees relative to the prime meridian (usually Greenwich),
- latitudes in degrees,
- optionally heights above the ellipsoid, in same units than the source ellipsoids axes.
grid
instance shall expect geographic coordinates (λ,φ) in radians.- Parameters:
factory
- the factory to use for creating the transform.source
- the source ellipsoid.isSource3D
-true
if the source coordinates have a height.target
- the target ellipsoid.isTarget3D
-true
if the target coordinates have a height.grid
- the grid of datum shifts from source to target datum. TheDatumShiftGrid.interpolateInCell(…)
method shall compute (ΔX, ΔY, ΔZ) translations from source to target in the unit of source ellipsoid axes.- Returns:
- the transformation between geographic coordinates in degrees.
- Throws:
FactoryException
- if an error occurred while creating a transform.
-
transform
public Matrix transform(double[] srcPts, int srcOff, double[] dstPts, int dstOff, boolean derivate) throws TransformException
Transforms the (λ,φ) or (λ,φ,h) coordinates between two geographic CRS, and optionally returns the derivative at that location.- Specified by:
transform
in classAbstractMathTransform
- Parameters:
srcPts
- the array containing the source coordinate (can not benull
).srcOff
- the offset to the point to be transformed in the source array.dstPts
- the array into which the transformed coordinate is returned. May be the same thansrcPts
. May benull
if only the derivative matrix is desired.dstOff
- the offset to the location of the transformed point that is stored in the destination array.derivate
-true
for computing the derivative, orfalse
if not needed.- Returns:
- the matrix of the transform derivative at the given source position,
or
null
if thederivate
argument isfalse
. - Throws:
TransformException
- if the point can not be transformed or if a problem occurred while calculating the derivative.- See Also:
AbstractMathTransform.derivative(DirectPosition)
,AbstractMathTransform.transform(DirectPosition, DirectPosition)
,MathTransforms.derivativeAndTransform(MathTransform, double[], int, double[], int)
-
transform
public void transform(double[] srcPts, int srcOff, double[] dstPts, int dstOff, int numPts) throws TransformException
Transforms the (λ,φ) or (λ,φ,h) coordinates between two geographic CRS. This method performs the same work than the abovetransform(…)
method, but on an arbitrary amount of coordinates and without computing derivative.- Specified by:
transform
in interfaceMathTransform
- Overrides:
transform
in classAbstractMathTransform
- Parameters:
srcPts
- the array containing the source point coordinates.srcOff
- the offset to the first point to be transformed in the source array.dstPts
- the array into which the transformed point coordinates are returned. May be the same thansrcPts
.dstOff
- the offset to the location of the first transformed point that is stored in the destination array.numPts
- the number of point objects to be transformed.- Throws:
TransformException
- if a point can not be transformed.
-
inverse
public MathTransform inverse()
Returns the inverse of this interpolated Molodensky transform. The source ellipsoid of the returned transform will be the target ellipsoid of this transform, and conversely.- Specified by:
inverse
in interfaceMathTransform
- Overrides:
inverse
in classAbstractMathTransform
- Returns:
- a transform from the target ellipsoid to the source ellipsoid of this transform.
-
getParameterDescriptors
@Debug public ParameterDescriptorGroup getParameterDescriptors()
Returns a description of the internal parameters of thisInterpolatedMolodenskyTransform
transform. The returned group contains parameters for the source ellipsoid semi-axis lengths and the differences between source and target ellipsoid parameters.Note: this method is mostly for debugging purposes since the isolation of non-linear parameters in this class is highly implementation dependent. Most GIS applications will instead be interested in the contextual parameters.- Specified by:
getParameterDescriptors
in interfaceParameterized
- Overrides:
getParameterDescriptors
in classAbstractMathTransform
- Returns:
- a description of the internal parameters.
- See Also:
DefaultOperationMethod.getParameters()
-
getParameterValues
@Debug public ParameterValueGroup getParameterValues()
Returns a copy of internal parameter values of this transform. The returned group contains parameters for the source ellipsoid semi-axis lengths and the differences between source and target ellipsoid parameters.Note: this method is mostly for debugging purposes since the isolation of non-linear parameters in this class is highly implementation dependent. Most GIS applications will instead be interested in the contextual parameters.- Specified by:
getParameterValues
in interfaceParameterized
- Overrides:
getParameterValues
in classDatumShiftTransform
- Returns:
- a copy of the internal parameter values for this transform.
- See Also:
AbstractMathTransform.getContextualParameters()
,SingleOperation.getParameterValues()
-
getSourceDimensions
public final int getSourceDimensions()
Gets the dimension of input points.- Specified by:
getSourceDimensions
in interfaceMathTransform
- Specified by:
getSourceDimensions
in classAbstractMathTransform
- Returns:
- the input dimension, which is 2 or 3.
- See Also:
DefaultOperationMethod.getSourceDimensions()
-
getTargetDimensions
public final int getTargetDimensions()
Gets the dimension of output points.- Specified by:
getTargetDimensions
in interfaceMathTransform
- Specified by:
getTargetDimensions
in classAbstractMathTransform
- Returns:
- the output dimension, which is 2 or 3.
- See Also:
DefaultOperationMethod.getTargetDimensions()
-
computeHashCode
protected int computeHashCode()
Computes a hash value for this transform. This method is invoked byAbstractMathTransform.hashCode()
when first needed.- Overrides:
computeHashCode
in classDatumShiftTransform
- Returns:
- the hash code value. This value may change between different execution of the Apache SIS library.
-
equals
public boolean equals(Object object, ComparisonMode mode)
Compares the specified object with this math transform for equality.- Specified by:
equals
in interfaceLenientComparable
- Overrides:
equals
in classDatumShiftTransform
- Parameters:
object
- the object to compare with this transform.mode
- the strictness level of the comparison. Default toSTRICT
.- Returns:
true
if the given object is considered equals to this math transform.- See Also:
Utilities.deepEquals(Object, Object, ComparisonMode)
-
-