source: cows/trunk/cows/service/imps/data_reader_geoplot_backend/data_readers/modis_file_reader.py @ 5682

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/cows/trunk/cows/service/imps/data_reader_geoplot_backend/data_readers/modis_file_reader.py@5682
Revision 5682, 4.4 KB checked in by pnorton, 11 years ago (diff)

Tidied up the datareader geoplot layer slabs so that there is only one class now, there was so little code in the style specific slabs that there seemed little point in keeping them.

Implemented a Modis file reader that reads and extracts a number of layers from a modis file on the filesystem. Currently the generated images appear to be the wrong way up but I can't find out why.

Line 
1import cdms2 as cdms
2import numpy as N
3
4import logging
5
6from cows.service.imps.data_reader_geoplot_backend.data_readers.mosid_config import config
7
8modis_file_path = '/data/pnorton/qesdi_data/modis/modis_data/MCD12Q1_10min/MODIS_classification_IGBP.nc'
9
10log = logging.getLogger(__name__)
11
12class ModisFileReader(object):
13   
14    def __init__(self, fileoruri):
15       
16        if fileoruri != config['modis_variable']:
17            raise Exception("Unknown fileoruri value, fileoruri=%s, modis_var_name=%s" % (fileoruri, modis_var_name))
18       
19        self.fileoruri = fileoruri
20        fin = cdms.open(config['modis_file'])
21        self.var = fin(config['modis_variable'])
22        fin.close()
23       
24    def getWMSLayerInfo(self):
25       
26        name = 'landtype_common'
27        title = 'Common Land Type'
28        abstract = 'The most common land type in the area'
29        dimensions = {}
30        units = 'land usage index'
31        #!TODO: check the CRS
32        crss = ['CRS:84']
33        bb = self._getBBox()
34 
35        yield (name, title, abstract, dimensions, units, crss, bb) 
36       
37        for i in range(16):
38            name = "landtype_%s" % (i,)
39            title = 'Land Type index %s'  % (i,) 
40            abstract = 'The proportion of the area of land type index %s'  % (i,)
41           
42            yield (name, title, abstract, dimensions, units, crss, bb)
43           
44
45   
46    def _getBBox(self):
47        try: 
48            latBounds = self.var.getLatitude().getBounds()
49            lonBounds = self.var.getLongitude().getBounds()
50           
51            bb = [lonBounds.min(), latBounds.min(), lonBounds.max(), latBounds.max()]
52        except:
53            log.exception("Exception occurred retriving bounds:")
54           
55            #default to global
56            bb=[-180,-90,180,90]
57        return bb       
58
59
60    def getNetcdfVar(self, name,  dimValues):
61        "Opens up the csml and retrieves the variable described by the dimensions"
62       
63        convertedDimVals = self._convertDimValues(dimValues)
64       
65        if name == 'landtype_common':
66            var = self._getLandtypeCommon(convertedDimVals)
67       
68        elif name.find('landtype_') == 0:
69           
70           
71            indexStr = name[len('landtype_'):]
72           
73            try:
74                index = int(indexStr)
75            except:
76                raise Exception("Error converting %s to an int, name = %s" % (indexStr, name))
77           
78            var = self._getVarNumber(convertedDimVals, index)
79                 
80       
81        else:
82            raise Exception("Unknown layer name %s" % (name,))
83       
84     
85        latMin = var.getLatitude().getBounds()[0].min()
86        latMax =  var.getLatitude().getBounds()[-1].max()
87        lonMin = var.getLongitude().getBounds()[0].min()
88        lonMax =  var.getLongitude().getBounds()[-1].max()
89        nLat = len(var.getLatitude())
90        nLon = len(var.getLongitude())
91       
92        log.debug("var: latMin = %s, latMax = %s, lonMin = %s, lonMax = %s, nLat = %s, nLon = %s" % (latMin, latMax, lonMin, lonMax, nLat, nLon))
93        log.debug("var: getAxisIds = %s, shape=%s" % (var.getAxisIds(), var[:].shape))   
94               
95               
96        return var
97   
98       
99    def _convertDimValues(self, dimValues):
100        """
101        Converts the string dimension values to floats (except for time values)
102        """
103        convertedVals = {}
104       
105        for dimval in dimValues:
106            if dimval != 'time':
107                convertedVals[dimval]=float(dimValues[dimval])
108            else:
109                #remove any trailing Zs from time string
110                if dimValues[dimval] [-1:] in ['Z', 'z']:
111                    convertedVals[dimval]=dimValues[dimval][:-1]
112                else:
113                    convertedVals[dimval] = dimValues[dimval] 
114
115        return convertedVals
116   
117    def _getLandtypeCommon(self, convertedDimValues):
118       
119        arr = self.var[:].argmax(2)
120        common_var = cdms.createVariable(arr, axes=self.var.getAxisList()[0:2], fill_value=0.0)
121        return common_var
122       
123    def _getVarNumber(self, convertedDimValues, varIndex):
124        var_n = self.var(index=varIndex, squeeze=True)
125        var_n.set_fill_value(0.0)
126        return var_n
127       
128   
129    @staticmethod
130    def isDataPresent(fileoruri):
131       
132        if config['modis_variable'] == None:
133            return False
134        else:
135            return fileoruri == config['modis_variable']
Note: See TracBrowser for help on using the repository browser.