Skip to content

Commit 2b15287

Browse files
committed
deduplicate and correct ellipsoid specs, add third flattening
1 parent dc0b624 commit 2b15287

File tree

2 files changed

+19
-16
lines changed

2 files changed

+19
-16
lines changed

pymap3d/ellipsoid.py

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from math import sqrt
12

23

34
class Ellipsoid:
@@ -12,7 +13,6 @@ class Ellipsoid:
1213
"""
1314

1415
def __init__(self, model='wgs84'):
15-
# type: (str) -> None
1616
"""
1717
feel free to suggest additional ellipsoids
1818
@@ -24,50 +24,44 @@ def __init__(self, model='wgs84'):
2424
if model == 'wgs84':
2525
"""https://en.wikipedia.org/wiki/World_Geodetic_System#WGS84"""
2626
self.semimajor_axis = 6378137.
27-
self.flattening = 1 / 298.2572235630
28-
self.semiminor_axis = self.semimajor_axis * (1 - self.flattening)
27+
self.semiminor_axis = 6356752.31424518
2928
elif model == 'wgs72':
3029
self.semimajor_axis = 6378135.
31-
self.flattening = 1 / 298.26
32-
self.semiminor_axis = self.semimajor_axis * (1 - self.flattening)
30+
self.semiminor_axis = 6356750.52001609
3331
elif model == 'grs80':
3432
"""https://en.wikipedia.org/wiki/GRS_80"""
3533
self.semimajor_axis = 6378137.
36-
self.flattening = 1 / 298.257222100882711243
37-
self.semiminor_axis = self.semimajor_axis * (1 - self.flattening)
34+
self.semiminor_axis = 6356752.31414036
3835
elif model == 'clarke1866':
3936
self.semimajor_axis = 6378206.4
4037
self.semiminor_axis = 6356583.8
41-
self.flattening = -(self.semiminor_axis / self.semimajor_axis - 1)
4238
elif model == 'mars':
4339
"""
4440
https://tharsis.gsfc.nasa.gov/geodesy.html
4541
"""
4642
self.semimajor_axis = 3396900.
4743
self.semiminor_axis = 3376097.80585952
48-
self.flattening = 1 / 163.295274386012
4944
elif model == 'moon':
5045
self.semimajor_axis = 1738000.
5146
self.semiminor_axis = self.semimajor_axis
52-
self.flattening = 0.
5347
elif model == 'venus':
5448
self.semimajor_axis = 6051000.
5549
self.semiminor_axis = self.semimajor_axis
56-
self.flattening = 0.
5750
elif model == 'jupiter':
5851
self.semimajor_axis = 71492000.
59-
self.flattening = 1 / 15.415446277169725
60-
self.flattening = -(self.semiminor_axis / self.semimajor_axis - 1)
52+
self.semiminor_axis = 66770054.3475922
6153
elif model == 'io':
6254
"""
6355
https://doi.org/10.1006/icar.1998.5987
6456
"""
6557
self.semimajor_axis = 1829.7
66-
self.flattening = 1 / 131.633093525179
67-
self.semiminor_axis = self.semimajor_axis * (1 - self.flattening)
58+
self.semiminor_axis = 1815.8
6859
elif model == 'pluto':
6960
self.semimajor_axis = 1187000.
7061
self.semiminor_axis = self.semimajor_axis
71-
self.flattening = 0.
7262
else:
7363
raise NotImplementedError('{} model not implemented, let us know and we will add it (or make a pull request)'.format(model))
64+
65+
self.flattening = (self.semimajor_axis - self.semiminor_axis) / self.semimajor_axis
66+
self.thirdflattening = (self.semimajor_axis - self.semiminor_axis) / (self.semimajor_axis + self.semiminor_axis)
67+
self.eccentricity = sqrt(2 * self.flattening - self.flattening**2)

tests/test_elliposid.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,15 @@
66
xyz0 = (660e3, -4700e3, 4247e3)
77

88

9+
@pytest.mark.parametrize("model,f", [("wgs84", 3.352810664747480e-03),
10+
("wgs72", 3.352779454167505e-03),
11+
("grs80", 3.352810681182319e-03),
12+
("clarke1866", 3.390075303928791e-03),
13+
("moon", 0.)])
14+
def test_reference(model, f):
15+
assert pm.Ellipsoid(model).flattening == approx(f)
16+
17+
918
def test_ellipsoid():
1019

1120
assert pm.ecef2geodetic(*xyz0, ell=pm.Ellipsoid("wgs84")) == approx([42.014670535, -82.0064785, 276.9136916])

0 commit comments

Comments
 (0)