map_engine/
mercator.rs

1//!Global Map Tiles in Spherical Mercator projection.
2use crate::MAXZOOMLEVEL;
3use std::f64::consts::PI;
4
5pub struct GlobalMercator {
6    pub tile_size: usize,
7}
8
9impl GlobalMercator {
10    pub fn new(tile_size: usize) -> Self {
11        GlobalMercator { tile_size }
12    }
13
14    pub fn resolution(&self, zoom: &u32) -> f64 {
15        let initial_resolution = 2.0 * PI * 6378137.0 / (self.tile_size as f64);
16        initial_resolution / (2u32.pow(*zoom) as f64)
17    }
18
19    pub fn zoom_for_pixel_size(&self, pixel_size: &f64) -> u32 {
20        let mut zoom: u32 = 0;
21        for i in 0..MAXZOOMLEVEL {
22            if pixel_size > &self.resolution(&i) {
23                zoom = i - 1;
24                break;
25            };
26        }
27        zoom
28    }
29}
30
31impl Default for GlobalMercator {
32    fn default() -> Self {
33        Self::new(256)
34    }
35}