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
每月下载量 1,183
在 3 个crate中使用(通过libits-client)
54KB
463 代码行
cheap-ruler-rs
将 cheap-ruler 和 cheap-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