source: TI02-CSML/trunk/Scanner/csmllibs/csmlfeaturetypes.py @ 679

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI02-CSML/trunk/Scanner/csmllibs/csmlfeaturetypes.py@744
Revision 679, 26.7 KB checked in by domlowe, 14 years ago (diff)

typo removed from url. GridSeriesDomain?/rangeset heirarchy fixed

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1#!/usr/bin/env python
2#**************************************************************************************
3#csmlfeaturetypes.py
4#For creating CSML featuretypes
5#v0.5 split off 11th November 2005
6#Dominic Lowe, BADC
7#**************************************************************************************
8
9import csmllibs
10
11
12
13class featureBuilder:
14    def __init__(self, csmldoc, dataset_element, gml_FeatureCollection_element,extractType, extractPrefix, ffmap,fileExtractDictionary, timedim):
15        self.csml=csmldoc
16        self.ds_element=dataset_element
17        self.gml_FeatureCollection_element = gml_FeatureCollection_element
18        self.extractType = extractType
19        self.extractPrefix = extractPrefix
20        self.ffmap = ffmap
21        self.fileExtractDictionary = fileExtractDictionary
22        self.timedim = timedim
23        #at the moment, only one featuretype per CSML Dataset is supported.
24        #get the featuretype of the first representative file in the ffmap object
25        self.featuretype=  self.ffmap.getRepresentativeFiles()[0].getFeatureType()
26       
27        print "FEATURETYPE: " + str(self.featuretype)
28        if self.featuretype == 'GridSeriesFeature':
29            self.createCSMLGridSeriesFeatures()
30        elif self.featuretype == 'PointSeriesFeature':       
31            self.createCSMLPointSeriesFeatures()
32       
33       
34    def createCSMLGridSeriesFeatures(self):
35        #This function is for model data and assumes that the variables (features) are shared across identically structured files
36        #in the same directory.
37        #should be supplied with a featurefilemap object (see csmlfiles for FileMapMaker), with a onetomany file map relationship.(not necessarily one to many)
38       
39        representativeFiles=self.ffmap.getRepresentativeFiles()
40        for repfile in representativeFiles:
41            listOfFiles=[]
42            repfilename=repfile.getRepresentativeFileName()
43            listOfFiles.append(repfilename)
44            relfiles = repfile.getRelatedFiles()
45            for f in relfiles:
46                fname = f.getRelatedFileName()
47                listOfFiles.append(fname)
48               
49            #THIS IS THE REALLY SLOW FUNCTION CALL!!!!!#########################
50            OrderedFileTimeList = csmllibs.csmltime.getFileTimeList(listOfFiles,self.timedim)
51            #build strings to hold times/filenames for current gridseriesfeature
52            timeString =''
53            filesinDir = ''
54            for j in range (0, len(OrderedFileTimeList)):
55                t= OrderedFileTimeList[j][0]
56                f = OrderedFileTimeList[j][1]
57                timeString = timeString + ' ' + str(t)
58                filesinDir = filesinDir + ' ' + f
59                #Open representative file and create feature members:
60            DI = csmllibs.csmldataiface.DataInterface()
61            DI=DI.getUnknownInterfaceType(repfilename)
62            DI.openFile(repfilename)
63            allVarNames=DI.getListofVariables()
64            numFeatures=len(allVarNames)
65            for i in range(0, numFeatures):
66                print allVarNames[i]
67                DI.setVariable(allVarNames[i])
68                dimNames=DI.getVariableAxes()
69                if len(dimNames) <= 2:
70                    #it's an axis or bounds not a feature, try next variable
71                    continue
72                gml_featureMember_element=self.csml.createElement("gml:featureMember")
73                GridSeriesFeature_element=self.csml.createElement("GridSeriesFeature")
74                GridSeriesFeature_element.setAttribute('gml:id',allVarNames[i])
75                gml_description_element = self.csml.createElement("gml:description")
76                #need to get the attribute called long_name (?? TODO - is this CF compliant??)
77                #use Ag's getbestname from nappy package?
78                try:
79                    desc=DI.getVariableAttribute('long_name')
80                    print desc
81                except AttributeError:
82                    desc = "missing name"
83                gml_description_element.appendChild(self.csml.createTextNode(str(desc)))
84                GridSeriesFeature_element.appendChild(gml_description_element)
85                #***********************************************************************
86                #GridSeriesDomain:
87                #***********************************************************************
88                GridSeriesDomain_element=self.csml.createElement("GridSeriesDomain")
89                #***********************************************************************
90                # gml:coverageFunction element (and sub-element MappingRule)
91                #***********************************************************************
92                gml_coverageFunction_element=self.csml.createElement("gml:coverageFunction")
93                MappingRule_element=self.csml.createElement("MappingRule")
94                MappingRule_element.setAttribute('scanOrder',csmllibs.csmlextra.getMappingRule(len(dimNames)))
95                gml_coverageFunction_element.appendChild(MappingRule_element)
96                #***********************************************************************
97                # gml:rangeSet element (and sub-elements)
98                #***********************************************************************
99                gml_rangeSet_element=self.csml.createElement("gml:rangeSet")
100                AggregatedArray_element=self.csml.createElement("AggregatedArray")
101                arraySize_element=self.csml.createElement("arraySize")
102                #arrSz = getArraySize(var)
103                arrSz = DI.getArraySizeOfVar()
104                arraySize_element.appendChild(self.csml.createTextNode(str(arrSz)))
105                uom_element=self.csml.createElement("uom")
106                try:
107                    #strUom = var.units
108                    strUom = DI.getVariableAttribute('units')
109                except AttributeError:
110                    #if units attribute doesn't exist:
111                    strUom ="dimensionless or units not determined"
112                uom_element.appendChild(self.csml.createTextNode(strUom))
113                AggregatedArray_element.appendChild(uom_element)
114                aggType_element=self.csml.createElement("aggType")
115                aggType_element.appendChild(self.csml.createTextNode('new'))
116                aggIndex_element=self.csml.createElement("aggIndex")
117                aggIndex_element.appendChild(self.csml.createTextNode('1'))
118                AggregatedArray_element.appendChild(arraySize_element)
119                AggregatedArray_element.appendChild(aggType_element)
120                AggregatedArray_element.appendChild(aggIndex_element)
121                component_element=self.csml.createElement("component")
122                #FileExtract element will be NetCDF/GRIB/PPExtract element (As defined earlier in ExtractType)
123                FileExtract_element=self.csml.createElement(self.extractType)
124                arraySize_element=self.csml.createElement("arraySize")
125                #varSize =var.shape
126                varSize=DI.getShapeOfVar()
127                arraySize_element.appendChild(self.csml.createTextNode(csmllibs.csmlextra.cleanString1(str(varSize))))
128                FileExtract_element.appendChild(arraySize_element)
129                fileName_element=self.csml.createElement("fileName")
130                FileExtract_element.appendChild(fileName_element)
131                #This is the problem: too many filenames >>templating/wildcard needed
132                #fileName_element.appendChild(csmldoc.createTextNode(cleanString2(str(allFileNames))))
133                #fileName_element.appendChild(csmldoc.createTextNode("WILDCARDNEEDED"))
134                #fileName_element.appendChild(csmldoc.createTextNode(os.path.dirname(templateFileList[k]) + '/*'))
135                fileName_element.appendChild(self.csml.createTextNode(filesinDir))
136                variableName_element=self.csml.createElement("variableName")
137                variableName_element.appendChild(self.csml.createTextNode(allVarNames[i]))
138                FileExtract_element.appendChild(variableName_element)
139                component_element.appendChild(FileExtract_element)
140                AggregatedArray_element.appendChild(component_element)
141                gml_rangeSet_element.appendChild(AggregatedArray_element)
142                ##############################################
143                #***********************************************************************
144                # domainReference element (and sub-elements)           
145                #***********************************************************************
146                domainReference_element=self.csml.createElement("domainReference")
147                gml_timePositionList_element = self.csml.createElement("gml:TimePositionList")
148                gml_timePositionList_element.appendChild(self.csml.createTextNode(timeString))
149                domainReference_element.appendChild(gml_timePositionList_element)
150                #***********************************************************************
151                #***********************************************************************
152                # domainComplement element (and sub-elements)
153                #***********************************************************************
154                domainComplement_element=self.csml.createElement("domainComplement")
155                Grid_element=self.csml.createElement("Grid")
156                #need to get no. of spatial dimensions (corresponds to axis in domainComplement)
157                numSpDims=len(varSize) -1
158                #numSpDims = len(var.shape) - 1 #assuming one dimension is non-spatial (time)
159                Grid_element.setAttribute('srsName', 'urn:SomeProjection')
160                Grid_element.setAttribute( 'srsDimension', str(numSpDims))
161                Grid_element.setAttribute('dimension' ,str(numSpDims))
162                gml_GridEnvelope_element=self.csml.createElement("gml:GridEnvelope")
163                gml_limits_element=self.csml.createElement("gml:limits")
164                gml_low_element=self.csml.createElement("gml:low")
165                gml_high_element=self.csml.createElement("gml:high")
166                lowLimits=DI.getLowLimits()
167                highLimits=DI.getHighLimits()
168                gml_low_element.appendChild(self.csml.createTextNode(lowLimits))
169                gml_high_element.appendChild(self.csml.createTextNode(highLimits))
170                gml_GridEnvelope_element.appendChild(gml_low_element)
171                gml_GridEnvelope_element.appendChild(gml_high_element)
172                gml_limits_element.appendChild(gml_GridEnvelope_element)
173                Grid_element.appendChild(gml_limits_element)
174                #add an axisName element for  each spatial dimension.
175                for i in range (1, len(dimNames)):
176                    gml_axisName_element=self.csml.createElement("gml:axisName")
177                    gml_axisName_element.appendChild(self.csml.createTextNode("dim" + str(i)))
178                    Grid_element.appendChild(gml_axisName_element)
179               
180                #Add ordinate element and sub elements:
181                for i in range (1, len(dimNames)):
182                    ordinate_element=self.csml.createElement("ordinate")
183                    gridAxesSpanned_element=self.csml.createElement("gridAxesSpanned")
184                    gridAxesSpanned_element.appendChild(self.csml.createTextNode("dim" + str(i)))
185                    sequenceRule_element=self.csml.createElement("sequenceRule")
186                    sequenceRule_element.appendChild(self.csml.createTextNode(csmllibs.csmlextra.getSeqRule(len(dimNames))))
187                    definesAxis_element=self.csml.createElement("definesAxis")
188                    dimName = dimNames[len(dimNames)-i]
189                    definesAxis_element.appendChild(self.csml.createTextNode(dimName))
190                    axisValues_element=self.csml.createElement("axisValues")
191                    #look up file extract name in dictionary
192                    #(axisid stored in dictionary = current filename + variable name)
193                    axisid = repfilename + dimName
194                    axisValues = self.fileExtractDictionary[axisid]
195                    axisValues_element.appendChild(self.csml.createTextNode(axisValues))
196                    ordinate_element.appendChild(gridAxesSpanned_element)
197                    ordinate_element.appendChild(sequenceRule_element)
198                    ordinate_element.appendChild(definesAxis_element)
199                    ordinate_element.appendChild(axisValues_element)
200                    Grid_element.appendChild(ordinate_element)
201                   
202                domainComplement_element.appendChild(Grid_element)
203                GridSeriesDomain_element.appendChild(domainReference_element)
204                GridSeriesDomain_element.appendChild(domainComplement_element)
205                GridSeriesFeature_element.appendChild(GridSeriesDomain_element)
206                GridSeriesFeature_element.appendChild(gml_rangeSet_element)
207                GridSeriesFeature_element.appendChild(gml_coverageFunction_element)
208                gml_featureMember_element.appendChild(GridSeriesFeature_element)
209                self.gml_FeatureCollection_element.appendChild(gml_featureMember_element)
210            DI.closeFile()
211                       
212
213#########################################################################
214
215
216    def createCSMLProfileFeature(csmldoc, dataset_element, gml_FeatureCollection_element,  ffmap, timedim):
217            representativeFiles=ffmap.getRepresentativeFiles()
218            listOfFiles=[]
219            for repfile in representativeFiles:
220                    repfilename=repfile.getRepresentativeFileName()
221                    listOfFiles.append(repfilename)
222                    relfiles = repfile.getRelatedFiles()
223                    for f in relfiles:
224                            #hopefully there are no related files at the moment!
225                            fname = f.getRelatedFileName()
226                            listOfFiles.append(fname)
227                    print listOfFiles
228                   
229            for file in listOfFiles:
230                    DI = csmllibs.csmldataiface.DataInterface()
231                    DI=DI.getUnknownInterfaceType(file)
232                    print'opening file'
233                    DI.openFile(file)
234                    print 'getting variables'
235                    allVarNames=DI.getListofVariables()
236                    print 'getting feature count'
237                    numFeatures=len(allVarNames)       
238                   
239                    print "FEATURES"
240                    print "***********"
241                    for i in range (0, len(allVarNames)):
242                            print allVarNames[i]
243                           
244                    for i in range (0, numFeatures):
245                            gml_featureMember_element=csmldoc.createElement("gml:featureMember")
246                            ProfileFeature_element=csmldoc.createElement("ProfileFeature")
247                            ProfileFeature_element.setAttribute('gml:id',str(allVarNames[i]))
248                            gml_description_element = csmldoc.createElement("gml:description")
249                            gml_featureMember_element.appendChild(ProfileFeature_element)
250                            #***********************************************************************
251                            #PointSeriesDomain:
252                            #***********************************************************************
253                            ProfileDomain_element=csmldoc.createElement("ProfileDomain")
254                           
255                           
256                            #***********************************************************************
257                            # domainReference element (and sub-elements)               
258                            #***********************************************************************
259                            domainReference_element=csmldoc.createElement("domainReference")
260                            #orientedPosition_element=csmldoc.createElement("OrientedPosition")
261                            #locations_element=csmldoc.createElement("locations")
262                            #times_element=csmldoc.createElement("times")
263                            #trajectory_element.appendChild(locations_element)
264                            #trajectory_element.appendChild(times_element)
265                            #domainReference_element.appendChild(orientedPosition_element)
266                           
267                            #gml_timePositionList_element = csmldoc.createElement("gml:TimePositionList")
268                            #gml_timePositionList_element.appendChild(csmldoc.createTextNode(timeString))
269                            #domainReference_element.appendChild(gml_timePositionList_element)
270                            ProfileDomain_element.appendChild(domainReference_element)
271                            #***********************************************************************
272                            domainComplement_element=csmldoc.createElement("domainComplement")
273                            ProfileDomain_element.appendChild(domainComplement_element)
274                           
275                            #***********************************************************************
276                            # gml:rangeSet_element
277                            #***********************************************************************
278                           
279                            gml_rangeSet_element=csmldoc.createElement("gml:rangeSet") 
280                           
281                            #***********************************************************************
282                            # gml:coverageFunction element (and sub-element MappingRule)               
283                            #***********************************************************************
284                            gml_coverageFunction_element=csmldoc.createElement("gml:coverageFunction")
285                            MappingRule_element=csmldoc.createElement("MappingRule")
286                            #MappingRule_element.setAttribute('scanOrder',csmllibs.csmlextra.getMappingRule(len(dimNames)))
287                            MappingRule_element.setAttribute('scanOrder','tba')
288                            gml_coverageFunction_element.appendChild(MappingRule_element)
289                           
290                           
291                            gml_featureMember_element.appendChild(ProfileDomain_element)
292                            gml_featureMember_element.appendChild(gml_rangeSet_element)
293                            gml_featureMember_element.appendChild(gml_coverageFunction_element)
294                            gml_FeatureCollection_element.appendChild(gml_featureMember_element)       
295                           
296            return csmldoc, dataset_element, gml_FeatureCollection_element
297                           
298    #def createCSMLPointFeatures(csmldoc, dataset_element, #gml_FeatureCollection_element,filename, timedim):
299            #csmldoc  = csml instance doc
300            #dataset_element = toplevel dataset xml element (and all child elements)
301            #gml_FeatureCollection_element= FeatureCollection element and all child elements (all features)
302            #filename = full file/path of a single file
303            #timedim = name of time variable
304           
305    #   DI = csmllibs.csmldataiface.DataInterface()
306    #   DI=DI.getUnknownInterfaceType(filename)
307    #   DI.openFile(filename)
308    #   allVarNames=DI.getListofVariables()
309    #   numFeatures=len(allVarNames)   
310    #   for i in range(0, numFeatures):
311    #           gml_featureMember_element=csmldoc.createElement("gml:featureMember")
312    #           PointFeature_element=csmldoc.createElement("PointFeature")
313    #           PointFeature_element.setAttribute('gml:id',allVarNames[i])
314    #           gml_description_element = csmldoc.createElement("gml:description")
315                    #need to get the attribute called long_name (?? TODO - is this CF compliant??)
316                    #use Ag's getbestname from nappy package?
317    #           try:
318    #                   desc=DI.getVariableAttribute('long_name')
319    #                   print desc
320    #                   except AttributeError:
321    #                   desc = "missing name"
322    #                   gml_description_element.appendChild(csmldoc.createTextNode(str(desc))) 
323    #                   PointFeature_element.appendChild(gml_description_element)
324                   
325    #           gml_featureMember_element.appendChild(PointFeature_element)
326    #           gml_FeatureCollection_element.appendChild(gml_featureMember_element)
327                           
328    #   dataset_element.appendChild(gml_FeatureCollection_element)
329                                           
330    #   return csmldoc, dataset_element, gml_FeatureCollection_element
331           
332   
333    def createCSMLPointSeriesFeatures(csmldoc, dataset_element, gml_FeatureCollection_element, ffmap, timedim):
334            representativeFiles=ffmap.getRepresentativeFiles()
335            listOfFiles=[]
336            for repfile in representativeFiles:
337                    repfilename=repfile.getRepresentativeFileName()
338                    listOfFiles.append(repfilename)
339                    relfiles = repfile.getRelatedFiles()
340                    for f in relfiles:
341                            #hopefully there are no related files at the moment!
342                            fname = f.getRelatedFileName()
343                            listOfFiles.append(fname)
344                   
345            for file in listOfFiles:
346                    DI = csmllibs.csmldataiface.DataInterface()
347                    DI=DI.getUnknownInterfaceType(file)
348                    DI.openFile(file)
349                    allVarNames=DI.getListofVariables()
350                    numFeatures=len(allVarNames)       
351                    try:
352                            DI.setAxis(timedim)
353                            times=DI.getDataForAxis()
354                    except:                     
355                            times = DI.getTimes()
356                            #times = ['time axis not determined']
357                   
358                                   
359                    print "FEATURES"
360                    print "***********"
361                    for i in range (0, len(allVarNames)):
362                            print allVarNames[i]
363                                           
364                    print "numFeatures" + str(numFeatures)
365                    for i in range (0, numFeatures):
366                            gml_featureMember_element=csmldoc.createElement("gml:featureMember")
367                            PointSeriesFeature_element=csmldoc.createElement("PointSeriesFeature")
368                            PointSeriesFeature_element.setAttribute('gml:id',str(allVarNames[i]))
369                            gml_description_element = csmldoc.createElement("gml:description")
370                            gml_featureMember_element.appendChild(PointSeriesFeature_element)
371                            #***********************************************************************
372                            #PointSeriesDomain:
373                            #***********************************************************************
374                            PointSeriesDomain_element=csmldoc.createElement("PointSeriesDomain")
375                           
376                           
377                            #***********************************************************************
378                            # domainReference element (and sub-elements)               
379                            #***********************************************************************
380                            domainReference_element=csmldoc.createElement("domainReference")
381                            trajectory_element=csmldoc.createElement("Trajectory")
382                            locations_element=csmldoc.createElement("locations")
383                            times_element=csmldoc.createElement("times")
384                            times_element.appendChild(csmldoc.createTextNode(str(times)[1:-1])) 
385                            trajectory_element.appendChild(locations_element)
386                            trajectory_element.appendChild(times_element)
387                            domainReference_element.appendChild(trajectory_element)
388                            PointSeriesDomain_element.appendChild(domainReference_element)
389                           
390                            #***********************************************************************
391                            #domainComplement_element=csmldoc.createElement("domainComplement")
392                            #PointSeriesDomain_element.appendChild(domainComplement_element)
393                           
394                            #***********************************************************************
395                            # gml:rangeSet_element
396                            #***********************************************************************
397                            DI.setVariable(allVarNames[i])
398                           
399                            #TO DO:
400                            try:
401                                    #strUom = var.units
402                                    strUom = DI.getVariableAttribute('units')
403                            except AttributeError:
404                                    #if units attribute doesn't exist:
405                                    strUom ="dimensionless or units not determined"
406                           
407                            try:                       
408                                    measuredvalues = str(DI.getDataForVar())
409                            except:
410                                    measuredvalues = ' could not get values '
411                           
412                            gml_rangeSet_element=csmldoc.createElement("gml:rangeSet") 
413                            gml_QuantityList_element=csmldoc.createElement("gml:QuantityList")
414                            gml_QuantityList_element.setAttribute('uom',strUom)
415                            gml_QuantityList_element.appendChild(csmldoc.createTextNode(str(measuredvalues)[1:-1]))
416                            gml_rangeSet_element.appendChild(gml_QuantityList_element)
417                           
418                            #***********************************************************************
419                            # gml:coverageFunction element (and sub-element MappingRule)               
420                            #***********************************************************************
421                            parameter_element=csmldoc.createElement("parameter")
422                                           
423                            gml_featureMember_element.appendChild(PointSeriesDomain_element)
424                            gml_featureMember_element.appendChild(gml_rangeSet_element)
425                            gml_featureMember_element.appendChild(parameter_element)
426                            gml_FeatureCollection_element.appendChild(gml_featureMember_element)
427                           
428            return csmldoc, dataset_element, gml_FeatureCollection_element
429           
430
431       
432
433
434       
Note: See TracBrowser for help on using the repository browser.