1use crate::{
2 data_structures::{ClusterOptions, GridOptions, HasLayer, TileStoreOptions},
3 parsers::RGBA,
4 readers::ReaderType,
5 writers::OnFeature,
6};
7use alloc::{collections::BTreeMap, string::String, vec, vec::Vec};
8use open_vector_tile::Extent;
9use s2_tilejson::{Attributions, DrawType, Encoding, LayerMetaData, SourceType};
10use s2json::{MValue, MValueCompatible, Projection, Properties, Shape, VectorFeature};
11use serde::{Deserialize, Serialize};
12
13#[derive(Debug, Clone, Default, Serialize, Deserialize)]
15pub struct ToTileMetadata {
16 pub layer_name: String,
18}
19impl ToTileMetadata {
20 pub fn new(layer_name: String) -> ToTileMetadata {
22 ToTileMetadata { layer_name }
23 }
24}
25impl HasLayer for ToTileMetadata {
26 fn get_layer(&self) -> Option<String> {
27 Some(self.layer_name.clone())
28 }
29}
30
31pub type MVectorFeature = VectorFeature<ToTileMetadata, Properties, MValue>;
33
34#[derive(Debug)]
36pub struct LayerHandler<M: Clone + HasLayer, P: MValueCompatible, D: MValueCompatible> {
37 pub layer_name: String,
39 pub on_feature: OnFeature<M, P, D>,
41}
42
43#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
45pub struct BaseLayer {
46 pub description: Option<String>,
48 pub source_name: String,
50 pub layer_name: String,
52}
53
54#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
56pub struct RasterLayerGuide {
57 pub output_type: String,
59 pub raster_guide: GridOptions<RGBA>,
61 #[serde(flatten)]
63 pub base: BaseLayer,
64}
65impl From<&RasterLayerGuide> for LayerMetaData {
66 #[cfg_attr(feature = "nightly", coverage(off))] fn from(lg: &RasterLayerGuide) -> Self {
68 LayerMetaData {
69 description: lg.base.description.clone(),
70 minzoom: lg.raster_guide.minzoom.unwrap_or(0),
71 maxzoom: lg.raster_guide.maxzoom.unwrap_or(16),
72 draw_types: vec![DrawType::Raster],
73 ..Default::default()
74 }
75 }
76}
77
78#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
80pub struct GridLayerGuide {
81 pub grid_guide: GridOptions<f64>,
83 pub extent: Extent,
85 #[serde(flatten)]
87 pub base: BaseLayer,
88}
89impl From<&GridLayerGuide> for LayerMetaData {
90 #[cfg_attr(feature = "nightly", coverage(off))] fn from(lg: &GridLayerGuide) -> Self {
92 LayerMetaData {
93 description: lg.base.description.clone(),
94 minzoom: lg.grid_guide.minzoom.unwrap_or(0),
95 maxzoom: lg.grid_guide.maxzoom.unwrap_or(16),
96 draw_types: vec![DrawType::Grid],
97 ..Default::default()
98 }
99 }
100}
101
102#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
104pub struct ClusterLayerGuide {
105 pub cluster_guide: ClusterOptions,
107 pub extent: Extent,
109 #[serde(flatten)]
111 pub base: BaseLayer,
112}
113impl From<&ClusterLayerGuide> for LayerMetaData {
114 fn from(lg: &ClusterLayerGuide) -> Self {
115 LayerMetaData {
116 description: lg.base.description.clone(),
117 minzoom: lg.cluster_guide.minzoom.unwrap_or(0),
118 maxzoom: lg.cluster_guide.maxzoom.unwrap_or(16),
119 draw_types: vec![DrawType::Points],
120 ..Default::default()
121 }
122 }
123}
124
125#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
127pub struct VectorLayerGuide {
128 pub vector_guide: TileStoreOptions,
130 pub extent: Extent,
132 pub shape: Option<Shape>,
134 pub m_shape: Option<Shape>,
136 pub draw_types: Vec<DrawType>,
140 #[serde(flatten)]
142 pub base: BaseLayer,
143}
144impl From<&VectorLayerGuide> for LayerMetaData {
145 fn from(lg: &VectorLayerGuide) -> Self {
146 LayerMetaData {
147 description: lg.base.description.clone(),
148 minzoom: lg.vector_guide.minzoom.unwrap_or(0),
149 maxzoom: lg.vector_guide.maxzoom.unwrap_or(16),
150 draw_types: vec![DrawType::Points],
151 shape: lg.shape.clone().unwrap_or_default(),
152 m_shape: lg.m_shape.clone(),
153 }
154 }
155}
156
157#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
159#[serde(untagged)]
160pub enum LayerGuide {
161 Raster(RasterLayerGuide),
163 Grid(GridLayerGuide),
165 Cluster(ClusterLayerGuide),
167 Vector(VectorLayerGuide),
169}
170impl LayerGuide {
171 pub fn zooms(&self) -> (u8, u8) {
173 match self {
174 LayerGuide::Raster(r) => {
175 (r.raster_guide.minzoom.unwrap_or(0), r.raster_guide.maxzoom.unwrap_or(16))
176 }
177 LayerGuide::Grid(g) => {
178 (g.grid_guide.minzoom.unwrap_or(0), g.grid_guide.maxzoom.unwrap_or(16))
179 }
180 LayerGuide::Cluster(c) => {
181 (c.cluster_guide.minzoom.unwrap_or(0), c.cluster_guide.maxzoom.unwrap_or(16))
182 }
183 LayerGuide::Vector(v) => {
184 (v.vector_guide.minzoom.unwrap_or(0), v.vector_guide.maxzoom.unwrap_or(16))
185 }
186 }
187 }
188
189 pub fn has_source(&self, source_name: &str) -> bool {
191 match self {
192 LayerGuide::Raster(r) => r.base.source_name == source_name,
193 LayerGuide::Grid(g) => g.base.source_name == source_name,
194 LayerGuide::Cluster(c) => c.base.source_name == source_name,
195 LayerGuide::Vector(v) => v.base.source_name == source_name,
196 }
197 }
198
199 pub fn layer_name(&self) -> &str {
201 match self {
202 LayerGuide::Raster(r) => &r.base.layer_name,
203 LayerGuide::Grid(g) => &g.base.layer_name,
204 LayerGuide::Cluster(c) => &c.base.layer_name,
205 LayerGuide::Vector(v) => &v.base.layer_name,
206 }
207 }
208
209 pub fn to_vector(&self) -> Option<VectorLayerGuide> {
211 match self {
212 LayerGuide::Vector(v) => Some(v.clone()),
213 _ => None,
214 }
215 }
216}
217impl Default for LayerGuide {
218 fn default() -> Self {
219 LayerGuide::Vector(VectorLayerGuide::default())
220 }
221}
222impl From<&LayerGuide> for LayerMetaData {
223 fn from(layer_guide: &LayerGuide) -> Self {
224 match layer_guide {
225 LayerGuide::Raster(r) => r.into(),
226 LayerGuide::Grid(g) => g.into(),
227 LayerGuide::Cluster(c) => c.into(),
228 LayerGuide::Vector(v) => v.into(),
229 }
230 }
231}
232
233#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq)]
245#[serde(rename_all = "kebab-case")]
246pub enum FormatOutput {
247 Mapbox,
249 FlatOpenS2,
251 #[default]
253 OpenS2,
254 Raster,
256}
257impl From<&str> for FormatOutput {
258 fn from(value: &str) -> Self {
259 match value {
260 "mapbox" => FormatOutput::Mapbox,
261 "flat-open-s2" => FormatOutput::FlatOpenS2,
262 "open-s2" => FormatOutput::OpenS2,
263 "raster" => FormatOutput::Raster,
264 _ => FormatOutput::OpenS2,
265 }
266 }
267}
268impl From<&FormatOutput> for SourceType {
269 fn from(value: &FormatOutput) -> Self {
270 match value {
271 FormatOutput::Mapbox | FormatOutput::FlatOpenS2 | FormatOutput::OpenS2 => {
272 SourceType::Vector
273 }
274 FormatOutput::Raster => SourceType::Raster,
275 }
276 }
277}
278
279#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
281pub struct Source {
282 pub source_name: String,
284 #[serde(rename = "inputType")]
286 pub input_type: ReaderType,
287}
288
289#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq)]
291pub enum WhichTileWriting {
292 #[default]
294 Local,
295 File,
297 MMap,
299}
300
301#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
303#[serde(default)]
304pub struct JSONBuildGuide {
305 pub name: String,
307 pub description: String,
309 pub version: String,
311 pub extension: String,
314 pub projection: Projection,
317 pub encoding: Encoding,
319 pub attribution: Attributions,
321 pub format: FormatOutput,
333 #[serde(rename = "vectorSources")]
337 pub vector_sources: Vec<Source>,
338 #[serde(rename = "rasterSources")]
340 pub raster_sources: Vec<Source>,
341 #[serde(rename = "gridSources")]
343 pub grid_sources: Vec<Source>,
344 #[serde(rename = "buildIndices")]
346 pub build_indices: bool,
347 #[serde(default, rename = "layerGuides")]
350 pub layer_guides: Vec<LayerGuide>,
351 pub threads: usize,
353 #[serde(default, rename = "tileWriter")]
355 pub tile_writer: WhichTileWriting,
356}
357impl Default for JSONBuildGuide {
358 fn default() -> Self {
359 JSONBuildGuide {
360 name: "auto generated".into(),
361 description: "generated via OpenS2 gis-tools".into(),
362 version: "1.0.0".into(),
363 extension: "pbf".into(),
364 projection: Projection::S2,
365 encoding: Encoding::None,
366 attribution: BTreeMap::default(),
367 format: FormatOutput::default(),
368 vector_sources: vec![],
369 raster_sources: vec![],
370 grid_sources: vec![],
371 build_indices: true,
372 layer_guides: vec![],
373 tile_writer: WhichTileWriting::Local,
374 threads: 1,
375 }
376 }
377}
378
379#[derive(Debug, Clone)]
381pub struct BuildGuide {
382 pub name: String,
384 pub description: String,
386 pub version: String,
388 pub extension: String,
391 pub projection: Projection,
394 pub encoding: Encoding,
396 pub attributions: Attributions,
398 pub format: FormatOutput,
410 pub build_indices: bool,
412 pub layer_guides: Vec<LayerGuide>,
414 pub threads: usize,
416}
417impl Default for BuildGuide {
418 fn default() -> Self {
419 BuildGuide {
420 name: "auto generated".into(),
421 description: "generated via OpenS2 gis-tools".into(),
422 version: "1.0.0".into(),
423 extension: "pbf".into(),
424 projection: Projection::S2,
425 encoding: Encoding::None,
426 attributions: BTreeMap::default(),
427 format: FormatOutput::default(),
428 build_indices: true,
429 layer_guides: vec![],
430 threads: 1,
431 }
432 }
433}