public class Geoid extends Object implements EarthShape
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]:
ReferenceEllipsoid
. 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)
and transform(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:
Constructor and Description |
---|
Geoid(NormalizedSphericalHarmonicsProvider geopotential,
ReferenceEllipsoid referenceEllipsoid)
Creates a geoid from the given geopotential, reference ellipsoid and the
assumptions in the comment for
Geoid . |
Modifier and Type | Method and 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>> |
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.
|
TimeStampedPVCoordinates |
projectToGround(TimeStampedPVCoordinates pv,
Frame frame)
Project a moving point to the ground.
|
Vector3D |
projectToGround(Vector3D point,
AbsoluteDate date,
Frame frame)
Project a point to the ground.
|
<T extends CalculusFieldElement<T>> |
transform(FieldGeodeticPoint<T> point)
Transform a surface-relative point to a Cartesian point.
|
<T extends CalculusFieldElement<T>> |
transform(FieldVector3D<T> point,
Frame frame,
FieldAbsoluteDate<T> date)
Transform a Cartesian point to a surface-relative point.
|
Vector3D |
transform(GeodeticPoint point)
Transform a surface-relative point to a Cartesian point.
|
GeodeticPoint |
transform(Vector3D point,
Frame frame,
AbsoluteDate date)
Transform a Cartesian point to a surface-relative point.
|
@DefaultDataContext public Geoid(NormalizedSphericalHarmonicsProvider geopotential, ReferenceEllipsoid referenceEllipsoid)
Geoid
.geopotential
- the gravity potential. Only the anomalous
potential will be used. It is assumed that the
geopotential
and the referenceEllipsoid
are defined in the same
frame. Usually a constant geopotential
is used to define a
time-invariant Geoid.referenceEllipsoid
- the normal gravity potential.NullPointerException
- if geopotential == null ||
referenceEllipsoid == null
public Frame getBodyFrame()
BodyShape
getBodyFrame
in interface BodyShape
public double getUndulation(double geodeticLatitude, double longitude, AbsoluteDate date)
reference 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
and longitude
.
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.Geoid
,
Geoid on Wikipediapublic ReferenceEllipsoid getEllipsoid()
EarthShape
GeodeticPoint
is not needed,
then using the ellipsoid will provide the quickest transformation.getEllipsoid
in interface EarthShape
this
, but never null
.public GeodeticPoint getIntersectionPoint(Line lineInFrame, Vector3D closeInFrame, Frame frame, AbsoluteDate date)
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.
getIntersectionPoint
in interface BodyShape
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 framepublic Vector3D projectToGround(Vector3D point, AbsoluteDate date, Frame frame)
BodyShape
projectToGround
in interface BodyShape
point
- point to projectdate
- current dateframe
- frame in which moving point is expressedBodyShape.projectToGround(TimeStampedPVCoordinates, Frame)
public <T extends CalculusFieldElement<T>> FieldGeodeticPoint<T> getIntersectionPoint(FieldLine<T> lineInFrame, FieldVector3D<T> closeInFrame, Frame frame, FieldAbsoluteDate<T> date)
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.
getIntersectionPoint
in interface BodyShape
T
- type of the field elementslineInFrame
- 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 framepublic TimeStampedPVCoordinates projectToGround(TimeStampedPVCoordinates pv, Frame frame)
BodyShape
projectToGround
in interface BodyShape
pv
- moving pointframe
- frame in which moving point is expressedBodyShape.projectToGround(Vector3D, AbsoluteDate, Frame)
public GeodeticPoint transform(Vector3D point, Frame frame, AbsoluteDate date)
transform
in interface BodyShape
date
- date of the conversion. Used for computing frame
transformations and for time dependent geopotential.point
- Cartesian pointframe
- frame in which Cartesian point is expressedGeoid
. Latitude and
longitude are both geodetic and defined with respect to the reference ellipsoid
.transform(GeodeticPoint)
,
Orthometric_heightpublic <T extends CalculusFieldElement<T>> FieldGeodeticPoint<T> transform(FieldVector3D<T> point, Frame frame, FieldAbsoluteDate<T> date)
transform
in interface BodyShape
T
- type fo the filed elementsdate
- date of the conversion. Used for computing frame
transformations and for time dependent geopotential.point
- Cartesian pointframe
- frame in which Cartesian point is expressedGeoid
. Latitude and
longitude are both geodetic and defined with respect to the reference ellipsoid
.transform(GeodeticPoint)
,
Orthometric_heightpublic Vector3D transform(GeodeticPoint point)
transform
in interface BodyShape
point
- The surface relative point to transform. Altitude is
orthometric height, that is height above the Geoid
.
Latitude and longitude are both geodetic and defined with
respect to the reference ellipsoid
.body frame
.transform(Vector3D, Frame, AbsoluteDate)
public <T extends CalculusFieldElement<T>> FieldVector3D<T> transform(FieldGeodeticPoint<T> point)
transform
in interface BodyShape
T
- type of the field elementspoint
- The surface relative point to transform. Altitude is
orthometric height, that is height above the Geoid
.
Latitude and longitude are both geodetic and defined with
respect to the reference ellipsoid
.body frame
.transform(Vector3D, Frame, AbsoluteDate)
Copyright © 2002-2022 CS GROUP. All rights reserved.