Class Geoid
 java.lang.Object

 org.orekit.models.earth.Geoid

 All Implemented Interfaces:
Serializable
,BodyShape
,EarthShape
public class Geoid extends Object implements EarthShape
A geoid is a level surface of the gravity potential of a body. The gravity potential, W, is split so W = U + T, where U is the normal potential (defined by the ellipsoid) and T is the anomalous potential.[3](eq. 2137)The
getIntersectionPoint(Line, Vector3D, Frame, AbsoluteDate)
method is tailored specifically for Earth's geoid. All of the other methods in this class are general and will work for an arbitrary body.There are several components that are needed to define a geoid[1]:
 Geopotential field. These are the coefficients of the spherical harmonics: S_{n,m} and C_{n,m}
 Reference Ellipsoid. The ellipsoid is used to define the undulation of the geoid (distance between ellipsoid and geoid) and U_{0} the value of the normal gravity potential at the surface of the ellipsoid.
 W_{0}, the potential at the geoid. The value of the potential on
the level surface. This is taken to be U_{0}, the normal gravity
potential at the surface of the
ReferenceEllipsoid
.  Permanent Tide System. This implementation assumes that the geopotential field and the reference ellipsoid use the same permanent tide system. If the assumption is false it will produce errors of about 0.5 m. Conversion between tide systems is a possible improvement.[1,2]
 Topographic Masses. That is mass outside of the geoid, e.g. mountains. This implementation ignores topographic masses, which causes up to 3m error in the Himalayas, and ~ 1.5m error in the Rockies. This could be improved through the use of DTED and calculating height anomalies or using the correction coefficients.[1]
This implementation also assumes that the normal to the reference ellipsoid is the same as the normal to the geoid. This assumption enables the equation: (height above geoid) = (height above ellipsoid)  (undulation), which is used in
transform(GeodeticPoint)
andtransform(Vector3D, Frame, AbsoluteDate)
.In testing, the error in the undulations calculated by this class were off by less than 3 meters, which matches the assumptions outlined above.
References:
 Dru A. Smith. There is no such thing as "The" EGM96 geoid: Subtle points on the use of a global geopotential model. IGeS Bulletin No. 8:1728, 1998. http://www.ngs.noaa.gov/PUBS_LIB/EGM96_GEOID_PAPER/egm96_geoid_paper.html
 Martin Losch, Verena Seufer. How to Compute Geoid Undulations (Geoid Height Relative to a Given Reference Ellipsoid) from Spherical Harmonic Coefficients for Satellite Altimetry Applications. , 2003. mitgcm.org/~mlosch/geoidcookbook.pdf
 Weikko A. Heiskanen, Helmut Moritz. Physical Geodesy. W. H. Freeman and Company, 1967. (especially sections 2.13 and equation 2144 Bruns Formula)
 S. A. Holmes, W. E. Featherstone. A unified approach to the Clenshaw summation and the recursive computation of very high degree and order normalised associated Legendre functions. Journal of Geodesy, 76(5):279, 2002.
 DMA TR 8350.2. 1984.
 Department of Defense World Geodetic System 1984. 2000. NIMA TR 8350.2 Third Edition, Amendment 1.
 Author:
 Evan Ward
 See Also:
 Serialized Form


