Ignore:
Timestamp:
08/05/09 14:26:31 (11 years ago)
Author:
domlowe
Message:

adding separate cowsclient pylons app

File:
1 copied

Legend:

Unmodified
Added
Removed
  • cows/branches/cows-vis/cows/service/imps/pywms/render_imp.py

    r5052 r5265  
    2020logger = logging.getLogger(__name__) 
    2121 
    22 class RGBARenderer(GridRenderer): 
     22class ddcRGBARenderer(GridRenderer): 
    2323    """Creates an RGBA PNG with a selectable matplotlib colour scale. 
     24    @todo: This shouldn't be called RgbaPNGRenderer because it produces PIL RGBA images, not just PNG. 
    2425    """ 
    2526 
     
    2728 
    2829    def __init__(self, varmin, varmax): 
     30        self.setMinMax(varmin, varmax) 
     31         
     32    def setMinMax(self, varmin, varmax): 
    2933        self.varmin = varmin 
    3034        self.varmax = varmax 
    3135        self._norm = colors.normalize(varmin, varmax) 
     36         
     37        logger.debug('Instantiating RgbaPNGRenderer with varmin=%s, varmax=%s' 
     38                     % (varmin, varmax)) 
    3239 
    3340    def renderColourbar(self, width, height, cmap, isVertical=True): 
     
    3946            shape = (256, 1) 
    4047 
     48        cbar = (cmap(a) * 255).astype(byteTypecode).tostring() 
     49        img = Image.frombuffer("RGBA", shape, cbar, "raw", "RGBA", 0, 1) 
     50        img = img.resize((width, height)) 
     51 
     52        return img 
     53 
     54    def renderGrid(self, grid, bbox, width, height, cmap): 
     55        cmap.set_bad('#ffffff', 0.0) 
     56 
     57        logger.info('grid %s, %s, %s, %s, %s, %s' % 
     58                    (grid.lon0, grid.lat0, grid.dlon, grid.dlat, grid.nlon, grid.nlat)) 
     59 
     60        # Get a pixel = grid-box image for the grid 
     61        img = self._grid2Img(grid, cmap) 
     62 
     63        # Calculate the pixel-size of a grid box 
     64        pxPerDeg_lon = float(width) / (bbox[2] - bbox[0]) 
     65        pxPerDeg_lat = float(height) / (bbox[3] - bbox[1]) 
     66        pxPerGrid_x = grid.dlon * pxPerDeg_lon 
     67        pxPerGrid_y = grid.dlat * pxPerDeg_lat 
     68 
     69        # Scale Img to the right size 
     70        img = img.resize((pxPerGrid_x * grid.nlon, pxPerGrid_y * grid.nlat)) 
     71 
     72        # We assume the grid points represent the centre of the grid boxes 
     73        # therefore we can calculate the upper-left position of the image 
     74 
     75        # Find top-left corner of grid 
     76        if grid.dlon > 0: 
     77            leftLon = grid.lon0 
     78        else: 
     79            leftLon = grid.lon0 + (grid.dlon * (grid.nlon - 1)) 
     80        if grid.dlat > 0: 
     81            topLat = grid.lat0 + (grid.dlat * (grid.nlat - 1)) 
     82        else: 
     83            topLat = grid.lat0 
     84 
     85        logger.info('top-left = %s lon, %s lat' % (leftLon, topLat)) 
     86 
     87        # Find pixel position of top left centre grid box 
     88        cx = width * ((leftLon - bbox[0])/ (bbox[2] - bbox[0])) 
     89        cy = height * ((bbox[3] - topLat) / (bbox[3] - bbox[1])) 
     90 
     91        # Apply half width of grid box 
     92        ox = int(cx - pxPerGrid_x / 2) 
     93        oy = int(cy - pxPerGrid_y / 2) 
     94 
     95        # Paste the grid image into the tile image 
     96        tileImg = Image.new('RGBA', (width, height)) 
     97        logger.info('Pasting image img%s into tileImg%s at (%s,%s)' % (tileImg.size, img.size, ox, oy)) 
     98        tileImg.paste(img, (ox, oy)) 
     99 
     100        return tileImg 
     101 
     102 
     103 
     104 
     105 
     106 
     107 
     108class RGBARenderer(GridRenderer): 
     109    """Creates an RGBA PNG with a selectable matplotlib colour scale. 
     110    """ 
     111 
     112    mimeType = 'image/png' 
     113 
     114    def __init__(self, varmin, varmax): 
     115        self.varmin = varmin 
     116        self.varmax = varmax 
     117        self._norm = colors.normalize(varmin, varmax) 
     118 
     119    def renderColourbar(self, width, height, cmap, isVertical=True): 
     120        a = N.arrayrange(0, 1.0, 1.0/256) 
     121        if isVertical: 
     122            a = a[-1::-1] 
     123            shape = (1, 256) 
     124        else: 
     125            shape = (256, 1) 
     126 
    41127        cbar = (cmap(a) * 255).astype('b').tostring() 
    42128        img = Image.frombuffer("RGBA", shape, cbar, "raw", "RGBA", 0, 1) 
     
    44130 
    45131        return img 
     132 
     133    def DDCrenderGrid(self, grid, bbox, width, height, cmap): 
     134        cmap.set_bad('#ffffff', 0.0) 
     135 
     136        logger.info('grid %s, %s, %s, %s, %s, %s' % 
     137                    (grid.lon0, grid.lat0, grid.dlon, grid.dlat, grid.nlon, grid.nlat)) 
     138 
     139        # Get a pixel = grid-box image for the grid 
     140        img = self._grid2Img(grid, cmap) 
     141 
     142        # Calculate the pixel-size of a grid box 
     143        pxPerDeg_lon = float(width) / (bbox[2] - bbox[0]) 
     144        pxPerDeg_lat = float(height) / (bbox[3] - bbox[1]) 
     145        pxPerGrid_x = grid.dlon * pxPerDeg_lon 
     146        pxPerGrid_y = grid.dlat * pxPerDeg_lat 
     147 
     148        # Scale Img to the right size 
     149        img = img.resize((pxPerGrid_x * grid.nlon, pxPerGrid_y * grid.nlat)) 
     150 
     151        # We assume the grid points represent the centre of the grid boxes 
     152        # therefore we can calculate the upper-left position of the image 
     153 
     154        # Find top-left corner of grid 
     155        if grid.dlon > 0: 
     156            leftLon = grid.lon0 
     157        else: 
     158            leftLon = grid.lon0 + (grid.dlon * (grid.nlon - 1)) 
     159        if grid.dlat > 0: 
     160            topLat = grid.lat0 + (grid.dlat * (grid.nlat - 1)) 
     161        else: 
     162            topLat = grid.lat0 
     163 
     164        logger.info('top-left = %s lon, %s lat' % (leftLon, topLat)) 
     165 
     166        # Find pixel position of top left centre grid box 
     167        cx = width * ((leftLon - bbox[0])/ (bbox[2] - bbox[0])) 
     168        cy = height * ((bbox[3] - topLat) / (bbox[3] - bbox[1])) 
     169 
     170        # Apply half width of grid box 
     171        ox = int(cx - pxPerGrid_x / 2) 
     172        oy = int(cy - pxPerGrid_y / 2) 
     173 
     174        # Paste the grid image into the tile image 
     175        tileImg = Image.new('RGBA', (width, height)) 
     176        logger.info('Pasting image img%s into tileImg%s at (%s,%s)' % (tileImg.size, img.size, ox, oy)) 
     177        tileImg.paste(img, (ox, oy)) 
     178 
     179        return tileImg 
    46180 
    47181    def renderGrid(self, grid, bbox, width, height, cmap): 
     
    88222 
    89223        # Apply half width of grid box 
    90         #ox = int(cx - pxPerGrid_x / 2) 
    91         #oy = int(cy - pxPerGrid_y / 2) 
    92         ox,oy = int(cx), int(cy-pxPerGrid_y) 
     224        ox = int(cx - pxPerGrid_x / 2) 
     225        oy = int(cy - pxPerGrid_y / 2) 
     226        #ox,oy = int(cx), int(cy-pxPerGrid_y) 
    93227        logger.debug('Offset: %s x, %s y' % (ox, oy)) 
    94228 
     
    98232        logger.debug('Pasting image img%s into tileImg%s at (%s,%s)' % (img.size, tileImg.size, ox, oy)) 
    99233        tileImg.paste(img, (ox, oy)) 
    100  
    101234        return tileImg 
    102235 
     
    119252     
    120253        img = Image.frombuffer("RGBA", img_buf.shape[1::-1], img_buf.tostring(), "raw", "RGBA", 0, 1) 
    121         img.save('tmp/raw1.png') 
     254        img.save('/tmp/raw1.png') 
    122255 
    123256        # Rotate if axis order is x, y 
Note: See TracChangeset for help on using the changeset viewer.