gistools/writers/tile/
file.rs1use super::{TemporalTileWriter, TileWriter};
2use crate::util::{CompressionFormat, Date};
3use alloc::{format, string::String, vec::Vec};
4use s2_tilejson::Metadata;
5use s2json::Face;
6use std::{
7 fs,
8 path::{Path, PathBuf},
9};
10
11#[derive(Debug)]
13pub struct FileTileWriter {
14 path: PathBuf,
16 extension: String,
18}
19impl FileTileWriter {
20 pub fn new<P: AsRef<Path>>(path: P, extension: Option<String>) -> Self {
22 Self {
23 path: path.as_ref().to_path_buf(),
24 extension: extension.unwrap_or("vector.pbf".into()),
25 }
26 }
27}
28impl TileWriter for FileTileWriter {
29 fn write_tile_wm(&mut self, zoom: u8, x: u32, y: u32, data: Vec<u8>) {
30 let dir_path = self.path.join(format!("{zoom}/{x}"));
31 fs::create_dir_all(&dir_path).expect("Failed to create directories");
32 let tile_path = dir_path.join(format!("{}.{}", y, self.extension));
33 fs::write(tile_path, data).expect("Failed to write tile data");
34 }
35 fn write_tile_s2(&mut self, face: Face, zoom: u8, x: u32, y: u32, data: Vec<u8>) {
36 let dir_path = self.path.join(format!("{}/{}/{}/{}", u8::from(face), zoom, x, y));
37 fs::create_dir_all(&dir_path).expect("Failed to create directories");
38 let tile_path = dir_path.join(format!("{}.{}", y, self.extension));
39 fs::write(tile_path, data).expect("Failed to write tile data");
40 }
41 fn commit(&mut self, metadata: Metadata, _tile_compression: Option<CompressionFormat>) {
42 fs::create_dir_all(&self.path).expect("Failed to create directories");
43 let meta_path = self.path.join("metadata.json");
44 fs::write(meta_path, serde_json::to_string(&metadata).unwrap())
45 .expect("Failed to write metadata");
46 }
47}
48impl TemporalTileWriter for FileTileWriter {
49 fn write_temporal_tile_wm(&mut self, time: Date, zoom: u8, x: u32, y: u32, data: Vec<u8>) {
50 let dir_path = self.path.join(format!("{}/{}/{}/{}", time.to_iso_string(), zoom, x, y));
51 fs::create_dir_all(&dir_path).expect("Failed to create directories");
52 let tile_path = dir_path.join(format!("{}.{}", y, self.extension));
53 fs::write(tile_path, data).expect("Failed to write tile data");
54 }
55 fn write_temporal_tile_s2(
56 &mut self,
57 time: Date,
58 face: Face,
59 zoom: u8,
60 x: u32,
61 y: u32,
62 data: Vec<u8>,
63 ) {
64 let dir_path = self.path.join(format!(
65 "{}/{}/{}/{}/{}",
66 time.to_iso_string(),
67 u8::from(face),
68 zoom,
69 x,
70 y
71 ));
72 fs::create_dir_all(&dir_path).expect("Failed to create directories");
73 let tile_path = dir_path.join(format!("{}.{}", y, self.extension));
74 fs::write(tile_path, data).expect("Failed to write tile data");
75 }
76}