Constructor Summary
Constructors Constructor Description Geoid(NormalizedSphericalHarmonicsProvider geopotential, ReferenceEllipsoid referenceEllipsoid)
Creates a geoid from the given geopotential, reference ellipsoid and the assumptions in the comment forGeoid
.

Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description Frame
getBodyFrame()
Get body frame related to body shape.ReferenceEllipsoid
getEllipsoid()
Get the underlying ellipsoid model that defines latitude and longitude.<T extends CalculusFieldElement<T>>
FieldGeodeticPoint<T>getIntersectionPoint(FieldLine<T> lineInFrame, FieldVector3D<T> closeInFrame, Frame frame, FieldAbsoluteDate<T> date)
Get the intersection point of a line with the surface of the body.GeodeticPoint
getIntersectionPoint(Line lineInFrame, Vector3D closeInFrame, Frame frame, AbsoluteDate date)
Get the intersection point of a line with the surface of the body.double
getUndulation(double geodeticLatitude, double longitude, AbsoluteDate date)
Gets the Undulation of the Geoid, N at the given position.Vector3D
projectToGround(Vector3D point, AbsoluteDate date, Frame frame)
Project a point to the ground.TimeStampedPVCoordinates
projectToGround(TimeStampedPVCoordinates pv, Frame frame)
Project a moving point to the ground.<T extends CalculusFieldElement<T>>
FieldGeodeticPoint<T>transform(FieldVector3D<T> point, Frame frame, FieldAbsoluteDate<T> date)
Transform a Cartesian point to a surfacerelative point.GeodeticPoint
transform(Vector3D point, Frame frame, AbsoluteDate date)
Transform a Cartesian point to a surfacerelative point.<T extends CalculusFieldElement<T>>
FieldVector3D<T>transform(FieldGeodeticPoint<T> point)
Transform a surfacerelative point to a Cartesian point.Vector3D
transform(GeodeticPoint point)
Transform a surfacerelative point to a Cartesian point.



Constructor Detail

Geoid
public Geoid(NormalizedSphericalHarmonicsProvider geopotential, ReferenceEllipsoid referenceEllipsoid)
Creates a geoid from the given geopotential, reference ellipsoid and the assumptions in the comment forGeoid
. Parameters:
geopotential
 the gravity potential. Only the anomalous potential will be used. It is assumed that thegeopotential
and thereferenceEllipsoid
are defined in the same frame. Usually aconstant geopotential
is used to define a timeinvariant Geoid.referenceEllipsoid
 the normal gravity potential. Throws:
NullPointerException
 ifgeopotential == null  referenceEllipsoid == null


Method Detail

getBodyFrame
public Frame getBodyFrame()
Description copied from interface:BodyShape
Get body frame related to body shape. Specified by:
getBodyFrame
in interfaceBodyShape
 Returns:
 body frame related to body shape

getUndulation
public double getUndulation(double geodeticLatitude, double longitude, AbsoluteDate date)
Gets the Undulation of the Geoid, N at the given position. N is the distance between thereference ellipsoid
and the geoid. The latitude and longitude parameters are both defined with respect to the reference ellipsoid. For EGM96 and the WGS84 ellipsoid the undulation is between 107m and +86m.NOTE: Restrictions are not put on the range of the arguments
geodeticLatitude
andlongitude
. Parameters:
geodeticLatitude
 geodetic latitude (angle between the local normal and the equatorial plane on the reference ellipsoid), in radians.longitude
 on the reference ellipsoid, in radians.date
 of evaluation. Used for time varying geopotential fields. Returns:
 the undulation in m, positive means the geoid is higher than the ellipsoid.
 See Also:
Geoid
, Geoid on Wikipedia

getEllipsoid
public ReferenceEllipsoid getEllipsoid()
Description copied from interface:EarthShape
Get the underlying ellipsoid model that defines latitude and longitude. If the height component of aGeodeticPoint
is not needed, then using the ellipsoid will provide the quickest transformation. Specified by:
getEllipsoid
in interfaceEarthShape
 Returns:
 the reference ellipsoid. May be
this
, but nevernull
.

getIntersectionPoint
public GeodeticPoint getIntersectionPoint(Line lineInFrame, Vector3D closeInFrame, Frame frame, AbsoluteDate date)
Get the intersection point of a line with the surface of the body.A line may have several intersection points with a closed surface (we consider the one point case as a degenerated two points case). The close parameter is used to select which of these points should be returned. The selected point is the one that is closest to the close point.
The intersection point is computed using a line search along the specified line. This is accurate when the geoid is slowly varying.
 Specified by:
getIntersectionPoint
in interfaceBodyShape
 Parameters:
lineInFrame
 test line (may intersect the body or not)closeInFrame
 point used for intersections selectionframe
 frame in which line is expresseddate
 date of the line in given frame Returns:
 intersection point at altitude zero or null if the line does not intersect the surface

projectToGround
public Vector3D projectToGround(Vector3D point, AbsoluteDate date, Frame frame)
Description copied from interface:BodyShape
Project a point to the ground. Specified by:
projectToGround
in interfaceBodyShape
 Parameters:
