kdtree 0.7.0

K-dimensional tree in Rust for fast geospatial indexing and nearest neighbors lookup
Documentation
# kdtree [![rust]https://github.com/mrhooray/kdtree-rs/actions/workflows/rust.yaml/badge.svg]https://github.com/mrhooray/kdtree-rs/actions/workflows/rust.yaml [![crates.io]https://img.shields.io/crates/v/kdtree.svg]https://crates.io/crates/kdtree [![docs]https://docs.rs/kdtree/badge.svg]https://docs.rs/kdtree [![license]https://img.shields.io/crates/l/kdtree.svg?maxAge=2592000]https://github.com/mrhooray/kdtree-rs#license

> K-dimensional tree in Rust for fast geospatial indexing and nearest neighbors lookup

- [Crate]https://crates.io/crates/kdtree
- [Documentation]https://docs.rs/kdtree
- [Usage]#usage
- [Benchmark]#benchmark
- [License]#license

## Usage

Add `kdtree` to `Cargo.toml`

```toml
[dependencies]
kdtree = "0.7.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();

assert_eq!(kdtree.size(), 4);
assert_eq!(
    kdtree.nearest(&a.0, 0, &squared_euclidean).unwrap(),
    vec![]
);
assert_eq!(
    kdtree.nearest(&a.0, 1, &squared_euclidean).unwrap(),
    vec![(0f64, &0)]
);
assert_eq!(
    kdtree.nearest(&a.0, 2, &squared_euclidean).unwrap(),
    vec![(0f64, &0), (2f64, &1)]
);
assert_eq!(
    kdtree.nearest(&a.0, 3, &squared_euclidean).unwrap(),
    vec![(0f64, &0), (2f64, &1), (8f64, &2)]
);
assert_eq!(
    kdtree.nearest(&a.0, 4, &squared_euclidean).unwrap(),
    vec![(0f64, &0), (2f64, &1), (8f64, &2), (18f64, &3)]
);
assert_eq!(
    kdtree.nearest(&a.0, 5, &squared_euclidean).unwrap(),
    vec![(0f64, &0), (2f64, &1), (8f64, &2), (18f64, &3)]
);
assert_eq!(
    kdtree.nearest(&b.0, 4, &squared_euclidean).unwrap(),
    vec![(0f64, &1), (2f64, &0), (2f64, &2), (8f64, &3)]
);
```

## Benchmark

`cargo bench` with 2.3 GHz Intel i5-7360U:

```
cargo bench
     Running target/release/deps/bench-9e622e6a4ed9b92a

running 2 tests
test bench_add_to_kdtree_with_1k_3d_points       ... bench:         106 ns/iter (+/- 25)
test bench_nearest_from_kdtree_with_1k_3d_points ... bench:       1,237 ns/iter (+/- 266)

test result: ok. 0 passed; 0 failed; 0 ignored; 2 measured; 0 filtered out
```

Thanks [Eh2406](https://github.com/Eh2406) for various fixes and perf improvements.

## License

Licensed under either of

- Apache License, Version 2.0 ([LICENSE-APACHE]LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT License ([LICENSE-MIT]LICENSE-MIT or http://opensource.org/licenses/MIT)

at your option.

### Contribution

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.