Changeset 3621 for TI05-delivery


Ignore:
Timestamp:
17/03/08 11:19:17 (12 years ago)
Author:
spascoe
Message:

Work in progress on GDAL warping support.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_common/ows_common/service/wms_gdal.py

    r3597 r3621  
    77 
    88from ows_common.service.wms_iface import * 
     9from ows_common.bbox_util import geoToPixel 
     10 
    911import logging 
    10  
    1112log = logging.getLogger(__name__) 
    1213 
     
    6465    various other CRSs. 
    6566 
    66     @ivar warpCRSs: A mapping of CRS itentifiers to WKT descriptions of 
     67    @ivar sourceCRS: The CRS of the data source. 
     68    @ivar warpCRS: A mapping of CRS itentifiers to WKT descriptions of 
    6769       CRSs that are supported for this ILayer via warping. 
    6870 
     
    7577        """ 
    7678        self._ds = dataSource 
    77         self.warpCRSs = {} 
     79        self.warpCRS = {} 
     80        self.sourceCRS = dataSource.crs 
    7881 
    7982        self.title = dataSource.title 
     
    8487 
    8588    def _getCRSs(self): 
    86         return [self._ds.crs] + self._warpCRSs.keys() 
     89        return [self._ds.crs] + self._warpCRS.keys() 
    8790    crss = property(_getCRSs) 
    8891 
     
    9396 
    9497        sr_src = osr.SpatialReference(self._ds.getWKT()) 
    95         sr_dst = osr.SpatialReference(self.warpCRSs[crs]) 
     98        sr_dst = osr.SpatialReference(self.warpCRS[crs]) 
    9699 
    97100        ct = osr.CoordinateTransformation(sr_srs, sr_dst) 
     
    100103        urx, ury = ct.TransformPoint(*src_bb[2:])[:2] 
    101104        return (llx, lly, urx, ury) 
     105 
     106    def getSlab(self, crs, dimValues=None, renderOpts={}): 
     107        return GDALLayerSlab(self, crs, dimValues=dimValues, 
     108                             renderOpts=renderOpts) 
     109 
     110    def getCacheKey(self, crs, dimValues=None, renderOpts={}): 
     111        """ 
     112        A fairly sane cache key generation algorithm. 
     113 
     114        """ 
     115        if dimValues is None: 
     116            x = None 
     117        else: 
     118            x = dimValues.items() 
     119        x.sort() 
     120        y = renderOpts.items(); y.sort() 
     121 
     122        return str((x, y)) 
     123 
     124class GDALLayerSlab(ILayerSlab): 
     125    def __init__(self, layer, crs, dimValues=None, renderOpts={}): 
     126        self.layer = layer 
     127        self.crs = crs 
     128        self.dimValues = dimValues 
     129        self.rendOpts = renderOpts 
     130        self.bbox = layer.getBBOX(crs) 
     131         
     132        if crs == layer.sourceCRS: 
     133            self._data = layer._ds.getDataset() 
     134        else: 
     135            self._data = warpDataset(layer._ds, layer.warpCRS[crs]) 
     136 
     137    def getImage(self, bbox, width, height):         
     138        # Calculate the pixel coordinates of bbox within self.bbox 
     139        xoff, yoff = geoToPixel(bbox[0], bbox[1], self.bbox, width, height) 
     140        xsize, ysize = geoToPixel(bbox[2], bbox[3], self.bbox, width, height) 
     141 
     142        return datasetToImage(self._data, xoff, yoff, xsize, ysize) 
     143 
     144 
     145#----------------------------------------------------------------------------- 
     146# Utility functions 
     147 
     148def datasetToImage(ds, xoff, yoff, xsize, ysize): 
     149    """ 
     150    Convert a GDAL dataset into a PIL image with cropping. 
     151 
     152    """ 
     153    ds = self._ds 
     154    bandImages = [] 
     155    for iband in range(1, ds.RasterCount+1): 
     156        band = ds.GetRasterBand(iband) 
     157        bandImages.append(Image.fromstring('L', (x, y), 
     158                                           band.ReadRaster(xoff, yoff, 
     159                                                           xsize, ysize))) 
     160    return Image.merge('RGBA', bandImages) 
     161 
     162def warpDataset(dataSource, wkt, driverName='MEM', datasetName=''): 
     163    """ 
     164    Warp a GDAL dataset from one CRS to another. 
     165 
     166    @param dataset: An object implementing IGDALDataSource. 
     167    @param wkt: The Well Known Text string of the destination CRS 
     168    @param driverName: The GDAL driver to use for the new dataset. 
     169        This driver must support the Create() method. 
     170    @param datasetName: The name to give the dataset (i.e. the filename if 
     171        a file-based driver) 
     172    @param return: A GDAL dataset in the new CRS. 
     173 
     174    """ 
     175    ds = dataSource.getDataset() 
     176    dr = gdal.GetDriverByName(driverName) 
     177    # ... 
     178    #dsOut = dr.Create(datasetName, ds. 
     179     
     180 
     181 
Note: See TracChangeset for help on using the changeset viewer.