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
|
|
|
|