Struct geo::Polygon[][src]

pub struct Polygon<T> where
    T: CoordNum
{ /* fields omitted */ }

A bounded two-dimensional area.

A Polygon’s outer boundary (exterior ring) is represented by a LineString. It may contain zero or more holes (interior rings), also represented by LineStrings.

A Polygon can be created with the Polygon::new constructor or the polygon! macro.

Semantics

The boundary of the polygon is the union of the boundaries of the exterior and interiors. The interior is all the points inside the polygon (not on the boundary).

The Polygon structure guarantees that all exterior and interior rings will be closed, such that the first and last Coordinate of each ring has the same value.

Validity

  • The exterior and interior rings must be valid LinearRings (see LineString).

  • No two rings in the boundary may cross, and may intersect at a Point only as a tangent. In other words, the rings must be distinct, and for every pair of common points in two of the rings, there must be a neighborhood (a topological open set) around one that does not contain the other point.

  • The closure of the interior of the Polygon must equal the Polygon itself. For instance, the exterior may not contain a spike.

  • The interior of the polygon must be a connected point-set. That is, any two distinct points in the interior must admit a curve between these two that lies in the interior.

Refer to section 6.1.11.1 of the OGC-SFA for a formal definition of validity. Besides the closed LineString guarantee, the Polygon structure does not enforce validity at this time. For example, it is possible to construct a Polygon that has:

  • fewer than 3 coordinates per LineString ring
  • interior rings that intersect other interior rings
  • interior rings that extend beyond the exterior ring

LineString closing operation

Some APIs on Polygon result in a closing operation on a LineString. The operation is as follows:

If a LineString’s first and last Coordinate have different values, a new Coordinate will be appended to the LineString with a value equal to the first Coordinate.

Implementations

impl<T> Polygon<T> where
    T: CoordNum
[src]

pub fn new(
    exterior: LineString<T>,
    interiors: Vec<LineString<T>, Global>
) -> Polygon<T>
[src]

Create a new Polygon with the provided exterior LineString ring and interior LineString rings.

Upon calling new, the exterior and interior LineString rings will be closed.

Examples

Creating a Polygon with no interior rings:

use geo_types::{LineString, Polygon};

let polygon = Polygon::new(
    LineString::from(vec![(0., 0.), (1., 1.), (1., 0.), (0., 0.)]),
    vec![],
);

Creating a Polygon with an interior ring:

use geo_types::{LineString, Polygon};

let polygon = Polygon::new(
    LineString::from(vec![(0., 0.), (1., 1.), (1., 0.), (0., 0.)]),
    vec![LineString::from(vec![
        (0.1, 0.1),
        (0.9, 0.9),
        (0.9, 0.1),
        (0.1, 0.1),
    ])],
);

If the first and last Coordinates of the exterior or interior LineStrings no longer match, those LineStrings will be closed:

use geo_types::{Coordinate, LineString, Polygon};

let mut polygon = Polygon::new(LineString::from(vec![(0., 0.), (1., 1.), (1., 0.)]), vec![]);

assert_eq!(
    polygon.exterior(),
    &LineString::from(vec![(0., 0.), (1., 1.), (1., 0.), (0., 0.),])
);

pub fn into_inner(self) -> (LineString<T>, Vec<LineString<T>, Global>)[src]

Consume the Polygon, returning the exterior LineString ring and a vector of the interior LineString rings.

Examples

use geo_types::{LineString, Polygon};

let mut polygon = Polygon::new(
    LineString::from(vec![(0., 0.), (1., 1.), (1., 0.), (0., 0.)]),
    vec![LineString::from(vec![
        (0.1, 0.1),
        (0.9, 0.9),
        (0.9, 0.1),
        (0.1, 0.1),
    ])],
);

let (exterior, interiors) = polygon.into_inner();

assert_eq!(
    exterior,
    LineString::from(vec![(0., 0.), (1., 1.), (1., 0.), (0., 0.),])
);

assert_eq!(
    interiors,
    vec![LineString::from(vec![
        (0.1, 0.1),
        (0.9, 0.9),
        (0.9, 0.1),
        (0.1, 0.1),
    ])]
);

pub fn exterior(&self) -> &LineString<T>[src]

Return a reference to the exterior LineString ring.

Examples

use geo_types::{LineString, Polygon};

let exterior = LineString::from(vec![(0., 0.), (1., 1.), (1., 0.), (0., 0.)]);

let polygon = Polygon::new(exterior.clone(), vec![]);

