Changeset 841

Show
Ignore:
Timestamp:
08/14/07 13:55:21
Author:
dokai
Message:

Fixed rendering of multiple WMS layers.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • PCL/trunk/PCL-MapServer/cartography/engine/mapserver/rendering.py

    r840 r841  
    11191119            lo.connection = datastore._wms.capabilities.getOperationByName('GetMap').methods['Get']['url'] 
    11201120            lo.connectiontype = mapscript.MS_WMS 
    1121             lname = layer.typename.split('/')[0] 
    1122             bounds = datastore.bounds(lname) 
     1121 
     1122            layers = layer.typename.split(',') 
     1123            # Read the bounds from the first layer 
     1124            bounds = datastore.bounds(layers[0]) 
    11231125            _set_projection(lo, bounds.srs) 
    11241126        
     
    11261128            lo.metadata.set('wms_srs', layer.ows_srs) 
    11271129            # for format, try ows_format, fall back on the map format 
    1128             lo.metadata.set('wms_format',  
    1129                         getattr(layer, 'ows_format', '') or format) 
     1130            lo.metadata.set('wms_format', getattr(layer, 'ows_format', mo.outputformat)) 
    11301131 
    11311132            # connection timeout 
     
    11331134                    str(getattr(layer, 'timeout', 30))) 
    11341135         
    1135             # names and styles 
    1136             styled_layers = layer.typename.split(',') 
    1137             layer_names = [] 
    1138             style_names = [] 
    1139             for o in styled_layers: 
    1140                 if o.find('/') < 0: 
    1141                     o = o + '/' 
    1142                 layer_name, style_name = o.split('/') 
    1143                 layer_names.append(layer_name) 
    1144                 style_names.append(style_name) 
    1145             comma = ',' 
    1146             layers = comma.join(layer_names) 
    1147             styles = comma.join(style_names) 
    1148             if len(styles.strip()) == 0: 
    1149                 styles = getattr(layer, 'ows_style', '') 
    1150             lo.metadata.set('wms_name', layers) 
    1151             lo.metadata.set('wms_style', styles) 
     1136            styles = getattr(layer, 'ows_style', '').split(',') 
     1137             
     1138            if len(layers) != len(styles): 
     1139                raise ValueError('Each WMS layer must have exactly one style associated with it. ' 
     1140                                 'Layers: %s, Styles: %s' % (','.join(layers), ','.join(styles))) 
     1141 
     1142            lo.metadata.set('wms_name', ','.join(layers)) 
     1143            lo.metadata.set('wms_style', ','.join(styles)) 
    11521144     
    11531145            # Work around for mapserver 4.4 bug 
  • PCL/trunk/PCL-MapServer/tests/testimages.py

    r840 r841  
    176176        self.mapper = MapRenderer('MapServer', fontset=FONTSET, 
    177177            incoming='/tmp/') 
     178 
     179    def test_multiple_wms_layers(self): 
     180        # WMS 
     181        url = "http://wms.jpl.nasa.gov/wms.cgi?" 
     182        store = WMSRasterStore(url, '1.1.1') 
     183        layer = Layer(store, 'modis,global_mosaic') 
     184        layer.ows_srs = 'EPSG:4326' 
     185        layer.ows_format = 'image/jpeg' 
     186        layer.ows_style = 'default,pseudo' 
     187        style = Style() 
     188        style.rules.append(Rule('r', [RasterSymbolizer()])) 
     189        wms = ContextLayer('wms', layer, style) 
     190 
     191        map = MapContext([wms]) 
     192        srs = SpatialReference(epsg=4326) 
     193        view = View(srs, [-10, 30, 30, 70]) 
     194        size = [300, 300] 
     195        image = self.mapper.render(map, view, 'image/jpeg', size,   
     196            bgcolor='#000000', transparent=0, debug=True) 
     197        assert image.size == size 
     198        assert image.mimetype == 'image/jpeg' 
     199        f = open('test_multiple_wms_layers.jpg', 'wb') 
     200        f.write(image.getdata()) 
     201        f.close()         
     202 
     203    def test_multiple_wms_layers_with_mismatched_styles(self): 
     204        # WMS 
     205 
     206        url = "http://wms.jpl.nasa.gov/wms.cgi?" 
     207        store = WMSRasterStore(url, '1.1.1') 
     208        layer = Layer(store, 'modis,global_mosaic') 
     209        layer.ows_srs = 'EPSG:4326' 
     210        layer.ows_format = 'image/jpeg' 
     211        layer.ows_style = 'default,pseudo,mismatch' 
     212        style = Style() 
     213        style.rules.append(Rule('r', [RasterSymbolizer()])) 
     214        wms = ContextLayer('wms', layer, style) 
     215 
     216        map = MapContext([wms]) 
     217        srs = SpatialReference(epsg=4326) 
     218        view = View(srs, [-10, 30, 30, 70]) 
     219        size = [300, 300] 
     220 
     221        # We'd like to test with the following assertion, but 
     222        # rendering.py swallows all exceptions :( 
     223        #self.assertRaises(ValueError, lambda:self.mapper.render(map, view, 'image/jpeg', size,   
     224        #    bgcolor='#000000', transparent=0, debug=True)) 
     225 
     226        # There we just render and verify manually that we get an error image.  
     227        image = self.mapper.render(map, view, 'image/jpeg', size,   
     228                                   bgcolor='#000000', transparent=0, debug=True) 
     229        assert image.size == size 
     230        assert image.mimetype == 'image/jpeg' 
     231        f = open('test_multiple_layers_with_mismatched_styles.jpg', 'wb') 
     232        f.write(image.getdata()) 
     233        f.close()         
     234         
     235         
     236 
    178237    def test_world(self): 
    179238        # WMS