geographiclib-rs
A subset of geographiclib implemented in Rust.
Currently this implements the direct and the inverse geodesic calculations.
If instead you are looking for Rust bindings to Karney's C++ implementation, see https://crates.io/geographiclib.
Examples
// Determine the point 10000 km NE of JFK - the "direct" geodesic calculation.
use ;
let g = wgs84;
let jfk_lat = 40.64;
let jfk_lon = -73.78;
let northeast_azimuth = 45.0;
let = g.direct;
use assert_relative_eq;
assert_relative_eq!;
assert_relative_eq!;
assert_relative_eq!;
// Determine the distance between two points - the "inverse" geodesic calculation.
use ;
let g = wgs84;
let p1 = ;
let p2 = ;
let s12: f64 = g.inverse;
use assert_relative_eq;
assert_relative_eq!;
// Determine the perimeter and area of a polygon.
use ;
let g = wgs84;
let mut pa = new;
pa.add_point;
pa.add_point;
pa.add_point;
pa.add_point;
let = pa.compute;
use assert_relative_eq;
assert_relative_eq!;
assert_relative_eq!;
assert_eq!;
// Determine the distance between rovers Pathfinder and Curiosity on Mars
use ;
let mars = new;
let pathfinder = ;
let curiosity = ;
let distance_m: f64 = mars.inverse;
assert_eq!;
Features
accurate: Enabled by default. Use theaccuratecrate to provide high accuracy polygon areas and perimeters inPolygonArea. Can be disabled for better performance or whenPolygonAreais not being used.
Benchmarking
To compare the direct and inverse geodesic calculation against the geographiclib c bindings, run:
cargo bench
Which produces output like:
Running target/release/deps/geodesic_benchmark-af6ba4f7be913514
direct (c wrapper) time: [34.852 us 34.937 us 35.023 us]
change: [+1.1137% +1.7246% +2.2864%] (p = 0.00 < 0.05)
Performance has regressed.
Found 9 outliers among 100 measurements (9.00%)
3 (3.00%) low mild
6 (6.00%) high mild
direct (rust impl) time: [48.862 us 48.959 us 49.059 us]
change: [+0.0149% +0.8003% +1.5464%] (p = 0.04 < 0.05)
Change within noise threshold.
Found 9 outliers among 100 measurements (9.00%)
1 (1.00%) low mild
4 (4.00%) high mild
4 (4.00%) high severe
inverse (c wrapper) time: [70.875 us 71.138 us 71.464 us]
change: [+0.6259% +1.1321% +1.6653%] (p = 0.00 < 0.05)
Change within noise threshold.
Found 8 outliers among 100 measurements (8.00%)
1 (1.00%) high mild
7 (7.00%) high severe
inverse (rust impl) time: [103.66 us 104.07 us 104.58 us]
change: [-1.0415% -0.0086% +1.0291%] (p = 0.99 > 0.05)
No change in performance detected.
Found 7 outliers among 100 measurements (7.00%)
1 (1.00%) low mild
6 (6.00%) high severe
Showing that, at least in this benchmark, the Rust implementation is 40-50% slower than the c bindings.