gistools/geometry/tools/lines/
to_lines.rs

1use alloc::{vec, vec::Vec};
2use s2json::{
3    Feature, Features, Geometry, GetXY, MultiLineString, MultiLineString3D,
4    MultiLineString3DGeometry, MultiLineStringGeometry, MultiPoint, MultiPoint3D,
5    MultiPoint3DGeometry, MultiPointGeometry, MultiPolygon, MultiPolygon3D, MultiPolygon3DGeometry,
6    MultiPolygonGeometry, NewXY, Point, Point3D, Point3DGeometry, PointGeometry, VectorFeature,
7    VectorGeometry, VectorLineString, VectorMultiLineString, VectorMultiLineStringGeometry,
8    VectorMultiPoint, VectorMultiPointGeometry, VectorMultiPolygon, VectorMultiPolygonGeometry,
9    VectorPoint, VectorPointGeometry,
10};
11
12/// Given a Geometry, attempt to Return a VectorMultiLineString.
13///
14/// Smaller geometries return an empty line
15///
16/// This trait is implemented for:
17/// - [`Feature`]
18/// - [`Geometry`]
19/// - [`PointGeometry`]
20/// - [`MultiPointGeometry`]
21/// - [`s2json::LineStringGeometry`]
22/// - [`MultiLineStringGeometry`]
23/// - [`MultiPolygonGeometry`]
24/// - [`Point3DGeometry`]
25/// - [`MultiPoint3DGeometry`]
26/// - [`s2json::LineString3DGeometry`]
27/// - [`MultiLineString3DGeometry`]
28/// - [`MultiPolygon3DGeometry`]
29/// - [`VectorFeature`]
30/// - [`VectorGeometry`]
31/// - [`VectorPointGeometry`]
32/// - [`VectorMultiPointGeometry`]
33/// - [`s2json::VectorLineStringGeometry`]
34/// - [`VectorMultiLineStringGeometry`]
35/// - [`VectorMultiPolygonGeometry`]
36/// - [`VectorMultiPoint`]
37/// - [`s2json::VectorLineString`]
38/// - [`VectorMultiLineString`]
39/// - [`VectorMultiPolygon`]
40/// - [`Features`]
41/// - `&[P]` where P implements [`GetXY`]
42/// - `&Vec<Vec<P>>` where P implements [`GetXY`]
43///
44/// And all specific geometries of the above enums
45pub trait ToLines<M: Clone + Default> {
46    /// Given a Geometry, attempt to Return a VectorMultiLineString.
47    ///
48    /// Smaller geometries return an empty line
49    fn to_lines(&self) -> VectorMultiLineString<M>;
50}
51
52// Feature and below
53
54impl<M: Clone + Default, P: GetXY> ToLines<M> for &[P] {
55    fn to_lines(&self) -> VectorMultiLineString<M> {
56        let mut res: VectorLineString<M> = vec![];
57        for p in self.iter() {
58            res.push(NewXY::new_xy(p.x(), p.y()));
59        }
60        vec![res]
61    }
62}
63impl<M: Clone + Default, P: GetXY> ToLines<M> for &Vec<Vec<P>> {
64    fn to_lines(&self) -> VectorMultiLineString<M> {
65        let mut res: VectorMultiLineString<M> = vec![];
66        for line in self.iter() {
67            let mut new_line: VectorLineString<M> = vec![];
68            for p in line.iter() {
69                new_line.push(NewXY::new_xy(p.x(), p.y()));
70            }
71            res.push(new_line);
72        }
73        res
74    }
75}
76
77impl<M, P: Clone + Default, D: Clone + Default> ToLines<D> for Feature<M, P, D> {
78    fn to_lines(&self) -> VectorMultiLineString<D> {
79        self.geometry.to_lines()
80    }
81}
82impl<M: Clone + Default> ToLines<M> for Geometry<M> {
83    fn to_lines(&self) -> VectorMultiLineString<M> {
84        match self {
85            Geometry::Point(g) => g.to_lines(),
86            Geometry::MultiPoint(g) => g.to_lines(),
87            Geometry::LineString(g) => g.to_lines(),
88            Geometry::MultiLineString(g) => g.to_lines(),
89            Geometry::Polygon(g) => g.to_lines(),
90            Geometry::MultiPolygon(g) => g.to_lines(),
91            Geometry::Point3D(g) => g.to_lines(),
92            Geometry::MultiPoint3D(g) => g.to_lines(),
93            Geometry::LineString3D(g) => g.to_lines(),
94            Geometry::MultiLineString3D(g) => g.to_lines(),
95            Geometry::Polygon3D(g) => g.to_lines(),
96            Geometry::MultiPolygon3D(g) => g.to_lines(),
97        }
98    }
99}
100impl<M: Clone + Default> ToLines<M> for PointGeometry<M> {
101    fn to_lines(&self) -> VectorMultiLineString<M> {
102        self.coordinates.to_lines()
103    }
104}
105impl<M: Clone + Default> ToLines<M> for MultiPointGeometry<M> {
106    fn to_lines(&self) -> VectorMultiLineString<M> {
107        self.coordinates.to_lines()
108    }
109}
110impl<M: Clone + Default> ToLines<M> for MultiLineStringGeometry<M> {
111    fn to_lines(&self) -> VectorMultiLineString<M> {
112        self.coordinates.to_lines()
113    }
114}
115impl<M: Clone + Default> ToLines<M> for MultiPolygonGeometry<M> {
116    fn to_lines(&self) -> VectorMultiLineString<M> {
117        self.coordinates.to_lines()
118    }
119}
120impl<M: Clone + Default> ToLines<M> for Point3DGeometry<M> {
121    fn to_lines(&self) -> VectorMultiLineString<M> {
122        self.coordinates.to_lines()
123    }
124}
125impl<M: Clone + Default> ToLines<M> for MultiPoint3DGeometry<M> {
126    fn to_lines(&self) -> VectorMultiLineString<M> {
127        self.coordinates.to_lines()
128    }
129}
130impl<M: Clone + Default> ToLines<M> for MultiLineString3DGeometry<M> {
131    fn to_lines(&self) -> VectorMultiLineString<M> {
132        self.coordinates.to_lines()
133    }
134}
135impl<M: Clone + Default> ToLines<M> for MultiPolygon3DGeometry<M> {
136    fn to_lines(&self) -> VectorMultiLineString<M> {
137        self.coordinates.to_lines()
138    }
139}
140
141// Feature Point types
142
143impl<M: Clone + Default> ToLines<M> for Point {
144    fn to_lines(&self) -> VectorMultiLineString<M> {
145        vec![]
146    }
147}
148impl<M: Clone + Default> ToLines<M> for MultiPoint {
149    fn to_lines(&self) -> VectorMultiLineString<M> {
150        vec![self.iter().map(VectorPoint::from).collect()]
151    }
152}
153impl<M: Clone + Default> ToLines<M> for MultiLineString {
154    fn to_lines(&self) -> VectorMultiLineString<M> {
155        self.iter().flat_map(|l| l.to_lines()).collect()
156    }
157}
158impl<M: Clone + Default> ToLines<M> for MultiPolygon {
159    fn to_lines(&self) -> VectorMultiLineString<M> {
160        self.iter().flat_map(|p| p.to_lines()).collect()
161    }
162}
163impl<M: Clone + Default> ToLines<M> for Point3D {
164    fn to_lines(&self) -> VectorMultiLineString<M> {
165        vec![]
166    }
167}
168impl<M: Clone + Default> ToLines<M> for MultiPoint3D {
169    fn to_lines(&self) -> VectorMultiLineString<M> {
170        vec![self.iter().map(VectorPoint::from).collect()]
171    }
172}
173impl<M: Clone + Default> ToLines<M> for MultiLineString3D {
174    fn to_lines(&self) -> VectorMultiLineString<M> {
175        self.iter().flat_map(|l| l.to_lines()).collect()
176    }
177}
178impl<M: Clone + Default> ToLines<M> for MultiPolygon3D {
179    fn to_lines(&self) -> VectorMultiLineString<M> {
180        self.iter().flat_map(|p| p.to_lines()).collect()
181    }
182}
183
184// Vector Feature and below
185
186impl<M, P: Clone + Default, D: Clone + Default> ToLines<D> for VectorFeature<M, P, D> {
187    fn to_lines(&self) -> VectorMultiLineString<D> {
188        self.geometry.to_lines()
189    }
190}
191impl<M: Clone + Default> ToLines<M> for VectorGeometry<M> {
192    fn to_lines(&self) -> VectorMultiLineString<M> {
193        match self {
194            VectorGeometry::Point(g) => g.to_lines(),
195            VectorGeometry::MultiPoint(g) => g.to_lines(),
196            VectorGeometry::LineString(g) => g.to_lines(),
197            VectorGeometry::MultiLineString(g) => g.to_lines(),
198            VectorGeometry::Polygon(g) => g.to_lines(),
199            VectorGeometry::MultiPolygon(g) => g.to_lines(),
200        }
201    }
202}
203impl<M: Clone + Default> ToLines<M> for VectorPointGeometry<M> {
204    fn to_lines(&self) -> VectorMultiLineString<M> {
205        self.coordinates.to_lines()
206    }
207}
208impl<M: Clone + Default> ToLines<M> for VectorMultiPointGeometry<M> {
209    fn to_lines(&self) -> VectorMultiLineString<M> {
210        self.coordinates.to_lines()
211    }
212}
213impl<M: Clone + Default> ToLines<M> for VectorMultiLineStringGeometry<M> {
214    fn to_lines(&self) -> VectorMultiLineString<M> {
215        self.coordinates.to_lines()
216    }
217}
218impl<M: Clone + Default> ToLines<M> for VectorMultiPolygonGeometry<M> {
219    fn to_lines(&self) -> VectorMultiLineString<M> {
220        self.coordinates.to_lines()
221    }
222}
223
224// Vector Point Types
225
226impl<M: Clone + Default> ToLines<M> for VectorPoint<M> {
227    fn to_lines(&self) -> VectorMultiLineString<M> {
228        vec![]
229    }
230}
231impl<M: Clone + Default> ToLines<M> for VectorMultiPoint<M> {
232    fn to_lines(&self) -> VectorMultiLineString<M> {
233        vec![self.clone()]
234    }
235}
236impl<M: Clone + Default> ToLines<M> for VectorMultiLineString<M> {
237    fn to_lines(&self) -> VectorMultiLineString<M> {
238        self.iter().flat_map(|l| l.to_lines()).collect()
239    }
240}
241impl<M: Clone + Default> ToLines<M> for VectorMultiPolygon<M> {
242    fn to_lines(&self) -> VectorMultiLineString<M> {
243        self.iter().flat_map(|p| p.to_lines()).collect()
244    }
245}
246
247// Features
248
249impl<M, P: Clone + Default, D: Clone + Default> ToLines<D> for Features<M, P, D> {
250    fn to_lines(&self) -> VectorMultiLineString<D> {
251        match self {
252            Features::Feature(f) => f.to_lines(),
253            Features::VectorFeature(g) => g.to_lines(),
254        }
255    }
256}