1pub mod raster;
3
4use crate::{data_structures::HasLayer, parsers::RGBA};
5use alloc::string::String;
6pub use raster::*;
7use s2_tilejson::{Metadata, Scheme};
8use s2json::{Face, MValueCompatible, VectorFeature};
9use serde::{Deserialize, Serialize};
10use std::path::{Path, PathBuf};
11
12#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq)]
14pub struct S2TileMetadata {
15 pub face: Face,
17 pub zoom: u8,
19 pub x: u32,
21 pub y: u32,
23}
24
25#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq)]
27pub struct WMTileMetadata {
28 pub zoom: u8,
30 pub x: u32,
32 pub y: u32,
34}
35
36#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
38pub enum TileMetadata {
39 WM(WMTileMetadata),
41 S2(S2TileMetadata),
43}
44impl Default for TileMetadata {
45 fn default() -> Self {
46 Self::WM(WMTileMetadata::default())
47 }
48}
49impl HasLayer for TileMetadata {
50 fn get_layer(&self) -> Option<String> {
51 None
52 }
53}
54
55pub trait TileFetcher<
57 P: Clone + Default,
59 D: Clone + Default,
61 T: TileReader<P, D>,
63>
64{
65 fn new<R: AsRef<Path>>(path: R, threshold: Option<u8>) -> Self;
67 fn get_metadata(&self) -> &Metadata;
69 fn has_tile_wm(&self, zoom: u8, x: u32, y: u32) -> bool;
71 fn has_tile_s2(&self, face: Face, zoom: u8, x: u32, y: u32) -> bool;
73 fn get_tile_wm(&self, zoom: u8, x: u32, y: u32) -> T;
75 fn get_tile_s2(&self, face: Face, zoom: u8, x: u32, y: u32) -> T;
77 fn is_s2(&self) -> bool {
79 let Metadata { scheme, .. } = self.get_metadata();
80 *scheme == Scheme::Fzxy || *scheme == Scheme::Tfzxy
81 }
82}
83
84pub trait TileReader<P: Clone + Default, D: Clone + Default> {
86 fn new(
88 path: PathBuf,
89 metadata: &Metadata,
90 face: Face,
91 zoom: u8,
92 x: u32,
93 y: u32,
94 is_s2: bool,
95 ) -> Self;
96 fn build_feature(&self) -> VectorFeature<TileMetadata, P, D>;
98}
99
100pub type ElevationConverter = fn(r: u8, g: u8, b: u8, a: Option<u8>) -> f64;
102
103pub fn convert_terrarium_elevation_data(r: u8, g: u8, b: u8) -> f64 {
105 (r as f64) * 256.0 + (g as f64) + (b as f64) / 256.0 - 32768.0
106}
107
108pub fn convert_mapbox_elevation_data(r: u8, g: u8, b: u8) -> f64 {
110 -10000. + ((r as f64) * 256. * 256. + (g as f64) * 256. + (b as f64)) * 0.1
111}
112
113pub trait GetRasterTileValue {
115 fn get_raster_tile_value(r: u8, g: u8, b: u8, a: Option<u8>) -> Self;
117}
118
119#[derive(Debug, Default, Clone, MValueCompatible, Serialize, Deserialize)]
121pub struct TerrariumElevation {
122 pub elev: f64,
124}
125impl GetRasterTileValue for TerrariumElevation {
126 fn get_raster_tile_value(r: u8, g: u8, b: u8, _a: Option<u8>) -> Self {
127 TerrariumElevation { elev: convert_terrarium_elevation_data(r, g, b) }
128 }
129}
130
131#[derive(Debug, Default, Clone, MValueCompatible, Serialize, Deserialize)]
133pub struct MapboxElevation {
134 pub elev: f64,
136}
137impl GetRasterTileValue for MapboxElevation {
138 fn get_raster_tile_value(r: u8, g: u8, b: u8, _a: Option<u8>) -> Self {
139 MapboxElevation { elev: convert_mapbox_elevation_data(r, g, b) }
140 }
141}
142
143impl GetRasterTileValue for RGBA {
144 fn get_raster_tile_value(r: u8, g: u8, b: u8, a: Option<u8>) -> Self {
145 RGBA::from_u8s(r, g, b, a.unwrap_or(255))
146 }
147}