pub struct Position<C: ReferenceCenter, F: ReferenceFrame, U: LengthUnit = Meter> {
pub lon: Degrees,
pub lat: Degrees,
pub height: Quantity<U>,
/* private fields */
}Expand description
An ellipsoidal position (center + frame + height above ellipsoid).
This is the fundamental ellipsoidal (geodetic) coordinate type,
analogous to spherical::Position for
spherical coordinates.
§Type Parameters
C: The reference center (e.g.,Geocentric)F: The reference frame; determines the ellipsoid viaHasEllipsoidU: The length unit for the height (defaults toMeter)
§Field conventions
| Field | Meaning |
|---|---|
lon | Geodetic longitude, positive eastward |
lat | Geodetic latitude, positive northward |
height | Height above the reference ellipsoid |
§Correctness note
Do not convert this value using spherical-to-Cartesian formulas.
Always use the ellipsoid-aware
to_cartesian method.
Fields§
§lon: DegreesGeodetic longitude (positive eastward), in degrees.
lat: DegreesGeodetic latitude (positive northward), in degrees.
height: Quantity<U>Height above the reference ellipsoid.
Implementations§
Source§impl<C, F, U> Position<C, F, U>
impl<C, F, U> Position<C, F, U>
Sourcepub const fn new_raw_with_params(
center_params: C::Params,
lon: Degrees,
lat: Degrees,
height: Quantity<U>,
) -> Self
pub const fn new_raw_with_params( center_params: C::Params, lon: Degrees, lat: Degrees, height: Quantity<U>, ) -> Self
Const-fn constructor with explicit center parameters.
Longitude and latitude are stored as-is (no normalisation).
Use new_with_params if you want automatic
normalisation.
Sourcepub fn new_with_params(
center_params: C::Params,
lon: Degrees,
lat: Degrees,
height: Quantity<U>,
) -> Self
pub fn new_with_params( center_params: C::Params, lon: Degrees, lat: Degrees, height: Quantity<U>, ) -> Self
Constructor with explicit center parameters and lon/lat normalisation.
Longitude is normalised to [-180°, +180°) and latitude to [-90°, +90°]
(pole-crossing is reflected into longitude).
Sourcepub fn center_params(&self) -> &C::Params
pub fn center_params(&self) -> &C::Params
Returns a reference to the center parameters.
Source§impl<C, F, U> Position<C, F, U>
impl<C, F, U> Position<C, F, U>
Source§impl<C, F, U> Position<C, F, U>
impl<C, F, U> Position<C, F, U>
Sourcepub fn to_cartesian<TargetU: LengthUnit>(&self) -> Position<C, F, TargetU>
pub fn to_cartesian<TargetU: LengthUnit>(&self) -> Position<C, F, TargetU>
Converts to a Cartesian ECEF position using the ellipsoid of frame F.
The ellipsoid constants are obtained from F::Ellipsoid at compile time.
§Type Parameter
TargetU: length unit for the outputPosition
§Example
use affn::ellipsoidal::Position;
use affn::centers::ReferenceCenter;
use qtty::units::*; use qtty::{Quantity, M, KM, DEG, RAD, SEC}; use qtty::angular::{Degrees, Radians}; use qtty::length::{Meters, Kilometers};
#[derive(Debug, Copy, Clone)]
struct Geocentric;
impl ReferenceCenter for Geocentric {
type Params = ();
fn center_name() -> &'static str { "Geocentric" }
}
{
let obs = Position::<Geocentric, affn::frames::ECEF, Meter>::new(
-17.89 * DEG, 28.76 * DEG, 2200.0 * M,
);
let cart: affn::cartesian::Position<Geocentric, affn::frames::ECEF, Meter> =
obs.to_cartesian();
// X ≈ 5 390 km, Y ≈ −1 730 km, Z ≈ 3 050 km (approx. La Palma)
}Sourcepub fn from_cartesian<SourceU: LengthUnit>(
pos: &Position<C, F, SourceU>,
) -> Self
pub fn from_cartesian<SourceU: LengthUnit>( pos: &Position<C, F, SourceU>, ) -> Self
Constructs an ellipsoidal position from a Cartesian ECEF position using
the ellipsoid of frame F.
Uses the iterative Bowring algorithm (typically 2–3 iterations for sub-millimetre accuracy).
This is an infallible best-effort wrapper; prefer
try_from_cartesian when convergence
guarantees matter. If the Bowring iteration does not converge within
the iteration cap, this method returns the last computed iterate
without signalling the failure.
§Type Parameter
SourceU: length unit of the inputPosition
§Example
use affn::ellipsoidal::Position;
use affn::centers::ReferenceCenter;
use qtty::units::*; use qtty::{Quantity, M, KM, DEG, RAD, SEC}; use qtty::angular::{Degrees, Radians}; use qtty::length::{Meters, Kilometers};
#[derive(Debug, Copy, Clone)]
struct Geocentric;
impl ReferenceCenter for Geocentric {
type Params = ();
fn center_name() -> &'static str { "Geocentric" }
}
{
let obs = Position::<Geocentric, affn::frames::ECEF, Meter>::new(
-17.89 * DEG, 28.76 * DEG, 2200.0 * M,
);
let cart = obs.to_cartesian::<Meter>();
let back = Position::<Geocentric, affn::frames::ECEF, Meter>::from_cartesian(&cart);
assert!((back.lat.value() - obs.lat.value()).abs() < 1e-10);
}Sourcepub fn try_from_cartesian<SourceU: LengthUnit>(
pos: &Position<C, F, SourceU>,
) -> Result<Self, GeodeticConvergenceError>
pub fn try_from_cartesian<SourceU: LengthUnit>( pos: &Position<C, F, SourceU>, ) -> Result<Self, GeodeticConvergenceError>
Fallible counterpart of from_cartesian.
Runs the same Bowring iteration, but returns
Err(GeodeticConvergenceError) when the
latitude residual (lat_new - lat_prev).abs() still exceeds the
convergence threshold (1e-14 rad) after the iteration cap.
§Type Parameter
SourceU: length unit of the inputPosition