#spatial #space-filling-curve #no-std #2d-3d #bounding-box #spatio-temporal

no-std 时空

仅限夜间构建的时空填充曲线库,支持 no-std

6 个版本

新版本 0.3.0 2024 年 8 月 11 日
0.2.0 2021 年 7 月 26 日
0.1.3 2020 年 12 月 13 日
0.1.1 2020 年 4 月 29 日

#13#bounding-box

Download history 18/week @ 2024-07-25 4/week @ 2024-08-01 91/week @ 2024-08-08

113 每月下载量

自定义许可证

77KB
2K SLoC

时空填充曲线 Rust 库

这是从 geomesa 的 geomesa-z3 包的部分移植。

这也是从 sfcurve 的 scala 空间填充曲线库的部分移植。

此库包含用于索引点的 2D 和 3D z-order 曲线,以及用于通过边界框索引对象的 2D 和 3D 扩展 z-order 曲线。


lib.rs:

从 Scala 基础的 geomesa-z3 库的部分移植 geomesa。部分移植 sfcurve scala 空间填充曲线库。

用于表示和查询空间对象

用于二维点索引的 Z2 曲线可以通过 SpaceFillingCurves 工厂访问。

use space_time::SpaceFillingCurves;

let curve = SpaceFillingCurves::get_point_curve(1024, -180.0, -90.0, 180.0, 90.0);
let indexed_point = curve.index(2.3522, 48.8566);
let range_of_index = curve.ranges(2.35, 48.85, 2.354, 48.857, &[]);

assert!(range_of_index
    .iter()
    .any(|r| r.lower() <= indexed_point && r.upper() >= indexed_point));

用于二维点和时间索引的 Z3 曲线可以通过 SpaceTimeFillingCurves 工厂访问。

use space_time::SpaceTimeFillingCurves;

let curve = SpaceTimeFillingCurves::get_point_curve(1024, -180.0, -90.0, 180.0, 90.0, 159753997829.0);
let indexed_point_in_time = curve.index(2.3522, 48.8566, 1587583997829.0); // Paris, France. April 22, 2020 as milliseconds since Unix Epoch.
let range_of_index = curve.ranges(2.3522, 48.85, 2.354, 48.857, 1587583997828.0, 1587583997828.0, &[]);

assert!(range_of_index.iter().any(|r| r.lower() <= indexed_point_in_time && r.upper() >= indexed_point_in_time));

扩展 Z-order 曲线用于非点。使用 XZ2SFC 进行非点的空间索引。

use space_time::SpaceFillingCurves;

let curve = SpaceFillingCurves::get_non_point_curve(12, -180.0, -90.0, 180.0, 90.0);
let indexed_polygon = curve.index(2.3522, 48.8466, 2.39, 49.9325);
let range_of_index = curve.ranges(2.0, 48.0, 3.0, 50.0, None);

assert!(range_of_index
    .iter()
    .any(|r| r.lower() <= indexed_polygon && r.upper() >= indexed_polygon));

使用 XZ3SFC 进行非点的时空索引。

use space_time::SpaceTimeFillingCurves;

let curve = SpaceTimeFillingCurves::get_non_point_curve(
    12,
    -180.0,
    -90.0,
    0.0,
    180.0,
    90.0,
    1_893_456_000.0,
);

let indexed_polygon = curve.index(
    2.3522,
    48.8466,
    1_556_496_000.0,
    2.39,
    49.9325,
    1_556_496_000.0,
);

let range_of_index = curve.ranges(2.0, 48.0, 1_556_300_000.0, 3.0, 50.0, 1_557_496_000.0, None);

assert!(range_of_index
    .iter()
    .any(|r| r.lower() <= indexed_polygon && r.upper() >= indexed_polygon));

依赖项

~615KB
~12K SLoC