def _datumatch(self, latlon): '''Check for matching datum ellipsoids. @raise CSSError: Ellipsoidal mismatch of B{C{latlon}} and this projection. ''' C, E = self.datum.ellipsoid, latlon.datum.ellipsoid if E != C: raise CSSError(E.named2, txt=_incompatible(C.named2))
def exactTM(self, exactTM): '''Set the ETM projection (L{ExactTransverseMercator}). ''' _xinstanceof(ExactTransverseMercator, exactTM=exactTM) E = self.datum.ellipsoid if exactTM._E != E or exactTM.majoradius != E.a \ or exactTM.flattening != E.f: raise ETMError(repr(exactTM), txt=_incompatible(repr(E))) self._exactTM = exactTM self._scale0 = exactTM.k0
def toLatLon(self, LatLon=None, unfalse=True, **unused): # PYCHOK expected '''Convert this ETM coordinate to an (ellipsoidal) geodetic point. @kwarg LatLon: Optional, ellipsoidal class to return the geodetic point (C{LatLon}) or C{None}. @kwarg unfalse: Unfalse B{C{easting}} and B{C{northing}} if falsed (C{bool}). @return: This ETM coordinate as (B{C{LatLon}}) or a L{LatLonDatum5Tuple}C{(lat, lon, datum, convergence, scale)} if B{C{LatLon}} is C{None}. @raise EllipticError: No convergence. @raise TypeError: If B{C{LatLon}} is not ellipsoidal. @example: >>> from pygeodesy import ellipsoidalVincenty as eV, Etm >>> u = Etm(31, 'N', 448251.795, 5411932.678) >>> ll = u.toLatLon(eV.LatLon) # 48°51′29.52″N, 002°17′40.20″E ''' xTM, d = self.exactTM, self.datum # double check that this and exactTM's ellipsoids stil match if xTM._E != d.ellipsoid: t = repr(d.ellipsoid) raise ETMError(repr(xTM._E), txt=_incompatible(t)) if self._latlon and self._latlon_args == (xTM, unfalse): return self._latlon5(LatLon) f = not unfalse e, n = self.to2en(falsed=f) # f = unfalse == self.falsed # == unfalse and self.falsed or (not unfalse and not self.falsed) # == unfalse if self.falsed else not unfalse # == unfalse if self.falsed else f if self.falsed: f = unfalse lon0 = _cmlon(self.zone) if f else None lat, lon, g, k = xTM.reverse(e, n, lon0=lon0) ll = _LLEB(lat, lon, datum=d, name=self.name) ll._convergence = g ll._scale = k self._latlon_to(ll, xTM, unfalse) return self._latlon5(LatLon)
def others(self, other, name=_other_, up=1): # see .points.LatLon_.others '''Check this and an other instance for type compatiblility. @arg other: The other instance (any C{type}). @kwarg name: Optional, name for other (C{str}). @kwarg up: Number of call stack frames up (C{int}). @raise TypeError: Mismatch of the B{C{other}} and this C{class} or C{type}. ''' if not (isinstance(self, other.__class__) or isinstance(other, self.__class__)): n = _callname(name, classname(self, prefixed=True), self.name, up=up + 1) raise _TypeError(name, other, txt=_incompatible(n))
def ellipsoids(self, other): '''Check the type and ellipsoid of this and an other point's datum. @arg other: The other point (C{LatLon}). @return: This point's datum ellipsoid (L{Ellipsoid} or L{Ellipsoid2}). @raise TypeError: The B{C{other}} point is not C{LatLon}. @raise ValueError: Incompatible datum ellipsoids. ''' self.others(other, up=2) # ellipsoids' caller E = self.ellipsoid() try: # other may be Sphere, etc. e = other.ellipsoid() except AttributeError: # PYCHOK no cover try: # no ellipsoid method, try datum e = other.datum.ellipsoid except AttributeError: e = E # no datum, XXX assume equivalent? if e != E: raise _ValueError(e.named2, txt=_incompatible(E.named2)) return E
def _xotherError(inst, other, name=_other_, up=1): '''(INTERNAL) Return a C{_TypeError} for an incompatible, named C{other}. ''' n = _callname(name, classname(inst, prefixed=True), inst.name, up=up + 1) return _TypeError(name, other, txt=_incompatible(n))