Changeset 3778
- Timestamp:
- 10/04/08 13:39:51 (13 years ago)
- 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 32 32 """ 33 33 super(self.__class__, self).__init__(**kwargs) 34 35 34 self.serviceType = serviceType 36 35 self.serviceTypeVersions = serviceTypeVersions -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_common/ows_common/pylons/ows_controller.py
r3561 r3778 79 79 # All OWS parameter names are case insensitive. 80 80 self._owsParams = {} 81 #print request 82 #if request.has_key('REQUEST'): 83 #print request['REQUEST'] 81 84 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]] 83 92 84 93 def _fixOwsAction(self, environ): … … 231 240 232 241 242 -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_common/ows_common/pylons/validators.py
r3217 r3778 19 19 # Support a single layer only 20 20 if ',' in layers: 21 21 raise InvalidParameterValue('Only one layer supported per request', 'layers') 22 22 23 23 return layers -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_common/ows_common/pylons/wms_controller.py
r3748 r3778 30 30 """ 31 31 layerMapper = None 32 32 #layers = {} 33 33 _pilImageFormats = { 34 34 'image/png': 'PNG', … … 60 60 61 61 """ 62 #self.updateSequence = "hello" 63 print "loading layers" 64 #print self.layers 62 65 self.layers = self.layerMapper.map(**kwargs) 63 66 … … 92 95 c.capabilities.contents = Contents() 93 96 for layerName, layer in self.layers.items(): 97 print layerName 94 98 log.debug('Loading layer %s' % layerName) 95 99 … … 104 108 dims = {} 105 109 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, 108 111 unitSymbol=dim.units, 109 112 possibleValues= … … 136 139 formats = list(featureInfoFormats)) 137 140 138 139 def _getLayerParam(self, paramName='layers'): 141 def _getLayerParamInfo(self, paramName='layers'): 140 142 """ 141 143 Retrieve the layers parameter enforcing the rule of only … … 162 164 return layerName, layerObj 163 165 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 164 196 def _getFormatParam(self): 165 197 format = self.getOwsParam('format', default='image/png') … … 169 201 170 202 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, making179 them inaccessible in WMS requests. This method maps a180 dimension name to a parameter name that appears in the181 capabilities document and WMS requests.182 183 """184 if dimName.lower() in self._escapedDimNames:185 return dimName+'_dim'186 else:187 return dimName188 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 dimName200 else:201 return dimParam202 except AttributeError:203 return dimParam204 205 203 206 204 #------------------------------------------------------------------------- … … 219 217 220 218 # Layer handling 221 layerName, layerObj = self._getLayerParam()222 219 #layerName, layerObj = self._getLayerParam() 220 layers = self._getLayerParam() 223 221 # Coordinate parameters 224 222 bbox = tuple(float(x) for x in self.getOwsParam('bbox').split(',')) … … 231 229 srs = self.getOwsParam('crs') 232 230 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)) 235 233 236 234 # Get format … … 241 239 242 240 # 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) 248 251 249 252 #--------------------------------------------------------------------- … … 252 255 253 256 # 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] = slab257 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 261 264 262 265 # 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,)) 269 272 270 273 # If bbox is not within layerObj.bbox then we need to calculate the 271 274 # pixel offset of the inner bbox, request the right width/height 272 275 # 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) 286 292 287 293 294 295 288 296 # IE < 7 doesn't display the alpha layer right. Here we sniff the 289 297 # user agent and remove the alpha layer if necessary. … … 294 302 else: 295 303 if 'MSIE' in ua and 'MSIE 7' not in ua: 296 img = img.convert('RGB')304 finalImg = finalImg.convert('RGB') 297 305 298 306 buf = StringIO() 299 img.save(buf, self._pilImageFormats[format])307 finalImg.save(buf, self._pilImageFormats[format]) 300 308 301 309 response.headers['Content-Type'] = format … … 344 352 raise InvalidParameterValue('Version %s not supported' % version, 345 353 'version') 346 layerName, layerObj = self._getLayerParam ('query_layers')354 layerName, layerObj = self._getLayerParamInfo('query_layers') 347 355 format = self.getOwsParam('info_format') 348 356 if format not in layerObj.featureInfoFormats: … … 369 377 for dimName, dim in layerObj.dimensions.items(): 370 378 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) 373 380 # Get pixel location 374 381 i = int(self.getOwsParam('i')) … … 388 395 """ 389 396 # Parameters 390 layerName, layerObj = self._getLayerParam ()397 layerName, layerObj = self._getLayerParamInfo() 391 398 format = self._getFormatParam() 392 399
Note: See TracChangeset
for help on using the changeset viewer.