#contour #polygon #geojson #isobands #marching-squares

contour-isobands

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

8个版本

0.4.3 2024年3月11日
0.4.2 2024年3月11日
0.4.1 2024年1月15日
0.3.1 2023年10月4日
0.1.0 2023年3月14日

地理空间类别的第21个

每月下载量40
mathlikeanim-rs中使用

AGPL-3.0-or-later

320KB
3K SLoC

Contour-isobands-rs

Build status GitHub Actions Docs.rs version

通过对方格值数组应用行进方格算法计算等高线(即包围两个给定值之间所有点的等高线多边形)

使用方法

基础

将以下内容添加到您的 Cargo.toml

[dependencies]
contour-isobands = "0.4.3"

然后,您可以使用 ContourBuilder 来计算等高线

use contour_isobands::{ContourBuilder, Band};

let values = vec![
    1., 1., 1., 1., 1., 1., 1.,
    1., 5., 5., 5., 5., 5., 1.,
    1., 5., 15., 15., 15., 5., 1.,
    1., 5., 10., 10., 10., 5., 1.,
    1., 5., 5., 5., 5., 5., 1.,
    1., 1., 1., 1., 1., 1., 1.,
];

// These intervals will compute 3 bands:
// - the first one will contain all points between 1 (included) and 5 (excluded)
// - the second one will contain all points between 5 (included) and 7 (excluded)
// - the third one will contain all points between 7 (included) and 15 (included)
let intervals = vec![1., 5., 7., 15.];

let result: Vec<Band> = ContourBuilder::new(7, 6)
    .use_quad_tree(true)
    .contours(&values, &intervals)?;

assert_eq!(result.len(), 3);

结果是包含几何体(MultiPolygon<f64>)和等高线最小值和最大值的 Band 结构体向量

注意,您可以使用 ContourBuilder 构造函数的 x_originy_originx_stepy_step 参数指定网格的坐标和点之间的距离(在 x 和 y 轴上)

let result: Vec<Band> = ContourBuilder::new(7, 6)
    .x_origin(-6.144721)
    .y_origin(51.781713)
    .x_step(0.118759)
    .y_step(-0.089932)
    .use_quad_tree(true)
    .contours(&values, &intervals)?;

geojson 功能

每个 Band 结构体包含一个几何体(MultiPolygon<f64>)和等高线的最小值和最大值。它可以使用 geojson 功能序列化为 geojson

[dependencies]
contour-isobands = { version = "0.4.3", features = ["geojson"] }
use contour_isobands::{ContourBuilder, Band};
use geojson::{Feature, FeatureCollection};

let values = vec![
    1., 1., 1., 1., 1., 1., 1.,
    1., 5., 5., 5., 5., 5., 1.,
    1., 5., 15., 15., 15., 5., 1.,
    1., 5., 10., 10., 10., 5., 1.,
    1., 5., 5., 5., 5., 5., 1.,
    1., 1., 1., 1., 1., 1., 1.,
];

let intervals = vec![1., 5., 7., 15.];

let result = ContourBuilder::new(7, 6)
    .use_quad_tree(true)
    .contours(&values, &intervals)?;
    
let features = result.iter()
    .map(|band| band.to_geojson())
    .collect::<Vec<geojson::Feature>>();

let geojson_string = GeoJson::from(
    FeatureCollection {
        bbox: None,
        features,
        foreign_members: None,
    }).to_string();

请注意,多边形的轮廓环是逆时针方向的,而内部环是顺时针方向的(符合 GeoJSON RFC 7946 规范)

parallel 功能

[dependencies]
contour-isobands = { version = "0.4.3", features = ["parallel"] }

parallel 功能允许使用 rayon crate 并行计算等高线。启用此功能后,ContourBuilder 结构体会公开一个 par_contours 方法

let result: Vec<Band> = ContourBuilder::new(7, 6)
    .x_origin(-6.144721)
    .y_origin(51.781713)
    .x_step(0.118759)
    .y_step(-0.089932)
    .use_quad_tree(true)
    .par_contours(&values, &intervals)?;

请注意,如果您不想使用并行处理,仍然可以使用 contours 方法(实际上,在小型网格上,并行的开销可能高于收益)

WASM演示

本仓的演示,编译成WebAssembly格式,可在https://mthh.github.io/contour-isobands-wasm/找到。

contour仓(来自mthh/contour-rs仓库)的区别

contour仓计算等高线(参看维基百科:Marching_squares)并使用它们来计算相应的等高线多边形(即包含给定等高线阈值以上所有点的多边形)和等值线带(即包含介于最小和最大边界之间所有点的等高线多边形)。此contour-isobands-rs专注于等值线带,也使用Marching squares(参看维基百科:Marching_squares#Isobands),但使用了稍有不同的实现来区分鞍点。它还提供了使用rayon仓并行计算等值线带的功能,这在计算大网格和许多阈值时的性能有显著提升。

许可证

由于本仓库主要基于https://github.com/RaumZeit/MarchingSquares.js移植,后者使用 Affero 通用公共许可证 v3.0 许可,因此本项目也采用 Affero 通用公共许可证 v3.0。有关详细信息,请参阅LICENSE文件。

依赖

~0.7–1.4MB
~28K SLoC