Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
x = lon - _cmlon(z) # z before Norway/Svaldbard
if abs(x) > _UTM_ZONE_OFF_MAX:
t = ' '.join((_outside_, _UTM_, _zone_, str(z), 'by', degDMS(x, prec=6)))
raise RangeError(lon=degDMS(lon), txt=t)
if B == 'X': # and 0 <= int(lon) < 42: z = int(lon + 183) // 6 + 1
x = {32: 9, 34: 21, 36: 33}.get(z, None)
if x: # Svalbard
z += 1 if lon >= x else -1
elif B == 'V' and z == 31 and lon >= 3:
z += 1 # SouthWestern Norway
if cmoff: # lon off central meridian
lon -= _cmlon(z) # z after Norway/Svaldbard
return Zone(z), Band(B), Lat(lat), Lon(lon)
lon = lon * _Tile + _index(_DegChar, g, 2)
lat = lat * _Tile + _index(_DegChar, g, 3)
m, p = 6, precision - 1
for i in range(_BaseLen, _BaseLen + p):
lon = _digit(lon, g, i, m)
lat = _digit(lat, g, i + p, m)
u *= m
m = _Base
u *= _Tile
if center:
lon = lon * 2 + 1
lat = lat * 2 + 1
u *= 2
u = _Tile / u
r = LatLonPrec3Tuple(Lat(lat * u, Error=WGRSError),
Lon(lon * u, Error=WGRSError), precision)
return _xnamed(r, nameof(georef))
def _2fllh(lat, lon, height=None):
'''(INTERNAL) Convert lat, lon, height.
'''
# lat, lon = parseDMS2(lat, lon)
return (Lat(lat, Error=WGRSError),
Lon(lon, Error=WGRSError), height)
@arg lat: Latitude of the location (C{degrees90}).
@arg lon: Longitude of the location (C{degrees180}).
@kwarg name: Optional name for the location (C{str}).
@return: An L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale,
datum)} with C{x} and C{y} in C{meter} and C{lat} and
C{lon} in C{degrees}. The C{scale} of the projection
is C{1} in I{radial} direction, C{azimuth} clockwise
from true North and is C{1 / reciprocal} in the
direction perpendicular to this.
@see: Method L{EquidistantKarney.reverse}. A call to C{.forward}
followed by a call to C{.reverse} will return the original
C{lat, lon} to within roundoff.
'''
r = self.geodesic.Inverse(self.lat0, self.lon0, Lat(lat), Lon(lon), self._mask)
x, y = sincos2d(r.azi1)
t = Azimuthal7Tuple(x * r.s12, y * r.s12, r.lat2, r.lon2, r.azi2, self._1_rk(r), self.datum)
return _xnamed(t, name or self.name)
@note: The returned C{height} is C{None} if B{C{lat}} or B{C{lon}} is
invalid or outside the C{Conterminous US (CONUS)}, if the
B{C{model}} was invalid, if conversion failed or if the
query timed out. The C{error} is the C{HTTP-, IO-, SSL-,
Type-, URL-} or C{ValueError} as a string (C{str}).
@see: U{NOAA National Geodetic Survey
},
U{Geoid},
U{USGS10mElev.py}, module
L{geoids}, classes L{GeoidG2012B}, L{GeoidKarney} and
L{GeoidPGM}.
'''
try:
j = _qURL('https://Geodesy.NOAA.gov/api/geoid/ght',
('%s=%.6F' % (_lat_, Lat(lat)),
'%s=%.6F' % (_lon_, Lon(lon)),
'%s=%s' % ('model', model) if model else NN),
timeout=Scalar(timeout, name=_timeout_)) # PYCHOK indent
if j[:1] == '{' and j[-1:] == '}' and j.find('"error":') > 0:
d, e = _json(j), 'geoidHeight'
if isinstance(_xkwds_get(d, error=_n_a_), float):
h = d.get(e, None)
if h is not None:
m = _xkwds_get(d, geoidModel=_n_a_)
return GeoidHeight2Tuple(h, m)
else:
e = 'JSON'
e = 'no %s "%s"' % (e, clips(j, limit=256, white=_SPACE_))
except (HTTPError, IOError, ParseError, TypeError, ValueError) as x:
e = repr(x)
e = _error(geoidHeight2, lat, lon, e)
def Rlat(self, lat):
'''Approximate the earth radius at the given latitude.
@arg lat: Latitude (C{degrees90}).
@return: Approximate earth radius (C{meter}).
@raise ValueError: Invalid B{C{lat}}.
'''
if self._ab_90 is None:
self._ab_90 = (self.a - self.b) / 90.0
# r = major - (major - minor) * |lat| / 90
r = self.a
if lat:
r -= self._ab_90 * min(abs(Lat(lat, clip=0)), 90)
return Radius(r, name=Ellipsoid.Rlat.__name__)
g, precision = _2garstr2(garef)
lon = _ll(_Digits, g, 0, _LonLen, 1, 720) + _LonOrig_M1_1
lat = _ll(_Letters, g, _LonLen, _MinLen, 0, 359) + _LatOrig_M1
if precision > 0:
lon, lat = _ll2(lon, lat, g, _MinLen, _M2)
if precision > 1:
lon, lat = _ll2(lon, lat, g, _MinLen + 1, _M3)
if center: # ll = (ll * 2 + 1) / 2
lon += 0.5
lat += 0.5
r = _Resolutions[precision] # == 1.0 / unit
r = LatLonPrec3Tuple(Lat(lat * r, Error=GARSError),
Lon(lon * r, Error=GARSError), precision)
return _xnamed(r, nameof(garef))
def rescale0(self, lat, scale0=_K0):
'''Set the central scale factor for this UPS projection.
@arg lat: Northern latitude (C{degrees}).
@arg scale0: UPS k0 scale at B{C{lat}} latitude (C{scalar}).
@raise RangeError: If B{C{lat}} outside the valid range
and L{rangerrors} set to C{True}.
@raise UPSError: Invalid B{C{scale}}.
'''
s0 = Scalar_(scale0, Error=UPSError, name='scale0', low=EPS) # <= 1.003 or 1.0016?
u = toUps8(abs(Lat(lat)), 0, datum=self.datum, Ups=_UpsK1)
k = s0 / u.scale
if self.scale0 != k:
self._band = NN # force re-compute
self._latlon = self._epsg = self._mgrs = self._utm = None
self._scale0 = Scalar(k)