source: TI02-CSML/trunk/csml/csmllibs/netCDFWriter.py @ 2095

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI02-CSML/trunk/csml/csmllibs/netCDFWriter.py@2095
Revision 2095, 3.0 KB checked in by domlowe, 12 years ago (diff)

more bug fixing/tidying in subsetting code

Line 
1import cdms,MV
2import csml
3import sys
4
5
6
7
8
9class NCwriter(object):
10    #This provides a simplified wrapper to CDMS to write a CF compliant NetCDF
11    def __init__(self, fileName):
12        #initiates a new NetCDF file
13        self.nc=cdms.open(fileName,'w')
14   
15    def setGlobalAttributes(self, **kwargs):
16        #sets global attributes
17        pass
18   
19    def addAxis(self,axisName, data,isLon=None,isLat=None,isTime=None,**kwargs):
20        # Now create the axis
21        print axisName
22        dataarray=MV.array(data)
23        ax=cdms.createAxis(dataarray)
24        ax.id = axisName
25        if not hasattr(self,'axes'):
26            self.axes=[]
27        if isLon is not None:
28            ax.designateLongitude()
29        elif isLat is not None:
30            ax.designateLatitude()
31        elif isTime is not None:
32            ax.designateTime()
33        for key in kwargs:
34            setattr(ax, key,kwargs[key])
35        self.axes.append(ax)
36        pass
37   
38    def addVariable(self,data, variableName,axesList,  **kwargs):
39        #creates a new variable containing data with named attributes from **kwargs
40        dataarray=MV.array(data)
41        dataarray.id=variableName
42        dataarray.name=variableName
43        for key in kwargs:
44            setattr(dataarray, key,kwargs[key])
45        axisCount=0
46        if hasattr(self, 'axes'):
47            for axis in axesList:
48                for ax in self.axes:
49                    if ax.id == axis:
50                        dataarray.setAxis(axisCount,ax)
51                        axisCount = axisCount +1
52        self.nc.write(dataarray)
53
54    def genWriteVar(self,varid, ordinates, times, calunits, caltype, axisorder, fulldata):
55        floatTimes=[]
56        for time in times:
57            time=csml.csmllibs.csmltime.getCDtime(time).torel(calunits)
58            floatTimes.append(time.value)
59        self.addAxis('time',floatTimes,isTime=1,units=calunits,calendar=caltype)
60        for ord in ordinates:
61            vals=[]
62            lon,lat=None,None
63            if ord.coordAxisLabel.CONTENT=='time':
64                continue
65            else:
66                for val in ord.coordAxisValues.coordinateList.CONTENT.split(','):
67                    if val != ' ':
68                        vals.append(float(val)) 
69            if ord.coordAxisLabel.CONTENT=='longitude':
70                lon=1
71                name='longitude'
72            elif ord.coordAxisLabel.CONTENT=='latitude':
73                lat=1
74                name='latitude'
75            else:
76                name=ord.coordAxisLabel.CONTENT
77            self.addAxis(name,vals,isLon=lon,isLat=lat,units='')#to do, units attribute for CF compliance
78        if len(ordinates)==3:
79            axes=['time',axisorder[1],axisorder[2]]
80        elif len(ordinates)==2:
81            axes=['time',axisorder[1]]
82        self.addVariable(fulldata,varid, axes,units='') #to do, units attribute for CF compliance
83               
84       
85    def closeFinishedFile(self):
86        #returns finished (hopefully) NetCDF file
87        self.nc.close()
Note: See TracBrowser for help on using the repository browser.