Struct geo::Polygon [−][src]
pub struct Polygon<T> where
    T: CoordNum,  { /* fields omitted */ }Expand description
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 (seeLineString).
- 
No two rings in the boundary may cross, and may intersect at a Pointonly 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 Polygonmust equal thePolygonitself. 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 LineStringring
- 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
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.),])
);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),
    ])]
);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);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.),])
);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());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),
    ])]
);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),
    ])]
);Trait Implementations
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);type Epsilon = T
type Epsilon = T
Used for specifying relative comparisons.
The default tolerance to use when testing values that are close together. Read more
The inverse of AbsDiffEq::abs_diff_eq.
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.
Find the closest point between self and p.
type Scalar = T
type Scalar = T
fn calculate_coordinate_position(
    &self, 
    coord: &Coordinate<T>, 
    is_inside: &mut bool, 
    boundary_count: &mut usize
)
Return the number of coordinates in the Polygon.
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
Iterate over all exterior and (if any) interior coordinates of a geometry. Read more
Iterate over all exterior coordinates of a geometry. Read more
impl<T> EuclideanDistance<T, Line<T>> for Polygon<T> where
    T: GeoFloat + FloatConst + Signed + RTreeNum, 
impl<T> EuclideanDistance<T, Line<T>> for Polygon<T> where
    T: GeoFloat + FloatConst + Signed + RTreeNum, 
Returns the distance between two geometries Read more
impl<T> EuclideanDistance<T, LineString<T>> for Polygon<T> where
    T: GeoFloat + FloatConst + Signed + RTreeNum, 
impl<T> EuclideanDistance<T, LineString<T>> for Polygon<T> where
    T: GeoFloat + FloatConst + Signed + RTreeNum, 
Polygon to LineString distance
Returns the distance between two geometries Read more
Minimum distance from a Polygon to a Point
Minimum distance from a Point to a Polygon
impl<T> EuclideanDistance<T, Polygon<T>> for Line<T> where
    T: GeoFloat + Signed + RTreeNum + FloatConst, 
impl<T> EuclideanDistance<T, Polygon<T>> for Line<T> where
    T: GeoFloat + Signed + RTreeNum + FloatConst, 
Returns the distance between two geometries Read more
impl<T> EuclideanDistance<T, Polygon<T>> for LineString<T> where
    T: GeoFloat + FloatConst + Signed + RTreeNum, 
impl<T> EuclideanDistance<T, Polygon<T>> for LineString<T> where
    T: GeoFloat + FloatConst + Signed + RTreeNum, 
LineString to Polygon
Returns the distance between two geometries Read more
impl<T> EuclideanDistance<T, Polygon<T>> for Polygon<T> where
    T: GeoFloat + FloatConst + RTreeNum, 
impl<T> EuclideanDistance<T, Polygon<T>> for Polygon<T> where
    T: GeoFloat + FloatConst + RTreeNum, 
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.
Some geometries, like a MultiPoint, can have zero coordinates - we call these empty. Read more
The dimensions of some geometries are fixed, e.g. a Point always has 0 dimensions. However
for others, the dimensionality depends on the specific geometry instance - for example
typical Rects are 2-dimensional, but it’s possible to create degenerate Rects which
have either 1 or 0 dimensions. Read more
The dimensions of the Geometry’s boundary, as used by OGC-SFA. Read more
impl<T> Intersects<Geometry<T>> for Polygon<T> where
    Geometry<T>: Intersects<Polygon<T>>,
    T: CoordNum, 
impl<T> Intersects<Geometry<T>> for Polygon<T> where
    Geometry<T>: Intersects<Polygon<T>>,
    T: CoordNum, 
impl<T> Intersects<GeometryCollection<T>> for Polygon<T> where
    GeometryCollection<T>: Intersects<Polygon<T>>,
    T: CoordNum, 
impl<T> Intersects<GeometryCollection<T>> for Polygon<T> where
    GeometryCollection<T>: Intersects<Polygon<T>>,
    T: CoordNum, 
impl<T> Intersects<LineString<T>> for Polygon<T> where
    LineString<T>: Intersects<Polygon<T>>,
    T: CoordNum, 
impl<T> Intersects<LineString<T>> for Polygon<T> where
    LineString<T>: Intersects<Polygon<T>>,
    T: CoordNum, 
impl<T> Intersects<MultiLineString<T>> for Polygon<T> where
    MultiLineString<T>: Intersects<Polygon<T>>,
    T: CoordNum, 
impl<T> Intersects<MultiLineString<T>> for Polygon<T> where
    MultiLineString<T>: Intersects<Polygon<T>>,
    T: CoordNum, 
impl<T> Intersects<MultiPoint<T>> for Polygon<T> where
    MultiPoint<T>: Intersects<Polygon<T>>,
    T: CoordNum, 
impl<T> Intersects<MultiPoint<T>> for Polygon<T> where
    MultiPoint<T>: Intersects<Polygon<T>>,
    T: CoordNum, 
impl<T> Intersects<MultiPolygon<T>> for Polygon<T> where
    MultiPolygon<T>: Intersects<Polygon<T>>,
    T: CoordNum, 
impl<T> Intersects<MultiPolygon<T>> for Polygon<T> where
    MultiPolygon<T>: Intersects<Polygon<T>>,
    T: CoordNum, 
impl<T> Intersects<Point<T>> for Polygon<T> where
    Point<T>: Intersects<Polygon<T>>,
    T: CoordNum, 
impl<T> Intersects<Point<T>> for Polygon<T> where
    Point<T>: Intersects<Polygon<T>>,
    T: CoordNum, 
impl<T> Intersects<Polygon<T>> for Coordinate<T> where
    Polygon<T>: Intersects<Coordinate<T>>,
    T: CoordNum, 
impl<T> Intersects<Polygon<T>> for Coordinate<T> where
    Polygon<T>: Intersects<Coordinate<T>>,
    T: CoordNum, 
impl<T> Intersects<Triangle<T>> for Polygon<T> where
    Triangle<T>: Intersects<Polygon<T>>,
    T: CoordNum, 
impl<T> Intersects<Triangle<T>> for Polygon<T> where
    Triangle<T>: Intersects<Polygon<T>>,
    T: CoordNum, 
impl<T> RelativeEq<Polygon<T>> for Polygon<T> where
    T: AbsDiffEq<T, Epsilon = T> + CoordNum + RelativeEq<T>, 
impl<T> RelativeEq<Polygon<T>> for Polygon<T> where
    T: AbsDiffEq<T, Epsilon = T> + CoordNum + RelativeEq<T>, 
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);The default relative tolerance for testing values that are far-apart. Read more
The inverse of RelativeEq::relative_eq.
Returns the simplified representation of a geometry, using the Ramer–Douglas–Peucker algorithm Read more
Returns the simplified representation of a geometry, using the Visvalingam-Whyatt algorithm Read more
Returns the simplified representation of a geometry, using a topology-preserving variant of the Visvalingam-Whyatt algorithm. Read more
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.
Auto Trait Implementations
impl<T> RefUnwindSafe for Polygon<T> where
    T: RefUnwindSafe, 
impl<T> UnwindSafe for Polygon<T> where
    T: UnwindSafe, 
Blanket Implementations
Mutably borrows from an owned value. Read more
Rotate a Geometry around an arbitrary point by an angle, given in degrees Read more
