pygeodesy 24.6.1__py2.py3-none-any.whl → 24.6.24__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. {PyGeodesy-24.6.1.dist-info → PyGeodesy-24.6.24.dist-info}/METADATA +2 -2
  2. PyGeodesy-24.6.24.dist-info/RECORD +117 -0
  3. pygeodesy/__init__.py +33 -32
  4. pygeodesy/albers.py +2 -2
  5. pygeodesy/auxilats/__init__.py +1 -1
  6. pygeodesy/auxilats/auxAngle.py +40 -39
  7. pygeodesy/auxilats/auxDLat.py +3 -2
  8. pygeodesy/auxilats/auxLat.py +16 -18
  9. pygeodesy/auxilats/auxily.py +1 -1
  10. pygeodesy/azimuthal.py +10 -10
  11. pygeodesy/basics.py +9 -1
  12. pygeodesy/booleans.py +53 -66
  13. pygeodesy/cartesianBase.py +143 -155
  14. pygeodesy/css.py +14 -18
  15. pygeodesy/datums.py +6 -6
  16. pygeodesy/deprecated/__init__.py +1 -1
  17. pygeodesy/deprecated/classes.py +16 -2
  18. pygeodesy/deprecated/datum.py +3 -3
  19. pygeodesy/deprecated/functions.py +6 -8
  20. pygeodesy/dms.py +23 -27
  21. pygeodesy/ecef.py +49 -55
  22. pygeodesy/elevations.py +4 -4
  23. pygeodesy/ellipsoidalBase.py +28 -70
  24. pygeodesy/ellipsoidalBaseDI.py +19 -23
  25. pygeodesy/ellipsoidalExact.py +3 -3
  26. pygeodesy/ellipsoidalGeodSolve.py +15 -23
  27. pygeodesy/ellipsoidalKarney.py +37 -60
  28. pygeodesy/ellipsoidalNvector.py +44 -50
  29. pygeodesy/ellipsoidalVincenty.py +11 -14
  30. pygeodesy/ellipsoids.py +107 -101
  31. pygeodesy/errors.py +101 -49
  32. pygeodesy/etm.py +32 -44
  33. pygeodesy/formy.py +55 -58
  34. pygeodesy/frechet.py +20 -23
  35. pygeodesy/fsums.py +4 -4
  36. pygeodesy/gars.py +3 -4
  37. pygeodesy/geodesici.py +909 -0
  38. pygeodesy/geodesicw.py +11 -13
  39. pygeodesy/geodesicx/__init__.py +4 -4
  40. pygeodesy/geodesicx/gx.py +18 -28
  41. pygeodesy/geodesicx/gxbases.py +20 -8
  42. pygeodesy/geodesicx/gxline.py +16 -22
  43. pygeodesy/geodsolve.py +102 -34
  44. pygeodesy/geohash.py +39 -60
  45. pygeodesy/geoids.py +28 -37
  46. pygeodesy/hausdorff.py +21 -23
  47. pygeodesy/heights.py +15 -28
  48. pygeodesy/internals.py +19 -12
  49. pygeodesy/interns.py +4 -10
  50. pygeodesy/iters.py +2 -2
  51. pygeodesy/karney.py +20 -4
  52. pygeodesy/ktm.py +13 -16
  53. pygeodesy/latlonBase.py +202 -191
  54. pygeodesy/lazily.py +96 -59
  55. pygeodesy/lcc.py +29 -32
  56. pygeodesy/ltp.py +43 -24
  57. pygeodesy/ltpTuples.py +190 -183
  58. pygeodesy/mgrs.py +35 -9
  59. pygeodesy/named.py +106 -72
  60. pygeodesy/namedTuples.py +43 -14
  61. pygeodesy/nvectorBase.py +23 -27
  62. pygeodesy/osgr.py +9 -9
  63. pygeodesy/points.py +7 -7
  64. pygeodesy/rhumb/__init__.py +1 -1
  65. pygeodesy/rhumb/aux_.py +5 -5
  66. pygeodesy/rhumb/bases.py +30 -31
  67. pygeodesy/rhumb/ekx.py +3 -4
  68. pygeodesy/rhumb/solve.py +8 -61
  69. pygeodesy/solveBase.py +22 -19
  70. pygeodesy/sphericalBase.py +26 -21
  71. pygeodesy/sphericalNvector.py +13 -13
  72. pygeodesy/sphericalTrigonometry.py +86 -97
  73. pygeodesy/streprs.py +8 -36
  74. pygeodesy/trf.py +3 -3
  75. pygeodesy/triaxials.py +117 -91
  76. pygeodesy/units.py +229 -321
  77. pygeodesy/unitsBase.py +116 -108
  78. pygeodesy/ups.py +26 -31
  79. pygeodesy/utily.py +12 -11
  80. pygeodesy/utm.py +35 -40
  81. pygeodesy/utmups.py +43 -46
  82. pygeodesy/utmupsBase.py +9 -10
  83. pygeodesy/vector3d.py +59 -62
  84. pygeodesy/vector3dBase.py +17 -15
  85. pygeodesy/webmercator.py +19 -21
  86. pygeodesy/wgrs.py +18 -20
  87. PyGeodesy-24.6.1.dist-info/RECORD +0 -116
  88. {PyGeodesy-24.6.1.dist-info → PyGeodesy-24.6.24.dist-info}/WHEEL +0 -0
  89. {PyGeodesy-24.6.1.dist-info → PyGeodesy-24.6.24.dist-info}/top_level.txt +0 -0
