Ignore:
Timestamp:
11/02/08 17:12:10 (13 years ago)
Author:
spascoe
Message:

Basic GetMap? works. No GetCapabilities? yet.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • DPPP/ukcip02_server/trunk/ukcip_server/ukcip_server/model/pywms/wms_cdms.py

    r3367 r3371  
    1010import Numeric as N 
    1111 
    12 ### Not needed for within Pylons 
    13 ## 
    14 ## class CdmsWMS(WebMapService): 
    15 ##     """ 
    16 ##     Layer objects are created for each variable from the CDMS file and 
    17 ##     placed in a flat layer hierarchy. 
    18  
    19 ##     """ 
    20  
    21 ##     def __init__(self, title, cdmsFilename, exclude=[], layerPrefs={}): 
    22 ##         """ 
    23 ##         @param exclude: Variable names to exclude. 
    24 ##         """ 
    25 ##         super(CdmsWMS, self).__init__(title) 
    26 ##         self._cdmsFile = cdms.open(cdmsFilename) 
    27 ##         self._exclude = exclude 
    28 ##         self._makeLayers(layerPrefs) 
    29  
    30 ##     def _makeLayers(self, layerPrefs): 
    31 ##         for field in self._cdmsFile.listvariables(): 
    32 ##             if field in self._exclude: 
    33 ##                 continue 
    34  
    35 ##             if field in layerPrefs: 
    36 ##                 minValue = layerPrefs[field].get('minValue') 
    37 ##                 maxValue = layerPrefs[field].get('maxValue') 
    38 ##             else: 
    39 ##                 minValue = None 
    40 ##                 maxValue = None 
    41              
    42 ##             self.layers[field] = SimpleCdmsLayer(self._cdmsFile[field], 
    43 ##                                            minValue=minValue, 
    44 ##                                            maxValue=maxValue) 
    45 ##         self.layerFolder.contents.append(field) 
     12 
     13class GridError(Exception): 
     14    pass 
     15 
     16class CdmsGrid(Grid): 
     17    """An adaptor for a cdms variable. 
     18    """ 
     19 
     20    def __init__(self, var, title=None): 
     21        """ 
     22        @param var: The cdms variable.  This should be of shape (x, lat). 
     23        """ 
     24 
     25        try: 
     26            self._var = var 
     27            self._setGrid() 
     28        except GridError, e: 
     29            # This isn't a simple grid 
     30            #!TODO: we could regrid here. 
     31            raise e 
     32        self._setMetadata(title=title) 
     33 
     34 
     35    def _setGrid(self): 
     36        """Check the grid is simple and initialise. 
     37        """ 
     38 
     39        y = self.getYAxis() 
     40        dy_a = y[1:] - y[:-1] 
     41        if not (dy_a == (N.ones(len(dy_a)) * dy_a[0])): 
     42            raise SimpleGridError, "Y Axis not equally spaced" 
     43        self.y0 = y[0] 
     44        self.dy = dy_a[0] 
     45        self.ny = len(y) 
     46        self.iy = self._var.getAxisList().index(y) 
     47 
     48        x = self.getXAxis() 
     49        dx_a = x[1:] - x[:-1] 
     50        if not (dx_a == (N.ones(len(dx_a)) * dx_a[0])): 
     51            raise SimpleGridError, "X Axis not equally spaced" 
     52        self.x0 = x[0] 
     53        self.dx = dx_a[0] 
     54        self.nx = len(x) 
     55        self.ix = self._var.getAxisList().index(x) 
     56 
     57 
     58    def _setMetadata(self, title=None): 
     59        if title: 
     60            self.long_name = title 
     61        else: 
     62            try: 
     63                self.long_name = self._var.long_name 
     64            except AttributeError: 
     65                self.long_name = 'Unknown' 
     66 
     67        try: 
     68            self.units = self._var.units 
     69        except AttributeError: 
     70            self.units = '' 
     71 
     72    def _getValue(self): 
     73        return self._var 
     74    value = property(_getValue) 
     75 
     76 
     77class CdmsLatLonGrid(CdmsGrid): 
     78    """ 
     79    Specialise CdmsGrid for EPSG:4326 
     80 
     81    """ 
     82 
     83    crs = 'EPSG:4326' 
     84 
     85    def getXAxis(self): 
     86        return self._var.getLongitude() 
     87    def getYAxis(self): 
     88        return self._var.getLatitude() 
     89 
     90class CdmsBNGGrid(CdmsGrid): 
     91    """ 
     92    Specialise CdmsGrid for British National Grid coordinate system 
     93 
     94    EPSG:27700 OSGB:36 
     95 
     96    """ 
     97 
     98    crs = 'EPSG:27700' 
     99     
     100    def getXAxis(self): 
     101        return self._var.getAxisList()[1] 
     102    def getYAxis(self): 
     103        return self._var.getAxisList()[0] 
     104 
    46105 
    47106 
    48107class SimpleCdmsLayer(Layer): 
    49     def __init__(self, cdmsVar, minValue=None, maxValue=None): 
     108    def __init__(self, cdmsVar, minValue=None, maxValue=None, GridClass=CdmsGrid): 
    50109        """ 
    51110        @param cdmsVar: variable object 
     
    53112        @todo: Add crs attribute 
    54113        """ 
     114 
     115        self.GridClass = GridClass 
    55116 
    56117        self.var = cdmsVar 
     
    90151             
    91152        v = self.var(**sel) 
    92         return CdmsGrid(v, title=self.title) 
     153        return self.GridClass(v, title=self.title) 
    93154 
    94155    def describe(self, dimensionSpec): 
    95156        return self.var.long_name + ' at ' + self.dimensions['time'] 
     157 
     158 
     159 
    96160 
    97161class CdmsTimeDimension(Dimension): 
     
    121185        return [self.iso2reltime(x) for x in time.split('D')] 
    122186 
    123 class GridError(Exception): 
    124     pass 
    125  
    126 class CdmsGrid(Grid): 
    127     """An adaptor for a cdms variable. 
    128     """ 
    129  
    130     def __init__(self, var, title=None): 
    131         """ 
    132         @param var: The cdms variable.  This should be of shape (x, lat). 
    133         """ 
    134  
    135         try: 
    136             self._var = var 
    137             self._setGrid() 
    138         except GridError, e: 
    139             # This isn't a simple grid 
    140             #!TODO: we could regrid here. 
    141             raise e 
    142         self._setMetadata(title=title) 
    143  
    144  
    145     def _setGrid(self): 
    146         """Check the grid is simple and initialise. 
    147         """ 
    148  
    149         y = self.getYAxis() 
    150         dy_a = y[1:] - y[:-1] 
    151         if not (dy_a == (N.ones(len(dy_a)) * dy_a[0])): 
    152             raise SimpleGridError, "Y Axis not equally spaced" 
    153         self.y0 = y[0] 
    154         self.dy = dy_a[0] 
    155         self.ny = len(y) 
    156         self.iy = self._var.getAxisList().index(y) 
    157  
    158         x = self.getXAxis() 
    159         dx_a = x[1:] - x[:-1] 
    160         if not (dx_a == (N.ones(len(dx_a)) * dx_a[0])): 
    161             raise SimpleGridError, "X Axis not equally spaced" 
    162         self.x0 = x[0] 
    163         self.dx = dx_a[0] 
    164         self.nx = len(x) 
    165         self.ix = self._var.getAxisList().index(x) 
    166  
    167  
    168     def _setMetadata(self, title=None): 
    169         if title: 
    170             self.long_name = title 
    171         else: 
    172             try: 
    173                 self.long_name = self._var.long_name 
    174             except AttributeError: 
    175                 self.long_name = 'Unknown' 
    176  
    177         try: 
    178             self.units = self._var.units 
    179         except AttributeError: 
    180             self.units = '' 
    181  
    182     def _getValue(self): 
    183         return self._var 
    184     value = property(_getValue) 
    185  
    186  
    187 class CdmsLatLonGrid(CdmsGrid): 
    188     """ 
    189     Specialise CdmsGrid for EPSG:4326 
    190  
    191     """ 
    192  
    193     crs = 'EPSG:4326' 
    194  
    195     def getXAxis(self): 
    196         return self._var.getLongitude() 
    197     def getYAxis(self): 
    198         return self._var.getLatitude() 
    199  
    200 class CdmsBNGGrid(CdmsGrid): 
    201     """ 
    202     Specialise CdmsGrid for British National Grid coordinate system 
    203  
    204     EPSG:27700 OSGB:36 
    205  
    206     """ 
    207  
    208     crs = 'EPSG:27700' 
    209      
    210     def getXAxis(self): 
    211         return self._var.getAxisList()[1] 
    212     def getYAxis(self): 
    213         return self._var.getAxisList()[0] 
    214  
    215187 
    216188#---------------------------------------------------------------------------------- 
Note: See TracChangeset for help on using the changeset viewer.