|
1 |
| -use crate::{CoordinateType, Line, LineString, MultiPolygon, Polygon, Rect, Triangle}; |
| 1 | +use crate::{ |
| 2 | + CoordinateType, Geometry, GeometryCollection, Line, LineString, MultiLineString, MultiPoint, |
| 3 | + MultiPolygon, Point, Polygon, Rect, Triangle, |
| 4 | +}; |
2 | 5 | use num_traits::Float;
|
3 | 6 |
|
4 | 7 | use crate::algorithm::winding_order::twice_signed_ring_area;
|
|
42 | 45 | twice_signed_ring_area(linestring) / (T::one() + T::one())
|
43 | 46 | }
|
44 | 47 |
|
| 48 | +impl<T> Area<T> for Point<T> |
| 49 | +where |
| 50 | + T: CoordinateType, |
| 51 | +{ |
| 52 | + fn area(&self) -> T { |
| 53 | + T::zero() |
| 54 | + } |
| 55 | +} |
| 56 | + |
| 57 | +impl<T> Area<T> for LineString<T> |
| 58 | +where |
| 59 | + T: CoordinateType, |
| 60 | +{ |
| 61 | + fn area(&self) -> T { |
| 62 | + T::zero() |
| 63 | + } |
| 64 | +} |
| 65 | + |
45 | 66 | impl<T> Area<T> for Line<T>
|
46 | 67 | where
|
47 | 68 | T: CoordinateType,
|
|
64 | 85 | }
|
65 | 86 | }
|
66 | 87 |
|
| 88 | +impl<T> Area<T> for MultiPoint<T> |
| 89 | +where |
| 90 | + T: CoordinateType, |
| 91 | +{ |
| 92 | + fn area(&self) -> T { |
| 93 | + T::zero() |
| 94 | + } |
| 95 | +} |
| 96 | + |
| 97 | +impl<T> Area<T> for MultiLineString<T> |
| 98 | +where |
| 99 | + T: CoordinateType, |
| 100 | +{ |
| 101 | + fn area(&self) -> T { |
| 102 | + T::zero() |
| 103 | + } |
| 104 | +} |
| 105 | + |
67 | 106 | impl<T> Area<T> for MultiPolygon<T>
|
68 | 107 | where
|
69 | 108 | T: Float,
|
@@ -96,6 +135,38 @@ where
|
96 | 135 | }
|
97 | 136 | }
|
98 | 137 |
|
| 138 | +impl<T> Area<T> for Geometry<T> |
| 139 | +where |
| 140 | + T: Float, |
| 141 | +{ |
| 142 | + fn area(&self) -> T { |
| 143 | + match self { |
| 144 | + Geometry::Point(g) => g.area(), |
| 145 | + Geometry::Line(g) => g.area(), |
| 146 | + Geometry::LineString(g) => g.area(), |
| 147 | + Geometry::Polygon(g) => g.area(), |
| 148 | + Geometry::MultiPoint(g) => g.area(), |
| 149 | + Geometry::MultiLineString(g) => g.area(), |
| 150 | + Geometry::MultiPolygon(g) => g.area(), |
| 151 | + Geometry::GeometryCollection(g) => g.area(), |
| 152 | + Geometry::Rect(g) => g.area(), |
| 153 | + Geometry::Triangle(g) => g.area(), |
| 154 | + } |
| 155 | + } |
| 156 | +} |
| 157 | + |
| 158 | +impl<T> Area<T> for GeometryCollection<T> |
| 159 | +where |
| 160 | + T: Float, |
| 161 | +{ |
| 162 | + fn area(&self) -> T { |
| 163 | + self.0 |
| 164 | + .iter() |
| 165 | + .map(|g| g.area()) |
| 166 | + .fold(T::zero(), |acc, next| acc + next) |
| 167 | + } |
| 168 | +} |
| 169 | + |
99 | 170 | #[cfg(test)]
|
100 | 171 | mod test {
|
101 | 172 | use crate::algorithm::area::Area;
|
|
0 commit comments