1use pbf::{ProtoRead, Protobuf};
2
3use alloc::{collections::BTreeMap, rc::Rc, string::String, vec::Vec};
4
5use core::cell::RefCell;
6
7use crate::{
8 base::BaseVectorTile,
9 mapbox::MapboxVectorLayer,
10 open::{
11 write_layer, ColumnCacheReader, ColumnCacheWriter, FeatureType, GridData, ImageData,
12 OpenVectorLayer, Properties,
13 },
14 VectorGeometry, VectorLines3DWithOffset, VectorLinesWithOffset, VectorPoints, VectorPoints3D,
15 BBOX,
16};
17
18pub trait VectorFeatureMethods {
20 fn id(&self) -> Option<u64>;
22 fn version(&self) -> u16;
24 fn properties(&self) -> Properties;
26 fn extent(&self) -> usize;
28 fn get_type(&self) -> FeatureType;
30 fn bbox(&self) -> Option<BBOX>;
32 fn has_m_values(&self) -> bool;
34 fn is_points(&self) -> bool;
36 fn is_lines(&self) -> bool;
38 fn is_polygons(&self) -> bool;
40 fn is_points_3d(&self) -> bool;
42 fn is_lines_3d(&self) -> bool;
44 fn is_polygons_3d(&self) -> bool;
46 fn load_points(&mut self) -> VectorPoints;
48 fn load_points_3d(&mut self) -> VectorPoints3D;
50 fn load_lines(&mut self) -> VectorLinesWithOffset;
52 fn load_lines_3d(&mut self) -> VectorLines3DWithOffset;
54 fn load_geometry_flat(&mut self) -> (Vec<f64>, Vec<u32>);
56 fn load_geometry(&mut self) -> VectorGeometry;
58 fn read_indices(&mut self) -> Vec<u32>;
60 fn add_tesselation(&mut self, geometry: &mut Vec<f64>, multiplier: f64);
62 fn add_tesselation_3d(&mut self, geometry: &mut Vec<f64>, multiplier: f64);
64}
65
66pub trait VectorLayerMethods {
68 fn version(&self) -> u16;
70 fn name(&self) -> String;
72 fn extent(&self) -> usize;
75 fn feature(&mut self, i: usize) -> Option<&mut dyn VectorFeatureMethods>;
77 fn len(&self) -> usize;
79 fn is_empty(&self) -> bool;
81}
82
83#[derive(Debug)]
85pub enum VectorLayer {
86 Mapbox(MapboxVectorLayer),
88 Open(OpenVectorLayer),
90}
91impl VectorLayerMethods for VectorLayer {
92 fn version(&self) -> u16 {
93 match self {
94 VectorLayer::Mapbox(layer) => layer.version(),
95 VectorLayer::Open(layer) => layer.version(),
96 }
97 }
98
99 fn name(&self) -> String {
100 match self {
101 VectorLayer::Mapbox(layer) => layer.name(),
102 VectorLayer::Open(layer) => layer.name(),
103 }
104 }
105
106 fn extent(&self) -> usize {
107 match self {
108 VectorLayer::Mapbox(layer) => layer.extent(),
109 VectorLayer::Open(layer) => layer.extent(),
110 }
111 }
112
113 fn feature(&mut self, i: usize) -> Option<&mut dyn VectorFeatureMethods> {
114 match self {
115 VectorLayer::Mapbox(layer) => layer.feature(i),
116 VectorLayer::Open(layer) => layer.feature(i),
117 }
118 }
119
120 fn len(&self) -> usize {
121 match self {
122 VectorLayer::Mapbox(layer) => layer.len(),
123 VectorLayer::Open(layer) => layer.len(),
124 }
125 }
126
127 fn is_empty(&self) -> bool {
128 match self {
129 VectorLayer::Mapbox(layer) => layer.is_empty(),
130 VectorLayer::Open(layer) => layer.is_empty(),
131 }
132 }
133}
134
135#[derive(Debug)]
183pub struct VectorTile {
184 pub layers: BTreeMap<String, VectorLayer>,
186 layer_indexes: Vec<usize>,
189 pbf: Rc<RefCell<Protobuf>>,
191 columns: Option<Rc<RefCell<ColumnCacheReader>>>,
193 pub grids: BTreeMap<String, GridData>,
195 pub images: BTreeMap<String, ImageData>,
197}
198impl VectorTile {
199 pub fn new(data: Vec<u8>, end: Option<usize>) -> Self {
201 let pbf = Rc::new(RefCell::new(data.into()));
202 let mut vt = VectorTile {
203 pbf: pbf.clone(),
204 columns: None,
205 layer_indexes: Vec::new(),
206 layers: BTreeMap::new(),
207 grids: BTreeMap::new(),
208 images: BTreeMap::new(),
209 };
210
211 pbf.borrow_mut().read_fields(&mut vt, end);
212
213 if !vt.layer_indexes.is_empty() {
214 vt.read_layers();
215 }
216
217 vt
218 }
219
220 pub fn read_layers(&mut self) -> Option<()> {
222 let layer_indexes = self.layer_indexes.clone();
223 let mut tmp_pbf = self.pbf.borrow_mut();
224 let cache = self.columns.as_ref()?.clone();
225
226 for pos in layer_indexes {
227 tmp_pbf.set_pos(pos);
228 let mut layer = OpenVectorLayer::new(cache.clone());
229 tmp_pbf.read_message(&mut layer);
230 self.layers.insert(layer.name.clone(), VectorLayer::Open(layer));
231 }
232
233 Some(())
234 }
235
236 pub fn layer(&mut self, name: &str) -> Option<&mut VectorLayer> {
238 self.layers.get_mut(name)
239 }
240}
241impl ProtoRead for VectorTile {
242 fn read(&mut self, tag: u64, pb: &mut Protobuf) {
243 match tag {
244 1 | 3 => {
245 let mut layer = MapboxVectorLayer::new(self.pbf.clone(), tag == 1);
246 pb.read_message(&mut layer);
247 self.layers.insert(layer.name.clone(), VectorLayer::Mapbox(layer));
248 }
249 4 => {
250 self.layer_indexes.push(pb.get_pos());
253 }
254 5 => {
255 let mut column_reader = ColumnCacheReader::new();
256 pb.read_message(&mut column_reader);
257 self.columns = Some(Rc::new(RefCell::new(column_reader)));
258 }
259 6 => {
260 let mut grid = GridData::default();
261 pb.read_message(&mut grid);
262 self.grids.insert(grid.name.clone(), grid);
263 }
264 7 => {
265 let mut image = ImageData::default();
266 pb.read_message(&mut image);
267 self.images.insert(image.name.clone(), image);
268 }
269 #[tarpaulin::skip]
270 _ => panic!("unknown tag: {}", tag),
271 }
272 }
273}
274
275pub fn write_tile(
277 tile: Option<&mut BaseVectorTile>,
278 images: Option<Vec<&ImageData>>,
279 grids: Option<Vec<&GridData>>,
280) -> Vec<u8> {
281 let mut pbf = Protobuf::new();
282 let mut cache = ColumnCacheWriter::default();
283
284 if let Some(tile) = tile {
286 for layer in tile.layers.values_mut() {
287 pbf.write_bytes_field(4, &write_layer(layer, &mut cache));
288 }
289 pbf.write_message(5, &cache);
291 }
292 if let Some(images) = images {
294 for image in images.iter() {
295 pbf.write_message(7, *image);
296 }
297 }
298 if let Some(grids) = grids {
300 for grid in grids.iter() {
301 pbf.write_message(6, *grid);
302 }
303 }
304
305 pbf.take()
306}