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