Changeset 3696


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

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

Location:
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_common/ows_common
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_common/ows_common/model/wms.py

    r3553 r3696  
    3535    @ivar maxScaleDenominator 
    3636    @type maxScaleDenominator: None or double 
     37    @ivar queryable 
     38    @type queryable: Boolean 
    3739 
    3840    """ 
    3941    def __init__(self, CRSs=[], styles=[''], dimensions={}, attribution=None, authorityURLs=[], 
    4042                 dataURLs=[], featureListURLs=[], 
    41                  minScaleDenominator=None, maxScaleDenominator=None, **kw): 
     43                 minScaleDenominator=None, maxScaleDenominator=None, 
     44                 queryable=False, **kw): 
    4245        super(WmsDatasetSummary, self).__init__(**kw) 
    4346 
     
    5154        self.minScaleDenominator = minScaleDenominator 
    5255        self.maxScaleDenominator = maxScaleDenominator 
    53  
     56        self.queryable = queryable 
    5457 
    5558class Style(object): 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_common/ows_common/pylons/templates/wms_capabilities_1_1_1.xml

    r3575 r3696  
    3939  ?> 
    4040 
    41   <Layer py:def="markupLayer(ds)"> 
     41  <Layer py:def="markupLayer(ds)" queryable="${int(ds.queryable)}"> 
    4242    <Name py:content="ds.identifier"/> 
    4343    <Title py:content="ds.titles[0]"/> 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_common/ows_common/pylons/templates/wms_capabilities_1_3_0.xml

    r3688 r3696  
    3838  ?> 
    3939 
    40   <Layer py:def="markupLayer(ds)"> 
     40  <Layer py:def="markupLayer(ds)" queryable="${int(ds.queryable)}"> 
    4141    <Name py:content="ds.identifier"/> 
    4242    <Title py:content="ds.titles[0]"/> 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_common/ows_common/pylons/templates/wms_context_1_1_1.xml

    r3571 r3696  
    1919  <!--!TODO: Queriable if GetFeatureInfo is present --> 
    2020  <Layer py:def="markupLayer(ds)" 
    21          queryable="false" hidden="false"> 
     21          queryable="${int(ds.queryable)}" hidden="false"> 
    2222    <Server service="OGC:WMS" version="1.1.1"> 
    2323      <OnlineResource xlink:type="simple" 
  • 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        """ 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_common/ows_common/service/wms_iface.py

    r3688 r3696  
    4848    ILayerMapper supports the retrieval of sets of layers according to arbitary 
    4949    keyword/value pairs. 
    50      
     50 
    5151    """ 
    5252    def map(self, **kwargs): 
     
    6060        """ 
    6161        raise NotImplementedError 
    62  
     62         
    6363 
    6464class ILayer(object): 
     
    7474    @ivar legendSize: (width, height) in pixels of legend. 
    7575 
     76    @ivar featureInfoFormats: A sequence of formats supported for the 
     77        self.getFeatureInfo method.  If this is None or empty GetFeatureInfo 
     78        is not supported. 
     79 
    7680    @todo: Do we need minValue/maxValue? 
    7781 
    7882    """ 
    7983    title = abstract = dimensions = units = crss = wgs84BBox = NotImplemented 
     84    featureInfoFormats = NotImplemented 
    8085 
    8186    def getBBox(self, crs): 
     
    128133        raise NotImplementedError 
    129134 
     135    def getFeatureInfo(self, format, crs, point, dimValues): 
     136        """ 
     137        Return a response string descibing the feature at a given 
     138        point in a given CRS. 
     139 
     140        @param format: One of self.featureInfoFormats.  Defines which 
     141            format the response will be in. 
     142        @param crs: One of self.crss 
     143        @param point: a tuple (x, y) in the supplied crs of the point 
     144            being selected. 
     145        @param dimValues: A mapping of dimension names to dimansion values. 
     146        @return: A string containing the response. 
     147 
     148        """ 
     149        raise NotImplementedError 
     150         
     151 
    130152class IDimension(object): 
    131153    """ 
Note: See TracChangeset for help on using the changeset viewer.