geo/algorithm/contains/
polygon.rs1use super::{impl_contains_from_relate, impl_contains_geometry_for, Contains};
2use crate::geometry::*;
3use crate::Relate;
4use crate::{GeoFloat, GeoNum};
5
6impl<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
32impl<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}