pygeodesy/internals.py CHANGED
@@ -31,8 +31,14 @@ def _dunder_nameof(inst, *dflt):
31
31
  return dflt[0] if dflt else inst.__class__.__name__
32
32
 
33
33
 
34
+ def _dunder_nameof_(*names__): # in .errors._IsnotError
35
+ '''(INTERNAL) Yield the _dunder_nameof or name.
36
+ '''
37
+ return map(_dunder_nameof, names__, names__)
38
+
39
+
34
40
  def _Property_RO(method):
35
- '''(INTERNAL) Can't Irecursively import L{props.property_RO}.
41
+ '''(INTERNAL) Can't I{recursively} import L{props.property_RO}.
36
42
  '''
37
43
  name = _dunder_nameof(method)
38
44
 
@@ -53,7 +59,7 @@ def _Property_RO(method):
53
59
  return property(_get, _set, _del)
54
60
 
55
61
 
56
- class _ALL_MODS_Base(object):
62
+ class _MODS_Base(object):
57
63
  '''(INTERNAL) Base-class for C{lazily._ALL_MODS}.
58
64
  '''
59
65
  def __delattr__(self, attr): # PYCHOK no cover
@@ -207,7 +213,7 @@ class _ALL_MODS_Base(object):
207
213
  from pygeodesy import streprs # DON'T _lazy_import2
208
214
  return streprs
209
215
 
210
- _MODS = _ALL_MODS_Base() # PYCHOK overwritten by .lazily
216
+ _MODS = _MODS_Base() # PYCHOK overwritten by .lazily
211
217
 
212
218
 
213
219
  def _caller3(up): # in .lazily, .named
@@ -217,8 +223,9 @@ def _caller3(up): # in .lazily, .named
217
223
  # sys._getframe(1) ... 'importlib._bootstrap' line 1032,
218
224
  # may throw a ValueError('call stack not deep enough')
219
225
  f = _sys._getframe(up + 1)
220
- return (f.f_code.co_name, # caller name
221
- _os_path.basename(f.f_code.co_filename), # file name
226
+ c = f.f_code
227
+ return (c.co_name, # caller name
228
+ _os_path.basename(c.co_filename), # file name .py
222
229
  f.f_lineno) # line number
223
230
 
224
231
 
@@ -359,7 +366,7 @@ def _plural(noun, n):
359
366
  return NN(noun, _s_) if n > 1 else (noun if n else NN)
360
367
 
361
368
 
362
- def print_(*args, **nl_nt_prec_prefix__end_file_flush_sep_kwds): # PYCHOK no cover
369
+ def print_(*args, **nl_nt_prec_prefix__end_file_flush_sep__kwds): # PYCHOK no cover
363
370
  '''Python 3+ C{print}-like formatting and printing.
364
371
 
365
372
  @arg args: Values to be converted to C{str} and joined by B{C{sep}},
@@ -367,16 +374,16 @@ def print_(*args, **nl_nt_prec_prefix__end_file_flush_sep_kwds): # PYCHOK no co
367
374
 
368
375
  @see: Function L{printf} for further details.
369
376
  '''
370
- return printf(NN, *args, **nl_nt_prec_prefix__end_file_flush_sep_kwds)
377
+ return printf(NN, *args, **nl_nt_prec_prefix__end_file_flush_sep__kwds)
371
378
 
372
379
 
373
- def printf(fmt, *args, **nl_nt_prec_prefix__end_file_flush_sep_kwds):
380
+ def printf(fmt, *args, **nl_nt_prec_prefix__end_file_flush_sep__kwds):
374
381
  '''C{Printf-style} and Python 3+ C{print}-like formatting and printing.
