1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
use tile_grid::{extent_wgs84_to_merc, Extent, Grid, GridIterator, Origin, Unit};

pub fn google_mercator() -> Grid {
    Grid::new(
        256,
        256,
        Extent {
            minx: -20037508.342789248,
            miny: -20037508.342789248,
            maxx: 20037508.342789248,
            maxy: 20037508.342789248,
        },
        3857,
        Unit::Meters,
        vec![
            156543.033928041,
            78271.5169640205,
            39135.75848201025,
            19567.879241005125,
            9783.939620502562,
            4891.969810251281,
            2445.9849051256406,
            1222.9924525628203,
            611.4962262814101,
            305.7481131407051,
            152.87405657035254,
            76.43702828517627,
            38.218514142588134,
            19.109257071294067,
            9.554628535647034,
            4.777314267823517,
            2.3886571339117584,
            1.1943285669558792,
            0.5971642834779396,
            0.2985821417389698,
            0.1492910708694849,
            0.07464553543474245,
            0.037322767717371225,
        ],
        Origin::TopLeft,
    )
}

///
/// Returns coordinates for tiles within bavaria according to the specified grid.
/// The grid is responsible for defining the coordinate system. For example whether
/// [Slippy map tilenames](https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames) (also known as
/// XYZ) or [TMS](https://wiki.osgeo.org/wiki/Tile_Map_Service_Specification#TileMap_Diagram) is
/// used.
///
/// ## Additional Resources:
///
/// * https://www.maptiler.com/google-maps-coordinates-tile-bounds-projection
/// * https://gist.github.com/maptiler/fddb5ce33ba995d5523de9afdf8ef118
pub fn tile_coordinates_bavaria(grid: &Grid, zoom: u8) -> Vec<(u8, u32, u32)> {
    let tile_limits = grid.tile_limits(
        extent_wgs84_to_merc(&Extent {
            minx: 8.9771580802,
            miny: 47.2703623267,
            maxx: 13.8350427083,
            maxy: 50.5644529365,
        }),
        0,
    );

    GridIterator::new(zoom, zoom, tile_limits).collect()
}