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::*;
#[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).
§Type Parameter
SourceU: length unit of the inputPosition
§Example
use affn::ellipsoidal::Position;
use affn::centers::ReferenceCenter;
use qtty::*;
#[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);
}Trait Implementations§
Source§impl<C: Clone + ReferenceCenter, F: Clone + ReferenceFrame, U: Clone + LengthUnit> Clone for Position<C, F, U>
impl<C: Clone + ReferenceCenter, F: Clone + ReferenceFrame, U: Clone + LengthUnit> Clone for Position<C, F, U>
Source§impl<C: Debug + ReferenceCenter, F: Debug + ReferenceFrame, U: Debug + LengthUnit> Debug for Position<C, F, U>
impl<C: Debug + ReferenceCenter, F: Debug + ReferenceFrame, U: Debug + LengthUnit> Debug for Position<C, F, U>
impl<C: Copy + ReferenceCenter, F: Copy + ReferenceFrame, U: Copy + LengthUnit> Copy for Position<C, F, U>
Auto Trait Implementations§
impl<C, F, U> Freeze for Position<C, F, U>
impl<C, F, U> RefUnwindSafe for Position<C, F, U>
impl<C, F, U> Send for Position<C, F, U>
impl<C, F, U> Sync for Position<C, F, U>
impl<C, F, U> Unpin for Position<C, F, U>
impl<C, F, U> UnsafeUnpin for Position<C, F, U>
impl<C, F, U> UnwindSafe for Position<C, F, U>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.