Changeset 6013 for cowsclient


Ignore:
Timestamp:
16/11/09 11:33:11 (10 years ago)
Author:
pnorton
Message:

Moved all the server side config file parsing into a single config_file_parser module.

Also modified how the Endpoint selection works on the UI. The endpoint dropdown is now it's own control allowing its complexity to be hidden form the layerControl.

Location:
cowsclient/trunk
Files:
6 added
3 deleted
12 edited

Legend:

Unmodified
Added
Removed
  • cowsclient/trunk/cowsclient/controllers/wmsviz.py

    r5999 r6013  
    2222from cowsclient.model import selectedItem 
    2323from cowsclient.lib.base import BaseController, g, response, config, request, c, session, render, abort 
    24 from cowsclient.lib.wmc_util import GetWebMapContext, GetWebMapCapabilities, GetLegend, openURL, GetResponse 
     24from cowsclient.lib.wmc_util import GetWebMapContext, GetWebMapCapabilities, GetLegend, openURL, GetResponse, parseEndpointString 
    2525from cowsclient.lib.build_figure import build_figure 
    2626from cowsclient.lib.status_builder import StatusBuilder 
     
    9898        g.server=config['app_conf']['serverurl'] 
    9999     
    100      
    101          
    102100        statusBuilder = StatusBuilder() 
    103101         
     
    121119            for endpoint in initialSetup: 
    122120                urlstring=endpoint['url']+'?request=GetCapabilities&Service=WMS' 
     121                urlstring = parseEndpointString(endpoint['url'],  
     122                                {'REQUEST':'GetCapabilities', 'SERVICE':'WMS'}) 
    123123                #urlstring=str(self.inputs['ENDPOINT']) 
    124124                req = urllib2.Request(urlstring) 
  • cowsclient/trunk/cowsclient/lib/status_builder.py

    r5999 r6013  
    55''' 
    66 
    7 from cowsclient.lib.display_options_config import getDisplayOptionsConfig 
    8 from cowsclient.lib.base import config 
    97import cowsclient.lib.utils as utils 
    10 from cowsclient.lib.further_info_config_parser import FurtherInfoConfigParser 
     8import cowsclient.lib.config_file_parser as config_file_parser 
     9import logging 
     10 
     11log = logging.getLogger(__name__) 
    1112 
    1213class StatusBuilder(object): 
     
    2122        Constructor 
    2223        ''' 
    23         self.fiparser = FurtherInfoConfigParser(config.get('furtherInfo',None)) 
     24        self.fiparser = config_file_parser.FurtherInfoConfigParser() 
     25        self.displayOptionsParser = config_file_parser.DisplayOptionsConfigParser() 
    2426     
    2527     
    26     def getCurrentStatus(self, sectionName=None): 
     28    def getCurrentStatus(self, page=None): 
    2729         
    2830        status = {} 
     
    3638        status['OutlineSettings'] = self._getOutlineSettings() 
    3739         
    38         status['FurtherInfoLinks'] = self._getFurtherInfoLinks(sectionName) 
     40        status['FurtherInfoLinks'] = self._getFurtherInfoLinks(page) 
    3941     
    4042        return status 
     
    4244     
    4345    def _getWMSEndpointList(self): 
    44         return utils.readEndpoints().get('WMS',None) 
     46         
     47        econfig = config_file_parser.EndpointConfigFileParser() 
     48         
     49        endpointList = econfig.buildEndpointList('wmsviz') 
     50        log.debug("endpointList = %s" % (endpointList,)) 
     51        wmsList = [] 
     52         
     53        if endpointList is not None: 
     54            for e in endpointList: 
     55                if e['service'] == 'COWS': 
     56                    try: 
     57                        for linkName, linkDict in utils.parseCowsCatalog(e['url']): 
     58                            if 'WMS' in linkDict.keys(): 
     59                                wmsList.append( 
     60                                    {'service':'WMS',  
     61                                     'url':linkDict['WMS'],  
     62                                     'name':linkName} 
     63                                ) 
     64                    except: 
     65                        log.exception("An error occurred while reading cows catalog at %s"\ 
     66                                      % (e['url'],)) 
     67                             
     68                elif e['service'] == 'WMS': 
     69                    wmsList.append(e) 
     70                 
     71        return wmsList 
    4572     
    4673    def _getHiddenDisplayOptions(self): 
    47         displayOptsConfig = getDisplayOptionsConfig() 
    48          
    49         if 'HideOptions' in displayOptsConfig: 
    50             return displayOptsConfig['HideOptions'] 
    51          
    52         return None 
     74        return self.displayOptionsParser.getHideOptions('wmsviz') 
    5375 
    5476    def _getDefaultParams(self): 
    55         displayOptsConfig = getDisplayOptionsConfig() 
    56          
    57         if 'DefaultOptions' in displayOptsConfig: 
    58             return displayOptsConfig['DefaultOptions'] 
    59          
    60         return None 
     77        return self.displayOptionsParser.getDefaultOptions('wmsviz')         
    6178 
    6279    def _getOutlineSettings(self): 
    6380         
    64         params = {} 
    65         for paramString in config['baselayer.params'].split(','): 
    66             key, value = paramString.split(':') 
    67             params[key] = value 
     81        outlineConfigParser = config_file_parser.OutlineLayersConfigParser() 
    6882         
    69         baseLayerSettings = {"url":config['baselayer.url'], "params": params } 
    70          
    71         return baseLayerSettings 
    72      
     83        return outlineConfigParser.getOutlineLayer('wmsviz') 
     84#     
    7385    def _getFurtherInfoLinks(self, sectionName): 
    74         return self.fiparser.buildFurtherInfoList('wmsviz') 
     86        return self.fiparser.getFurtherInfoItems('wmsviz') 
    7587     
    7688""" 
  • cowsclient/trunk/cowsclient/lib/utils.py

    r5837 r6013  
    88import simplejson as json 
    99from HTMLParser import HTMLParser 
     10import libxml2dom 
    1011 
    1112log = logging.getLogger(__name__) 
     
    3637            for cowsEndpoint in endpoints['COWS']: 
    3738                try: 
    38                     req = urllib2.Request(cowsEndpoint) 
    39                     fh = openURL(req) 
    4039                     
    41                     lf = _MyHTMLLinkFinder(cowsEndpoint) 
    42                     lf.feed(fh.read()) 
     40                    for linkName, linkDict in parseCowsCatalog(cowsEndpoint): 
    4341                     
    44                     #grab the WMS and WCS links and add them to the dictionary 
    45                     for link in lf.links: 
    46                         if link.lower().find('service=wms') > 0: 
    47                             endpoints['WMS'].append(link) 
    48                         elif link.lower().find('service=wcs') > 0: 
    49                             endpoints['WCS'].append(link) 
     42                        #grab the WMS and WCS links and add them to the dictionary 
     43                        if 'WMS' in linkDict.keys(): 
     44                            endpoints['WMS'].append(linkDict['WMS']) 
     45                        elif 'WCS' in linkDict.keys(): 
     46                            endpoints['WMS'].append(linkDict['WCS']) 
    5047                except: 
    5148                    log.exception("Exception occurred reading enpoints from %s" % (cowsEndpoint,)) 
     
    7471            return os.path.join(self.baseURL, href) 
    7572 
     73 
     74def parseCowsCatalog(cowsEndpoint): 
     75    req = urllib2.Request(cowsEndpoint) 
     76    fh = openURL(req) 
     77    htmlString = fh.read() 
     78    fh.close() 
     79     
     80    doc = libxml2dom.parseString(htmlString, html=1) 
     81     
     82    COWSLinks = [] 
     83     
     84    for liElt in doc.getElementsByTagName("li"): 
     85     
     86        childText = "" 
     87        links = {} 
     88     
     89        for c in liElt.childNodes: 
     90     
     91            # get the name by adding together all the text elements and then 
     92            # stripping whitespace and []. 
     93            if c.nodeType == 3: 
     94                childText += c.nodeValue 
     95     
     96            # build a dictionary of the links with their ascociated text 
     97            elif c.nodeName == 'a' and c.hasAttribute('href'): 
     98                liknName = str(''.join(c.textContent.split())) # removing whitespace and converting from unicode 
     99                 
     100                # remove leading '/' as it confuses os.path.join 
     101                href = c.getAttribute('href') 
     102                if href[0] == '/': 
     103                    href = href[1:] 
     104                     
     105                linkTarget =  os.path.join(cowsEndpoint, href) 
     106                links[liknName] = str(linkTarget) 
     107     
     108        childText = ''.join(childText.split()) # strip the whitespace 
     109        childText = str(childText.replace('[]','')) # remove any angle brackets 
     110     
     111        COWSLinks.append((childText, links)) 
     112     
     113    return COWSLinks 
     114 
    76115def toJSON(obj): 
    77116    return json.dumps(obj).replace('"', '\\"') 
  • cowsclient/trunk/cowsclient/public/js/layerControl.js

    r5878 r6013  
    3535     *     NB, this control must include a method, updateDomainDiv(OpenLayers.Bounds) 
    3636     */ 
    37     initialize: function (treeDiv, layerDiv, wmcRetriever, newEndpointInputId, addNewEndpointBtnId, defaultOptionsList, eventsManager)  
     37    initialize: function (treeDiv, layerDiv, wmcRetriever, newEndpointInputId, addNewEndpointBtnId, defaultOptionsList, eventsManager, furtherInfoLinks)  
    3838    { 
    3939        WMSC.log("Initialising Control"); 
     
    4545        this.endpointInputBox = $(newEndpointInputId); 
    4646        this.addNewEndpointBtn = $(addNewEndpointBtnId); 
    47         this.addNewEndpointBtn.onclick = this.onNewEndpointClick.bindAsEventListener(this); 
     47         
     48        if (this.addNewEndpointBtn !== null) { 
     49            this.addNewEndpointBtn.onclick = this.onNewEndpointClick.bindAsEventListener(this); 
     50        } 
    4851         
    4952        this.eventsManager = eventsManager; 
     53        this.furtherInfoLinks = furtherInfoLinks; 
    5054 
    5155        this._selectedTreeNode = null; 
     
    8387        this._delIconHandlers = {}; 
    8488         
     89        this.eventsManager.register('NEW_ENDPOINT', this, this.onNewEndpoint); 
     90         
    8591    }, 
    8692     
     
    109115                        'click', this._removeNode, this);                 
    110116            } 
     117        } 
     118         
     119        var infoNodes = document.getElementsByClassName('nodeInfo'); 
     120        for (var i = 0; i < infoNodes.length; i++) { 
     121            Utils.addHTMLEventListener(infoNodes[i], 'click', this._onInfoNodeClick, this) 
    111122        } 
    112123    }, 
     
    226237         
    227238        var nodeData = {}; 
    228         var labelText = wmc.getTitle() + " (" + wmcEndpoint + ")"; 
    229  
     239        var labelText = wmc.getTitle();// + " (" + wmcEndpoint + ")"; 
     240 
     241        var matchingInfoLinks = []; 
     242         
     243        if (this.furtherInfoLinks !== null) { 
     244            for (i = 0; i < this.furtherInfoLinks.length; i++) { 
     245                var link = this.furtherInfoLinks[i]; 
     246                 
     247                if (link.match(wmcEndpoint)) { 
     248                    matchingInfoLinks.push(link); 
     249                } 
     250            } 
     251        } 
     252         
     253         
    230254        nodeData.label = labelText; 
    231255        nodeData.layer = wmc.getTitle(); 
     
    235259        var wmcTreeNode = new YAHOO.widget.MenuNode(nodeData, this.tree.getRoot(), false); 
    236260         
    237         wmcTreeNode.label = this._createNodeLabel(labelText, wmcTreeNode.index); 
     261        wmcTreeNode.label = this._createNodeLabel(labelText, wmcTreeNode.index, matchingInfoLinks); 
    238262         
    239263        // add in the child nodes 
     
    289313     * @param nodeIndex - index in tree of label - used to identify the delete event 
    290314     */ 
    291     _createNodeLabel: function (nodeLabel, nodeIndex) 
    292     { 
    293         return '<table><tr><td class="nodeTitle">' +  
     315    _createNodeLabel: function (nodeLabel, nodeIndex, infoLinks) 
     316    { 
     317         
     318        if (infoLinks === undefined || infoLinks.length == 0) { 
     319            return '<table><tr><td class="nodeTitle">' +  
    294320                nodeLabel + '</td><td class="delIcon">' + 
    295321                '<img id="delIcon_' + nodeIndex + '" src="js/img/close.gif" /></td></tr></table>'; 
     322        } 
     323        else { 
     324             
     325            var nodeInfo = ''; 
     326             
     327            for (i = 0; i < infoLinks.length; i++) { 
     328                var link = infoLinks[i]; 
     329                nodeInfo += '<td class="nodeInfo">' + link.getHTML() + '</td>'; 
     330            } 
     331             
     332            return '<table><tr><td class="nodeTitle">' +  
     333            nodeLabel + '</td>'+ nodeInfo+'<td class="delIcon">' + 
     334            '<img id="delIcon_' + nodeIndex + '" src="js/img/close.gif" /></td></tr></table>'; 
     335        } 
    296336    }, 
    297337      
     
    442482    }, 
    443483     
     484    onNewEndpoint: function (e) { 
     485        this.addWebMapContext(e.url); 
     486    }, 
     487     
    444488    /** 
    445489     * Adds a layer to select on a particular endpoint when that endpoint is  
     
    509553        } 
    510554        return null; 
     555    }, 
     556     
     557     
     558    /** 
     559     * This is needed to stop the event from triggering the treeview, any 
     560     * links found in the info node should still be triggered.  
     561     */ 
     562    _onInfoNodeClick: function (e) { 
     563        if (!e) var e = window.event; 
     564        e.cancelBubble = true; 
     565        if (e.stopPropagation) e.stopPropagation(); 
     566 
     567        return false; 
    511568    } 
    512      
    513569}; 
    514570 
  • cowsclient/trunk/cowsclient/public/js/utils.js

    r5999 r6013  
    585585    var retList = []; 
    586586     
    587     for (i = 0; i < objList.length; i++) { 
    588         retList.push(new klass(objList[i])); 
     587    if (objList !== null) { 
     588        for (i = 0; i < objList.length; i++) { 
     589            retList.push(new klass(objList[i])); 
     590        } 
    589591    } 
    590592     
  • cowsclient/trunk/cowsclient/public/layout/wmsviz.css

    r5818 r6013  
    44    border: 0; 
    55}  
     6 
     7.delIcon { 
     8        width:15px; 
     9} 
     10 
     11.nodeInfo { 
     12    width:80px; 
     13} 
     14 
     15#layerTree table table { 
     16        width: 100%; 
     17} 
  • cowsclient/trunk/cowsclient/templates/wmsviz.html

    r5999 r6013  
    2020<link type="text/css" rel="stylesheet" href="$g.server/layout/ddc_style.css"/> 
    2121<link type="text/css" rel="stylesheet" href="$g.server/layout/ddc_vis.css"/> 
    22 <link type="text/css" rel="stylesheet" href="$g.server/layout/temp_fix.css"/> 
     22<link type="text/css" rel="stylesheet" href="$g.server/layout/wmsviz.css"/> 
    2323<link type="text/css" rel="stylesheet" href="$g.server/layout/open_layers_map.css"/> 
    2424 
     
    107107<script type="text/javascript" src="$g.server/js/wcs.js"></script> 
    108108 
     109<!-- status objects --> 
     110<script type="text/javascript" src="$g.server/js/endpoint.js"></script> 
    109111<script type="text/javascript" src="$g.server/js/furtherInfoLink.js"></script> 
     112 
    110113<script type="text/javascript" src="$g.server/js/displayOptionsRetriever.js"></script> 
    111114<script type="text/javascript" src="$g.server/js/json2.js"></script> 
     
    126129<script type="text/javascript" src="$g.server/js/splitAxisSelect.js"></script> 
    127130 
     131<script type="text/javascript" src="$g.server/js/endpointSelection.js"></script> 
     132 
    128133<script type="text/javascript" src="$g.server/js/ajaxRetriever.js"></script> 
    129134<script type="text/javascript" src="$g.server/js/axisConfigRetriever.js"></script> 
     
    169174        var initialBounds = new OpenLayers.Bounds(-180,-90,180,90); 
    170175 
    171  
    172176    var makeFigureURL = "$g.server/wmsviz/get_figure"; 
    173177     
     
    175179 
    176180    var furtherInfoLinks = Utils.buildObjectList(FurtherInfoLink, initialStatus['FurtherInfoLinks']); 
     181    var endpointList     = Utils.buildObjectList(Endpoint, initialStatus['WMSEndpointsList']); 
    177182 
    178183    allEvents = allEvents.concat(LayerList.prototype.EVENTS_RAISED, 
     
    181186                                 WMSC.VisApp.prototype.EVENT_TYPES, 
    182187                                 WMSC.BoundsControl.prototype.EVENT_TYPES, 
     188                                 EndpointSelection.prototype.EVENT_TYPES, 
    183189                                 OutlineControl.prototype.EVENT_TYPES); 
    184190 
     
    197203         
    198204    var outlineControl = new OutlineControl('add_outline', eventsManager, initialStatus.OutlineSettings); 
    199     var boundsControl = new WMSC.BoundsControl('dims', initialBounds, eventsManager); 
    200     var layerControl = new WMSC.VisAppLayers('layerTree', 'layerLeaves',wmcRetriever, 'new_endpoint', 'add_new_endpoint', initialStatus.DefaultLayerParms, eventsManager);   
     205    var boundsControl  = new WMSC.BoundsControl('dims', initialBounds, eventsManager); 
     206    var layerControl   = new WMSC.VisAppLayers('layerTree', 'layerLeaves',wmcRetriever, 'new_endpoint', 'add_new_endpoint', initialStatus.DefaultLayerParms, eventsManager, furtherInfoLinks);   
    201207    app = new WMSC.VisApp('map', 10, 640, true, initialBounds, eventsManager); 
    202208 
     
    216222 
    217223    // build endpoint autocomplete 
    218     Utils.makeCombobox("new_endpoint", "endpoint_toggle", "endpoint_options", initialStatus.WMSEndpointsList); 
     224    //Utils.makeCombobox("new_endpoint", "endpoint_toggle", "endpoint_options", initialStatus.WMSEndpointsList); 
     225 
     226     
     227    var endpointSelect = new EndpointSelection('endpoint_select', endpointList, eventsManager);  
    219228     
    220229} 
     
    341350                    <span py:replace="helpIcon('endpoint_help', 'div')"> </span>  
    342351                     
    343                     <div id="endpoint_autocomplete" style="display:inline;"> 
     352                    <div id="endpoint_select"></div> 
     353                     
     354                    <!-- div id="endpoint_autocomplete" style="display:inline;"> 
    344355                        <input id="new_endpoint" type="text" ></input> <span id="endpoint_toggle"></span> 
    345356                        <div id="endpoint_options"></div> 
    346                     </div > 
    347                      
    348                     <input type="button" id="add_new_endpoint" value="Add"/> 
     357                        <input type="button" id="add_new_endpoint" value="Add"/> 
     358                    </div --> 
     359                     
    349360                </div> 
    350361                 
     
    358369                                 No datasets loaded. 
    359370                        </div> 
     371                 
     372                 
     373                 
    360374                <input type="button" id="add_outline" value="Add Outline Layer"/> 
    361375                        </td> 
  • cowsclient/trunk/development.ini

    r5999 r6013  
    2424serverurl=http://localhost:5005 
    2525 
    26 baselayer.url = http://labs.metacarta.com/wms/vmap0 
    27 baselayer.params = layers:coastline_01,format:image/png 
    28  
    29 download_baselayer.url = http://labs.metacarta.com/wms/vmap0 
    30 download_baselayer.params = layers:coastline_01,format:image/png 
    31  
    3226#You can replace the openlayers baselayer with your own WMS base layer here e.g. 
    3327#baselayer.url = http://localhost:5000/coastwms 
    3428#baselayer.params = layers:l,format:image/png 
    3529 
     30 
     31# Define the outline layers 
     32outlineConfig        = %(here)s/outline_layers.ini 
     33 
    3634# Add a list of pre-defined endpoints to the UI 
    37 #endpointList = %(here)s/endpoints.txt 
     35#endpointConfig       = %(here)s/endpoints.ini 
    3836 
    3937# Add a list of further info links for the endpoints 
    40 #furtherInfo = %(here)s/further_info.ini 
     38#furtherInfoConfig    = %(here)s/further_info.ini 
    4139 
    4240# Set some of the display options rules 
  • cowsclient/trunk/displayOptions.ini

    r5878 r6013  
    1 [HideOptions] 
    2 rules=wms 
     1[wmsviz] 
     2default_rules=modis_interval,psc_interval 
     3hide_rules=wms 
    34 
    4 [HideOptions:wms] 
     5[HideOption:wms] 
    56endpoint=http://ice.badc.rl.ac.uk:5000/[^/]*/wms? 
    67options=show_grid_lines,intervals,intervalNames,cbar_style,disable_subset 
    78 
    8 [DefaultOptions] 
    9 rules=modis_interval,psc_interval 
    10  
    11 [DefaultOptions:modis_interval] 
    12 endpoint=http://ice.badc.rl.ac.uk:5000/modis/wms3 
     9[DefaultOption:modis_interval] 
     10endpoint=http://ice.badc.rl.ac.uk:5000/modis/wms 
    1311layers=igbp_class 
    1412values=intervalColourbar|true 
    1513 
    16 [DefaultOptions:psc_interval] 
     14[DefaultOption:psc_interval] 
    1715endpoint=http://ice.badc.rl.ac.uk:5000/psc[^/]*/wms 
    1816layers=.* 
  • cowsclient/trunk/endpoints.txt

    r5842 r6013  
    1 [COWS] 
    2 http://ice.badc.rl.ac.uk:5000 
     1[wmsviz] 
     2keys=cows,coast,metacarta,ndg3betaWMS 
    33 
    4 [WMS] 
    5 http://ice.badc.rl.ac.uk:5000/coastwms 
    6 http://labs.metacarta.com/wms/vmap0 
    7 http://ndg3beta.badc.rl.ac.uk/cows/demo_hadcm3/wms 
     4[wcsdown] 
     5keys=cows,ndg3betaWCS,ccip,motherload 
    86 
    9 [WCS] 
    10 http://ndg3beta.badc.rl.ac.uk/ccip/HighProjections/wcs 
    11 http://ccip.lat-lon.de/ccip-wcs/services 
    12 http://motherlode.ucar.edu:8080/thredds/wcs/fmrc/NCEP/NAM/CONUS_40km/conduit/NCEP-NAM-CONUS_40km-conduit_best.ncd 
     7[Endpoint:cows] 
     8service=COWS 
     9url=http://ice.badc.rl.ac.uk:5000 
    1310 
     11[Endpoint:coast] 
     12service=WMS 
     13url=http://ice.badc.rl.ac.uk:5000/coastwms 
     14name=coastline 
     15 
     16[Endpoint:metacarta] 
     17service=WMS 
     18url=http://labs.metacarta.com/wms/vmap0 
     19name=metacarta 
     20 
     21[Endpoint:ndg3betaWMS] 
     22service=WMS 
     23url=http://ndg3beta.badc.rl.ac.uk/cows/demo_hadcm3/wms 
     24name=ndg 
     25 
     26[Endpoint:motherload] 
     27service=WCS 
     28url=http://motherlode.ucar.edu:8080/thredds/wcs/fmrc/NCEP/NAM/CONUS_40km/conduit/NCEP-NAM-CONUS_40km-conduit_best.ncd 
     29name=ncep 
     30 
     31[Endpoint:ccip] 
     32service=WCS 
     33url=http://ccip.lat-lon.de/ccip-wcs/services 
     34name=ccip 
     35 
     36[Endpoint:ndg3betaWCS] 
     37service=WCS 
     38url=http://ndg3beta.badc.rl.ac.uk/ccip/HighProjections/wcs 
     39name=ndg 
  • cowsclient/trunk/further_info.ini

    r5999 r6013  
    1  
    21[wmsviz] 
    32keys=clim_10,clim_30,cru_tmc_1,cru_tmc_2 
     
    2019endpoint= [^ ]*cru_tmc* 
    2120link= http://localhost:5000/ 
     21# leaving the name empty means only the icon is shown 
    2222name= 
    2323image=layout/icons/info.png 
  • cowsclient/trunk/outline_layers.ini

    r5979 r6013  
    88## The cowsclient pages ## 
    99 
     10[wmsviz] 
     11outline=metacarta_outline 
     12background= metacarta_basic 
     13 
    1014[wcsdown] 
    11 keys = green_land_with_sea,black_coastline 
     15keys = metacarta_basic,metacarta_outline 
    1216 
    1317## The layers ## 
    1418 
    15 [green_land_with_sea] 
    16 url = http://ice.badc.rl.ac.uk:5000/coastwms 
    17 params = layers:landmass,format:image/png,bgcolor:lightblue,land_colour:lightgreen 
     19[LayerConfig:metacarta_outline] 
     20url = http://labs.metacarta.com/wms/vmap0 
     21params = layers:coastline_01,format:image/png 
    1822 
    19 [black_coastline] 
    20 url = http://ice.badc.rl.ac.uk:5000/coastwms 
    21 params = layers:coastline,coastline_colour:black,coastline_width:0.3,transparent:true 
     23[LayerConfig:metacarta_basic] 
     24url = http://labs.metacarta.com/wms/vmap0 
     25params = layers:basic,format:image/png,transparent:false 
Note: See TracChangeset for help on using the changeset viewer.