From d2b341e5f016b982f9227b56959ff7705ab6a0bd Mon Sep 17 00:00:00 2001 From: jesse Date: Thu, 25 Jul 2024 10:44:46 -0700 Subject: [PATCH] added examples to utiles of basic mbtiles usage (#125) --- Cargo.lock | 1 + crates/utiles/Cargo.toml | 1 + crates/utiles/examples/mbt_async.rs | 44 ++++++++++++++++++++++++++ crates/utiles/examples/mbt_sync.rs | 43 +++++++++++++++++++++++++ crates/utiles/src/mbt/mbtiles.rs | 10 ++++++ crates/utiles/src/mbt/mbtiles_async.rs | 2 +- crates/utiles/src/server/mod.rs | 4 +-- 7 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 crates/utiles/examples/mbt_async.rs create mode 100644 crates/utiles/examples/mbt_sync.rs diff --git a/Cargo.lock b/Cargo.lock index 4d0824e1..e18b30f7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2935,6 +2935,7 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" name = "utiles" version = "0.7.0-alpha.3" dependencies = [ + "anyhow", "async-sqlite", "async-trait", "axum", diff --git a/crates/utiles/Cargo.toml b/crates/utiles/Cargo.toml index d54c21df..d02d7fd2 100644 --- a/crates/utiles/Cargo.toml +++ b/crates/utiles/Cargo.toml @@ -63,6 +63,7 @@ md-5 = "0.10.6" noncrypto-digests = "0.3.2" hex = "0.4.3" pmtiles = { version = "0.10.0", features = ["mmap-async-tokio", "tilejson"], optional = true } +anyhow.workspace = true [dev-dependencies] criterion = "0.5.1" diff --git a/crates/utiles/examples/mbt_async.rs b/crates/utiles/examples/mbt_async.rs new file mode 100644 index 00000000..39aa5ca0 --- /dev/null +++ b/crates/utiles/examples/mbt_async.rs @@ -0,0 +1,44 @@ +use anyhow::Result; +use std::path::PathBuf; +use utiles::mbt::{MbtilesAsync, MbtilesClientAsync}; +use utiles_core::utile; +use utiles_core::Tile; +fn get_utiles_test_osm_mbtiles_path() -> PathBuf { + let pwd = std::env::current_dir().unwrap(); + let repo_root = pwd.parent().unwrap().parent().unwrap(); + repo_root.join("test-data/mbtiles/osm-standard.z0z4.mbtiles") +} + +fn printsep() { + // 80 chars + println!("{}", "-".repeat(80)); +} + +#[tokio::main] +async fn main() -> Result<()> { + let src = get_utiles_test_osm_mbtiles_path(); + println!("mbtiles path: {:?}", src); + + printsep(); + let mbt = MbtilesClientAsync::open_existing(src).await?; // .await + println!("mbtiles: {:?}", mbt); + + printsep(); + let metadata = mbt.metadata_rows().await?; + println!("metadata: {:?}", metadata); + + printsep(); + let count = mbt.tiles_count().await?; + println!("tiles count: {:?}", count); + + printsep(); + let tile = utile!(0, 0, 0); + let a_tile = mbt.query_tile(&tile).await?; + if let Some(tile_data) = a_tile { + println!("tile (size): {:?}", tile_data.len()); + } else { + println!("tile not found: {:?}", tile); + } + + Ok(()) +} diff --git a/crates/utiles/examples/mbt_sync.rs b/crates/utiles/examples/mbt_sync.rs new file mode 100644 index 00000000..0a233748 --- /dev/null +++ b/crates/utiles/examples/mbt_sync.rs @@ -0,0 +1,43 @@ +use anyhow::Result; +use std::path::PathBuf; +use utiles::mbt::Mbtiles; +use utiles_core::utile; +use utiles_core::Tile; +fn get_utiles_test_osm_mbtiles_path() -> PathBuf { + let pwd = std::env::current_dir().unwrap(); + let repo_root = pwd.parent().unwrap().parent().unwrap(); + repo_root.join("test-data/mbtiles/osm-standard.z0z4.mbtiles") +} + +fn printsep() { + // 80 chars + println!("{}", "-".repeat(80)); +} + +fn main() -> Result<()> { + let src = get_utiles_test_osm_mbtiles_path(); + println!("mbtiles path: {:?}", src); + + printsep(); + let mbt = Mbtiles::open_existing(src) // .await + .expect("Failed to open mbtiles"); + println!("mbtiles: {:?}", mbt); + printsep(); + + let metadata = mbt.metadata(); + println!("metadata: {:?}", metadata); + + printsep(); + let count = mbt.tiles_count(); + println!("tiles count: {:?}", count); + + printsep(); + let tile = utile!(0, 0, 0); + let a_tile = mbt.query_tile(&tile)?; + if let Some(tile_data) = a_tile { + println!("tile (size): {:?}", tile_data.len()); + } else { + println!("tile not found: {:?}", tile); + } + Ok(()) +} diff --git a/crates/utiles/src/mbt/mbtiles.rs b/crates/utiles/src/mbt/mbtiles.rs index 26912d01..0ebb1786 100644 --- a/crates/utiles/src/mbt/mbtiles.rs +++ b/crates/utiles/src/mbt/mbtiles.rs @@ -2,6 +2,7 @@ use indoc::indoc; use rusqlite::{params, Connection, OptionalExtension}; use std::collections::HashSet; use std::error::Error; +use std::fmt::Debug; use std::path::Path; use tilejson::TileJSON; use tracing::{debug, error, warn}; @@ -33,6 +34,7 @@ use crate::sqlite_utiles::add_ut_functions; use crate::utilejson::metadata2tilejson; use crate::UtilesError; +#[derive(Debug)] pub struct Mbtiles { pub dbpath: DbPath, pub(crate) conn: Connection, @@ -128,6 +130,14 @@ impl Mbtiles { Ok(Mbtiles { conn: res, dbpath }) } + pub fn query_zxy(&self, z: u8, x: u32, y: u32) -> RusqliteResult>> { + query_zxy(&self.conn, z, x, y) + } + + pub fn query_tile(&self, tile: &T) -> RusqliteResult>> { + query_tile(&self.conn, tile) + } + pub fn from_conn(conn: Connection) -> UtilesResult { let guessed_fspath = query_db_fspath(&conn); let dbpath = match guessed_fspath { diff --git a/crates/utiles/src/mbt/mbtiles_async.rs b/crates/utiles/src/mbt/mbtiles_async.rs index 00a7e159..84291ded 100644 --- a/crates/utiles/src/mbt/mbtiles_async.rs +++ b/crates/utiles/src/mbt/mbtiles_async.rs @@ -31,7 +31,7 @@ pub trait MbtilesAsync: Sized { async fn query_zxy(&self, z: u8, x: u32, y: u32) -> UtilesResult>>; - async fn query_tile(&self, tile: Tile) -> UtilesResult>> { + async fn query_tile(&self, tile: &Tile) -> UtilesResult>> { self.query_zxy(tile.z(), tile.x(), tile.y()).await } diff --git a/crates/utiles/src/server/mod.rs b/crates/utiles/src/server/mod.rs index 9d34aef7..60e7c38e 100644 --- a/crates/utiles/src/server/mod.rs +++ b/crates/utiles/src/server/mod.rs @@ -221,7 +221,7 @@ async fn get_dataset_tile_zxy( } let t = utile!(path.x, path.y, path.z); let mbt_ds = mbtiles.unwrap(); - let tile_data = mbt_ds.mbtiles.query_tile(t).await; + let tile_data = mbt_ds.mbtiles.query_tile(&t).await; match tile_data { Ok(data) => match data { Some(data) => { @@ -270,7 +270,7 @@ async fn get_dataset_tile_quadkey( ) })?; let mbt_ds = mbt_ds.unwrap(); - let tile_data = mbt_ds.mbtiles.query_tile(parsed_tile).await.unwrap(); + let tile_data = mbt_ds.mbtiles.query_tile(&parsed_tile).await.unwrap(); match tile_data { Some(data) => Ok(Response::new(Body::from(data))), None => Err((StatusCode::NOT_FOUND, "Tile not found".to_string())),