A Rust implementation of the Polylabel algorithm
Visualised: The orange dot is the polygon centroid. The teal dot is the ideal label position.
You can generate this visualisation yourself by cloning this repo, switching to the visualise
branch, and opening the visualise.ipynb
Jupyter notebook, then stepping through the cells. You can also easily visualise a Polygon of your own using the notebook.
```rust extern crate polylabel; use polylabel::polylabel;
extern crate geo; use geo::{Point, LineString, 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 ls = LineString(coords.iter().map(|e| Point::new(e.0, e.1)).collect()); let poly = Polygon::new(ls, vec![]); let label_pos = polylabel(&poly, &0.10); // Point(0.5625, 0.5625) ```
https://docs.rs/polylabel
Call polylabel_ffi
with the following three mandatory arguments:
- Array
(a void pointer to an array of two-element c_double
s, the exterior Polygon ring)
- WrapperArray
(a void pointer to an array of Array
s, the interior Polygon rings, empty if there are none)
- tolerance
, a c_float
The function returns a struct with two c_double
fields:
- x_pos
- y_pos
A Python example is available in ffi.py
Binary libs for:
- x86_64
*nix (built using manylinux1
, thus easy to include in Python 2.7 / 3.5 / 3.6 wheels) and OS X
- i686
and x86_64
Windows
are available in releases.