source: TI02-CSML/trunk/services/3rdParty/tilecache-1.4/TileCache/Client.py @ 2202

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI02-CSML/trunk/services/3rdParty/tilecache-1.4/TileCache/Client.py@2202
Revision 2202, 3.4 KB checked in by lawrence, 13 years ago (diff)

Adding tilecache to the "interesting" OGC services already implemented
in python.

Line 
1#!/usr/bin/python
2# BSD Licensed, Copyright (c) 2006 MetaCarta, Inc.
3
4import sys, urllib, urllib2, time
5
6class WMS (object):
7    fields = ("bbox", "srs", "width", "height", "format", "layers", "styles")
8    defaultParams = {'version': '1.1.1', 'request': 'GetMap', 'service': 'WMS'}
9    __slots__ = ("base", "params", "client", "data", "response")
10
11    def __init__ (self, base, params):
12        self.base    = base
13        if self.base[-1] not in "?&":
14            if "?" in self.base:
15                self.base += "&"
16            else:
17                self.base += "?"
18
19        self.params  = {}
20        self.client  = urllib2.build_opener()
21        for key, val in self.defaultParams.items():
22            self.params[key] = val
23        for key in self.fields:
24            if params.has_key(key):
25                self.params[key] = params[key]
26            else:
27                self.params[key] = ""
28
29    def url (self):
30        return self.base + urllib.urlencode(self.params)
31   
32    def fetch (self):
33        urlrequest = urllib2.Request(self.url())
34        # urlrequest.add_header("User-Agent",
35        #    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)" )
36        try:
37            response = self.client.open(urlrequest)
38            data = response.read()
39        except urllib2.HTTPError, err:
40            response = err
41            data = None
42        except urllib2.URLError, err:
43            err.code = -1
44            response = err
45            data = None
46        return data, response
47
48    def setBBox (self, box):
49        self.params["bbox"] = ",".join(map(str, box))
50
51def seed (base, layer, levels = (0, 5), bbox = None):
52    from Layer import Tile
53    params = { 'layers' : layer.layers,
54               'srs'    : layer.srs,
55               'width'  : layer.size[0],
56               'height' : layer.size[1],
57               'format' : layer.format() }
58    client = WMS(base, params)
59
60    if not bbox: bbox = layer.bbox
61
62    start = time.time()
63    total = 0
64   
65    for z in range(*levels):
66        bottomleft = layer.getClosestCell(z, bbox[0:2])
67        topright   = layer.getClosestCell(z, bbox[2:4])
68        print >>sys.stderr, "###### %s, %s" % (bottomleft, topright)
69        zcount = 0 
70        ztiles = (topright[1] - bottomleft[1] + 1) * (topright[0] - bottomleft[0] + 1)
71        for y in range(bottomleft[1], topright[1] + 1):
72            for x in range(bottomleft[0], topright[0] + 1):
73                tileStart = time.time()
74                tile = Tile(layer,x,y,z)
75                bounds = tile.bounds()
76                client.setBBox(bounds)
77                client.fetch()
78                total += 1
79                zcount += 1
80                box = "(%.4f %.4f %.4f %.4f)" % bounds
81                print >>sys.stderr, "%02d (%06d, %06d) = %s [%.4fs : %.3f/s] %s/%s" \
82                     % (z,x,y, box, time.time() - tileStart, total / (time.time() - start + .0001), zcount, ztiles)
83
84if __name__ == '__main__':
85    from Layer import Layer
86    base  = sys.argv[1]
87    layer = Layer(sys.argv[2])
88    if len(sys.argv) == 5:
89        seed(base, layer, map(int, sys.argv[3:]))
90    elif len(sys.argv) == 6:
91        seed(base, layer, map(int, sys.argv[3:5]), map(float, sys.argv[5].split(",")))
92    else:
93        for line in sys.stdin.readlines():
94            lat, lon, delta = map(float, line.split(","))
95            bbox = (lon - delta, lat - delta, lon + delta, lat + delta)
96            print >>sys.stderr, "===> %s <===" % (bbox,)
97            seed(base, layer, (5, 17), bbox)
Note: See TracBrowser for help on using the repository browser.