def philam(self): '''Get the lat- and longitude ((L{PhiLam2Tuple}C{(phi, lam)}). ''' if self._philam is None: r = self.latlon self._philam = PhiLam2Tuple(Phi_(r.lat), Lam_(r.lon)) return self._xnamed(self._philam)
def __init__(self, latlon0, par1, par2=None, E0=0, N0=0, k0=1, opt3=0, name=NN, auth=NN): '''New Lambert conformal conic projection. @arg latlon0: Origin with (ellipsoidal) datum (C{LatLon}). @arg par1: First standard parallel (C{degrees90}). @kwarg par2: Optional, second standard parallel (C{degrees90}). @kwarg E0: Optional, false easting (C{meter}). @kwarg N0: Optional, false northing (C{meter}). @kwarg k0: Optional scale factor (C{scalar}). @kwarg opt3: Optional meridian (C{degrees180}). @kwarg name: Optional name of the conic (C{str}). @kwarg auth: Optional authentication authority (C{str}). @return: A Lambert projection (L{Conic}). @raise TypeError: Non-ellipsoidal B{C{latlon0}}. @raise ValueError: Invalid B{C{par1}}, B{C{par2}}, B{C{E0}}, B{C{N0}}, B{C{k0}} or B{C{opt3}}. @example: >>> from pygeodesy import Conic, Datums, ellipsoidalNvector >>> ll0 = ellipsoidalNvector.LatLon(23, -96, datum=Datums.NAD27) >>> Snyder = Conic(ll0, 33, 45, E0=0, N0=0, name='Snyder') ''' if latlon0 is not None: _xinstanceof(_LLEB, latlon0=latlon0) self._phi0, self._lam0 = latlon0.philam self._par1 = Phi_(par1, name=_par1_) self._par2 = self._par1 if par2 is None else Phi_(par2, name=_par2_) if k0 != 1: self._k0 = Scalar_(k0, name=_k0_) if E0: self._E0 = Northing(E0, name=_E0_, falsed=True) if N0: self._N0 = Easting(N0, name=_N0_, falsed=True) if opt3: self._opt3 = Lam_(opt3, name='opt3') self.toDatum(latlon0.datum)._dup2(self) self._register(Conics, name) elif name: self.name = name if auth: self._auth = str(auth)
def bearing(lat1, lon1, lat2, lon2, **options): '''Compute the initial or final bearing (forward or reverse azimuth) between a (spherical) start and end point. @arg lat1: Start latitude (C{degrees}). @arg lon1: Start longitude (C{degrees}). @arg lat2: End latitude (C{degrees}). @arg lon2: End longitude (C{degrees}). @kwarg options: Optional keyword arguments for function L{bearing_}. @return: Initial or final bearing (compass C{degrees360}) or zero if start and end point coincide. ''' return degrees( bearing_(Phi_(lat1, name='lat1'), Lam_(lon1, name='lon1'), Phi_(lat2, name='lat2'), Lam_(lon2, name='lon2'), **options))
def degrees2m(deg, radius=R_M, lat=0): '''Convert angle to distance along the equator or along a parallel at an other latitude. @arg deg: Angle (C{degrees}). @kwarg radius: Mean earth radius (C{meter}). @kwarg lat: Parallel latitude (C{degrees90}, C{str}). @return: Distance (C{meter}, same units as B{C{radius}}). @raise RangeError: Latitude B{C{lat}} outside valid range and L{rangerrors} set to C{True}. @raise ValueError: Invalid B{C{deg}}, B{C{radius}} or B{C{lat}}. @see: Function L{m2degrees}. ''' m = Lam_(deg, name=_deg_, clip=0) * Radius(radius) if lat: m *= cos(Phi_(lat)) return float(m)
from pygeodesy.named import EasNor2Tuple, LatLonDatum3Tuple, \ _NamedBase, nameof, _xnamed from pygeodesy.streprs import enstr2 from pygeodesy.units import Easting, Lam_, Northing, Phi_, Scalar from pygeodesy.utily import degrees90, degrees180, sincos2 from math import cos, radians, sin, sqrt, tan __all__ = _ALL_LAZY.osgr __version__ = '20.09.01' _10um = 1e-5 #: (INTERNAL) 0.01 millimeter (C{meter}) _100km = 100000 #: (INTERNAL) 100 km (int meter) _A0 = Phi_(49) #: (INTERNAL) NatGrid true origin latitude, 49°N. _B0 = Lam_(-2) #: (INTERNAL) NatGrid true origin longitude, 2°W. _E0 = Easting(400e3) #: (INTERNAL) Easting of true origin (C{meter}). _N0 = Northing(-100e3) #: (INTERNAL) Northing of true origin (C{meter}). _F0 = Scalar( 0.9996012717) #: (INTERNAL) NatGrid scale of central meridian (C{float}). _Datums_OSGB36 = Datums.OSGB36 #: (INTERNAL) Airy130 ellipsoid _latlon_ = 'latlon' _no_convertDatum_ = 'no .convertDatum' _ord_A = ord('A') _TRIPS = 33 #: (INTERNAL) .toLatLon convergence def _ll2datum(ll, datum, name): '''(INTERNAL) Convert datum if needed. '''