pygeodesy 24.10.24__py2.py3-none-any.whl → 24.11.11__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 (54) hide show
  1. {PyGeodesy-24.10.24.dist-info → PyGeodesy-24.11.11.dist-info}/METADATA +4 -4
  2. {PyGeodesy-24.10.24.dist-info → PyGeodesy-24.11.11.dist-info}/RECORD +54 -54
  3. {PyGeodesy-24.10.24.dist-info → PyGeodesy-24.11.11.dist-info}/WHEEL +1 -1
  4. pygeodesy/__init__.py +2 -2
  5. pygeodesy/azimuthal.py +51 -61
  6. pygeodesy/basics.py +34 -33
  7. pygeodesy/booleans.py +36 -36
  8. pygeodesy/cartesianBase.py +5 -5
  9. pygeodesy/constants.py +4 -4
  10. pygeodesy/css.py +7 -8
  11. pygeodesy/deprecated/__init__.py +1 -1
  12. pygeodesy/deprecated/classes.py +9 -9
  13. pygeodesy/deprecated/functions.py +6 -6
  14. pygeodesy/ecef.py +11 -14
  15. pygeodesy/ellipsoidalBase.py +105 -120
  16. pygeodesy/ellipsoidalBaseDI.py +114 -118
  17. pygeodesy/ellipsoidalExact.py +35 -37
  18. pygeodesy/ellipsoids.py +3 -3
  19. pygeodesy/errors.py +24 -24
  20. pygeodesy/etm.py +80 -72
  21. pygeodesy/fmath.py +39 -37
  22. pygeodesy/formy.py +3 -2
  23. pygeodesy/fsums.py +51 -40
  24. pygeodesy/geodesicw.py +15 -14
  25. pygeodesy/geodesicx/__init__.py +2 -2
  26. pygeodesy/geodsolve.py +7 -16
  27. pygeodesy/geoids.py +5 -5
  28. pygeodesy/heights.py +2 -2
  29. pygeodesy/internals.py +63 -79
  30. pygeodesy/karney.py +2 -2
  31. pygeodesy/ktm.py +11 -13
  32. pygeodesy/latlonBase.py +6 -6
  33. pygeodesy/lazily.py +5 -5
  34. pygeodesy/lcc.py +4 -4
  35. pygeodesy/ltp.py +10 -10
  36. pygeodesy/ltpTuples.py +74 -75
  37. pygeodesy/mgrs.py +9 -10
  38. pygeodesy/named.py +4 -0
  39. pygeodesy/osgr.py +9 -12
  40. pygeodesy/props.py +2 -2
  41. pygeodesy/resections.py +9 -10
  42. pygeodesy/rhumb/__init__.py +1 -1
  43. pygeodesy/rhumb/solve.py +3 -3
  44. pygeodesy/simplify.py +5 -5
  45. pygeodesy/sphericalNvector.py +80 -123
  46. pygeodesy/sphericalTrigonometry.py +60 -66
  47. pygeodesy/units.py +2 -2
  48. pygeodesy/utm.py +6 -6
  49. pygeodesy/vector2d.py +13 -13
  50. pygeodesy/vector3d.py +19 -21
  51. pygeodesy/vector3dBase.py +18 -15
  52. pygeodesy/webmercator.py +4 -4
  53. pygeodesy/wgrs.py +4 -4
  54. {PyGeodesy-24.10.24.dist-info → PyGeodesy-24.11.11.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: PyGeodesy
3
- Version: 24.10.24
3
+ Version: 24.11.11
4
4
  Summary: Pure Python geodesy tools
5
5
  Home-page: https://GitHub.com/mrJean1/PyGeodesy
6
6
  Author: Jean M. Brouwers
@@ -44,7 +44,7 @@ and nearest points, intersections of geodesic, great circle and rhumb lines, cir
44
44
  secants, `3-point resections`_, triangulation, trilateration (by intersection, by overlap and in
45
45
  3d), conversions and unrolling, among other things. For more information and further details see the
46
46
  documentation_, the descriptions of `Latitude/Longitude`_, Vincenty_ and `Vector-based`_ geodesy, the
47
- original `JavaScript source`_ or docs_ and *Karney*\'s Python geographiclib_ and `C++ GeographicLib`_.
47
+ original `JavaScript source`_ or docs_ and *Karney*\'s Python geographiclib_ and C++ `GeographicLib.`_
48
48
 
49
49
  Also included are modules for conversions to and from `Cassini-Soldner`_, ECEF_ (Earth-Centered,
50
50
  Earth-Fixed cartesian), UTM_ (Universal Transverse Mercator and Exact_), UPS_ (Universal Polar
@@ -160,7 +160,7 @@ and McCabe_ using Python 2.7.18 and with Flake8_ using Python 3.11.5, both in 64
160
160
 
161
161
  For a summary of all *Karney*-based functionality in ``pygeodesy``, see module karney_.
162
162
 
163
- *Last updated: Oct 24, 2024.*
163
+ *Last updated: Nov 11, 2024.*
164
164
 
165
165
  License
166
166
  =======
@@ -200,7 +200,6 @@ DEALINGS IN THE SOFTWARE.
200
200
 
201
201
  .. _Albers equal-area: https://GeographicLib.SourceForge.io/C++/doc/classGeographicLib_1_1AlbersEqualArea.html
202
202
  .. _C++ classes: https://GeographicLib.SourceForge.io/C++/doc/annotated.html
203
- .. _C++ GeographicLib: https://GeographicLib.SourceForge.io/C++/doc/index.html
204
203
  .. _Cartesian: https://mrJean1.GitHub.io/PyGeodesy/docs/pygeodesy-Cartesian-attributes-table.html
205
204
  .. _Cassini-Soldner: https://GeographicLib.SourceForge.io/C++/doc/classGeographicLib_1_1CassiniSoldner.html
206
205
  .. _checked: https://GitHub.com/ActiveState/code/tree/master/recipes/Python/546532_PyChecker_postprocessor
@@ -222,6 +221,7 @@ DEALINGS IN THE SOFTWARE.
222
221
  .. _GeoConvert: https://GeographicLib.SourceForge.io/C++/doc/utilities.html
223
222
  .. _GeodSolve: https://GeographicLib.SourceForge.io/C++/doc/utilities.html
224
223
  .. _geographiclib: https://PyPI.org/project/geographiclib
224
+ .. _GeographicLib.: https://GeographicLib.SourceForge.io/C++/doc/index.html
225
225
  .. _Geohashes: https://www.Movable-Type.co.UK/scripts/geohash.html
226
226
  .. _Geoid: https://mrJean1.GitHub.io/PyGeodesy/docs/pygeodesy.geoids-module.html
227
227
  .. _Georefs (WGRS): https://WikiPedia.org/wiki/World_Geographic_Reference_System
@@ -1,81 +1,81 @@
1
1
  pygeodesy/LICENSE,sha256=YfgAiyxOwY6P9Kkb1_5XN81nueTLrpb3Ffkv3EuPgFU,1144
2
- pygeodesy/__init__.py,sha256=r0yjEW8YI02U-NFs0qZF3tqSGbEqYLors4l-upxXJEg,42631
2
+ pygeodesy/__init__.py,sha256=qZJcMz6VeaGXNy3i3cKvEG1gGfPcrUSxk8kHkFW3o9g,42631
3
3
  pygeodesy/__main__.py,sha256=1lE1jMp57iXpvu3TEh2unyT2qvtSa5nJPQn_K7Wmj3E,5442
4
4
  pygeodesy/albers.py,sha256=BTeUqKPgygExYBLhRJh8b8FYdwuCIpCuo8ggCw6-Auw,30955
5
- pygeodesy/azimuthal.py,sha256=erI5DTM0-Nr5YC2LnBTVNbUKlrnnXJUwKe0SCQ7-Soc,50223
6
- pygeodesy/basics.py,sha256=I1za68bt64DDU7uDobR6EO8DZoNHtfTZHnKdGdH9O8w,30020
7
- pygeodesy/booleans.py,sha256=0sNGKydX2ALi-VaIdaGhoPoRxmfBvA-Ny66lAH_LVis,73463
8
- pygeodesy/cartesianBase.py,sha256=82h4wO5OxRRuvwMhGpjdZzeJjYVDWObP_3bhPB1T7TY,46935
5
+ pygeodesy/azimuthal.py,sha256=WqyA4IWGYBL3wj4oYKCNgm7IcqCtuUhE9TY5hVm7uhU,49763
6
+ pygeodesy/basics.py,sha256=a74YOBmZLWj-CEFadl-ERD9J4qVECRYSL8HBR1gsxTk,30158
7
+ pygeodesy/booleans.py,sha256=IRD4gbzZVcpMg7jh24jtotDORA2jI5-adQkzVaLMnUY,73544
8
+ pygeodesy/cartesianBase.py,sha256=7YiW3i6_HNIgEwqw4NHoFJG5FQsv6dc8opE5w2M7JsY,46939
9
9
  pygeodesy/clipy.py,sha256=hzI6IutTRkbssjPPgAjXv9OcgCIIZchjnMWaHin4YAU,27728
10
- pygeodesy/constants.py,sha256=X2qvwiHSbCKv-PalJ6u22EJpwCcvSksvFrJdLaxgnZk,19842
11
- pygeodesy/css.py,sha256=rPr5EcGm_blVt72h-851ytpVxdPhx1MEqqGs3Ppx3eI,25651
10
+ pygeodesy/constants.py,sha256=450oXrMtOT_5A8DvQ_Sh_eu1Kg7CkYmaZpC45usCZDI,19825
11
+ pygeodesy/css.py,sha256=7y85FiUMarlZiiZ9Xn-UyRsnAaV3Met2bumARBGyr94,25642
12
12
  pygeodesy/datums.py,sha256=trFx6KgEjlYY_VC6WViZhH1D-U3tDDDdbZXG6MD2H_U,34057
13
13
  pygeodesy/dms.py,sha256=FiI-h3nXngSp624i0KlzHkBqYp5X5ucmvN6fLGi_Xgk,42174
14
- pygeodesy/ecef.py,sha256=_yy_TIUGsXmEZ7aRcmchbJwTp7x__edx6EPiS3Xznes,59587
14
+ pygeodesy/ecef.py,sha256=MdGNJHebXV4WxGYjUZlHZmZ1dKDv5LUG0xpyYFckuCo,59546
15
15
  pygeodesy/elevations.py,sha256=4FuVcVNb_D09gmcvUlck344N4f7Jms76SIRrdutvKjk,10801
16
- pygeodesy/ellipsoidalBase.py,sha256=D5OlvepTLoguqDdMmR50OqiMX44e1kaMM-z7k1NtFvI,55385
17
- pygeodesy/ellipsoidalBaseDI.py,sha256=-y6JhV_8ZA0uNaIV05MkhCASVmUaXJthM4azJrM5Lbk,38445
18
- pygeodesy/ellipsoidalExact.py,sha256=wmIGgZyd0cvjswP4KOeDuEcuagjwQQRRq1cmseRoD-Q,16946
16
+ pygeodesy/ellipsoidalBase.py,sha256=GhJG4h8I7ySs6EfXdmVbXOZcvMDI7YYCc7yPj5vMHqo,55109
17
+ pygeodesy/ellipsoidalBaseDI.py,sha256=ZaIPVK187mD9CpORz9t9Vtz03TiVBZ_CRmVs-qMsKBY,38243
18
+ pygeodesy/ellipsoidalExact.py,sha256=vQuyv9jpHLnsWDAwC-GfysFrKC1NAz5hJamIZ7G3NSs,16972
19
19
  pygeodesy/ellipsoidalGeodSolve.py,sha256=fAT4b3HXkM6i1W_C0rb4vbSxZqr4c6rS7PIvGF2ad7s,16666
20
20
  pygeodesy/ellipsoidalKarney.py,sha256=qvJa8kZ4SgaRR2UbjtkcRxw_CRbwhXoUT4Dn_6DJ6Ag,18721
21
21
  pygeodesy/ellipsoidalNvector.py,sha256=Ye6O6SIRiiwY6PJG4KD9kZ6GBpKkWWxZWsZC4k3eH-s,30039
22
22
  pygeodesy/ellipsoidalVincenty.py,sha256=Eeh-lFB9y65kyYCZ5bc7uRIF9o6UT4lqdkk4EVRi0Pg,25946
23
- pygeodesy/ellipsoids.py,sha256=PQ4fZtEHN-24ROvEbKzARWquisy__WKvKkaT4SOXVB0,106894
23
+ pygeodesy/ellipsoids.py,sha256=wlYlii-sU2UQBdzFeHpDOamKRtqJavXQXjCr1gRDiFs,106918
24
24
  pygeodesy/elliptic.py,sha256=g_IuxDoVf0npEicUCT3x39GJqo1cfpkalC7aV1Z1hFY,45004
25
25
  pygeodesy/epsg.py,sha256=Vq_M1g7Z0x5Noqsmt6OCQkPdYJj4jpWObtixL5pAjDA,8220
26
- pygeodesy/errors.py,sha256=KtLGXxBeNMagCio5qeNX86NmR4g1GHmoYsSQ093RgfA,32040
27
- pygeodesy/etm.py,sha256=QMQstkJGAvGS5zrLz_TJ75IRzDOljNXuuwGs8peJkMg,46188
28
- pygeodesy/fmath.py,sha256=3y_qlxzq4vlOwqJ0vhDaGscAi3XbOyPbU6IISovvOzE,36494
29
- pygeodesy/formy.py,sha256=8xrs_fSGng-TVKSgDzjR41SBwtbEO4_kS3Lq4kLtX-4,75082
26
+ pygeodesy/errors.py,sha256=AL-o8q1PqkTcCJTmY6g6iG9BoCpxUONhIFohgekryYw,32098
27
+ pygeodesy/etm.py,sha256=yUXxfdLKlr84a2gtv_ZGGxp1sLOqNvNr7XaOHNwqMb0,46722
28
+ pygeodesy/fmath.py,sha256=9F3381NhthGX92YoFKflAWOZlRwxFv4xJUPJnFy0Hdw,36848
29
+ pygeodesy/formy.py,sha256=s9s-aY3viaMMBnb4jhHE0ZowDUfIcuM-_r9gvilo5B4,75116
30
30
  pygeodesy/frechet.py,sha256=F6TYbOEYSOFcll6nvp4GhqafUWXh1umAKb1QaMYQtuM,34372
31
31
  pygeodesy/fstats.py,sha256=8Vn1cwlgCQD444WX8FfAEC-AXQcJDeI9_i14Mizp59U,28288
32
- pygeodesy/fsums.py,sha256=QEPeyM7wkgqeeWEynUNhJhiqynapRTCh8WzpU1fCREw,103404
32
+ pygeodesy/fsums.py,sha256=ictqTC7QHDoXcvJxGN66Z_OHnnxSIwXQjlVAOffb8zM,103970
33
33
  pygeodesy/gars.py,sha256=KRlyZUv1euEl7ZkDYSZG913GAfFMRG2m2hp37ObYY_Y,11829
34
34
  pygeodesy/geodesici.py,sha256=4Elhe9Z8tcVFD46K0HKd_TSS24CQmgQGGlDk6DnBnmo,74775
35
- pygeodesy/geodesicw.py,sha256=y6XVpgSG_s-sqF0Dh2HZwJWjBfKiUTCJoCP9Hc8LIww,28710
36
- pygeodesy/geodsolve.py,sha256=iimnxLJBwygqy7Lxxl-ZjkJ7HVPD6sUrPW8hUZBxaKo,29356
35
+ pygeodesy/geodesicw.py,sha256=U4mLBOe3x2wGqMynBbO23drd1d9iUXOlBWuNMKdohQ0,28774
36
+ pygeodesy/geodsolve.py,sha256=qYDzQqpfrNcwts1z_yk1HjZ8IlmUXLpda46LHfu4fgs,28989
37
37
  pygeodesy/geohash.py,sha256=gDmDI91GOJAdNiAcf9bHq8I581UfPnMmwjWyJlPHRlM,40201
38
- pygeodesy/geoids.py,sha256=uOvDFPYigoEOPnl7yrzbEN1_pEjo4YP-Nan4zsHI_Vs,82479
38
+ pygeodesy/geoids.py,sha256=ZfKz2M8gSIGpzooq6or-GqiGQWsMFOLG7VQeiLwX6rA,82491
39
39
  pygeodesy/hausdorff.py,sha256=-aKtRbMefDSoIk4V3wCvNrXPZ7Bqk1P6-XuGuI7o8Zc,34770
40
- pygeodesy/heights.py,sha256=Gv3b1xC7I0tBvTO-DdmWVW8A3ZV3RKxY3jveUUZso38,42909
41
- pygeodesy/internals.py,sha256=QPLqHnyTMQirTyjyRqlenCxP3vOq-PPxKnxFlKie0WM,24594
40
+ pygeodesy/heights.py,sha256=TaEDSLRD5Nsvo0SuU6u-ohATGOwMFxVd5j7DTA9izZc,42909
41
+ pygeodesy/internals.py,sha256=C3Iai8ViVYIC0UnY52fdYTZnfClELtQS4ccPij4Omyo,24299
42
42
  pygeodesy/interns.py,sha256=t8hQ3Y1QHzVkoQxq8Z9f0YjkpRC0oB0G7hpV894aYjw,23403
43
43
  pygeodesy/iters.py,sha256=xPH0ytomvJeKHu717Fjzi3QbRrEikO6n7vqkY_IDz1k,20311
44
- pygeodesy/karney.py,sha256=UUZqUWlRn7S2YdF2A9bxuBNa-Qkpib9QkpRyGZXQOt8,40466
45
- pygeodesy/ktm.py,sha256=eUWYKhoPou1AiWiNz-xI8eDr-q-RvKDY6newAmYP26Q,27239
46
- pygeodesy/latlonBase.py,sha256=9R9O9SeIRXTmHfpR9WOL8-1m0yyG8Ymfth2eGq0mDEo,79070
47
- pygeodesy/lazily.py,sha256=MSQhTpG8jPYBGsi75yNx9yXEvefQFwzDFnYpW_-Kkc0,46648
48
- pygeodesy/lcc.py,sha256=oDooTzFHnqsMtSKmmmfEbypHpdlPltfo7Mt0pAO4-_A,25669
49
- pygeodesy/ltp.py,sha256=ZMdfJHLKeDHSoymmjWfoAZTtrdoADf0O6WccRf53L2w,50745
50
- pygeodesy/ltpTuples.py,sha256=oNTxtjxmHveMDQvPdQCHl-JzSJJGb1jFRrF8SEG_Ojw,58480
51
- pygeodesy/mgrs.py,sha256=3grmlAIeJFMDTLwCqlt86n4_kmIGocQ-3I6bIXd9nPo,29833
52
- pygeodesy/named.py,sha256=D71yA_a3mwELI-rUYSKKKiXGuJQNuUnVXPTDhW5zZyc,52386
44
+ pygeodesy/karney.py,sha256=GvyR_tHLRWQ5tsFjnp0R8OTZaBXkPnL8eprSMDJx1mM,40466
45
+ pygeodesy/ktm.py,sha256=pMKiQgtXqnjTNPrVt21N_3x0dFPLuHW0IlOYg3dNjaY,27208
46
+ pygeodesy/latlonBase.py,sha256=2aI0ryg-tRgBuemkJYQkfLkNVi3t2cX2NM7w7wdIebw,79074
47
+ pygeodesy/lazily.py,sha256=JMLMYtzJBxCHyAAJ1pNBiDUVuFimhJChKWXv2nDzA0M,46655
48
+ pygeodesy/lcc.py,sha256=Oa-u7bf_N9aF3D8Yr75In3kXQ2M4SRgGkyyt8aixo8c,25671
49
+ pygeodesy/ltp.py,sha256=tEBBq0U_wfB_8NQG5eEW13nQ2Z8rL6zq1McGcv2YBuI,50751
50
+ pygeodesy/ltpTuples.py,sha256=1AHablDH-A9KRVHMcNPcyu4y6P9kOi10BcqvIKFQrKk,58545
51
+ pygeodesy/mgrs.py,sha256=kVoKDYtm4FhX8BoEKSYbiJ-G_DrT4trb08xjlvpEl1o,29819
52
+ pygeodesy/named.py,sha256=VGY4txpgn7rALFq98zhfCQ0pOC_aPUFVa56TItzFCeM,52510
53
53
  pygeodesy/namedTuples.py,sha256=e0rV1Zb2tbx8fztXcSkUFsRTmZtye8B5i_Hi4vBUndU,28758
54
54
  pygeodesy/nvectorBase.py,sha256=Xy1TDcH5UuUelVZ7aSKX85hx3fLlpDkYDhuoZijQ1vI,28644
55
- pygeodesy/osgr.py,sha256=3Qon_oWuVrIb1vYnd3ae3L5MDkjp_tngyVdiYHuL4to,30821
55
+ pygeodesy/osgr.py,sha256=-Ur966glrRhjxtV9DNo920j45PtsUPEQsiy8m1CMhOk,30777
56
56
  pygeodesy/points.py,sha256=Vs9vShhBxebgo7UdHlt7Ov4D4Chfa723BZxV0_kpgGk,64389
57
- pygeodesy/props.py,sha256=IFykUIfSybnymwxQbMjCJax7uAZl6SVJ-uMjatQPsLc,24564
58
- pygeodesy/resections.py,sha256=IrPHAHbF9JdBgAVd9LMgXoPgPFRkY8j1G7p0P8y8pdc,43543
59
- pygeodesy/simplify.py,sha256=vkOtO478sOjZHZBuSFvCaRh72qSDQuzXLQpMK1LKyYI,25232
57
+ pygeodesy/props.py,sha256=Qhs5TpcqoHPA64l-P1GQgG8zlboDsAqzVchDsKv2dn8,24565
58
+ pygeodesy/resections.py,sha256=pl3THJgLKnWEfQaQD1lklt6GfFjaX24ceNZb8PpK7zY,43584
59
+ pygeodesy/simplify.py,sha256=b7oSR2B3yYpwElBeJiyYyK_yFbxwz2Bzx51pymIluwE,25251
60
60
  pygeodesy/solveBase.py,sha256=DpgFNHmWs1GUwCViAU-9iBsmKLVFNc8kW1zrDNi31FY,18485
61
61
  pygeodesy/sphericalBase.py,sha256=lsjzDWm3VUxKTpKASqZJDYw7M_CJ4eCgzp3LiCJvMt8,32110
62
- pygeodesy/sphericalNvector.py,sha256=lUXLX0fSZ0TcResvJ59N25GKR-qQBZEuXlhK-T6ijY4,56984
63
- pygeodesy/sphericalTrigonometry.py,sha256=uOSNMlsdp5jEK36bL6750IlMuLdy-cKqOsd4tMhFr1M,64135
62
+ pygeodesy/sphericalNvector.py,sha256=Q3DUujU_xmNcPs0_vfAF8pQAtqOsBQLhq_Rz5WB-TdM,54778
63
+ pygeodesy/sphericalTrigonometry.py,sha256=lfhV2radLDKIK5NjkdtJSRb4alRAT-m0LS0Sb0EtOzk,63959
64
64
  pygeodesy/streprs.py,sha256=ItNnTqkE_TMZtqgsRhDonrRDpi5gXtD44sQ_D3Qfsd0,23418
65
65
  pygeodesy/trf.py,sha256=hxh6WA7IibL09dHoGMBKQeSXrRFPsYQV0F-LPAD40v4,119073
66
66
  pygeodesy/triaxials.py,sha256=priBlyuraA1VhNbN0gv_UAXuulAwV14XjOBvu_oJA4U,63559
67
- pygeodesy/units.py,sha256=XUbABlp93Pt9VL_Z_chhYRd-dMvwAMWNNWe54V6gmmM,35314
67
+ pygeodesy/units.py,sha256=Mr7kLZPSFSMp-xiKy6fqAXuop2LWSZIwWUElGMaWFJY,35316
68
68
  pygeodesy/unitsBase.py,sha256=ZZ-VDntCOTjSerQJf9aaLE_J0lozrpmUhynRBaCtg24,14060
69
69
  pygeodesy/ups.py,sha256=qRyk3tnQNRD7KgWGPANWOrg6Hxqd9eS7vN8or_tKk4E,23338
70
70
  pygeodesy/utily.py,sha256=qLxVVE57PHEu1stJaULIYHZ6G-uNe7Fy_uoQfmNbXUg,36189
71
- pygeodesy/utm.py,sha256=Ubd6-kZtBEoOzCj-pbHb3gRzuGrWBX6nY9_h1YweV2Q,31091
71
+ pygeodesy/utm.py,sha256=mJLJq5sEnYYtOpBs2KYiDB6bjKxfFRS1_36-Yn7HLEM,31108
72
72
  pygeodesy/utmups.py,sha256=g2Z_aEOt6fhV9f4fASlW4_K_O_P4zBsBbWfQV11mIKo,13196
73
73
  pygeodesy/utmupsBase.py,sha256=S4s1Sehj9jSMy-XRxwtwVstG3QhyVt924V0FHu0cPIk,18730
74
- pygeodesy/vector2d.py,sha256=O9a3uRIREL2k7G-pnpuacjBcAlKg75MnokjtfJB-nBs,39659
75
- pygeodesy/vector3d.py,sha256=PaiuJgHCf0bO8nhOai42ut2zk0_DskSNCrOtCuHxw6U,42673
76
- pygeodesy/vector3dBase.py,sha256=IJdJ-fLApA88HbPZb41vAJzbLlGywpfKn5yT7ia26A0,36108
77
- pygeodesy/webmercator.py,sha256=fFQtTxIsjOE35_nX_mAgFv1Eov7AdcsCBjT2ONm3qmI,14934
78
- pygeodesy/wgrs.py,sha256=6dO31uMKF-t-uQz58hdutilE2A5msOs5Bybq5Uq3qgk,15453
74
+ pygeodesy/vector2d.py,sha256=L-2g3EDZGZD6lYlTrDjInsIELul3UGVjR9eMRagVm6o,39649
75
+ pygeodesy/vector3d.py,sha256=8CA80VxV7XJvBrT3kVO13qMT3qsEoEIHvLYzFz7wIxE,42532
76
+ pygeodesy/vector3dBase.py,sha256=gLOFfUrSFFlmX3R-LmMfAvWwntAcgaF3YqBBtNbfbMw,36289
77
+ pygeodesy/webmercator.py,sha256=iMtKf_vNiM4wiH7rewVzpjMjI7C_qm_ZmSjQBTZ_y0s,14936
78
+ pygeodesy/wgrs.py,sha256=VWBkk_rf-DjpG9o_tqVMCR7FJyEh7holdTsJo1v9ads,15455
79
79
  pygeodesy/auxilats/_CX_4.py,sha256=WsxGrwqEhdWBx-K5ocwwDuatIkDTZB-FwrqQITbcNU0,6829
80
80
  pygeodesy/auxilats/_CX_6.py,sha256=PsaVhzOdCDyRuZ-SH6ZwbWrf_rAkidtwLuAQTlvv5XQ,11277
81
81
  pygeodesy/auxilats/_CX_8.py,sha256=mxk12xvzOMNimyHM74fn9sFB0aUSBLojYqtenYhAekQ,18899
@@ -87,12 +87,12 @@ pygeodesy/auxilats/auxDLat.py,sha256=3sq7Wc-ykpVbldNh10IZ3tIlJ7DcQFDlmZ4nOhJEgo0
87
87
  pygeodesy/auxilats/auxDST.py,sha256=BSHR0M3hQBR1KjF_BUJHrNzGXr2PblYXUQsMD5L1Kcc,10468
88
88
  pygeodesy/auxilats/auxLat.py,sha256=7uxe7mtkY-9uSI3z2wmUNBqzCKyFujIpJU1v-8yDgds,31934
89
89
  pygeodesy/auxilats/auxily.py,sha256=X1y4_qC40Th7CgmZILqoQCLAUQoyORcR5W-bN4X0W4I,7882
90
- pygeodesy/deprecated/__init__.py,sha256=jSwmipBzyIOYIQhiZxZwsIQlqMXPfNaPfVpppBu7zkw,2815
90
+ pygeodesy/deprecated/__init__.py,sha256=r_oHilCAEi6DmNefqMxLswOD8r7KK0qVaQbw_jq-A-E,2815
91
91
  pygeodesy/deprecated/bases.py,sha256=nxUtxscAg5cb7HEzTSmPJFafLc9Ad2SL5ovwkYaU5z8,1655
92
- pygeodesy/deprecated/classes.py,sha256=gktUr5qYXCm8ztH6lfzFgaHKqMiw1tHc1Vw6i6DEvNA,12377
92
+ pygeodesy/deprecated/classes.py,sha256=mt0qomTmDwhI1o06cqgHs-_KPe9uwVX5q4QeRkwTyp0,12469
93
93
  pygeodesy/deprecated/consterns.py,sha256=W-rQiw443_zCFEUzjCGykGND-i5P_ghEIyJUSGg7-Nc,1908
94
94
  pygeodesy/deprecated/datum.py,sha256=s8Hke053RucP5ACvg3gdX8weQfGM0x59pQyHpY11eOs,1875
95
- pygeodesy/deprecated/functions.py,sha256=-spa_5k7yRWGd7s4UBObzf9QpAM0o-tgP4S0wX876JY,14122
95
+ pygeodesy/deprecated/functions.py,sha256=rf743PWGPP69Ay2TydjnF8YCBXm3p5y1jZvLCPu1wtc,14217
96
96
  pygeodesy/deprecated/nvector.py,sha256=_dZf84RdmPr7e7i8Yi683R-8Mqn0ipTqIsDhNl29hGo,2117
97
97
  pygeodesy/deprecated/rhumbBase.py,sha256=d7YKW--dnRpobB2CSvhFsntWF0B5-HYJqID2pv5lD5k,1375
98
98
  pygeodesy/deprecated/rhumbaux.py,sha256=n29xazYMbVG4MJkLjAGu8B88bbcFF5xnvuj9xSxjfIk,1428
@@ -101,18 +101,18 @@ pygeodesy/deprecated/rhumbx.py,sha256=OS0p_meaoVrpZe5UhK6qZljjlrGpL0pCHWw8gofw7k
101
101
  pygeodesy/geodesicx/_C4_24.py,sha256=r5-So2i4z-OFY6NFYERUvhtxYHaYphPRgUUC3PWC5K4,90707
102
102
  pygeodesy/geodesicx/_C4_27.py,sha256=Pkpns4kBAHxBcvi0f9l_3GQeE6qcrl123DccEQ593To,134215
103
103
  pygeodesy/geodesicx/_C4_30.py,sha256=cseNhROi7DHi77kgdrXXDXO6yiiq00DNcX0HOVf2Rpg,201921
104
- pygeodesy/geodesicx/__init__.py,sha256=Z-Pq7wWevRZeMdG2qqL7OE1b8hRUubyZE2w1GqF1OzI,2478
104
+ pygeodesy/geodesicx/__init__.py,sha256=1ALfFc-DVxhdicPFtqrfLd2up5-VnBSWX0ZB7aHk-S0,2478
105
105
  pygeodesy/geodesicx/__main__.py,sha256=wsJPK6lW_PsgVCR1ZJksgGhwxwrsMGSXhYkhpjbknTc,4188
106
106
  pygeodesy/geodesicx/gx.py,sha256=yeNpMQbw_uWfs4KOQX8RMAQt6WNsG3zsGgmZRVgbQIk,60612
107
107
  pygeodesy/geodesicx/gxarea.py,sha256=cJaXwMMxjQ21RiCGU7c2YLXNmrqkRawHxQxsg7o5gas,19454
108
108
  pygeodesy/geodesicx/gxbases.py,sha256=AyvsjiSENqikJK6qpm55rDkUlBSmTDk_-FoqzzMFX1M,6130
109
109
  pygeodesy/geodesicx/gxline.py,sha256=zNQF8lz9caHZlsUcL8NfjG02KIza39Q6Qd6XizDp_UI,27537
110
- pygeodesy/rhumb/__init__.py,sha256=G8qo1yrLhKfd0yWiVUdJbIPj3udcmsgqKZqFD0PYfeA,2207
110
+ pygeodesy/rhumb/__init__.py,sha256=mejjuzcbm4zJJIWEcKCXObDIZoF1e_dtIaChg0mYbr4,2207
111
111
  pygeodesy/rhumb/aux_.py,sha256=XN0zlNwhU525NdcHko-G_Igvc7-mzXbT7ypcVIt5ADw,16048
112
112
  pygeodesy/rhumb/bases.py,sha256=e_ASUIK9ABtORVZaTMiFMGRc3w2wKGNDPdJEfVCp5CU,54162
113
113
  pygeodesy/rhumb/ekx.py,sha256=JsmdCatWKqsffF8jCh4HDu5IKt_kHq1qUdmP1LMuofY,24044
114
- pygeodesy/rhumb/solve.py,sha256=Ko1uHcicoqw7x467IzncjMtppjRs1JC1yqVh_DtTV6k,23905
115
- PyGeodesy-24.10.24.dist-info/METADATA,sha256=tKtj7Pcqe2Kbx6YfgDvEdUNdDHw0-L4X0xpMStYFGlg,19919
116
- PyGeodesy-24.10.24.dist-info/WHEEL,sha256=fS9sRbCBHs7VFcwJLnLXN1MZRR0_TVTxvXKzOnaSFs8,110
117
- PyGeodesy-24.10.24.dist-info/top_level.txt,sha256=cEQPatCXzKZqrivpULC5V5fuy9_V_bAwaP_gUGid7pQ,10
118
- PyGeodesy-24.10.24.dist-info/RECORD,,
114
+ pygeodesy/rhumb/solve.py,sha256=uP7TJyR529HNZsgmXeV6yAHhDJVBoUC-fEVBUx4-Sd0,23943
115
+ PyGeodesy-24.11.11.dist-info/METADATA,sha256=mv6od5GdIMWcu0qcRzP4L3B3jhe9pWXj56V8xRRefRk,19916
116
+ PyGeodesy-24.11.11.dist-info/WHEEL,sha256=QyeGbh-t8WT0nt0_LNSP02jN-g4ymd1egk1U3osCGMU,110
117
+ PyGeodesy-24.11.11.dist-info/top_level.txt,sha256=cEQPatCXzKZqrivpULC5V5fuy9_V_bAwaP_gUGid7pQ,10
118
+ PyGeodesy-24.11.11.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.44.0)
2
+ Generator: bdist_wheel (0.45.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py2-none-any
5
5
  Tag: py3-none-any
pygeodesy/__init__.py CHANGED
@@ -23,7 +23,7 @@ the U{documentation<https://mrJean1.GitHub.io/PyGeodesy>}, the descriptions of U
23
23
  <https://www.Movable-Type.co.UK/scripts/latlong-vincenty.html>} and U{Vector-based
24
24
  <https://www.Movable-Type.co.UK/scripts/latlong-vectors.html>} geodesy, the original U{JavaScript source
25
25
  <https://GitHub.com/ChrisVeness/geodesy>} or U{docs<https://www.Movable-Type.co.UK/scripts/geodesy/docs>}
26
- and I{Karney}'s Python U{geographiclib<https://PyPI.org/project/geographiclib>} and U{C++ GeographicLib
26
+ and I{Karney}'s Python U{geographiclib<https://PyPI.org/project/geographiclib>} and C++ U{GeographicLib
27
27
  <https://GeographicLib.SourceForge.io/C++/doc/index.html>}.
28
28
 
29
29
  Also included are modules for conversions to and from U{Cassini-Soldner
@@ -598,7 +598,7 @@ else:
598
598
 
599
599
  from pygeodesy.internals import _version2, _DOT_ # PYCHOK import
600
600
  # from pygeodesy.interns import _DOT_ # from .internals
601
- __version__ = '24.10.24'
601
+ __version__ = '24.11.11'
602
602
  # see setup.py for similar logic
603
603
  version = _DOT_(*_version2(__version__, n=3))
604
604
 
pygeodesy/azimuthal.py CHANGED
@@ -49,7 +49,7 @@ from pygeodesy.ellipsoidalBase import LatLonEllipsoidalBase as _LLEB, \
49
49
  _xinstanceof
50
50
  from pygeodesy.datums import _spherical_datum, _WGS84
51
51
  from pygeodesy.errors import _ValueError, _xdatum, _xkwds
52
- from pygeodesy.fmath import euclid, hypot as _hypot, Fsum
52
+ from pygeodesy.fmath import euclid, fdot_, hypot as _hypot, Fsum
53
53
  # from pygeodesy.fsums import Fsum # from .fmath
54
54
  # from pygeodesy.formy import antipode # _MODS
55
55
  from pygeodesy.interns import _azimuth_, _datum_, _lat_, _lon_, _scale_, \
@@ -70,7 +70,7 @@ from pygeodesy.utily import asin1, atan1, atan2b, atan2d, sincos2, \
70
70
  from math import acos, atan2, degrees, fabs, sin, sqrt
71
71
 
72
72
  __all__ = _ALL_LAZY.azimuthal
73
- __version__ = '24.07.25'
73
+ __version__ = '24.11.07'
74
74
 
75
75
  _EPS_K = _EPStol * _0_1 # Karney's eps_ or _EPSmin * _0_1?
76
76
  _over_horizon_ = 'over horizon'
@@ -154,10 +154,10 @@ class _AzimuthalBase(_NamedBase):
154
154
  s0, c0 = self._sc0
155
155
 
156
156
  cb *= ca
157
- k, t = _k_t_2(s0 * sa + c0 * cb)
157
+ k, t = _k_t_2(fdot_(s0, sa, c0, cb))
158
158
  if t:
159
159
  r = k * self.radius
160
- y = r * (c0 * sa - s0 * cb)
160
+ y = r * fdot_(c0, sa, -s0, cb)
161
161
  e, n, z, _ = _enzh4(r * sb * ca, y, None)
162
162
  else: # 0 or 180
163
163
  e = n = z = _0_0
@@ -233,11 +233,11 @@ class _AzimuthalBase(_NamedBase):
233
233
  Lon_(lon0=lon0, Error=AzimuthalError))
234
234
  self._sc0 = sincos2d(self.lat0)
235
235
 
236
- def reverse(self, x, y, LatLon=None, **name_LatLon_kwds): # PYCHOK no cover
236
+ def reverse(self, x, y, **name_LatLon_and_kwds):
237
237
  '''I{Must be overloaded}.'''
238
- self._notOverloaded(x, y, LatLon=LatLon, **name_LatLon_kwds)
238
+ self._notOverloaded(x, y, **name_LatLon_and_kwds) # PYCHOK no cover
239
239
 
240
- def _reverse(self, x, y, _c, lea, LatLon, **name_LatLon_kwds):
240
+ def _reverse(self, x, y, _c, lea, LatLon=None, **name_LatLon_kwds):
241
241
  '''(INTERNAL) Azimuthal (spherical) reverse C{x, y} to C{lat, lon}.
242
242
  '''
243
243
  e, n, z, r = _enzh4(x, y)
@@ -379,15 +379,14 @@ class Equidistant(_AzimuthalBase):
379
379
 
380
380
  return self._forward(lat, lon, name, _k_t)
381
381
 
382
- def reverse(self, x, y, LatLon=None, **name_LatLon_kwds):
382
+ def reverse(self, x, y, **name_LatLon_and_kwds):
383
383
  '''Convert an azimuthal equidistant location to geodetic lat- and longitude.
384
384
 
385
385
  @arg x: Easting of the location (C{meter}).
386
386
  @arg y: Northing of the location (C{meter}).
387
- @kwarg LatLon: Class to use (C{LatLon}) or C{None}.
388
- @kwarg name_LatLon_kwds: Optional C{B{name}=NN} forthe location and
389
- optional, additional B{C{LatLon}} keyword arguments,
390
- ignored if C{B{LatLon} is None}.
387
+ @kwarg name_LatLon_and_kwds: Optional C{B{name}=NN} and class C{B{LatLon}=None}
388
+ to use and optionally, additional B{C{LatLon}} keyword arguments,
389
+ ignored if C{B{LatLon} is None}.
391
390
 
392
391
  @return: The geodetic (C{LatLon}) or if C{B{LatLon} is None} an
393
392
  L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}.
@@ -401,7 +400,7 @@ class Equidistant(_AzimuthalBase):
401
400
  def _c(c):
402
401
  return c if c > EPS else None
403
402
 
404
- return self._reverse(x, y, _c, False, LatLon, **name_LatLon_kwds)
403
+ return self._reverse(x, y, _c, False, **name_LatLon_and_kwds)
405
404
 
406
405
 
407
406
  def equidistant(lat0, lon0, datum=_WGS84, exact=False, geodsolve=False, **name):
@@ -505,9 +504,8 @@ class _EquidistantBase(_AzimuthalGeodesic):
505
504
  @arg x: Easting of the location (C{meter}).
506
505
  @arg y: Northing of the location (C{meter}).
507
506
  @kwarg LatLon: Class to use (C{LatLon}) or C{None}.
508
- @kwarg name_LatLon_kwds: Optional C{B{name}=NN} for the location and
509
- optional, additional B{C{LatLon}} keyword arguments,
510
- ignored if C{B{LatLon} is None}.
507
+ @kwarg name_LatLon_kwds: Optional C{B{name}=NN} and optionally, additional
508
+ B{C{LatLon}} keyword arguments, ignored if C{B{LatLon} is None}.
511
509
 
512
510
  @return: The geodetic (C{LatLon}) or if C{B{LatLon} is None} an
513
511
  L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}.
@@ -670,15 +668,14 @@ class Gnomonic(_AzimuthalBase):
670
668
 
671
669
  return self._forward(lat, lon, name, _k_t)
672
670
 
673
- def reverse(self, x, y, LatLon=None, **name_LatLon_kwds):
671
+ def reverse(self, x, y, **name_LatLon_and_kwds):
674
672
  '''Convert an azimuthal equidistant location to geodetic lat- and longitude.
675
673
 
676
674
  @arg x: Easting of the location (C{meter}).
677
675
  @arg y: Northing of the location (C{meter}).
678
- @kwarg LatLon: Class to use (C{LatLon}) or C{None}.
679
- @kwarg name_LatLon_kwds: Optional C{B{name}=NN} for the location and
680
- optional, additional B{C{LatLon}} keyword arguments,
681
- ignored if C{B{LatLon} is None}.
676
+ @kwarg name_LatLon_and_kwds: Optional C{B{name}=NN} and class C{B{LatLon}=None}
677
+ for the location and optionally, additional B{C{LatLon}} keyword
678
+ arguments, ignored if C{B{LatLon} is None}.
682
679
 
683
680
  @return: The geodetic (C{LatLon}) or if C{B{LatLon} is None} an
684
681
  L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}.
@@ -692,7 +689,7 @@ class Gnomonic(_AzimuthalBase):
692
689
  def _c(c):
693
690
  return atan1(c) if c > EPS else None
694
691
 
695
- return self._reverse(x, y, _c, False, LatLon, **name_LatLon_kwds)
692
+ return self._reverse(x, y, _c, False, **name_LatLon_and_kwds)
696
693
 
697
694
 
698
695
  def gnomonic(lat0, lon0, datum=_WGS84, exact=False, geodsolve=False, **name):
@@ -787,20 +784,18 @@ class _GnomonicBase(_AzimuthalGeodesic):
787
784
  @arg x: Easting of the location (C{meter}).
788
785
  @arg y: Northing of the location (C{meter}).
789
786
  @kwarg LatLon: Class to use (C{LatLon}) or C{None}.
790
- @kwarg name_LatLon_kwds: Optional C{B{name}=NN} for the location and
791
- optional, additional B{C{LatLon}} keyword arguments,
792
- ignored if C{B{LatLon} is None}.
787
+ @kwarg name_LatLon_kwds: Optional C{B{name}=NN} for the location and optionally,
788
+ additional B{C{LatLon}} keyword arguments, ignored if C{B{LatLon} is None}.
793
789
 
794
790
  @return: The geodetic (C{LatLon}) or if C{B{LatLon} is None} an
795
791
  L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}.
796
792
 
797
793
  @raise AzimuthalError: No convergence.
798
794
 
799
- @note: The C{lat} will be in the range C{[-90..90] degrees} and C{lon}
800
- in the range C{[-180..180] degrees}. The C{azimuth} is clockwise
801
- from true North. The scale is C{1 / reciprocal**2} in C{radial}
802
- direction and C{1 / reciprocal} in the direction perpendicular
803
- to this.
795
+ @note: The C{lat} will be in the range C{[-90..90] degrees} and C{lon} in the range
796
+ C{[-180..180] degrees}. The C{azimuth} is clockwise from true North. The
797
+ scale is C{1 / reciprocal**2} in C{radial} direction and C{1 / reciprocal}
798
+ in the direction perpendicular to this.
804
799
  '''
805
800
  e, n, z, q = _enzh4(x, y)
806
801
 
@@ -974,30 +969,28 @@ class LambertEqualArea(_AzimuthalBase):
974
969
 
975
970
  return self._forward(lat, lon, name, _k_t)
976
971
 
977
- def reverse(self, x, y, LatLon=None, **name_LatLon_kwds):
972
+ def reverse(self, x, y, **name_LatLon_and_kwds):
978
973
  '''Convert an azimuthal Lambert-equal-area location to geodetic lat- and longitude.
979
974
 
980
975
  @arg x: Easting of the location (C{meter}).
981
976
  @arg y: Northing of the location (C{meter}).
982
- @kwarg LatLon: Class to use (C{LatLon}) or C{None}.
983
- @kwarg name_LatLon_kwds: Optional C{B{name}=NN} for the location
984
- and optional, additional B{C{LatLon}} keyword
985
- arguments, ignored if C{B{LatLon} is None}.
977
+ @kwarg name_LatLon_and_kwds: Optional C{B{name}=NN} and class C{B{LatLon}=None}
978
+ to use and optionally, additional B{C{LatLon}} keyword arguments,
979
+ ignored if C{B{LatLon} is None}.
986
980
 
987
981
  @return: The geodetic (C{LatLon}) or if C{B{LatLon} is None} an
988
982
  L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}.
