Changeset 3565


Ignore:
Timestamp:
07/03/08 12:34:02 (11 years ago)
Author:
spascoe
Message:

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

Location:
DPPP/ukcip02_server/trunk/ukcip_server
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • DPPP/ukcip02_server/trunk/ukcip_server/development.ini

    r3551 r3565  
    2424beaker.session.key = ukcip_server 
    2525beaker.session.secret = somesecret 
    26 ukcip02.data_dir = %(here)s/../data 
     26ukcip02.data = %(here)s/../data/ukcip02.cdml 
    2727 
    2828# If you'd like to fine-tune the individual locations of the cache data dirs 
  • DPPP/ukcip02_server/trunk/ukcip_server/ukcip_server/controllers/ukcip_wms.py

    r3535 r3565  
    44from matplotlib.cm import get_cmap 
    55 
    6 from ows_common.pylons.ows_controller import OwsController, genshiLoader, addOperation, addLayer 
    7 from ows_common.exceptions import * 
    86 
    97from ukcip_server.lib.base import * 
    10 from ukcip_server.model.pywms.render_imp import RGBARenderer 
     8from ukcip_server.model.ukcip02 import UKCIP02LayerMapper 
     9from ows_common.pylons.wms_controller import WMSController 
    1110 
    1211log = logging.getLogger(__name__) 
    1312 
    14 #----------------------------------------------------------------------------- 
    15 # Image formats supported by PIL 
    16 pilImageFormats = { 
    17     'image/png': 'PNG', 
    18     'image/jpg': 'JPEG', 
    19     'image/gif': 'GIF', 
    20     'image/tiff': 'TIFF' 
    21     } 
    22      
    23  
    24 class UkcipWmsController(OwsController): 
    25  
    26     service = 'WMS' 
    27     owsOperations = OwsController.owsOperations + ['GetMap', 'GetInfo'] 
    28     validVersions = ['1.1.1'] 
    29  
    30     def _renderCapabilities(self, version, format): 
    31         t = genshiLoader.load('wms_capabilities_1_1_1.xml') 
    32         return t.generate(c=c).render() 
    33  
    34     def _loadCapabilities(self): 
    35         addOperation('GetMap', formats=pilImageFormats.keys()) 
    36         addOperation('GetInfo') 
    37         log.debug('Loading capabilities contents') 
    38         for layerName, layer in model.ukcip02.layers.items(): 
    39             log.debug('Loading layer %s' % layerName) 
    40             dims = {} 
    41             for dimName, dim in layer.dimensions.items(): 
    42                 dims[dimName] = dict(extent=dim.extent.split(','), 
    43                                      units=dim.units, 
    44                                      unitSymbol='?') 
    45             addLayer(layerName, title=layer.title, abstract=layer.abstract, 
    46                      dimensions=dims, 
    47                      srs=layer.GridClass.crs, bbox=model.ukcip02.bbox) 
    48  
    49     def GetMap(self): 
    50  
    51         # Housekeeping 
    52         version = self.getOwsParam('version', default=self.validVersions[0]) 
    53         if version not in self.validVersions: 
    54             raise InvalidParameterValue('Version %s not supported' % version, 
    55                                         'version') 
    56         styles = self.getOwsParam('styles', default='') 
    57         transparent = self.getOwsParam('transparent', default='FALSE') 
    58         bgcolor = self.getOwsParam('bgcolor', default='0xFFFFFF') 
    59                  
    60         # Coordinate parameters 
    61         bbox = tuple(float(x) for x in self.getOwsParam('bbox').split(',')) 
    62         width = int(self.getOwsParam('width')) 
    63         height = int(self.getOwsParam('height')) 
    64         srs = self.getOwsParam('srs') 
    65         #!TODO: Check valid srs 
    66  
    67  
    68         # Layer handling 
    69         layer = self.getOwsParam('layers') 
    70         if ',' in layer: 
    71             raise InvalidParameterValue( 
    72                 'Multi-layer GetMap requests are not supported', 'layers') 
    73         try: 
    74             layerObj = model.ukcip02.layers[layer] 
    75         except KeyError: 
    76             raise InvalidParameterValue('Layer %s not found' % layer, 'layers') 
    77  
    78         # Get format 
    79         format = self.getOwsParam('format') 
    80         if format not in pilImageFormats: 
    81             raise InvalidParameterValue( 
    82                 'Format %s not supported' % format, 'format') 
    83  
    84         # Dimension handling 
    85         dims = dict(time=self.getOwsParam('time', default='1961-1-15T0:0:0.0Z,1961-2-1T0:0:0.0Z')) 
    86  
    87  
    88         # The real work 
    89         view = layerObj.getView(srs, dims, dict(minValue=0, maxValue=100)) 
    90         img = view.getImage(bbox, width, height) 
    91  
    92         # IE < 7 doesn't display the alpha layer right.  Here we sniff the 
    93         # user agent and remove the alpha layer if necessary. 
    94         try: 
    95             ua = request.headers['User-Agent'] 
    96         except: 
    97             pass 
    98         else: 
    99             if 'MSIE' in ua and 'MSIE 7' not in ua: 
    100                 img = img.convert('RGB') 
    101  
    102         buf = StringIO() 
    103         img.save(buf, pilImageFormats[format]) 
    104  
    105         response.headers['Content-Type'] = format 
    106         response.write(buf.getvalue()) 
    107  
    108         return request 
    109  
    110     def GetInfo(self): 
    111         from pprint import pformat 
    112         request.headers['Content-Type'] = 'text/ascii' 
    113         response.write('Some info about this service\n') 
    114         for layer in model.ukcip02.layers: 
    115             response.write('Layer %s: %s\n' % (layer, pformat(g.ukcip02_layers[layer].__dict__))) 
    116  
    117              
     13class UkcipWmsController(WMSController): 
     14    layerMapper = UKCIP02LayerMapper() 
  • DPPP/ukcip02_server/trunk/ukcip_server/ukcip_server/model/pywms/impl.py

    r3533 r3565  
    66 
    77""" 
    8 from interfaces import ILayer, ILayerView, IDimension 
     8from ows_common.service.wms_iface import ILayer, ILayerSlab, IDimension 
    99from wms_cdms import SimpleCdmsLayer, CdmsTimeDimension, CdmsGrid 
    1010import cdtime 
     
    2121    def __init__(self, cdmsVar, GridClass=CdmsGrid): 
    2222        try: 
    23             title = cdmsVar.long_name 
     23            self.title = cdmsVar.long_name 
    2424        except AttributeError: 
    25             title = cdmsVar.id 
     25            self.title = cdmsVar.id 
    2626             
    2727        self._layer = SimpleCdmsLayer(cdmsVar, title, GridClass=GridClass) 
     
    2929        self.crss = [GridClass.crs] 
    3030        self.units = self._layer.units 
    31         self.dimensions = self._layer.dimensions 
     31 
     32        dims = {} 
     33        for dimName, dim in self._layer.dimensions.items(): 
     34            dims[dimName] = Dimension(dim) 
     35        self.dimensions = dims 
     36 
     37         
     38 
    3239 
    3340    def getBBox(self, crs): 
    34         raise NotImplementedError 
     41        # Get BBOX from pywms layer 
     42        var = self._layer.var 
     43        xAxis = var.getAxis(var.getAxisIndex('eastings')) 
     44        yAxis = var.getAxis(var.getAxisIndex('northings')) 
     45        #!NOTE order specific code 
     46        return (xAxis[0], yAxis[-1], xAxis[-1], yAxis[0]) 
    3547 
    36     def getView(self, crs, dimValues=None, renderOpts={}): 
     48    def getSlab(self, crs, dimValues=None, renderOpts={}): 
    3749        if crs != self.crss[0]: 
    3850            raise ValueError("CRS %s not supported on this layer" % crs) 
    3951         
    40         return CdmsLayerView(crs, dimValues, renderOpts, self) 
    41      
     52        return CdmsLayerSlab(crs, dimValues, renderOpts, self) 
    4253 
    43 class CdmsLayerView(ILayerView): 
     54    def getCacheKey(self, crs, dimValues=None, renderOpts={}): 
     55        return '%s:%s:%s' % (crs, dimValues, renderOpts) 
     56 
     57class CdmsLayerSlab(ILayerSlab): 
    4458    def __init__(self, crs, dimValues, renderOpts, layer): 
    4559        self.crs = crs 
     
    4761        self.renderOpts = renderOpts 
    4862        self.layer = layer 
    49         self.bbox = NotImplemented 
     63        self.bbox = layer.getBBox(crs) 
    5064 
    5165        self._renderer = RGBARenderer(renderOpts['minValue'], renderOpts['maxValue']) 
     
    6074        raise NotImplementedError 
    6175     
     76 
     77class Dimension(IDimension): 
     78    """ 
     79    Wrapper to fix some interface differences. 
     80 
     81    """ 
     82    def __init__(self, pywmsDim): 
     83        self.units = pywmsDim.units 
     84        self.extent = pywmsDim.extent.split(',') 
  • DPPP/ukcip02_server/trunk/ukcip_server/ukcip_server/model/sample_layer.py

    r3551 r3565  
    5555         
    5656        # Scale to fit 
    57         img = img.resize((width, height)) 
     57        img = img.resize((width, height), filter=Image.ANTIALIAS) 
    5858 
    5959        img.save('img3.png') 
  • DPPP/ukcip02_server/trunk/ukcip_server/ukcip_server/model/ukcip02.py

    r3551 r3565  
    1717log = logging.getLogger(__name__) 
    1818 
    19 log.debug('Data dir set to %s' % data_dir) 
    20  
    2119 
    2220class UKCIP02LayerMapper(ILayerMapper): 
    2321    def __init__(self): 
    24         self.dataDir = config['ukcip02.data_dir'] 
    25         log.debug('Data dir set to %s' % self.dataDir) 
     22        self.dataFile = config['ukcip02.data'] 
     23        log.debug('Input data set to set to %s' % self.dataFile) 
    2624 
    2725    def map(self, **kwargs): 
    28         g = '%s*.nc' % kwargs['pattern'] 
    29         try: 
    30             f = glob(os.path.join(self.dataDir, g))[0] 
    31         except IndexError: 
    32             raise ValueError("No matching NetCDF found") 
    33  
    34         ds = cdms.open(f) 
     26        # Ignore kwargs 
     27        ds = cdms.open(self.dataFile) 
     28         
    3529        layers = {} 
    3630        for varName in ds.listvariables(): 
     
    4135        return layers 
    4236 
    43 # We need to hard-code the bbox for now 
    44 bbox = (-200000, -200000, 695000, 1245000) 
Note: See TracChangeset for help on using the changeset viewer.