gistools/geometry/tools/points/
bearing.rs

1use libm::{atan2, cos, sin};
2use s2json::GetXY;
3
4/// Get the bearing in degrees between two points
5pub fn bearing<P1: GetXY, P2: GetXY>(start: &P1, end: &P2) -> f64 {
6    let lat1 = start.y().to_radians();
7    let lat2 = end.y().to_radians();
8    let lon1 = start.x().to_radians();
9    let lon2 = end.x().to_radians();
10    let y = sin(lon2 - lon1) * cos(lat2);
11    let x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(lon2 - lon1);
12
13    (atan2(y, x).to_degrees() + 360.) % 360.
14}