375
382
 
376
383
  @arg fmt: U{Printf-style<https://Docs.Python.org/3/library/stdtypes.html#
377
384
  printf-style-string-formatting>} format specification (C{str}).
378
385
  @arg args: Arguments to be formatted (any C{type}, all positional).
379
- @kwarg nl_nt_prec_prefix__end_file_flush_sep_kwds: Optional keyword arguments
386
+ @kwarg nl_nt_prec_prefix__end_file_flush_sep__kwds: Optional keyword arguments
380
387
  C{B{nl}=0} for the number of leading blank lines (C{int}), C{B{nt}=0}
381
388
  the number of trailing blank lines (C{int}), C{B{prefix}=NN} to be
382
389
  inserted before the formatted text (C{str}) and Python 3+ C{print}
@@ -387,7 +394,7 @@ def printf(fmt, *args, **nl_nt_prec_prefix__end_file_flush_sep_kwds):
387
394
 
388
395
  @return: Number of bytes written.
389
396
  '''
390
- b, e, f, fl, p, s, kwds = _print7(**nl_nt_prec_prefix__end_file_flush_sep_kwds)
397
+ b, e, f, fl, p, s, kwds = _print7(**nl_nt_prec_prefix__end_file_flush_sep__kwds)
391
398
  try:
392
399
  if args:
393
400
  t = (fmt % args) if fmt else s.join(map(str, args))
@@ -399,7 +406,7 @@ def printf(fmt, *args, **nl_nt_prec_prefix__end_file_flush_sep_kwds):
399
406
  except Exception as x:
400
407
  _E, s = _MODS.errors._xError2(x)
401
408
  unstr = _MODS.streprs.unstr
402
- t = unstr(printf, fmt, *args, **nl_nt_prec_prefix__end_file_flush_sep_kwds)
409
+ t = unstr(printf, fmt, *args, **nl_nt_prec_prefix__end_file_flush_sep__kwds)
403
410
  raise _E(s, txt=t, cause=x)
404
411
  try:
405
412
  n = f.write(NN(b, t, e))
@@ -543,7 +550,7 @@ def _version_ints(vs):
543
550
 
544
551
 
545
552
  __all__ = tuple(map(_dunder_nameof, (machine, print_, printf)))
546
- __version__ = '24.05.25'
553
+ __version__ = '24.06.05'
547
554
 
548
555
  if _dunder_ismain(__name__): # PYCHOK no cover
549
556
 
pygeodesy/interns.py CHANGED
@@ -10,8 +10,8 @@ except NameError: # Python 3+
10
10
  _intern = _sys.intern
11
11
 
12
12
  _COMMASPACE_ = ', ' # overriden below
13
- _sub_packages = 'auxilats', 'deprecated', 'geodesicx', 'rhumb' # PYCHOK in .lazily,
14
- # ... make._dist, MANIFEST, setup.setup, test.bases, test.testModules
13
+ _SUB_PACKAGES = 'auxilats', 'deprecated', 'geodesicx', 'rhumb' # PYCHOK in ...
14
+ # ... .lazily, make._dist, MANIFEST, setup.setup, test.bases, .testModules
15
15
 
16
16
 
17
17
  class _Dash(str):
@@ -32,7 +32,7 @@ class _Int(int):
32
32
  class Str_(str):
33
33
  '''Extended, I{callable} C{str} class, not nameable.
34
34
 
35
- @see: Nameable and callable class L{pygeodesy.Str}.
35
+ @see: Nameable and callable class L{Str<pygeodesy.unitsBase.Str>}.
36
36
  '''
37
37
  def join_(self, *args):
38
38
  '''Join all positional B{C{args}} like C{self.join(B{args})}.
@@ -145,7 +145,6 @@ _and_ = 'and' # PYCHOK OK
145
145
  # _AND_ = _AMPERSAND_ # PYCHOK OK
146
146
  _angle_ = 'angle' # PYCHOK OK
147
147
  _antipodal_ = 'antipodal' # PYCHOK OK
148
- _areaOf_ = 'areaOf' # PYCHOK OK
149
148
  _arg_ = 'arg' # PYCHOK OK
150
149
  # _ASTERISK_ = _STAR_ # PYCHOK OK
151
150
  _AT_ = Str_('@') # PYCHOK OK
