#buffer #padding #offset #graphics #setback #straight-skeleton

geo-buf

This crate provides methods to buffer (to inflate or deflate) certain primitive geometric types in the GeoRust ecosystem via a straight skeleton. This crate builds upon the (presumably abandoned) geo-buffer crate.

3 unstable releases

0.1.0 Jan 23, 2025
0.0.3 Jan 23, 2025
0.0.2 Jan 23, 2025

#368 in Algorithms

Download history 327/week @ 2025-01-22

327 downloads per month

Apache-2.0

95KB
1.5K SLoC

geo-buf

Rust 1.68+ Cargo 1.68+

The geo-buf crate provides methods to buffer (to enlarge or reduce) certain primitive geometric types in the GeoRust ecosystem via a straight skeleton.

It is forked from the geo-buffer crate published here

This crate can handle simple polygons properly as well as non-convex polygons, (valid) sets of polygons, and polygons with one or more holes. Note that each method assumes valid primitives as a parameter, but Polygon/MultiPolygon modules do not enforce this validity automatically nor does this crate. (See more details on 'Validity' in Polygon/MultiPolygon and OGC standards.)

This crate uses a straight skeleton to buffer (multi-)polygons. You can also compute a straight skeleton separately by proper methods.

For now, the only viable geometric primitives are Polygon and MultiPolygon (the rest of the primitives will be added as well).

You can choose a style of convex corners with either options; mitter-joined or round-joined. (See more details on the document.)

Quick Guide

The buffer_polygon() function (resp. buffer_multi_polygon() function) produces a MultiPolygon after applying an buffer operation to the given Polygon (resp. MultiPolygon). The absolute value of the argument passed with determines the distance between each edge of the result multi-polygon and the original input. The sign determines the direction where the result expands. Positive values mean it goes outward — that is, it inflates, — and negative values mean goes inward — it deflates —.

Code snippets below is a brief guide to use this crate. Click 'Result' to expand the visualized result. (The red polygon designates the input, and the orange one designates the results.)

Example

use geo_buf::buffer_polygon;
use geo::{Polygon, MultiPolygon, LineString};

let p1 = Polygon::new(
    LineString::from(vec![(0., 0.), (1., 0.), (1., 1.), (0., 1.)]), vec![],
);
let p2: MultiPolygon = buffer_polygon(&p1, -0.2);

let expected_exterior = LineString::from(vec![(0.2, 0.2), (0.8, 0.2), (0.8, 0.8), (0.2, 0.8), (0.2, 0.2)]);
assert_eq!(&expected_exterior, p2.0[0].exterior())

Result

Usage

[dependencies]
geo-buf = "0.0.3"

Dependencies

[dependencies]
geo-types = "0.7.15"
geo = "0.29.3"

Main Contributor

License

The geo-buf crate is licensed under the Apache License (Version 2.0)

Contact

Dependencies

~8.5MB
~143K SLoC