geo/algorithm/contains/
polygon.rs

1use super::{impl_contains_from_relate, impl_contains_geometry_for, Contains};
2use crate::geometry::*;
3use crate::Relate;
4use crate::{GeoFloat, GeoNum};
5
6// ┌─────────────────────────────┐
7// │ Implementations for Polygon │
8// └─────────────────────────────┘
9impl<T> Contains<Coord<T>> for Polygon<T>
10where
11    T: GeoNum,
12{
13    fn contains(&self, coord: &Coord<T>) -> bool {
14        use crate::coordinate_position::{CoordPos, CoordinatePosition};
15
16        self.coordinate_position(coord) == CoordPos::Inside
17    }
18}
19
20impl<T> Contains<Point<T>> for Polygon<T>
21where
22    T: GeoNum,
23{
24    fn contains(&self, p: &Point<T>) -> bool {
25        self.contains(&p.0)
26    }
27}
28
29impl_contains_from_relate!(Polygon<T>, [Line<T>, LineString<T>, Polygon<T>, MultiPoint<T>, MultiLineString<T>, MultiPolygon<T>, GeometryCollection<T>, Rect<T>, Triangle<T>]);
30impl_contains_geometry_for!(Polygon<T>);
31
32// ┌──────────────────────────────────┐
33// │ Implementations for MultiPolygon │
34// └──────────────────────────────────┘
35
36impl<T> Contains<Coord<T>> for MultiPolygon<T>
37where
38    T: GeoNum,
39{
40    fn contains(&self, coord: &Coord<T>) -> bool {
41        self.iter().any(|poly| poly.contains(coord))
42    }
43}
44
45impl<T> Contains<Point<T>> for MultiPolygon<T>
46where
47    T: GeoNum,
48{
49    fn contains(&self, p: &Point<T>) -> bool {
50        self.contains(&p.0)
51    }
52}
53
54impl<T: GeoNum> Contains<MultiPoint<T>> for MultiPolygon<T> {
55    fn contains(&self, rhs: &MultiPoint<T>) -> bool {
56        rhs.iter().all(|point| self.contains(point))
57    }
58}
59
60impl<F> Contains<Line<F>> for MultiPolygon<F>
61where
62    F: GeoFloat,
63{
64    fn contains(&self, rhs: &Line<F>) -> bool {
65        rhs.relate(self).is_within()
66    }
67}
68
69impl<F> Contains<LineString<F>> for MultiPolygon<F>
70where
71    F: GeoFloat,
72{
73    fn contains(&self, rhs: &LineString<F>) -> bool {
74        rhs.relate(self).is_within()
75    }
76}
77
78impl<F> Contains<MultiLineString<F>> for MultiPolygon<F>
79where
80    F: GeoFloat,
81{
82    fn contains(&self, rhs: &MultiLineString<F>) -> bool {
83        rhs.relate(self).is_within()
84    }
85}
86
87impl<F> Contains<Polygon<F>> for MultiPolygon<F>
88where
89    F: GeoFloat,
90{
91    fn contains(&self, rhs: &Polygon<F>) -> bool {
92        rhs.relate(self).is_within()
93    }
94}
95
96impl<F> Contains<MultiPolygon<F>> for MultiPolygon<F>
97where
98    F: GeoFloat,
99{
100    fn contains(&self, rhs: &MultiPolygon<F>) -> bool {
101        rhs.relate(self).is_within()
102    }
103}
104
105impl<F> Contains<GeometryCollection<F>> for MultiPolygon<F>
106where
107    F: GeoFloat,
108{
109    fn contains(&self, rhs: &GeometryCollection<F>) -> bool {
110        rhs.relate(self).is_within()
111    }
112}
113
114impl<F> Contains<Rect<F>> for MultiPolygon<F>
115where
116    F: GeoFloat,
117{
118    fn contains(&self, rhs: &Rect<F>) -> bool {
119        rhs.relate(self).is_within()
120    }
121}
122
123impl<F> Contains<Triangle<F>> for MultiPolygon<F>
124where
125    F: GeoFloat,
126{
127    fn contains(&self, rhs: &Triangle<F>) -> bool {
128        rhs.relate(self).is_within()
129    }
130}