Changeset 512

Show
Ignore:
Timestamp:
10/17/06 22:48:23
Author:
seang
Message:

implement getmap() method that handles service exceptions in a Pythonic way

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • OWSLib/trunk/owslib/wms.py

    r511 r512  
    2626import cgi 
    2727import sys 
    28 import urllib 
     28from urllib import urlencode, urlopen 
    2929 
    3030from owslib.etree import etree 
     
    4949        report_elem.append(exception_elem) 
    5050        return preamble + etree.tostring(report_elem) 
     51 
     52 
     53class ServiceException(Exception): 
     54    pass 
    5155 
    5256 
     
    8084        """Request and return capabilities document from the WMS.""" 
    8185        reader = WMSCapabilitiesReader(self.version) 
    82         return urllib.urlopen(reader.capabilities_url(self.url)) 
    83          
    84  
     86        return urlopen(reader.capabilities_url(self.url)) 
     87        
     88    def getmap(self, layers=None, styles=None, srs=None, bbox=None, 
     89               format=None, size=None, transparent=False, bgcolor='#FFFFFF', 
     90               exceptions='application/vnd.ogc.se_xml', 
     91               method='Get'): 
     92        """Request and return an image from the WMS.""" 
     93        md = self.capabilities 
     94        base_url = md.getOperationByName('GetMap').methods[method]['url'] 
     95        request = {'version': self.version, 'request': 'GetMap'} 
     96         
     97        # check layers and styles 
     98        assert len(layers) > 0 
     99        request['layers'] = ','.join(layers) 
     100        if styles: 
     101            assert len(styles) == len(layers) 
     102            request['styles'] = ','.join(styles) 
     103        else: 
     104            request['styles'] = '' 
     105 
     106        # size 
     107        request['width'] = str(size[0]) 
     108        request['height'] = str(size[1]) 
     109         
     110        request['srs'] = str(srs) 
     111        request['bbox'] = ','.join([str(x) for x in bbox]) 
     112        request['format'] = str(format) 
     113        request['transparent'] = str(transparent).upper() 
     114        request['bgcolor'] = '0x' + bgcolor[1:7] 
     115        request['exceptions'] = str(exceptions) 
     116         
     117        data = urlencode(request) 
     118        if method == 'Post': 
     119            u = urlopen(base_url, data=data) 
     120        else: 
     121            u = urlopen(base_url + data) 
     122 
     123        # check for service exceptions, and return 
     124        if u.info().gettype() == 'application/vnd.ogc.se_xml': 
     125            se_xml = u.read() 
     126            se_tree = etree.fromstring(se_xml) 
     127            raise ServiceException, \ 
     128                str(se_tree.find('ServiceException').text).strip() 
     129        return u 
     130 
     131         
    85132class ServiceMetadata(object): 
    86133    """Abstraction for WMS metadata. 
     
    313360            qs.append(('version', self.version)) 
    314361 
    315         urlqs = urllib.urlencode(tuple(qs)) 
     362        urlqs = urlencode(tuple(qs)) 
    316363        return service_url.split('?')[0] + '?' + urlqs 
    317364 
     
    324371        """ 
    325372        request = self.capabilities_url(service_url) 
    326         u = urllib.urlopen(request) 
     373        u = urlopen(request) 
    327374        return WMSCapabilitiesInfoset(etree.fromstring(u.read())) 
    328375