#geospatial #tile #mvt #bounding-box

supercluster

一个用于地理空间点聚类的非常快速的Rust crate

17个稳定版本

1.0.17 2024年7月22日
1.0.16 2024年2月6日
1.0.15 2023年12月7日
1.0.14 2023年11月27日

30 in 地理空间

Download history 24/week @ 2024-06-30 116/week @ 2024-07-21 4/week @ 2024-07-28

120 个月下载

MIT 许可证

57KB
1K SLoC

Supercluster

一个用于地理空间点聚类的非常快速的Rust crate。

此crate受到Mapbox的supercluster JS包博客文章 的启发。

参考实现

test docs crate downloads GitHub

Features

功能

  • load(points):加载一个FeatureCollection 对象。每个功能应该是一个Feature 对象。

  • get_clusters(bbox, zoom):对于给定的bbox数组([west_lng, south_lat, east_lng, north_lat])和zoom,返回一个包含聚簇和点的Feature 对象数组。

  • get_tile(z, x, y):对于给定的缩放和x/y坐标,返回一个FeatureCollection 对象。

  • get_children(cluster_id):返回一个聚簇的子聚簇(在下一个缩放级别),给定其id(来自功能属性的cluster_id值)。

  • get_leaves(cluster_id, limit, offset):返回一个聚簇的所有点(给定其cluster_id),支持分页。

  • get_cluster_expansion_zoom(cluster_id):根据集群的cluster_id返回集群扩展到多个子集群的缩放级别(对于“点击缩放”功能很有用)。

选项

选项 描述
min_zoom 生成集群的最小缩放级别。
max_zoom 生成集群的最大缩放级别。
min_points 形成集群的最小点数。
radius 集群半径,单位为像素。
extent (瓦片)瓦片范围。半径相对于此值计算。
node_size KD树的叶子节点大小。影响性能。

安全性

该crate使用#![forbid(unsafe_code)]来确保所有内容都以100%安全的方式实现Rust。

文档

有关更详细的信息,请参阅完整的文档

如果您在文档中遇到任何问题或有任何问题未得到解决,请随时提交问题

用法

在您的项目目录中运行以下Cargo命令

cargo add supercluster
use geojson::FeatureCollection;
use supercluster::{ Supercluster, Options };

fn main() {
  let options = Options {
      max_zoom: 16,
      min_zoom: 0,
      min_points: 2,
      radius: 40.0,
      node_size: 64,
      extent: 512.0,
  };

  // Create a new instance with the specified configuration settings
  let mut cluster = Supercluster::new(options);

  // Load a FeatureCollection Object into the Supercluster instance

  // [GeoJSON Format Specification § 5](https://tools.ietf.org/html/rfc7946#section-5)
  let feature_collection = FeatureCollection {
    bbox: None,
    // [GeoJSON Format Specification § 3.2](https://datatracker.ietf.org/doc/html/rfc7946#section-3.2)
    features: vec![],
    foreign_members: None,
  };
  let index = cluster.load(feature_collection);

  // Retrieve a FeatureCollection Object within a tile at the given zoom level and tile coordinates
  let tile = index.get_tile(0, 0.0, 0.0).expect("cannot get a tile");

  ...
}

贡献

构建

cargo build

测试

cargo test

运行clippy

cargo clippy --all-targets --all-features -- -D warnings

运行rustfmt

cargo fmt

以HTML格式生成文档

cargo doc --open

赞助商

Chargetrip logo

依赖项

~1.6–2.6MB
~55K SLoC