source: TI02-CSML/branches/CSML2/csParser.py @ 1876

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI02-CSML/branches/CSML2/csParser.py@1876
Revision 1876, 30.2 KB checked in by domlowe, 13 years ago (diff)

added Section feature

Line 
1import cElementTree as ET
2import elementtree.ElementTree as etree
3import parser_extra
4import sys
5'''CSML v2 Parser ''' 
6
7#this map needs updating for V2
8etree._namespace_map.update({'http://www.opengis.net/om': 'om', 'http://www.opengis.net/swe': 'swe',  'http://www.opengis.net/gml': 'gml','http://ndg.nerc.ac.uk/csml' : 'csml', 'http://www.w3.org/1999/xlink':'xlink'})
9
10nsCSML = 'http://ndg.nerc.ac.uk/csml'
11nsGML = 'http://www.opengis.net/gml'
12nsOM = 'http://www.opengis.net/om'
13nsXLINK = 'http://www.w3.org/1999/xlink'
14nsXML = 'http://ndg.nerc.ac.uk/csml'
15nsMOLES='http://ndg.nerc.ac.uk/moles'
16nsSWE='http://www.opengis.net/swe'
17   
18def myQName(uri,tag):
19    return "{"+uri+"}"+tag
20
21def CSML(tag):
22    return myQName(nsCSML,tag)
23
24def GML(tag):
25    return myQName(nsGML,tag)
26
27def SWE(tag):
28    return myQName(nsSWE,tag)
29
30def XLINK(tag):
31    return myQName(nsXLINK,tag)
32
33def addchildren(obj, dict):
34    ''' merges (adds) dictionary to existing self.CHILDREN dictionary '''
35    dict1 = dict
36    if hasattr(obj, 'CHILDREN'):
37      dict2=obj.CHILDREN
38    else:
39      dict2={}
40    dict3={}
41    for item in dict1:
42        dict3[item] =dict1[item]
43    for item in dict2:
44        dict3[item] =dict2[item]
45    obj.CHILDREN=dict3
46   
47
48def addatts(obj, atts):
49  ''' merges self.ATTRIBUTES'''
50  if hasattr(obj, 'ATTRIBUTES'):
51    for att in atts:
52        obj.ATTRIBUTES.append(att)
53  else:
54    obj.ATTRIBUTES=atts
55
56
57#Some variable definitions: these things are often repeated so store in variables.
58FILEFORMATS=[CSML('NetCDFExtract'),CSML('NASAAmesExtract'), CSML('GRIBExtract'),CSML('CDMLExtract'), CSML('RawFileExtract')]
59 
60
61class csElement(object):
62    ''' main csElement class - all other elements inherit from this baseclass 
63    all the from/to XML conversion is done by this class'''
64   
65    def __init__(self, **kwargs):
66        if not hasattr(self, 'ATTRIBUTES'):
67            self.ATTRIBUTES=[]
68           
69       
70    def __removeURI(self, qname):
71        try:
72            attname = qname.split('}')[1]
73        except IndexError:
74            attname = qname
75        return attname
76       
77    def _getSubstitutionType(self,tag):
78        print 'splitting tag'
79        return tag.split('}')[1]
80       
81   
82    def _getReverseSubsType(self, typename):
83        return typename
84   
85    def toXML(self, csmlfrag):
86        #process self and convert to XML
87        if hasattr(self, 'CONTENT'):
88            if self.CONTENT is not None: csmlfrag.text=self.CONTENT
89        if hasattr(self, 'ATTRIBUTES'):
90            for item in self.__dict__:
91                if item in self.ATTRIBUTES:
92                    csmlfrag.set(item, self.__dict__[item])
93            for item in self.__dict__:
94                if GML(item) in self.ATTRIBUTES:
95                    csmlfrag.set(GML(item), self.__dict__[item])       
96    # self.CHILDREN (recursive - calls the toXML method of children
97        for att in self.__dict__:
98            if att not in ['ATTRIBUTES', 'CHILDREN', 'CONTENT']:
99                for child in self.CHILDREN:
100                    if child == att:
101                        parserobjects=[]
102                        if type(self.__dict__[att]) is list:
103                            for a in self.__dict__[att]:
104                                parserobjects.append(a)
105                        else:
106                            parserobjects.append(self.__dict__[att])
107                        parentfrag=None
108                        if len(self.CHILDREN[child])>=3:
109                                ename2=self.CHILDREN[child][2]
110                                parentfrag=ET.Element(ename2)
111                        for po in parserobjects:
112                            if type(self.CHILDREN[child][0]) is not list:
113                                ename=self.CHILDREN[child][0]
114                            else:
115                                ename = self._getReverseSubsType(type(po).__name__)
116                            if len(self.CHILDREN[child])==3:
117                                frag=ET.Element(ename)
118                                po.toXML(frag)
119                                parentfrag.append(frag)
120                                appendLater=True
121                            elif len(self.CHILDREN[child])>=4:
122                                if self.CHILDREN[child][3]==1:
123                                    frag=ET.Element(ename)
124                                    po.toXML(frag)
125                                    parentfrag.append(frag)
126                                    csmlfrag.append(parentfrag)
127                                    parentfrag=ET.Element(parentfrag.tag)
128                                    appendLater=False
129                            else:
130                                frag=ET.Element(ename)
131                                po.toXML(frag)
132                                csmlfrag.append(frag)
133                                appendLater=True
134                        if appendLater==True and parentfrag != None:
135                            csmlfrag.append(parentfrag)
136        return csmlfrag
137       
138    def fromXML(self,csmlfrag):
139        # deal with attributes, e.g. gml id's
140        if csmlfrag.text is not None:
141                self.CONTENT = csmlfrag.text
142        for item in csmlfrag.items():
143            if item[0] in self.ATTRIBUTES:
144                setattr(self, item[0], item[1])
145        # self.CHILDREN (recursive - calls the fromXML method of children
146        for frag in csmlfrag[:]:
147            #for each child element
148            #iterate through expected CHILDREN
149            for child in self.CHILDREN:
150                #get element name
151                if len(self.CHILDREN[child])>=3:
152                    ename = self.CHILDREN[child][2]
153                    ename2 = self.CHILDREN[child][0]
154                   
155                else:
156                    ename = self.CHILDREN[child][0] 
157                    ename2=None
158                #if there are options, then find the name that matches the frag
159                if ename2 is not None:
160                    if frag[:] != []:
161                        for subfrag in frag[:]:
162                            etype=None
163                            if type(ename2) is list:
164                                if subfrag.tag in ename2:
165                                    etype=self._getSubstitutionType(subfrag.tag)
166                            if subfrag.tag==ename2:
167                                etype=self.CHILDREN[child][1]
168                            if etype:
169                                childobj=eval(etype)()
170                                if len(self.CHILDREN[child])>=3:
171                                    if frag[:] != []:
172                                        childobj.fromXML(subfrag)
173                                else:
174                                    childobj.fromXML(frag)
175                                #set this object to be an attribute of the 'parent' (self) object
176                                if hasattr(self, child):
177                                    if type(self.__dict__[child]) is not list:
178                                        tmp=self.__dict__[child]
179                                        setattr(self, child, [tmp]) #convert to list
180                                    self.__dict__[child].append(childobj)
181                                else:
182                                    setattr(self, child, childobj)
183                else:
184                    etype=None
185                    if type(ename) is list:
186                        if frag.tag in ename:
187                            etype=self._getSubstitutionType(frag.tag)
188                    elif frag.tag==ename:
189                        etype=self.CHILDREN[child][1]
190                    if etype:
191                        childobj=eval(etype)()
192                        if len(self.CHILDREN[child])>=3:
193                            if frag[:] != []:
194                                childobj.fromXML(frag[0])
195                        else:
196                            childobj.fromXML(frag)
197                        #set this object to be an attribute of the 'parent' (self) object
198                        if hasattr(self, child):
199                            if type(self.__dict__[child]) is not list:
200                                tmp=self.__dict__[child]
201                                setattr(self, child, [tmp]) #convert to list
202                            self.__dict__[child].append(childobj)
203                        else:
204                            setattr(self, child, childobj)
205
206               
207class csString(csElement):
208    def __init__(self, **kwargs):
209        children={}
210        addchildren(self,children)
211   
212class AbstractGML(csElement):
213    def __init__(self, **kwargs):
214        a=[GML('id'), GML('description'), GML('name'), GML('MetaDataProperty')]
215        addatts(self,a)
216
217class AssociationAttributeGroup(csElement):
218    def __init__(self, **kwargs):
219        a =[XLINK('href'),XLINK('role'), XLINK('arcrole'),XLINK('title'), XLINK('show'), XLINK('actuate')] 
220        addatts(self,a)
221
222class SRSReferenceGroup(csElement):
223    def __init__(self, **kwargs):
224        a =['srsName','srsDimension'] 
225        addatts(self,a)
226       
227class SRSInformationGroup(csElement):
228    def __init__(self, **kwargs):
229        a =['uomLabels','axisLabels'] 
230        addatts(self,a)
231
232class ArrayDescriptor(AbstractGML, csElement):
233    def __init__(self,**kwargs):
234        AbstractGML.__init__(self,**kwargs)
235        children={'arraySize':[CSML('arraySize'), 'csString'], 'uom':[CSML('uom'),'csString'], 'numericType':[CSML('numericType'),'csString'], 'regExpTransform':[CSML('regExpTransform'),'csString'], 'numericTransform':[CSML('numericTransform'),'csString']}
236        addchildren(self,children)
237
238class DirectPosition(AbstractGML, SRSReferenceGroup,SRSInformationGroup,csElement):
239    def __init__(self, **kwargs):
240        AbstractGML.__init__(self,**kwargs)
241
242
243class Envelope(AbstractGML,SRSReferenceGroup, csElement):
244    def __init__(self, **kwargs):
245        SRSReferenceGroup.__init__(self,**kwargs)
246        AbstractGML.__init__(self,**kwargs)
247        children={'lowerCorner':[GML('lowerCorner'), 'DirectPosition'],'upperCorner':[GML('upperCorner'), 'DirectPosition']}
248        addchildren(self,children)
249
250
251class AbstractFeature(AbstractGML,csElement):
252    def __init__(self, **kwargs):
253        AbstractGML.__init__(self,**kwargs)
254        children={'boundedBy':[GML('boundedBy'), 'Envelope']}
255        addchildren(self,children)
256
257class AbstractFeatureCollection(AbstractFeature,csElement):
258    def __init__(self, **kwargs):
259        AbstractFeature.__init__(self,**kwargs)
260
261class DomainSet(AbstractGML,AssociationAttributeGroup,csElement):
262    def __init__(self, **kwargs):
263        AbstractGML.__init__(self,**kwargs)
264        addchildren(self,{})
265
266class AggregatedArray(ArrayDescriptor,csElement):
267    def __init__(self, **kwargs):
268        ArrayDescriptor.__init__(self,**kwargs)
269        children={'aggType':[CSML('aggType'),'csString'], 'aggIndex':[CSML('aggIndex'),'csString'],'components':[FILEFORMATS, 'ArrayDescriptor',CSML('component')]}
270        addchildren(self,children)
271#'component':[CSML:('component'), 'ArrayDescriptor', CSML('component')],
272class MeasureOrNullList(AbstractGML,csElement):
273    def __init__(self, **kwargs):
274        AbstractGML.__init__(self,**kwargs)
275        children={}
276        addchildren(self,children)
277       
278class CompositeValue(AbstractGML,csElement):
279    def __init__(self, **kwargs):
280        AbstractGML.__init__(self,**kwargs)
281        children={'measures':[GML('measure'),'csString',GML('valueComponents')]}
282        addchildren(self,children)
283       
284class DataBlock(AbstractGML,csElement):
285    #THIS IS INCOMPLETE
286    def __init__(self, **kwargs):
287        AbstractGML.__init__(self,**kwargs)
288        children={'doubleOrNullTupleList':[GML('doubleOrNullTupleList'),'csString'],'rangeParameters':[GML('CompositeValue'), 'CompositeValue', GML('rangeParameters')]}
289        addchildren(self,children)
290
291class RangeSet(AbstractGML,AssociationAttributeGroup,csElement):
292    def __init__(self, **kwargs):
293        AbstractGML.__init__(self,**kwargs)
294        children={'quantityList':[GML('QuantityList'), 'MeasureOrNullList'],        'dataBlock':[GML('DataBlock'),'DataBlock'],'arrayDescriptor':[FILEFORMATS, 'ArrayDescriptor'],  'aggregatedArray':[CSML('AggregatedArray'), 'AggregatedArray']}
295        addchildren(self,children)
296
297class MultiPoint(AbstractGML, SRSReferenceGroup,csElement):
298    def __init__(self, **kwargs):
299        AbstractGML.__init__(self,**kwargs)
300        SRSReferenceGroup.__init__(self,**kwargs)
301        children={'pointMember':[GML('pointMember'), 'csString'],'pointMembers':[GML('pointMember'), 'csString']}
302        addchildren(self,children)
303
304class Point(AbstractGML,SRSReferenceGroup,csElement):
305    def __init__(self, **kwargs):
306        AbstractGML.__init__(self,**kwargs)
307        SRSReferenceGroup.__init__(self,**kwargs)
308        children={'pos':[GML('pos'), 'csString'],'coordinates':[GML('coordinates'), 'csString']}
309        addchildren(self,children)
310
311class PointDomain(DomainSet, MultiPoint,csElement):
312    def __init__(self, **kwargs):
313        DomainSet.__init__(self,**kwargs)
314        MultiPoint.__init__(self,**kwargs)
315        children={}
316        addchildren(self,children)
317
318class ProfileDomain(DomainSet, MultiPoint,csElement):
319    def __init__(self, **kwargs):
320        DomainSet.__init__(self,**kwargs)
321        MultiPoint.__init__(self,**kwargs)
322        children={}
323        addchildren(self,children)
324
325
326
327class AbstractCoverage(AbstractFeature, csElement):
328    def __init__(self, **kwargs):
329        AbstractFeature.__init__(self,**kwargs)
330
331class AbstractDiscreteCoverage(AbstractCoverage, csElement):
332    def __init__(self, **kwargs):
333        AbstractCoverage.__init__(self,**kwargs)
334        addchildren(self,{})
335       
336class Definition(AbstractGML):
337    def __init__(self, **kwargs):
338        AbstractGML.__init__(self,**kwargs)
339        addchildren(self,{})
340
341class Phenomenon(Definition,AssociationAttributeGroup):
342    def __init__(self, **kwargs):
343        Definition.__init__(self,**kwargs)
344        AssociationAttributeGroup.__init__(self,**kwargs)
345        children = {'':[CSML(''), '']}   
346        addchildren(self,children)
347       
348class SpatialOrTemporalPositionList(AbstractGML,csElement):
349    def __init__(self, **kwargs):
350        AbstractGML.__init__(self,**kwargs)
351        children={'coordinateList':[CSML('coordinateList'),'csString'], 'timePositionList':[CSML('timePositionList'),'csString']}
352        addchildren(self,children)
353
354class GridOrdinateDescription(AbstractGML,csElement):
355    def __init__(self, **kwargs):
356        AbstractGML.__init__(self,**kwargs)
357        children={'coordAxisLabel':[CSML('coordAxisLabel'), 'csString'], 'coordAxisValues':[CSML('SpatialOrTemporalPositionList'),'SpatialOrTemporalPositionList',CSML('coordAxisValues')], 'gridAxesSpanned':[CSML('gridAxesSpanned'), 'csString'], 'sequenceRule':[CSML('sequenceRule'),'SequenceRuleType']}
358        addchildren(self,children)
359
360class SequenceRuleType(csElement):
361    def __init__(self, **kwargs):
362        a=['axisOrder']
363        addatts(self,a)
364        children={}
365        addchildren(self,children)
366
367class GridPointDescription(AbstractGML,csElement):
368    def __init__(self, **kwargs):
369        AbstractGML.__init__(self,**kwargs)
370        children={'posList':[CSML('posList'),'csString'],'sequenceRule':[CSML('sequenceRule'),'SequenceRuleType']}
371        addchildren(self,children)
372
373
374class TimePositionList(AbstractGML,csElement):
375    def __init__(self,**kwargs):
376        a=['frame', 'calendarEraName','indeterminatePosition']
377        addatts(self,a)
378   
379
380class GridCoordinatesTable(AbstractGML,csElement):
381    def __init__(self,**kwargs):
382        '''the additional value '1' in the children dictionary is used to signify that the elements must be nested as:
383        <gml:ordinate>
384            <gml:GridOrdinateDescription>
385        </gml:ordinate>
386        <gml:ordinate>
387            <gml:GridOrdinateDescription>
388        </gml:ordinate>
389       
390        not as:
391        <gml:ordinate>
392            <gml:GridOrdinateDescription>
393            <gml:GridOrdinateDescription>
394        </gml:ordinate> '''
395        AbstractGML.__init__(self,**kwargs)
396        children={'gridOrdinates':[CSML('GridOrdinateDescription'), 'GridOrdinateDescription',CSML('gridOrdinate'),1], 'gridPoints':[CSML('GridPointDescription'),'GridPointDescription',CSML('gridPoints')]}
397        addchildren(self,children)
398       
399class ReferenceableGrid(AbstractGML, AssociationAttributeGroup, csElement):
400    def __init__(self, **kwargs):
401        AbstractGML.__init__(self,**kwargs)
402        AssociationAttributeGroup.__init__(self,**kwargs)
403        children={'coordTransformTable':[CSML('GridCoordinatesTable'), 'GridCoordinatesTable', CSML('coordTransformTable')]}
404        addchildren(self,children)
405        a=['dimension']
406        addatts(self,a)
407
408class ReferenceableGridCoverage(AbstractDiscreteCoverage, csElement):
409    def __init__(self, **kwargs):
410        AbstractDiscreteCoverage.__init__(self,**kwargs)
411        children={'referenceableGridDomain':[CSML('ReferenceableGrid'),'ReferenceableGrid' ,CSML('referenceableGridDomain') ]}
412        addchildren(self,children)
413       
414class AlternatePointCoverage(AbstractDiscreteCoverage, csElement):
415    def __init__(self, **kwargs):
416        AbstractDiscreteCoverage.__init__(self,**kwargs)
417        children={'alternatePointDomain':[GML('Point'),'Point', CSML('alternatePointDomain')], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
418        addchildren(self,children)
419        print self.CHILDREN
420
421
422class ProfileCoverage(AbstractDiscreteCoverage, csElement):
423    def __init__(self, **kwargs):
424        AbstractDiscreteCoverage.__init__(self,**kwargs)
425        children={'profileDomain':[CSML('ProfileDomain'),'ProfileDomain' ,CSML('profileDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
426        addchildren(self,children)
427
428class PointCoverage(AbstractDiscreteCoverage, csElement):
429    def __init__(self, **kwargs):
430        AbstractDiscreteCoverage.__init__(self,**kwargs)
431        children={'pointDomain':[CSML('PointDomain'),'PointDomain' ,CSML('pointDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
432        addchildren(self,children)
433       
434class TimeSeriesDomain(AbstractGML, csElement):
435    def __init__(self, **kwargs):
436        AbstractGML.__init__(self,**kwargs)
437        children={'time':[CSML('time'), 'csString']}
438        addchildren(self,children)
439       
440
441class PointSeriesCoverage(AbstractDiscreteCoverage, csElement):
442    def __init__(self, **kwargs):
443        AbstractDiscreteCoverage.__init__(self,**kwargs)
444        children={'pointSeriesDomain':[CSML('TimeSeriesDomain'),'TimeSeriesDomain' ,CSML('pointSeriesDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
445        addchildren(self,children)
446
447class ProfileSeriesDomain(ReferenceableGrid, DomainSet, csElement):
448    def __init__(self, **kwargs):
449        DomainSet.__init__(self,**kwargs)
450        ReferenceableGrid.__init__(self,**kwargs)
451        children={}
452        addchildren(self,children)
453
454class ProfileSeriesCoverage(AbstractDiscreteCoverage,csElement):
455    def __init__(self, **kwargs):
456        AbstractDiscreteCoverage.__init__(self,**kwargs)
457        children={'profileSeriesDomain':[CSML('ProfileSeriesDomain'),'ProfileSeriesDomain' ,CSML('profileSeriesDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
458        addchildren(self,children)
459       
460class SectionDomain(ReferenceableGrid, DomainSet, csElement):
461    def __init__(self, **kwargs):
462        DomainSet.__init__(self,**kwargs)
463        ReferenceableGrid.__init__(self,**kwargs)
464        children={}
465        addchildren(self,children)
466       
467class SectionCoverage(AbstractDiscreteCoverage,csElement):
468    def __init__(self, **kwargs):
469        AbstractDiscreteCoverage.__init__(self,**kwargs)
470        children={'sectionDomain':[CSML('SectionDomain'),'SectionDomain' ,CSML('sectionDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
471        addchildren(self,children)
472
473class GridSeriesDomain(ReferenceableGrid, DomainSet, csElement):
474    def __init__(self, **kwargs):
475        DomainSet.__init__(self,**kwargs)
476        ReferenceableGrid.__init__(self,**kwargs)
477        children={}
478        addchildren(self,children)
479       
480class GridSeriesCoverage(AbstractDiscreteCoverage,csElement):
481    def __init__(self, **kwargs):
482        AbstractDiscreteCoverage.__init__(self,**kwargs)
483        children={'gridSeriesDomain':[CSML('GridSeriesDomain'),'GridSeriesDomain' ,CSML('gridSeriesDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
484        addchildren(self,children)
485
486class AlternatePointFeature(AbstractFeature, csElement):
487    def __init__(self, **kwargs):
488        AbstractFeature.__init__(self,**kwargs)
489        children={'location':[CSML('location'), 'csString'],'time':[CSML('time'), 'csString'], 'value':[CSML('AlternatePointCoverage'), 'AlternatePointCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
490        addchildren(self,children)
491
492class PointFeature(AbstractFeature, csElement):
493    def __init__(self, **kwargs):
494        AbstractFeature.__init__(self,**kwargs)
495        children={'location':[CSML('location'), 'csString'],'time':[CSML('time'), 'csString'], 'value':[CSML('PointCoverage'), 'PointCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
496        addchildren(self,children)
497
498class PointCollectionFeature(AbstractFeature, csElement):
499    def __init__(self, **kwargs):
500        AbstractFeature.__init__(self,**kwargs)
501        children={'time':[CSML('time'), 'csString'], 'value':[CSML('MultiPointCoverage'), 'MultiPointCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
502        addchildren(self,children)
503
504
505class PointSeriesFeature(AbstractFeature, csElement):
506    def __init__(self, **kwargs):
507        AbstractFeature.__init__(self,**kwargs)
508        children={'location':[CSML('location'), 'csString'], 'value':[CSML('PointSeriesCoverage'), 'PointSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
509        addchildren(self,children)
510
511
512class GridFeature(AbstractFeature, csElement):
513    def __init__(self, **kwargs):
514        AbstractFeature.__init__(self,**kwargs)
515        children={'time':[CSML('time'), 'csString'], 'value':[CSML('ReferenceableGridCoverage'), 'ReferenceableGridCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
516        addchildren(self,children)
517
518class GridSeriesFeature(AbstractFeature, csElement):
519    def __init__(self, **kwargs):
520        AbstractFeature.__init__(self,**kwargs)
521        children={'value':[CSML('GridSeriesCoverage'), 'GridSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
522        addchildren(self,children)
523
524class ProfileFeature(AbstractFeature, csElement):
525    def __init__(self, **kwargs):
526        AbstractFeature.__init__(self,**kwargs)
527        children={'time':[CSML('time'), 'csString'],'location':[CSML('location'), 'csString'], 'value':[CSML('ProfileCoverage'), 'ProfileCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
528        addchildren(self,children)
529
530class ProfileSeriesFeature(AbstractFeature, csElement):
531    def __init__(self, **kwargs):
532        AbstractFeature.__init__(self,**kwargs)
533        children={'location':[CSML('location'), 'csString'], 'value':[CSML('ProfileSeriesCoverage'), 'ProfileSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
534        addchildren(self,children)
535
536class RaggedProfileSeriesFeature(AbstractFeature, csElement):
537    def __init__(self, **kwargs):
538        AbstractFeature.__init__(self,**kwargs)
539        children={'location':[CSML('location'), 'csString'], 'profileLength':[CSML('profileLength'), 'csString'],'value':[CSML('ProfileSeriesCoverage'), 'ProfileSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
540        addchildren(self,children)
541
542class RaggedSectionFeature(AbstractFeature, csElement):
543    def __init__(self, **kwargs):
544        AbstractFeature.__init__(self,**kwargs)
545        children={'stationLocations':[CSML('stationLocations'), 'csString'], 'stationTimes':[CSML('stationTimes'), 'csString'],'profileLength':[CSML('profileLength'),'csString'],'value':[CSML('SectionCoverage'), 'SectionCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
546        addchildren(self,children)
547
548class SectionFeature(AbstractFeature, csElement):
549    def __init__(self, **kwargs):
550        AbstractFeature.__init__(self,**kwargs)
551        children={'stationLocations':[CSML('stationLocations'), 'csString'], 'stationTimes':[CSML('stationTimes'), 'TimePositionList'],'value':[CSML('SectionCoverage'), 'SectionCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
552        addchildren(self,children)
553
554class ScanningRadarFeature(AbstractFeature, csElement):
555    def __init__(self, **kwargs):
556        AbstractFeature.__init__(self,**kwargs)
557        children={'elevation':[CSML('elevation'), 'csString'], 'value':[CSML('ScanningRadarCoverage'), 'ScanningRadarCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
558        addchildren(self,children)
559
560class SwathFeature(AbstractFeature, csElement):
561    def __init__(self, **kwargs):
562        AbstractFeature.__init__(self,**kwargs)
563        children={'eqCrossLon':[CSML('eqCrossLon'), 'csString'],'eqCrossTime':[CSML('eqCrossTime'), 'csString'], 'value':[CSML('ReferenceableGridCoverage'), 'ReferenceableGridCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
564        addchildren(self,children)
565
566class TrajectoryFeature(AbstractFeature, csElement):
567    def __init__(self, **kwargs):
568        AbstractFeature.__init__(self,**kwargs)
569        children={'value':[CSML('TrajectoryCoverage'), 'TrajectoryCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
570        addchildren(self,children)
571
572class FileExtract(ArrayDescriptor, csElement):
573    def __init__(self,**kwargs):
574        ArrayDescriptor.__init__(self,**kwargs)
575        children= {'fileName':[CSML('fileName'), 'csString']}
576        addchildren(self,children)
577
578class NetCDFExtract(FileExtract, csElement):
579    def __init__(self,**kwargs):
580        FileExtract.__init__(self, **kwargs)
581        children={'variableName':[CSML('variableName'), 'csString']}
582        addchildren(self,children)
583
584class NASAAmesExtract(FileExtract, csElement):
585    def __init__(self,**kwargs):
586        FileExtract.__init__(self, **kwargs)
587        children={'variableName':[CSML('variableName'), 'csString'], 'index':[CSML('index'),'csString']}
588        addchildren(self,children)
589
590class FeatureCollection(AbstractFeatureCollection,csElement):
591    def __init__(self,**kwargs):
592        AbstractFeatureCollection.__init__(self,**kwargs)
593        children={'members':[[CSML('GridFeature'), CSML('GridSeriesFeature'),CSML('PointFeature'),CSML('ProfileFeature'),CSML('ProfileSeriesFeature'),CSML('RaggedProfileSeriesFeature'),CSML('RaggedSectionFeature'),CSML('SectionFeature'),CSML('PointSeriesFeature'),CSML('AlternatePointFeature')], 'AbstractFeature', GML('featureMembers')]}
594        addchildren(self,children)
595    def _getSubstitutionType(self,tag):
596        if tag==CSML('GridFeature'):
597            return 'GridFeature'
598        elif tag==CSML('GridSeriesFeature'):
599            return 'GridSeriesFeature'
600        elif tag==CSML('PointFeature'):
601            return 'PointFeature'
602        elif tag==CSML('PointSeriesFeature'):
603            return 'PointSeriesFeature'
604        elif tag==CSML('ProfileFeature'):
605            return 'ProfileFeature'
606        elif tag==CSML('ProfileSeriesFeature'):
607            return 'ProfileSeriesFeature'
608        elif tag==CSML('RaggedProfileSeriesFeature'):
609            return 'RaggedProfileSeriesFeature'
610        elif tag==CSML('RaggedSectionFeature'):
611            return 'RaggedSectionFeature'
612        elif tag==CSML('SectionFeature'):
613            return 'SectionFeature'
614        elif tag==CSML('AlternatePointFeature'):
615            return 'AlternatePointFeature'
616        else: return 'AbstractFeature'
617    def _getReverseSubsType(self, typename):
618        if typename== 'GridFeature':
619            return CSML('GridFeature')
620        elif typename == 'GridSeriesFeature':
621            return CSML('GridSeriesFeature')
622        elif typename == 'PointSeriesFeature':
623            return CSML('PointSeriesFeature')
624        elif typename == 'ProfileFeature':
625            return CSML('ProfileFeature')
626        elif typename == 'ProfileSeriesFeature':
627            return CSML('ProfileSeriesFeature')
628        elif typename == 'SectionFeature':
629            return CSML('SectionFeature')
630        elif typename == 'RaggedSectionFeature':
631            return CSML('RaggedSectionFeature')
632        elif typename == 'RaggedProfileSeriesFeature':
633            return CSML('RaggedProfileSeriesFeature')
634        elif typename == 'PointFeature':
635            return CSML('PointFeature')
636        elif typename == 'AlternatePointFeature':
637            return CSML('AlternatePointFeature')
638        else: return CSML('AbstractFeature')
639
640       
641class Dataset(AbstractGML, csElement):   
642    ''' Dataset class, needed as root of tree'''
643    def __init__(self, **kwargs):
644        AbstractGML.__init__(self,**kwargs)
645        children = {'featureCollection':[GML('FeatureCollection') ,'FeatureCollection'],'fileExtracts':[FILEFORMATS, 'ArrayDescriptor']}
646        addchildren(self,children)
647    def toXML(self):
648        csmlfrag=ET.Element(CSML('Dataset'))
649        csElement.toXML(self, csmlfrag)
650        return csmlfrag
651    def _getSubstitutionType(self,tag):
652        if tag==CSML('NetCDFExtract'):
653            return 'NetCDFExtract'
654        elif tag==CSML('NASAAmesExtract'):
655            return 'NASAAmesExtract'
656        else: return 'ArrayDescriptor'
657    def _getReverseSubsType(self, typename):
658        if typename== 'NetCDFExtract':
659            return CSML('NetCDFExtract')
660        elif typename == 'NASAAmesExtract':
661            return CSML('NASAAmesExtract')
662        else: return CSML('ArrayDescriptor')
663       
664        return typename
665
666def main():
667    '''round trip for testing purposes:'''
668    print '\n'
669    tree=ET.ElementTree(file='test.xml')
670    ds=Dataset()
671    ds.fromXML(tree.getroot())
672    csmltree=ds.toXML()
673    #print csmltree
674   
675    csmlout=parser_extra.PrettyPrint(csmltree)
676    csmlout=parser_extra.removeInlineNS(csmlout)
677    print '\n %s'% csmlout
678    #for member in ds.featureCollection.members:
679      #print dir(member.value)
680       
681
682if __name__=='__main__':
683    main()
Note: See TracBrowser for help on using the repository browser.