Skip to content

Commit 524fe3d

Browse files
bors[bot]frewsxcv
andauthored
Merge #459
459: More Area implementations. r=frewsxcv a=frewsxcv - `impl<T> Area<T> for Point<T>` - `impl<T> Area<T> for LineString<T>` - `impl<T> Area<T> for MultiPoint<T>` - `impl<T> Area<T> for MultiLineString<T>` - `impl<T> Area<T> for Geometry<T>` - `impl<T> Area<T> for GeometryCollection<T>` Co-authored-by: Corey Farwell <coreyf@rwell.org>
2 parents ca4f907 + 75afdd4 commit 524fe3d

File tree

1 file changed

+72
-1
lines changed

1 file changed

+72
-1
lines changed

geo/src/algorithm/area.rs

+72-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
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+
};
25
use num_traits::Float;
36

47
use crate::algorithm::winding_order::twice_signed_ring_area;
@@ -42,6 +45,24 @@ where
4245
twice_signed_ring_area(linestring) / (T::one() + T::one())
4346
}
4447

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+
4566
impl<T> Area<T> for Line<T>
4667
where
4768
T: CoordinateType,
@@ -64,6 +85,24 @@ where
6485
}
6586
}
6687

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+
67106
impl<T> Area<T> for MultiPolygon<T>
68107
where
69108
T: Float,
@@ -96,6 +135,38 @@ where
96135
}
97136
}
98137

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+
99170
#[cfg(test)]
100171
mod test {
101172
use crate::algorithm::area::Area;

0 commit comments

Comments
 (0)