def rescale0(self, lat, scale0=_K0): '''Set the central scale factor for this UPS projection. @param lat: Northern latitude (C{degrees}). @param scale0: UPS k0 scale at I{lat} latitude (C{scalar}). @raise RangeError: If I{lat} outside the valid range and I{rangerrrors} set to C{True}. @raise ValueError: Invalid I{scale}. ''' try: s0 = float(scale0) if not 0 < s0: # <= 1.003 or 1.0016? raise ValueError except (TypeError, ValueError): raise ValueError('%s invalid: %r' % ('scale', scale0)) lat = clipDMS(lat, 90) # clip and force N u = toUps8(abs(lat), 0, datum=self.datum, Ups=_UpsK1) k = s0 / u.scale if self._scale0 != k: self._band = '' # force re-compute self._latlon = self._mgrs = self._utm = None self._scale0 = k
def toWm(latlon, lon=None, radius=R_MA, Wm=Wm, name=''): '''Convert a lat-/longitude point to a WM coordinate. @param latlon: Latitude (C{degrees}) or an (ellipsoidal or spherical) geodetic C{LatLon} point. @keyword lon: Optional longitude (C{degrees} or C{None}). @keyword radius: Optional earth radius (C{meter}). @keyword Wm: Optional (sub-)class to return the WM coordinate (L{Wm}) or C{None}. @keyword name: Optional name (C{str}). @return: The WM coordinate (B{C{Wm}}) or an L{EasNorRadius3Tuple}C{(easting, northing, radius)} if B{C{Wm}} is C{None}. @raise ValueError: If B{C{lon}} value is missing, if B{C{latlon}} is not scalar, if B{C{latlon}} is beyond the valid WM range and L{rangerrors} is set to C{True} or if B{C{radius}} is invalid. @example: >>> p = LatLon(48.8582, 2.2945) # 448251.8 5411932.7 >>> w = toWm(p) # 448252 5411933 >>> p = LatLon(13.4125, 103.8667) # 377302.4 1483034.8 >>> w = toWm(p) # 377302 1483035 ''' r, e = radius, None try: lat, lon = latlon.lat, latlon.lon if isinstance(latlon, _LLEB): r = latlon.datum.ellipsoid.a e = latlon.datum.ellipsoid.e if not name: # use latlon.name name = nameof(latlon) lat = clipDMS(lat, _LatLimit) except AttributeError: lat, lon = parseDMS2(latlon, lon, clipLat=_LatLimit) s = sin(radians(lat)) y = atanh(s) # == log(tan((90 + lat) / 2)) == log(tanPI_2_2(radians(lat))) if e: y -= e * atanh(e * s) e, n = r * radians(lon), r * y r = EasNorRadius3Tuple(e, n, r) if Wm is None else \ Wm(e, n, radius=r) return _xnamed(r, name)
def degrees2m(deg, radius=R_M, lat=0): '''Convert angle to distance along equator or at other latitude. @param deg: Angle (C{degrees}). @keyword radius: Mean earth radius (C{meter}). @keyword lat: Latitude adjusting the distance (C{degrees90}). @return: Distance (C{meter}, same units as I{radius}). @raise RangeError: Latitude I{lat} outside valid range and I{rangerrrors} set to C{True}. ''' m = radians(deg) * radius if lat: from dms import clipDMS m *= cos(radians(clipDMS(lat, 90))) return m
def toWm(latlon, lon=None, radius=R_MA, Wm=Wm): '''Convert a lat-/longitude point to a WM coordinate. @param latlon: Latitude (degrees) or an (ellipsoidal or spherical) geodetic I{LatLon} point. @keyword lon: Optional longitude (degrees or None). @keyword radius: Optional earth radius (meter). @keyword Wm: Optional Wm class for the WM coordinate (L{Wm}). @return: The WM coordinate (L{Wm}). @raise ValueError: If I{lon} value is missing, if I{latlon} is not scalar, if I{latlon} is beyond the valid WM range and L{rangerrors} is set to True or if I{radius} is invalid. @example: >>> p = LatLon(48.8582, 2.2945) # 448251.8 5411932.7 >>> w = toWm(p) # 448252 5411933 >>> p = LatLon(13.4125, 103.8667) # 377302.4 1483034.8 >>> w = toWm(p) # 377302 1483035 ''' r, e = radius, None try: lat, lon = latlon.lat, latlon.lon if isinstance(latlon, _eLLb): r = latlon.datum.ellipsoid.a e = latlon.datum.ellipsoid.e lat = clipDMS(lat, _LatLimit) except AttributeError: lat, lon = parseDMS2(latlon, lon, clipLat=_LatLimit) s = sin(radians(lat)) y = atanh(s) # == log(tan((90 + lat) / 2)) == log(tanPI_2_2(radians(lat))) if e: y -= e * atanh(e * s) return Wm(r * radians(lon), r * y, radius=r)