#polygon #geojson #isoring #marching-squares

contour

通过使用行进方格算法计算等距环和等高线多边形

12 次重大发布

0.13.1 2024年4月30日
0.12.1 2024年3月11日
0.12.0 2023年12月2日
0.11.0 2023年10月6日
0.1.0 2019年1月21日

#35地理空间

Download history 132/week @ 2024-04-26 26/week @ 2024-05-03 28/week @ 2024-05-10 140/week @ 2024-05-17 191/week @ 2024-05-24 107/week @ 2024-05-31 98/week @ 2024-06-07 179/week @ 2024-06-14 131/week @ 2024-06-21 104/week @ 2024-06-28 137/week @ 2024-07-05 229/week @ 2024-07-12 274/week @ 2024-07-19 288/week @ 2024-07-26 144/week @ 2024-08-02 145/week @ 2024-08-09

903 每月下载量
用于 hrdf-routing-engine

MIT/Apache

200KB
1.5K SLoC

contour-rs

Build status GitHub Actions Build status Appveyor Docs.rs version

通过将行进方格算法应用于数值矩形阵列,计算等高线、等高线多边形和等高带。
输出环形坐标或 geo-types 几何形状。

结果可以轻松序列化为 GeoJSON。

注意:算法的核心是从 d3-contour 端口移植的。


使用方法

将此添加到您的 Cargo.toml

[dependencies]
contour = "0.13.1"

并将此添加到您的 crate 根目录

extern crate contour;

API公开

  • 一个ContourBuilder结构体,它为阈值值的 Vec 计算等距环坐标,并可以将它们转换为

    • Contour(包含阈值值和作为 MultiPolygon 的几何形状的类型),或者
    • Line(包含阈值值和作为 MultiLineString 的几何形状的类型)。
    • Band(包含最小值、最大值和作为 MultiPolygon 的几何形状)。
  • contour_rings 函数,它为单个阈值值计算等距环坐标(返回一个包含环形坐标的 Vec - 这是 ContourBuilder 内部使用的)。

ContourBuilder 是推荐使用此crate的方式,因为它更灵活且易于使用(它允许指定网格的原点和步长,并平滑等高线,而 contour_rings 只在网格坐标中说话,并且不会平滑结果环)。

LineContourBand 可以使用 geojson 功能序列化为 GeoJSON。

示例

不定义原点和步长

let c = ContourBuilder::new(10, 10, false); // x dim., y dim., smoothing
let res = c.contours(&vec![
    0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
    0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
    0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
    0., 0., 0., 1., 1., 1., 0., 0., 0., 0.,
    0., 0., 0., 1., 1., 1., 0., 0., 0., 0.,
    0., 0., 0., 1., 1., 1., 0., 0., 0., 0.,
    0., 0., 0., 1., 1., 1., 0., 0., 0., 0.,
    0., 0., 0., 1., 1., 1., 0., 0., 0., 0.,
    0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
    0., 0., 0., 0., 0., 0., 0., 0., 0., 0.
], &[0.5])?; // values, thresholds

有原点和步长

let c = ContourBuilder::new(10, 10, true) // x dim., y dim., smoothing
    .x_step(2) // The horizontal coordinate for the origin of the grid.
    .y_step(2) // The vertical coordinate for the origin of the grid.
    .x_origin(100) // The horizontal step for the grid
    .y_origin(200); // The vertical step for the grid

let res = c.contours(&[
0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 1., 1., 0., 1., 0., 0., 0.,
0., 0., 0., 1., 1., 0., 1., 0., 0., 0.,
0., 0., 0., 1., 1., 0., 1., 0., 0., 0.,
0., 0., 0., 1., 1., 0., 1., 0., 0., 0.,
0., 0., 0., 1., 1., 0., 1., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0.
], &[0.5]).unwrap(); // values, thresholds

使用 geojson 功能

geojson 功能默认未启用,因此您需要在您的 Cargo.toml 中指定它

[dependencies]
contour = { version = "0.13.1", features = ["geojson"] }
let c = ContourBuilder::new(10, 10, true) // x dim., y dim., smoothing
    .x_step(2) // The horizontal coordinate for the origin of the grid.
    .y_step(2) // The vertical coordinate for the origin of the grid.
    .x_origin(100) // The horizontal step for the grid
    .y_origin(200); // The vertical step for the grid

let res = c.contours(&[
0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 1., 1., 0., 1., 0., 0., 0.,
0., 0., 0., 1., 1., 0., 1., 0., 0., 0.,
0., 0., 0., 1., 1., 0., 1., 0., 0., 0.,
0., 0., 0., 1., 1., 0., 1., 0., 0., 0.,
0., 0., 0., 1., 1., 0., 1., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0.
], &[0.5]).unwrap(); // values, thresholds
println!("{:?}", res[0].to_geojson()); // prints the GeoJSON representation of the first contour

输出

Feature {
    bbox: None,
    geometry: Some(Geometry {
        bbox: None,
        value: MultiPolygon([
            [[
                [110.0, 215.0], [110.0, 213.0], [110.0, 211.0], [110.0, 209.0],
                [110.0, 207.0], [109.0, 206.0], [107.0, 206.0], [106.0, 207.0],
                [106.0, 209.0], [106.0, 211.0], [106.0, 213.0], [106.0, 215.0],
                [107.0, 216.0], [109.0, 216.0], [110.0, 215.0]
            ]],
            [[
                [114.0, 215.0], [114.0, 213.0], [114.0, 211.0], [114.0, 209.0],
                [114.0, 207.0], [113.0, 206.0], [112.0, 207.0], [112.0, 209.0],
                [112.0, 211.0], [112.0, 213.0], [112.0, 215.0], [113.0, 216.0],
                [114.0, 215.0]
            ]]
        ]),
        foreign_members: None
    }),
    id: None,
    properties: Some({"threshold": Number(0.5)}),
    foreign_members: None
}

使用 f32 功能

默认情况下,此crate期望输入为f64值,并使用f64值进行计算。如果您想使用f32值,则需要在您的 Cargo.toml 中指定f32功能

[dependencies]
contour = { version = "0.13.1", features = ["f32"] }

WASM演示

此crate编译为WebAssembly并从JavaScript中使用的演示:wasm_demo_contour

contour-isobands crate(来自mthh/contour-isobands-rs仓库)的差异

虽然此crate从等高线(cf. wikipedia:Marching_squares)计算等高线,从中推导出等高多边形(即包含所有高于给定等高线阈值点的多边形)和等值线(即包含所有在最小和最大界限之间的点的多边形),但contour-isobands-rs仅用于计算等值线,并使用稍有不同的算法来区分鞍点(cf. wikipedia:Marching_squares)。

许可证

根据您的选择,以下任一许可证

自由选择。

贡献

除非您明确声明,否则根据Apache-2.0许可证定义,您提交给包含在作品中的任何贡献都应如上所述双重许可,没有任何额外条款或条件。

依赖项

~0.7–1.2MB
~23K SLoC