bbox_tile_server/datasource/
mbtiles.rs

1//! MBTiles tile source.
2
3use crate::config::TileSetCfg;
4use crate::datasource::{
5    wms_fcgi::HttpRequestParams, LayerInfo, SourceType, TileResponse, TileSource, TileSourceError,
6};
7use crate::filter_params::FilterParams;
8use crate::store::mbtiles::MbtilesStore;
9use crate::store::TileReader;
10use async_trait::async_trait;
11use bbox_core::Format;
12use martin_mbtiles::Metadata;
13use tile_grid::{Tms, Xyz};
14use tilejson::TileJSON;
15
16#[async_trait]
17impl TileSource for MbtilesStore {
18    async fn xyz_request(
19        &self,
20        _tms: &Tms,
21        tile: &Xyz,
22        _filter: &FilterParams,
23        _format: &Format,
24        _request_params: HttpRequestParams<'_>,
25    ) -> Result<TileResponse, TileSourceError> {
26        if let Some(tile) = self
27            .get_tile(tile)
28            .await
29            .map_err(|_| TileSourceError::TileXyzError)?
30        {
31            Ok(tile)
32        } else {
33            Err(TileSourceError::TileXyzError) // TODO: check for empty tile?
34        }
35    }
36    fn source_type(&self) -> SourceType {
37        SourceType::Vector // TODO: Support Mbtiles raster
38    }
39    async fn tilejson(&self, _tms: &Tms, _format: &Format) -> Result<TileJSON, TileSourceError> {
40        let metadata = self.mbt.get_metadata().await?;
41        Ok(metadata.tilejson)
42    }
43    async fn layers(&self) -> Result<Vec<LayerInfo>, TileSourceError> {
44        let metadata = self.mbt.get_metadata().await?;
45        let layers = metadata
46            .tilejson
47            .vector_layers
48            .unwrap_or(Vec::new())
49            .iter()
50            .map(|l| LayerInfo {
51                name: l.id.clone(),
52                geometry_type: None,
53                style: None,
54            })
55            .collect();
56        Ok(layers)
57    }
58    async fn mbtiles_metadata(
59        &self,
60        _tileset: &TileSetCfg,
61        _format: &Format,
62    ) -> Result<Metadata, TileSourceError> {
63        Ok(self.mbt.get_metadata().await?)
64    }
65}