assert_eq!(polygon.exterior(), &exterior);

pub fn exterior_mut<F>(&mut self, f: F) where
    F: FnOnce(&mut LineString<T>), 
[src]

Execute the provided closure f, which is provided with a mutable reference to the exterior LineString ring.

After the closure executes, the exterior LineString will be closed.

Examples

use geo_types::{Coordinate, LineString, Polygon};

let mut polygon = Polygon::new(
    LineString::from(vec![(0., 0.), (1., 1.), (1., 0.), (0., 0.)]),
    vec![],
);

polygon.exterior_mut(|exterior| {
    exterior.0[1] = Coordinate { x: 1., y: 2. };
});

assert_eq!(
    polygon.exterior(),
    &LineString::from(vec![(0., 0.), (1., 2.), (1., 0.), (0., 0.),])
);

If the first and last Coordinates of the exterior LineString no longer match, the LineString will be closed:

use geo_types::{Coordinate, LineString, Polygon};

let mut polygon = Polygon::new(
    LineString::from(vec![(0., 0.), (1., 1.), (1., 0.), (0., 0.)]),
    vec![],
);

polygon.exterior_mut(|exterior| {
    exterior.0[0] = Coordinate { x: 0., y: 1. };
});

assert_eq!(
    polygon.exterior(),
    &LineString::from(vec![(0., 1.), (1., 1.), (1., 0.), (0., 0.), (0., 1.),])
);

pub fn interiors(&self) -> &[LineString<T>][src]

Return a slice of the interior LineString rings.

Examples

use geo_types::{Coordinate, LineString, Polygon};

let interiors = vec![LineString::from(vec![
    (0.1, 0.1),
    (0.9, 0.9),
    (0.9, 0.1),
    (0.1, 0.1),
])];

let polygon = Polygon::new(
    LineString::from(vec![(0., 0.), (1., 1.), (1., 0.), (0., 0.)]),
    interiors.clone(),
);

assert_eq!(interiors, polygon.interiors());

pub fn interiors_mut<F>(&mut self, f: F) where
    F: FnOnce(&mut [LineString<T>]), 
[src]

Execute the provided closure f, which is provided with a mutable reference to the interior LineString rings.

After the closure executes, each of the interior LineStrings will be closed.

Examples

use geo_types::{Coordinate, LineString, Polygon};

let mut polygon = Polygon::new(
    LineString::from(vec![(0., 0.), (1., 1.), (1., 0.), (0., 0.)]),
    vec![LineString::from(vec![
        (0.1, 0.1),
        (0.9, 0.9),
        (0.9, 0.1),
        (0.1, 0.1),
    ])],
);

polygon.interiors_mut(|interiors| {
    interiors[0].0[1] = Coordinate { x: 0.8, y: 0.8 };
});

assert_eq!(
    polygon.interiors(),
    &[LineString::from(vec![
        (0.1, 0.1),
        (0.8, 0.8),
        (0.9, 0.1),
        (0.1, 0.1),
    ])]
);

If the first and last Coordinates of any interior LineString no longer match, those LineStrings will be closed:

use geo_types::{Coordinate, LineString, Polygon};

let mut polygon = Polygon::new(
    LineString::from(vec![(0., 0.), (1., 1.), (1., 0.), (0., 0.)]),
    vec![LineString::from(vec![
        (0.1, 0.1),
        (0.9, 0.9),
        (0.9, 0.1),
        (0.1, 0.1),
    ])],
);

polygon.interiors_mut(|interiors| {
    interiors[0].0[0] = Coordinate { x: 0.1, y: 0.2 };
});

assert_eq!(
    polygon.interiors(),
    &[LineString::from(vec![
        (0.1, 0.2),
        (0.9, 0.9),
        (0.9, 0.1),
        (0.1, 0.1),
        (0.1, 0.2),
    ])]
);

pub fn interiors_push(&mut self, new_interior: impl Into<LineString<T>>)[src]

Add an interior ring to the Polygon.

The new LineString interior ring will be closed:

Examples

use geo_types::{Coordinate, LineString, Polygon};

let mut polygon = Polygon::new(
    LineString::from(vec![(0., 0.), (1., 1.), (1., 0.), (0., 0.)]),
    vec![],
);

assert_eq!(polygon.interiors().len(), 0);

polygon.interiors_push(vec![(0.1, 0.1), (0.9, 0.9), (0.9, 0.1)]);

assert_eq!(
    polygon.interiors(),
    &[LineString::from(vec![
        (0.1, 0.1),
        (0.9, 0.9),
        (0.9, 0.1),
        (0.1, 0.1),
    ])]
);

