source: cowsclient/trunk/cowsclient/controllers/wcsdown.py @ 5759

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/cowsclient/trunk/cowsclient/controllers/wcsdown.py@5759
Revision 5759, 5.4 KB checked in by pnorton, 11 years ago (diff)

Added a openlayers map to select the bounding box. Also fixed a few smaller bugs + changed the layout a bit.

Line 
1# Copyright (C) 2007 STFC & NERC (Science and Technology Facilities Council).
2# This software may be distributed under the terms of the
3# Q Public License, version 1.0 or later.
4# http://ndg.nerc.ac.uk/public_docs/QPublic_license.txt
5#
6"""
7
8"""
9
10import logging
11
12import paste
13import time
14
15from cowsclient.lib.base import BaseController, g, response, config, request, c, session, render
16
17from owslib.wcs import WebCoverageService
18
19from cowsclient.lib.wmc_util import proxyFix, resetProxy
20import cowsclient.lib.utils as utils
21from cowsclient.model.date_time_options import DateTimeOptionsBuilder
22 
23
24log = logging.getLogger(__name__)
25
26class WcsdownController(BaseController):
27   
28   
29    def index(self):
30        """
31        Default controller method to handle the initial requests to the page
32        """
33        st = time.time()
34        params = self._getParams()
35
36        #get the list of default WCS endpoints
37        c.defaultWCSEndpoints =  utils.toJSON(utils.readEndpoints().get('WCS',None))
38       
39        log.debug("params = %s" % (params,))
40       
41        endpoint = params.get('ENDPOINT', None)
42        bbox = params.get('BBOX', None)
43        c.time = params.get('TIME', None)
44        c.time_end = params.get('TIME_END', None)
45        layer = params.get('LAYER', None)
46        format = params.get('FOMRAT', None)
47        crs = params.get('CRS', None)
48        c.message = params.get('MESSAGE', "")
49        c.singleTimePoint = params.get('SINGLE_TIME', "")
50       
51        #endpoint = 'http://localhost:5000/clim_10/wcs?'
52
53        layers = []
54        timepositions = None
55       
56        if endpoint != None:
57           
58            wcs, layers = self._getWCSObj(endpoint)
59           
60            if layer != None:
61                layerMetadata, c.bboxLimits, timepositions, c.supportedFormats, c.supportedCRS =\
62                       self._getWCSMetadata(wcs, layer)
63               
64       
65        if bbox != None:
66            c.bboxLimits = bbox
67       
68       
69        if timepositions != None:
70            builder = DateTimeOptionsBuilder(timepositions)
71            options = builder.buildOptions()
72            #log.debug("options = %s" % (options,))
73            c.timedata = utils.toJSON(options) 
74           
75        c.crs = crs
76        c.endpoint = endpoint
77        c.layer = layer
78        c.layers = ['']
79        c.layers.extend(layers)
80       
81        #get server information from config file
82        g.server=config['app_conf']['serverurl']
83       
84        params = {}
85        for paramString in config['download_baselayer.params'].split(','):
86            key, value = paramString.split(':')
87            params[key] = value
88       
89        baseLayerObj = {"url":config['download_baselayer.url'], "params": params }
90       
91        c.baseLayerJSON = utils.toJSON(baseLayerObj) 
92       
93        log.debug("rendering template after %ss" % (time.time() - st,))
94        return render('wcsdown')
95   
96   
97    def download(self):
98       
99        params = self._getParams()
100        log.debug("params = %s" % (params,))
101       
102        endpoint = params.get('ENDPOINT')
103       
104        args = {}
105        args['identifier'] = params['LAYER']
106        args['bbox'] = tuple(params.get('BBOX').split(','))
107        args['format'] = params['FORMAT']
108        args['crs'] = params['CRS']
109
110        if (params.get('SINGLE_TIME',"").upper() == 'TRUE'):
111            args['time'] = [params.get('TIME')]
112        else:
113            args['time'] = [params.get('TIME'), params.get('TIME_END')]
114       
115        wcs, layers = self._getWCSObj(endpoint)
116       
117        log.debug("wcs.url = %s" % (wcs.url,))
118       
119        assert args['identifier'] in layers
120       
121        log.debug("args = %s" % (args,))
122       
123        oldProxy = proxyFix(endpoint)
124        try:
125            output = wcs.getCoverage(**args)
126        except Exception, e:
127            log.exception("Exception occurred")
128            raise
129        finally:
130            resetProxy(oldProxy)
131       
132        log.debug("output = %s" % (output,))
133       
134        mType='application/cf-netcdf'
135        response.headers['Content-Type']=mType
136        response.headers['Content-Disposition'] = paste.httpheaders.CONTENT_DISPOSITION(attachment=True, filename='download.nc')
137        return output.read()
138       
139       
140
141    def _getWCSObj(self, endpoint):
142        oldProxy = proxyFix(endpoint)
143        try:
144            wcs=WebCoverageService(endpoint, version='1.0.0')
145           
146            layers = [x[0] for x in wcs.items()]
147        finally:
148            resetProxy(oldProxy)
149       
150        return wcs, layers
151   
152    def _getWCSMetadata(self, wcs, layer):
153       
154        oldProxy = proxyFix(wcs.url)
155        try:
156            layerMetadata = wcs[layer]
157            bboxLimits = ','.join([str(x) for x in layerMetadata.boundingBoxWGS84])
158            timepositions = layerMetadata.timepositions
159            supportedFormats = layerMetadata.supportedFormats 
160            supportedCRS = layerMetadata.supportedCRS         
161
162        finally:
163            resetProxy(oldProxy)
164       
165        return layerMetadata, bboxLimits, timepositions, supportedFormats, supportedCRS
166       
167    def _getParams(self):
168       
169        params = {}
170        for k in request.params.keys():
171            value = request.params[k]
172            if value == "":
173                value = None
174           
175            if value.__class__ == unicode:
176                value = value.encode('latin-1')
177               
178            params[k.upper()] = value
179       
180        return params
181       
Note: See TracBrowser for help on using the repository browser.