@@ -214,7 +213,6 @@ _ELLIPSIS4_ = Str_('....') # PYCHOK OK
214
213
  # _ELLIPSISPACED_ = Str_(' ... ') # PYCHOK <https://www.ThePunctuationGuide.com/ellipses.html>
215
214
  _ellipsoid_ = 'ellipsoid' # PYCHOK OK
216
215
  _ellipsoidal_ = 'ellipsoidal' # PYCHOK OK
217
- _enabled_ = 'enabled' # PYCHOK OK
218
216
  _encode_ = 'encode' # PYCHOK OK
219
217
  _end_ = 'end' # PYCHOK OK
220
218
  _epoch_ = 'epoch' # PYCHOK OK
@@ -254,8 +252,6 @@ _intersection_ = 'intersection' # PYCHOK OK
254
252
  _Intl1924_ = 'Intl1924' # PYCHOK OK
255
253
  _invalid_ = 'invalid' # PYCHOK OK
256
254
  _invokation_ = 'invokation' # PYCHOK OK
257
- _isclockwise_ = 'isclockwise' # PYCHOK OK
258
- _ispolar_ = 'ispolar' # PYCHOK OK
259
255
  _j_ = 'j' # PYCHOK OK
260
256
  _k0_ = 'k0' # PYCHOK OK
261
257
  _keyword_ = 'keyword' # PYCHOK OK
@@ -317,7 +313,6 @@ _NLHASH_ = Str_(_NL_ + '# ') # PYCHOK OK
317
313
  _NN_ = 'NN' # PYCHOK OK
318
314
  _no_ = _Prefix('no') # PYCHOK OK
319
315
  _northing_ = 'northing' # PYCHOK OK
320
- _NorthPole_ = 'NorthPole' # PYCHOK OK
321
316
  _not_ = _Prefix('not') # PYCHOK OK
322
317
  _NOTEQUAL_ = _BANG_ + _EQUAL_ # PYCHOK OK
323
318
  _not_finite_ = 'not finite' # PYCHOK _not_(_finite_), _infinite_
@@ -385,7 +380,6 @@ _SLASH_ = Str_('/') # PYCHOK OK
385
380
  _small_ = 'small' # PYCHOK OK
386
381
  _Sphere_ = 'Sphere' # PYCHOK OK
387
382
  _spherical_ = 'spherical' # PYCHOK OK
388
- _SouthPole_ = 'SouthPole' # PYCHOK OK
389
383
  _SPACE_ = Str_(' ') # PYCHOK OK
390
384
  _specified_ = 'specified' # PYCHOK OK
391
385
  _STAR_ = Str_('*') # PYCHOK OK
