Changeset 2989


Ignore:
Timestamp:
06/11/07 11:01:23 (12 years ago)
Author:
spascoe
Message:

Implemented colourbar.

Location:
TI05-delivery/ows_framework/trunk/ows_server/ows_server
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/controllers/csml_wms.py

    r2984 r2989  
    128128 
    129129 
     130    @operation 
     131    @parameter('Layers', required=True, validator=V.single_layer) 
     132    @parameter('Width', required=True, validator=V.integer('Width')) 
     133    def GetColourbar(self, uri, layers, width): 
     134        feature = self._getFeature(uri, layers) 
     135        sel = self._makeSelector(feature) 
     136         
     137        # Get the entire lat/lon slice from the extractCache 
     138        var = extractCache[feature, sel] 
     139 
     140        # Deduce min and max 
     141        #!TODO: How do we get the min/max?  This method produces different min/max for each time selection. 
     142        varmin = MA.minimum(var, None) 
     143        varmax = MA.maximum(var, None) 
     144        #varmin=0; varmax=100 
     145 
     146        img = render.render_colourbar(width, varmin, varmax) 
     147        return self._img2Response(img) 
     148         
    130149    @operation 
    131150    @parameter('Version', possibleValues=['1.3.0'], required=True) 
     
    144163               transparent=False, bgcolor=None, exceptions=None): 
    145164 
     165        feature = self._getFeature(uri, layers) 
     166        sel = self._makeSelector(feature) 
     167         
     168        # Get the entire lat/lon slice from the extractCache 
     169        var = extractCache[feature, sel] 
     170 
     171        # Deduce min and max 
     172        #!TODO: How do we get the min/max?  This method produces different min/max for each time selection. 
     173        varmin = MA.minimum(var, None) 
     174        varmax = MA.maximum(var, None) 
     175        #varmin=0; varmax=100 
     176 
     177        # Do geographical subsetting in cdms 
     178        var = var(latitude=(bbox[1], bbox[3]), longitude=(bbox[0], bbox[2]), squeeze=1) 
     179 
     180        # Render variable to a PIL image 
     181        img = render.render_variable(var, bbox, width, height, varmin, varmax) 
     182 
     183        # Serialise it to PNG 
     184        return self._img2Response(img) 
     185 
     186    def _makeSelector(self, feature): 
     187        # Parse dimensions. 
     188        sel = {} 
     189        for dim in self._iterDimensions(feature): 
     190            # For the moment hard-code time in.  We don't support any other dimension yet. 
     191            if dim.lower() != 'time': 
     192                raise ValueError('Only lat, lon and time are supported domain axes') 
     193             
     194            try: 
     195                sel[dim] = self.ows_params[dim] 
     196            except KeyError: 
     197                raise OWS_E.MissingParameterValue('%s dimension not specified' % dim, dim) 
     198 
     199        return sel 
     200 
     201    def _getFeature(self, uri, layers): 
    146202        # Retrieve dataset and selected feature 
    147203        rstatus, dataset = interface.GetParsedCSML(uri) 
     
    156212            raise OWS_E.InvalidParameterValue('Layer not found', 'layers') 
    157213 
    158         # Clean up bbox.  Openlayers can request some very strange bboxes.  It is trimmed 
    159         # here and the implications for the image's aspect ratio is calculated in 
    160         # render.render_variable() 
    161         #!TODO: This could be done better. 
    162         #x1 = max(-180., min(180., bbox[0])) 
    163         #x2 = max(-180., min(180., bbox[2])) 
    164         #y1 = max(-90., min(90., bbox[1])) 
    165         #y2 = max(-90., min(90., bbox[3])) 
    166  
    167         # Define the extraction selector 
    168         #sel = dict(latitude=(y1, y2), longitude=(x1, x2)) 
    169  
    170         # Parse dimensions. 
    171         sel = {} 
    172         for dim in self._iterDimensions(feature): 
    173             # For the moment hard-code time in.  We don't support any other dimension yet. 
    174             if dim.lower() != 'time': 
    175                 raise ValueError('Only lat, lon and time are supported domain axes') 
    176              
    177             try: 
    178                 sel[dim] = self.ows_params[dim] 
    179             except KeyError: 
    180                 raise OWS_E.MissingParameterValue('%s dimension not specified' % dim, dim) 
    181  
    182         # Get the entire lat/lon slice from the extractCache 
    183         var = extractCache[feature, sel] 
    184  
    185         # Deduce min and max 
    186         #!TODO: How do we get the min/max?  This method produces different min/max for each time selection. 
    187         varmin = MA.minimum(var, None) 
    188         varmax = MA.maximum(var, None) 
    189         #varmin=0; varmax=100 
    190  
    191         # Do geographical subsetting in cdms 
    192         var = var(latitude=(bbox[1], bbox[3]), longitude=(bbox[0], bbox[2]), squeeze=1) 
    193  
    194         # Render variable to a PIL image 
    195         img = render.render_variable(var, bbox, width, height, varmin, varmax) 
    196  
    197         # Serialise it to PNG 
     214        return feature 
     215 
     216    def _img2Response(self, img): 
    198217        buf = StringIO() 
    199218        img.save(buf, 'PNG') 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/lib/render.py

    r2886 r2989  
    1313from ows_server.lib.grid_util import * 
    1414from matplotlib import cm, colors 
     15from matplotlib.figure import Figure 
     16from matplotlib.backends.backend_agg import FigureCanvasAgg 
     17from matplotlib.colorbar import ColorbarBase 
     18 
    1519 
    1620import MA 
     
    177181 
    178182 
     183def render_colourbar(width, varmin, varmax, cmap=None): 
     184    dpi = 75 
     185 
     186    figsize = (width / dpi, 0.5) 
     187    fig = Figure(figsize=figsize, dpi=dpi) 
     188 
     189    ax = fig.add_axes((0,0.4, 1, 0.6)) 
     190    cb = ColorbarBase(ax, norm=colors.Normalize(varmin, varmax), 
     191                      orientation='horizontal') 
     192 
     193    canvas = FigureCanvasAgg(fig) 
     194    canvas.draw() 
     195 
     196    imstr = canvas.get_renderer().tostring_rgb() 
     197    wh = canvas.get_width_height() 
     198    img = Image.fromstring('RGB', wh, imstr) 
     199 
     200    return img 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/public/js/VisMapBox.js

    r2896 r2989  
    77VisApp = OpenLayers.Class.create(); 
    88VisApp.prototype = { 
    9     initialize: function(mapDivId, selectionFormId, mapWidth, numZoomLevels) { 
     9    initialize: function(mapDivId, selectionFormId, colourbarId, 
     10                         mapWidth, numZoomLevels) { 
    1011 
    1112        this.selectionForm = $(selectionFormId); 
     13        this.colourbarDiv = $(colourbarId); 
     14        this.mapWidth = mapWidth; 
    1215 
    1316        // This is taken from Layer.js with slight alterations.  One 
     
    9093        this.visLayer.setZIndex(300); 
    9194        this.map.addLayer(this.visLayer); 
    92         // Sometimes the coast layer doesn't get drawn at initialisation.  This forces a redraw. 
     95        // Sometimes the coast layer doesn't get drawn at initialisation. 
     96        // This forces a redraw. 
    9397        if (this.coastLayer) { 
    9498            this.coastLayer.moveTo(null, true); 
    9599        } 
    96         // this.loadLegend(); 
    97     }, 
     100        this.loadColourbar(wmsURL, featureId, time); 
     101    }, 
     102 
     103    loadColourbar: function(wmsURL, featureId, time) { 
     104        console.log('Loading colourbar'); 
     105        var url = (wmsURL + '?REQUEST=GetColourbar&LAYERS=' + featureId  
     106                   + '&TIME=' + time 
     107                   + '&WIDTH=' + this.mapWidth); 
     108        var img = document.createElement('img'); 
     109         
     110        this.colourbarDiv.innerHTML = '<img src="' + url + '"/>'; 
     111    }, 
     112         
    98113 
    99114/* 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/templates/visualise.kid

    r2888 r2989  
    4040 
    4141      function initVisMapBox() { 
    42         app = new VisApp('visMap', 'navForm', 600, 10); 
     42        app = new VisApp('visMap', 'navForm', 'colourbar', 600, 10); 
    4343        control = new VisControl(app, granules, 'dsList', 'fList', 'domainForm'); 
    4444        // Update the vis 
     
    206206            <div id="contents"> 
    207207                <div py:if="c.wmsAvailable" class="map" id="visMap" /> 
     208                <div py:if="c.wmsAvailable" class="colourbar" id="colourbar" /> 
    208209                <p> The visualisation feature is not fully implemented. </p> 
    209210                <div py:if="c.nothing2see"> 
Note: See TracChangeset for help on using the changeset viewer.