Changeset 3778


Ignore:
Timestamp:
10/04/08 13:39:51 (11 years ago)
Author:
spascoe
Message:

Added station WMS support so far. GetFeatureInfo? implemented. A change
to wms_controller.py to support multiple layers.

!TODO: conflict with previous wms_controller.py needs remerging.

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

Legend:

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

    r3561 r3778  
    3232        """ 
    3333        super(self.__class__, self).__init__(**kwargs) 
    34  
    3534        self.serviceType = serviceType 
    3635        self.serviceTypeVersions = serviceTypeVersions 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_common/ows_common/pylons/ows_controller.py

    r3561 r3778  
    7979        # All OWS parameter names are case insensitive. 
    8080        self._owsParams = {} 
     81        #print request 
     82        #if request.has_key('REQUEST'): 
     83        #print request['REQUEST'] 
    8184        for k in request.params: 
    82             self._owsParams[k.lower()] = request.params[k] 
     85            if k.lower() == 'x': 
     86                self._owsParams['i'] = request.params[k] 
     87            elif k.lower() == 'y': 
     88                self._owsParams['j'] = request.params[k] 
     89            else: 
     90                self._owsParams[k.lower()] = request.params[k] 
     91            #print [k, request.params[k]] 
    8392 
    8493    def _fixOwsAction(self, environ): 
     
    231240 
    232241     
     242 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_common/ows_common/pylons/validators.py

    r3217 r3778  
    1919    # Support a single layer only 
    2020    if ',' in layers: 
    21         raise InvalidParameterValue('Only one layer supported per request', 'layers') 
     21       raise InvalidParameterValue('Only one layer supported per request', 'layers') 
    2222 
    2323    return layers 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_common/ows_common/pylons/wms_controller.py

    r3748 r3778  
    3030    """ 
    3131    layerMapper = None 
    32      
     32    #layers = {}     
    3333    _pilImageFormats = { 
    3434        'image/png': 'PNG', 
     
    6060 
    6161        """ 
     62        #self.updateSequence = "hello" 
     63        print "loading layers" 
     64        #print self.layers 
    6265        self.layers = self.layerMapper.map(**kwargs) 
    6366 
     
    9295        c.capabilities.contents = Contents() 
    9396        for layerName, layer in self.layers.items(): 
     97            print layerName 
    9498            log.debug('Loading layer %s' % layerName) 
    9599 
     
    104108            dims = {} 
    105109            for dimName, dim in layer.dimensions.items(): 
    106                 dimParam = self._mapDimToParam(dimName) 
    107                 dims[dimParam] = Dimension(valuesUnit=dim.units, 
     110                dims[dimName] = Dimension(valuesUnit=dim.units, 
    108111                                          unitSymbol=dim.units, 
    109112                                          possibleValues= 
     
    136139                                    formats = list(featureInfoFormats)) 
    137140 
    138  
    139     def _getLayerParam(self, paramName='layers'): 
     141    def _getLayerParamInfo(self, paramName='layers'): 
    140142        """ 
    141143        Retrieve the layers parameter enforcing the rule of only 
     
    162164        return layerName, layerObj 
    163165 
     166    def _getLayerParam(self, paramName='layers'): 
     167        """ 
     168        Retrieve the layers parameter enforcing the rule of only 
     169        selecting one layer. 
     170 
     171        @param paramName: Overrides the query string parameter name to 
     172            look for.  This is usefull for implementing GetFeatureInfo. 
     173 
     174        """ 
     175        #print self.getOwsParam(paramName) 
     176        layers = {} 
     177        layerNames = self.getOwsParam(paramName) 
     178 
     179        # Select the first layer if several are requested. 
     180        # This plays nicer with mapClient. 
     181        #if ',' in layerName: 
     182        layerNames = layerNames.split(',') 
     183            #raise InvalidParameterValue( 
     184            #    'Multi-layer GetMap requests are not supported', 'layers') 
     185        for layerName in layerNames: 
     186            try: 
     187                layerObj = self.layers[layerName] 
     188                layers[layerName] = layerObj 
     189            except KeyError: 
     190                raise InvalidParameterValue('Layer %s not found' % layerName, 
     191                                        paramName) 
     192 
     193        #return layerName, layerObj 
     194        return layers 
     195 
    164196    def _getFormatParam(self): 
    165197        format = self.getOwsParam('format', default='image/png') 
     
    169201 
    170202        return format 
    171  
    172     _escapedDimNames = ['width', 'height', 'version', 'request', 
    173                         'layers', 'styles', 'crs', 'srs', 'bbox', 
    174                         'format', 'transparent', 'bgcolor', 
    175                         'exceptions'] 
    176     def _mapDimToParam(self, dimName): 
    177         """ 
    178         Dimension names might clash with WMS parameter names, making 
    179         them inaccessible in WMS requests.  This method maps a 
    180         dimension name to a parameter name that appears in the 
    181         capabilities document and WMS requests. 
    182  
    183         """ 
    184         if dimName.lower() in self._escapedDimNames: 
    185             return dimName+'_dim' 
    186         else: 
    187             return dimName 
    188          
    189     def _mapParamToDim(self, dimParam): 
    190         """ 
    191         Maps a dimension parameter name to it's real dimension name. 
    192  
    193         @see: _mapDimToParam() 
    194  
    195         """ 
    196         try: 
    197             dimName = re.match(r'(.*)_dim$', dimParam).group(1) 
    198             if dimName.lower() in self._escapedDimNames: 
    199                 return dimName 
    200             else: 
    201                 return dimParam 
    202         except AttributeError: 
    203             return dimParam 
    204  
    205203 
    206204    #------------------------------------------------------------------------- 
     
    219217 
    220218        # Layer handling 
    221         layerName, layerObj = self._getLayerParam() 
    222          
     219        #layerName, layerObj = self._getLayerParam() 
     220        layers = self._getLayerParam() 
    223221        # Coordinate parameters 
    224222        bbox = tuple(float(x) for x in self.getOwsParam('bbox').split(',')) 
     
    231229            srs = self.getOwsParam('crs') 
    232230 
    233         if srs not in layerObj.crss: 
    234             raise InvalidParameterValue('Layer %s does not support SRS %s' % (layerName, srs)) 
     231        #if srs not in layerObj.crss: 
     232         #   raise InvalidParameterValue('Layer %s does not support SRS %s' % (layerName, srs)) 
    235233 
    236234        # Get format 
     
    241239 
    242240        # Dimension handling 
    243         dimValues = {} 
    244         for dimName, dim in layerObj.dimensions.items(): 
    245             defaultValue = dim.extent[0] 
    246             dimParam = self._mapDimToParam(dimName) 
    247             dimValues[dimName] = self.getOwsParam(dimParam, default=defaultValue) 
     241        finalImg = Image.new('RGBA', (width, height)) 
     242        # Multiple Layers handling..   
     243        for layerName, layerObj in layers.iteritems(): 
     244            if srs not in layerObj.crss: 
     245                raise InvalidParameterValue('Layer %s does not support SRS %s' % (layerName, srs)) 
     246             
     247            dimValues = {} 
     248            for dimName, dim in layerObj.dimensions.items(): 
     249                defaultValue = dim.extent[0] 
     250                dimValues[dimName] = self.getOwsParam(dimName, default=defaultValue) 
    248251             
    249252        #--------------------------------------------------------------------- 
     
    252255         
    253256        # Find the slab in the cache first 
    254         cacheKey = layerObj.getCacheKey(srs, dimValues) 
    255  
    256         slab = self._layerSlabCache.get(cacheKey) 
    257         if slab is None: 
    258             slab = layerObj.getSlab(srs, dimValues, dict(minValue=0, maxValue=100)) 
    259             if cacheKey is not None: 
    260                 self._layerSlabCache[cacheKey] = slab 
     257            cacheKey = layerObj.getCacheKey(srs, dimValues) 
     258 
     259            slab = self._layerSlabCache.get(cacheKey) 
     260            if slab is None: 
     261                slab = layerObj.getSlab(srs, dimValues, dict(minValue=0, maxValue=100)) 
     262                if cacheKey is not None: 
     263                                self._layerSlabCache[cacheKey] = slab 
    261264 
    262265        # We must request a bbox within the layer's bbox. 
    263         lbbox = layerObj.getBBox(srs) 
    264         ibbox = bbox_util.intersection(bbox, lbbox) 
    265  
    266         log.debug('bbox = %s' % (bbox,)) 
    267         log.debug('lbbox = %s' % (lbbox,)) 
    268         log.debug('ibbox = %s' % (ibbox,)) 
     266            lbbox = layerObj.getBBox(srs) 
     267            ibbox = bbox_util.intersection(bbox, lbbox) 
     268 
     269            log.debug('bbox = %s' % (bbox,)) 
     270            log.debug('lbbox = %s' % (lbbox,)) 
     271            log.debug('ibbox = %s' % (ibbox,)) 
    269272 
    270273        # If bbox is not within layerObj.bbox then we need to calculate the 
    271274        # pixel offset of the inner bbox, request the right width/height 
    272275        # and paste the image into a blank background 
    273         if bbox == ibbox: 
    274             img = slab.getImage(bbox, width, height) 
    275             log.debug('slab image.size = %s' % (img.size,)) 
    276         else: 
    277             sx, sy = bbox_util.relativeSize(ibbox, bbox) 
    278             log.debug('scaling: %s,%s' % (sx, sy)) 
    279             img1 = slab.getImage(ibbox, int(width*sx), int(height*sy)) 
    280             log.debug('inner image.size = %s' % (img1.size,)) 
    281  
    282             img = Image.new('RGBA', (width, height)) 
    283             pxOrigin = bbox_util.geoToPixel(ibbox[0], ibbox[3], bbox, width, height) 
    284             log.debug('pxOrigin = %s' % (pxOrigin,)) 
    285             img.paste(img1, pxOrigin) 
     276            if bbox == ibbox: 
     277                img = slab.getImage(bbox, width, height) 
     278                log.debug('slab image.size = %s' % (img.size,)) 
     279                         
     280            else: 
     281                sx, sy = bbox_util.relativeSize(ibbox, bbox) 
     282                log.debug('scaling: %s,%s' % (sx, sy)) 
     283                img1 = slab.getImage(ibbox, int(width*sx), int(height*sy)) 
     284                log.debug('inner image.size = %s' % (img1.size,)) 
     285 
     286                img = Image.new('RGBA', (width, height)) 
     287                pxOrigin = bbox_util.geoToPixel(ibbox[0], ibbox[3], bbox, width, height) 
     288                log.debug('pxOrigin = %s' % (pxOrigin,)) 
     289                img.paste(img1, pxOrigin) 
     290                 
     291            finalImg = Image.composite(finalImg, img, finalImg)  
    286292             
    287  
     293           
     294           
     295         
    288296        # IE < 7 doesn't display the alpha layer right.  Here we sniff the 
    289297        # user agent and remove the alpha layer if necessary. 
     
    294302        else: 
    295303            if 'MSIE' in ua and 'MSIE 7' not in ua: 
    296                 img = img.convert('RGB') 
     304                finalImg = finalImg.convert('RGB') 
    297305 
    298306        buf = StringIO() 
    299         img.save(buf, self._pilImageFormats[format]) 
     307        finalImg.save(buf, self._pilImageFormats[format]) 
    300308 
    301309        response.headers['Content-Type'] = format 
     
    344352            raise InvalidParameterValue('Version %s not supported' % version, 
    345353                                        'version') 
    346         layerName, layerObj = self._getLayerParam('query_layers') 
     354        layerName, layerObj = self._getLayerParamInfo('query_layers') 
    347355        format = self.getOwsParam('info_format') 
    348356        if format not in layerObj.featureInfoFormats: 
     
    369377        for dimName, dim in layerObj.dimensions.items(): 
    370378            defaultValue = dim.extent[0] 
    371             dimParam = self._mapDimToParam(dimName) 
    372             dimValues[dimName] = self.getOwsParam(dimParam, default=defaultValue) 
     379            dimValues[dimName] = self.getOwsParam(dimName, default=defaultValue) 
    373380        # Get pixel location 
    374381        i = int(self.getOwsParam('i')) 
     
    388395        """ 
    389396        # Parameters 
    390         layerName, layerObj = self._getLayerParam() 
     397        layerName, layerObj = self._getLayerParamInfo() 
    391398        format = self._getFormatParam() 
    392399 
Note: See TracChangeset for help on using the changeset viewer.