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

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

fixed bug with axis ordering

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        dataarray=MV.array(data)
22        ax=cdms.createAxis(dataarray)
23        ax.id = axisName
24        if not hasattr(self,'axes'):
25            self.axes=[]
26        if isLon is not None:
27            ax.designateLongitude()
28        elif isLat is not None:
29            ax.designateLatitude()
30        elif isTime is not None:
31            ax.designateTime()
32        for key in kwargs:
33            setattr(ax, key,kwargs[key])
34        self.axes.append(ax)
35        pass
36   
37    def addVariable(self,data, variableName,axesList, fillvalue,  **kwargs):       
38        #creates a new variable containing data with named attributes from **kwargs
39        dataarray=MV.array(data)
40        dataarray.id=variableName
41        dataarray.name=variableName
42        for key in kwargs:
43            setattr(dataarray, key,kwargs[key])
44        axisCount=0
45        if hasattr(self, 'axes'):
46            for axis in axesList:
47                for ax in self.axes:
48                    if ax.id == axis:
49                        dataarray.setAxis(axisCount,ax)
50                        axisCount = axisCount +1
51        setattr(dataarray, 'missing_value' ,fillvalue)
52        self.nc.write(dataarray)
53
54    def genWriteVar(self,varid, ordinates, times, calunits, caltype, axisorder, unitlist, fulldata, fillvalue):
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 enumerate(ordinates):
61            vals=[]
62            lon,lat=None,None
63            if ord[1].coordAxisLabel.CONTENT=='time':
64                continue
65            else:
66                for val in ord[1].coordAxisValues.coordinateList.CONTENT.split(','):
67                    if val != ' ':
68                        vals.append(float(val)) 
69            if ord[1].coordAxisLabel.CONTENT=='longitude':
70                lon=1
71                name='longitude'
72            elif ord[1].coordAxisLabel.CONTENT=='latitude':
73                lat=1
74                name='latitude'
75            else:
76                name=ord[1].coordAxisLabel.CONTENT
77            for ax in enumerate(axisorder):
78                if ax[1]==name:
79                    position=ax[0]
80            self.addAxis(name,vals,isLon=lon,isLat=lat,units=unitlist[position])#to do, units attribute for CF compliance
81        self.addVariable(fulldata,varid, axisorder, fillvalue, units=unitlist[-1] ) #to do, units attribute for CF compliance
82       
83    def closeFinishedFile(self):
84        #returns finished (hopefully) NetCDF file
85        self.nc.close()
Note: See TracBrowser for help on using the repository browser.