Geospatial primitives and algorithms for Rust
Clone or download
bors[bot] and frewsxcv Merge #337
337: Rewrite Polygon structure to enforce closed LineString rings. r=frewsxcv a=frewsxcv

Prior to this pull request, the `exterior` and `interior` fields on a `Polygon` were public, allowing users to modify their `Coordinate`s as they saw fit.

To ensure all rings in a `Polygon`s remain closed, this pull request:

- privatizes the `exterior` and `interior` fields
- adds getters/mutators
- closes all `LineString` rings upon construction or after mutation

Fixes #166.

Co-authored-by: Corey Farwell <>
Latest commit 96c7846 Jan 22, 2019


Build Status geo on


Geospatial Primitives, Algorithms, and Utilities

The geo crate provides geospatial primitive types such as Point, LineString, and Polygon, and provides algorithms and operations such as:

  • Area and centroid calculation
  • Simplification and convex hull operations
  • Euclidean and Haversine distance measurement
  • Intersection checks
  • Transformation to and from PostGIS types
  • Affine transforms such as rotation and translation.

Please refer to the documentation for a complete list.

The primitive types also provide the basis for other functionality in the Geo ecosystem, including:


use geo::{Polygon, LineString};
use geo::convexhull::ConvexHull;

// An L shape
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)];
// conversions to geo types are provided from several kinds of coordinate sequences
let poly = Polygon::new(coords.into(), vec![]);

// uses the QuickHull algorithm to calculate the polygon's convex hull
let hull = poly.convex_hull();
let correct = vec![(0.0, 0.0), (0.0, 4.0), (1.0, 4.0), (4.0, 1.0), (4.0, 0.0), (0.0, 0.0)]
assert_eq!(hull.exterior, correct.into());


Contributions are welcome! Have a look at the issues, and open a pull request if you'd like to add an algorithm or some functionality.


Licensed under either of

at your option.


Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.