Changeset 6096


Ignore:
Timestamp:
08/12/09 14:04:09 (10 years ago)
Author:
pnorton
Message:

Improved the image composition in the coastline controller so that it now applies a background colour after generating the image via geoplot.

Location:
cowsserver/trunk/lib/cowsserver
Files:
3 added
2 edited

Legend:

Unmodified
Added
Removed
  • cowsserver/trunk/lib/cowsserver/controllers/coastwms.py

    r6072 r6096  
    1616from cows.model.wms import WmsDatasetSummary 
    1717from cowsserver.lib.wms_request_log_utils import buildLogString, wms_request_logger 
     18import cowsserver.lib.image_utils as image_utils 
    1819 
    1920import time 
     
    189190    #@beaker_cache() 
    190191    def GetMap(self):         
    191         st = time.time() 
     192        startTime = time.time() 
    192193 
    193194        # Layer handling 
     
    234235        resolution = resMap[longResolution] 
    235236         
    236         #make the colour compatable with matplotlib 
    237         if bgcolor.find('0x') == 0: 
    238             bgcolor = '#' + bgcolor[2:] 
    239237         
    240238        log.debug("bgcolor = %s" % (bgcolor,)) 
    241239         
    242         ldgArgs = {'transparent':transparent, 
    243                    'resolution':resolution, 
    244                    'bgcolour':bgcolor} 
     240        # always set transparent to true then apply  
     241        # the background colour later 
     242        ldgArgs = {'transparent':True, 'resolution':resolution} 
    245243         
    246244        convertColour = None 
    247245         
    248          
    249         # if transparency is true then matplotlib will make the image all one colour  
     246        # as matplotlib will make the image all one colour  
    250247        # and use the alpha channel to draw the lines, to aid in caching we can 
    251248        # request the image in black and then convert the colour afterwards (so 
    252249        # only the black coloured image is cached.)  
    253250         
    254         if transparent == True: 
    255              
    256             if layerName  == 'rivers': 
    257                 convertColour = self._colourToRGB(parser.getOption('river_colour'), 'blue') 
    258                 ldgArgs['riverColour'] = 'black' 
    259                 ldgArgs['coastlineColour'] = None 
    260                  
    261             elif layerName == 'landmass': 
    262                 convertColour = self._colourToRGB(parser.getOption('land_colour'), 'green') 
    263                 ldgArgs['landColour'] = 'black' 
    264                 ldgArgs['coastlineColour'] = None 
    265             else: 
    266                 convertColour = self._colourToRGB(parser.getOption('coastline_colour'), 'black') 
    267                 ldgArgs['coastlineColour'] = 'black' 
    268                 ldgArgs['coastlineWidth']  = parser.getOption('coastline_width') 
    269         else: 
    270              
    271             if layerName == 'rivers': 
    272                 ldgArgs['riverColour'] = self._colourToRGB(parser.getOption('river_colour'), 'blue') 
    273                 ldgArgs['coastlineColour'] = None 
    274                  
    275             elif layerName == 'landmass': 
    276                 ldgArgs['landColour'] = self._colourToRGB(parser.getOption('land_colour'), 'green') 
    277                 ldgArgs['coastlineColour'] = None 
    278             else: 
    279                 ldgArgs['coastlineColour'] = self._colourToRGB(parser.getOption('coastline_colour'), 'black') 
    280                 ldgArgs['coastlineWidth']  = parser.getOption('coastline_width')             
    281              
    282              
    283              
     251        if layerName  == 'rivers': 
     252            convertColour = self._colourToRGB(parser.getOption('river_colour'), 'blue') 
     253            ldgArgs['riverColour'] = 'black' 
     254            ldgArgs['coastlineColour'] = None 
     255             
     256        elif layerName == 'landmass': 
     257            convertColour = self._colourToRGB(parser.getOption('land_colour'), 'green') 
     258            ldgArgs['landColour'] = 'black' 
     259            ldgArgs['coastlineColour'] = None 
     260        else: 
     261            convertColour = self._colourToRGB(parser.getOption('coastline_colour'), 'black') 
     262            ldgArgs['coastlineColour'] = 'black' 
     263            ldgArgs['coastlineWidth']  = parser.getOption('coastline_width') 
    284264             
    285265        xLimits = (bbox[0], bbox[2]) 
     
    288268        finalImg = self._getLDCImage(ldgArgs, xLimits, yLimits, width, height) 
    289269         
     270         
    290271        if convertColour != None: 
    291272             
    292273            log.debug("convertColour = %s" % (convertColour,)) 
    293274            st = time.time() 
    294             imgArr = numpy.asarray(finalImg) 
    295  
    296             arr = numpy.zeros(imgArr.shape, dtype=numpy.uint8) 
    297             arr[:,:,0] = int(round(convertColour[0] * 255.0)) 
    298             arr[:,:,1] = int(round(convertColour[1] * 255.0)) 
    299             arr[:,:,2] = int(round(convertColour[2] * 255.0)) 
    300             arr[:,:,3] =  imgArr[:,:,3] 
    301              
    302             finalImg = Image.fromarray(arr, 'RGBA') 
     275             
     276            finalImg = image_utils.setImageRGB(finalImg, convertColour) 
     277#            imgArr = numpy.asarray(finalImg) 
     278 
     279#            arr = numpy.zeros(imgArr.shape, dtype=numpy.uint8) 
     280#            arr[:,:,0] = convertColour[0] 
     281#            arr[:,:,1] = convertColour[1] 
     282#            arr[:,:,2] = convertColour[2] 
     283#            arr[:,:,3] =  imgArr[:,:,3] 
     284#             
     285#            finalImg = Image.fromarray(arr, 'RGBA') 
    303286            log.debug("converted in %ss" % (time.time() - st,)) 
     287         
     288        # at this point finalImg has a transparent background, if transparent is  
     289        # false then apply a background colour. This avoids the need for caching 
     290        # all the different background colours and this process of filling in the 
     291        # background is pretty quick. 
     292        if not transparent: 
     293             
     294            st = time.time() 
     295            backgroundColour = self._colourToRGB(bgcolor, (255,255,255)) 
     296            backgroundColour = backgroundColour + (255,) # add the alpha 
     297            finalImg = image_utils.setBGColour(finalImg, backgroundColour) 
     298            log.debug("set background in %ss" % (time.time() - st,)) 
    304299         
    305300        # IE < 7 doesn't display the alpha layer right.  Here we sniff the 
     
    320315        response.write(buf.getvalue()) 
    321316         
    322         #log.debug("got coastline in %s" % (time.time() - st,)) 
     317        log.debug("got coastline in %s" % (time.time() - startTime,)) 
    323318 
    324319    def GetContext(self): 
     
    385380        response.write( generator.generateJSON() ) 
    386381 
    387     def _colourToRGB(self, colour, default=None): 
     382    def _colourToRGB(self, colour, default=None, scaleTo255=True): 
    388383         
    389384        if colour == None: 
     
    395390                 
    396391            convertColour = matplotlib.colors.colorConverter.to_rgb(colour) 
     392             
     393            if scaleTo255: 
     394                convertColour = tuple([int(round(y*255)) for y in convertColour]) 
     395             
    397396        except: 
    398397            log.warning("Error converting colour %s to rgb value." % (colour,)) 
  • cowsserver/trunk/lib/cowsserver/tests/__init__.py

    r5479 r6096  
    2121__all__ = ['url_for', 'TestController'] 
    2222 
    23 here_dir = os.path.dirname(os.path.abspath(__file__)) 
    24 conf_dir = os.path.dirname(os.path.dirname(os.path.dirname(here_dir))) 
     23conf_dir = None 
    2524 
    26 sys.path.insert(0, conf_dir) 
    27 pkg_resources.working_set.add_entry(conf_dir) 
    28 pkg_resources.require('Paste') 
    29 pkg_resources.require('PasteScript') 
    30  
    31 test_file = os.path.join(conf_dir, 'test.ini') 
    32 cmd = paste.script.appinstall.SetupCommand('setup-app') 
    33 cmd.run([test_file]) 
     25def setup_tests(): 
     26    global conf_dir 
     27     
     28    here_dir = os.path.dirname(os.path.abspath(__file__)) 
     29    conf_dir = os.path.dirname(os.path.dirname(os.path.dirname(here_dir))) 
     30     
     31    sys.path.insert(0, conf_dir) 
     32    pkg_resources.working_set.add_entry(conf_dir) 
     33    pkg_resources.require('Paste') 
     34    pkg_resources.require('PasteScript') 
     35     
     36    test_file = os.path.join(conf_dir, 'test.ini') 
     37    cmd = paste.script.appinstall.SetupCommand('setup-app') 
     38    cmd.run([test_file]) 
    3439 
    3540class TestController(TestCase): 
Note: See TracChangeset for help on using the changeset viewer.