source: DPPP/ukcip02_server/trunk/ukcip_server/ukcip_server/model/sample_layer.py @ 3565

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/DPPP/ukcip02_server/trunk/ukcip_server/ukcip_server/model/sample_layer.py@3565
Revision 3565, 2.5 KB checked in by spascoe, 11 years ago (diff)

Uses new ows_common interface. Works with Cadcorp (at least partially).

Line 
1"""
2An experiment to implement ows_common.service.wms_iface for a test-card.
3
4"""
5
6from ows_common.service.wms_iface import ILayer, ILayerMapper, ILayerSlab, IDimension
7from ows_common import bbox_util
8
9import Image, ImageDraw, ImageFont
10
11import logging
12log = logging.getLogger()
13
14def makeTestcard(dimValues):
15    img = Image.new('RGBA', (400, 200))
16    draw = ImageDraw.Draw(img)
17
18    draw.line((0, 0) + img.size)
19    draw.line((0, img.size[1], img.size[0], 0))
20
21    text = 'WMS Testcard'
22    textSize = draw.textsize(text)
23    draw.text(((img.size[0] - textSize[0]) /  2,
24               (img.size[1] - textSize[1]) / 2), text)
25
26    draw.text((0, 120),
27              str(dimValues))
28
29    return img
30
31
32class TestcardSlab(ILayerSlab):
33    def __init__(self, layer, dimValues, bbox, crs):
34        self.layer = layer
35        self.dimValues = dimValues
36        self.bbox = bbox
37        self.crs = crs
38        self.renderOpts = {}
39
40        self.img = makeTestcard(dimValues)
41
42    def getImage(self, bbox, width, height):
43
44        bb = tuple(float(x) for x in bbox)
45        w, h = self.img.size
46        cropbox = (bbox_util.geoToPixel(bb[0], bb[3], self.bbox, w, h) +
47                   bbox_util.geoToPixel(bb[2], bb[1], self.bbox, w, h))
48
49        self.img.save('img1.png')
50        log.debug('cropbox = %s' % (cropbox,))
51
52        img = self.img.crop(cropbox)
53
54        img.save('img2.png')
55       
56        # Scale to fit
57        img = img.resize((width, height), filter=Image.ANTIALIAS)
58
59        img.save('img3.png')
60       
61        return img
62
63    def getCacheKey(self):
64        k = self.dimValues.items()
65        k.sort()
66       
67        return k
68
69class TestcardDimension(IDimension):
70    def __init__(self, units, extent):
71        self.units = units
72        self.extent = extent
73
74class TestcardLayer(ILayer):
75    crss = ['EPSG:4326']
76    title = 'Testcard'
77    abstract = ''
78    dimensions = dict(time=TestcardDimension('s', ['1','2','3','4']))
79    units = 'foos'
80
81    def getBBox(self, crs):
82        if crs not in self.crss:
83            raise ValueError('Not my CRS')
84        return (-180.0, -90.0, 180.0, 90.0)
85
86    def getSlab(self, crs, dimValues, renderOpts={}):
87        if crs not in self.crss:
88            raise ValueError('Not my CRS')
89        return TestcardSlab(self, dimValues, self.getBBox(crs), crs)
90
91if __name__ == '__main__':
92    logging.basicConfig(level=logging.DEBUG)
93
94    layer = TestcardLayer()
95
96    slab = layer.getSlab('EPSG:4326', dict(foo='bar'))
97    img = slab.getImage((-180, -90, 0, 0), 800, 400)
98
99    img.show()
Note: See TracBrowser for help on using the repository browser.