open_vector_tile/open/
vector_layer.rs1use crate::{
2 base::BaseVectorLayer,
3 open::{
4 decode_shape, encode_shape, read_feature, write_feature, ColumnCacheReader,
5 ColumnCacheWriter, Extent, OpenVectorFeature,
6 },
7 VectorLayerMethods,
8};
9use alloc::{rc::Rc, string::String, vec::Vec};
10use core::cell::RefCell;
11use pbf::{ProtoRead, Protobuf};
12use s2json::Shape;
13
14#[derive(Debug)]
18pub struct OpenVectorLayer {
19 pub version: u16,
21 pub name: String,
23 pub extent: Extent,
25 pub features: Vec<OpenVectorFeature>,
27 shape: Option<Shape>,
28 m_shape: Option<Shape>,
29 cache: Rc<RefCell<ColumnCacheReader>>,
30}
31impl OpenVectorLayer {
32 pub fn new(cache: Rc<RefCell<ColumnCacheReader>>) -> OpenVectorLayer {
34 OpenVectorLayer {
35 version: 1,
36 name: String::new(),
37 extent: Extent::default(),
38 shape: None,
39 m_shape: None,
40 features: Vec::new(),
41 cache,
42 }
43 }
44}
45impl VectorLayerMethods for OpenVectorLayer {
46 fn version(&self) -> u16 {
47 self.version
48 }
49 fn name(&self) -> String {
50 self.name.clone()
51 }
52 fn extent(&self) -> usize {
53 self.extent.into()
54 }
55 fn len(&self) -> usize {
56 self.features.len()
57 }
58 fn is_empty(&self) -> bool {
59 self.features.is_empty()
60 }
61 fn feature(&mut self, i: usize) -> Option<&mut dyn crate::VectorFeatureMethods> {
62 self.features.get_mut(i).map(|f| f as &mut dyn crate::VectorFeatureMethods)
63 }
64}
65impl ProtoRead for OpenVectorLayer {
66 fn read(&mut self, tag: u64, pb: &mut Protobuf) {
67 match tag {
68 1 => self.version = pb.read_varint::<u16>(),
69 2 => {
70 self.name = {
71 let mut cache = self.cache.borrow_mut();
72 cache.get_string(pb.read_varint())
73 }
74 }
75 3 => self.extent = pb.read_varint::<Extent>(),
76 4 => self.features.push(read_feature(
77 pb.read_bytes(),
78 self.extent,
79 self.cache.clone(),
80 &self.shape.clone().unwrap_or_default(),
81 self.m_shape.clone().unwrap_or_default(),
82 )),
83 5 => {
84 self.shape = {
85 let mut cache = self.cache.borrow_mut();
86 Some(decode_shape(pb.read_varint(), &mut cache))
87 }
88 }
89 6 => {
90 self.m_shape = {
91 let mut cache: core::cell::RefMut<ColumnCacheReader> = self.cache.borrow_mut();
92 Some(decode_shape(pb.read_varint(), &mut cache))
93 }
94 }
95 #[tarpaulin::skip]
96 _ => panic!("unknown tag: {}", tag),
97 }
98 }
99}
100
101pub fn write_layer(layer: &mut BaseVectorLayer, cache: &mut ColumnCacheWriter) -> Vec<u8> {
103 let mut pbf = Protobuf::new();
104
105 pbf.write_varint_field(1, layer.version);
106 pbf.write_varint_field(2, cache.add_string(layer.name.clone()));
107 pbf.write_varint_field(3, layer.extent);
108 pbf.write_varint_field(5, encode_shape(&layer.shape, cache));
109 if let Some(ref m_shape) = layer.m_shape {
110 pbf.write_varint_field(6, encode_shape(m_shape, cache));
111 }
112
113 layer.features.sort_by_key(|a| a.get_type());
115
116 for feature in &layer.features {
117 pbf.write_bytes_field(
118 4,
119 &write_feature(feature, &layer.shape, layer.m_shape.as_ref(), cache),
120 );
121 }
122
123 pbf.take()
124}