pub struct Polygon<T: CoordNum = f64> { /* 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: CoordNum> Polygon<T>
impl<T: CoordNum> Polygon<T>
Sourcepub fn new(exterior: LineString<T>, interiors: Vec<LineString<T>>) -> Self
pub fn new(exterior: LineString<T>, interiors: Vec<LineString<T>>) -> Self
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>>)
pub fn into_inner(self) -> (LineString<T>, Vec<LineString<T>>)
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 try_exterior_mut<F, E>(&mut self, f: F) -> Result<(), E>
pub fn try_exterior_mut<F, E>(&mut self, f: F) -> Result<(), E>
Fallible alternative to exterior_mut
.
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 try_interiors_mut<F, E>(&mut self, f: F) -> Result<(), E>
pub fn try_interiors_mut<F, E>(&mut self, f: F) -> Result<(), E>
Fallible alternative to interiors_mut
.
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),
])]
);
Sourcepub fn num_rings(&self) -> usize
pub fn num_rings(&self) -> usize
Count the total number of rings (interior and exterior) in the polygon
§Examples
use geo_types::{coord, LineString, Polygon};
let polygon = Polygon::new(
LineString::from(vec![(0., 0.), (1., 1.), (1., 0.), (0., 0.)]),
vec![],
);
assert_eq!(polygon.num_rings(), 1);
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)])],
);
assert_eq!(polygon.num_rings(), 2);
Sourcepub fn num_interior_rings(&self) -> usize
pub fn num_interior_rings(&self) -> usize
Count the number of interior rings in the polygon
§Examples
use geo_types::{coord, LineString, Polygon};
let polygon = Polygon::new(
LineString::from(vec![(0., 0.), (1., 1.), (1., 0.), (0., 0.)]),
vec![],
);
assert_eq!(polygon.num_interior_rings(), 0);
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)])],
);
assert_eq!(polygon.num_interior_rings(), 1);
Trait Implementations§
Source§impl<T: CoordNum> TryFrom<Geometry<T>> for Polygon<T>
impl<T: CoordNum> TryFrom<Geometry<T>> for Polygon<T>
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.