1use crate::*;
2use alloc::vec::Vec;
3use serde::{Deserialize, Serialize};
4
5#[derive(Serialize, Deserialize, Copy, Clone, Debug, PartialEq, Default)]
7pub enum VectorGeometryType {
8 #[default]
10 Point,
11 MultiPoint,
13 LineString,
15 MultiLineString,
17 Polygon,
19 MultiPolygon,
21}
22impl From<&str> for VectorGeometryType {
23 fn from(s: &str) -> Self {
24 match s {
25 "Point" => VectorGeometryType::Point,
26 "MultiPoint" => VectorGeometryType::MultiPoint,
27 "LineString" => VectorGeometryType::LineString,
28 "MultiLineString" => VectorGeometryType::MultiLineString,
29 "Polygon" => VectorGeometryType::Polygon,
30 "MultiPolygon" => VectorGeometryType::MultiPolygon,
31 _ => panic!("Invalid vector geometry type: {}", s),
32 }
33 }
34}
35
36pub type VectorMultiPoint<M = MValue> = Vec<VectorPoint<M>>;
38pub type VectorLineString<M = MValue> = Vec<VectorPoint<M>>;
40pub type VectorMultiLineString<M = MValue> = Vec<VectorLineString<M>>;
42pub type VectorPolygon<M = MValue> = Vec<VectorLineString<M>>;
44pub type VectorMultiPolygon<M = MValue> = Vec<VectorPolygon<M>>;
46
47#[derive(Clone, Serialize, Debug, PartialEq)]
49#[serde(untagged)]
50pub enum VectorGeometry<M: Clone + Default = MValue> {
51 Point(VectorPointGeometry<M>),
53 MultiPoint(VectorMultiPointGeometry<M>),
55 LineString(VectorLineStringGeometry<M>),
57 MultiLineString(VectorMultiLineStringGeometry<M>),
59 Polygon(VectorPolygonGeometry<M>),
61 MultiPolygon(VectorMultiPolygonGeometry<M>),
63}
64impl<M: Clone + Default> VectorGeometry<M> {
65 pub fn bbox(&self) -> &Option<BBox3D> {
67 match self {
68 VectorGeometry::Point(g) => &g.bbox,
69 VectorGeometry::MultiPoint(g) => &g.bbox,
70 VectorGeometry::LineString(g) => &g.bbox,
71 VectorGeometry::MultiLineString(g) => &g.bbox,
72 VectorGeometry::Polygon(g) => &g.bbox,
73 VectorGeometry::MultiPolygon(g) => &g.bbox,
74 }
75 }
76
77 pub fn vec_bbox(&self) -> &Option<BBox3D> {
79 match self {
80 VectorGeometry::Point(g) => &g.vec_bbox,
81 VectorGeometry::MultiPoint(g) => &g.vec_bbox,
82 VectorGeometry::LineString(g) => &g.vec_bbox,
83 VectorGeometry::MultiLineString(g) => &g.vec_bbox,
84 VectorGeometry::Polygon(g) => &g.vec_bbox,
85 VectorGeometry::MultiPolygon(g) => &g.vec_bbox,
86 }
87 }
88
89 pub fn new_point(coordinates: VectorPoint<M>, bbox: Option<BBox3D>) -> Self {
91 VectorGeometry::Point(VectorPointGeometry {
92 _type: VectorGeometryType::Point,
93 is_3d: coordinates.z.is_some(),
94 coordinates,
95 bbox,
96 ..Default::default()
97 })
98 }
99
100 pub fn new_multipoint(coordinates: VectorMultiPoint<M>, bbox: Option<BBox3D>) -> Self {
102 VectorGeometry::MultiPoint(VectorMultiPointGeometry {
103 _type: VectorGeometryType::MultiPoint,
104 is_3d: coordinates.iter().any(|point| point.z.is_some()),
105 coordinates,
106 bbox,
107 ..Default::default()
108 })
109 }
110
111 pub fn new_linestring(coordinates: VectorLineString<M>, bbox: Option<BBox3D>) -> Self {
113 VectorGeometry::LineString(VectorLineStringGeometry {
114 _type: VectorGeometryType::LineString,
115 is_3d: coordinates.iter().any(|point| point.z.is_some()),
116 coordinates,
117 bbox,
118 ..Default::default()
119 })
120 }
121
122 pub fn new_multilinestring(
124 coordinates: VectorMultiLineString<M>,
125 bbox: Option<BBox3D>,
126 ) -> Self {
127 VectorGeometry::MultiLineString(VectorMultiLineStringGeometry {
128 _type: VectorGeometryType::MultiLineString,
129 is_3d: coordinates.iter().any(|line| line.iter().any(|point| point.z.is_some())),
130 coordinates,
131 bbox,
132 ..Default::default()
133 })
134 }
135
136 pub fn new_polygon(coordinates: VectorPolygon<M>, bbox: Option<BBox3D>) -> Self {
138 VectorGeometry::Polygon(VectorPolygonGeometry {
139 _type: VectorGeometryType::Polygon,
140 is_3d: coordinates.iter().any(|ring| ring.iter().any(|point| point.z.is_some())),
141 coordinates,
142 bbox,
143 ..Default::default()
144 })
145 }
146
147 pub fn new_multipolygon(coordinates: VectorMultiPolygon<M>, bbox: Option<BBox3D>) -> Self {
149 VectorGeometry::MultiPolygon(VectorMultiPolygonGeometry {
150 _type: VectorGeometryType::MultiPolygon,
151 is_3d: coordinates.iter().any(|polygon| {
152 polygon.iter().any(|ring| ring.iter().any(|point| point.z.is_some()))
153 }),
154 coordinates,
155 bbox,
156 ..Default::default()
157 })
158 }
159}
160impl<M: Clone + Default> Default for VectorGeometry<M> {
161 fn default() -> Self {
162 VectorGeometry::Point(VectorPointGeometry::default())
163 }
164}
165
166#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Default)]
168pub struct VectorBaseGeometry<G = VectorGeometry, O = VectorOffsets> {
169 #[serde(rename = "type")]
171 pub _type: VectorGeometryType,
172 #[serde(rename = "is3D")]
174 pub is_3d: bool,
175 pub coordinates: G,
177 #[serde(skip_serializing_if = "Option::is_none")]
179 pub offset: Option<O>,
180 #[serde(skip_serializing_if = "Option::is_none")]
182 pub bbox: Option<BBox3D>,
183 #[serde(skip)]
185 pub vec_bbox: Option<BBox3D>,
186 pub indices: Option<Vec<u32>>,
188 pub tesselation: Option<f64>,
190}
191
192#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
194pub enum VectorOffsets {
195 LineOffset(VectorLineOffset),
197 MultiLineOffset(VectorMultiLineOffset),
199 PolygonOffset(VectorPolygonOffset),
201 MultiPolygonOffset(VectorMultiPolygonOffset),
203}
204impl Default for VectorOffsets {
205 fn default() -> Self {
206 VectorOffsets::LineOffset(0.0)
207 }
208}
209pub type VectorLineOffset = f64;
211pub type VectorMultiLineOffset = Vec<VectorLineOffset>;
213pub type VectorPolygonOffset = VectorMultiLineOffset;
215pub type VectorMultiPolygonOffset = Vec<VectorPolygonOffset>;
217
218pub type VectorPointGeometry<M = MValue> = VectorBaseGeometry<VectorPoint<M>>;
220pub type VectorMultiPointGeometry<M = MValue> =
222 VectorBaseGeometry<VectorMultiPoint<M>, VectorLineOffset>;
223pub type VectorLineStringGeometry<M = MValue> =
225 VectorBaseGeometry<VectorLineString<M>, VectorLineOffset>;
226pub type VectorMultiLineStringGeometry<M = MValue> =
228 VectorBaseGeometry<VectorMultiLineString<M>, VectorMultiLineOffset>;
229pub type VectorPolygonGeometry<M = MValue> =
231 VectorBaseGeometry<VectorPolygon<M>, VectorPolygonOffset>;
232pub type VectorMultiPolygonGeometry<M = MValue> =
234 VectorBaseGeometry<VectorMultiPolygon<M>, VectorMultiPolygonOffset>;