1use crate::*;
2use alloc::vec::Vec;
3use serde::{Deserialize, Serialize};
4
5#[derive(Copy, Clone, Serialize, Deserialize, Debug, PartialEq, Default)]
7pub struct Point(pub f64, pub f64);
8pub type MultiPoint = Vec<Point>;
10pub type LineString = Vec<Point>;
12pub type MultiLineString = Vec<LineString>;
14pub type Polygon = Vec<Vec<Point>>;
16pub type MultiPolygon = Vec<Polygon>;
18#[derive(Copy, Clone, Serialize, Deserialize, Debug, PartialEq, Default)]
20pub struct Point3D(pub f64, pub f64, pub f64);
21pub type MultiPoint3D = Vec<Point3D>;
23pub type LineString3D = Vec<Point3D>;
25pub type MultiLineString3D = Vec<LineString3D>;
27pub type Polygon3D = Vec<Vec<Point3D>>;
29pub type MultiPolygon3D = Vec<Polygon3D>;
31#[derive(Copy, Clone, Serialize, Deserialize, Debug, PartialEq, Default)]
33pub struct PointOrPoint3D(pub f64, pub f64, pub Option<f64>);
34impl From<Point> for PointOrPoint3D {
35 fn from(p: Point) -> Self {
36 PointOrPoint3D(p.0, p.1, None)
37 }
38}
39impl From<Point3D> for PointOrPoint3D {
40 fn from(p: Point3D) -> Self {
41 PointOrPoint3D(p.0, p.1, Some(p.2))
42 }
43}
44
45impl GetXY for Point {
46 fn x(&self) -> f64 {
47 self.0
48 }
49 fn y(&self) -> f64 {
50 self.1
51 }
52}
53impl GetZ for Point {
54 fn z(&self) -> Option<f64> {
55 None
56 }
57}
58impl GetXYZ for Point {}
59impl GetXY for Point3D {
60 fn x(&self) -> f64 {
61 self.0
62 }
63 fn y(&self) -> f64 {
64 self.1
65 }
66}
67impl GetXY for PointOrPoint3D {
68 fn x(&self) -> f64 {
69 self.0
70 }
71 fn y(&self) -> f64 {
72 self.1
73 }
74}
75impl GetZ for Point3D {
76 fn z(&self) -> Option<f64> {
77 Some(self.2)
78 }
79}
80impl GetXYZ for Point3D {}
81impl GetZ for PointOrPoint3D {
82 fn z(&self) -> Option<f64> {
83 self.2
84 }
85}
86impl GetXYZ for PointOrPoint3D {}
87
88#[derive(Serialize, Deserialize, Copy, Clone, Debug, PartialEq, Default)]
90pub enum GeometryType {
91 #[default]
93 Point,
94 MultiPoint,
96 LineString,
98 MultiLineString,
100 Polygon,
102 MultiPolygon,
104 Point3D,
106 MultiPoint3D,
108 LineString3D,
110 MultiLineString3D,
112 Polygon3D,
114 MultiPolygon3D,
116}
117impl From<&str> for GeometryType {
118 fn from(s: &str) -> Self {
119 match s {
120 "Point" => GeometryType::Point,
121 "MultiPoint" => GeometryType::MultiPoint,
122 "LineString" => GeometryType::LineString,
123 "MultiLineString" => GeometryType::MultiLineString,
124 "Polygon" => GeometryType::Polygon,
125 "MultiPolygon" => GeometryType::MultiPolygon,
126 "Point3D" => GeometryType::Point3D,
127 "MultiPoint3D" => GeometryType::MultiPoint3D,
128 "LineString3D" => GeometryType::LineString3D,
129 "MultiLineString3D" => GeometryType::MultiLineString3D,
130 "Polygon3D" => GeometryType::Polygon3D,
131 "MultiPolygon3D" => GeometryType::MultiPolygon3D,
132 _ => panic!("Invalid geometry type: {}", s),
133 }
134 }
135}
136
137#[derive(Clone, Serialize, Debug, PartialEq)]
139#[serde(untagged)]
140pub enum Geometry<M: Clone + Default = MValue> {
141 Point(PointGeometry<M>),
143 MultiPoint(MultiPointGeometry<M>),
145 LineString(LineStringGeometry<M>),
147 MultiLineString(MultiLineStringGeometry<M>),
149 Polygon(PolygonGeometry<M>),
151 MultiPolygon(MultiPolygonGeometry<M>),
153 Point3D(Point3DGeometry<M>),
155 MultiPoint3D(MultiPoint3DGeometry<M>),
157 LineString3D(LineString3DGeometry<M>),
159 MultiLineString3D(MultiLineString3DGeometry<M>),
161 Polygon3D(Polygon3DGeometry<M>),
163 MultiPolygon3D(MultiPolygon3DGeometry<M>),
165}
166impl<M: Clone + Default> Default for Geometry<M> {
167 fn default() -> Self {
168 Geometry::Point(PointGeometry::<M>::default())
169 }
170}
171
172#[derive(Serialize, Deserialize, Copy, Clone, Debug, PartialEq, Default)]
174pub struct BaseGeometry<M = MValue, G = Geometry<M>, B = BBOX> {
175 #[serde(rename = "type")]
177 pub _type: GeometryType,
178 pub coordinates: G,
180 #[serde(rename = "mValues", skip_serializing_if = "Option::is_none")]
182 pub m_values: Option<M>,
183 #[serde(skip_serializing_if = "Option::is_none")]
185 pub bbox: Option<B>,
186}
187
188pub type PointGeometry<M = MValue> = BaseGeometry<M, Point, BBox>;
190pub type MultiPointGeometry<M = MValue> = BaseGeometry<LineStringMValues<M>, MultiPoint, BBox>;
192pub type LineStringGeometry<M = MValue> = BaseGeometry<LineStringMValues<M>, LineString, BBox>;
194pub type MultiLineStringGeometry<M = MValue> =
196 BaseGeometry<MultiLineStringMValues<M>, MultiLineString, BBox>;
197pub type PolygonGeometry<M = MValue> = BaseGeometry<PolygonMValues<M>, Polygon, BBox>;
199pub type MultiPolygonGeometry<M = MValue> =
201 BaseGeometry<MultiPolygonMValues<M>, MultiPolygon, BBox>;
202pub type Point3DGeometry<M = MValue> = BaseGeometry<M, Point3D, BBox3D>;
204pub type MultiPoint3DGeometry<M = MValue> =
206 BaseGeometry<LineStringMValues<M>, MultiPoint3D, BBox3D>;
207pub type LineString3DGeometry<M = MValue> =
209 BaseGeometry<LineStringMValues<M>, LineString3D, BBox3D>;
210pub type MultiLineString3DGeometry<M = MValue> =
212 BaseGeometry<MultiLineStringMValues<M>, MultiLineString3D, BBox3D>;
213pub type Polygon3DGeometry<M = MValue> = BaseGeometry<PolygonMValues<M>, Polygon3D, BBox3D>;
215pub type MultiPolygon3DGeometry<M = MValue> =
217 BaseGeometry<MultiPolygonMValues<M>, MultiPolygon3D, BBox3D>;