@@ -447,7 +441,7 @@ _LR_PAIRS = {_LANGLE_: _RANGLE_,
447
441
 
448
442
  __all__ = (_NN_, # NOT MISSING!
449
443
  Str_.__name__) # classes
450
- __version__ = '24.05.21'
444
+ __version__ = '24.06.14'
451
445
 
452
446
  if __name__ == '__main__':
453
447
 
pygeodesy/iters.py CHANGED
@@ -26,7 +26,7 @@ from pygeodesy.units import Int, Radius
26
26
  from pygeodesy.utily import degrees2m, _Wrap, _1_0
27
27
 
28
28
  __all__ = _ALL_LAZY.iters
29
- __version__ = '24.05.23'
29
+ __version__ = '24.06.09'
30
30
 
31
31
  _items_ = 'items'
32
32
  _iterNumpy2len = 1 # adjustable for testing purposes
@@ -83,7 +83,7 @@ class _BaseIter(_Named):
83
83
  try:
84
84
  self._loop = tuple(self.next for _ in range(loop))
85
85
  if self.loop != loop:
86
- raise RuntimeError # force Error
86
+ raise RuntimeError() # force Error
87
87
  except (RuntimeError, StopIteration):
88
88
  raise self._Error(self.name, self.loop, txt=_too_(_few_))
89
89
 
pygeodesy/karney.py CHANGED
@@ -160,7 +160,7 @@ from pygeodesy.utily import atan2d, sincos2d, tand, _unrollon, fabs
160
160
  # from math import fabs # from .utily
161
161
 
162
162
  __all__ = _ALL_LAZY.karney
163
- __version__ = '24.05.31'
163
+ __version__ = '24.06.27'
164
164
 
165
165
  _K_2_0 = _getenv('PYGEODESY_GEOGRAPHICLIB', _2_) == _2_
166
166
  _perimeter_ = 'perimeter'
@@ -213,7 +213,7 @@ class Caps(object): # PYCHOK
213
213
  EMPTY = 0 # formerly aka NONE
214
214
  _CAP_1 = 1 << 0 # for goedesicw only
215
215
  _CAP_1p = 1 << 1 # for goedesicw only
216
- # _CAP_2 = 1 << 2
216
+ _CAP_2 = 1 << 2
217
217
  _CAP_3 = 1 << 3 # for goedesicw only
218
218
  # _CAP_4 = 1 << 4
219
219
  # _CAP_ALL = 0x1F
@@ -233,7 +233,9 @@ class Caps(object): # PYCHOK
233
233
  _DIRECT3 = AZIMUTH | LATITUDE | LONGITUDE | _CAP_3 # for goedesicw only
234
234
  _INVERSE3 = AZIMUTH | DISTANCE | _CAP_1 # for goedesicw only
235
235
  _STD = STANDARD | _CAP_3 | _CAP_1 # for goedesicw only
236
- _STD_LINE = _STD | _CAP_1p # for goedesicw only
236
+ _STD_LINE = _STD | _CAP_2 | _CAP_1p # for goedesici and -w
237
+
238
+ LINE_CAPS = _STD_LINE | REDUCEDLENGTH | GEODESICSCALE # .geodesici only
237
239
 
238
240
  LINE_OFF = 1 << 15 # Line without updates from parent geodesic or rhumb
239
241
  LONG_UNROLL = 1 << 16 # unroll C{lon2} in .Direct and .Position
@@ -308,6 +310,10 @@ and C{ALL} - all of the above.
308
310
 
309
311
  C{STANDARD} = C{AZIMUTH | DISTANCE | DISTANCE_IN | LATITUDE | LONGITUDE}'''
310
312
 
313
+ _KEY2Caps = dict(m12=Caps.REDUCEDLENGTH, # see GDict._unCaps
314
+ M12=Caps.GEODESICSCALE,
315
+ M21=Caps.GEODESICSCALE, S12=Caps.AREA)
316
+
311
317
 
312
318
  class _CapsBase(_NamedBase): # in .auxilats, .geodesicx.gxbases
313
319
  '''(INTERNAL) Base class for C{[_]Geodesic*Exact}.
@@ -320,11 +326,13 @@ class _CapsBase(_NamedBase): # in .auxilats, .geodesicx.gxbases
320
326
  EMPTY = Caps.EMPTY # aka NONE
321
327
  GEODESICSCALE = Caps.GEODESICSCALE
322
328
  LATITUDE = Caps.LATITUDE
329
+ LINE_CAPS = Caps.LINE_CAPS
323
330
  LINE_OFF = Caps.LINE_OFF
324
331
  LONGITUDE = Caps.LONGITUDE
325
332
  LONG_UNROLL = Caps.LONG_UNROLL
326
333
  REDUCEDLENGTH = Caps.REDUCEDLENGTH
327
334
  STANDARD = Caps.STANDARD
335
+ _STD_LINE = Caps._STD_LINE # for geodesici
328
336
 
329
337
  _caps = 0 # None
330
338
  _debug = 0 # or Caps._DEBUG_...
@@ -453,6 +461,14 @@ class GDict(ADict): # XXX _NamedDict
453
461
  t = tuple(_g(self, n, dflt) for n in nTuple._Names_)
454
462
  return nTuple(t, iteration=self._iteration)
455
463
 
464
+ def _unCaps(self, outmask): # in .geodsolve
465
+ '''(INTERNAL) Remove superfluous items.
466
+ '''
467
+ for k, m in _KEY2Caps.items():
468
+ if k in self and not (outmask & m):
469
+ self.pop(k) # delattr(self, k)
470
+ return self
471
+
456
472
 
457
473
  class Inverse10Tuple(_GTuple):
458
474
  '''10-Tuple C{(a12, s12, salp1, calp1, salp2, calp2, m12, M12, M21, S12)} with arc length
@@ -882,7 +898,7 @@ def _unroll2(lon1, lon2, wrap=False): # see .ellipsoidalBaseDI._intersects2
882
898
  '''Unroll B{C{lon2 - lon1}} like C{geodesic.Geodesic.Inverse}.
883
899
 
884
900
  @return: 2-Tuple C{(B{lon2} - B{lon1}, B{lon2})} with B{C{lon2}}
885
- unrolled if B{C{wrap}} is C{True}, normalized otherwise.
901
+ unrolled if C{B{wrap} is True}, normalized otherwise.
886
902
  '''
887
903
  if wrap:
888
904
  d, t = _diff182(lon1, lon2)
pygeodesy/ktm.py CHANGED
@@ -67,7 +67,7 @@ from cmath import polar
67
67
  from math import atan2, asinh, cos, cosh, degrees, fabs, sin, sinh, sqrt, tanh
68
68
 
69
69
  __all__ = _ALL_LAZY.ktm
70
- __version__ = '24.05.24'
70
+ __version__ = '24.06.11'
71
71
 
72
72
 
73
73
  class KTMError(_ValueError):
@@ -119,18 +119,16 @@ class KTransverseMercator(_NamedBase):
119
119
  raiser=False, **TMorder_name):
120
120
  '''New L{KTransverseMercator}.
121
121
 
122
- @kwarg a_earth: This rhumb's earth (L{Ellipsoid}, L{Ellipsoid2},
123
- L{a_f2Tuple}, L{Datum}, 2-tuple (C{a, f})) or the
124
- equatorial radius (C{scalar}, C{meter}).
125
- @kwarg f: The ellipsoid's flattening (C{scalar}), iff B{C{a_earth}}
126
- is a C{scalar}, ignored otherwise.
122
+ @kwarg a_earth: This rhumb's earth (L{Ellipsoid}, L{Ellipsoid2}, L{a_f2Tuple},
123
+ L{Datum}, 2-tuple (C{a, f})) or the equatorial radius (C{meter}).
124
+ @kwarg f: The ellipsoid's flattening (C{scalar}), required if B{C{a_earth}} is
125
+ is C{meter}, ignored otherwise.
127
126
  @kwarg lon0: The central meridian (C{degrees180}).
