Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def toLatLon(self, LatLon=None, eps=EPS, unfalse=True, **LatLon_kwds):
'''Convert this UTM coordinate to an (ellipsoidal) geodetic point.
@kwarg LatLon: Optional, ellipsoidal class to return the
geodetic point (C{LatLon}) or C{None}.
@kwarg eps: Optional convergence limit, L{EPS} or above
(C{float}).
@kwarg unfalse: Unfalse B{C{easting}} and B{C{northing}}
if falsed (C{bool}).
@kwarg LatLon_kwds: Optional, additional B{C{LatLon}} keyword
arguments, ignored if B{C{LatLon=None}}.
@return: This UTM coordinate (B{C{LatLon}}) or if B{C{LatLon}}
is C{None}, a L{LatLonDatum5Tuple}C{(lat, lon, datum,
convergence, scale)}.
@raise TypeError: If B{C{LatLon}} is not ellipsoidal.
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)
B{C{radius}} or C{degrees} if B{C{radius}} is C{None}).
@arg high: Latitudinal box height (C{meter}, same units as
B{C{radius}} or C{degrees} if B{C{radius}} is C{None}).
@kwarg radius: Mean earth radius (C{meter}).
@return: A L{Bounds2Tuple}C{(latlonSW, latlonNE)}, the
lower-left and upper-right corner (C{LatLon}).
@see: U{https://www.Movable-Type.co.UK/scripts/latlong-db.html}
'''
w = Scalar_(wide, name='wide') * 0.5
h = Scalar_(high, name='high') * 0.5
if radius is not None:
r = Radius_(radius)
c = cos(self.phi)
if c > EPS:
w = degrees(asin(w / r) / c)
else:
w = 0 # XXX
h = degrees(h / r)
w, h = abs(w), abs(h)
r = Bounds2Tuple(self.classof(self.lat - h, self.lon - w, height=self.height),
self.classof(self.lat + h, self.lon + w, height=self.height))
return self._xnamed(r)
def _k_t(c):
t = c > EPS
if t:
k = 1 / c
else:
k = 1
return k, t
>>> geohash.encode(52.205, 0.119, 7) # 'u120fxw'
>>> geohash.encode(52.205, 0.119, 12) # 'u120fxwshvkg'
>>> geohash.encode(52.205, 0.1188, 12) # 'u120fxws0jre'
>>> geohash.encode(52.205, 0.1188) # 'u120fxw'
>>> geohash.encode( 0, 0) # 's00000000000'
'''
lat, lon = _2fll(lat, lon)
if precision is None:
# Infer precision by refining geohash until
# it matches precision of supplied lat/lon.
for p in range(1, _MaxPrec + 1):
gh = encode(lat, lon, p)
ll = map2(float, decode(gh))
if abs(lat - ll[0]) < EPS and \
abs(lon - ll[1]) < EPS:
return gh
p = _MaxPrec
else:
p = Precision_(precision, Error=GeohashError, low=1, high=_MaxPrec)
s, w, n, e = _Bounds4
b = i = 0
d, gh = True, []
while len(gh) < p:
i += i
if d: # bisect longitude
m = favg(e, w)
if lon < m:
is C{None}, a L{LatLonDatum5Tuple}C{(lat, lon, datum,
convergence, scale)}.
@raise TypeError: If B{C{LatLon}} is not ellipsoidal.
@raise UPSError: Invalid meridional radius or H-value.
'''
if self._latlon and self._latlon_args == unfalse:
return self._latlon5(LatLon)
E = self.datum.ellipsoid # XXX vs LatLon.datum.ellipsoid
x, y = self.to2en(falsed=not unfalse)
r = hypot(x, y)
t = (r / (2 * self.scale0 * E.a / E.es_c)) if r > 0 else EPS**2
t = E.es_tauf((1 / t - t) * 0.5)
if self._pole == _N_:
a, b, c = atan(t), atan2(x, -y), 1
else:
a, b, c = -atan(t), atan2(x, y), -1
a, b = degrees90(a), degrees180(b)
if not self._band:
self._band = _Band(a, b)
if not self._hemisphere:
self._hemisphere = _hemi(a)
ll = _LLEB(a, b, datum=self._datum, name=self.name)
ll._convergence = b * c # gamma
ll._scale = _scale(E, r, t) if r > 0 else self.scale0
def _ordedup(ts, lo=EPS, hi=PI2-EPS):
# clip, order and remove duplicates
p, ks = 0, []
for k in sorted(max(lo, min(hi, t)) for t in ts):
if k > p:
ks.append(k)
p = k
return ks
def clipedges(self): # yield clip edge index
# and set self._x1, ._y1, ._dx, ._dy and
# ._xy for each non-null clip edge
c2 = self._cs[self._nc - 1]
for e in range(self._nc):
c1, c2 = c2, self._cs[e]
self._y1, self._dy = c1.lat, float(c2.lat - c1.lat)
self._x1, self._dx = c1.lon, float(c2.lon - c1.lon)
if abs(self._dx) > EPS or abs(self._dy) > EPS:
self._xy = self._y1 * self._dx - self._x1 * self._dy
yield e + 1
A0 = E.A * getattr(Utm, '_scale0', _K0) # Utm is class or None
K = _Kseries(E.AlphaKs, x, y) # Krüger series
y = K.ys(y) * A0 # ξ
x = K.xs(x) * A0 # η
# convergence: Karney 2011 Eq 23, 24
p_ = K.ps(1)
q_ = K.qs(0)
c = degrees(atan(T_ / hypot1(T_) * tan(b)) + atan2(q_, p_))
# scale: Karney 2011 Eq 25
k = E.e2s(sin(a)) * T12 / H * (A0 / E.a * hypot(p_, q_))
return _toXtm8(Utm, z, lat, x, y,
B, d, c, k, f, name, latlon, EPS)