gistools/geometry/tools/lines/
to_lines.rs1use 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
12pub trait ToLines<M: Clone + Default> {
46 fn to_lines(&self) -> VectorMultiLineString<M>;
50}
51
52impl<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
141impl<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
184impl<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
224impl<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
247impl<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}