1
|
|
|
#!/usr/bin/python |
2
|
|
|
|
3
|
|
|
# Author: Steven D. Lander, RGi |
4
|
|
|
# March 18, 2016 |
5
|
|
|
|
6
|
|
|
# This script assumes world-referenced tile coordinates |
7
|
|
|
|
8
|
|
|
from collections import namedtuple |
9
|
|
|
|
10
|
|
|
TileRange = namedtuple("TileRange", ["min", "max"]) |
11
|
|
|
|
12
|
|
|
def tile_bounds_geodetic(z, x, y): |
13
|
|
|
"""Shamelessly taken from gdal2tiles.py""" |
14
|
|
|
tile_size = 256 |
15
|
|
|
res_fact = 360.0 / tile_size |
16
|
|
|
res = res_fact / 2**z |
17
|
|
|
def calc(axis, max): return axis * tile_size * res - max |
18
|
|
|
return (calc(x, 180), calc(y, 90), |
19
|
|
|
calc((x + 1), 180), calc((y + 1), 90)) |
20
|
|
|
|
21
|
|
|
def iterate_tiles(z, range_x, range_y, **kwargs): |
22
|
|
|
try: |
23
|
|
|
base_url = kwargs["base_url"] |
24
|
|
|
except(AttributeError, KeyError): |
25
|
|
|
base_url = "" |
26
|
|
|
if type(range_x) is not TileRange or \ |
27
|
|
|
type(range_y) is not TileRange: |
28
|
|
|
raise KeyError("z/x/y ranges must be TileRange objects") |
29
|
|
|
tmpl = "{}&BBOX={},{},{},{}" |
30
|
|
|
tile_urls = [] |
31
|
|
|
for x in range(range_x.min, range_x.max+1): |
32
|
|
|
for y in range(range_y.min, range_y.max+1): |
33
|
|
|
# convert tile into bbox |
34
|
|
|
bbox = tile_bounds_geodetic(z, x, y) |
35
|
|
|
tile_urls.append(tmpl.format(base_url, |
36
|
|
|
bbox[0], bbox[1], bbox[2], bbox[3])) |
37
|
|
|
return tile_urls |
38
|
|
|
|
39
|
|
|
# Print all these URLs out to the console, so they can |
40
|
|
|
# be piped to output if desired |
41
|
|
|
base_url = "http://localhost/GPEP/Hybrid-Performance-Test/service?" |
42
|
|
|
base_url += "VERSION=1.3.0&REQUEST=GetMap&CRS=CRS:84&WIDTH=256&HEIGHT=256" |
43
|
|
|
base_url += "&LAYERS=2,6,10,11,12&STYLES=,,,,&EXCEPTIONS=xml&FORMAT=image/jpeg" |
44
|
|
|
base_url += "&BGCOLOR=0xFEFFFF&TRANSPARENT=TRUE" |
45
|
|
|
tasks = [ |
46
|
|
|
(6, TileRange(32, 55), TileRange(16,27)), |
47
|
|
|
(7, TileRange(72, 83), TileRange(40, 43)), |
48
|
|
|
(8, TileRange(160, 175), TileRange(64, 67)), |
49
|
|
|
(9, TileRange(336, 355), TileRange(128, 139)), |
50
|
|
|
(10, TileRange(676, 703), TileRange(256, 271)), |
51
|
|
|
(11, TileRange(1364, 1387), TileRange(524, 539)), |
52
|
|
|
(12, TileRange(2744, 2751), TileRange(1056, 1067)), |
53
|
|
|
(13, TileRange(5496, 5519), TileRange(2120, 2127)), |
54
|
|
|
(14, TileRange(11012, 11027), TileRange(4244, 4255)), |
55
|
|
|
(16, TileRange(44088, 44119), TileRange(17012, 17015)), |
56
|
|
|
] |
57
|
|
|
|
58
|
|
|
for task in tasks: |
59
|
|
|
level = iterate_tiles(task[0], task[1], task[2], base_url=base_url) |
60
|
|
|
for entry in level: |
61
|
|
|
print(entry) |
62
|
|
|
|