#gis #computational-geometry #polygon #position #algorithm #label #finding

polylabel

一个用于寻找最佳多边形标签位置的 Polylabel 算法的 Rust 实现

39 个版本 (稳定)

3.2.0 2024年2月26日
3.1.0 2023年11月28日
2.5.0 2023年7月13日
2.4.3 2023年3月14日
0.1.6 2016年10月12日

#33 in 地理空间

Download history 12/week @ 2024-04-08 19/week @ 2024-04-15 25/week @ 2024-04-22 20/week @ 2024-04-29 6/week @ 2024-05-06 52/week @ 2024-05-13 103/week @ 2024-05-20 64/week @ 2024-05-27 44/week @ 2024-06-03 26/week @ 2024-06-10 97/week @ 2024-06-17 8/week @ 2024-06-24 84/week @ 2024-07-08 72/week @ 2024-07-15 85/week @ 2024-07-22

每月242次 下载
用于 4 crate

MIT 许可证

400KB
630

Test and Build Coverage Status

Polylabel-rs

Polylabel 算法的 Rust 实现

橙色圆点是多边形质心。青色圆点是理想的标签位置。红色框表示搜索空间。 GIF

您可以通过克隆此仓库,切换到 visualise 分支,并打开 visualise.ipynb Jupyter 笔记本,然后逐个单元格运行来生成此可视化。您还可以使用笔记本轻松可视化您自己的多边形。

使用方法

extern crate polylabel;
use polylabel::polylabel;

extern crate geo;
use geo::{Point, Polygon};

let coords = vec![
    (0.0, 0.0),
    (4.0, 0.0),
    (4.0, 1.0),
    (1.0, 1.0),
    (1.0, 4.0),
    (0.0, 4.0),
    (0.0, 0.0)
];
let poly = Polygon::new(coords.into(), vec![]);
let label_pos = polylabel(&poly, &0.10);
// Point(0.5625, 0.5625)

命令行工具

提供了一个命令行工具:cargo install polylabel_cmd。这启用了 polylabel 命令,该命令以 GeoJSON 文件作为输入,以及一个可选的(-t / --tolerance)容忍值。更多信息请参阅 crates.io

文档

https://docs.rs/polylabel

FFI

启用 Cargo 的 ffiheaders 功能以启用此功能

使用以下三个必填参数调用 polylabel_ffi

  • Array (一个有两个字段的 struct)
    • data:一个指向两个元素 c_double 数组的空指针,每个数组代表多边形外部壳上的一个点)
    • len:表示data数组长度的,一个size_t类型。
  • WrapperArray(一个包含两个字段的结构体)
    • data:指向一个Array数组的一个空指针,每个条目代表一个内部多边形环。如果没有环,则为空。
    • len:表示data数组长度的,一个size_t类型。如果为空,则为0。
  • tolerance,一个c_double

该函数返回一个包含两个c_double字段的struct

  • x_pos
  • y_pos

头文件位于include目录下。一个Python示例可以在ffi.py中找到。

自动生成的头文件可在include/header.h中找到。

性能与精度

使用一个4核心2.3GHz的Intel Core i5处理器,在具有约9k个顶点(代表挪威大陆)的多边形上找到标签位置,容忍度为1.0,大约需要9毫秒。根据您多边形的尺寸,可能需要更高的容忍度(即更小的数字)。有关每个小数位提供的精度的指导,请参见这里

二进制文件

可在发布版中找到。

许可证

MIT

依赖项

~8.5MB
~131K SLoC