impl<T> Polygon<T> where
    T: CoordFloat + Signed
[src]

pub fn is_convex(&self) -> bool[src]

👎 Deprecated since 0.6.1:

Please use geo::is_convex on poly.exterior() instead

Determine whether a Polygon is convex

Trait Implementations

impl<T> AbsDiffEq<Polygon<T>> for Polygon<T> where
    T: AbsDiffEq<T, Epsilon = T> + CoordNum
[src]

type Epsilon = T

Used for specifying relative comparisons.

pub fn abs_diff_eq(
    &self,
    other: &Polygon<T>,
    epsilon: <Polygon<T> as AbsDiffEq<Polygon<T>>>::Epsilon
) -> bool
[src]

Equality assertion with an absolute limit.

Examples

use geo_types::{Polygon, polygon};

let a: Polygon<f32> = polygon![(x: 0., y: 0.), (x: 5., y: 0.), (x: 7., y: 9.), (x: 0., y: 0.)];
let b: Polygon<f32> = polygon![(x: 0., y: 0.), (x: 5., y: 0.), (x: 7.01, y: 9.), (x: 0., y: 0.)];

approx::assert_abs_diff_eq!(a, b, epsilon=0.1);
approx::assert_abs_diff_ne!(a, b, epsilon=0.001);

impl<T> Area<T> for Polygon<T> where
    T: CoordFloat
[src]

Note. The implementation handles polygons whose holes do not all have the same orientation. The sign of the output is the same as that of the exterior shell.

impl<T> BoundingRect<T> for Polygon<T> where
    T: CoordNum
[src]

type Output = Option<Rect<T>>

fn bounding_rect(&self) -> Self::Output[src]

Return the BoundingRect for a Polygon

impl<T> Centroid for Polygon<T> where
    T: GeoFloat
[src]

type Output = Option<Point<T>>

impl<T> ChamberlainDuquetteArea<T> for Polygon<T> where
    T: Float + CoordNum
[src]

impl<T> Clone for Polygon<T> where
    T: Clone + CoordNum
[src]

impl<F: GeoFloat> ClosestPoint<F, Point<F>> for Polygon<F>[src]

impl<T> ConcaveHull for Polygon<T> where
    T: GeoFloat + RTreeNum
[src]

type Scalar = T

impl<T> Contains<Coordinate<T>> for Polygon<T> where
    T: GeoNum
[src]

impl<T> Contains<Line<T>> for Polygon<T> where
    T: GeoFloat
[src]

impl<T> Contains<LineString<T>> for Polygon<T> where
    T: GeoFloat
[src]

impl<T> Contains<Point<T>> for Polygon<T> where
    T: GeoNum
[src]

impl<F> Contains<Polygon<F>> for MultiPolygon<F> where
    F: GeoFloat
[src]

impl<T> Contains<Polygon<T>> for Polygon<T> where
    T: GeoFloat
[src]

impl<T> ConvexHull for Polygon<T> where
    T: GeoNum
[src]

type Scalar = T

impl<T> CoordinatePosition for Polygon<T> where
    T: GeoNum
[src]

type Scalar = T

impl<'a, T: CoordNum + 'a> CoordsIter<'a> for Polygon<T>[src]

type Iter = Chain<Copied<Iter<'a, Coordinate<T>>>, Flatten<MapCoordsIter<'a, T, Iter<'a, LineString<T>>, LineString<T>>>>

type ExteriorIter = Copied<Iter<'a, Coordinate<T>>>

type Scalar = T

