diff --git a/nusamai/src/sink/mvt/mod.rs b/nusamai/src/sink/mvt/mod.rs index 7457041e..10d9dbdd 100644 --- a/nusamai/src/sink/mvt/mod.rs +++ b/nusamai/src/sink/mvt/mod.rs @@ -2,6 +2,7 @@ mod slice; mod tags; +mod tileid; use std::{ convert::Infallible, @@ -21,7 +22,8 @@ use rayon::prelude::*; use serde::{Deserialize, Serialize}; use slice::slice_cityobj_geoms; use tags::convert_properties; -use tinymvt::{geometry::GeometryEncoder, tag::TagsEncoder, tileid::TileIdMethod, vector_tile}; +use tileid::TileIdMethod; +use tinymvt::{geometry::GeometryEncoder, tag::TagsEncoder, vector_tile}; use crate::{ get_parameter_value, diff --git a/nusamai/src/sink/mvt/tileid.rs b/nusamai/src/sink/mvt/tileid.rs new file mode 100644 index 00000000..df7cdd48 --- /dev/null +++ b/nusamai/src/sink/mvt/tileid.rs @@ -0,0 +1,34 @@ +use tinymvt::tileid::hilbert; + +/// Tile ID calculation method +#[derive(Clone, Copy, Debug)] +pub enum TileIdMethod { + /// Tile ID based on Hilbert curve (compliant with PMTiles) + Hilbert, +} + +impl TileIdMethod { + pub fn zxy_to_id(&self, z: u8, x: u32, y: u32) -> u64 { + match self { + TileIdMethod::Hilbert => hilbert::zxy_to_id(z, x, y), + } + } + + pub fn id_to_zxy(&self, tile_id: u64) -> (u8, u32, u32) { + match self { + TileIdMethod::Hilbert => hilbert::id_to_zxy(tile_id), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn hilbert() { + let tile_id_method = TileIdMethod::Hilbert; + assert_eq!(tile_id_method.zxy_to_id(2, 1, 1), 7); + assert_eq!(tile_id_method.id_to_zxy(7), (2, 1, 1)); + } +}