Changeset 2167


Ignore:
Timestamp:
14/02/07 13:53:56 (12 years ago)
Author:
domlowe
Message:

added EnvelopeAggregator? class and code to create an EnvelopeWithTimePeriod? for the feature collection

Location:
TI02-CSML/trunk/csml
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • TI02-CSML/trunk/csml/DDC/obs/clim10subset.py

    r2160 r2167  
    3434print feature.getUom() 
    3535 
    36  
    3736#get list of allowed subsettings 
    3837print '\n the following feature subsetting operations are allowed:' 
  • TI02-CSML/trunk/csml/csmllibs/csmlbuilder.py

    r2121 r2167  
    107107        self.ds=thefeatures.ds_element 
    108108        self.featureCollection = thefeatures.featureCollection 
    109         self.featureCollection =csml.csmllibs.csmlextra.addEnvelope(self.featureCollection)         
     109        self.featureCollection =csml.csmllibs.csmlextra.addEnvelope(self.featureCollection, self.ffmap)         
    110110        self.ds.featureCollection=self.featureCollection 
    111111 
  • TI02-CSML/trunk/csml/csmllibs/csmlextra.py

    r2071 r2167  
    11#Stuff with nowhere better to go 
    2 import random 
     2import random, datetime 
    33import string 
    44import csml.parser 
     5import sys 
    56 
    67def getRandomID(): 
     
    1314        randomID=randomID+random.choice(string.letters+string.digits) 
    1415    return randomID 
    15      
    16  
    17 def addEnvelope(fc): 
    18     #adds EnvelopeWithTimePeriod to feature collection, based on the spatial extent of the features within. 
    19     #TO DO - this calculation, placeholder for now 
    20     env=csml.parser.EnvelopeWithTimePeriod() 
    21     env.lowerCorner=csml.parser.csString('lc') 
    22     env.upperCorner=csml.parser.csString('uc') 
    23     env.timePosition1=csml.parser.csString('tp1') 
    24     env.timePosition2=csml.parser.csString('tp2') 
    25     fc.boundedBy=env 
    26     return fc 
     16 
     17def strToDate(ymd): 
     18    '''given a string in form '2006-01-01' returns a datetime object''' 
     19    return datetime.date(*map(int, ymd.split('-'))) 
     20 
     21class EnvelopeAggregator(object): 
     22    def __init__(self,envelope): 
     23        '''start with aggregated envelope equal to the initialising envelope 
     24        envelope must be of type csml.parser.EnvelopeWithTimePeriod''' 
     25        self.envelope=envelope  
     26        self.minX=self.envelope.lowerCorner.CONTENT.split()[0] 
     27        self.minY=self.envelope.lowerCorner.CONTENT.split()[1] 
     28        self.maxX=self.envelope.upperCorner.CONTENT.split()[0] 
     29        self.maxY=self.envelope.upperCorner.CONTENT.split()[1] 
     30        self.t1= strToDate(self.envelope.timePosition1.CONTENT) 
     31        self.t2= strToDate(self.envelope.timePosition2.CONTENT) 
     32  
     33    def _compareLowerCorners(self,lowerCorner): 
     34        minX,minY=lowerCorner.CONTENT.split()[0],lowerCorner.CONTENT.split()[1] 
     35        if float(minX) < float(self.minX): 
     36            self.envelope.lowerCorner.CONTENT=str(minX +' '+ self.minY) 
     37            self.minX=minX 
     38        if float(minY) < float(self.minY): 
     39            self.envelope.lowerCorner.CONTENT=str(self.minX +' '+ minY) 
     40            self.minY=minY 
     41             
     42    def _compareUpperCorners(self,upperCorner): 
     43        maxX,maxY=upperCorner.CONTENT.split()[0],upperCorner.CONTENT.split()[1] 
     44        if float(maxX) > float(self.maxX): 
     45            self.envelope.upperCorner.CONTENT=str(maxX +' '+ self.maxY) 
     46            self.maxX=maxX 
     47        if float(maxY) > float(self.maxY): 
     48            self.envelope.upperCorner.CONTENT=str(self.maxX +' '+ maxY) 
     49            self.maxY=maxY 
     50             
     51    def _compareLowerTimes(self,timepos): 
     52        t=strToDate(timepos) 
     53        if t<self.t1: 
     54            self.t1=t 
     55         
     56    def _compareUpperTimes(self,timepos): 
     57        t=strToDate(timepos) 
     58        if t>self.t2: 
     59            self.t2=t  
     60     
     61    def compareEnvelope(self,envtocheck): 
     62        '''compares new envelope, and if necessary changes the aggregated envelope.''' 
     63        if envtocheck.srsName!=self.envelope.srsName: 
     64            print 'Can currently only perform aggregation within the same spatio-temporal reference system.' 
     65            sys.exit() 
     66        else:  
     67            self._compareLowerCorners(envtocheck.lowerCorner) 
     68            self._compareUpperCorners(envtocheck.upperCorner) 
     69            self._compareLowerTimes(envtocheck.timePosition1.CONTENT) 
     70            self._compareUpperTimes(envtocheck.timePosition2.CONTENT) 
     71     
     72    def getAggregatedEnvelope(self): 
     73        self.envelope.timePosition=str(self.t1)  #convert from datetime types 
     74        self.envelope.timePosition2=str(self.t2) 
     75        return self.envelope 
     76 
     77 
    2778 
    2879def getSeqRule(nDims): 
     
    57108         
    58109         
     110         
     111         
     112 
     113def addEnvelope(fc, ffmap): 
     114    #adds EnvelopeWithTimePeriod to feature collection, based on the spatial extent of the features within. 
     115     
     116    #process:     
     117    #Extract the lat/lon and time extents from each representative file.    Create a temporary EnvelopeWithTimePeriod object, then use the EnvelopeAggregator class to aggregate into an envelope for the whole feature collection. 
     118     
     119    #TODO, need to use the CRS catalogue to get these values 
     120    lonname='longitude' 
     121    latname='latitude' 
     122    timename='time' 
     123    srs='ndg:crs:xyt' 
     124     
     125    import sys 
     126     
     127    aggregator=None 
     128    for feature in fc.featureMembers: 
     129        if type(feature) is csml.parser.GridSeriesFeature: 
     130             
     131            tmax=None 
     132            tmin=None 
     133            for ord in feature.value.gridSeriesDomain.coordTransformTable.gridOrdinates: 
     134                if ord.coordAxisLabel.CONTENT==timename: 
     135                    #print ord.coordAxisValues.coordinateList.CONTENT                                 
     136                    tnewmin= strToDate(ord.coordAxisValues.coordinateList.CONTENT.split()[0].split('T')[0]) 
     137                    tnewmax=strToDate( ord.coordAxisValues.coordinateList.CONTENT.split()[len(ord.coordAxisValues.coordinateList.CONTENT.split())-1].split('T')[0]) 
     138                    if tmin ==None: 
     139                        tmin=tnewmin 
     140                    if tmax == None: 
     141                        tmax=tnewmax 
     142                    if tnewmin < tmin: 
     143                        tmin=tnewmin                     
     144                    if tnewmax > tmax: 
     145                        tmax=tnewmax                      
     146  
     147    for repfile in ffmap.getRepresentativeFiles(): 
     148        minlon=None 
     149        maxlon=None 
     150        minlat=None 
     151        maxlat=None 
     152        f=repfile.getRepresentativeFileName() 
     153        DI=csml.csmllibs.csmldataiface.DataInterface() 
     154        DI=DI.getUnknownInterfaceType(f) 
     155        DI.openFile(f) 
     156        tmpDims=DI.getListOfAxes() 
     157        if lonname in tmpDims: 
     158            DI.setAxis(lonname) 
     159            vals=DI.getDataForAxis() 
     160            minlon=str(min(vals)) 
     161            maxlon= str(max(vals)) 
     162        if latname in tmpDims: 
     163            DI.setAxis(latname) 
     164            vals=DI.getDataForAxis() 
     165            minlat=str(min(vals)) 
     166            maxlat= str(max(vals))                           
     167        env=csml.parser.EnvelopeWithTimePeriod() 
     168        env.lowerCorner=csml.parser.csString(minlon + ' ' + minlat) 
     169        env.upperCorner=csml.parser.csString(maxlon + ' ' + maxlat) 
     170        env.timePosition1=csml.parser.csString(tmin) 
     171        env.timePosition2=csml.parser.csString(tmax) 
     172        env.srsName='srs tba' 
     173        if aggregator is None: 
     174            aggregator=EnvelopeAggregator(env) 
     175        else: 
     176            aggregator.compareEnvelope(env) 
     177    fcEnvelope=aggregator.getAggregatedEnvelope() 
     178    print type(fcEnvelope.timePosition1) 
     179    fcEnvelope.srsName=env.srsName   
     180    fc.boundedBy=fcEnvelope 
     181    #sys.exit() 
     182    fc.boundedBy=env 
     183    return fc 
     184         
     185         
     186         
     187         
    59188# a couple of string cleaning functions: 
    60189#   don't think these are used now 
  • TI02-CSML/trunk/csml/parser.py

    r2105 r2167  
    348348    def __init__(self, **kwargs): 
    349349        AbstractGML.__init__(self,**kwargs) 
    350         children={'boundedBy':[GML('boundedBy'), 'Envelope']} 
     350        #this pattern works but can only accept EnvelopeWithTimePeriod for the boundedBy, 
     351        #which is probably ok     
     352        children={'boundedBy':[GML('EnvelopeWithTimePeriod'), 'Envelope', GML('boundedBy')]} 
    351353        addchildren(self,children) 
    352354        csElement.__init__(self,**kwargs) 
Note: See TracChangeset for help on using the changeset viewer.