14 个版本

0.2.11 2024 年 5 月 9 日
0.2.10 2024 年 5 月 8 日
0.2.9 2024 年 2 月 11 日
0.2.2 2024 年 1 月 14 日
0.1.0 2023 年 8 月 10 日

地理空间 中排名 67

Download history 5/week @ 2024-04-26 182/week @ 2024-05-03 129/week @ 2024-05-10 16/week @ 2024-05-17 21/week @ 2024-05-24 15/week @ 2024-05-31 33/week @ 2024-06-07 35/week @ 2024-06-14 171/week @ 2024-06-21 188/week @ 2024-06-28 259/week @ 2024-07-05 91/week @ 2024-07-12 71/week @ 2024-07-19 140/week @ 2024-07-26 83/week @ 2024-08-02 66/week @ 2024-08-09

每月下载量 362

MIT/Apache 许可证

43KB
970 行代码(不包括注释)

sif-rtree

crates.io docs.rs github.com

一个简单的库,实现了 R-tree 的不可变、平面表示,支持多种空间查询、近邻搜索和基于内存映射的存储。

许可证

许可协议:

根据您的要求。

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意提交以包含在作品中的任何贡献,将按照上述方式双重许可,没有任何额外的条款或条件。


lib.rs:

一个简单的库,实现了 R-tree 的不可变、平面表示

该库使用与 rstar crate 相同的向上批量加载算法,以最小化重叠。它支持多种空间查询、近邻搜索,并且由于索引对象在构建后固定,因此具有简单的实现。这也使得内存布局扁平化,便于缓存,并可以由内存映射支持。

该库提供与 [serde] 的可选集成,用于树的结构化和反结构化。

示例

use std::ops::ControlFlow;

use sif_rtree::{DEF_NODE_LEN, Distance, RTree, Object};

struct Something(usize, [f64; 2]);

impl Object for Something {
    type Point = [f64; 2];

    fn aabb(&self) -> (Self::Point, Self::Point) {
        (self.1, self.1)
    }
}

impl Distance<[f64; 2]> for Something {
    fn distance_2(&self, point: &[f64; 2]) -> f64 {
        self.1.distance_2(point)
    }
}

let index = RTree::new(
    DEF_NODE_LEN,
    vec![
        Something(0, [-0.4, -3.3]),
        Something(1, [-4.5, -1.8]),
        Something(2, [0.7, 2.0]),
        Something(3, [1.7, 1.5]),
        Something(4, [-1.3, 2.3]),
        Something(5, [2.2, 1.0]),
        Something(6, [-3.7, 3.8]),
        Something(7, [-3.2, -0.1]),
        Something(8, [1.4, 2.7]),
        Something(9, [3.1, -0.0]),
        Something(10, [4.3, 0.8]),
        Something(11, [3.9, -3.3]),
        Something(12, [0.4, -3.2]),
    ],
);

let mut close_by = Vec::new();

index.look_up_within_distance_of_point(&[0., 0.], 3., |thing| {
    close_by.push(thing.0);

    ControlFlow::Continue(())
});

assert_eq!(close_by, [3, 5, 4, 2]);

《RTree》数据结构在其底层存储上具有泛型特性,只要它可以通过AsRef特性转换为切片。例如,可以使用它将持久存储中的R树内存映射。

use std::fs::File;
use std::mem::size_of;
use std::slice::from_raw_parts;

use memmap2::Mmap;

use sif_rtree::{Node, Object, Point, RTree};

#[derive(Clone, Copy)]
struct Triangle([[f64; 3]; 3]);

impl Object for Triangle {
    type Point = [f64; 3];

    fn aabb(&self) -> (Self::Point, Self::Point) {
        let min = self.0[0].min(&self.0[1]).min(&self.0[2]);
        let max = self.0[0].max(&self.0[1]).max(&self.0[2]);
        (min, max)
    }
}

let file = File::open("index.bin")?;
let map = unsafe { Mmap::map(&file)? };

struct TriangleSoup(Mmap);

impl AsRef<[Node<Triangle>]> for TriangleSoup {
    fn as_ref(&self) -> &[Node<Triangle>] {
        let ptr = self.0.as_ptr().cast();
        let len = self.0.len() / size_of::<Node<Triangle>>();

        unsafe { from_raw_parts(ptr, len) }
    }
}

let index = RTree::new_unchecked(TriangleSoup(map));

依赖项

~94–325KB