Changeset 982


Ignore:
Timestamp:
23/05/06 15:06:13 (13 years ago)
Author:
domlowe
Message:

Subset GridSeries? feature to another smaller GridSeries? feature working. Returns netcdf and csml files

Location:
TI02-CSML/trunk/parser
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • TI02-CSML/trunk/parser/apiDemo.py

    r978 r982  
    3333    spatialSubsetDictionary['latitude']=(0.,10.0) 
    3434    spatialSubsetDictionary['longitude']=(90, 120.0) 
    35     subsetCSML=feature.subsetToGridSeries(timeSelection, **spatialSubsetDictionary) 
     35    subsetCSML, subsetNetCDF=feature.subsetToGridSeries(timeSelection, **spatialSubsetDictionary) 
    3636    print subsetCSML 
     37    print subsetNetCDF 
    3738    #try and call the test method on different types of feature 
    3839#  
  • TI02-CSML/trunk/parser/csmldoc.py

    r977 r982  
    77from Parser import * #import parser into same namespace 
    88import parser_extra 
     9from Scientific.IO.NetCDF import *  #use this instead of cdms for now for it's simple write interface.. 
     10from Numeric import * 
    911 
    1012#import the DataInterface module from the Scanner, assumes it is in a sibling directory to the one containing csmlio.py 
     
    215217 
    216218    def subsetToGridSeries(self, timeSubset,  **kwargs): 
    217         domainref = self.__getDomainReference() 
    218         filelog=[] 
     219        pathToSubsetCSML = 'temp.xml' 
     220        pathToSubsetNetCDF='temp.nc' 
     221        domainref = self.__getDomainReference()  
    219222        self.times=timeSubset 
    220223        self.files=[] 
     224        strTimes='' 
    221225        fulldata=None 
    222226        for time in self.times: 
    223227            listPosition=domainref['t'].split().index(time) 
     228            strTimes= strTimes + ' ' + time  
    224229            for comp in self.parsedFeature.rangeSet.aggregatedArray.component: 
    225230                var = comp.variableName 
     
    227232                data=f.getVariableData(var, **kwargs) 
    228233                self.files.append(comp.fileName.split()[listPosition]) 
    229                 filelog.append(comp.fileName.split()[listPosition]) #needed? 
    230234                if fulldata is None: 
    231235                    fulldata = data.tolist() 
     
    233237                    for item in data.tolist(): 
    234238                        fulldata.append(item) 
    235         ###### create the csml document ############### 
    236         output_file='temp.xml' 
    237         dset = self.parentDataset 
    238         dset.featureCollection.members=[]# clear out all the existing features 
    239         dset.arrayDescriptors=[] 
    240         strTimes ='' 
    241         for time in self.times: 
    242             strTimes= strTimes + ' ' + time  
    243         self.parsedFeature.domain.domainReference=TimePositionList(timePositions=strTimes) 
    244         strFiles='' 
    245         for file in self.files: 
    246             strFiles= strFiles + ' ' + file 
    247         #print dir(feat.rangeSet.aggregatedArray.component) 
    248         for comp in self.parsedFeature.rangeSet.aggregatedArray.component: 
    249             comp.fileName=strFiles 
    250         dset.featureCollection.members.append(self.parsedFeature) 
    251         csml = dset.toXML()     
    252         #Tidy up and print the CSML document: 
    253         #strCSML= parseString(tostring(csml)).toprettyxml() 
     239         
     240        ### create csml document#### 
     241        domain=GridSeriesDomain() 
     242        domain.domainReference=TimePositionList(timePositions=strTimes)  
     243        grid=Grid() 
     244        dc = self.__getDomainComplement() 
     245        ordinates= [] 
     246        i=0 
     247        valueStore=[]  # use the values again later to generate netcdf 
     248        for key in dc.keys(): 
     249            i=i+1 
     250            god=GridOrdinateDescription() 
     251            god.gridAxesSpanned='dim%s'%i 
     252            god.sequenceRule='+x+y+z' 
     253            god.definesAxis=key 
     254            straxisValues='' 
     255            if key in kwargs: 
     256                for val in dc[key]: 
     257                    if val >= kwargs[key][0]: 
     258                        if val <= kwargs[key] [1]: 
     259                            straxisValues=straxisValues+ str(val) + ', ' 
     260            else: # this dimension has not been subsetted 
     261                for val in dc[key]: 
     262                    straxisValues=straxisValues+ str(val) + ', ' 
     263            god.axisValues=straxisValues[:-2] 
     264            ordinates.append(god) 
     265        grid.ordinates=ordinates 
     266        domain.domainComplement=grid 
     267        rangeSet=RangeSet() 
     268        rangeSet.arrayDescriptor=NetCDFExtract(fileName='f',variableName='v',arraySize='as') 
     269        feat=FeatureBuilder() 
     270        subsetCSML=feat.makeGridSeries(domain,rangeSet) 
     271 
     272        #### write csml document ##### 
     273        output=open(pathToSubsetCSML,'w') 
     274        output.write(subsetCSML) 
     275        output.close() 
     276 
     277        ### create and write netcdf#### 
     278        ncfile=NetCDFFile(pathToSubsetNetCDF,'w') 
     279        # create the dimensions         
     280        ncfile.createDimension ( 'time', len(timeSubset)) 
     281        time_var = ncfile.createVariable ( 'time', Float, ('time',) ) 
     282        time_var.longname = 'time' 
     283        floatTimes=[] 
     284        for time in timeSubset: 
     285            floatTimes.append(5) # NEED TO CONVERT 'back' from string to standard julian day.. . 
     286        time_var[:] =floatTimes[:] 
     287 
     288        for ordinate in ordinates: 
     289            ncfile.createDimension(ordinate.definesAxis, len(ordinate.axisValues.split()))  
     290            item_var = ncfile.createVariable (ordinate.definesAxis, Float, (ordinate.definesAxis,) ) 
     291            #convert to list 
     292            vals=[] 
     293            for val in ordinate.axisValues.split(','): 
     294                vals.append(float(val)) 
     295            ordinate.axisValues=vals 
     296            item_var[:]=vals[:] 
     297            print ordinate.definesAxis 
     298        #this needs rethinking. 
     299        if len(ordinates)==3: 
     300            feature_var = ncfile.createVariable (self.parsedFeature.id, Float, ('time',ordinates[1].definesAxis,ordinates[0].definesAxis,ordinates[2].definesAxis)) 
     301        elif len(grid.ordinates)==2: 
     302            feature_var = ncfile.createVariable (self.parsedFeature.id, Float, ('time',ordinates[1].definesAxis,ordinates[0].definesAxis)) 
     303        print shape(feature_var) 
     304        print shape(fulldata) 
     305        feature_var[:]=fulldata[:] 
     306        ncfile.close() 
     307 
     308        return pathToSubsetCSML, pathToSubsetNetCDF 
     309 
     310 
     311 
     312class FeatureBuilder: 
     313    def makeGridSeries(self,domain,rangeSet): 
     314        fms=[] #empty featureMembers list 
     315        dset=Dataset() 
     316        feat=GridSeriesFeature() 
     317        feat.id= '??' 
     318        feat.description=Description('???') 
     319        feat.domain=domain 
     320        feat.rangeSet=rangeSet 
     321        fms.append(feat) 
     322        fc=FeatureCollection(members=fms) 
     323        #Create an Empty Dataset 
     324        ds = Dataset() 
     325        #Set objects as attributes of dataset 
     326        setattr(ds,'id','TestDataSet')   
     327        #setattr(ds, 'metaDataProperty', [md]) 
     328        setattr(ds, 'featureCollection',fc) 
     329        #call the toXML method of the Dataset object: 
     330        csml = ds.toXML() 
    254331        strCSML=parser_extra.PrettyPrint(csml) 
    255332        strCSML=parser_extra.removeInlineNS(strCSML) 
    256         print strCSML 
    257         ################################ 
     333        return strCSML 
    258334         
    259         ######create the netcdf file ############# 
    260         ################################ 
    261          
    262         return output_file 
    263  
    264         #self.writeNetCDF(var, timeSubset,fulldata,**kwargs) 
    265         #self.writeCSML(var, timeSubset,fulldata,**kwargs) 
    266  
    267     def testMethod(self): 
    268         """Over writes abstract testMethod""" 
    269         print 'underlying feature type:' + str(self.parsedFeature) 
    270         return 'abstract test method overwritten by CSMLGridSeriesFeature class' 
    271      
    272 # etc.. do same for all features 
Note: See TracChangeset for help on using the changeset viewer.