Skip to content

Commit bef328b

Browse files
committed
add example for loxodrome_direct / reckon stability re: #42
1 parent 4437a15 commit bef328b

File tree

3 files changed

+50
-6
lines changed

3 files changed

+50
-6
lines changed

Examples/lox_stability.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#!/usr/bin/env python3
2+
from __future__ import annotations
3+
import logging
4+
from pathlib import Path
5+
from math import isclose, nan
6+
import numpy as np
7+
8+
from pymap3d.lox import loxodrome_direct
9+
10+
import matlab.engine
11+
12+
cwd = Path(__file__).parent
13+
eng = None # don't start Matlab engine over and over when script is interactive
14+
15+
if eng is None:
16+
eng = matlab.engine.start_matlab("-nojvm")
17+
eng.addpath(eng.genpath(str(cwd)), nargout=0)
18+
19+
if not eng.has_map_toolbox():
20+
raise EnvironmentError("Matlab does not have Mapping Toolbox")
21+
22+
23+
def matlab_func(lat1, lon1, rng, az) -> tuple[float, float]:
24+
"""Using Matlab Engine to do same thing as Pymap3d"""
25+
return eng.reckon("rh", lat1, lon1, rng, az, eng.wgs84Ellipsoid(), nargout=2) # type: ignore
26+
27+
28+
lat_last, lon_last = nan, nan
29+
clat, clon, rng = np.array(40.0), np.array(-80.0), np.array(10.0) # arbitrary
30+
31+
for i in range(20):
32+
azi = 90.0 + 10.0 ** (-i)
33+
34+
lat, lon = loxodrome_direct(clat, clon, rng, azi)
35+
36+
assert lat != lat_last
37+
assert lon != lon_last
38+
39+
lat_matlab, lon_matlab = matlab_func(clat, clon, rng, azi)
40+
rstr = f"azimuth: {azi} lat,lon: Python: {lat}, {lon} Matlab: {lat_matlab}, {lon_matlab}"
41+
if not (isclose(lat_matlab, lat, rel_tol=0.005) and isclose(lon_matlab, lon, rel_tol=0.001)):
42+
logging.error(rstr)

Examples/vdist_stability.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,9 @@
1818
raise EnvironmentError("Matlab does not have Mapping Toolbox")
1919

2020

21-
def matlab_func(lat1: float, lon1: float, lat2: float, lon2: float) -> tuple[float, float]:
21+
def matlab_func(lat1, lon1, lat2, lon2) -> tuple[float, float]:
2222
"""Using Matlab Engine to do same thing as Pymap3d"""
23-
ell = eng.wgs84Ellipsoid() # type: ignore
24-
return eng.distance(lat1, lon1, lat2, lon2, ell, nargout=2) # type: ignore
23+
return eng.distance(lat1, lon1, lat2, lon2, eng.wgs84Ellipsoid(), nargout=2) # type: ignore
2524

2625

2726
dlast, alast = nan, nan

src/pymap3d/tests/test_rhumb.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ def test_numpy_loxodrome_inverse():
7777
@pytest.mark.parametrize(
7878
"lat0,lon0,rng,az,lat1,lon1",
7979
[
80-
(40, -80, 10000, 30, 40.077995, -79.9414144),
80+
(40, -80, 10000, 30, 40.0000779959676, -79.9999414477481),
8181
(0, 0, 0, 0, 0, 0),
8282
(0, 0, 10018754.17, 90, 0, 90),
8383
(0, 0, 10018754.17, -90, 0, -90),
@@ -86,9 +86,12 @@ def test_numpy_loxodrome_inverse():
8686
],
8787
)
8888
def test_loxodrome_direct(lat0, lon0, rng, az, lat1, lon1):
89+
"""
90+
reckon('rh', 40, -80, 10, 30, wgs84Ellipsoid)
91+
"""
8992
lat2, lon2 = lox.loxodrome_direct(lat0, lon0, rng, az)
90-
assert lat2 == approx(lat1, abs=1e-6)
91-
assert lon2 == approx(lon1)
93+
assert lat2 == approx(lat1, rel=0.005, abs=1e-6)
94+
assert lon2 == approx(lon1, rel=0.001)
9295
assert isinstance(lat2, float)
9396
assert isinstance(lon2, float)
9497

0 commit comments

Comments
 (0)