Changeset 3144 for TI02-CSML


Ignore:
Timestamp:
13/12/07 16:18:54 (12 years ago)
Author:
domlowe
Message:

fixed bounding box aggregation code

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

Legend:

Unmodified
Added
Removed
  • TI02-CSML/trunk/csml/csmllibs/csmlbuilder.py

    r3131 r3144  
    132132    def insertBoundingBoxes(self): 
    133133        self.ds.featureCollection =csml.csmllibs.csmlextra.addBoundingBoxes(self.ds)  
    134         try: 
    135             self.ds.featureCollection =csml.csmllibs.csmlextra.addEnvelope(self.featureCollection, self.ffmap)         
    136         except: 
    137             print 'could not add envelope bounding box'                
     134        self.ds.featureCollection =csml.csmllibs.csmlextra.addEnvelope(self.featureCollection)  
    138135         
    139136    def saveFile(self): 
  • TI02-CSML/trunk/csml/csmllibs/csmlcrs.py

    r3072 r3144  
    9696         
    9797        #define rotated_latitude_longitude CRS (test) 
    98         crs=CRSystem(srsName='ndg:crs:rlonrlatsurft', axes =['grid_longitude', 'grid_latitude','surface', 'time']) 
    99         self.systems['ndg:crs:rlonrlatsurft']=crs 
    100         crs.lonAxis=0 
    101         crs.latAxis=1 
    102         crs.timeAxis=3 
    103          
    104          
    105         #define rotated_latitude_longitude_undefined surface CRS (test) 
    106         crs=CRSystem(srsName='ndg:crs:undefined_rlonrlatt', axes =['grid_longitude', 'grid_latitude','tba', 'time']) 
    107         self.pseudosystems['ndg:crs:undefined_rlonrlatt']=crs 
    108         crs.lonAxis=0 
    109         crs.latAxis=1 
    110         crs.timeAxis=3 
     98        #crs=CRSystem(srsName='ndg:crs:rlonrlatsurft', axes =['grid_longitude', 'grid_latitude','surface', 'time']) 
     99        #self.systems['ndg:crs:rlonrlatsurft']=crs 
     100        #crs.lonAxis=0 
     101        #crs.latAxis=1 
     102        #crs.timeAxis=3 
     103         
     104         
     105        ##define rotated_latitude_longitude_undefined surface CRS (test) 
     106        #crs=CRSystem(srsName='ndg:crs:undefined_rlonrlatt', axes =['grid_longitude', 'grid_latitude','tba', 'time']) 
     107        #self.pseudosystems['ndg:crs:undefined_rlonrlatt']=crs 
     108        #crs.lonAxis=0 
     109        #crs.latAxis=1 
     110        #crs.timeAxis=3 
    111111         
    112112        #define unknown 2D CRS: 
     
    235235        axisorder=[] 
    236236        crs =None 
    237         crsMap=[] 
    238          
     237        crsMap=None 
     238         
     239        #stdNames is a list, but may be a list of Nones, in which case set = None. 
     240        if type(stdNames) is list: 
     241            namesok=False 
     242            for item in stdNames: 
     243                if item is not None: 
     244                    namesok=True 
     245            if namesok is False: 
     246                stdNames=None 
     247         
     248                        
     249                 
    239250        if knownCRSAxes is not None: 
    240251            for item in knownCRSAxes: 
     
    244255        if not crsMap: 
    245256            #build a map of axes and units - use std names to help! 
     257            crsMap=[] 
    246258            for axis in axes: 
    247259                unittype = None 
     
    274286                break 
    275287         
    276         if match==0:  #if couldn't find a match - generate a pseudo crs             
     288        if match==0:  #if couldn't find a match - generate a pseudo crs       
    277289            crs, axisorder=self.__generatePseudoCRS(crsMap, axes, units) 
    278290         
  • TI02-CSML/trunk/csml/csmllibs/csmlextra.py

    r3131 r3144  
    4848        '''start with aggregated envelope equal to the initialising envelope 
    4949        envelope must be of type csml.parser.EnvelopeWithTimePeriod''' 
    50         self.envelope=envelope  
    51         self.minX=self.envelope.lowerCorner.CONTENT.split()[0] 
    52         self.minY=self.envelope.lowerCorner.CONTENT.split()[1] 
    53         self.maxX=self.envelope.upperCorner.CONTENT.split()[0] 
    54         self.maxY=self.envelope.upperCorner.CONTENT.split()[1] 
    55         self.t1= strToDate(self.envelope.beginPosition.CONTENT) 
    56         self.t2= strToDate(self.envelope.endPosition.CONTENT) 
     50        self.minX=envelope.lowerCorner.CONTENT.split()[0] 
     51        self.minY=envelope.lowerCorner.CONTENT.split()[1] 
     52        self.maxX=envelope.upperCorner.CONTENT.split()[0] 
     53        self.maxY=envelope.upperCorner.CONTENT.split()[1] 
     54        self.t1= strToDate(envelope.beginPosition.CONTENT) 
     55        self.t2= strToDate(envelope.endPosition.CONTENT) 
    5756  
    5857    def _compareLowerCorners(self,lowerCorner): 
    5958        minX,minY=lowerCorner.CONTENT.split()[0],lowerCorner.CONTENT.split()[1] 
    6059        if float(minX) < float(self.minX): 
    61             self.envelope.lowerCorner.CONTENT=str(minX +' '+ self.minY) 
    6260            self.minX=minX 
    6361        if float(minY) < float(self.minY): 
    64             self.envelope.lowerCorner.CONTENT=str(self.minX +' '+ minY) 
    6562            self.minY=minY 
    6663             
     
    6865        maxX,maxY=upperCorner.CONTENT.split()[0],upperCorner.CONTENT.split()[1] 
    6966        if float(maxX) > float(self.maxX): 
    70             self.envelope.upperCorner.CONTENT=str(maxX +' '+ self.maxY) 
    7167            self.maxX=maxX 
    7268        if float(maxY) > float(self.maxY): 
    73             self.envelope.upperCorner.CONTENT=str(self.maxX +' '+ maxY) 
    7469            self.maxY=maxY 
    7570             
     
    8681    def compareEnvelope(self,envtocheck): 
    8782        '''compares new envelope, and if necessary changes the aggregated envelope.''' 
    88         if envtocheck.srsName!=self.envelope.srsName: 
    89             print 'Can currently only perform aggregation within the same spatio-temporal reference system.' 
    90             sys.exit() 
    91         else:  
    92             self._compareLowerCorners(envtocheck.lowerCorner) 
    93             self._compareUpperCorners(envtocheck.upperCorner) 
    94             self._compareLowerTimes(envtocheck.beginPosition.CONTENT) 
    95             self._compareUpperTimes(envtocheck.endPosition.CONTENT) 
     83        #if envtocheck.srsName!=self.envelope.srsName: 
     84            #print 'Skipping envelope with srs %s Can currently only perform aggregation within the same spatio-temporal reference system.'%envtocheck.srsName             
     85        #else:  
     86        self._compareLowerCorners(envtocheck.lowerCorner) 
     87        self._compareUpperCorners(envtocheck.upperCorner) 
     88        self._compareLowerTimes(envtocheck.beginPosition.CONTENT) 
     89        self._compareUpperTimes(envtocheck.endPosition.CONTENT) 
    9690     
    9791    def getAggregatedEnvelope(self): 
    98         self.envelope.beginPosition=csml.parser.csString(str(self.t1)) #convert from datetime types 
    99         self.envelope.endPosition=csml.parser.csString(str(self.t2))  
    100         return self.envelope 
     92        newenvelope=csml.parser.EnvelopeWithTimePeriod() 
     93        newenvelope.beginPosition=csml.parser.csString(str(self.t1)) #convert from datetime types 
     94        newenvelope.endPosition=csml.parser.csString(str(self.t2))  
     95        newenvelope.lowerCorner=csml.parser.csString(str(self.minX +' '+ self.minY)) 
     96        newenvelope.upperCorner=csml.parser.csString(str(self.maxX +' '+ self.maxY)) 
     97        newenvelope.srsName='WGS84' 
     98        return newenvelope 
    10199 
    102100 
     
    163161 
    164162def addBoundingBoxes(ds): 
    165     '''Adds envelop with timeperiod to each feature, currently only works on GridSeriesFeatures but extendable.''' 
     163    '''Adds envelope with timeperiod to each feature, currently only works on GridSeriesFeatures but extendable.''' 
    166164    timename='time' 
    167165    cat=csml.csmllibs.csmlcrs.CRSCatalogue() 
     
    224222    return minval,maxval 
    225223 
    226 def addEnvelope(fc, ffmap): 
    227     #adds EnvelopeWithTimePeriod to feature collection, based on the spatial extent of the features within. 
    228      
    229     #process:     
    230     #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. 
    231      
    232     #TODO, need to use the CRS catalogue to get these values 
    233     lonname='longitude' 
    234     latname='latitude' 
    235     timename='time' 
    236     srs='WGS84' 
    237     tnewmin=None 
    238     tnewmax=None 
    239         
    240     aggregator=None 
     224def addEnvelope(fc): 
     225    #adds EnvelopeWithTimePeriod to feature collection, based on the spatial extent of the features within.    
     226    aggregator =  None 
    241227    for feature in fc.featureMembers: 
    242         if type(feature) is csml.parser.GridSeriesFeature: 
    243             tmax=None 
    244             tmin=None 
    245             for ord in feature.value.gridSeriesDomain.coordTransformTable.gridOrdinates: 
    246                 if ord.coordAxisLabel.CONTENT==timename: 
    247                     try: 
    248                         tnewmin= strToDate(ord.coordAxisValues.timePositionList.CONTENT.split()[0].split('T')[0]) 
    249                         tnewmax=strToDate( ord.coordAxisValues.timePositionList.CONTENT.split()[len(ord.coordAxisValues.timePositionList.CONTENT.split())-1].split('T')[0]) 
    250                     except AttributeError: 
    251                         pass  #using xlink, so these values will be picked up elsewhere. 
    252                     if tmin ==None: 
    253                         tmin=tnewmin 
    254                     if tmax == None: 
    255                         tmax=tnewmax 
    256                     if tnewmin < tmin: 
    257                         tmin=tnewmin                     
    258                     if tnewmax > tmax: 
    259                         tmax=tnewmax                      
    260         if type(feature) is csml.parser.ProfileSeriesFeature: 
    261             tmax=None 
    262             tmin=None 
    263             for ord in feature.value.profileSeriesDomain.coordTransformTable.gridOrdinates: 
    264                 if ord.coordAxisLabel.CONTENT==timename: 
    265                     tnewmin= strToDate(ord.coordAxisValues.timePositionList.CONTENT.split()[0].split('T')[0]) 
    266                     tnewmax=strToDate( ord.coordAxisValues.timePositionList.CONTENT.split()[len(ord.coordAxisValues.timePositionList.CONTENT.split())-1].split('T')[0]) 
    267                     if tmin ==None: 
    268                         tmin=tnewmin 
    269                     if tmax == None: 
    270                         tmax=tnewmax 
    271                     if tnewmin < tmin: 
    272                         tmin=tnewmin                     
    273                     if tnewmax > tmax: 
    274                         tmax=tnewmax                      
    275                          
    276     for repfile in ffmap.getRepresentativeFiles(): 
    277         minlon=None 
    278         maxlon=None 
    279         minlat=None 
    280         maxlat=None 
    281         f=repfile.getRepresentativeFileName() 
    282         DI=csml.csmllibs.csmldataiface.DataInterface() 
    283         DI=DI.getUnknownInterfaceType(f) 
    284         DI.openFile(f) 
    285         tmpDims=DI.getListOfAxes() 
    286         if lonname in tmpDims: 
    287             DI.setAxis(lonname) 
    288             vals=DI.getDataForAxis() 
    289             minlon=str(min(vals)) 
    290             maxlon= str(max(vals)) 
    291             if latname in tmpDims: 
    292                 DI.setAxis(latname) 
    293                 vals=DI.getDataForAxis() 
    294                 minlat=str(min(vals)) 
    295                 maxlat= str(max(vals))                           
    296         else: 
    297             tmpVars=DI.getListofVariables() 
    298             if lonname in tmpVars: 
    299                 DI.setVariable(lonname) 
    300                 vals=DI.getDataForVar() 
    301                 minlon=str(min(vals)) 
    302                 maxlon= str(max(vals)) 
    303                 if latname in tmpVars: 
    304                     DI.setVariable(latname) 
    305                     vals=DI.getDataForVar() 
    306                     minlat=str(min(vals)) 
    307                     maxlat= str(max(vals)) 
    308              
    309         env=csml.parser.EnvelopeWithTimePeriod() 
    310         env.lowerCorner=csml.parser.csString(minlon + ' ' + minlat) 
    311         env.upperCorner=csml.parser.csString(maxlon + ' ' + maxlat) 
    312         env.beginPosition=csml.parser.csString(tmin) 
    313         env.endPosition= csml.parser.csString(tmax) 
    314         env.srsName=srs 
     228        env=feature.boundedBy 
    315229        if aggregator is None: 
    316230            aggregator=EnvelopeAggregator(env) 
     
    318232            aggregator.compareEnvelope(env) 
    319233    fcEnvelope=aggregator.getAggregatedEnvelope() 
    320     fcEnvelope.srsName=env.srsName   
    321234    fc.boundedBy=fcEnvelope 
    322     fc.boundedBy=env 
    323235    return fc 
    324236         
    325          
    326          
     237                 
    327238         
    328239# a couple of string cleaning functions: 
  • TI02-CSML/trunk/csml/csmllibs/csmlfeaturetypes.py

    r3089 r3144  
    115115    def __getGridCoordinatesTable(self,dimNames, crs,axisorder): 
    116116        #referenceableGrid/GridCoordinatesTable 
    117         gcT=cp.GridCoordinatesTable() 
     117        gcT=cp.GridCoordinatesTable()       
    118118        #timeHref is used to store a referencable timepositionlist for reuse 
    119119        if not hasattr(self, 'timeHref'): 
     
    226226            stdNames.append(stdname) 
    227227            unitlist.append(units)     
    228         crs, axisorder=catalogue.determineCRS(dimNames,unitlist, stdNames) 
     228        crs, axisorder=catalogue.determineCRS(dimNames,unitlist, knownCRSAxes=None, stdNames=stdNames) 
    229229        return crs, axisorder, dimNames 
    230230     
Note: See TracChangeset for help on using the changeset viewer.