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

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

subsettign gridseries to pointseries 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        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, **kwargs):
55        #**kwargs may contain additional axes not contained in a GridCoordinatesTable - e.g latitude, longitude may be stored in other attribute not in the rectified grid.     
56        axesdone=[]
57       
58        floatTimes=[]
59        for time in times:
60            time=csml.csmllibs.csmltime.getCDtime(time).torel(calunits)
61            floatTimes.append(time.value)
62        self.addAxis('time',floatTimes,isTime=1,units=calunits,calendar=caltype)
63        axesdone.append('time')
64        if ordinates is not None:
65            for ord in enumerate(ordinates):
66                vals=[]
67                lon,lat=None,None
68                if ord[1].coordAxisLabel.CONTENT=='time':
69                    continue
70                else:
71                    for val in ord[1].coordAxisValues.coordinateList.CONTENT.split(','):
72                        if val != ' ':
73                            vals.append(float(val)) 
74                if ord[1].coordAxisLabel.CONTENT=='longitude':
75                    lon=1
76                    name='longitude'
77                elif ord[1].coordAxisLabel.CONTENT=='latitude':
78                    lat=1
79                    name='latitude'
80                else:
81                    name=ord[1].coordAxisLabel.CONTENT
82                for ax in enumerate(axisorder):
83                    if ax[1]==name:
84                        position=ax[0]
85                axesdone.append(name)
86                self.addAxis(name,vals,isLon=lon,isLat=lat,units=unitlist[position])#to do, units attribute for CF compliance
87       
88        if kwargs is not None:
89            print 'handling extra'         
90            for kw in kwargs:
91                lon,lat=None,None
92                if kw=='longitude':
93                    lon=1
94                elif kw == 'latitude':
95                    lat=1
96                name = kw
97                for ax in enumerate(axisorder):
98                    if ax[1]==name:
99                        position=ax[0]
100                vals=(kwargs[kw],)
101                self.addAxis(name,vals,isLon=lon,isLat=lat,units=unitlist[position])
102                axesdone.append(name)
103           
104        print 'Axesdone:'
105        print axesdone
106               
107        self.addVariable(fulldata,varid, axisorder, fillvalue, units=unitlist[-1] ) #to do, units attribute for CF compliance
108       
109    def closeFinishedFile(self):
110        #returns finished (hopefully) NetCDF file
111        self.nc.close()
Note: See TracBrowser for help on using the repository browser.