Geodetic and Geocentric
There are six functions that can help to convert between geodetic and geocentric representations. The functions use the WGS-84 reference ellipsoid by default and support a custom ellipsoid through the ellipsoid keyword argument.
ECEF to Geocentric
We can convert a position vector represented in an Earth-Centered, Earth-Fixed frame (ECEF) r_e to the Geocentric latitude, longitude, and distance from Earth's center using the following function:
ecef_to_geocentric(r_e::AbstractVector{T}) -> NTuple{3, float(T)}which returns a tuple with:
- The Geocentric latitude [rad];
- The longitude [rad]; and
- The distance from the Earth's center [m].
julia> ecef_to_geocentric([7000, 0, 7000])(0.7853981633974483, 0.0, 9899.494936611665)julia> ecef_to_geocentric([0, 0, 7000])(1.5707963267948966, 0.0, 7000.0)julia> ecef_to_geocentric([7000, 0, 0])(0.0, 0.0, 7000.0)
Geocentric to ECEF
We can convert a Geocentric coordinate (latitude lat [rad], longitude lon [rad], and distance from Earth's center r [m]) to a vector represented in the Earth-Centered, Earth-Fixed (ECEF) frame using the following function:
geocentric_to_ecef(lat::Number, lon::Number, r::Number) -> SVector{3}which returns a 3x1 vector.
julia> geocentric_to_ecef(0, 0, 7000e3)3-element StaticArraysCore.SVector{3, Float64} with indices SOneTo(3): 7.0e6 0.0 0.0julia> geocentric_to_ecef(pi / 2, 0, 7000e3)3-element StaticArraysCore.SVector{3, Float64} with indices SOneTo(3): 4.286263797015736e-10 0.0 7.0e6julia> geocentric_to_ecef(pi / 4, 0, 7000e3)3-element StaticArraysCore.SVector{3, Float64} with indices SOneTo(3): 4.949747468305833e6 0.0 4.949747468305832e6
ECEF to Geodetic
We can convert a position vector represented in an Earth-Centered, Earth-Fixed frame (ECEF) r_e to the Geodetic latitude, longitude, and altitude using the following function:
ecef_to_geodetic(r_e::AbstractVector{T}; ellipsoid = WGS84_ELLIPSOID) -> NTuple{3, float(T)}which returns a tuple with:
- The Geodetic latitude [rad];
- The longitude [rad]; and
- The altitude above the reference ellipsoid [m].
julia> ecef_to_geodetic([6378137.0, 0, 0])(0.0, 0.0, 0.0)julia> ecef_to_geodetic([0, 6378137.0, 0])(0.0, 1.5707963267948966, 0.0)julia> ecef_to_geodetic([0, 0, 6378137.0])(1.5707963267948966, 0.0, 21384.685754820704)
Geodetic to ECEF
The Geodetic latitude lat [rad], longitude lon [rad], and altitude h [m] can be converted to a vector represented in an ECEF reference frame by the following function:
geodetic_to_ecef(lat::Number, lon::Number, h::Number; ellipsoid = WGS84_ELLIPSOID) -> SVector{3}which returns a 3x1 vector.
julia> geodetic_to_ecef(0, 0, 0)3-element StaticArraysCore.SVector{3, Float64} with indices SOneTo(3): 6.378137e6 0.0 0.0julia> geodetic_to_ecef(deg2rad(-22), deg2rad(-45), 0)3-element StaticArraysCore.SVector{3, Float64} with indices SOneTo(3): 4.1835869067109847e6 -4.1835869067109837e6 -2.3744128953028163e6
Geocentric to Geodetic
Given a Geocentric latitude ϕ_gc [rad] and distance from the center of Earth r [m], one can obtain the Geodetic coordinates (Geodetic latitude and altitude above the reference ellipsoid (WGS-84 by default) using the following function:
geocentric_to_geodetic(ϕ_gc::Number, r::Number; ellipsoid = WGS84_ELLIPSOID) -> Number, Numberwhich returns a tuple with two values:
- The Geodetic latitude [rad]; and
- The altitude above the reference ellipsoid [m].
julia> geocentric_to_geodetic(deg2rad(-22), 6378137.0)(-0.3863099329112617, 3013.9291869809385)julia> geocentric_to_geodetic(0, 6378137.0)(0.0, 0.0)
Geodetic to Geocentric
Given a Geodetic latitude ϕ_gd [rad] and altitude above the reference ellipsoid h [m], one can obtain the Geocentric coordinates (Geocentric latitude and position from the center of Earth) using the following function:
geodetic_to_geocentric(ϕ_gd::Number, h::Number; ellipsoid = WGS84_ELLIPSOID) -> Number, Numberwhich returns a tuple with two values:
- The Geocentric latitude [rad]; and
- The distance from the center of Earth [m].
julia> geodetic_to_geocentric(deg2rad(-22), 0)(-0.38164509973650357, 6.375157677217675e6)julia> geodetic_to_geocentric(0, 0)(0.0, 6.378137e6)