989
983
 
990
- @note: The C{lat} will be in the range C{[-90..90] degrees} and C{lon}
991
- in the range C{[-180..180] degrees}. The C{scale} of the
992
- projection is C{1} in I{radial} direction, C{azimuth} clockwise
993
- from true North and is C{1 / reciprocal} in the direction
994
- perpendicular to this.
984
+ @note: The C{lat} will be in the range C{[-90..90] degrees} and C{lon} in the
985
+ range C{[-180..180] degrees}. The C{scale} of the projection is C{1}
986
+ in I{radial} direction, C{azimuth} clockwise from true North and is C{1
987
+ / reciprocal} in the direction perpendicular to this.
995
988
  '''
996
989
  def _c(c):
997
990
  c *= _0_5
998
991
  return (asin1(c) * _2_0) if c > EPS else None
999
992
 
1000
- return self._reverse(x, y, _c, True, LatLon, **name_LatLon_kwds)
993
+ return self._reverse(x, y, _c, True, **name_LatLon_and_kwds)
1001
994
 
1002
995
 
1003
996
  class Orthographic(_AzimuthalBase):
@@ -1028,29 +1021,27 @@ class Orthographic(_AzimuthalBase):
1028
1021
 
1029
1022
  return self._forward(lat, lon, name, _k_t)
1030
1023
 
1031
- def reverse(self, x, y, LatLon=None, **name_LatLon_kwds):
1024
+ def reverse(self, x, y, **name_LatLon_and_kwds):
1032
1025
  '''Convert an azimuthal orthographic location to geodetic lat- and longitude.