128
127
  @kwarg k0: Central scale factor (C{scalar}).
129
- @kwarg raiser: If C{True}, throw a L{KTMError} for C{forward}
130
- singularities (C{bool}).
131
- @kwarg TMorder_name: Optional C{B{name}=NN} (C{str}) and optional
132
- keyword argument C{B{TMorder}=6} for the order of
133
- this L{KTransverseMercator}, see property C{TMorder}.
128
+ @kwarg raiser: If C{True}, throw a L{KTMError} for C{forward} singularities (C{bool}).
129
+ @kwarg TMorder_name: Optional C{B{name}=NN} (C{str}) and optional keyword argument
130
+ C{B{TMorder}=6} for the order of this L{KTransverseMercator}, see
131
+ property C{TMorder}.
134
132
 
135
133
  @raise KTMError: Invalid B{C{a_earth}}, B{C{f}} or B{C{TMorder}}.
136
134
  '''
@@ -229,14 +227,13 @@ class KTransverseMercator(_NamedBase):
229
227
  @arg lon0: Central meridian of the projection (C{degrees180}).
230
228
  @kwarg name: Optional C{B{name}=NN} (C{str}).
231
229
 
232
- @return: L{Forward4Tuple}C{(easting, northing, gamma, scale)}
233
- with C{easting} and C{northing} in C{meter}, unfalsed, the
230
+ @return: L{Forward4Tuple}C{(easting, northing, gamma, scale)} with
231
+ C{easting} and C{northing} in C{meter}, unfalsed, the
234
232
  meridian convergence C{gamma} at point in C{degrees180}
235
233
  and the C{scale} of projection at point C{scalar}. Any
236
234
  value may be C{NAN}, C{NINF} or C{INF} for singularities.
237
235
 
238
- @raise KTMError: For singularities, iff property C{raiser} is
239
- C{True}.
236
+ @raise KTMError: For singularities, iff property C{raiser} is C{True}.
240
237
  '''
241
238
  lat, _lat = _unsigned2(_fix90(lat - self._lat0))
242
239
  lon, _ = _diff182((self.lon0 if lon0 is None else lon0), lon)
@@ -343,7 +340,7 @@ class KTransverseMercator(_NamedBase):
343
340
  @arg lat0: Latitude of the central parallel (C{degrees90}).
344
341
  @arg lon0: Longitude of the central parallel (C{degrees180}).
345
342
 
346
- @return: 2-Tuple C{(lat0, lon0)} of the previous central
343
+ @return: 2-Tuple C{(lat0, lon0)} with the previous central
347
344
  parallel and meridian.
348
345
 
349
346
  @raise KTMError: Invalid B{C{lat0}} or B{C{lon0}}.