K-dimensional tree in Rust for fast geospatial indexing
Add kdtree
to Cargo.toml
toml
[dependencies]
kdtree = "0.5.0"
Add points to kdtree and query nearest n points with distance function ```rust use kdtree::KdTree; use kdtree::ErrorKind; use kdtree::distance::squared_euclidean;
let a: ([f64; 2], usize) = ([0f64, 0f64], 0); let b: ([f64; 2], usize) = ([1f64, 1f64], 1); let c: ([f64; 2], usize) = ([2f64, 2f64], 2); let d: ([f64; 2], usize) = ([3f64, 3f64], 3);
let dimensions = 2; let mut kdtree = KdTree::new(dimensions);
kdtree.add(&a.0, a.1).unwrap(); kdtree.add(&b.0, b.1).unwrap(); kdtree.add(&c.0, c.1).unwrap(); kdtree.add(&d.0, d.1).unwrap();
asserteq!(kdtree.size(), 4); asserteq!( kdtree.nearest(&a.0, 0, &squaredeuclidean).unwrap(), vec![] ); asserteq!( kdtree.nearest(&a.0, 1, &squaredeuclidean).unwrap(), vec![(0f64, &0)] ); asserteq!( kdtree.nearest(&a.0, 2, &squaredeuclidean).unwrap(), vec![(0f64, &0), (2f64, &1)] ); asserteq!( kdtree.nearest(&a.0, 3, &squaredeuclidean).unwrap(), vec![(0f64, &0), (2f64, &1), (8f64, &2)] ); asserteq!( kdtree.nearest(&a.0, 4, &squaredeuclidean).unwrap(), vec![(0f64, &0), (2f64, &1), (8f64, &2), (18f64, &3)] ); asserteq!( kdtree.nearest(&a.0, 5, &squaredeuclidean).unwrap(), vec![(0f64, &0), (2f64, &1), (8f64, &2), (18f64, &3)] ); asserteq!( kdtree.nearest(&b.0, 4, &squared_euclidean).unwrap(), vec![(0f64, &1), (2f64, &0), (2f64, &2), (8f64, &3)] ); ```
cargo bench
with 2.3 GHz Intel i5-7360U:
```
cargo bench
Running target/release/deps/bench-9e622e6a4ed9b92a
running 2 tests test benchaddtokdtreewith1k3dpoints ... bench: 106 ns/iter (+/- 25) test benchnearestfromkdtreewith1k3dpoints ... bench: 1,237 ns/iter (+/- 266)
test result: ok. 0 passed; 0 failed; 0 ignored; 2 measured; 0 filtered out ``` Thanks Eh2406 for various fixes and perf improvements.
Licensed under either of
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.