#clustering #hierarchical #point #kdtree #data #tree #supercluster

supercluster-rs

Rust语言的Supercluster实现,用于快速分层点聚类

1 个不稳定版本

0.1.0 2024年2月13日

#178 in 地理空间

MIT 许可协议

34KB
647

supercluster-rs

crates.io version docs.rs docs

Supercluster的Rust语言移植版本,用于快速分层点聚类。

功能

缺点

  • Supercluster算法(目前)绑定到球面墨卡托坐标系,因此它主要用于可视化场景。这可能在将来得到改进。

替代方案

此库的主要现有替代方案是大约在同一时间编写的supercluster。以下是截至supercluster版本1.0.16的差异概述。

输入数据灵活性

该库与GeoJSON 深度绑定。例如,要将数据加载到Supercluster对象中,您必须传递 GeoJSON功能

为了提高性能、改进内存使用并增加灵活性,此supercluster-rs库不绑定到GeoJSON。相反,它操作于位置索引。因此,查询结果返回输入集合的索引。这意味着您可以使用任何输入数据结构,不仅限于GeoJSON,包括rust对象的VecGeoArrow表

"Rust-native"移植

该库也是从JS直接移植到Rust,尽可能少地更改。为了获得最佳性能,原始JS库以难以理解并扩展的方式编写。例如,在JS中,所有内部数据(即树索引、位置坐标等)都存储在JavaScript Float64Array中,库负责确保数组中的偏移量正确。

相比之下,此supercluster-rs crate移植的代码更接近"rust-native",这应该允许在将来进行更安全的重构以添加原始JS库中不存在的功能。有更多的"new-type"抽象,这样编译器就可以确保类型的准确性。

零拷贝索引

本质上,Supercluster对象是一个层次化的HashMap,其键是整数Web Mercator缩放级别,值是该缩放级别的K-D树索引。它是层次化的:每个缩放级别的索引仅存储下一级别的簇,而不是整个数据集,这有助于更好地扩展。

该库是在geo-index crate的基础上实现的,它定义了用于与JavaScript和Python等语言FFI集成的零拷贝空间索引。这使未来工作能够通过FFI将此supercluster-rs库与其他语言连接,而无需序列化。

未来工作

  • 支持非Web Mercator投影。

依赖项

~0.8–1.4MB
~34K SLoC