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

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

units and missing values now working properly in subsetgridseries

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, fillvalue,  **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        setattr(dataarray, 'missing_value' ,fillvalue)
53        self.nc.write(dataarray)
54
55    def genWriteVar(self,varid, ordinates, times, calunits, caltype, axisorder, unitlist, fulldata, fillvalue):
56        floatTimes=[]
57        for time in times:
58            time=csml.csmllibs.csmltime.getCDtime(time).torel(calunits)
59            floatTimes.append(time.value)
60        self.addAxis('time',floatTimes,isTime=1,units=calunits,calendar=caltype)
61        for ord in ordinates:
62            vals=[]
63            lon,lat=None,None
64            if ord.coordAxisLabel.CONTENT=='time':
65                continue
66            else:
67                for val in ord.coordAxisValues.coordinateList.CONTENT.split(','):
68                    if val != ' ':
69                        vals.append(float(val)) 
70            if ord.coordAxisLabel.CONTENT=='longitude':
71                lon=1
72                name='longitude'
73            elif ord.coordAxisLabel.CONTENT=='latitude':
74                lat=1
75                name='latitude'
76            else:
77                name=ord.coordAxisLabel.CONTENT   
78            self.addAxis(name,vals,isLon=lon,isLat=lat,units=unitlist[axisorder.index(name)])#to do, units attribute for CF compliance
79        self.addVariable(fulldata,varid, axisorder, fillvalue, units=unitlist[-1] ) #to do, units attribute for CF compliance
80               
81       
82    def closeFinishedFile(self):
83        #returns finished (hopefully) NetCDF file
84        self.nc.close()
Note: See TracBrowser for help on using the repository browser.