gistools/writers/tile/
file.rs

1use 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/// A Folder-File tile writer
12#[derive(Debug)]
13pub struct FileTileWriter {
14    /// The tiles
15    path: PathBuf,
16    /// The extension
17    extension: String,
18}
19impl FileTileWriter {
20    /// Create a new Tile FileWriter, truncating the file if it exists
21    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}