pygeodesy 24.6.9__py2.py3-none-any.whl → 24.7.7__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 (87) hide show
  1. {PyGeodesy-24.6.9.dist-info → PyGeodesy-24.7.7.dist-info}/METADATA +2 -2
  2. PyGeodesy-24.7.7.dist-info/RECORD +117 -0
  3. pygeodesy/__init__.py +39 -32
  4. pygeodesy/__main__.py +6 -1
  5. pygeodesy/albers.py +2 -2
  6. pygeodesy/auxilats/__init__.py +1 -1
  7. pygeodesy/auxilats/auxAngle.py +40 -39
  8. pygeodesy/auxilats/auxDLat.py +3 -2
  9. pygeodesy/auxilats/auxLat.py +16 -18
  10. pygeodesy/auxilats/auxily.py +1 -1
  11. pygeodesy/azimuthal.py +10 -10
  12. pygeodesy/basics.py +16 -4
  13. pygeodesy/booleans.py +4 -4
  14. pygeodesy/cartesianBase.py +11 -14
  15. pygeodesy/css.py +14 -18
  16. pygeodesy/datums.py +6 -6
  17. pygeodesy/deprecated/__init__.py +1 -1
  18. pygeodesy/deprecated/classes.py +25 -4
  19. pygeodesy/deprecated/datum.py +3 -3
  20. pygeodesy/deprecated/functions.py +6 -8
  21. pygeodesy/dms.py +23 -27
  22. pygeodesy/ecef.py +4 -4
  23. pygeodesy/elevations.py +4 -4
  24. pygeodesy/ellipsoidalBase.py +23 -28
  25. pygeodesy/ellipsoidalBaseDI.py +19 -23
  26. pygeodesy/ellipsoidalExact.py +3 -3
  27. pygeodesy/ellipsoidalGeodSolve.py +15 -23
  28. pygeodesy/ellipsoidalKarney.py +37 -60
  29. pygeodesy/ellipsoidalNvector.py +38 -44
  30. pygeodesy/ellipsoidalVincenty.py +11 -14
  31. pygeodesy/ellipsoids.py +107 -101
  32. pygeodesy/errors.py +109 -48
  33. pygeodesy/etm.py +32 -44
  34. pygeodesy/formy.py +55 -58
  35. pygeodesy/frechet.py +18 -20
  36. pygeodesy/fsums.py +3 -3
  37. pygeodesy/gars.py +3 -4
  38. pygeodesy/geodesici.py +1696 -0
  39. pygeodesy/geodesicw.py +15 -15
  40. pygeodesy/geodesicx/__init__.py +4 -4
  41. pygeodesy/geodesicx/gx.py +34 -55
  42. pygeodesy/geodesicx/gxbases.py +20 -8
  43. pygeodesy/geodesicx/gxline.py +93 -88
  44. pygeodesy/geodsolve.py +108 -59
  45. pygeodesy/geohash.py +26 -34
  46. pygeodesy/geoids.py +28 -37
  47. pygeodesy/hausdorff.py +17 -18
  48. pygeodesy/heights.py +2 -2
  49. pygeodesy/internals.py +46 -13
  50. pygeodesy/interns.py +2 -2
  51. pygeodesy/karney.py +78 -15
  52. pygeodesy/ktm.py +13 -16
  53. pygeodesy/latlonBase.py +17 -19
  54. pygeodesy/lazily.py +28 -25
  55. pygeodesy/lcc.py +28 -31
  56. pygeodesy/ltp.py +7 -8
  57. pygeodesy/ltpTuples.py +71 -73
  58. pygeodesy/mgrs.py +8 -9
  59. pygeodesy/named.py +19 -10
  60. pygeodesy/nvectorBase.py +9 -10
  61. pygeodesy/osgr.py +9 -9
  62. pygeodesy/points.py +6 -6
  63. pygeodesy/rhumb/__init__.py +1 -1
  64. pygeodesy/rhumb/aux_.py +5 -5
  65. pygeodesy/rhumb/bases.py +30 -31
  66. pygeodesy/rhumb/ekx.py +3 -4
  67. pygeodesy/rhumb/solve.py +21 -22
  68. pygeodesy/solveBase.py +177 -123
  69. pygeodesy/sphericalBase.py +10 -11
  70. pygeodesy/sphericalNvector.py +13 -13
  71. pygeodesy/sphericalTrigonometry.py +86 -97
  72. pygeodesy/streprs.py +4 -34
  73. pygeodesy/triaxials.py +48 -43
  74. pygeodesy/units.py +208 -275
  75. pygeodesy/unitsBase.py +115 -107
  76. pygeodesy/ups.py +26 -31
  77. pygeodesy/utily.py +8 -8
  78. pygeodesy/utm.py +35 -40
  79. pygeodesy/utmups.py +43 -46
  80. pygeodesy/utmupsBase.py +8 -9
  81. pygeodesy/vector3d.py +26 -27
  82. pygeodesy/vector3dBase.py +6 -7
  83. pygeodesy/webmercator.py +19 -21
  84. pygeodesy/wgrs.py +18 -20
  85. PyGeodesy-24.6.9.dist-info/RECORD +0 -116
  86. {PyGeodesy-24.6.9.dist-info → PyGeodesy-24.7.7.dist-info}/WHEEL +0 -0
  87. {PyGeodesy-24.6.9.dist-info → PyGeodesy-24.7.7.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: PyGeodesy
3
- Version: 24.6.9
3
+ Version: 24.7.7
4
4
  Summary: Pure Python geodesy tools
5
5
  Home-page: https://GitHub.com/mrJean1/PyGeodesy
6
6
  Author: Jean M. Brouwers
@@ -159,7 +159,7 @@ and McCabe_ using Python 2.7.18 and with Flake8_ using Python 3.11.5, both in 64
159
159
 
160
160
  For a summary of all *Karney*-based functionality in ``pygeodesy``, see module karney_.
161
161
 
162
- *Last updated: June 09, 2024.*
162
+ *Last updated: July 07, 2024.*
163
163
 
164
164
  License
165
165
  =======
@@ -0,0 +1,117 @@
1
+ pygeodesy/LICENSE,sha256=YfgAiyxOwY6P9Kkb1_5XN81nueTLrpb3Ffkv3EuPgFU,1144
2
+ pygeodesy/__init__.py,sha256=Ig2DWbIX8WlxpVNviEhbft-iQ2xgVWvnOmbGWrpvV8c,41787
3
+ pygeodesy/__main__.py,sha256=VWxepzxGqR5wsHYyIHFSsRMlZ27keX3xyEhBuGDRXxk,4727
4
+ pygeodesy/albers.py,sha256=JXqeWAteV2N601e5R-D7bCsa8qAYv3oWm7M3R4uszXM,31078
5
+ pygeodesy/azimuthal.py,sha256=5tMMKlzKyfGnreOHChrquBi241ZvIOBTUn_pbZCIJWc,50231
6
+ pygeodesy/basics.py,sha256=mSim8pSrRLMFYTnTrJDvkthfrw2MWBmMya3hOHWX4co,29785
7
+ pygeodesy/booleans.py,sha256=5IeA6QWihiPWSv2JnCbMT53ey1WYIU7od5VQ1YUFqX8,73529
8
+ pygeodesy/cartesianBase.py,sha256=WaAod_-nwgX8MjNhu4rr_V9PmEaI0F8gKPCUH4-Olyc,46968
9
+ pygeodesy/clipy.py,sha256=3ysIEWQ89HjvLnSlZm0nZAt9EN5AQxIs1sLLM8yF9zM,27675
10
+ pygeodesy/constants.py,sha256=-weWOuHwE-qI6pYRLcTucI0KNcNJm6vPNzxwrJzACKs,19192
11
+ pygeodesy/css.py,sha256=B_EKq757XdQSUy83HAxEf3H5Iyd7mw3DbJB5Wi3obAc,25651
12
+ pygeodesy/datums.py,sha256=-m9-cvUVOaJ92eeFgc3O54lel3WqnVYcS7o6WCXkNyw,34043
13
+ pygeodesy/dms.py,sha256=QxiRtyc8QSiW-egm6Mrcrgmi_deWz3YnYwIm82JS4TU,44443
14
+ pygeodesy/ecef.py,sha256=yRydxBDiyvfrTTrQLawo-x2eGNcbd8CNQjBWfd3oSI8,59677
15
+ pygeodesy/elevations.py,sha256=4FuVcVNb_D09gmcvUlck344N4f7Jms76SIRrdutvKjk,10801
16
+ pygeodesy/ellipsoidalBase.py,sha256=olFcHvMeoW8Z_0T-Bn3XOpGGatoluaOZ50Fzm-ByAVg,55126
17
+ pygeodesy/ellipsoidalBaseDI.py,sha256=OxbSBntV9xiOgsb-0un0cUYIVoPiIiH-lt3baBkbaS8,38400
18
+ pygeodesy/ellipsoidalExact.py,sha256=GnSMNVnSG4VyORMcQZKxpA-R6HA0gWbTBkEIg1qrVaE,16945
19
+ pygeodesy/ellipsoidalGeodSolve.py,sha256=CqdNNqdwuUNIwZvYVMsk3rnW0U3KMgEoSQj_VIcFBEI,16665
20
+ pygeodesy/ellipsoidalKarney.py,sha256=XIvmSmMt0CGd0LtXxcDHX3KXXR2Mn8cRukefNQErJFU,18720
21
+ pygeodesy/ellipsoidalNvector.py,sha256=BbCWTZr9he3ayC8YEtLRXWVJ-g4HqHBuTVJsM33JKhw,30038
22
+ pygeodesy/ellipsoidalVincenty.py,sha256=gsUFMKgqMZKT02jDm7TEJ_jSHX8d-KJCz91iCfku5kg,25951
23
+ pygeodesy/ellipsoids.py,sha256=fraKj3NPStXablvzejt-LgQsghcp-MgMUvU6nh4L2YI,108034
24
+ pygeodesy/elliptic.py,sha256=-80MbZvRPk-TeA_ggkfXhjuPv07MzsB4HxNF7gbdhB4,42501
25
+ pygeodesy/epsg.py,sha256=oWHX_QVChE5roktAyXUmPmX49XHiryYmXTHxQzrAprE,8222
26
+ pygeodesy/errors.py,sha256=-UnQ1GhkiTR6uBd0z0vd_pFEmjWXlOESRDwMdxY_JD0,30605
27
+ pygeodesy/etm.py,sha256=y3dAqS-iWnbWzmsu4zB7kryAp_I17XEdzNRRk0klTww,44696
28
+ pygeodesy/fmath.py,sha256=EOHD0uZ8VULZtXAk8tVeuPaSTozPDCN8GJcemCo-jqg,33709
29
+ pygeodesy/formy.py,sha256=ZpPaQBQvaFiA-UcrgaiiV_iGxlfTqNdlR1Ngx-1oinY,75032
30
+ pygeodesy/frechet.py,sha256=F6TYbOEYSOFcll6nvp4GhqafUWXh1umAKb1QaMYQtuM,34372
31
+ pygeodesy/fstats.py,sha256=4eIhzSCMnn-2nVP3Q-5cCWCI-rvH0CE-zkk9hp3Pvn8,28642
32
+ pygeodesy/fsums.py,sha256=LzsPQHY3bByOFFXPSo7E8lbYKWy5cif02WJk2JfnMvA,80455
33
+ pygeodesy/gars.py,sha256=gJKZuGPKw8rlRLx1hywZrpGucpHXLvMe8fr8izgSW2s,11370
34
+ pygeodesy/geodesici.py,sha256=SiC7GX1d3rswXL24kuxs6acxMx95lxgIZkhCJ_W0MKA,69988
35
+ pygeodesy/geodesicw.py,sha256=apDkq2MwLCuEccRx39_P2vSqkW8aFaHX-aigj3fbU8Q,27186
36
+ pygeodesy/geodsolve.py,sha256=luJCtc5pfNoSSKZ-OgXIMUjgRH2jo8skskvsy2sAJRA,23171
37
+ pygeodesy/geohash.py,sha256=rOOGOHcTnxIPX2p5ieA1gQ_ZcRlUxjIcroPHa7a85ak,31876
38
+ pygeodesy/geoids.py,sha256=oxn0MSgbvwBkrwyg1vS7PhhYZ_zbjLxC50W-8FTIxeU,80680
39
+ pygeodesy/hausdorff.py,sha256=-aKtRbMefDSoIk4V3wCvNrXPZ7Bqk1P6-XuGuI7o8Zc,34770
40
+ pygeodesy/heights.py,sha256=9kvyJj0-D3syZMdHNDXIfZT3MyhHH2fcqW_y-u7Tn2M,43197
41
+ pygeodesy/internals.py,sha256=YUcf9wWXT7XztviEBN2uBww8Bt7gnqks2sAZt7k_j3w,20426
42
+ pygeodesy/interns.py,sha256=kReVkCWA_rw8GyaYFVRI9dfdXu7MF9nD1MgoXsdsK7I,23273
43
+ pygeodesy/iters.py,sha256=xPH0ytomvJeKHu717Fjzi3QbRrEikO6n7vqkY_IDz1k,20311
44
+ pygeodesy/karney.py,sha256=e11p40pfXocdmFpVROjv4NTowxjAmL4bNeNTDmF095I,37745
45
+ pygeodesy/ktm.py,sha256=u0xjvqhG2k18jg7bNclRr3D9umiZXKXQGRjmL_VX4yY,27437
46
+ pygeodesy/latlonBase.py,sha256=M-Xe4KK8aOnQUxNJkODlTa5ApzhqXCggc_d8HlMdnIc,78987
47
+ pygeodesy/lazily.py,sha256=HCrqdp_ZT_aTREO47nmlOch5kNHyL0IOfij40HL5hig,46842
48
+ pygeodesy/lcc.py,sha256=oDooTzFHnqsMtSKmmmfEbypHpdlPltfo7Mt0pAO4-_A,25669
49
+ pygeodesy/ltp.py,sha256=gQLZwcSIiXJrbRlaWnxAX8AK2VzH9l3jDqoNb3jcVD4,50773
50
+ pygeodesy/ltpTuples.py,sha256=r3uHMBCxr31IsCMp_OtpevQPmULJhucn8JZ2bGjuiVI,58338
51
+ pygeodesy/mgrs.py,sha256=w50bvM3qDtHDBDBRQ_EgZnPn7vxVXgoFnleeZgefkVk,29679
52
+ pygeodesy/named.py,sha256=_2zgvL0cPg2JL3JpyWMZ7cc9e_I0y_4XPVYb2e7zEZg,52243
53
+ pygeodesy/namedTuples.py,sha256=UDmL4kCihvf8tIUVXzGzRLzL_1BLuyqm04pite6YUuk,28495
54
+ pygeodesy/nvectorBase.py,sha256=7BvbRQbtTpDsE7BMHt3vpbuCQZUV_k79HvygbG7ak10,28683
55
+ pygeodesy/osgr.py,sha256=O8mLlmnQkcyXU4xczLGD1zhSyt8RQ3EsXctUnCIjO8U,30819
56
+ pygeodesy/points.py,sha256=GirmbiqjD7Q0Z4SDySQO__Jgun-i8vMdJ81U2Kz8V0w,64408
57
+ pygeodesy/props.py,sha256=8dGmTpdEABnLbBngmaOIpM0h4NYiBteMOHc_r4iNpAg,21988
58
+ pygeodesy/resections.py,sha256=nkfBxYrsEdyq2JqAbPrRWKplJBzFkIXLvEZGB4gPu_A,43550
59
+ pygeodesy/simplify.py,sha256=NybC-pfze0ObEm4ZCz6ZQrjJlQ-QyA83E6mSJqCuKq4,25223
60
+ pygeodesy/solveBase.py,sha256=SRxXd7M3e3VCe9om5XEYuIJ_AoDlP26AnRzDuDbIgUs,18726
61
+ pygeodesy/sphericalBase.py,sha256=YvjMZmmfy9pZeKHbY-ca0oi-Jy-OxsG9dhefy5LTjRA,32237
62
+ pygeodesy/sphericalNvector.py,sha256=MiWcCy5CdvXsCa3963GeUMEnSYGhBiXzkoAEX_tGX4Q,56952
63
+ pygeodesy/sphericalTrigonometry.py,sha256=Jf3FUUYEWXbNkiagr0HyMJ6E-cNghnTjcdgntTm28RE,64076
64
+ pygeodesy/streprs.py,sha256=xudQ6zi5jFT_CmstSPysjxpZKyLBQNkUk1ETh0uvQ04,23030
65
+ pygeodesy/trf.py,sha256=CRFHmu0lFNtc41fddXavEkHmgnTFWEqR4RTFodcFKsw,119022
66
+ pygeodesy/triaxials.py,sha256=SLAlzdpOa8kFSkpP-lhL-swzsZkuqufZET_gJtoA_54,62750
67
+ pygeodesy/units.py,sha256=mTn0APS0SW9fKn3IYf5usV63Xaw2B9DzkwefPNVu-Es,34607
68
+ pygeodesy/unitsBase.py,sha256=yT7dgfwxtd1hHEn02NwPAdStsVWDfPH-Qdfrhvje7Yw,14057
69
+ pygeodesy/ups.py,sha256=zapIvzoVuj_FDGC6sr8O8ynPhfqXwUg-EFCVnJdM9Eo,23329
70
+ pygeodesy/utily.py,sha256=Zb6L9unzHHhp67znmQLLdizvyX6p4eczR1PDtcyWH-s,36189
71
+ pygeodesy/utm.py,sha256=lCp7mNEaJNrAYnbdPaNUKkhbsX_GdssTEkp68uYdMLI,31091
72
+ pygeodesy/utmups.py,sha256=g2Z_aEOt6fhV9f4fASlW4_K_O_P4zBsBbWfQV11mIKo,13196
73
+ pygeodesy/utmupsBase.py,sha256=TJJeHSASjggUpzdpxwrOTH1tfHvDBxly47GJL27D8zY,18729
74
+ pygeodesy/vector2d.py,sha256=zJq5PB777_mFJpKD-rt_T0Vm4SNbVwF7pc3KxX8uCT8,34994
75
+ pygeodesy/vector3d.py,sha256=uDNnYSj4BL_Nec6SkyxXDbYaNjvI15HQX0xh25dRLI8,44883
76
+ pygeodesy/vector3dBase.py,sha256=Om0Uq1zgjuJ6slj12KiFus_tobjYTPxgVZejNd0YzFI,35729
77
+ pygeodesy/webmercator.py,sha256=stO_thswe_D4uxXWH43YWSN6-WWWpv_uIuOwvBIp8Ug,14932
78
+ pygeodesy/wgrs.py,sha256=k2OhMue84yH_xaezo0sdxL1-X7fZRqZZ4-Rl1reDYSM,14792
79
+ pygeodesy/auxilats/_CX_4.py,sha256=U41njj8Pu8cHMGuoUUVA20QIvRJAq-VGCnyoKJl0Ylo,8662
80
+ pygeodesy/auxilats/_CX_6.py,sha256=x4hrHxunjqqkEsZbVW1dyn3R5mR8EWYOuX77RzDEyh4,14856
81
+ pygeodesy/auxilats/_CX_8.py,sha256=t-OO48t4cCOsOgMi1FoyPw2DQqybVZFsgQMqAYP-jKY,25304
82
+ pygeodesy/auxilats/__init__.py,sha256=YNp41rRC5DmAhBx4RPqoqh4yxD9Vjf9Wk_USwqeZYcE,2881
83
+ pygeodesy/auxilats/__main__.py,sha256=Vuj1YSp1LV0zejVzi6EYauka1Dv8kwOHI_aeHxQEVYk,2899
84
+ pygeodesy/auxilats/auxAngle.py,sha256=8Gsae1URFCfD6t0oNI1ZJmgtik_EOvSAwrNmAZSMm2I,16729
85
+ pygeodesy/auxilats/auxDLat.py,sha256=3sq7Wc-ykpVbldNh10IZ3tIlJ7DcQFDlmZ4nOhJEgo0,10969
86
+ pygeodesy/auxilats/auxDST.py,sha256=bdNEh3TdABWH7qW6ngZx5SnzDM3B5rtPLvYhvCnFsKc,10497
87
+ pygeodesy/auxilats/auxLat.py,sha256=QeTx8dqov1NwNSEam9VC_wq36nRCUpbJpY4hH1NvyNg,32493
88
+ pygeodesy/auxilats/auxily.py,sha256=spSRS9beouT-qH98QhqMk9sm2qKubW8kwNYVWkFu3iU,8234
89
+ pygeodesy/deprecated/__init__.py,sha256=cBYqbh5Njkd5SnaJDaMUP6PL66HfLWii_JoLjnKfnP4,2815
90
+ pygeodesy/deprecated/bases.py,sha256=nxUtxscAg5cb7HEzTSmPJFafLc9Ad2SL5ovwkYaU5z8,1655
91
+ pygeodesy/deprecated/classes.py,sha256=gktUr5qYXCm8ztH6lfzFgaHKqMiw1tHc1Vw6i6DEvNA,12377
92
+ pygeodesy/deprecated/consterns.py,sha256=W-rQiw443_zCFEUzjCGykGND-i5P_ghEIyJUSGg7-Nc,1908
93
+ pygeodesy/deprecated/datum.py,sha256=s8Hke053RucP5ACvg3gdX8weQfGM0x59pQyHpY11eOs,1875
94
+ pygeodesy/deprecated/functions.py,sha256=EZMZe9WGkcbwmLDoWO2xKJyFlUkWAAMxmlbtCLa28lM,13866
95
+ pygeodesy/deprecated/nvector.py,sha256=_dZf84RdmPr7e7i8Yi683R-8Mqn0ipTqIsDhNl29hGo,2117
96
+ pygeodesy/deprecated/rhumbBase.py,sha256=d7YKW--dnRpobB2CSvhFsntWF0B5-HYJqID2pv5lD5k,1375
97
+ pygeodesy/deprecated/rhumbaux.py,sha256=n29xazYMbVG4MJkLjAGu8B88bbcFF5xnvuj9xSxjfIk,1428
98
+ pygeodesy/deprecated/rhumbsolve.py,sha256=QprjRfo5T1_C4ovaa1cffAcmNczzkhGIfmybAup9a9w,1431
99
+ pygeodesy/deprecated/rhumbx.py,sha256=OS0p_meaoVrpZe5UhK6qZljjlrGpL0pCHWw8gofw7ks,1425
100
+ pygeodesy/geodesicx/_C4_24.py,sha256=kS4XMR9m7iBs01V8K0Oz9qTYmjN-icIQGpc_8iwVhig,90750
101
+ pygeodesy/geodesicx/_C4_27.py,sha256=bPbj2Ckrn9WJglm3SNTXyMkULNwANM0tCQ-LKxP1L58,134258
102
+ pygeodesy/geodesicx/_C4_30.py,sha256=QZO8p971ztJwDGLOaJYgIhklztz9GlqbtS-xRP_E7o4,201964
103
+ pygeodesy/geodesicx/__init__.py,sha256=4qAIrE-cnOvi1B38iK-52PB2BpB1zxsVYEryHm4QTJk,2478
104
+ pygeodesy/geodesicx/__main__.py,sha256=JnKrYmg1q9J5wRRqUy-dQ9abj2-2jpWtrolMMaFfWiY,3176
105
+ pygeodesy/geodesicx/gx.py,sha256=0ohLWR_xllBfHyMzcwHTSgKE8FW4IH22IEXo3uAI-eI,60585
106
+ pygeodesy/geodesicx/gxarea.py,sha256=-Kwe6spe2MSQbeLFDd6UN2NOi4JOjYhHAEzonOU3u4A,19409
107
+ pygeodesy/geodesicx/gxbases.py,sha256=Awt9zc1lyPS0vp4df2u4H_rhMeFu1pJaZPhb1iMoc-Q,5693
108
+ pygeodesy/geodesicx/gxline.py,sha256=ZmRIO08IY4s0xJnCRrx2rF3z6XZ9_joUom77P_TsRaA,27514
109
+ pygeodesy/rhumb/__init__.py,sha256=kTuNSKiiQyXvQdYc5KUd5admuKJ2QmDCWQwkIobnM-w,2207
110
+ pygeodesy/rhumb/aux_.py,sha256=lOjpEU3Pe2I5DwC933UCf-SW73l5NMuDACeZhbVs3lE,16657
111
+ pygeodesy/rhumb/bases.py,sha256=awpP60K6EOzS753oXM-h9S6paS6FwoCnco8Zt8n81jY,54162
112
+ pygeodesy/rhumb/ekx.py,sha256=JsmdCatWKqsffF8jCh4HDu5IKt_kHq1qUdmP1LMuofY,24044
113
+ pygeodesy/rhumb/solve.py,sha256=bnmoPZUUw6sPhZ2HDigvPaE-L5M7ddEPf3ZdWvfBX5k,24043
114
+ PyGeodesy-24.7.7.dist-info/METADATA,sha256=22FKDjrVIiF_zPFqvlpXLoJ4QTv58ARwic_X9u639as,19411
115
+ PyGeodesy-24.7.7.dist-info/WHEEL,sha256=DZajD4pwLWue70CAfc7YaxT1wLUciNBvN_TTcvXpltE,110
116
+ PyGeodesy-24.7.7.dist-info/top_level.txt,sha256=cEQPatCXzKZqrivpULC5V5fuy9_V_bAwaP_gUGid7pQ,10
117
+ PyGeodesy-24.7.7.dist-info/RECORD,,
pygeodesy/__init__.py CHANGED
@@ -101,6 +101,11 @@ and L{GnomonicGeodSolve} depend on I{Karney}'s C++ utility U{GeodSolve
101
101
  <https://GeographicLib.SourceForge.io/C++/doc/GeodSolve.1.html>} to be executable and set with
102
102
  env variable C{PYGEODESY_GEODSOLVE} or with property L{Ellipsoid.geodsolve}.
103
103
 
104
+ Class L{Intersectool} and module L{geodesici} need I{Karney}'s C++ utility U{IntersectTool
105
+ <https://GeographicLib.SourceForge.io/C++/doc/IntersectTool.1.html>} to be executable and set with
106
+ env variable C{PYGEODESY_INTERSECTTOOL}.
107
+
108
+
104
109
  To compare C{MGRS} results from modules L{mgrs} and C{testMgrs} with I{Karney}'s C++ utility
105
110
  U{GeoConvert<https://GeographicLib.SourceForge.io/C++/doc/GeoConvert.1.html>}, the latter must
106
111
  be executable and set with env variable C{PYGEODESY_GEOCONVERT}.
@@ -145,7 +150,7 @@ Test coverage has been measured with U{coverage<https://PyPI.org/project/coverag
145
150
 
146
151
  PyPy 7.3.12 (Python 3.10.12), Python 3.11.5, 3.10.8 and 3.9.6 ran on Apple M1 Silicon (C{arm64}), I{natively}.
147
152
  Python 3.8.10 and 2.7.18 ran on Intel (C{x86_64}) or Intel I{emulation} ("C{arm64_x86_64}", see function
148
- L{pygeodesy.machine}).
153
+ L{machine<pygeodesy.machine>}).
149
154
 
150
155
  The tests also ran with Python 3.11.5 (and U{geographiclib<https://PyPI.org/project/geographiclib>} 2.0) on
151
156
  U{Debian 11<https://Cirrus-CI.com/github/mrJean1/PyGeodesy/master>} in 64-bit only and with Python 3.11.5,
@@ -192,34 +197,35 @@ Env variables
192
197
 
193
198
  The following environment variables are observed by C{PyGeodesy}:
194
199
 
195
- - C{PYGEODESY_EXCEPTION_CHAINING} - see module L{pygeodesy.errors}.
196
- - C{PYGEODESY_FMT_FORM} - see module L{pygeodesy.dms}.
197
- - C{PYGEODESY_FSUM_RESIDUAL} - see module L{pygeodesy.fsums} and class L{pygeodesy.Fsum}.
198
- - C{PYGEODESY_GEOCONVERT} - see module L{pygeodesy.mgrs}.
199
- - C{PYGEODESY_GEODSOLVE} - see module L{pygeodesy.geodsolve}.
200
- - C{PYGEODESY_LAZY_IMPORT} - see module L{pygeodesy.lazily} and variable L{pygeodesy.isLazy}.
201
- - C{PYGEODESY_NOTIMPLEMENTED} - __special__ methods return C{NotImplemented} if set to "std".
202
- - C{PYGEODESY_RHUMBSOLVE} - see module L{pygeodesy.rhumb.solve}.
203
- - C{PYGEODESY_UPS_POLES} - see modules L{pygeodesy.ups} and L{pygeodesy.mgrs}.
200
+ - C{PYGEODESY_EXCEPTION_CHAINING} - see module L{errors<pygeodesy.errors>}.
201
+ - C{PYGEODESY_FMT_FORM} - see module L{dms<pygeodesy.dms>}.
202
+ - C{PYGEODESY_FSUM_RESIDUAL} - see module L{fsums<pygeodesy.fsums>} and class L{Fsum<pygeodesy.Fsum>}.
203
+ - C{PYGEODESY_GEOCONVERT} - see module L{mgrs<pygeodesy.mgrs>}.
204
+ - C{PYGEODESY_GEODSOLVE} - see module L{geodsolve<pygeodesy.geodsolve>}.
205
+ - C{PYGEODESY_INTERSECTTOOL} - see modules L{geodesici<pygeodesy.geodesici>}.
206
+ - C{PYGEODESY_LAZY_IMPORT} - see module L{lazily<pygeodesy.lazily>} and variable L{isLazy<pygeodesy.isLazy>}.
207
+ - C{PYGEODESY_NOTIMPLEMENTED} - C{__special__} methods return C{NotImplemented} if set to "std".
208
+ - C{PYGEODESY_RHUMBSOLVE} - see module L{rhumb.solve<pygeodesy.rhumb.solve>}.
209
+ - C{PYGEODESY_UPS_POLES} - see modules L{ups<pygeodesy.ups>} and L{mgrs<pygeodesy.mgrs>}.
204
210
 
205
211
  and these to control standard or I{named} C{repr}esentations:
206
212
 
207
- - C{PYGEODESY_BEARING_STD_REPR} - see method L{pygeodesy.Bearing}C{.__repr__}.
208
- - C{PYGEODESY_BOOL_STD_REPR} - see method L{pygeodesy.Bool}C{.__repr__}.
209
- - C{PYGEODESY_DEGREES_STD_REPR} - see method L{pygeodesy.Degrees}C{.__repr__}.
210
- - C{PYGEODESY_FLOAT_STD_REPR} - see method L{pygeodesy.Float}C{.__repr__}.
211
- - C{PYGEODESY_INT_STD_REPR} - see method L{pygeodesy.Int}C{.__repr__}.
212
- - C{PYGEODESY_METER_STD_REPR} - see method L{pygeodesy.Meter}C{.__repr__}.
213
- - C{PYGEODESY_RADIANS_STD_REPR} - see method L{pygeodesy.Radians}C{.__repr__}.
214
- - C{PYGEODESY_STR_STD_REPR} - see method L{pygeodesy.Str}C{.__repr__}.
213
+ - C{PYGEODESY_BEARING_STD_REPR} - see method L{Bearing<pygeodesy.Bearing>}C{.__repr__}.
214
+ - C{PYGEODESY_BOOL_STD_REPR} - see method L{Bool<pygeodesy.Bool>}C{.__repr__}.
215
+ - C{PYGEODESY_DEGREES_STD_REPR} - see method L{Degrees<pygeodesy.Degrees>}C{.__repr__}.
216
+ - C{PYGEODESY_FLOAT_STD_REPR} - see method L{Float<pygeodesy.Float>}C{.__repr__}.
217
+ - C{PYGEODESY_INT_STD_REPR} - see method L{Int<pygeodesy.Int>}C{.__repr__}.
218
+ - C{PYGEODESY_METER_STD_REPR} - see method L{Meter<pygeodesy.Meter>}C{.__repr__}.
219
+ - C{PYGEODESY_RADIANS_STD_REPR} - see method L{Radians<pygeodesy.Radians>}C{.__repr__}.
220
+ - C{PYGEODESY_STR_STD_REPR} - see method L{Str<pygeodesy.Str>}C{.__repr__}.
215
221
 
216
222
  plus during development:
217
223
 
218
224
  - C{PYGEODESY_FOR_DOCS} - for extended documentation by C{epydoc}.
219
- - C{PYGEODESY_GEOGRAPHICLIB} - see module L{pygeodesy.karney}.
220
- - C{PYGEODESY_WARNINGS} - see module L{pygeodesy.props} and function L{pygeodesy.DeprecationWarnings}.
221
- - C{PYGEODESY_XPACKAGES} - see module L{pygeodesy.basics}.
222
- - C{PYTHONDEVMODE} - see modules L{pygeodesy.errors} and L{pygeodesy.props}.
225
+ - C{PYGEODESY_GEOGRAPHICLIB} - see module L{karney<pygeodesy.karney>}.
226
+ - C{PYGEODESY_WARNINGS} - see module L{props<pygeodesy.props>} and function L{DeprecationWarnings<pygeodesy.DeprecationWarnings>}.
227
+ - C{PYGEODESY_XPACKAGES} - see module L{basics<pygeodesy.basics>}.
228
+ - C{PYTHONDEVMODE} - see modules L{errors<pygeodesy.errors>} and L{props<pygeodesy.props>}.
223
229
 
224
230
  and:
225
231
 
@@ -233,8 +239,7 @@ and:
233
239
  License
234
240
  =======
235
241
 
236
- **) U{Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.
237
- <https://OpenSource.org/licenses/MIT>}
242
+ **) U{Copyright (C) 2016-2024 -- mrJean1 at Gmail -- All Rights Reserved.<https://OpenSource.org/licenses/MIT>}
238
243
 
239
244
  C{Permission is hereby granted, free of charge, to any person obtaining a copy of this software
240
245
  and associated documentation files (the "Software"), to deal in the Software without restriction,
@@ -298,14 +303,14 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.}
298
303
  @var F_RAD__: Convert degrees to radians and format as signed "-/+RR" I{without} symbol, I{without} suffix (C{str}).
299
304
 
300
305
  @var DIG: System's M{float decimal digits} = 15 (C{int}).
301
- @var INF: Infinity (C{float}), see functions L{pygeodesy.isinf} and L{pygeodesy.isfinite} and C{NINF}.
302
- @var INT0: C{int(0)}, missing Z-components, C{if B{z}=B{INT0}}, see functions L{pygeodesy.isint0}, L{pygeodesy.meeus2}
306
+ @var INF: Infinity (C{float}), see functions L{isinf<pygeodesy.isinf>} and L{isfinite<pygeodesy.isfinite>} and C{NINF}.
307
+ @var INT0: C{int(0)}, missing Z-components, C{if B{z}=B{INT0}}, see functions L{isint0<pygeodesy.isint0>}, L{meeus2<pygeodesy.meeus2>}
303
308
  @var MANT_DIG: System's M{float mantissa bits} = 53 (C{int}).
304
309
  @var MAX: System's M{float max} ≈ 1.798e+308 (C{float}).
305
310
  @var MIN: System's M{float min} ≈ 2.225e-308 (C{float}).
306
- @var NAN: Not-A-Number (C{float}), see function L{pygeodesy.isnan}.
307
- @var NEG0: Negative 0.0 (C{float}), see function L{pygeodesy.isneg0}.
308
- @var NINF: Negative infinity (C{float}), see function L{pygeodesy.isninf} and C{INF}.
311
+ @var NAN: Not-A-Number (C{float}), see function L{isnan<pygeodesy.isnan>}.
312
+ @var NEG0: Negative 0.0 (C{float}), see function L{isneg0<pygeodesy.isneg0>}.
313
+ @var NINF: Negative infinity (C{float}), see function L{isninf<pygeodesy.isninf>} and C{INF}.
309
314
  @var NN: Empty (C{str}), U{I{Nomen Nescio}<https://Wiktionary.org/wiki/N.N.>}.
310
315
 
311
316
  @var PI: Constant M{math.pi} (C{float}).
@@ -331,9 +336,9 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.}
331
336
  @var S_DEG: Degrees symbol, default C{"°"}
332
337
  @var S_MIN: Minutes symbol, default C{"′"} aka I{PRIME}
333
338
  @var S_SEC: Seconds symbol, default C{"″"} aka I{DOUBLE_PRIME}
334
- @var S_RAD: Radians symbol, default C{""} aka L{pygeodesy.NN}
339
+ @var S_RAD: Radians symbol, default C{""} aka L{NN<pygeodesy.NN>}
335
340
  @var S_DMS: If C{True} include, otherwise cancel all DMS symbols, default C{True}.
336
- @var S_SEP: Separator between C{deg°|min′|sec″|suffix}, default C{""} aka L{pygeodesy.NN}
341
+ @var S_SEP: Separator between C{deg°|min′|sec″|suffix}, default C{""} aka L{NN<pygeodesy.NN>}
337
342
 
338
343
  @var Conics: Registered, predefined conics (C{enum-like}).
339
344
  @var Datums: Registered, predefined datums (C{enum-like}).
@@ -413,6 +418,7 @@ if _init__all__ and not _lazy_import2: # import and set __all__
413
418
  import pygeodesy.fstats as fstats # PYCHOK exported
414
419
  import pygeodesy.fsums as fsums # PYCHOK exported
415
420
  import pygeodesy.gars as gars # PYCHOK exported
421
+ import pygeodesy.geodesici as geodesici # PYCHOK exported
416
422
  import pygeodesy.geodesicw as geodesicw # PYCHOK exported
417
423
  import pygeodesy.geodesicx as geodesicx # PYCHOK exported
418
424
  import pygeodesy.geodsolve as geodsolve # PYCHOK exported
@@ -497,6 +503,7 @@ if _init__all__ and not _lazy_import2: # import and set __all__
497
503
  from pygeodesy.fstats import * # PYCHOK __all__
498
504
  from pygeodesy.fsums import * # PYCHOK __all__
499
505
  from pygeodesy.gars import Garef, GARSError # PYCHOK lazily
506
+ from pygeodesy.geodesici import * # PYCHOK __all__
500
507
  from pygeodesy.geodesicw import * # PYCHOK __all__
501
508
  from pygeodesy.geodesicx import * # PYCHOK __all__
502
509
  from pygeodesy.geodsolve import * # PYCHOK __all__
@@ -589,7 +596,7 @@ else:
589
596
 
590
597
  from pygeodesy.internals import _version2, _DOT_ # PYCHOK import
591
598
  # from pygeodesy.interns import _DOT_ # from .internals
592
- __version__ = '24.06.09'
599
+ __version__ = '24.07.07'
593
600
  # see setup.py for similar logic
594
601
  version = _DOT_(*_version2(__version__, n=3))
595
602
 
pygeodesy/__main__.py CHANGED
@@ -5,7 +5,7 @@ u'''Print L{pygeodesy} version, etc. using C{python -m pygeodesy}.
5
5
  '''
6
6
 
7
7
  __all__ = ()
8
- __version__ = '24.05.15'
8
+ __version__ = '24.07.07'
9
9
 
10
10
  from os.path import basename, dirname
11
11
 
@@ -42,6 +42,11 @@ def _main(): # PYCHOK no cover
42
42
  v.append(_name_version(pkg))
43
43
 
44
44
  v = _Pythonarchine()
45
+ try:
46
+ import coverage as pkg
47
+ v.append(_name_version(pkg))
48
+ except ImportError:
49
+ pass
45
50
  _nv(_xgeographiclib, v)
46
51
  _nv(_xnumpy, v)
47
52
  _nv(_xscipy, v)
pygeodesy/albers.py CHANGED
@@ -38,7 +38,7 @@ from pygeodesy.utily import atan1, atan1d, degrees360, sincos2, sincos2d, \
38
38
  from math import atan2, atanh, degrees, fabs, radians, sqrt
39
39
 
40
40
  __all__ = _ALL_LAZY.albers
41
- __version__ = '24.05.21'
41
+ __version__ = '24.06.11'
42
42
 
43
43
  _k1_ = 'k1'
44
44
  _NUMIT = 8 # XXX 4?
@@ -354,7 +354,7 @@ class _AlbersBase(_NamedBase):
354
354
  and optional, additional B{C{LatLon}} keyword
355
355
  arguments, ignored if C{B{LatLon} is None}.
356
356
 
357
- @return: The geodetic (C{LatLon}) or if B{C{LatLon}} is C{None} an
357
+ @return: The geodetic (C{LatLon}) or if C{B{LatLon} is None} an
358
358
  L{Albers7Tuple}C{(x, y, lat, lon, gamma, scale, datum)}.
359
359
 
360
360
  @note: The origin latitude is returned by C{property lat0}. No
@@ -29,7 +29,7 @@ from pygeodesy.lazily import _ALL_OTHER
29
29
  # no modules: auxAngle, auxDLat, auxDST, auxily, auxLat
30
30
  __all__ = _ALL_OTHER(Aux, AuxAngle, AuxDLat, AuxDST, AuxLat,
31
31
  AuxBeta, AuxChi, AuxMu, AuxPhi, AuxTheta, AuxXi)
32
- __version__ = '24.05.31'
32
+ __version__ = '24.06.16'
33
33
 
34
34
  # **) MIT License
35
35
  #
@@ -14,14 +14,14 @@ under the MIT/X11 License. For more information, see the U{GeographicLib
14
14
  # make sure int/int division yields float quotient, see .basics
15
15
  from __future__ import division as _; del _ # PYCHOK semicolon
16
16
 
17
- from pygeodesy.auxilats.auxily import Aux, _Aux2Greek
18
- from pygeodesy.basics import _xinstanceof
17
+ from pygeodesy.auxilats.auxily import Aux, _Aux2Greek, AuxError
18
+ from pygeodesy.basics import map1, map2, _xinstanceof
19
19
  from pygeodesy.constants import EPS, _INF_NAN_NINF, MAX, NAN, _0_0, _0_5, _1_0, \
20
20
  _copysign_1_0, _over, _pos_self, isfinite, isnan
21
- from pygeodesy.errors import AuxError, _UnexpectedError, _xkwds_pop2
21
+ # from pygeodesy.errors import AuxError # from .auxilats.auxily
22
22
  from pygeodesy.fmath import hypot, unstr
23
23
  from pygeodesy.fsums import _add_op_, _iadd_op_, _isub_op_, _sub_op_
24
- from pygeodesy.named import _name2__, _Named, _ALL_DOCS, _MODS
24
+ from pygeodesy.named import _Named, _ALL_DOCS, _MODS
25
25
  # from pygeodesy.lazily import _ALL_DOCS, _ALL_MODS as _MODS # from .named
26
26
  from pygeodesy.props import Property, Property_RO, property_RO, _update_all
27
27
  # from pygeodesy.streprs import unstr # from .fmath
@@ -31,7 +31,7 @@ from pygeodesy.utily import atan2d, sincos2, sincos2d
31
31
  from math import asinh, atan2, copysign, degrees, fabs, radians, sinh
32
32
 
33
33
  __all__ = ()
34
- __version__ = '24.05.25'
34
+ __version__ = '24.06.16'
35
35
 
36
36
  _0_INF_NAN_NINF = (0, _0_0) + _INF_NAN_NINF
37
37
  _MAX_2 = MAX * _0_5 # PYCHOK used!
@@ -44,38 +44,37 @@ class AuxAngle(_Named):
44
44
  '''
45
45
  _AUX = None # overloaded/-ridden
46
46
  _diff = NAN # default
47
- _iter = None # like .Named._NamedBase
47
+ _iter = None # like ._NamedBase
48
48
  _y = _0_0
49
49
  _x = _1_0
50
50
 
51
- def __init__(self, y_angle=_0_0, x=_1_0, **name_aux):
51
+ def __init__(self, y_angle=_0_0, x=_1_0, aux=None, **name):
52
52
  '''New L{AuxAngle}.
53
53
 
54
54
  @kwarg y_angle: The Y component (C{scalar}, including C{INF}, C{NAN}
55
55
  and C{NINF}) or a previous L{AuxAngle} instance.
56
- @kwarg x: The X component, ignored if C{B{y_angle}} is non-C{scalar}.
57
- @kwarg name_aux: Optional C{B{name}=NN} (C{str}) and I{Auxiliary} kind
58
- (C{B{aux}=Aux.KIND}), ignored if B{C{y_angle}} is L{AuxAngle}.
56
+ @kwarg x: The X component, required if C{B{y_angle}} is C{scalar},
57
+ ignored otherwise.
58
+ @kwarg aux: I{Auxiliary} kind (C{Aux.KIND}), like B{C{x}}.
59
+ @kwarg name: Optional C{B{name}=NN} see (C{str}).
59
60
 
60
61
  @raise AuxError: Invalid B{C{y_angle}}, B{C{x}} or B{C{aux}}.
61
62
  '''
62
- name, aux = _name2__(**name_aux)
63
63
  try:
64
- yx = y_angle._yx
65
- if self._AUX is None:
66
- self._AUX = y_angle._AUX
67
- if self._diff != y_angle._diff:
68
- self._diff = y_angle._diff
69
- except AttributeError:
70
- yx = y_angle, x
71
- if aux:
72
- a, kwds = _xkwds_pop2(aux, aux=self._AUX)
73
- if kwds:
74
- raise _UnexpectedError(**kwds)
75
- if a is not self._AUX:
76
- if a not in _AUXClass:
77
- raise AuxError(aux=a)
78
- self._AUX = a
64
+ try:
65
+ yx = y_angle._yx
66
+ aux = y_angle._AUX
67
+ if self._diff != y_angle._diff:
68
+ self._diff = y_angle._diff
69
+ except AttributeError:
70
+ yx = y_angle, x
71
+ if aux in _AUXClass:
72
+ if self._AUX != aux:
73
+ self._AUX = aux
74
+ elif aux is not None:
75
+ raise ValueError() # _invalid_
76
+ except Exception as X:
77
+ raise AuxError(y=y_angle, x=x, aux=aux, cause=X)
79
78
  self._y, self._x = _yx2(yx)
80
79
  if name:
81
80
  self.name = name
@@ -84,7 +83,7 @@ class AuxAngle(_Named):
84
83
  '''Return this angle's absolute value (L{AuxAngle}).
85
84
  '''
86
85
  a = self._copy_2(self.__abs__)
87
- a._yx = map(fabs, self._yx)
86
+ a._yx = map2(fabs, self._yx)
88
87
  return a
89
88
 
90
89
  def __add__(self, other):
@@ -230,28 +229,28 @@ class AuxAngle(_Named):
230
229
  return self._diff
231
230
 
232
231
  @staticmethod
233
- def fromDegrees(deg, **name_aux):
232
+ def fromDegrees(deg, **aux_name):
234
233
  '''Get an L{AuxAngle} from degrees.
235
234
  '''
236
- return _AuxClass(**name_aux)(*sincos2d(deg), **name_aux)
235
+ return _AuxClass(**aux_name)(*sincos2d(deg), **aux_name)
237
236
 
238
237
  @staticmethod
239
- def fromLambertianDegrees(psi, **name_aux):
238
+ def fromLambertianDegrees(psi, **aux_name):
240
239
  '''Get an L{AuxAngle} from I{Lambertian} degrees.
241
240
  '''
242
- return _AuxClass(**name_aux)(sinh(radians(psi)), **name_aux)
241
+ return _AuxClass(**aux_name)(sinh(radians(psi)), **aux_name)
243
242
 
244
243
  @staticmethod
245
- def fromLambertianRadians(psi, **name_aux):
244
+ def fromLambertianRadians(psi, **aux_name):
246
245
  '''Get an L{AuxAngle} from I{Lambertian} radians.
247
246
  '''
248
- return _AuxClass(**name_aux)(sinh(psi), **name_aux)
247
+ return _AuxClass(**aux_name)(sinh(psi), **aux_name)
249
248
 
250
249
  @staticmethod
251
- def fromRadians(rad, **name_aux):
250
+ def fromRadians(rad, **aux_name):
252
251
  '''Get an L{AuxAngle} from radians.
253
252
  '''
254
- return _AuxClass(**name_aux)(*sincos2(rad), **name_aux)
253
+ return _AuxClass(**aux_name)(*sincos2(rad), **aux_name)
255
254
 
256
255
  @Property_RO
257
256
  def iteration(self):
@@ -514,13 +513,15 @@ def _AuxClass(aux=None, **unused): # PYCHOK C{classof(aux)}
514
513
 
515
514
 
516
515
  def _yx2(yx):
516
+ '''(INTERNAL) Validate 2-tuple C{(y, x)}.
517
+ '''
517
518
  try:
518
- y, x = map(float, yx)
519
+ y, x = yx
520
+ y, x = map1(float, y, x)
519
521
  if y in _0_INF_NAN_NINF:
520
522
  x = _copysign_1_0(x)
521
- except (TypeError, ValueError) as e:
522
- y, x = yx
523
- raise AuxError(y=y, x=x, cause=e)
523
+ except (TypeError, ValueError) as X:
524
+ raise AuxError(y=y, x=x, cause=X)
524
525
  return y, x
525
526
 
526
527
 
@@ -26,7 +26,7 @@ from pygeodesy.elliptic import Elliptic as _Ef, Fsum
26
26
  from math import atan2, cos, sin, sqrt
27
27
 
28
28
  __all__ = ()
29
- __version__ = '23.12.01'
29
+ __version__ = '24.06.16'
30
30
 
31
31
 
32
32
  class AuxDLat(AuxLat):
@@ -138,7 +138,8 @@ class AuxDLat(AuxLat):
138
138
  txy = tx * ty
139
139
  if txy < 0 or (isinf(ty) and not tx):
140
140
  _a = atan1
141
- r = _over(_a(fm1 * ty) - _a(fm1 * tx), _a(ty) - _a(tx))
141
+ r = _a(fm1 * ty) - _a(fm1 * tx)
142
+ r = _over(r, _a(ty) - _a(tx))
142
143
  elif tx == ty: # includes tx = ty = inf
143
144
  if txy > 1: # == tx**2
144
145
  txy = _1_over(txy)
@@ -22,8 +22,9 @@ from pygeodesy.basics import _reverange, _xinstanceof, _passarg
22
22
  from pygeodesy.constants import INF, MAX_EXP, MIN_EXP, NAN, PI_2, PI_4, _EPSqrt, \
23
23
  _0_0, _0_0s, _0_1, _0_25, _0_5, _1_0, _2_0, _3_0, \
24
24
  _360_0, isfinite, isinf, isnan, _log2, _over
25
- from pygeodesy.datums import _ellipsoidal_datum, _WGS84, Ellipsoid, _name__
26
- # from pygeodesy.ellipsoids import Ellipsoid # from .datums
25
+ from pygeodesy.datums import _ellipsoidal_datum, _WGS84, \
26
+ Ellipsoid, _name__, _EWGS84
27
+ # from pygeodesy.ellipsoids import Ellipsoid, _EWGS84 # from .datums
27
28
  from pygeodesy.elliptic import Elliptic as _Ef
28
29
  from pygeodesy.errors import AuxError, _xkwds_not, _xkwds_pop2, _Xorder
29
30
  # from pygeodesy.fmath import cbrt # from .karney
@@ -46,7 +47,7 @@ except ImportError: # Python 3.11-
46
47
  return pow(_2_0, x)
47
48
 
48
49
  __all__ = ()
49
- __version__ = '24.05.24'
50
+ __version__ = '24.06.16'
50
51
 
51
52
  _TRIPS = 1024 # XXX 2 or 3?
52
53
 
@@ -64,24 +65,21 @@ class AuxLat(AuxAngle):
64
65
  <https://GeographicLib.SourceForge.io/C++/doc/classGeographicLib_1_1AuxLatitude.html>}.
65
66
  '''
66
67
  _csc = dict() # global coeffs cache: [aL][k], upto max(k) * (4 + 6 + 8) floats
67
- _E = _WGS84.ellipsoid
68
+ _E = _EWGS84
68
69
  # _Lmax = 0 # overwritten below
69
70
  _mAL = 6 # 4, 6 or 8 aka Lmax
70
71
 
71
- def __init__(self, a_earth=_WGS84, f=None, b=None, **ALorder_name):
72
+ def __init__(self, a_earth=_EWGS84, f=None, b=None, **ALorder_name):
72
73
  '''New L{AuxLat} instance on an ellipsoid or datum.
73
74
 
74
- @arg a_earth: Equatorial radius, semi-axis (C{meter}) or an
75
- ellipsoid or datum (L{Datum}, L{Ellipsoid},
76
- L{Ellipsoid2} or L{a_f2Tuple}).
77
- @kwarg f: Flattening: M{(a - b) / a} (C{float}, near zero for
78
- spherical), ignored if B{C{a_earth}} is not scalar.
79
- @kwarg b: Optional polar radius, semi-axis (C{meter}, same
80
- units as B{C{a_earth}}), ignored if B{C{a_earth}}
81
- is not scalar.
82
- @kwarg ALorder_name: Optional C{B{name}=NN} (C{str}) and optional
83
- keyword argument C{B{ALorder}=6} for the order of
84
- this L{AuxLat}, see property C{ALorder}.
75
+ @arg a_earth: Equatorial radius, semi-axis (C{meter}) or an ellipsoid or
76
+ datum (L{Datum}, L{Ellipsoid}, L{Ellipsoid2} or L{a_f2Tuple}).
77
+ @kwarg f: Flattening: M{(a - b) / a} (C{float}, near zero for spherical),
78
+ required if B{C{a_earth}} is C{scalar} and C{B{b}=None}.
79
+ @kwarg b: Optional polar radius, semi-axis (C{meter}, required if B{C{a_earth}}
80
+ is C{scalar} and C{B{f}=None}.
81
+ @kwarg ALorder_name: Optional C{B{name}=NN} (C{str}) and optional order of
82
+ this L{AuxLat} C{B{ALorder}=6}, see property C{ALorder}.
85
83
  '''
86
84
  if ALorder_name:
87
85
  M = self._mAL
@@ -91,7 +89,7 @@ class AuxLat(AuxAngle):
91
89
  else:
92
90
  name = NN
93
91
  try:
94
- if a_earth is not _WGS84:
92
+ if a_earth not in (_EWGS84, _WGS84):
95
93
  n = _name__(name, name__=AuxLat)
96
94
  if b is f is None:
97
95
  E = _ellipsoidal_datum(a_earth, name=n).ellipsoid # XXX raiser=_earth_
@@ -101,7 +99,7 @@ class AuxLat(AuxAngle):
101
99
  raise ValueError(_not_scalar_)
102
100
  self._E = E
103
101
  elif not (b is f is None):
104
- # _UnexpectedError into AuxError
102
+ # turn _UnexpectedError into AuxError
105
103
  name = _name__(name, **_xkwds_not(None, b=b, f=f))
106
104
 
107
105
  if name:
@@ -212,7 +212,7 @@ def _h(tx):
212
212
 
213
213
 
214
214
  def _sn(tx):
215
- '''(INTERNAL) M{tx / sqrt(tx**2 + 1)}, converting tan to sin.
215
+ '''(INTERNAL) M{sin(x) = tan(x) / sqrt(tan(x)**2 + 1)}.
216
216
  '''
217
217
  if tx:
218
218
  tx = _copysign_1_0(tx) if isinf(tx) else (