1033
1026
 
1034
1027
  @arg x: Easting of the location (C{meter}).
1035
1028
  @arg y: Northing of the location (C{meter}).
1036
- @kwarg LatLon: Class to use (C{LatLon}) or C{None}.
1037
- @kwarg name_LatLon_kwds: Optional C{B{name}=NN} for the location and
1038
- optional, additional B{C{LatLon}} keyword arguments,
1039
- ignored if C{B{LatLon} is None}.
1029
+ @kwarg name_LatLon_and_kwds: Optional C{B{name}=NN} and class C{B{LatLon}=None}
1030
+ to use and optionally, additional B{C{LatLon}} keyword arguments,
1031
+ ignored if C{B{LatLon} is None}.
1040
1032
 
1041
1033
  @return: The geodetic (C{LatLon}) or if C{B{LatLon} is None} an
1042
1034
  L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}.
1043
1035
 
1044
- @note: The C{lat} will be in the range C{[-90..90] degrees} and C{lon}
1045
- in the range C{[-180..180] degrees}. The C{scale} of the
1046
- projection is C{1} in I{radial} direction, C{azimuth} clockwise
1047
- from true North and is C{1 / reciprocal} in the direction
1048
- perpendicular to this.
1036
+ @note: The C{lat} will be in the range C{[-90..90] degrees} and C{lon} in the
1037
+ range C{[-180..180] degrees}. The C{scale} of the projection is C{1}
1038
+ in I{radial} direction, C{azimuth} clockwise from true North and is C{1
1039
+ / reciprocal} in the direction perpendicular to this.
1049
1040
  '''
1050
1041
  def _c(c):
1051
1042
  return asin1(c) if c > EPS else None
1052
1043
 
1053
- return self._reverse(x, y, _c, False, LatLon, **name_LatLon_kwds)
1044
+ return self._reverse(x, y, _c, False, **name_LatLon_and_kwds)
1054
1045
 
1055
1046
 
1056
1047
  class Stereographic(_AzimuthalBase):
@@ -1101,28 +1092,27 @@ class Stereographic(_AzimuthalBase):
1101
1092
  self._k0 = Scalar_(factor, name=n, low=EPS, high=2) # XXX high=1, 2, other?
1102
1093
  self._k02 = self._k0 * _2_0
1103
1094
 
1104
- def reverse(self, x, y, LatLon=None, **name_LatLon_kwds):
1095
+ def reverse(self, x, y, **name_LatLon_and_kwds):
1105
1096
  '''Convert an azimuthal stereographic location to geodetic lat- and longitude.
