Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

https://github.com/mrhooray/kdtree-rs

K-dimensional tree in Rust for fast geospatial indexing and lookup
https://github.com/mrhooray/kdtree-rs

geo-spatial index k-dimensional nearest-neighbor-search rust search tree

Last synced: about 1 month ago
JSON representation

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

Lists

README

        

# 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.