Changeset 5624


Ignore:
Timestamp:
18/08/09 10:26:53 (10 years ago)
Author:
pnorton
Message:

Added some support for the GetFigure? extended request, also implemented a cowsclient function that tries to make a figure out of several different layers. Made a few layout changes.

Location:
cowsclient/branches/qesdi
Files:
4 added
10 edited

Legend:

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

    r5551 r5624  
    77 
    88[cowsclient] 
     9#cowsclient will work without matplotlib, its only used for axis drawing 
    910recipe = zc.recipe.egg 
    1011interpreter = py 
     
    1213  nose 
    1314  mock 
     15  decorator==3.0.1 
    1416  Pylons==0.9.6.1 
    1517  Paste 
     
    1820  simplejson 
    1921  webob 
     22  matplotlib 
  • cowsclient/branches/qesdi/cowsclient/controllers/wmsviz.py

    r5563 r5624  
    1616from cowsclient.lib.wmc_util import GetWebMapContext, GetWebMapCapabilities, GetLegend, openURL, GetResponse 
    1717from cowsclient.model import selectedItem 
     18from cowsclient.lib.build_figure import build_figure 
    1819 
    1920import simplejson as json 
     
    240241        log.debug("running wmsvis.get_figure") 
    241242         
    242          
    243         #need to generate the plot for the figure, need to know 
    244         # - each of the layers 
    245         # - the proerpoties on each of the layers 
    246         # - the wms endpoints 
    247          
    248         # if the requests are coming from this endpoint, need to 
    249         # build the map with the correct options 
    250          
    251 #        result = '<html><body><h1>Environ</h1>' 
    252 #                 
    253 #        for key, value in request.environ.items(): 
    254 #            result += '%s: %r <br />'%(key, value) 
    255 #        result += '</body></html>' 
    256 #        return result 
    257  
    258         log.debug("request.method = %s" % (request.method,)) 
    259         log.debug("request.params = %s" % (request.params,)) 
    260         log.debug("request.POST = %s" % (request.POST,)) 
    261          
    262         params = request.params.copy() 
    263          
    264          
    265          
    266         defaults = { 
    267          'BBOX': "%s,%s,%s,%s" % (-180,-90,180,90), 
    268          'WIDTH':900, 
    269          'HEIGHT':600, 
    270          'SRS':'EPSG:4326', 
    271          'FORMAT':'image/png', 
    272          'TRANSPARENT':'True',                     
    273         } 
     243        params = request.params 
    274244         
    275245        log.debug("params = %s" % (params,)) 
    276246         
    277         for k in defaults.keys(): 
    278             if not params.get(k, None) in ['', None]: 
    279                 defaults[k] = params[k]   
    280          
    281         log.debug("defaults = %s" % (defaults,)) 
    282          
    283         defaults['REQUEST'] = 'GetMap' 
    284          
    285         width = int(params.get('WIDTH', defaults['WIDTH'])) 
    286         height = int(params.get('HEIGHT', defaults['HEIGHT'])) 
    287          
    288         images = [] 
    289          
    290         for i in range(1,11): 
    291             s = '%s_' % (i) 
    292             keys = filter(lambda x: x.find(s) == 0, params.keys()) 
    293              
    294              
    295             if len(keys) == 0: 
    296                 break 
    297              
    298             if i == 10: 
    299                 raise Exception("Can's support 10 layers.") 
    300              
    301             p = {} 
    302             for k in keys: 
    303                 if not params[k] in ['', None]:  
    304                     p[k[len(s):]] = params[k] 
    305              
    306             for k,v in defaults.items(): 
    307                 p.setdefault(k,v) 
    308              
    309             log.debug("p = %s" % (p,)) 
    310              
    311             endpoint  = p.pop('ENDPOINT') 
    312             requestURL = endpoint +"?" + urllib.urlencode(p) 
    313              
    314             req = urllib2.Request(requestURL) 
    315             req.add_header('Cookie', request.headers.get('Cookie', '')) 
    316             filehandle = openURL(req)            
    317             imageString = StringIO(filehandle.read()) 
    318             img = Image.open(imageString) 
    319             images.append(img) 
    320             log.debug("img.size = %s, img.mode = %s" % (img.size, img.mode,)) 
    321  
    322         finalImg = merge(*images) 
    323         format = 'image/png' 
     247        format = params.pop('figFormat', 'image/png') 
     248         
     249        finalImage = build_figure(params) 
     250         
    324251        response.headers['content-type'] = format 
    325252         
    326         #finalImg.putalpha(255) 
    327253        buffer = StringIO() 
    328         finalImg.save(buffer, self._pilImageFormats[format]) 
     254        finalImage.save(buffer, self._pilImageFormats[format]) 
    329255         
    330256        response.headers['Content-Type'] = format 
     
    333259 
    334260 
    335 def merge(*args): 
    336      
    337     finalImg = Image.new(args[0].mode, args[0].size, (255,255,255,0)) 
    338      
    339     # have to handle the alpha channel differently otherwise adding a semi-transparent 
    340     # image over an opaque image will result in some transparency in the final  
    341     # image 
    342     alpha = finalImg.split()[-1] 
    343  
    344     for i in args: 
    345         finalImg = Image.composite(finalImg, i, finalImg) 
    346         alpha = ImageChops.lighter(alpha, i.split()[-1]) 
    347  
    348     finalImg.putalpha(alpha) 
    349          
    350     return finalImg 
  • cowsclient/branches/qesdi/cowsclient/public/js/capabilities.js

    r5575 r5624  
    9393    }, 
    9494     
     95    getAllRequests: function() { 
     96        var standardReqs = WMSC.traverseWMSDom(this.dom, ['Capability', 'Request']); 
     97        var reqs = this._getRequestsFromNode(standardReqs); 
     98        var extendedReqs = WMSC.traverseWMSDom(this.dom, ['Capability', '_ExtendedCapabilities', 'Request']); 
     99        reqs = reqs.concat(this._getRequestsFromNode(extendedReqs)); 
     100        return reqs; 
     101    }, 
     102     
     103    _getRequestsFromNode: function(node) { 
     104        var reqs = []; 
     105        for (var i=0; i<node.childNodes.length; i++) { 
     106            var child = node.childNodes[i]; 
     107            if (child.nodeType != 1) { 
     108                continue; 
     109            } 
     110            var name = child.nodeName; 
     111            var formats = this._getRequestFormats(child); 
     112            var req = new WMSC.Request(name, formats); 
     113            reqs.push(req); 
     114        } 
     115        return reqs; 
     116    }, 
     117     
     118    _getRequestFormats: function(node) { 
     119        var formats = []; 
     120        for (var i=0; i<node.childNodes.length; i++) { 
     121            var child = node.childNodes[i]; 
     122             
     123            if (child.nodeName.toUpperCase() == 'FORMAT') { 
     124                formats.push(child.textContent); 
     125            } 
     126        }  
     127        return formats; 
     128    }, 
     129     
     130    getRequest: function(name) { 
     131        var reqs = this.getAllRequests(); 
     132        for (var i=0;i<reqs.length;i++) { 
     133            if (reqs[i].name == name) { 
     134                return reqs[i]; 
     135            } 
     136        } 
     137        return null; 
     138    }, 
     139     
     140    supportsRequest: function(name) { 
     141        return this.getRequest(name) != null; 
     142    }, 
    95143}; 
    96144 
     
    288336}; 
    289337 
     338 
     339WMSC.Request = function(name, formats) { 
     340    this.name = name; 
     341    this.formats = formats; 
     342}; 
     343 
    290344/** 
    291345 * Class to wrapper a WebMapContext document and expose 
  • cowsclient/branches/qesdi/cowsclient/public/js/layerInformation.js

    r5575 r5624  
    2828    this.currentOLLayer = null; 
    2929     
     30    this._hiddenInputContainer = null; 
    3031    this._selectHandler = null; 
     32    this._getFigureHandler = null; 
     33    this._getFigureButton = null; 
    3134    this._styleSelect = null; 
     35     
     36    this._currentSelection =  new OpenLayers.Bounds(-180,-90,180,90); 
    3237} 
    3338 
    3439LayerInfo.prototype = { 
    35         EVENTS_RAISED: ['LAYER_STYLE_CHANGED'], 
    36          
    37         /** 
    38          * Adds the handler for the CURRENT_LAYER_CHANGED event 
    39          */ 
    40         addCurrentWMCLayerChangedHandlers: function(events) { 
    41             events.register('CURRENT_WMCLAYER_CHANGED', this, this._onCurrentLayerChanged); 
    42         }, 
    43  
    44          
    45         _onStyleChange: function(e) { 
    46             this.events.triggerEvent('LAYER_STYLE_CHANGED', {param:'styles', 
    47                                                              value:e.target.value}); 
    48         }, 
    49          
    50          /** 
    51           * handler for the current layer changed event 
    52           */ 
    53         _onCurrentLayerChanged: function(e) { 
     40    EVENTS_RAISED: ['LAYER_STYLE_CHANGED'], 
     41     
     42    /** 
     43     * Adds the handler for the CURRENT_LAYER_CHANGED event 
     44     */ 
     45    addCurrentWMCLayerChangedHandlers: function(events) { 
     46        events.register('CURRENT_WMCLAYER_CHANGED', this, this._onCurrentLayerChanged); 
     47    }, 
     48 
     49     
     50    _onStyleChange: function(e) { 
     51        this.events.triggerEvent('LAYER_STYLE_CHANGED', {param:'styles', 
     52                                                         value:e.target.value}); 
     53    }, 
     54     
     55     /** 
     56      * handler for the current layer changed event 
     57      */ 
     58    _onCurrentLayerChanged: function(e) { 
     59         
     60        this._clearForm(); 
     61         
     62        if (e.wmcLayer != null && e.olLayer != null) { 
     63            this._buildInfo(e.wmcLayer, e.olLayer, e.wmc); 
     64        } 
     65         
     66        this.currentOLLayer = e.olLayer; 
     67        this.currentWMCLayer = e.wmcLayer; 
     68    }, 
     69     
     70    /** 
     71     * Rebuilds all of the display option controls given by the layer 
     72     */ 
     73    _buildInfo: function(wmcLayer, olLayer, wmc) { 
     74         
     75        var fs = document.createElement('fieldset'); 
     76        var leg = document.createElement('legend'); 
     77        leg.innerHTML = 'Layer Information'; 
     78        fs.appendChild(leg); 
     79                     
     80        fs.appendChild(this._buildInfoItem('URL', olLayer.url)); 
     81        fs.appendChild(this._buildInfoItem('Layer Name', this._getLayerProperty(olLayer, 'layers'))); 
     82        fs.appendChild(this._buildInfoItem('Layer Abstract', wmcLayer.getAbstract())); 
     83         
     84        var styles = wmcLayer.getStyles(); 
     85         
     86        if (styles.length > 0) { 
     87            var currentStyle = this._getLayerProperty(olLayer, 'styles'); 
     88            fs.appendChild(this._buildStyleSelect(styles, currentStyle)); 
     89            fs.appendChild(document.createTextNode("\n")); 
     90        } 
     91         
     92        if (wmc.supportsRequest('GetFigure')) { 
     93            fs.appendChild(this._buildGetFigureButton(wmc)); 
     94            fs.appendChild(document.createTextNode("\n")); 
     95        } 
     96 
     97        this._hiddenInputContainer = document.createElement('div'); 
     98        fs.appendChild(this._hiddenInputContainer); 
     99          
     100        this._form.appendChild(fs); 
     101         
     102    }, 
     103 
     104    _buildStyleSelect: function(styles, currentStyle) { 
     105         
     106        var values = []; 
     107        var descriptions = []; 
     108         
     109        for (var i=0;i<styles.length; i++) { 
     110            values.push(styles[i].name); 
     111            descriptions.push(styles[i].title); 
     112        } 
     113         
     114        this._styleSelect = buildSelectBox('styles', descriptions, values, currentStyle); 
     115         
     116        this._selectHandler = addHTMLEventListener(this._styleSelect, 'change', this._onStyleChange, this); 
     117         
     118        return buildLabelInputDiv('Style', this._styleSelect, 'layerInfoItem'); 
     119    }, 
     120     
     121    _clearForm: function(){ 
     122         
     123        // remove the event handler before deleting the element 
     124        if (this._styleSelect != null && this._selectHandler != null) { 
     125            removeHTMLEventListener(this._styleSelect, 'change', this._selectHandler); 
     126        } 
     127         
     128        // remove the get figure event handler 
     129        if (this._getFigureButton != null && this._getFigureHandler != null) { 
     130            removeHTMLEventListener(this._getFigureButton, 'click', this._getFigureHandler); 
     131        } 
     132         
     133        this._form.innerHTML = ""; 
     134         
     135        this._styleSelect = null; 
     136        this._selectHandler = null; 
     137        this._getFigureButton = null; 
     138        this._getFigureHandler = null; 
     139        this._hiddenInputContainer = null; 
     140    }, 
     141     
     142    _getLayerProperty: function(olLayer, id) { 
     143        var val = null; 
     144         
     145        if (olLayer != null) { 
     146            val = olLayer.params[id.toUpperCase()]; 
     147        } 
     148         
     149        return val; 
     150    }, 
     151     
     152    _buildInfoItem: function(name, value) { 
     153        var span = document.createElement('span'); 
     154        span.innerHTML = value; 
     155         
     156        return buildLabelInputDiv(name, span, 'layerInfoItem'); 
     157         
     158    }, 
     159     
     160    _buildGetFigureButton: function(wmc) { 
     161        var div = document.createElement('div'); 
     162         
     163        var req = wmc.getRequest('GetFigure'); 
     164         
     165        var formatDescriptions= []; 
     166        var formatValues = []; 
     167        var formatList = req.formats; 
     168                           
     169        for (var i=0;i<formatList.length;i++) { 
    54170             
    55             this._clearForm(); 
     171            formatValues.push(formatList[i]); 
    56172             
    57             if (e.wmcLayer != null && e.olLayer != null) { 
    58                 this._buildInfo(e.wmcLayer, e.olLayer); 
    59             } 
    60         }, 
    61          
    62         /** 
    63          * Rebuilds all of the display option controls given by the layer 
    64          */ 
    65         _buildInfo: function(wmcLayer, olLayer) { 
    66              
    67             var fs = document.createElement('fieldset'); 
    68             var leg = document.createElement('legend'); 
    69             leg.innerHTML = 'Layer Information'; 
    70             fs.appendChild(leg); 
    71                          
    72             fs.appendChild(this._buildInfoItem('URL', olLayer.url)); 
    73             fs.appendChild(this._buildInfoItem('Layer Name', this._getLayerProperty(olLayer, 'layers'))); 
    74             fs.appendChild(this._buildInfoItem('Layer Abstract', wmcLayer.getAbstract())); 
    75              
    76              
    77              
    78             var styles = wmcLayer.getStyles(); 
    79              
    80             if (styles.length > 0) { 
    81                 var currentStyle = this._getLayerProperty(olLayer, 'styles'); 
    82                 fs.appendChild(this._buildStyleSelect(styles, currentStyle)); 
    83             } 
    84              
    85             this._form.appendChild(fs); 
    86              
    87         }, 
    88  
    89         _buildStyleSelect: function(styles, currentStyle) { 
    90              
    91             var values = []; 
    92             var descriptions = []; 
    93              
    94             for (var i=0;i<styles.length; i++) { 
    95                 values.push(styles[i].name); 
    96                 descriptions.push(styles[i].title); 
    97             } 
    98              
    99             this._styleSelect = buildSelectBox('styles', descriptions, values, currentStyle); 
    100              
    101             this._selectHandler = addHTMLEventListener(this._styleSelect, 'change', this._onStyleChange, this); 
    102              
    103             return buildLabelInputDiv('Style', this._styleSelect, 'layerInfoItem'); 
    104         }, 
    105          
    106         _clearForm: function(){ 
    107              
    108             // remove the event handler before deleting the element 
    109             if (this._styleSelect != null && this._selectHandler != null) { 
    110                 removeHTMLEventListener(this._styleSelect, 'change', this._selectHandler); 
    111             } 
    112              
    113             this._form.innerHTML = ""; 
    114         }, 
    115          
    116         _getLayerProperty: function(olLayer, id) { 
    117             var val = null; 
    118              
    119             if (olLayer != null) { 
    120                 val = olLayer.params[id.toUpperCase()]; 
    121             } 
    122              
    123             return val; 
    124         }, 
    125          
    126         _buildInfoItem: function(name, value) { 
    127             var span = document.createElement('span'); 
    128             span.innerHTML = value; 
    129              
    130             return buildLabelInputDiv(name, span, 'layerInfoItem'); 
    131              
    132         }, 
    133          
     173            if (formatList[i].indexOf('image/') == 0) { 
     174                formatDescriptions.push(formatList[i].slice(6, formatList[i].length).toUpperCase()); 
     175            } 
     176            else { 
     177                formatDescriptions.push(formatList[i]); 
     178            } 
     179        } 
     180         
     181        var inputs = buildSelect(null, 'format', formatDescriptions, formatValues); 
     182        div.appendChild(inputs); 
     183         
     184        this._getFigureButton = document.createElement('input'); 
     185        this._getFigureButton .type = 'button'; 
     186        this._getFigureButton .value = "Get Figure"; 
     187         
     188        this._getFigureHandler = addHTMLEventListener(this._getFigureButton,  
     189                                     'click', this._onGetFigureClick, this); 
     190         
     191        WMSC.log("this._getFigureHandler = " + this._getFigureHandler); 
     192        div.appendChild(this._getFigureButton); 
     193        return div; 
     194    }, 
     195     
     196    _onGetFigureClick: function(e) { 
     197        WMSC.log("_onGetFigureClick running"); 
     198        this._addHiddenInputItems(); 
     199         
     200        this._form.action=this.currentOLLayer.url;  
     201        this._form.method="get";  
     202        this._form.target="_blank"; 
     203        this._form.submit(); 
     204    }, 
     205     
     206    _addHiddenInputItems: function() { 
     207         
     208        // clear any old hidden inputs 
     209        this._hiddenInputContainer.innerHTML = ""; 
     210         
     211        for (var p in this.currentOLLayer.params) { 
     212            if (p.toUpperCase() == 'REQUEST') { 
     213                this._hiddenInputContainer.appendChild(buildHiddenInputElement('REQUEST', 'GetFigure')); 
     214            } 
     215            else if (p.toUpperCase() == 'FORMAT') { 
     216                //ignore the format parameter 
     217            } 
     218            else { 
     219                this._hiddenInputContainer.appendChild(buildHiddenInputElement(p, layer.params[p])); 
     220            } 
     221        } 
     222         
     223        var bboxString = this._currentSelection.left + "," + this._currentSelection.bottom + "," + this._currentSelection.right+ "," + this._currentSelection.top; 
     224         
     225        this._hiddenInputContainer.appendChild(buildHiddenInputElement('BBOX', bboxString)); 
     226        this._hiddenInputContainer.appendChild(buildHiddenInputElement('WIDTH', '1200')); 
     227        this._hiddenInputContainer.appendChild(buildHiddenInputElement('HEIGHT', '900')); 
     228    }, 
     229    
     230    addMapSelectionChangedHandlers: function(events) { 
     231        events.register('MAP_SELECTION_CHANGED', this, this.onChangeSelection); 
     232    }, 
     233     
     234    onChangeSelection: function(e) { 
     235        this._currentSelection = e.selection; 
     236    }, 
     237     
    134238} 
  • cowsclient/branches/qesdi/cowsclient/public/js/layerParameters.js

    r5563 r5624  
    7979         
    8080        if (e.layer == null) { 
    81             this.events.triggerEvent('CURRENT_WMCLAYER_CHANGED', {olLayer:null, 
     81            this.events.triggerEvent('CURRENT_WMCLAYER_CHANGED', {wmc:null, 
     82                                                                  olLayer:null, 
    8283                                                                  wmcLayer:null}); 
    8384        } else { 
     
    115116        var wmcLayer = this.searchSubLayers(wmc.getSubLayers()); 
    116117        this.currentWMCLayer = wmcLayer; 
    117         this.events.triggerEvent('CURRENT_WMCLAYER_CHANGED', {olLayer:this.currentOLLayer, 
     118        this.events.triggerEvent('CURRENT_WMCLAYER_CHANGED', {wmc:wmc, 
     119                                                              olLayer:this.currentOLLayer, 
    118120                                                              wmcLayer:this.currentWMCLayer}) 
    119121    }, 
  • cowsclient/branches/qesdi/cowsclient/public/js/utils.js

    r5534 r5624  
    3030 
    3131buildSelectBox = function(id, descritptions, values, defaultVal) { 
     32    return buildSelect(id, 'select_' + id, descritptions, values, defaultVal); 
     33} 
     34 
     35buildSelect = function(id, name, descritptions, values, defaultVal) { 
    3236    var select = document.createElement('select'); 
    33     select.name = id; 
    34     select.id = 'select_' + id 
     37    if (name != null) { 
     38        select.name = name; 
     39    } 
     40     
     41    if (id != null) { 
     42        select.id =  id; 
     43    } 
    3544     
    3645    for(var i=0; i<values.length; i++) { 
     
    5261    }      
    5362     
    54     return select; 
     63    return select;   
    5564} 
    56  
    5765 
    5866buildLabelInputDiv = function(labelText, inputElement, divClass, labelClass) { 
     
    119127    return array; 
    120128} 
     129 
     130buildHiddenInputElement = function(name, value) { 
     131    var input = document.createElement('input'); 
     132    input.type = "hidden"; 
     133    input.name = name; 
     134    input.value = value; 
     135    return input; 
     136}; 
  • cowsclient/branches/qesdi/cowsclient/public/layout/layer_properties.css

    r5534 r5624  
    22   Style for the layer properties panel content. 
    33*/ 
     4#layer_properties div form { 
     5        margin-bottom:2px; 
     6} 
    47 
    58#layer_info_container { 
  • cowsclient/branches/qesdi/cowsclient/public/layout/open_layers_map.css

    r5578 r5624  
    11div#map { 
    22  width: 640px; 
    3   height: 320px; 
     3  height: 300px; 
    44  background-color: white; 
    55  margin: 1px; 
     
    88 
    99div#mapBox { 
    10   margin-bottom: 1em; 
     10  margin-bottom: 0em; 
    1111} 
    1212 
  • cowsclient/branches/qesdi/cowsclient/public/test/capabilities_test.html

    r5534 r5624  
    6161        s += "Title = " + wmc.getTitle() +"\n"; 
    6262        s += "Root layer = " + wmc.getRootLayer() + "\n"; 
     63        s += "Requests = " + wmc.getAllRequests() + "\n"; 
    6364        s += "num sub layers = " + wmc.getSubLayers().length + "\n"; 
    6465 
  • cowsclient/branches/qesdi/cowsclient/templates/wmsviz.html

    r5578 r5624  
    77<link type="text/css" rel="stylesheet" href="$g.server/layout/ddc_vis.css"/> 
    88<link type="text/css" rel="stylesheet" href="$g.server/layout/ndg2.css"/> 
     9<link type="text/css" rel="stylesheet" href="$g.server/layout/temp_fix.css"/> 
    910 
    1011<link type="text/css" rel="stylesheet" href="$g.server/layout/open_layers_map.css"/> 
     
    129130 
    130131    figBuilder.addLayerOrderChangedHandlers(layerList.events);     
     132     
    131133    layerList.addSelectorHandlers(layerControl.events); 
    132134    layerParameters.addLayerListHandlers(layerList.events); 
     
    137139    boundsControl.addMapSelectionChanged(app.events) 
    138140    figBuilder.addMapSelectionChangedHandlers(app.events); 
     141    layerParameters.layerInfo.addMapSelectionChangedHandlers(app.events); 
    139142     
    140143    app.addLayersHandlers(layerList.events); 
     
    228231                <b>Download Data for this Selection</b> 
    229232                    <div id="wcsdownloadDiv"></div> 
    230               </div> 
     233                    <br/> 
     234                    <form id="figureForm" action="$g.server/wmsviz/get_figure" method="get" target="_blank"> 
     235                      <!--  <b>Plot type</b><br/> 
     236                      <input type="radio" name="figType" value="colour" checked="1"/>Colour<br/> 
     237                      <input type="radio" name="figType" value="bw"/>B/W Contour<br/> --> 
     238                      <b>Generate Figure</b><br/> 
     239                      <select name="figFormat"> 
     240                        <option value="image/png" name="figFormat" selected="1"> PNG </option> 
     241                        <option value="image/jpeg" name="figFormat"> JPEG </option> 
     242                        <option value="image/gif" name="figFormat"> GIF </option> 
     243                        <option value="application/postscript" name="figFormat"> EPS </option> 
     244                        <option value="image/svg+xml" name="figFormat"> SVG </option> 
     245                      </select> 
     246                      <input type="button" value="Make Figure" id="make_figure_btn"/> 
     247                    </form> 
     248                     
     249            </div> 
    231250             
    232251             
    233             <form id="figureForm" action="$g.server/wmsviz/get_figure" method="get" target="_blank"> 
    234               <b>Plot type</b><br/> 
    235               <input type="radio" name="figType" value="colour" checked="1"/>Colour<br/> 
    236               <input type="radio" name="figType" value="bw"/>B/W Contour<br/> 
    237               <b>Format</b><br/> 
    238               <select name="figFormat"> 
    239                 <option value="image/png" name="figFormat" selected="1"> PNG </option> 
    240                 <option value="image/jpeg" name="figFormat"> JPEG </option> 
    241                 <option value="application/postscript" name="figFormat"> EPS </option> 
    242                 <option value="image/svg+xml" name="figFormat"> SVG </option> 
    243               </select> 
    244               <input type="button" value="Make Figure" id="make_figure_btn"/> 
    245             </form> 
    246252             
    247253            </td> 
Note: See TracChangeset for help on using the changeset viewer.