Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
class LimitError(_ValueError):
'''Error raised for lat- or longitudinal deltas exceeding
the B{C{limit}} in functions L{equirectangular} and
L{equirectangular_} and C{nearestOn*} and C{simplify*}
functions or methods.
'''
pass
class ParseError(_ValueError):
'''Error parsing degrees, radians or several other formats.
'''
pass
class PointsError(_ValueError):
'''Error for an insufficient number of points.
'''
pass
class RangeError(_ValueError):
'''Error raised for lat- or longitude values outside the B{C{clip}},
B{C{clipLat}}, B{C{clipLon}} or B{C{limit}} range in function
L{clipDegrees}, L{clipRadians}, L{parse3llh}, L{parseDMS},
L{parseDMS2} or L{parseRad}.
@see: Function L{rangerrors}.
'''
pass
def _xyzhdn6(xyz, y, z, height, datum, ll, Error=_TypeError): # by .cartesianBase, .nvectorBase
'''(INTERNAL) Get an C{(x, y, z, h, d, name)} 6-tuple.
'''
x, y, z, n = _xyzn4(xyz, y, z, Error=Error)
h = height or getattr(xyz, _height_, None) \
or getattr(xyz, _h_, None) \
or getattr(ll, _height_, None)
d = datum or getattr(xyz, _datum_, None) \
or getattr(ll, _datum_, None)
return x, y, z, h, d, n
class VectorError(_ValueError):
'''L{Vector3d} or C{*Nvector} issue.
'''
pass
class Vector3d(_NamedBase): # XXX or _NamedTuple or Vector3Tuple?
'''Generic 3-D vector manipulation.
In a geodesy context, these may be used to represent:
- n-vector representing a normal to point on earth's surface
- earth-centered, earth-fixed vector (= n-vector for spherical model)
- great circle normal to vector
- motion vector on earth's surface
- etc.
'''
_crosserrors = True # un/set by .errors.crosserrors
@note: Using B{C{beta}}C{=0} returns the mean of B{C{xs}}.
'''
n, xs = len2(xs)
d, ds = len2(ds)
if n != d or n < 1:
raise LenError(fidw, xs=n, ds=d)
d, x = min(zip(ds, xs))
if d > EPS and n > 1:
b = -Int_(beta, name=_beta_, low=0, high=3)
if b < 0:
ds = tuple(d**b for d in ds)
d = fsum(ds)
if d < EPS:
raise _ValueError(ds=d)
x = fdot(xs, *ds) / d
else:
x = fmean(xs)
elif d < 0:
raise _ValueError(_item_sq('ds', ds.index(d)), d)
return x
if LatLon is not None:
if isclass(LatLon) and all(hasattr(LatLon, a) for a in LatLon_.__slots__):
self._LatLon = LatLon
else:
raise _IsnotError(_valid_, LatLon=LatLon)
# check the attr indices
for n, (ai, i) in enumerate(ais):
if not isint(i):
raise _IsnotError(int.__name__, **{ai: i})
i = int(i)
if not 0 <= i < shape[1]:
raise _ValueError(ai, i)
for aj, j in ais[:n]:
if int(j) == i:
raise _ValueError(' == '.join(map1(str, ai, aj, i)))
setattr(self, _UNDERSCORE_ + ai, i)
def _CassiniSoldner(cs0):
'''(INTERNAL) Get/set default projection.
'''
if cs0 is None:
global _CassiniSoldner0
if _CassiniSoldner0 is None:
_CassiniSoldner0 = CassiniSoldner(0, 0, name='Default')
cs0 = _CassiniSoldner0
else:
_xinstanceof(CassiniSoldner, cs0=cs0)
return cs0
class CSSError(_ValueError):
'''Cassini-Soldner (CSS) conversion or other L{Css} issue.
'''
pass
class CassiniSoldner(_NamedBase):
'''Cassini-Soldner projection, a Python version of Karney's C++ class U{CassiniSoldner
}.
'''
_cb0 = 0
_datum = Datums.WGS84 #: (INTERNAL) L{Datum}.
_latlon0 = ()
_meridian = None
_sb0 = 0
def __init__(self, lat0, lon0, datum=Datums.WGS84, name=NN):
def _nd2(p, d, r, i, *qs):
# return Nvector and angular distance squared
_Nvll.others(p, name=_point_ + i)
for q in qs:
if p.isequalTo(q, EPS):
raise _ValueError(points=p, txt=_coincident_)
return p.toNvector(), (Scalar(d, name=_distance_ + i) / r)**2
@kwarg prec: Optional number of decimal digits (0..9 or
C{None} for default). Trailing zero decimals
are stripped for B{C{prec}} values of 1 and
above, but kept for negative B{C{prec}}.
@kwarg s_D: Symbol for degrees (C{str}).
@kwarg s_M: Symbol for minutes (C{str}) or C{""}.
@kwarg s_S: Symbol for seconds (C{str}) or C{""}.
@kwarg neg: Optional sign for negative (C{'-'}).
@kwarg pos: Optional sign for positive (C{''}).
@return: I{Either} degrees, minutes B{I{or}} seconds (C{str}).
'''
try:
deg = float(deg)
except (TypeError, ValueError) as x:
raise _ValueError(deg=deg, txt=str(x))
d, s = abs(deg), s_D
if d < 1:
if s_M:
d *= 60
if d < 1 and s_S:
d *= 60
s = s_S
else:
s = s_M
elif s_S:
d *= 3600
s = s_S
n = neg if deg < 0 else pos
z = int(prec)
Z = X.cross(Y) # unit vector perpendicular to plane
n = n.plus(Z.times(sqrt(z)))
if height is None:
h = fidw((point1.height, point2.height, point3.height),
map1(fabs, distance1, distance2, distance3))
else:
h = Height(height)
kwds = _xkwds(LatLon_kwds, height=h, LatLon=LatLon)
return n.toLatLon(**kwds) # Nvector(n.x, n.y, n.z).toLatLon(...)
# no intersection, d < EPS_2 or abs(j) < EPS_2
t = unstr(trilaterate.__name__, point1, distance1,
point2, distance2,
point3, distance3, useZ=useZ, d=d)
raise _ValueError('no intersection', txt=t)
def _geodesic(datum, points, closed, line, wrap):
# Compute the area or perimeter of a polygon,
# using the GeographicLib package, iff installed
g = datum.ellipsoid.geodesic
if not wrap: # capability LONG_UNROLL can't be off
raise _ValueError(wrap=wrap)
_, points = points2(points, closed=closed) # base=LatLonEllipsoidalBase(0, 0)
g = g.Polygon(line)
# note, lon deltas are unrolled, by default
for p in points:
g.AddPoint(p.lat, p.lon)
if closed and line:
p = points[0]
g.AddPoint(p.lat, p.lon)
# g.Compute returns (number_of_points, perimeter, signed area)
return g.Compute(False, True)[1 if line else 2]
def fmean(xs):
'''Compute the accurate mean M{sum(xs[i] for
i=0..len(xs)) / len(xs)}.
@arg xs: Values (C{scalar}s).
@return: Mean value (C{float}).
@raise OverflowError: Partial C{2sum} overflow.
@raise ValueError: No B{C{xs}} values.
'''
n, xs = len2(xs)
if n > 0:
return fsum(xs) / n
raise _ValueError(xs=xs)