point
 point to projectdate
 current dateframe
 frame in which moving point is expressed Returns:
 ground point exactly at the local vertical of specified point, in the same frame as specified point
 See Also:
BodyShape.projectToGround(TimeStampedPVCoordinates, Frame)

getIntersectionPoint
public <T extends CalculusFieldElement<T>> FieldGeodeticPoint<T> getIntersectionPoint(FieldLine<T> lineInFrame, FieldVector3D<T> closeInFrame, Frame frame, FieldAbsoluteDate<T> date)
Get the intersection point of a line with the surface of the body.A line may have several intersection points with a closed surface (we consider the one point case as a degenerated two points case). The close parameter is used to select which of these points should be returned. The selected point is the one that is closest to the close point.
The intersection point is computed using a line search along the specified line. This is accurate when the geoid is slowly varying.
 Specified by:
getIntersectionPoint
in interfaceBodyShape
 Type Parameters:
T
 type of the field elements Parameters:
lineInFrame
 test line (may intersect the body or not)closeInFrame
 point used for intersections selectionframe
 frame in which line is expresseddate
 date of the line in given frame Returns:
 intersection point at altitude zero or null if the line does not intersect the surface

projectToGround
public TimeStampedPVCoordinates projectToGround(TimeStampedPVCoordinates pv, Frame frame)
Description copied from interface:BodyShape
Project a moving point to the ground. Specified by:
projectToGround
in interfaceBodyShape
 Parameters:
pv
 moving pointframe
 frame in which moving point is expressed Returns:
 ground point exactly at the local vertical of specified point, in the same frame as specified point
 See Also:
BodyShape.projectToGround(Vector3D, AbsoluteDate, Frame)

transform
public GeodeticPoint transform(Vector3D point, Frame frame, AbsoluteDate date)
Transform a Cartesian point to a surfacerelative point. Specified by:
transform
in interfaceBodyShape
 Parameters:
date
 date of the conversion. Used for computing frame transformations and for time dependent geopotential.point
 Cartesian pointframe
 frame in which Cartesian point is expressed Returns:
 The surface relative point at the same location. Altitude is
orthometric height, that is height above the
Geoid
. Latitude and longitude are both geodetic and defined with respect to thereference ellipsoid
.  See Also:
transform(GeodeticPoint)
, Orthometric_height

transform
public <T extends CalculusFieldElement<T>> FieldGeodeticPoint<T> transform(FieldVector3D<T> point, Frame frame, FieldAbsoluteDate<T> date)
Transform a Cartesian point to a surfacerelative point. Specified by:
transform
in interfaceBodyShape
 Type Parameters:
T
 type of the filed elements Parameters:
date
 date of the conversion. Used for computing frame transformations and for time dependent geopotential.point
 Cartesian pointframe
 frame in which Cartesian point is expressed Returns:
 The surface relative point at the same location. Altitude is
orthometric height, that is height above the
Geoid
. Latitude and longitude are both geodetic and defined with respect to thereference ellipsoid
.  See Also:
transform(GeodeticPoint)
, Orthometric_height

transform
public Vector3D transform(GeodeticPoint point)
Transform a surfacerelative point to a Cartesian point. Specified by:
transform
in interfaceBodyShape
 Parameters:
point
 The surface relative point to transform. Altitude is orthometric height, that is height above theGeoid
. Latitude and longitude are both geodetic and defined with respect to thereference ellipsoid
. Returns:
 point at the same location but as a Cartesian point in the
body frame
.  See Also:
transform(Vector3D, Frame, AbsoluteDate)

transform
public <T extends CalculusFieldElement<T>> FieldVector3D<T> transform(FieldGeodeticPoint<T> point)
Transform a surfacerelative point to a Cartesian point. Specified by:
transform
in interfaceBodyShape
 Type Parameters:
T
 type of the field elements Parameters:
point
 The surface relative point to transform. Altitude is orthometric height, that is height above theGeoid
. Latitude and longitude are both geodetic and defined with respect to thereference ellipsoid
. Returns:
 point at the same location but as a Cartesian point in the
body frame
.  Since:
 9.0
 See Also:
transform(Vector3D, Frame, AbsoluteDate)