1106
1097
 
1107
1098
  @arg x: Easting of the location (C{meter}).
1108
1099
  @arg y: Northing of the location (C{meter}).
1109
- @kwarg LatLon: Class to use (C{LatLon}) or C{None}.
1110
- @kwarg name_LatLon_kwds: Optional C{B{name}=NN} for the location and
1111
- optional, additional B{C{LatLon}} keyword arguments,
1112
- ignored if C{B{LatLon} is None}.
1100
+ @kwarg name_LatLon_and_kwds: Optional C{B{name}=NN} and class C{B{LatLon}=None}
1101
+ to use and optionally, additional B{C{LatLon}} keyword arguments,
1102
+ ignored if C{B{LatLon} is None}.
1113
1103
 
1114
1104
  @return: The geodetic (C{LatLon}) or if C{B{LatLon} is None} an
1115
1105
  L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}.
1116
1106
 
1117
1107
  @note: The C{lat} will be in range C{[-90..90] degrees}, C{lon} in range
1118
- C{[-180..180] degrees} and C{azimuth} clockwise from true North.
1119
- The C{scale} of the projection is C{1} in I{radial} direction and
1120
- is C{1 / reciprocal} in the direction perpendicular to this.
1108
+ C{[-180..180] degrees} and C{azimuth} clockwise from true North. The
1109
+ C{scale} of the projection is C{1} in I{radial} direction and is C{1
1110
+ / reciprocal} in the direction perpendicular to this.
1121
1111
  '''
1122
1112
  def _c(c):
1123
1113
  return (atan2(c, self._k02) * _2_0) if c > EPS else None
1124
1114
 
1125
- return self._reverse(x, y, _c, False, LatLon, **name_LatLon_kwds)
1115
+ return self._reverse(x, y, _c, False, **name_LatLon_and_kwds)
1126
1116
 
1127
1117
 
1128
1118
  __all__ += _ALL_DOCS(_AzimuthalBase, _AzimuthalGeodesic, _EquidistantBase, _GnomonicBase)
pygeodesy/basics.py CHANGED
@@ -37,7 +37,7 @@ from math import copysign as _copysign
37
37
  # import inspect as _inspect # _MODS
38
38
 
39
39
  __all__ = _ALL_LAZY.basics
40
- __version__ = '24.10.14'
40
+ __version__ = '24.11.02'
41
41
 
42
42
  _below_ = 'below'
43
43
  _list_tuple_types = (list, tuple)
@@ -111,29 +111,29 @@ except NameError: # Python 3+
111
111
  return ub
112
112
 
113
113
 
114
- def _args_kwds_count2(func, exelf=True):
115
- '''(INTERNAL) Get a C{func}'s args and kwds count as 2-tuple
116
- C{(nargs, nkwds)}, including arg C{self} for methods.
117
-
118
- @kwarg exelf: If C{True}, exclude C{self} in the C{args}
119
- of a method (C{bool}).
120
- '''
121
- i = _MODS.inspect
122
- try: # PYCHOK no cover
123
- a = k = 0
124
- for _, p in i.signature(func).parameters.items():
125
- if p.kind is p.POSITIONAL_OR_KEYWORD:
126
- if p.default is p.empty:
127
- a += 1
128
- else:
129
- k += 1
130
- except AttributeError: # Python 2-
131
- s = i.getargspec(func)
132
- k = len(s.defaults or ())
133
- a = len(s.args) - k
134
- if exelf and a > 0 and i.ismethod(func):
135
- a -= 1
136
- return a, k
114
+ # def _args_kwds_count2(func, exelf=True): # in .formy
115
+ # '''(INTERNAL) Get a C{func}'s args and kwds count as 2-tuple
116
+ # C{(nargs, nkwds)}, including arg C{self} for methods.
117
+ #
118
+ # @kwarg exelf: If C{True}, exclude C{self} in the C{args}
119
+ # of a method (C{bool}).
120
+ # '''
121
+ # i = _MODS.inspect
122
+ # try:
123
+ # a = k = 0
124
+ # for _, p in i.signature(func).parameters.items():
125
+ # if p.kind is p.POSITIONAL_OR_KEYWORD:
126
+ # if p.default is p.empty:
127
+ # a += 1
128
+ # else:
129
+ # k += 1
130
+ # except AttributeError: # Python 2-
131
+ # s = i.getargspec(func)
132
+ # k = len(s.defaults or ())
133
+ # a = len(s.args) - k
134
+ # if exelf and a > 0 and i.ismethod(func):
135
+ # a -= 1
136
+ # return a, k
137
137
 
