#geodesic #calculations #measurement #points #approximation #distance #bearing

cheap-ruler

cheap-ruler 是一个 Rust 语言的版本,它是一组非常快速的近似地球大地测量的集合

4 个版本 (破坏性更新)

0.4.0 2023年11月2日
0.3.0 2021年3月17日
0.2.0 2021年3月9日
0.1.0 2020年12月2日

地理空间 中排名 #63

Download history 349/week @ 2024-04-10 294/week @ 2024-04-17 185/week @ 2024-04-24 98/week @ 2024-05-01 170/week @ 2024-05-08 306/week @ 2024-05-15 242/week @ 2024-05-22 371/week @ 2024-05-29 328/week @ 2024-06-05 457/week @ 2024-06-12 189/week @ 2024-06-19 152/week @ 2024-06-26 186/week @ 2024-07-03 242/week @ 2024-07-10 441/week @ 2024-07-17 279/week @ 2024-07-24

每月下载量 1,183
3 个crate中使用(通过libits-client

ISC 许可证

54KB
463 代码行

GitHub Actions GitHub License

cheap-ruler-rs

cheap-rulercheap-ruler-cpp 移植到安全的 Rust 中,这是一个非常快速的近似地球大地测量的集合。

近似值基于 WGS84 和地球的椭球模型。计算结果准确到构造时提供的纬度的小差异,并且计算成本较低。

请参阅 cheap-ruler 的自述文件,了解与 Vincenty 公式的精度比较。

使用方法

这是一个示例程序,用于打印两点之间的距离和方位角

extern crate cheap_ruler;
#[macro_use] extern crate geo_types;

use cheap_ruler::{CheapRuler, DistanceUnit};

fn main() {
  let ruler = CheapRuler::new(44.7192003, DistanceUnit::Meters);
  let p1 = point!(x: 14.8901816, y: 44.7209699);
  let p2 = point!(x: 14.8905188, y: 44.7209699);

  let dist = ruler.distance(&p1, &p2);
  let bearing = ruler.bearing(&p1, &p2);

  println!("Distance between points: {}", dist);
  println!("Bearing: {}", bearing);
}

geo_types

该库使用 geo-types crate 来表示点和坐标。一个例外是 BBox 函数,它使用一个自定义的 Rect 实现,该实现不会自动交换最小/最大边界

extern crate cheap_ruler;
#[macro_use] extern crate geo_types;

use cheap_ruler::{CheapRuler, DistanceUnit, Rect};
use geo_types::Coordinate;

fn main() {
  let ruler = CheapRuler::new(32.8351, DistanceUnit::Kilometers);
  let bbox = Rect::new(
      Coordinate { x: 179.9, y: 32.7 },
      Coordinate { x: -179.9, y: 32.9 },
  );
  let p = point!(x: 180.0, y: 32.8);
  assert!(ruler.inside_bbox(&p, &bbox));
}

基准测试

Cheap ruler 的距离计算比 geo crate 的 haversine 算法实现快约 16 倍。方位角计算与 geo 的实现相当,目的地计算快 3 倍以上。

以下时间来自一台配备 Intel Core i7-8550U 的机器。

distance/cheap_ruler    time:   [291.10 ps 292.38 ps 293.89 ps]
distance/haversine      time:   [4.7215 ns 4.8545 ns 5.0086 ns]
distance/vincenty       time:   [315.83 ns 320.75 ns 325.93 ns]

bearing/cheap_ruler     time:   [16.201 ns 16.239 ns 16.281 ns]
bearing/geo             time:   [16.523 ns 16.576 ns 16.629 ns]

destination/cheap_ruler time:   [24.984 ns 25.183 ns 25.471 ns]
destination/haversine   time:   [82.251 ns 82.670 ns 83.169 ns]

更新日志

请参阅 CHANGELOG 文件以获取详细信息。

许可证

此库根据 ISC 许可证授权。有关完整许可证内容,请参阅 LICENSE 文件。

TODO

  • 使用符合 Rust 习惯的方法对遵循 C++ 习惯的方法进行方法。

依赖关系

~750KB
~15K SLoC