pub struct Polygon<T = f64>where
T: CoordNum,{ /* private fields */ }
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 LineString
s.
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 Coord
of each ring has
the same value.
Validity
-
The exterior and interior rings must be valid
LinearRing
s (seeLineString
). -
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 thePolygon
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 Coord
have different values, a
new Coord
will be appended to the LineString
with a value equal to
the first Coord
.
Implementations§
source§impl<T> Polygon<T>where
T: CoordNum,
impl<T> Polygon<T>where T: CoordNum,
sourcepub fn new(
exterior: LineString<T>,
interiors: Vec<LineString<T>, Global>
) -> Polygon<T>
pub fn new( exterior: LineString<T>, interiors: Vec<LineString<T>, Global> ) -> Polygon<T>
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 Coord
s of the exterior or interior
LineString
s no longer match, those LineString
s will be closed:
use geo_types::{coord, 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.),])
);
sourcepub fn into_inner(self) -> (LineString<T>, Vec<LineString<T>, Global>)
pub fn into_inner(self) -> (LineString<T>, Vec<LineString<T>, Global>)
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),
])]
);
sourcepub fn exterior(&self) -> &LineString<T>
pub fn exterior(&self) -> &LineString<T>
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);
sourcepub fn exterior_mut<F>(&mut self, f: F)where
F: FnOnce(&mut LineString<T>),
pub fn exterior_mut<F>(&mut self, f: F)where F: FnOnce(&mut LineString<T>),
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::{coord, 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] = coord! { x: 1., y: 2. };
});
assert_eq!(
polygon.exterior(),
&LineString::from(vec![(0., 0.), (1., 2.), (1., 0.), (0., 0.),])
);
If the first and last Coord
s of the exterior LineString
no
longer match, the LineString
will be closed:
use geo_types::{coord, 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] = coord! { x: 0., y: 1. };
});
assert_eq!(
polygon.exterior(),
&LineString::from(vec![(0., 1.), (1., 1.), (1., 0.), (0., 0.), (0., 1.),])
);
sourcepub fn interiors(&self) -> &[LineString<T>]
pub fn interiors(&self) -> &[LineString<T>]
Return a slice of the interior LineString
rings.
Examples
use geo_types::{coord, 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());
sourcepub fn interiors_mut<F>(&mut self, f: F)where
F: FnOnce(&mut [LineString<T>]),
pub fn interiors_mut<F>(&mut self, f: F)where F: FnOnce(&mut [LineString<T>]),
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 LineString
s will be
closed.
Examples
use geo_types::{coord, 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] = coord! { 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 Coord
s of any interior LineString
no
longer match, those LineString
s will be closed:
use geo_types::{coord, 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] = coord! { 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),
])]
);
sourcepub fn interiors_push(&mut self, new_interior: impl Into<LineString<T>>)
pub fn interiors_push(&mut self, new_interior: impl Into<LineString<T>>)
Add an interior ring to the Polygon
.
The new LineString
interior ring will be closed:
Examples
use geo_types::{coord, 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§
source§impl<T> AbsDiffEq<Polygon<T>> for Polygon<T>where
T: AbsDiffEq<T, Epsilon = T> + CoordNum,
impl<T> AbsDiffEq<Polygon<T>> for Polygon<T>where T: AbsDiffEq<T, Epsilon = T> + CoordNum,
source§fn abs_diff_eq(
&self,
other: &Polygon<T>,
epsilon: <Polygon<T> as AbsDiffEq<Polygon<T>>>::Epsilon
) -> bool
fn abs_diff_eq( &self, other: &Polygon<T>, epsilon: <Polygon<T> as AbsDiffEq<Polygon<T>>>::Epsilon ) -> bool
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);
source§fn default_epsilon() -> <Polygon<T> as AbsDiffEq<Polygon<T>>>::Epsilon
fn default_epsilon() -> <Polygon<T> as AbsDiffEq<Polygon<T>>>::Epsilon
§fn abs_diff_ne(&self, other: &Rhs, epsilon: Self::Epsilon) -> bool
fn abs_diff_ne(&self, other: &Rhs, epsilon: Self::Epsilon) -> bool
AbsDiffEq::abs_diff_eq
].source§impl<T> Area<T> for Polygon<T>where
T: CoordFloat,
impl<T> Area<T> for Polygon<T>where T: CoordFloat,
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.
fn signed_area(&self) -> T
fn unsigned_area(&self) -> T
source§impl<T: GeoFloat> BooleanOps for Polygon<T>
impl<T: GeoFloat> BooleanOps for Polygon<T>
type Scalar = T
fn boolean_op(&self, other: &Self, op: OpType) -> MultiPolygon<Self::Scalar>
source§fn clip(
&self,
ls: &MultiLineString<Self::Scalar>,
invert: bool
) -> MultiLineString<Self::Scalar>
fn clip( &self, ls: &MultiLineString<Self::Scalar>, invert: bool ) -> MultiLineString<Self::Scalar>
fn intersection(&self, other: &Self) -> MultiPolygon<Self::Scalar>
fn union(&self, other: &Self) -> MultiPolygon<Self::Scalar>
fn xor(&self, other: &Self) -> MultiPolygon<Self::Scalar>
fn difference(&self, other: &Self) -> MultiPolygon<Self::Scalar>
source§impl<T> BoundingRect<T> for Polygon<T>where
T: CoordNum,
impl<T> BoundingRect<T> for Polygon<T>where T: CoordNum,
source§impl<T> Centroid for Polygon<T>where
T: GeoFloat,
impl<T> Centroid for Polygon<T>where T: GeoFloat,
source§impl<T> ChaikinSmoothing<T> for Polygon<T>where
T: CoordFloat + FromPrimitive,
impl<T> ChaikinSmoothing<T> for Polygon<T>where T: CoordFloat + FromPrimitive,
source§fn chaikin_smoothing(&self, n_iterations: usize) -> Self
fn chaikin_smoothing(&self, n_iterations: usize) -> Self
n_iterations
times.source§impl<T> ChamberlainDuquetteArea<T> for Polygon<T>where
T: CoordFloat,
impl<T> ChamberlainDuquetteArea<T> for Polygon<T>where T: CoordFloat,
fn chamberlain_duquette_signed_area(&self) -> T
fn chamberlain_duquette_unsigned_area(&self) -> T
source§impl<F: GeoFloat> ClosestPoint<F, Point<F>> for Polygon<F>
impl<F: GeoFloat> ClosestPoint<F, Point<F>> for Polygon<F>
source§fn closest_point(&self, p: &Point<F>) -> Closest<F>
fn closest_point(&self, p: &Point<F>) -> Closest<F>
self
and p
.source§impl<T> Contains<GeometryCollection<T>> for Polygon<T>where
T: GeoFloat,
impl<T> Contains<GeometryCollection<T>> for Polygon<T>where T: GeoFloat,
fn contains(&self, target: &GeometryCollection<T>) -> bool
source§impl<T> Contains<LineString<T>> for Polygon<T>where
T: GeoFloat,
impl<T> Contains<LineString<T>> for Polygon<T>where T: GeoFloat,
fn contains(&self, target: &LineString<T>) -> bool
source§impl<T> Contains<MultiLineString<T>> for Polygon<T>where
T: GeoFloat,
impl<T> Contains<MultiLineString<T>> for Polygon<T>where T: GeoFloat,
fn contains(&self, target: &MultiLineString<T>) -> bool
source§impl<T> Contains<MultiPoint<T>> for Polygon<T>where
T: GeoFloat,
impl<T> Contains<MultiPoint<T>> for Polygon<T>where T: GeoFloat,
fn contains(&self, target: &MultiPoint<T>) -> bool
source§impl<T> Contains<MultiPolygon<T>> for Polygon<T>where
T: GeoFloat,
impl<T> Contains<MultiPolygon<T>> for Polygon<T>where T: GeoFloat,
fn contains(&self, target: &MultiPolygon<T>) -> bool
source§impl<T> CoordinatePosition for Polygon<T>where
T: GeoNum,
impl<T> CoordinatePosition for Polygon<T>where T: GeoNum,
source§impl<'a, T: CoordNum + 'a> CoordsIter<'a> for Polygon<T>
impl<'a, T: CoordNum + 'a> CoordsIter<'a> for Polygon<T>
source§fn coords_count(&'a self) -> usize
fn coords_count(&'a self) -> usize
Return the number of coordinates in the Polygon
.
type Iter = Chain<Copied<Iter<'a, Coord<T>>>, Flatten<MapCoordsIter<'a, T, Iter<'a, LineString<T>>, LineString<T>>>>
type ExteriorIter = Copied<Iter<'a, Coord<T>>>
type Scalar = T
source§fn coords_iter(&'a self) -> Self::Iter
fn coords_iter(&'a self) -> Self::Iter
source§fn exterior_coords_iter(&'a self) -> Self::ExteriorIter
fn exterior_coords_iter(&'a self) -> Self::ExteriorIter
source§impl<T> Densify<T> for Polygon<T>where
T: CoordFloat,
Line<T>: EuclideanLength<T>,
LineString<T>: EuclideanLength<T>,
impl<T> Densify<T> for Polygon<T>where T: CoordFloat, Line<T>: EuclideanLength<T>, LineString<T>: EuclideanLength<T>,
source§impl<'de, T> Deserialize<'de> for Polygon<T>where
T: CoordNum + Deserialize<'de>,
impl<'de, T> Deserialize<'de> for Polygon<T>where T: CoordNum + Deserialize<'de>,
source§fn deserialize<__D>(
__deserializer: __D
) -> Result<Polygon<T>, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>( __deserializer: __D ) -> Result<Polygon<T>, <__D as Deserializer<'de>>::Error>where __D: Deserializer<'de>,
source§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,
source§fn euclidean_distance(&self, other: &Line<T>) -> T
fn euclidean_distance(&self, other: &Line<T>) -> T
source§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
source§fn euclidean_distance(&self, other: &LineString<T>) -> T
fn euclidean_distance(&self, other: &LineString<T>) -> T
source§impl<T> EuclideanDistance<T, Point<T>> for Polygon<T>where
T: GeoFloat,
impl<T> EuclideanDistance<T, Point<T>> for Polygon<T>where T: GeoFloat,
source§fn euclidean_distance(&self, point: &Point<T>) -> T
fn euclidean_distance(&self, point: &Point<T>) -> T
Minimum distance from a Polygon to a Point
source§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,
source§fn euclidean_distance(&self, other: &Polygon<T>) -> T
fn euclidean_distance(&self, other: &Polygon<T>) -> T
source§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
source§fn euclidean_distance(&self, other: &Polygon<T>) -> T
fn euclidean_distance(&self, other: &Polygon<T>) -> T
source§impl<T> EuclideanDistance<T, Polygon<T>> for Point<T>where
T: GeoFloat,
impl<T> EuclideanDistance<T, Polygon<T>> for Point<T>where T: GeoFloat,
source§fn euclidean_distance(&self, polygon: &Polygon<T>) -> T
fn euclidean_distance(&self, polygon: &Polygon<T>) -> T
Minimum distance from a Point to a Polygon
source§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,
source§fn euclidean_distance(&self, poly2: &Polygon<T>) -> T
fn euclidean_distance(&self, poly2: &Polygon<T>) -> T
source§impl GeodesicArea<f64> for Polygon
impl GeodesicArea<f64> for Polygon
source§fn geodesic_perimeter(&self) -> f64
fn geodesic_perimeter(&self) -> f64
source§fn geodesic_area_signed(&self) -> f64
fn geodesic_area_signed(&self) -> f64
source§fn geodesic_area_unsigned(&self) -> f64
fn geodesic_area_unsigned(&self) -> f64
source§impl<C: CoordNum> HasDimensions for Polygon<C>
impl<C: CoordNum> HasDimensions for Polygon<C>
source§fn dimensions(&self) -> Dimensions
fn dimensions(&self) -> Dimensions
Rect
s are 2-dimensional, but it’s possible to create degenerate Rect
s which
have either 1 or 0 dimensions. Read moresource§fn boundary_dimensions(&self) -> Dimensions
fn boundary_dimensions(&self) -> Dimensions
Geometry
’s boundary, as used by OGC-SFA. Read moresource§impl<T> InteriorPoint for Polygon<T>where
T: GeoFloat,
impl<T> InteriorPoint for Polygon<T>where T: GeoFloat,
source§impl<T> Intersects<Coord<T>> for Polygon<T>where
T: GeoNum,
impl<T> Intersects<Coord<T>> for Polygon<T>where T: GeoNum,
fn intersects(&self, p: &Coord<T>) -> bool
source§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,
fn intersects(&self, rhs: &Geometry<T>) -> bool
source§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,
fn intersects(&self, rhs: &GeometryCollection<T>) -> bool
source§impl<T> Intersects<Line<T>> for Polygon<T>where
T: GeoNum,
impl<T> Intersects<Line<T>> for Polygon<T>where T: GeoNum,
fn intersects(&self, line: &Line<T>) -> bool
source§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,
fn intersects(&self, rhs: &LineString<T>) -> bool
source§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,
fn intersects(&self, rhs: &MultiLineString<T>) -> bool
source§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,
fn intersects(&self, rhs: &MultiPoint<T>) -> bool
source§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,
fn intersects(&self, rhs: &MultiPolygon<T>) -> bool
source§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,
fn intersects(&self, rhs: &Point<T>) -> bool
source§impl<T> Intersects<Polygon<T>> for Coord<T>where
Polygon<T>: Intersects<Coord<T>>,
T: CoordNum,
impl<T> Intersects<Polygon<T>> for Coord<T>where Polygon<T>: Intersects<Coord<T>>, T: CoordNum,
fn intersects(&self, rhs: &Polygon<T>) -> bool
source§impl<T> Intersects<Polygon<T>> for Line<T>where
Polygon<T>: Intersects<Line<T>>,
T: CoordNum,
impl<T> Intersects<Polygon<T>> for Line<T>where Polygon<T>: Intersects<Line<T>>, T: CoordNum,
fn intersects(&self, rhs: &Polygon<T>) -> bool
source§impl<T> Intersects<Polygon<T>> for Polygon<T>where
T: GeoNum,
impl<T> Intersects<Polygon<T>> for Polygon<T>where T: GeoNum,
fn intersects(&self, polygon: &Polygon<T>) -> bool
source§impl<T> Intersects<Polygon<T>> for Rect<T>where
Polygon<T>: Intersects<Rect<T>>,
T: CoordNum,
impl<T> Intersects<Polygon<T>> for Rect<T>where Polygon<T>: Intersects<Rect<T>>, T: CoordNum,
fn intersects(&self, rhs: &Polygon<T>) -> bool
source§impl<T> Intersects<Rect<T>> for Polygon<T>where
T: GeoNum,
impl<T> Intersects<Rect<T>> for Polygon<T>where T: GeoNum,
fn intersects(&self, rect: &Rect<T>) -> bool
source§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,
fn intersects(&self, rhs: &Triangle<T>) -> bool
source§impl<'a, T: CoordNum + 'a> LinesIter<'a> for Polygon<T>
impl<'a, T: CoordNum + 'a> LinesIter<'a> for Polygon<T>
type Scalar = T
type Iter = Chain<LineStringIter<'a, <Polygon<T> as LinesIter<'a>>::Scalar>, Flatten<MapLinesIter<'a, Iter<'a, LineString<<Polygon<T> as LinesIter<'a>>::Scalar>>, LineString<<Polygon<T> as LinesIter<'a>>::Scalar>>>>
source§fn lines_iter(&'a self) -> Self::Iter
fn lines_iter(&'a self) -> Self::Iter
source§impl<T: CoordNum, NT: CoordNum> MapCoords<T, NT> for Polygon<T>
impl<T: CoordNum, NT: CoordNum> MapCoords<T, NT> for Polygon<T>
source§impl<T: CoordNum> MapCoordsInPlace<T> for Polygon<T>
impl<T: CoordNum> MapCoordsInPlace<T> for Polygon<T>
source§impl<T: CoordNum> MapCoordsInplace<T> for Polygon<T>
impl<T: CoordNum> MapCoordsInplace<T> for Polygon<T>
source§fn map_coords_inplace(&mut self, func: impl Fn((T, T)) -> (T, T) + Copy)where
T: CoordNum,
👎Deprecated since 0.21.0: use MapCoordsInPlace::map_coords_in_place
instead which takes a Coord
instead of an (x,y) tuple
fn map_coords_inplace(&mut self, func: impl Fn((T, T)) -> (T, T) + Copy)where T: CoordNum,
MapCoordsInPlace::map_coords_in_place
instead which takes a Coord
instead of an (x,y) tupleApply a function to all the coordinates in a geometric object, in place
Examples
#[allow(deprecated)]
use geo::MapCoordsInplace;
use geo::Point;
use approx::assert_relative_eq;
let mut p = Point::new(10., 20.);
#[allow(deprecated)]
p.map_coords_inplace(|(x, y)| (x + 1000., y * 2.));
assert_relative_eq!(p, Point::new(1010., 40.), epsilon = 1e-6);
source§impl<T> PartialEq<Polygon<T>> for Polygon<T>where
T: PartialEq<T> + CoordNum,
impl<T> PartialEq<Polygon<T>> for Polygon<T>where T: PartialEq<T> + CoordNum,
source§impl<F: GeoFloat> Relate<F, GeometryCollection<F>> for Polygon<F>
impl<F: GeoFloat> Relate<F, GeometryCollection<F>> for Polygon<F>
fn relate(&self, other: &GeometryCollection<F>) -> IntersectionMatrix
source§impl<F: GeoFloat> Relate<F, Line<F>> for Polygon<F>
impl<F: GeoFloat> Relate<F, Line<F>> for Polygon<F>
fn relate(&self, other: &Line<F>) -> IntersectionMatrix
source§impl<F: GeoFloat> Relate<F, LineString<F>> for Polygon<F>
impl<F: GeoFloat> Relate<F, LineString<F>> for Polygon<F>
fn relate(&self, other: &LineString<F>) -> IntersectionMatrix
source§impl<F: GeoFloat> Relate<F, MultiLineString<F>> for Polygon<F>
impl<F: GeoFloat> Relate<F, MultiLineString<F>> for Polygon<F>
fn relate(&self, other: &MultiLineString<F>) -> IntersectionMatrix
source§impl<F: GeoFloat> Relate<F, MultiPoint<F>> for Polygon<F>
impl<F: GeoFloat> Relate<F, MultiPoint<F>> for Polygon<F>
fn relate(&self, other: &MultiPoint<F>) -> IntersectionMatrix
source§impl<F: GeoFloat> Relate<F, MultiPolygon<F>> for Polygon<F>
impl<F: GeoFloat> Relate<F, MultiPolygon<F>> for Polygon<F>
fn relate(&self, other: &MultiPolygon<F>) -> IntersectionMatrix
source§impl<F: GeoFloat> Relate<F, Point<F>> for Polygon<F>
impl<F: GeoFloat> Relate<F, Point<F>> for Polygon<F>
fn relate(&self, other: &Point<F>) -> IntersectionMatrix
source§impl<F: GeoFloat> Relate<F, Polygon<F>> for GeometryCollection<F>
impl<F: GeoFloat> Relate<F, Polygon<F>> for GeometryCollection<F>
fn relate(&self, other: &Polygon<F>) -> IntersectionMatrix
source§impl<F: GeoFloat> Relate<F, Polygon<F>> for Line<F>
impl<F: GeoFloat> Relate<F, Polygon<F>> for Line<F>
fn relate(&self, other: &Polygon<F>) -> IntersectionMatrix
source§impl<F: GeoFloat> Relate<F, Polygon<F>> for LineString<F>
impl<F: GeoFloat> Relate<F, Polygon<F>> for LineString<F>
fn relate(&self, other: &Polygon<F>) -> IntersectionMatrix
source§impl<F: GeoFloat> Relate<F, Polygon<F>> for MultiLineString<F>
impl<F: GeoFloat> Relate<F, Polygon<F>> for MultiLineString<F>
fn relate(&self, other: &Polygon<F>) -> IntersectionMatrix
source§impl<F: GeoFloat> Relate<F, Polygon<F>> for MultiPoint<F>
impl<F: GeoFloat> Relate<F, Polygon<F>> for MultiPoint<F>
fn relate(&self, other: &Polygon<F>) -> IntersectionMatrix
source§impl<F: GeoFloat> Relate<F, Polygon<F>> for MultiPolygon<F>
impl<F: GeoFloat> Relate<F, Polygon<F>> for MultiPolygon<F>
fn relate(&self, other: &Polygon<F>) -> IntersectionMatrix
source§impl<F: GeoFloat> Relate<F, Polygon<F>> for Point<F>
impl<F: GeoFloat> Relate<F, Polygon<F>> for Point<F>
fn relate(&self, other: &Polygon<F>) -> IntersectionMatrix
source§impl<F: GeoFloat> Relate<F, Polygon<F>> for Polygon<F>
impl<F: GeoFloat> Relate<F, Polygon<F>> for Polygon<F>
fn relate(&self, other: &Polygon<F>) -> IntersectionMatrix
source§impl<F: GeoFloat> Relate<F, Polygon<F>> for Rect<F>
impl<F: GeoFloat> Relate<F, Polygon<F>> for Rect<F>
fn relate(&self, other: &Polygon<F>) -> IntersectionMatrix
source§impl<F: GeoFloat> Relate<F, Polygon<F>> for Triangle<F>
impl<F: GeoFloat> Relate<F, Polygon<F>> for Triangle<F>
fn relate(&self, other: &Polygon<F>) -> IntersectionMatrix
source§impl<F: GeoFloat> Relate<F, Rect<F>> for Polygon<F>
impl<F: GeoFloat> Relate<F, Rect<F>> for Polygon<F>
fn relate(&self, other: &Rect<F>) -> IntersectionMatrix
source§impl<F: GeoFloat> Relate<F, Triangle<F>> for Polygon<F>
impl<F: GeoFloat> Relate<F, Triangle<F>> for Polygon<F>
fn relate(&self, other: &Triangle<F>) -> IntersectionMatrix
source§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>,
source§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
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
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);
source§fn default_max_relative() -> <Polygon<T> as AbsDiffEq<Polygon<T>>>::Epsilon
fn default_max_relative() -> <Polygon<T> as AbsDiffEq<Polygon<T>>>::Epsilon
§fn relative_ne(
&self,
other: &Rhs,
epsilon: Self::Epsilon,
max_relative: Self::Epsilon
) -> bool
fn relative_ne( &self, other: &Rhs, epsilon: Self::Epsilon, max_relative: Self::Epsilon ) -> bool
RelativeEq::relative_eq
].source§impl<T> RemoveRepeatedPoints<T> for Polygon<T>where
T: CoordNum + FromPrimitive,
impl<T> RemoveRepeatedPoints<T> for Polygon<T>where T: CoordNum + FromPrimitive,
source§fn remove_repeated_points(&self) -> Self
fn remove_repeated_points(&self) -> Self
Create a Polygon with consecutive repeated points removed.
source§fn remove_repeated_points_mut(&mut self)
fn remove_repeated_points_mut(&mut self)
Remove consecutive repeated points from a Polygon inplace.
source§impl<T> Serialize for Polygon<T>where
T: CoordNum + Serialize,
impl<T> Serialize for Polygon<T>where T: CoordNum + Serialize,
source§fn serialize<__S>(
&self,
__serializer: __S
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
fn serialize<__S>( &self, __serializer: __S ) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where __S: Serializer,
source§impl<T> SimplifyVw<T, T> for Polygon<T>where
T: CoordFloat,
impl<T> SimplifyVw<T, T> for Polygon<T>where T: CoordFloat,
source§fn simplify_vw(&self, epsilon: &T) -> Polygon<T>
fn simplify_vw(&self, epsilon: &T) -> Polygon<T>
source§impl<T> SimplifyVwPreserve<T, T> for Polygon<T>where
T: CoordFloat + RTreeNum + HasKernel,
impl<T> SimplifyVwPreserve<T, T> for Polygon<T>where T: CoordFloat + RTreeNum + HasKernel,
source§fn simplify_vw_preserve(&self, epsilon: &T) -> Polygon<T>
fn simplify_vw_preserve(&self, epsilon: &T) -> Polygon<T>
source§impl<T> TryFrom<Geometry<T>> for Polygon<T>where
T: CoordNum,
impl<T> TryFrom<Geometry<T>> for Polygon<T>where T: CoordNum,
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.
source§impl<T: CoordNum, NT: CoordNum, E> TryMapCoords<T, NT, E> for Polygon<T>
impl<T: CoordNum, NT: CoordNum, E> TryMapCoords<T, NT, E> for Polygon<T>
§type Output = Polygon<NT>
type Output = Polygon<NT>
MapCoords::try_map_coords
which takes a Coord
instead of an (x,y) tuplesource§fn try_map_coords(
&self,
func: impl Fn((T, T)) -> Result<(NT, NT), E> + Copy
) -> Result<Self::Output, E>
fn try_map_coords( &self, func: impl Fn((T, T)) -> Result<(NT, NT), E> + Copy ) -> Result<Self::Output, E>
MapCoords::try_map_coords
which takes a Coord
instead of an (x,y) tuplesource§impl<T: CoordNum, E> TryMapCoordsInplace<T, E> for Polygon<T>
impl<T: CoordNum, E> TryMapCoordsInplace<T, E> for Polygon<T>
source§fn try_map_coords_inplace(
&mut self,
func: impl Fn((T, T)) -> Result<(T, T), E>
) -> Result<(), E>
fn try_map_coords_inplace( &mut self, func: impl Fn((T, T)) -> Result<(T, T), E> ) -> Result<(), E>
MapCoordsInPlace::try_map_coords_in_place
which takes a Coord
instead of an (x,y) tupleResult
. Read moreimpl<T> Eq for Polygon<T>where T: Eq + CoordNum,
impl<T> StructuralEq for Polygon<T>where T: CoordNum,
impl<T> StructuralPartialEq for Polygon<T>where T: CoordNum,
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§
source§impl<T, M> AffineOps<T> for Mwhere
T: CoordNum,
M: MapCoordsInPlace<T> + MapCoords<T, T, Output = M>,
impl<T, M> AffineOps<T> for Mwhere T: CoordNum, M: MapCoordsInPlace<T> + MapCoords<T, T, Output = M>,
source§fn affine_transform(&self, transform: &AffineTransform<T>) -> M
fn affine_transform(&self, transform: &AffineTransform<T>) -> M
transform
immutably, outputting a new geometry.source§fn affine_transform_mut(&mut self, transform: &AffineTransform<T>)
fn affine_transform_mut(&mut self, transform: &AffineTransform<T>)
transform
to mutate self
.source§impl<G, T, U> Convert<T, U> for Gwhere
T: CoordNum,
U: CoordNum + From<T>,
G: MapCoords<T, U>,
impl<G, T, U> Convert<T, U> for Gwhere T: CoordNum, U: CoordNum + From<T>, G: MapCoords<T, U>,
source§impl<'a, T, G> ConvexHull<'a, T> for Gwhere
T: GeoNum,
G: CoordsIter<'a, Scalar = T>,
impl<'a, T, G> ConvexHull<'a, T> for Gwhere T: GeoNum, G: CoordsIter<'a, Scalar = T>,
source§impl<'a, T, G> Extremes<'a, T> for Gwhere
G: CoordsIter<'a, Scalar = T>,
T: CoordNum,
impl<'a, T, G> Extremes<'a, T> for Gwhere G: CoordsIter<'a, Scalar = T>, T: CoordNum,
source§impl<'a, T, G> MinimumRotatedRect<'a, T> for Gwhere
T: CoordFloat + GeoFloat + GeoNum,
G: CoordsIter<'a, Scalar = T>,
impl<'a, T, G> MinimumRotatedRect<'a, T> for Gwhere T: CoordFloat + GeoFloat + GeoNum, G: CoordsIter<'a, Scalar = T>,
type Scalar = T
fn minimum_rotated_rect( &'a self ) -> Option<Polygon<<G as MinimumRotatedRect<'a, T>>::Scalar>>
source§impl<G, IP, IR, T> Rotate<T> for Gwhere
T: CoordFloat,
IP: Into<Option<Point<T>>>,
IR: Into<Option<Rect<T>>>,
G: Clone + Centroid<Output = IP> + BoundingRect<T, Output = IR> + AffineOps<T>,
impl<G, IP, IR, T> Rotate<T> for Gwhere T: CoordFloat, IP: Into<Option<Point<T>>>, IR: Into<Option<Rect<T>>>, G: Clone + Centroid<Output = IP> + BoundingRect<T, Output = IR> + AffineOps<T>,
source§fn rotate_around_centroid(&self, degrees: T) -> G
fn rotate_around_centroid(&self, degrees: T) -> G
source§fn rotate_around_centroid_mut(&mut self, degrees: T)
fn rotate_around_centroid_mut(&mut self, degrees: T)
Self::rotate_around_centroid
source§fn rotate_around_center(&self, degrees: T) -> G
fn rotate_around_center(&self, degrees: T) -> G
source§fn rotate_around_center_mut(&mut self, degrees: T)
fn rotate_around_center_mut(&mut self, degrees: T)
Self::rotate_around_center
source§fn rotate_around_point(&self, degrees: T, point: Point<T>) -> G
fn rotate_around_point(&self, degrees: T, point: Point<T>) -> G
source§fn rotate_around_point_mut(&mut self, degrees: T, point: Point<T>)
fn rotate_around_point_mut(&mut self, degrees: T, point: Point<T>)
Self::rotate_around_point
source§impl<T, IR, G> Scale<T> for Gwhere
T: CoordFloat,
IR: Into<Option<Rect<T>>>,
G: Clone + AffineOps<T> + BoundingRect<T, Output = IR>,
impl<T, IR, G> Scale<T> for Gwhere T: CoordFloat, IR: Into<Option<Rect<T>>>, G: Clone + AffineOps<T> + BoundingRect<T, Output = IR>,
source§fn scale(&self, scale_factor: T) -> G
fn scale(&self, scale_factor: T) -> G
source§fn scale_xy(&self, x_factor: T, y_factor: T) -> G
fn scale_xy(&self, x_factor: T, y_factor: T) -> G
x_factor
and
y_factor
to distort the geometry’s aspect ratio. Read moresource§fn scale_xy_mut(&mut self, x_factor: T, y_factor: T)
fn scale_xy_mut(&mut self, x_factor: T, y_factor: T)
scale_xy
.source§fn scale_around_point(
&self,
x_factor: T,
y_factor: T,
origin: impl Into<Coord<T>>
) -> G
fn scale_around_point( &self, x_factor: T, y_factor: T, origin: impl Into<Coord<T>> ) -> G
origin
. Read moresource§fn scale_around_point_mut(
&mut self,
x_factor: T,
y_factor: T,
origin: impl Into<Coord<T>>
)
fn scale_around_point_mut( &mut self, x_factor: T, y_factor: T, origin: impl Into<Coord<T>> )
scale_around_point
.source§impl<T, IR, G> Skew<T> for Gwhere
T: CoordFloat,
IR: Into<Option<Rect<T>>>,
G: Clone + AffineOps<T> + BoundingRect<T, Output = IR>,
impl<T, IR, G> Skew<T> for Gwhere T: CoordFloat, IR: Into<Option<Rect<T>>>, G: Clone + AffineOps<T> + BoundingRect<T, Output = IR>,
source§fn skew(&self, degrees: T) -> G
fn skew(&self, degrees: T) -> G
source§fn skew_xy(&self, degrees_x: T, degrees_y: T) -> G
fn skew_xy(&self, degrees_x: T, degrees_y: T) -> G
source§fn skew_xy_mut(&mut self, degrees_x: T, degrees_y: T)
fn skew_xy_mut(&mut self, degrees_x: T, degrees_y: T)
skew_xy
.source§fn skew_around_point(&self, xs: T, ys: T, origin: impl Into<Coord<T>>) -> G
fn skew_around_point(&self, xs: T, ys: T, origin: impl Into<Coord<T>>) -> G
origin
, sheared by an
angle along the x and y dimensions. Read moresource§fn skew_around_point_mut(&mut self, xs: T, ys: T, origin: impl Into<Coord<T>>)
fn skew_around_point_mut(&mut self, xs: T, ys: T, origin: impl Into<Coord<T>>)
skew_around_point
.