138
138
 
139
139
  def _args_kwds_names(func, splast=False):
@@ -222,7 +222,7 @@ def halfs2(str2):
222
222
  return str2[:h], str2[h:]
223
223
 
224
224
 
225
- def int1s(x):
225
+ def int1s(x): # PYCHOK no cover
226
226
  '''Count the number of 1-bits in an C{int}, I{unsigned}.
227
227
 
228
228
  @note: C{int1s(-B{x}) == int1s(abs(B{x}))}.
@@ -736,7 +736,7 @@ def _xcopy(obj, deep=False):
736
736
  return _deepcopy(obj) if deep else _copy(obj)
737
737
 
738
738
 
739
- def _xcoverage(where, *required):
739
+ def _xcoverage(where, *required): # in .__main__ # PYCHOK no cover
740
740
  '''(INTERNAL) Import C{coverage} and check required version.
741
741
  '''
742
742
  try:
@@ -847,15 +847,16 @@ def _xor(x, *xs):
847
847
  return x
848
848
 
849
849
 
850
- def _xpackages(_xpkg):
850
+ def _xpackages(_xpkgf):
851
851
  '''(INTERNAL) Check dependency to be excluded.
852
852
  '''
853
- n = _xpkg.__name__[2:] # _DUNDER_nameof, less '_x'
854
- if n in _XPACKAGES: # n.lower() in _XPACKAGES
855
- E = _PYGEODESY(_xpackages)
856
- x = _SPACE_(n, _in_, E)
857
- e = _enquote(_getenv(E, NN))
858
- raise ImportError(_EQUAL_(x, e))
853
+ if _XPACKAGES: # PYCHOK no cover
854
+ n = _xpkgf.__name__[2:] # _DUNDER_nameof, less '_x'
855
+ if n.lower() in _XPACKAGES:
856
+ E = _PYGEODESY(_xpackages)
857
+ x = _SPACE_(n, _in_, E)
858
+ e = _enquote(_getenv(E, NN))
859
+ raise ImportError(_EQUAL_(x, e))
859
860
 
860
861
 
861
862
  def _xscalar(**names_values):