Ho usato geographiclib per trovare azymouth (0 - 360) tra 2 punti nell'ellissoide WGS84 utilizzando il metodo inverso e filtrando il suo results come segue:
from geographiclib.geodesic import Geodesic
def orientation(startpoint, endpoint): # each point is a tuple of (lon, lat)
return (
Geodesic.WGS84.Inverse(
startpoint[1],
startpoint[0],
endpoint[1],
endpoint[0],
)['azi1'] % 360
)
I gradi possono essere convertiti in direzioni basate sui punti bussola . Ecco un altro approccio pulito .
Ho utilizzato il seguente codice e verificato alcuni risultati con questo servizio online :
from geographiclib.geodesic import Geodesic
def orientation(startpoint, endpoint): # each point is a tuple of (lon, lat)
azi = (
Geodesic.WGS84.Inverse(
startpoint[1],
startpoint[0],
endpoint[1],
endpoint[0],
)['azi1'] % 360
)
ranges = {
(0, 11.25): 'N',
(11.25, 33.75): 'NNE',
(33.75, 56.25): 'NE',
(56.25, 78.75): 'ENE',
(78.75, 101.25): 'E',
(101.25, 123.75): 'ESE',
(123.75, 146.25): 'SE',
(146.25, 168.75): 'SSE',
(168.75, 191.25): 'S',
(191.25, 213.75): 'SSW',
(213.75, 236.25): 'SW',
(236.25, 258.75): 'WSW',
(258.75, 281.25): 'W',
(281.25, 303.75): 'WNW',
(303.75, 326.25): 'NW',
(326.25, 348.75): 'NNW',
(348.75, 360): 'N',
}
for i in ranges.keys():
if i[0] < azi <= i[1]:
return ranges[i]