Completed
Push — master ( e9db99...08ced9 )
by Steven
01:06
created

iterate_tiles()   D

Complexity

Conditions 9

Size

Total Lines 22

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 9
dl 0
loc 22
rs 4.7088
1
#!/usr/bin/python
2
3
# Author: Steven D. Lander, RGi
4
# March 17, 2016
5
6
from collections import namedtuple
7
8
TileRange = namedtuple("TileRange", ["min", "max"])
9
10
def iterate_tiles(z, range_x, range_y, **kwargs):
11
    try:
12
        base_url = kwargs["base_url"]
13
    except(AttributeError, KeyError):
14
        base_url = ""
15
    try:
16
        file_ext = kwargs["file_ext"]
17
        if "." not in file_ext:
18
            raise ValueError("file_ext needs a period in it.")
19
    except(AttributeError, KeyError):
20
        file_ext = ""
21
    except(ValueError):
22
        raise
23
    if type(range_x) is not TileRange or \
24
            type(range_y) is not TileRange:
25
        raise KeyError("z/x/y ranges must be TileRange objects")
26
    tmpl = "{}{}/{}/{}{}"
27
    tile_urls = []
28
    for x in range(range_x.min, range_x.max+1):
29
        for y in range(range_y.min, range_y.max+1):
30
            tile_urls.append(tmpl.format(base_url, z, x, y, file_ext))
31
    return tile_urls
32
33
# Print all these URLs out to the console, so they can
34
# be piped to output if desired
35
base_url = "http://example/url/"
36
file_ext = ".png"
37
tasks = [
38
        (1, TileRange(0, 3), TileRange(0, 3)), # All zoom 1 tiles (EPSG:3857)
39
        # (7, TileRange(0, 2**7), TileRange(0, 2**(7-1))), # All zoom 7 tiles (EPSG:4326)
40
        # (16, TileRange(0, 2**16), TileRange(0, 2**16)), # All zoom 16 tiles (EPSG:3857)
41
        ]
42
43
for task in tasks:
44
    level = iterate_tiles(task[0], task[1], task[2], base_url=base_url,
45
            file_ext=file_ext)
46
    for entry in level:
47
        print(entry)
48