Changeset 5551


Ignore:
Timestamp:
04/08/09 09:33:41 (10 years ago)
Author:
pnorton
Message:

Added a first attempt at a getFigure implementation. Also fixed the JS code so that it works when given an endpoint that dosen't support display options.

Location:
cowsclient/branches/qesdi
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • cowsclient/branches/qesdi/buildout/buildout.cfg

    r5515 r5551  
    1717  Genshi 
    1818  simplejson 
    19  
     19  webob 
  • cowsclient/branches/qesdi/cowsclient/controllers/wmsviz.py

    r5522 r5551  
    1919import simplejson as json 
    2020import urlparse 
    21  
    22 import copy, logging 
     21from cStringIO import StringIO 
     22 
     23import copy, logging, Image, ImageChops 
    2324log = logging.getLogger(__name__) 
    2425import urllib, urllib2 
    2526 
    2627class WmsvizController(BaseController): 
     28     
     29    _pilImageFormats = { 
     30        'image/png': 'PNG', 
     31        'image/jpg': 'JPEG', 
     32        'image/gif': 'GIF', 
     33        'image/tiff': 'TIFF' 
     34    } 
    2735     
    2836    def index(self): 
     
    214222        session['viewItems']=[] 
    215223        session.save() 
     224         
     225 
     226 
     227     
     228    def get_figure(self): 
     229        log.debug("running wmsvis.get_figure") 
     230         
     231         
     232        #need to generate the plot for the figure, need to know 
     233        # - each of the layers 
     234        # - the proerpoties on each of the layers 
     235        # - the wms endpoints 
     236         
     237        # if the requests are coming from this endpoint, need to 
     238        # build the map with the correct options 
     239         
     240#        result = '<html><body><h1>Environ</h1>' 
     241#                 
     242#        for key, value in request.environ.items(): 
     243#            result += '%s: %r <br />'%(key, value) 
     244#        result += '</body></html>' 
     245#        return result 
     246 
     247        log.debug("request.method = %s" % (request.method,)) 
     248        log.debug("request.params = %s" % (request.params,)) 
     249        log.debug("request.POST = %s" % (request.POST,)) 
     250         
     251        params = request.params.copy() 
     252         
     253        defaults = { 
     254         'bbox': "%s,%s,%s,%s" % (-180,-90,180,90), 
     255         'width':900, 
     256         'height':600, 
     257         'SRS':'EPSG:4326', 
     258         'format':'image/png', 
     259         'transparent':'True',                     
     260        } 
     261         
     262        log.debug("params = %s" % (params,)) 
     263         
     264        for k in defaults.keys(): 
     265            if not params.get(k, None) in ['', None]: 
     266                defaults[k] = params[k]   
     267         
     268        log.debug("defaults = %s" % (defaults,)) 
     269         
     270        defaults['Request'] = 'GetMap' 
     271         
     272        width = int(params.get('width', defaults['width'])) 
     273        height = int(params.get('height', defaults['height'])) 
     274         
     275        images = [] 
     276         
     277        for i in range(1,11): 
     278            s = '%s_' % (i) 
     279            keys = filter(lambda x: x.find(s) == 0, params.keys()) 
     280             
     281             
     282            if len(keys) == 0: 
     283                break 
     284             
     285            if i == 10: 
     286                raise Exception("Can's support 10 layers.") 
     287             
     288            p = {} 
     289            for k in keys: 
     290                if not params[k] in ['', None]:  
     291                    p[k[len(s):]] = params[k] 
     292             
     293            for k,v in defaults.items(): 
     294                p.setdefault(k,v) 
     295             
     296            log.debug("p = %s" % (p,)) 
     297             
     298            endpoint  = p.pop('endpoint') 
     299            requestURL = endpoint +"?" + urllib.urlencode(p) 
     300             
     301            req = urllib2.Request(requestURL) 
     302            req.add_header('Cookie', request.headers.get('Cookie', '')) 
     303            filehandle = openURL(req)            
     304            imageString = StringIO(filehandle.read()) 
     305            img = Image.open(imageString) 
     306            images.append(img) 
     307            log.debug("img.size = %s, img.mode = %s" % (img.size, img.mode,)) 
     308 
     309        finalImg = merge(*images) 
     310        format = 'image/png' 
     311        response.headers['content-type'] = format 
     312         
     313        #finalImg.putalpha(255) 
     314        buffer = StringIO() 
     315        finalImg.save(buffer, self._pilImageFormats[format]) 
     316         
     317        response.headers['Content-Type'] = format 
     318        response.write(buffer.getvalue())   
     319 
     320 
     321 
     322def merge(*args): 
     323     
     324    finalImg = Image.new(args[0].mode, args[0].size, (255,255,255,0)) 
     325     
     326    # have to handle the alpha channel differently otherwise adding a semi-transparent 
     327    # image over an opaque image will result in some transparency in the final  
     328    # image 
     329    alpha = finalImg.split()[-1] 
     330 
     331    for i in args: 
     332        finalImg = Image.composite(finalImg, i, finalImg) 
     333        alpha = ImageChops.lighter(alpha, i.split()[-1]) 
     334 
     335    finalImg.putalpha(alpha) 
     336         
     337    return finalImg 
  • cowsclient/branches/qesdi/cowsclient/public/js/capabilities.js

    r5534 r5551  
    243243            var metaURL = this.node.getElementsByTagName('MetadataURL')[i]; 
    244244 
    245             if (metaURL.getAttribute('type') == 'display_options') { 
     245            if (metaURL != undefined && metaURL.getAttribute('type') == 'display_options') { 
    246246                var olr = metaURL.getElementsByTagName('OnlineResource')[0]; 
    247247                displayOpts = olr.getAttribute('xlink:href'); 
  • cowsclient/branches/qesdi/cowsclient/public/js/layerControl.js

    r5534 r5551  
    7272                version: '1.3.0',  
    7373                CRS: 'CRS:84',  
    74                 transparent: 'true',  
    75                 styles: 'grid',  
    76                 time:'1905-01-15T00:00:00.0' }; 
     74                transparent: 'true'}; 
    7775         
    7876        this.layersToSelect = {}; 
  • cowsclient/branches/qesdi/cowsclient/public/js/layerDimensions.js

    r5531 r5551  
    3030     
    3131    _onCurrentLayerChanged: function(e) { 
    32          
    3332        this._clearForm(); 
    3433         
     
    5150        var div, i; 
    5251        var dims = wmcLayer.getDimensions(); 
    53          
    5452        var fs = document.createElement('fieldset'); 
    5553        var leg = document.createElement('legend'); 
  • cowsclient/branches/qesdi/cowsclient/public/js/layerList.js

    r5534 r5551  
    4949     
    5050         
     51        /** 
     52         * Adds the this._onItemClick event handler to all the current list items.  
     53         */ 
    5154        _addOnClickListeners: function() { 
    5255                var currentItems = this._getCurrentListItems(); 
     
    5659        }, 
    5760 
     61        /** 
     62         * Handles the 'click' event for a list item, this selects any item that is 
     63         * clicked on 
     64         */ 
    5865        _onItemClick: function(event, target) { 
    5966                this._selectItem(target); 
    6067        }, 
    6168         
     69        /** 
     70         * Handlese the drag end event when one of the list items has stoped  
     71         * being dragged. 
     72         */ 
    6273        _onDragEnd: function(item){ 
    6374                this._selectItem(item); 
     
    6576        }, 
    6677         
     78        /** 
     79         * Handles the remove button click event, this removes the currently  
     80         * selected layer (if there is a currently selected layer). 
     81         */ 
    6782        _onRemoveClick: function(event, target) { 
    6883                if (this.getSelectedLayer() != null) { 
     
    7388        }, 
    7489         
     90        /** 
     91         * Selects a given list item, does nothing if the item is already selected 
     92         */ 
    7593        _selectItem: function(item) { 
    7694 
     
    83101        }, 
    84102         
     103        /** 
     104         * unselects all of the current items in the list 
     105         */ 
    85106        _unselectAll: function() { 
    86107                var currentItems = this._getCurrentListItems(); 
     
    90111        }, 
    91112 
     113        /** 
     114         * unselects a given item by removign the SELECTED_CLASS from the  
     115         * item.className property. Does nothing if the item isn't selected. 
     116         */ 
    92117        _unselectItem: function(item) { 
    93118 
     
    98123        }, 
    99124         
     125        /** 
     126         * Checks if an item is selected by checking the start of the .className for 
     127         * the SELECTED_CLASS class. 
     128         */ 
    100129        _isSelected: function(item) { 
    101130            if (item.className != undefined) { 
     
    105134        }, 
    106135         
    107  
     136        /** 
     137         * Finds the selected item from the currently selected items. As only one 
     138         * item can be selected at a time will return the first selected item 
     139         * it comes across. 
     140         */ 
    108141        _getSelectedItem: function() { 
    109142 
     
    117150        }, 
    118151         
     152        /** 
     153         * Removes the currently selected item from the list 
     154         */ 
    119155        _removeSelectedItem: function() { 
    120156                var item = this._getSelectedItem(); 
     
    122158        }, 
    123159         
     160        /** 
     161         * Removes a given item from the drag list 
     162         */ 
    124163        _removeItem: function (item){ 
    125164                if (item != null) { 
     
    131170        }, 
    132171         
     172        /** 
     173         * removes the openlayers layer with the given layerId from the layer list. 
     174         */ 
    133175        _removeLayer: function(layerId) { 
    134176                var oldLayers = this._layers; 
     
    174216        }, 
    175217 
     218        /** 
     219         * Returns the current list items in the draglist, these items are 
     220         * Element objects corresponding to the '<li>' items in the list. 
     221         */ 
    176222        _getCurrentListItems: function() { 
    177223                var items = []; 
     
    186232        }, 
    187233         
     234        /** 
     235         * Adds the onNewLayer handler tot he NEW_LAYER event. 
     236         */ 
    188237    addSelectorHandlers: function(events) { 
    189238       events.register("NEW_LAYER", this, this.onNewLayer); 
    190239    }, 
    191240 
     241    /** 
     242     * Handles the NEW_LAYER event, adds the new layer to the list 
     243     */ 
    192244    onNewLayer: function(e) { 
    193245        this._addLayer(e.layer); 
    194246    }, 
    195247 
     248    /** 
     249     * Adds a new layer to the list, this adds a new 'li' element to the draglist 
     250     * and adds the openlayers layer to the layer list. 
     251     */ 
    196252    _addLayer: function(layer) { 
    197253 
     
    203259    }, 
    204260     
     261    /** 
     262     * Triggers the LAYER_ORDER_CHANGED event which occurs when the order 
     263     * of the layers in the list has been changed. 
     264     */ 
    205265    _triggerLayerOrderChange: function() { 
    206266        this.events.triggerEvent("LAYER_ORDER_CHANGED", {layers:this._getOrderedLayers()});      
    207267    }, 
    208268     
     269    /** 
     270     * Triggers the SELECTED_LAYER_CHANGED event, this occurs when a different  
     271     * layer has been selected.  
     272     */ 
    209273    _triggerSelectedLayerChange: function() { 
    210274        this.events.triggerEvent("SELECTED_LAYER_CHANGED", {layer:this.getSelectedLayer()}); 
    211275    }, 
    212276 
     277    /** 
     278     * Returns the openlayers layer objects in the order corresponding to the 
     279     * current draglist items (with the top item in the list coming at the start 
     280     * of the array).  
     281     *  
     282     * This is done by checking the id of the draglist items and retriving the 
     283     * layers using the id. 
     284     */ 
    213285    _getOrderedLayers: function() { 
    214286        var currentItems = this._getCurrentListItems(); 
     
    224296    }, 
    225297     
     298    /** 
     299     * Gets a openlayers layer form the layer list with the given id. 
     300     */ 
    226301    _getLayerById: function(id) { 
    227302        for (var i in this._layers)  { 
     
    233308    }, 
    234309     
     310    /** 
     311     * Gets the openlayers layer that corresponds to the currently selected 
     312     * list item. 
     313     */ 
    235314    getSelectedLayer: function() { 
    236315         
     
    250329        }, 
    251330 
     331        /** 
     332         * Removes all the items from the drag list. 
     333         */ 
    252334        _removeAllItems: function() { 
    253335        var currentItems = this._getCurrentListItems(); 
  • cowsclient/branches/qesdi/cowsclient/public/js/layerParameters.js

    r5534 r5551  
    3939     
    4040    // also need to let the display options know if the style has changed. 
    41     this.layerDisplay.addStyleChangedEvent(this.layerInfo.events);     
     41    this.layerDisplay.addStyleChangedEvent(this.layerInfo.events); 
     42    WMSC.log("layer parameters created"); 
    4243} 
    4344 
     
    110111     */ 
    111112    buildControls: function(wmc) { 
    112                          
     113         
    113114        //find the dimensions for the layer 
    114115        var wmcLayer = this.searchSubLayers(wmc.getSubLayers()); 
    115          
    116116        this.currentWMCLayer = wmcLayer; 
    117117        this.events.triggerEvent('CURRENT_WMCLAYER_CHANGED', {olLayer:this.currentOLLayer, 
  • cowsclient/branches/qesdi/cowsclient/public/js/legendContainer.js

    r5536 r5551  
    99                        this.currentOLLayer = null; 
    1010                }, 
    11                  
     11 
     12                /** 
     13                 * add the handler for the layerParemeters events, LAYER_PROPERTY_CHANGED and CURRENT_WMCLAYER_CHANGED 
     14                 */ 
    1215            addLayerParametersHandlers: function(events) { 
    1316                events.register("LAYER_PROPERTY_CHANGED", this, this.onLayerPropertyChanged); 
     
    1518                 
    1619            }, 
    17              
     20 
     21            /** 
     22             * handles the CURRENT_WMCLAYER_CHANGED event, replaces the legend 
     23             * with one correponding to the new layer (if the new layer isn't null. 
     24             */ 
    1825            onLayerChanged: function(e) { 
     26                  
    1927            this.clearLegend(); 
    2028             
     
    2432            if (this.currentWMCLayer != null && this.currentOLLayer != null) { 
    2533                var style = this.currentOLLayer.params['STYLES']; 
    26                 WMSC.log("Style = " + style); 
     34 
    2735                var url = this.currentWMCLayer.getLegendURL(style); 
    2836                if (url != null) { 
     
    3947             
    4048            /** 
    41              * A property on the layer has changed, need to re-draw the legend 
     49             * handles the LAYER_PROPERTY_CHANGED event. A property on the layer has  
     50             * changed, need to re-draw the legend 
    4251             */ 
    4352            onLayerPropertyChanged: function(e) { 
     
    5766                }, 
    5867                 
     68                /** 
     69                 * Loads a new legend from the given url, this uses the legendRetriver  
     70                 * to get the new legend html using AJAX and then calls the .setLegend 
     71                 * function.  
     72                 */ 
    5973                loadNewLegend: function(url) { 
    6074                var onSuccessFn = this.setLegend.bindAsEventListener(this) 
     
    6276                }, 
    6377                 
     78                /** 
     79                 * Takes the xhr response text and places it inside the legend div. 
     80                 * The response text should be a valid <img> element. 
     81                 */ 
    6482                setLegend: function (xhr) { 
    6583//                      WMSC.log("setting legend at" +new Date()); 
     
    7088                }, 
    7189                 
     90                /** 
     91                 * clears the content from the legendDiv 
     92                 */ 
    7293                clearLegend: function(xhr) { 
    7394                        this.legendDiv.innerHTML = ''; 
  • cowsclient/branches/qesdi/cowsclient/public/js/legendRetriever.js

    r5534 r5551  
    11 
     2/** 
     3 * retrives the GetLegend responses from the server and passes the response to a 
     4 * given success function, also caches the responses so that the same request 
     5 * isn't made twice. 
     6 *  
     7 * @constructor 
     8 */ 
    29LegendRetriever = function(){ 
    310    this._lookup = {};             
     
    613LegendRetriever.prototype = { 
    714 
     15                /** 
     16                 * Retrives the GetLegend response form the server for a given url. The 
     17                 * onSuccessFunction will be call with the response document form the  
     18                 * server. 
     19                 */ 
    820        getLegend: function(url, onSuccessFunction) { 
    921             
     
    3143        }, 
    3244         
     45        /** 
     46         * Adds the response object for the url to the lookup 
     47         */ 
    3348        addToLookup: function(url, obj){ 
    3449            this._lookup[url] = obj; 
    3550        }, 
    3651         
     52        /** 
     53         * Checks if the response for a given url is in the cahce or not. 
     54         */ 
    3755        isCached: function(url) { 
    3856 
  • cowsclient/branches/qesdi/cowsclient/public/js/mapControl.js

    r5534 r5551  
    6161                    { layers: 'l', format: 'image/png', transparent: 'false' } 
    6262                ); 
    63  
     63             
    6464//          var lyrBaseClear = new OpenLayers.Layer.Image( 
    6565//                      "None", 
     
    143143//              layerControl.events.register('changeWMS', this, this.updateVisLayer); 
    144144//    }, 
    145 //     
     145 
    146146    addLayersHandlers: function (events) { 
    147147        events.register("LAYER_ORDER_CHANGED", this, this.onLayerOrderChanged); 
  • cowsclient/branches/qesdi/cowsclient/public/js/wmcRetriever.js

    r5534 r5551  
    4141                                 onSuccess: onRetrieveWMC.bindAsEventListener(this), 
    4242                                 onException : function(resp, e) {   WMSC.log("Exception:" + e); }, 
     43                                 onFailure : function(resp) {   WMSC.log("Failure:" + resp); }, 
    4344                                        }); 
    4445                } 
  • cowsclient/branches/qesdi/development.ini

    r5409 r5551  
    1919use = egg:cowsclient 
    2020full_stack = true 
    21 cache_dir = %(here)s/data 
     21cache_dir = /data/pnorton/ui_cache/  
    2222beaker.session.key = cowsclient 
    2323beaker.session.secret = somesecret 
     
    2828# for the Cache data, or the Session saves, un-comment the desired settings 
    2929# here: 
    30 #beaker.cache.data_dir = %(here)s/data/cache 
    31 #beaker.session.data_dir = %(here)s/data/sessions 
     30beaker.cache.data_dir = /data/pnorton/beaker_cache_ui 
     31beaker.session.data_dir = /data/pnorton/beaker_session_ui 
    3232 
    3333# WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT* 
    3434# Debug mode will enable the interactive debugging tool, allowing ANYONE to 
    3535# execute malicious code after an exception is raised. 
    36 #set debug = false 
     36set debug = false 
    3737 
    3838 
Note: See TracChangeset for help on using the changeset viewer.