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中使用
320KB
3K SLoC
Contour-isobands-rs
通过对方格值数组应用行进方格算法计算等高线(即包围两个给定值之间所有点的等高线多边形)
使用方法
基础
将以下内容添加到您的 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_origin
、y_origin
、x_step
和 y_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