1 个不稳定版本
0.1.0 | 2024年2月13日 |
---|
#178 in 地理空间
34KB
647 行
supercluster-rs
Supercluster的Rust语言移植版本,用于快速分层点聚类。
功能
- 原生的Rust移植自原始JavaScript实现。
- 基于来自geo-index crate的高效零拷贝K-d树。
- 通过Arrow与Python高效连接的初始Python绑定。
缺点
- Supercluster算法(目前)绑定到球面墨卡托坐标系,因此它主要用于可视化场景。这可能在将来得到改进。
替代方案
此库的主要现有替代方案是大约在同一时间编写的supercluster
。以下是截至supercluster
版本1.0.16的差异概述。
输入数据灵活性
该库与GeoJSON 深度绑定。例如,要将数据加载到Supercluster对象中,您必须传递 GeoJSON功能。
为了提高性能、改进内存使用并增加灵活性,此supercluster-rs
库不绑定到GeoJSON。相反,它操作于位置索引。因此,查询结果返回输入集合的索引。这意味着您可以使用任何输入数据结构,不仅限于GeoJSON,包括rust对象的Vec
或GeoArrow表。
"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