Ignore:
Timestamp:
28/03/08 11:11:21 (12 years ago)
Author:
spascoe
Message:

Implementation of GetFeatureInfo?. Not tested yet but the interface
described in wms_iface.py should remain constant.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_common/ows_common/pylons/wms_controller.py

    r3688 r3696  
    66 
    77from cStringIO import StringIO 
    8  
     8from sets import Set 
    99from matplotlib.cm import get_cmap 
    1010from pylons import request, response, c 
     
    4343 
    4444    service = 'WMS' 
    45     owsOperations = ows_controller.OWSController.owsOperations + ['GetMap', 'GetContext', 
    46                                                                   'GetLegend', 
    47                                                                   'GetInfo'] 
     45    owsOperations = (ows_controller.OWSController.owsOperations + 
     46        ['GetMap', 'GetContext', 'GetLegend', 'GetFeatureInfo', 'GetInfo']) 
    4847    validVersions = ['1.1.1', '1.3.0'] 
    4948 
     
    8786                                    formats=['image/png']) 
    8887        ows_controller.addOperation('GetInfo') 
     88         
     89        featureInfoFormats = Set() 
     90 
    8991        log.debug('Loading capabilities contents') 
    9092        c.capabilities.contents = Contents() 
     
    106108                                          possibleValues= 
    107109                                            PossibleValues.fromAllowedValues(dim.extent)) 
     110            # Does the layer implement GetFeatureInfo? 
     111            if layer.featureInfoFormats: 
     112                queryable = True 
     113                featureInfoFormats.union_update(layer.featureInfoFormats) 
     114            else: 
     115                queryable = False 
     116                 
    108117            # Create the ows_common object 
    109118            ds = WmsDatasetSummary(identifier=layerName, 
     
    113122                                   boundingBoxes=bboxObjs, 
    114123                                   abstracts=[layer.abstract], 
    115                                    dimensions=dims) 
     124                                   dimensions=dims, 
     125                                   queryable=queryable) 
    116126 
    117127            # Stuff that should go in the capabilities tree eventually 
     
    121131            c.capabilities.contents.datasetSummaries.append(ds) 
    122132 
    123  
    124  
    125     def _getLayerParam(self): 
     133        # Add this operation here after we have found all formats 
     134        ows_controller.addOperation('GetFeatureInfo', 
     135                                    formats = list(featureInfoFormats)) 
     136 
     137 
     138    def _getLayerParam(self, paramName='layers'): 
    126139        """ 
    127140        Retrieve the layers parameter enforcing the rule of only 
    128141        selecting one layer. 
    129142 
    130         """ 
    131         layerName = self.getOwsParam('layers') 
     143        @param paramName: Overrides the query string parameter name to 
     144            look for.  This is usefull for implementing GetFeatureInfo. 
     145 
     146        """ 
     147        layerName = self.getOwsParam(paramName) 
    132148 
    133149        # Select the first layer if several are requested. 
     
    140156            layerObj = self.layers[layerName] 
    141157        except KeyError: 
    142             raise InvalidParameterValue('Layer %s not found' % layerName, 'layers') 
     158            raise InvalidParameterValue('Layer %s not found' % layerName, 
     159                                        paramName) 
    143160 
    144161        return layerName, layerObj 
     
    151168 
    152169        return format 
    153      
     170 
    154171    #------------------------------------------------------------------------- 
    155172    # OWS Operation methods 
     
    285302        return t.generate(c=c).render() 
    286303 
     304    def GetFeatureInfo(self): 
     305        layerName, layerObj = self._getLayerParam('query_layers') 
     306        format = self.getOwsParam('info_format') 
     307        if format not in layerObj.featureInfoFormats: 
     308            raise InvalidParameterValue( 
     309                'Layer %s does not support GetFeatureInfo in format %s' % 
     310                (layerName, format), 'info_format') 
     311 
     312        # Coordinate parameters 
     313        bbox = tuple(float(x) for x in self.getOwsParam('bbox').split(',')) 
     314        width = int(self.getOwsParam('width')) 
     315        height = int(self.getOwsParam('height')) 
     316 
     317        if version == '1.1.1': 
     318            srs = self.getOwsParam('srs') 
     319        else: 
     320            srs = self.getOwsParam('crs') 
     321 
     322        if srs not in layerObj.crss: 
     323            raise InvalidParameterValue('Layer %s does not support SRS %s' % 
     324                                        (layerName, srs)) 
     325 
     326        # Dimension handling 
     327        dimValues = {} 
     328        for dimName, dim in layerObj.dimensions.items(): 
     329            defaultValue = dim.extent[0] 
     330            dimValues[dimName] = self.getOwsParam(dimName, default=defaultValue) 
     331        # Get pixel location 
     332        i = self.getOwsParam('i') 
     333        j = self.getOwsParam('j') 
     334 
     335        # Translate to geo-coordinates 
     336        x, y = bbox_util.pixelToGeo(i, j, bbox, width, height) 
     337 
     338        # Call the layer 
     339        response.headers['Content-Type'] = format 
     340        response.write(layerObj.getFeatureInfo(format, srs, (x, y), dimValues)) 
     341 
    287342    def GetLegend(self): 
    288343        """ 
Note: See TracChangeset for help on using the changeset viewer.