open_vector_tile/
vector_tile.rs1use crate::{
2 VectorGeometry, VectorLines3DWithOffset, VectorLinesWithOffset, VectorPoints, VectorPoints3D,
3 base::BaseVectorTile,
4 mapbox::MapboxVectorLayer,
5 open::{
6 ColumnCacheReader, ColumnCacheWriter, FeatureType, GridData, ImageData, OpenVectorLayer,
7 write_layer,
8 },
9};
10use alloc::{collections::BTreeMap, rc::Rc, string::String, vec::Vec};
11use core::cell::RefCell;
12use pbf::{ProtoRead, Protobuf};
13use s2json::{BBOX, Properties};
14
15pub trait VectorFeatureMethods {
17 fn id(&self) -> Option<u64>;
19 fn version(&self) -> u16;
21 fn properties(&self) -> Properties;
23 fn extent(&self) -> usize;
25 fn get_type(&self) -> FeatureType;
27 fn bbox(&self) -> Option<BBOX>;
29 fn has_m_values(&self) -> bool;
31 fn is_points(&self) -> bool;
33 fn is_lines(&self) -> bool;
35 fn is_polygons(&self) -> bool;
37 fn is_points_3d(&self) -> bool;
39 fn is_lines_3d(&self) -> bool;
41 fn is_polygons_3d(&self) -> bool;
43 fn load_points(&mut self) -> VectorPoints;
45 fn load_points_3d(&mut self) -> VectorPoints3D;
47 fn load_lines(&mut self) -> VectorLinesWithOffset;
49 fn load_lines_3d(&mut self) -> VectorLines3DWithOffset;
51 fn load_polys(&mut self) -> Vec<VectorLinesWithOffset>;
53 fn load_polys_3d(&mut self) -> Vec<VectorLines3DWithOffset>;
55 fn load_geometry_flat(&mut self) -> (Vec<f64>, Vec<u32>);
57 fn load_geometry(&mut self) -> VectorGeometry;
59 fn read_indices(&mut self) -> Vec<u32>;
61 fn add_tessellation(&mut self, geometry: &mut Vec<f64>, multiplier: f64);
63 fn add_tessellation_3d(&mut self, geometry: &mut Vec<f64>, multiplier: f64);
65}
66
67pub trait VectorLayerMethods {
69 fn version(&self) -> u16;
71 fn name(&self) -> String;
73 fn extent(&self) -> usize;
76 fn feature(&mut self, i: usize) -> Option<&mut dyn VectorFeatureMethods>;
78 fn len(&self) -> usize;
80 fn is_empty(&self) -> bool;
82}
83
84#[derive(Debug)]
86pub enum VectorLayer {
87 Mapbox(MapboxVectorLayer),
89 Open(OpenVectorLayer),
91}
92impl VectorLayerMethods for VectorLayer {
93 fn version(&self) -> u16 {
94 match self {
95 VectorLayer::Mapbox(layer) => layer.version(),
96 VectorLayer::Open(layer) => layer.version(),
97 }
98 }
99
100 fn name(&self) -> String {
101 match self {
102 VectorLayer::Mapbox(layer) => layer.name(),
103 VectorLayer::Open(layer) => layer.name(),
104 }
105 }
106
107 fn extent(&self) -> usize {
108 match self {
109 VectorLayer::Mapbox(layer) => layer.extent(),
110 VectorLayer::Open(layer) => layer.extent(),
111 }
112 }
113
114 fn feature(&mut self, i: usize) -> Option<&mut dyn VectorFeatureMethods> {
115 match self {
116 VectorLayer::Mapbox(layer) => layer.feature(i),
117 VectorLayer::Open(layer) => layer.feature(i),
118 }
119 }
120
121 fn len(&self) -> usize {
122 match self {
123 VectorLayer::Mapbox(layer) => layer.len(),
124 VectorLayer::Open(layer) => layer.len(),
125 }
126 }
127
128 fn is_empty(&self) -> bool {
129 match self {
130 VectorLayer::Mapbox(layer) => layer.is_empty(),
131 VectorLayer::Open(layer) => layer.is_empty(),
132 }
133 }
134}
135
136#[derive(Debug)]
184pub struct VectorTile {
185 pub layers: BTreeMap<String, VectorLayer>,
187 layer_indexes: Vec<usize>,
190 pbf: Rc<RefCell<Protobuf>>,
192 columns: Option<Rc<RefCell<ColumnCacheReader>>>,
194 pub grids: BTreeMap<String, GridData>,
196 pub images: BTreeMap<String, ImageData>,
198}
199impl VectorTile {
200 pub fn new(data: Vec<u8>, end: Option<usize>) -> Self {
202 let pbf = Rc::new(RefCell::new(data.into()));
203 let mut vt = VectorTile {
204 pbf: pbf.clone(),
205 columns: None,
206 layer_indexes: Vec::new(),
207 layers: BTreeMap::new(),
208 grids: BTreeMap::new(),
209 images: BTreeMap::new(),
210 };
211
212 pbf.borrow_mut().read_fields(&mut vt, end);
213
214 if !vt.layer_indexes.is_empty() {
215 vt.read_layers();
216 }
217
218 vt
219 }
220
221 pub fn read_layers(&mut self) -> Option<()> {
223 let layer_indexes = self.layer_indexes.clone();
224 let mut tmp_pbf = self.pbf.borrow_mut();
225 let cache = self.columns.as_ref()?.clone();
226
227 for pos in layer_indexes {
228 tmp_pbf.set_pos(pos);
229 let mut layer = OpenVectorLayer::new(cache.clone());
230 tmp_pbf.read_message(&mut layer);
231 self.layers.insert(layer.name.clone(), VectorLayer::Open(layer));
232 }
233
234 Some(())
235 }
236
237 pub fn layer(&mut self, name: &str) -> Option<&mut VectorLayer> {
239 self.layers.get_mut(name)
240 }
241}
242impl ProtoRead for VectorTile {
243 fn read(&mut self, tag: u64, pb: &mut Protobuf) {
244 match tag {
245 1 | 3 => {
246 let mut layer = MapboxVectorLayer::new(self.pbf.clone(), tag == 1);
247 pb.read_message(&mut layer);
248 self.layers.insert(layer.name.clone(), VectorLayer::Mapbox(layer));
249 }
250 4 => {
251 self.layer_indexes.push(pb.get_pos());
254 }
255 5 => {
256 let mut column_reader = ColumnCacheReader::new();
257 pb.read_message(&mut column_reader);
258 self.columns = Some(Rc::new(RefCell::new(column_reader)));
259 }
260 6 => {
261 let mut grid = GridData::default();
262 pb.read_message(&mut grid);
263 self.grids.insert(grid.name.clone(), grid);
264 }
265 7 => {
266 let mut image = ImageData::default();
267 pb.read_message(&mut image);
268 self.images.insert(image.name.clone(), image);
269 }
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(grids) = grids {
294 for grid in grids.iter() {
295 pbf.write_message(6, *grid);
296 }
297 }
298 if let Some(images) = images {
300 for image in images.iter() {
301 pbf.write_message(7, *image);
302 }
303 }
304
305 pbf.take()
306}