source: TI02-CSML/trunk/csml/csmllibs/csmlcrs.py @ 1972

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

changed getCRS to determineCRS, now getCRS gets a known CRSystem object by name

Line 
1import string
2import cdms # just while testing
3
4class CRSystem(object):
5    def __init__(self, srsName, axes):
6        self.srsName=srsName
7        self.axes=axes
8        self.timeAxis=None
9        self.lonAxis=None
10        self.latAxis=None
11        self.srsDimension=len(self.axes)
12        self.axisLabels=''
13        for axis in self.axes:
14            self.axisLabels=self.axisLabels + axis + ' '
15
16class CRSCatalogue(object):
17    def __init__(self):
18        # dictionary to hold known CRSystems:
19        self.systems={}
20       
21        # define lon lat pressure time CRS:       
22        crs=CRSystem(srsName='ndg:crs:xypt', axes =['Lon', 'Lat','Pressure','Time'])
23        crs.lonAxis=0
24        crs.latAxis=1
25        crs.timeAxis=3
26        self.systems['ndg:crs:xypt']=crs
27       
28        # define lon lat height time CRS:       
29        crs=CRSystem(srsName='ndg:crs:xyht', axes =['Lon', 'Lat','Height','Time'])
30        crs.lonAxis=0
31        crs.latAxis=1
32        crs.timeAxis=3
33        self.systems['ndg:crs:xyht']=crs
34       
35        # define lon lat time CRS:
36        crs=CRSystem(srsName='ndg:crs:xyt', axes =['Lon', 'Lat','Time'])
37        self.systems['ndg:crs:xyt']=crs
38       
39        #define unknown CRS:
40        crs=CRSystem(srsName='ndg:crs:unknown', axes=['unknown'])
41        self.systems['ndg:crs:unknown']=crs
42   
43    def getCRS(self, srsName):
44        #given the name of a CRS e.g. 'ndg:crs:xypt' return the CRSystem object
45        try:
46            return self.systems[srsName]
47        except:
48            return self.systems['ndg:crs:unknown']
49   
50    def determineCRS(self, axes, units):
51        #given any list of axis names and a list of units for these axes attempt to determine the CRS and return the CRSystem object
52        crs=self.systems['ndg:crs:unknown']
53        if len(axes)==3:
54            #it's a 3d crs
55            for axis in axes:
56                for unit in units:
57                    if string.lower(unit) in ['second', 'seconds', 's', 'mins','minute','minutes','hour','hours','h','hr','hrs','day','days']:
58                        #unit is time
59                        return self.systems['ndg:crs:xyt']
60        elif len(axes)==4:
61            #it's a 4d crs
62            pass       
63        return crs
64       
65def main():
66    cat=CRSCatalogue()
67   
68    #test determining  various crs
69    print 'TEST 1:'
70    print '*************************************'
71    axs=['longitude', 'latitude', 'pressure', 't']
72    uns=['','','Pa','s']
73    print 'AXES: %s'%axs
74    print 'UNITS: %s'%uns
75    crs= cat.determineCRS(axes=axs, units=uns)
76    print 'srsName = %s' %crs.srsName
77    print 'srsDimension = %s' %crs.srsDimension
78    print 'axisLabels =%s' %crs.axisLabels
79    print '**************************************'
80   
81    print 'TEST 2:'
82    print '*************************************'
83    axs=['longitude', 'latitude', 't']
84    uns=['','','s'] 
85    print 'AXES: %s'%axs
86    print 'UNITS: %s'%uns
87    crs=cat.determineCRS(axes=axs, units=uns)
88    print 'srsName = %s' %crs.srsName
89    print 'srsDimension = %s' %crs.srsDimension
90    print 'axisLabels = %s' %crs.axisLabels
91   
92   
93    #test every crs in this netcdf file
94    crsdictionary={}
95    f=cdms.open('/home/dom/Desktop/SVN/trunk/csml/testfiles/gridseries/xaaqda@pxs19c1.nc')
96    for var in f.variables:
97        v=f.variables[var]
98        axes=v.getAxisIds()
99 #   print axes
100        units =[]
101        for axis in axes:
102            ax=f.getAxis(axis)
103            units.append(ax.attributes['units'])
104#    print units
105        crsdictionary[str(axes)]=units
106    #print crsdictionary
107    n=2
108    #test each definition in dictionary
109    for key in crsdictionary:
110        n=n+1
111        print 'TEST %d'%n
112        print '*************************************'
113        axs =key
114        uns=crsdictionary[key]
115        print 'AXES: %s'%axs
116        print 'UNITS: %s'%uns
117        crs= cat.determineCRS(axes=axs, units=uns)
118        print 'srsName = %s' %crs.srsName
119        print 'srsDimension = %s' %crs.srsDimension
120        print 'axisLabels =%s' %crs.axisLabels
121        print '**************************************'
122   #test getting CRS by name:
123    print 'getting ndg:crs:xypt by name'
124    crs=cat.getCRS('ndg:crs:xypt')
125    print 'srsName = %s' %crs.srsName
126    print 'srsDimension = %s' %crs.srsDimension
127    print 'axisLabels =%s' %crs.axisLabels
128    print 'time axis =%s' %crs.timeAxis
129    print 'longitude axis =%s' %crs.lonAxis
130    print 'latitude axis =%s' %crs.latAxis
131if __name__=="__main__":
132    main()
Note: See TracBrowser for help on using the repository browser.