Changeset 5641


Ignore:
Timestamp:
20/08/09 10:36:42 (10 years ago)
Author:
pnorton
Message:

Added the EnableDisplayOptions? to the CsmlGeoplotWmsLayer? class that controls if the display options metadata URL is added to the response, by default it is not.

Also improved the handling of requests outside the boundaries of the data in the csml geoplot slab.

Location:
cows/trunk/cows/service/imps/csml_geoplot_backend
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • cows/trunk/cows/service/imps/csml_geoplot_backend/csml_geoplot_wms_layer.py

    r5632 r5641  
    3434class CSMLGeoplotWmsLayer(IwmsLayer): 
    3535     
     36    EnableDisplayOptions = False 
    3637     
    3738    def __init__(self, title, abstract, dimensions, units, crss, feature, 
     
    291292     
    292293    def _buildMetadataURL(self): 
    293         onlineRes = OnlineResource(url_for(qualified=True, action='index') +\ 
    294                                     "?request=GetDisplayOptions&layers=%s" % self.name) 
    295          
    296         displayMetadata = MetadataURL(metadataType='display_options', format='application/json', onlineResource=onlineRes) 
    297          
    298         return [displayMetadata]  
     294         
     295        if CSMLGeoplotWmsLayer.EnableDisplayOptions == True: 
     296            onlineRes = OnlineResource(url_for(qualified=True, action='index') +\ 
     297                                        "?request=GetDisplayOptions&layers=%s" % self.name) 
     298             
     299            displayMetadata = MetadataURL(metadataType='display_options', format='application/json', onlineResource=onlineRes) 
     300             
     301            return [displayMetadata]  
     302        else: 
     303            return [] 
  • cows/trunk/cows/service/imps/csml_geoplot_backend/csml_geoplot_wms_layer_slab_base.py

    r5632 r5641  
    44from cows.service.imps.csml_geoplot_backend.csml_geoplot_render_options_parser import CSMLGeoplotRenderOptionsParser 
    55 
     6 
     7import numpy 
     8from geoplot.utils import isRangeInLimits 
    69from cows.service.wms_iface import IwmsLayerSlab 
     10import Image 
    711 
    812log = logging.getLogger(__name__) 
     
    4246        self.minval = self.variable.min() 
    4347        self.maxval = self.variable.max() 
    44          
     48  
    4549        #log.debug("renderOpts = %s" % (renderOpts,)) 
    4650         
     
    7175 
    7276        """ 
    73  
    74         log.debug('getImage(%s, %s, %s) ' % (bbox, width, height)) 
    75          
     77        #log.debug("GetImage called with bbox=%s, width=%s, height = %s" % (bbox, width, height,)) 
    7678        xLimits = (bbox[0], bbox[2]) 
    7779        yLimits = (bbox[1], bbox[3]) 
    78                          
     80                 
     81        if self.variable.getAxisIds().sort() == ['latlitude','longitude'].sort(): 
     82             
     83            if not self._areBoundsInLimits(bbox, xLimits, yLimits): 
     84                 
     85                img = numpy.zeros((height,width,4), numpy.uint8) 
     86                pilImage = Image.fromarray(img, 'RGBA') 
     87                 
     88                log.debug("empty image used as no data found for id=%s (%sx%s), lon=%s, lat=%s " % \ 
     89                  (self.variable.id, width, height, xLimits, yLimits)) 
     90                 
     91                return pilImage 
     92                        
    7993        st = time.time() 
    8094        im = self.ld.makeImage(xLimits, yLimits, width, height) 
     
    8599        return im 
    86100 
     101    def _areBoundsInLimits(self, bbox, xLimits, yLimits): 
    87102         
     103        if self.variable.getAxisIds()[0] == 'longitude': 
     104            lonAx, latAx = self.variable.getAxisList() 
     105        else: 
     106            latAx, lonAx = self.variable.getAxisList() 
     107             
     108        xRange = [ lonAx.getBounds().min(), lonAx.getBounds().max()] 
     109        yRange = [ latAx.getBounds().min(), latAx.getBounds().max()] 
     110        log.debug("xLimits = %s" % (xLimits,)) 
     111        log.debug("yLimits = %s" % (yLimits,)) 
     112        log.debug("xRange = %s" % (xRange,)) 
     113        log.debug("yRange = %s" % (yRange,)) 
     114         
     115        xRange = self._fixLongitudeRange(xLimits, xRange) 
     116         
     117        isInLimits = isRangeInLimits(xRange, xLimits) and \ 
     118                     isRangeInLimits(yRange, yLimits) 
     119                      
     120        return isInLimits 
     121     
     122    def _fixLongitudeRange(self, xLimits, xRange): 
     123        """ 
     124        Attemts to match the upper and lower bounds of the longiude range 
     125        to that of the xLimits (either -180,180 or 0,360)  
     126        """ 
     127         
     128        returnRange = xRange 
     129         
     130        range_180to0 = False 
     131        range180to360 = False   
     132              
     133        #assuming the xLimits are given in range -180 to 180 
     134        for i in [0,1]: 
     135            if -180.0 <= xLimits[i] < 0.0: 
     136                range_180to0 = True 
     137             
     138            elif 180 < xLimits[i] <= 360: 
     139                range180to360 = True 
     140         
     141        log.debug("range180to360 = %s, range_180to0 = %s" % (range180to360, range_180to0,)) 
     142        assert not (range_180to0 and range180to360), "confusing bounds found on longitude range %s " % (xLimits,) 
     143         
     144        if range_180to0: 
     145            #if the xRange is 0-360 need to adjust it 
     146            for x in returnRange: 
     147                 
     148                if x > 180.0: 
     149                    returnRange = [x - 180 for x in returnRange] 
     150                    break 
     151                     
     152        if range180to360: 
     153            #if the range is -180-0 need to adjust it 
     154            for x in returnRange: 
     155                if x < 0.0: 
     156                    returnRange =  [x + 180 for x in returnRange] 
     157                    break 
     158                 
     159        log.debug("returnRange = %s" % (returnRange,)) 
     160        return returnRange 
     161         
Note: See TracChangeset for help on using the changeset viewer.