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

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

Fixed the wcsdownload bounding box selection map so that it works with the new bounds control.

Also modified the templates to look for a custom config file value to set the Openlayers.js path, otherwise the compressed one will be used. Hopefully this will stop me committing the code with the wrong path.

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        layers = []
52        timepositions = None
53       
54        if endpoint != None:
55           
56            st1 = time.time()
57            wcs, layers = self._getWCSObj(endpoint)
58            log.debug("retrieved wcs metadata in  = %s" % (time.time() - st1,))
59           
60            if layer != None:
61                st1 = time.time()
62                layerMetadata, c.bboxLimits, timepositions, c.supportedFormats, c.supportedCRS =\
63                       self._getWCSMetadata(wcs, layer)
64                log.debug("retrieved layer metadata in  = %s" % (time.time() - st1,))
65               
66       
67        if bbox != None:
68            c.bboxLimits = bbox
69       
70       
71        if timepositions != None:
72            builder = DateTimeOptionsBuilder(timepositions)
73            options = builder.buildOptions()
74            #log.debug("options = %s" % (options,))
75            c.timedata = utils.toJSON(options) 
76           
77        c.crs = crs
78        c.endpoint = endpoint
79        c.layer = layer
80        c.layers = ['']
81        c.layers.extend(layers)
82       
83        #get server information from config file
84        g.server=config['app_conf']['serverurl']
85       
86        params = {}
87        for paramString in config['download_baselayer.params'].split(','):
88            key, value = paramString.split(':')
89            params[key] = value
90       
91        baseLayerObj = {"url":config['download_baselayer.url'], "params": params }
92       
93        c.baseLayerJSON = utils.toJSON(baseLayerObj) 
94       
95        log.debug("rendering template after %ss" % (time.time() - st,))
96        return render('wcsdown')
97   
98   
99    def download(self):
100       
101        params = self._getParams()
102        log.debug("params = %s" % (params,))
103       
104        endpoint = params.get('ENDPOINT')
105       
106        args = {}
107        args['identifier'] = params['LAYER']
108        args['bbox'] = tuple(params.get('BBOX').split(','))
109        args['format'] = params['FORMAT']
110        args['crs'] = params['CRS']
111
112        if (params.get('SINGLE_TIME',"").upper() == 'TRUE'):
113            args['time'] = [params.get('TIME')]
114        else:
115            args['time'] = [params.get('TIME'), params.get('TIME_END')]
116       
117        wcs, layers = self._getWCSObj(endpoint)
118       
119        log.debug("wcs.url = %s" % (wcs.url,))
120       
121        assert args['identifier'] in layers
122       
123        log.debug("args = %s" % (args,))
124       
125        oldProxy = proxyFix(endpoint)
126        try:
127            output = wcs.getCoverage(**args)
128        except Exception, e:
129            log.exception("Exception occurred")
130            raise
131        finally:
132            resetProxy(oldProxy)
133       
134        log.debug("output = %s" % (output,))
135       
136        mType='application/cf-netcdf'
137        response.headers['Content-Type']=mType
138        response.headers['Content-Disposition'] = paste.httpheaders.CONTENT_DISPOSITION(attachment=True, filename='download.nc')
139        return output.read()
140       
141       
142
143    def _getWCSObj(self, endpoint):
144        oldProxy = proxyFix(endpoint)
145        try:
146            wcs=WebCoverageService(endpoint, version='1.0.0')
147           
148            layers = [x[0] for x in wcs.items()]
149        finally:
150            resetProxy(oldProxy)
151       
152        return wcs, layers
153   
154    def _getWCSMetadata(self, wcs, layer):
155       
156        oldProxy = proxyFix(wcs.url)
157        try:
158            layerMetadata = wcs[layer]
159            bboxLimits = ','.join([str(x) for x in layerMetadata.boundingBoxWGS84])
160            timepositions = layerMetadata.timepositions
161            supportedFormats = layerMetadata.supportedFormats 
162            supportedCRS = layerMetadata.supportedCRS         
163
164        finally:
165            resetProxy(oldProxy)
166       
167        return layerMetadata, bboxLimits, timepositions, supportedFormats, supportedCRS
168       
169    def _getParams(self):
170       
171        params = {}
172        for k in request.params.keys():
173            value = request.params[k]
174            if value == "":
175                value = None
176           
177            if value.__class__ == unicode:
178                value = value.encode('latin-1')
179               
180            params[k.upper()] = value
181       
182        return params
183       
Note: See TracBrowser for help on using the repository browser.