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}