fn coords_count(&'a self) -> usize[src]

Return the number of coordinates in the Polygon.

impl<T> Debug for Polygon<T> where
    T: Debug + CoordNum
[src]

impl<T> Eq for Polygon<T> where
    T: Eq + CoordNum
[src]

impl<T> EuclideanDistance<T, Line<T>> for Polygon<T> where
    T: GeoFloat + FloatConst + Signed + RTreeNum
[src]

impl<T> EuclideanDistance<T, LineString<T>> for Polygon<T> where
    T: GeoFloat + FloatConst + Signed + RTreeNum
[src]

Polygon to LineString distance

impl<T> EuclideanDistance<T, Point<T>> for Polygon<T> where
    T: GeoFloat
[src]

fn euclidean_distance(&self, point: &Point<T>) -> T[src]

Minimum distance from a Polygon to a Point

impl<T> EuclideanDistance<T, Polygon<T>> for Point<T> where
    T: GeoFloat
[src]

fn euclidean_distance(&self, polygon: &Polygon<T>) -> T[src]

Minimum distance from a Point to a Polygon

impl<T> EuclideanDistance<T, Polygon<T>> for Line<T> where
    T: GeoFloat + Signed + RTreeNum + FloatConst
[src]

impl<T> EuclideanDistance<T, Polygon<T>> for LineString<T> where
    T: GeoFloat + FloatConst + Signed + RTreeNum
[src]

LineString to Polygon

impl<T> EuclideanDistance<T, Polygon<T>> for Polygon<T> where
    T: GeoFloat + FloatConst + RTreeNum
[src]

fn euclidean_distance(&self, poly2: &Polygon<T>) -> T[src]

This implementation has a “fast path” in cases where both input polygons are convex: it switches to an implementation of the “rotating calipers” method described in Pirzadeh (1999), pp24—30, which is approximately an order of magnitude faster than the standard method.

impl<T> From<Polygon<T>> for Geometry<T> where
    T: CoordNum
[src]

impl<T> From<Rect<T>> for Polygon<T> where
    T: CoordNum
[src]

impl<T> From<Triangle<T>> for Polygon<T> where
    T: CoordNum
[src]

impl<C: CoordNum> HasDimensions for Polygon<C>[src]

impl<T> Hash for Polygon<T> where
    T: Hash + CoordNum
[src]

impl<T> Intersects<Coordinate<T>> for Polygon<T> where
    T: GeoNum
[src]

impl<T> Intersects<Geometry<T>> for Polygon<T> where
    Geometry<T>: Intersects<Polygon<T>>,
    T: CoordNum
[src]

impl<T> Intersects<GeometryCollection<T>> for Polygon<T> where
    GeometryCollection<T>: Intersects<Polygon<T>>,
    T: CoordNum
[src]

impl<T> Intersects<Line<T>> for Polygon<T> where
    T: GeoNum
[src]

impl<T> Intersects<LineString<T>> for Polygon<T> where
    LineString<T>: Intersects<Polygon<T>>,
    T: CoordNum
[src]

impl<T> Intersects<MultiLineString<T>> for Polygon<T> where
    MultiLineString<T>: Intersects<Polygon<T>>,
    T: CoordNum
[src]

impl<T> Intersects<MultiPoint<T>> for Polygon<T> where
    MultiPoint<T>: Intersects<Polygon<T>>,
    T: CoordNum
[src]

impl<T> Intersects<MultiPolygon<T>> for Polygon<T> where
    MultiPolygon<T>: Intersects<Polygon<T>>,
    T: CoordNum
[src]

impl<T> Intersects<Point<T>> for Polygon<T> where
    Point<T>: Intersects<Polygon<T>>,
    T: CoordNum
[src]

impl<T> Intersects<Polygon<T>> for Coordinate<T> where
    Polygon<T>: Intersects<Coordinate<T>>,
    T: CoordNum
[src]

impl<T> Intersects<Polygon<T>> for Line<T> where
    Polygon<T>: Intersects<Line<T>>,
    T: CoordNum
[src]

impl<T> Intersects<Polygon<T>> for Rect<T> where
    Polygon<T>: Intersects<Rect<T>>,
    T: CoordNum
[src]

impl<T> Intersects<Polygon<T>> for Polygon<T> where
    T: GeoNum
[src]

impl<T> Intersects<Rect<T>> for Polygon<T> where
    T: GeoNum
[src]

impl<T> Intersects<Triangle<T>> for Polygon<T> where
    Triangle<T>: Intersects<Polygon<T>>,
    T: CoordNum
[src]

impl<T: CoordNum, NT: CoordNum> MapCoords<T, NT> for Polygon<T>[src]

type Output = Polygon<NT>

impl<T: CoordNum> MapCoordsInplace<T> for Polygon<T>[src]

impl<T> Orient for Polygon<T> where
    T: GeoNum
[src]

impl<T> PartialEq<Polygon<T>> for Polygon<T> where
    T: PartialEq<T> + CoordNum
[src]

impl<F: GeoFloat> Relate<F, GeometryCollection<F>> for Polygon<F>[src]

impl<F: GeoFloat> Relate<F, Line<F>> for Polygon<F>[src]

impl<F: GeoFloat> Relate<F, LineString<F>> for Polygon<F>[src]

impl<F: GeoFloat> Relate<F, MultiLineString<F>> for Polygon<F>[src]

impl<F: GeoFloat> Relate<F, MultiPoint<F>> for Polygon<F>[src]

impl<F: GeoFloat> Relate<F, MultiPolygon<F>> for Polygon<F>[src]

impl<F: GeoFloat> Relate<F, Point<F>> for Polygon<F>[src]

impl<F: GeoFloat> Relate<F, Polygon<F>> for Point<F>[src]

impl<F: GeoFloat> Relate<F, Polygon<F>> for Line<F>[src]

impl<F: GeoFloat> Relate<F, Polygon<F>> for LineString<F>[src]

impl<F: GeoFloat> Relate<F, Polygon<F>> for Polygon<F>[src]

impl<F: GeoFloat> Relate<F, Polygon<F>> for MultiPoint<F>[src]

impl<F: GeoFloat> Relate<F, Polygon<F>> for MultiLineString<F>[src]

impl<F: GeoFloat> Relate<F, Polygon<F>> for MultiPolygon<F>[src]

impl<F: GeoFloat> Relate<F, Polygon<F>> for Rect<F>[src]

impl<F: GeoFloat> Relate<F, Polygon<F>> for Triangle<F>[src]

impl<F: GeoFloat> Relate<F, Polygon<F>> for GeometryCollection<F>[src]

impl<F: GeoFloat> Relate<F, Rect<F>> for Polygon<F>[src]

impl<F: GeoFloat> Relate<F, Triangle<F>> for Polygon<F>[src]

impl<T> RelativeEq<Polygon<T>> for Polygon<T> where
    T: AbsDiffEq<T, Epsilon = T> + CoordNum + RelativeEq<T>, 
[src]

pub fn relative_eq(
    &self,
    other: &Polygon<T>,
    epsilon: <Polygon<T> as AbsDiffEq<Polygon<T>>>::Epsilon,
    max_relative: <Polygon<T> as AbsDiffEq<Polygon<T>>>::Epsilon
) -> bool
[src]

Equality assertion within a relative limit.

Examples

use geo_types::{Polygon, polygon};

let a: Polygon<f32> = polygon![(x: 0., y: 0.), (x: 5., y: 0.), (x: 7., y: 9.), (x: 0., y: 0.)];
let b: Polygon<f32> = polygon![(x: 0., y: 0.), (x: 5., y: 0.), (x: 7.01, y: 9.), (x: 0., y: 0.)];

approx::assert_relative_eq!(a, b, max_relative=0.1);
approx::assert_relative_ne!(a, b, max_relative=0.001);

impl<T> Rotate<T> for Polygon<T> where
    T: GeoFloat
[src]

fn rotate(&self, angle: T) -> Self[src]

Rotate the Polygon about its centroid by the given number of degrees

impl<T> Simplify<T, T> for Polygon<T> where
    T: GeoFloat
[src]

impl<T> SimplifyVW<T, T> for Polygon<T> where
    T: CoordFloat
[src]

impl<T> SimplifyVWPreserve<T, T> for Polygon<T> where
    T: CoordFloat + RTreeNum
[src]

impl<T> StructuralEq for Polygon<T> where
    T: CoordNum
[src]

impl<T> StructuralPartialEq for Polygon<T> where
    T: CoordNum
[src]

impl<T> TryFrom<Geometry<T>> for Polygon<T> where
    T: CoordNum
[src]

Convert a Geometry enum into its inner type.

Fails if the enum case does not match the type you are trying to convert it to.

type Error = Error

The type returned in the event of a conversion error.

impl<T: CoordNum, NT: CoordNum> TryMapCoords<T, NT> for Polygon<T>[src]

type Output = Polygon<NT>

Auto Trait Implementations

impl<T> RefUnwindSafe for Polygon<T> where
    T: RefUnwindSafe

impl<T> Send for Polygon<T> where
    T: Send

impl<T> Sync for Polygon<T> where
    T: Sync

impl<T> Unpin for Polygon<T> where
    T: Unpin

impl<T> UnwindSafe for Polygon<T> where
    T: UnwindSafe

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<'a, T, G> Extremes<'a, T> for G where
    T: CoordNum,
    G: CoordsIter<'a, Scalar = T>, 
[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T, G> RotatePoint<T> for G where
    T: CoordFloat,
    G: MapCoords<T, T, Output = G>, 
[src]

impl<T> Same<T> for T

type Output = T

Should always be Self

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

impl<T, G> Translate<T> for G where
    T: CoordNum,
    G: MapCoords<T, T, Output = G> + MapCoordsInplace<T>, 
[src]

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.