source: TI02-CSML/trunk/csml/parser.py @ 2015

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

addition of random ids, changes related to xlink and rangeset

Line 
1import cElementTree as ET
2import elementtree.ElementTree as etree
3import parser_extra
4import sys, traceback
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.__dict__['ATTRIBUTES']=[]
68   
69    #The __setattr__ and __getattribute__ special methods have been overridden.
70    #This is so that attributes can be called by their fully qualified name internally
71    #while being referenced by their short name externally.
72    # so 'id' and {'http://www.opengis.net/gml'}id always have the same value
73    #you can set either of them at any time and the other will be kept in sync.
74       
75    def __setattr__(self, name, value):
76        if hasattr(self, CSML(name)):
77            object.__setattr__(self, CSML(name), value)
78            object.__setattr__(self, name, value)
79        elif hasattr(self,GML(name)):
80            object.__setattr__(self, GML(name), value)
81            object.__setattr__(self, name, value)
82        elif hasattr(self,XLINK(name)):
83            object.__setattr__(self, XLINK(name), value)
84            object.__setattr__(self, name, value)
85        else:
86            if hasattr(self, 'ATTRIBUTES'):
87                if CSML(name) in self.__dict__['ATTRIBUTES']:
88                    object.__setattr__(self, CSML(name), value)
89                    object.__setattr__(self, name, value)
90                elif GML(name) in self.__dict__['ATTRIBUTES']:
91                    object.__setattr__(self, GML(name), value)
92                    object.__setattr__(self, name, value)
93                elif XLINK(name) in self.__dict__['ATTRIBUTES']:
94                    object.__setattr__(self, XLINK(name), value)
95                    object.__setattr__(self, name, value)
96                elif name in self.__dict__['ATTRIBUTES']:
97                    object.__setattr__(self, name, value)
98                    try:
99                        name=name.split('}')[1]
100                    except IndexError:
101                        pass
102                    object.__setattr__(self, name, value)
103                else:
104                    object.__setattr__(self, name, value)
105            else:
106                    object.__setattr__(self, name, value)
107   
108    def __getattribute__(self, name):
109        if CSML(name) in object.__dict__:
110            return object.__getattribute__(self,CSML(name))
111        elif GML(name) in object.__dict__:
112            return object.__getattribute__(self,GML(name))
113        elif XLINK(name) in object.__dict__:
114            return object.__getattribute__(self,XLINK(name))
115        else:
116            return object.__getattribute__(self,name) 
117       
118    def __removeURI(self, qname):
119        try:
120            attname = qname.split('}')[1]
121        except IndexError:
122            attname = qname
123        return attname
124       
125    def _getSubstitutionType(self,tag):
126        return tag.split('}')[1]
127       
128   
129    def _getReverseSubsType(self, typename):
130        return typename
131   
132    def addChildElem(self, childname, childobj):
133        #sometimes you want to add a child element but don't know if there is one already. In which case you want to create a list of child objects.
134        if hasattr(self, childname):
135            currentattribute=getattr(self,childname)
136            if type(getattr(self,childname)) is list:
137                currentattribute.append(childobj)
138            else:
139                newlist=[currentattribute]
140                newlist.append(childobj)
141                setattr(self,childname, newlist)
142        else:
143            setattr(self,childname, childobj)
144
145    def toXML(self, csmlfrag):
146        #process self and convert to XML
147        if hasattr(self, 'CONTENT'):
148            if self.CONTENT is not None: csmlfrag.text=self.CONTENT
149        if hasattr(self, 'ATTRIBUTES'):
150            for item in self.__dict__:
151                if item in self.ATTRIBUTES:                   
152                    csmlfrag.set(item, self.__dict__[item])
153            for item in self.__dict__:
154                if GML(item) in self.ATTRIBUTES:
155                    csmlfrag.set(GML(item), self.__dict__[item])       
156    # self.CHILDREN (recursive - calls the toXML method of children
157        for att in self.__dict__:
158            if att not in ['ATTRIBUTES', 'CHILDREN', 'CONTENT']:
159                for child in self.CHILDREN:
160                    if child == att:
161                        parserobjects=[]
162                        if type(self.__dict__[att]) is list:
163                            for a in self.__dict__[att]:
164                                parserobjects.append(a)
165                        else:
166                            parserobjects.append(self.__dict__[att])
167                        parentfrag=None
168                        if len(self.CHILDREN[child])>=3:
169                                ename2=self.CHILDREN[child][2]
170                                parentfrag=ET.Element(ename2)
171                        for po in parserobjects:
172                            if type(self.CHILDREN[child][0]) is not list:
173                                ename=self.CHILDREN[child][0]
174                            else:
175                                ename = self._getReverseSubsType(type(po).__name__)
176                            if len(self.CHILDREN[child])==3:
177                                frag=ET.Element(ename)
178                                po.toXML(frag)
179                                parentfrag.append(frag)
180                                appendLater=True
181                            elif len(self.CHILDREN[child])>=4:
182                                if self.CHILDREN[child][3]==1:
183                                    frag=ET.Element(ename)
184                                    po.toXML(frag)
185                                    parentfrag.append(frag)
186                                    csmlfrag.append(parentfrag)
187                                    parentfrag=ET.Element(parentfrag.tag)
188                                    appendLater=False
189                            else:
190                                frag=ET.Element(ename)
191                                try:
192                                    po.toXML(frag)
193                                except:
194                                    print 'PARSING ERROR - could not convert %s to XML'%frag
195                                    raise
196                                csmlfrag.append(frag)
197                                appendLater=True
198                        if appendLater==True and parentfrag != None:
199                            csmlfrag.append(parentfrag)
200        return csmlfrag
201       
202    def fromXML(self,csmlfrag):
203        # deal with attributes, e.g. gml id's
204        if csmlfrag.text is not None:
205                self.CONTENT = csmlfrag.text
206        for item in csmlfrag.items():
207            if item[0] in self.ATTRIBUTES:
208                setattr(self, item[0], item[1])
209        #self.CHILDREN (recursive - calls the fromXML method of children
210        for frag in csmlfrag[:]:
211            #for each child element
212            #iterate through expected CHILDREN
213            for child in self.CHILDREN:
214                #get element name
215                if len(self.CHILDREN[child])>=3:
216                    ename = self.CHILDREN[child][2]
217                    ename2 = self.CHILDREN[child][0]
218                   
219                else:
220                    ename = self.CHILDREN[child][0] 
221                    ename2=None
222                #if there are options, then find the name that matches the frag
223                if ename2 is not None:
224                    if frag[:] != []:
225                        for subfrag in frag[:]:
226                            etype=None
227                            if type(ename2) is list:
228                                if subfrag.tag in ename2:
229                                    etype=self._getSubstitutionType(subfrag.tag)
230                            if subfrag.tag==ename2:
231                                etype=self.CHILDREN[child][1]
232                            if etype:
233                                childobj=eval(etype)()
234                                if len(self.CHILDREN[child])>=3:
235                                    if frag[:] != []:
236                                        childobj.fromXML(subfrag)
237                                else:
238                                    childobj.fromXML(frag)
239                                #set this object to be an attribute of the 'parent' (self) object
240                                if hasattr(self, child):
241                                    if type(self.__dict__[child]) is not list:
242                                        tmp=self.__dict__[child]
243                                        setattr(self, child, [tmp]) #convert to list
244                                    self.__dict__[child].append(childobj)
245                                else:
246                                    setattr(self, child, childobj)
247                else:
248                    etype=None
249                    if type(ename) is list:
250                        if frag.tag in ename:
251                            etype=self._getSubstitutionType(frag.tag)
252                    elif frag.tag==ename:
253                        etype=self.CHILDREN[child][1]
254                    if etype:
255                        childobj=eval(etype)()
256                        if len(self.CHILDREN[child])>=3:
257                            if frag[:] != []:
258                                childobj.fromXML(frag[0])
259                        else:
260                            childobj.fromXML(frag)
261                        #set this object to be an attribute of the 'parent' (self) object
262                        if hasattr(self, child):
263                            if type(self.__dict__[child]) is not list:
264                                tmp=self.__dict__[child]
265                                setattr(self, child, [tmp]) #convert to list
266                            self.__dict__[child].append(childobj)
267                        else:
268                            setattr(self, child, childobj)
269
270               
271class csString(csElement):
272    def __init__(self, text=None,**kwargs):
273        if text != None:
274            if type(text) is not str:
275                text=str(text)
276            self.CONTENT=text
277        children={}
278        addchildren(self,children)
279   
280class AbstractGML(csElement):
281    def __init__(self, **kwargs):
282        a=[GML('id'), GML('description'), GML('name'), GML('MetaDataProperty')]
283        addatts(self,a)
284
285class AssociationAttributeGroup(csElement):
286    def __init__(self, **kwargs):
287        a =[XLINK('href'),XLINK('role'), XLINK('arcrole'),XLINK('title'), XLINK('show'), XLINK('actuate')] 
288        addatts(self,a)
289
290class SRSReferenceGroup(csElement):
291    def __init__(self, **kwargs):
292        a =['srsName','srsDimension'] 
293        addatts(self,a)
294       
295class SRSInformationGroup(csElement):
296    def __init__(self, **kwargs):
297        a =['uomLabels','axisLabels'] 
298        addatts(self,a)
299
300class ArrayDescriptor(AbstractGML, csElement):
301    def __init__(self,**kwargs):
302        AbstractGML.__init__(self,**kwargs)
303        children={'arraySize':[CSML('arraySize'), 'csString'], 'uom':[CSML('uom'),'csString'], 'numericType':[CSML('numericType'),'csString'], 'regExpTransform':[CSML('regExpTransform'),'csString'], 'numericTransform':[CSML('numericTransform'),'csString']}
304        addchildren(self,children)
305
306class DirectPosition(AbstractGML, SRSReferenceGroup,SRSInformationGroup,csElement):
307    def __init__(self, **kwargs):
308        AbstractGML.__init__(self,**kwargs)
309
310class GridEnvelope(AbstractGML,SRSReferenceGroup, csElement):
311    def __init__(self, **kwargs):
312        SRSReferenceGroup.__init__(self,**kwargs)
313        AbstractGML.__init__(self,**kwargs)
314        children={'low':[GML('low'), 'csString'],'high':[GML('high'), 'csString']}
315        addchildren(self,children)
316
317class Envelope(AbstractGML,SRSReferenceGroup, csElement):
318    def __init__(self, **kwargs):
319        SRSReferenceGroup.__init__(self,**kwargs)
320        AbstractGML.__init__(self,**kwargs)
321        children={'lowerCorner':[GML('lowerCorner'), 'DirectPosition'],'upperCorner':[GML('upperCorner'), 'DirectPosition']}
322        addchildren(self,children)
323
324
325class AbstractFeature(AbstractGML,csElement):
326    def __init__(self, **kwargs):
327        AbstractGML.__init__(self,**kwargs)
328        children={'boundedBy':[GML('boundedBy'), 'Envelope']}
329        addchildren(self,children)
330
331class AbstractFeatureCollection(AbstractFeature,csElement):
332    def __init__(self, **kwargs):
333        AbstractFeature.__init__(self,**kwargs)
334
335class DomainSet(AbstractGML,AssociationAttributeGroup,csElement):
336    def __init__(self, **kwargs):
337        AbstractGML.__init__(self,**kwargs)
338        addchildren(self,{})
339
340class AggregatedArray(ArrayDescriptor,csElement):
341    def __init__(self, **kwargs):
342        ArrayDescriptor.__init__(self,**kwargs)
343        children={'aggType':[CSML('aggType'),'csString'], 'aggIndex':[CSML('aggIndex'),'csString'],'components':[FILEFORMATS, 'ArrayDescriptor',CSML('component')]}
344        addchildren(self,children)
345#'component':[CSML:('component'), 'ArrayDescriptor', CSML('component')],
346class MeasureOrNullList(AbstractGML,csElement):
347    def __init__(self, **kwargs):
348        AbstractGML.__init__(self,**kwargs)
349        children={}
350        addchildren(self,children)
351        a =['uom'] 
352        addatts(self,a)
353       
354class CompositeValue(AbstractGML,csElement):
355    def __init__(self, **kwargs):
356        AbstractGML.__init__(self,**kwargs)
357        children={'measures':[GML('measure'),'csString',GML('valueComponents')]}
358        addchildren(self,children)
359       
360class DataBlock(AbstractGML,csElement):
361    #THIS IS INCOMPLETE
362    def __init__(self, **kwargs):
363        AbstractGML.__init__(self,**kwargs)
364        children={'doubleOrNullTupleList':[GML('doubleOrNullTupleList'),'csString'],'rangeParameters':[GML('CompositeValue'), 'CompositeValue', GML('rangeParameters')]}
365        addchildren(self,children)
366
367class RangeSet(AbstractGML,AssociationAttributeGroup,csElement):
368    def __init__(self, **kwargs):
369        AbstractGML.__init__(self,**kwargs)
370        AssociationAttributeGroup.__init__(self,**kwargs)
371        children={'quantityList':[GML('QuantityList'), 'MeasureOrNullList'],        'dataBlock':[GML('DataBlock'),'DataBlock'],'arrayDescriptor':[FILEFORMATS, 'ArrayDescriptor'],  'aggregatedArray':[CSML('AggregatedArray'), 'AggregatedArray']}
372        addchildren(self,children)
373
374class MultiPoint(AbstractGML, SRSReferenceGroup,csElement):
375    def __init__(self, **kwargs):
376        AbstractGML.__init__(self,**kwargs)
377        SRSReferenceGroup.__init__(self,**kwargs)
378        children={'pointMember':[GML('pointMember'), 'csString'],'pointMembers':[GML('pointMember'), 'csString']}
379        addchildren(self,children)
380
381class Point(AbstractGML,SRSReferenceGroup,csElement):
382    def __init__(self, **kwargs):
383        AbstractGML.__init__(self,**kwargs)
384        SRSReferenceGroup.__init__(self,**kwargs)
385        children={'pos':[GML('pos'), 'csString'],'coordinates':[GML('coordinates'), 'csString']}
386        addchildren(self,children)
387
388class PointDomain(DomainSet, MultiPoint,csElement):
389    def __init__(self, **kwargs):
390        DomainSet.__init__(self,**kwargs)
391        MultiPoint.__init__(self,**kwargs)
392        children={}
393        addchildren(self,children)
394
395class ProfileDomain(DomainSet, MultiPoint,csElement):
396    def __init__(self, **kwargs):
397        DomainSet.__init__(self,**kwargs)
398        MultiPoint.__init__(self,**kwargs)
399        children={}
400        addchildren(self,children)
401
402
403
404class AbstractCoverage(AbstractFeature, csElement):
405    def __init__(self, **kwargs):
406        AbstractFeature.__init__(self,**kwargs)
407
408class AbstractDiscreteCoverage(AbstractCoverage, csElement):
409    def __init__(self, **kwargs):
410        AbstractCoverage.__init__(self,**kwargs)
411        addchildren(self,{})
412       
413class Definition(AbstractGML):
414    def __init__(self, **kwargs):
415        AbstractGML.__init__(self,**kwargs)
416        addchildren(self,{})
417
418class Phenomenon(Definition,AssociationAttributeGroup):
419    def __init__(self, **kwargs):
420        Definition.__init__(self,**kwargs)
421        AssociationAttributeGroup.__init__(self,**kwargs)
422        children = {'':[CSML(''), '']}   
423        addchildren(self,children)
424       
425class SpatialOrTemporalPositionList(AbstractGML,csElement):
426    def __init__(self, **kwargs):
427        AbstractGML.__init__(self,**kwargs)
428        children={'coordinateList':[CSML('coordinateList'),'csString'], 'timePositionList':[CSML('timePositionList'),'csString']}
429        addchildren(self,children)
430        a=['frame']
431        addatts(self,a)
432
433class GridOrdinateDescription(AbstractGML,csElement):
434    def __init__(self, **kwargs):
435        AbstractGML.__init__(self,**kwargs)
436        children={'coordAxisLabel':[CSML('coordAxisLabel'), 'csString'], 'coordAxisValues':[CSML('SpatialOrTemporalPositionList'),'SpatialOrTemporalPositionList',CSML('coordAxisValues')], 'gridAxesSpanned':[CSML('gridAxesSpanned'), 'csString'], 'sequenceRule':[CSML('sequenceRule'),'SequenceRule']}
437        addchildren(self,children)
438
439class SequenceRule(csElement):
440    def __init__(self, **kwargs):
441        a=['axisOrder']
442        addatts(self,a)
443        children={}
444        addchildren(self,children)
445
446class GridPointDescription(AbstractGML,csElement):
447    def __init__(self, **kwargs):
448        AbstractGML.__init__(self,**kwargs)
449        children={'posList':[CSML('posList'),'csString'],'sequenceRule':[CSML('sequenceRule'),'SequenceRule']}
450        addchildren(self,children)
451
452
453class TimePositionList(AbstractGML,csElement):
454    def __init__(self,**kwargs):
455        a=['frame', 'calendarEraName','indeterminatePosition']
456        addatts(self,a)
457   
458
459class GridCoordinatesTable(AbstractGML,csElement):
460    def __init__(self,**kwargs):
461        '''the additional value '1' in the children dictionary is used to signify that the elements must be nested as:
462        <gml:ordinate>
463            <gml:GridOrdinateDescription>
464        </gml:ordinate>
465        <gml:ordinate>
466            <gml:GridOrdinateDescription>
467        </gml:ordinate>
468       
469        not as:
470        <gml:ordinate>
471            <gml:GridOrdinateDescription>
472            <gml:GridOrdinateDescription>
473        </gml:ordinate> '''
474        AbstractGML.__init__(self,**kwargs)
475        children={'gridOrdinates':[CSML('GridOrdinateDescription'), 'GridOrdinateDescription',CSML('gridOrdinate'),1], 'gridPoints':[CSML('GridPointDescription'),'GridPointDescription',CSML('gridPoints')]}
476        addchildren(self,children)
477       
478class ReferenceableGrid(AbstractGML, AssociationAttributeGroup, SRSInformationGroup, SRSReferenceGroup,csElement):
479    def __init__(self, **kwargs):
480        AbstractGML.__init__(self,**kwargs)
481        AssociationAttributeGroup.__init__(self,**kwargs)
482        SRSReferenceGroup.__init__(self,**kwargs)
483        SRSInformationGroup.__init__(self,**kwargs)
484        children={'coordTransformTable':[CSML('GridCoordinatesTable'), 'GridCoordinatesTable', CSML('coordTransformTable')],'aLabels':[CSML('axisLabels'),'csString'], 'limits':[GML('GridEnvelope'),'GridEnvelope',CSML('limits')]}
485        addchildren(self,children)
486
487
488class ReferenceableGridCoverage(AbstractDiscreteCoverage, csElement):
489    def __init__(self, **kwargs):
490        AbstractDiscreteCoverage.__init__(self,**kwargs)
491        children={'referenceableGridDomain':[CSML('ReferenceableGrid'),'ReferenceableGrid' ,CSML('referenceableGridDomain') ]}
492        addchildren(self,children)
493       
494class AlternatePointCoverage(AbstractDiscreteCoverage, csElement):
495    def __init__(self, **kwargs):
496        AbstractDiscreteCoverage.__init__(self,**kwargs)
497        children={'alternatePointDomain':[GML('Point'),'Point', CSML('alternatePointDomain')], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
498        addchildren(self,children)
499
500
501class ProfileCoverage(AbstractDiscreteCoverage, csElement):
502    def __init__(self, **kwargs):
503        AbstractDiscreteCoverage.__init__(self,**kwargs)
504        children={'profileDomain':[CSML('ProfileDomain'),'ProfileDomain' ,CSML('profileDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
505        addchildren(self,children)
506
507class PointCoverage(AbstractDiscreteCoverage, csElement):
508    def __init__(self, **kwargs):
509        AbstractDiscreteCoverage.__init__(self,**kwargs)
510        children={'pointDomain':[CSML('PointDomain'),'PointDomain' ,CSML('pointDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
511        addchildren(self,children)
512       
513class TimeSeriesDomain(AbstractGML, csElement):
514    def __init__(self, **kwargs):
515        AbstractGML.__init__(self,**kwargs)
516        children={'time':[CSML('time'), 'csString']}
517        addchildren(self,children)
518       
519
520class PointSeriesCoverage(AbstractDiscreteCoverage, csElement):
521    def __init__(self, **kwargs):
522        AbstractDiscreteCoverage.__init__(self,**kwargs)
523        children={'pointSeriesDomain':[CSML('TimeSeriesDomain'),'TimeSeriesDomain' ,CSML('pointSeriesDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
524        addchildren(self,children)
525
526class ProfileSeriesDomain(ReferenceableGrid, DomainSet, csElement):
527    def __init__(self, **kwargs):
528        DomainSet.__init__(self,**kwargs)
529        ReferenceableGrid.__init__(self,**kwargs)
530        children={}
531        addchildren(self,children)
532
533class ProfileSeriesCoverage(AbstractDiscreteCoverage,csElement):
534    def __init__(self, **kwargs):
535        AbstractDiscreteCoverage.__init__(self,**kwargs)
536        children={'profileSeriesDomain':[CSML('ProfileSeriesDomain'),'ProfileSeriesDomain' ,CSML('profileSeriesDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
537        addchildren(self,children)
538       
539class SectionDomain(ReferenceableGrid, DomainSet, csElement):
540    def __init__(self, **kwargs):
541        DomainSet.__init__(self,**kwargs)
542        ReferenceableGrid.__init__(self,**kwargs)
543        children={}
544        addchildren(self,children)
545       
546class SectionCoverage(AbstractDiscreteCoverage,csElement):
547    def __init__(self, **kwargs):
548        AbstractDiscreteCoverage.__init__(self,**kwargs)
549        children={'sectionDomain':[CSML('SectionDomain'),'SectionDomain' ,CSML('sectionDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
550        addchildren(self,children)
551
552class TrajectoryDomain(ReferenceableGrid, DomainSet, csElement):
553    def __init__(self, **kwargs):
554        DomainSet.__init__(self,**kwargs)
555        ReferenceableGrid.__init__(self,**kwargs)
556        children={}
557        addchildren(self,children)
558       
559class TrajectoryCoverage(AbstractDiscreteCoverage,csElement):
560    def __init__(self, **kwargs):
561        AbstractDiscreteCoverage.__init__(self,**kwargs)
562        children={'trajectoryDomain':[CSML('TrajectoryDomain'),'TrajectoryDomain' ,CSML('trajectoryDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
563        addchildren(self,children)
564
565
566class ScanningRadarDomain(ReferenceableGrid, DomainSet, csElement):
567    def __init__(self, **kwargs):
568        DomainSet.__init__(self,**kwargs)
569        ReferenceableGrid.__init__(self,**kwargs)
570        children={}
571        addchildren(self,children)
572       
573class ScanningRadarCoverage(AbstractDiscreteCoverage,csElement):
574    def __init__(self, **kwargs):
575        AbstractDiscreteCoverage.__init__(self,**kwargs)
576        children={'scanningRadarDomain':[CSML('ScanningRadarDomain'),'ScanningRadarDomain' ,CSML('scanningRadarDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
577        addchildren(self,children)
578
579
580class GridSeriesDomain(ReferenceableGrid, csElement):
581    def __init__(self, **kwargs):
582        #DomainSet.__init__(self,**kwargs)
583        ReferenceableGrid.__init__(self,**kwargs)
584        children={}
585        addchildren(self,children)
586       
587class GridSeriesCoverage(AbstractDiscreteCoverage,csElement):
588    def __init__(self, **kwargs):
589        AbstractDiscreteCoverage.__init__(self,**kwargs)
590        children={'gridSeriesDomain':[CSML('GridSeriesDomain'),'GridSeriesDomain' ,CSML('gridSeriesDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
591        addchildren(self,children)
592
593class AlternatePointFeature(AbstractFeature, csElement):
594    def __init__(self, **kwargs):
595        AbstractFeature.__init__(self,**kwargs)
596        children={'location':[CSML('location'), 'csString'],'time':[CSML('time'), 'csString'], 'value':[CSML('AlternatePointCoverage'), 'AlternatePointCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
597        addchildren(self,children)
598
599class PointFeature(AbstractFeature, csElement):
600    def __init__(self, **kwargs):
601        AbstractFeature.__init__(self,**kwargs)
602        children={'location':[CSML('location'), 'csString'],'time':[CSML('time'), 'csString'], 'value':[CSML('PointCoverage'), 'PointCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
603        addchildren(self,children)
604
605class PointCollectionFeature(AbstractFeature, csElement):
606    def __init__(self, **kwargs):
607        AbstractFeature.__init__(self,**kwargs)
608        children={'time':[CSML('time'), 'csString'], 'value':[CSML('MultiPointCoverage'), 'MultiPointCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
609        addchildren(self,children)
610
611
612class PointSeriesFeature(AbstractFeature, csElement):
613    def __init__(self, **kwargs):
614        AbstractFeature.__init__(self,**kwargs)
615        children={'location':[CSML('location'), 'csString'], 'value':[CSML('PointSeriesCoverage'), 'PointSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
616        addchildren(self,children)
617
618
619class GridFeature(AbstractFeature, csElement):
620    def __init__(self, **kwargs):
621        AbstractFeature.__init__(self,**kwargs)
622        children={'time':[CSML('time'), 'csString'], 'value':[CSML('ReferenceableGridCoverage'), 'ReferenceableGridCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
623        addchildren(self,children)
624
625class GridSeriesFeature(AbstractFeature, csElement):
626    def __init__(self, **kwargs):
627        AbstractFeature.__init__(self,**kwargs)
628        children={'value':[CSML('GridSeriesCoverage'), 'GridSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
629        addchildren(self,children)
630
631class ProfileFeature(AbstractFeature, csElement):
632    def __init__(self, **kwargs):
633        AbstractFeature.__init__(self,**kwargs)
634        children={'time':[CSML('time'), 'csString'],'location':[CSML('location'), 'csString'], 'value':[CSML('ProfileCoverage'), 'ProfileCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
635        addchildren(self,children)
636
637class ProfileSeriesFeature(AbstractFeature, csElement):
638    def __init__(self, **kwargs):
639        AbstractFeature.__init__(self,**kwargs)
640        children={'location':[CSML('location'), 'csString'], 'value':[CSML('ProfileSeriesCoverage'), 'ProfileSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
641        addchildren(self,children)
642
643class RaggedProfileSeriesFeature(AbstractFeature, csElement):
644    def __init__(self, **kwargs):
645        AbstractFeature.__init__(self,**kwargs)
646        children={'location':[CSML('location'), 'csString'], 'profileLength':[CSML('profileLength'), 'csString'],'value':[CSML('ProfileSeriesCoverage'), 'ProfileSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
647        addchildren(self,children)
648
649class RaggedSectionFeature(AbstractFeature, csElement):
650    def __init__(self, **kwargs):
651        AbstractFeature.__init__(self,**kwargs)
652        children={'stationLocations':[CSML('stationLocations'), 'csString'], 'stationTimes':[CSML('stationTimes'), 'csString'],'profileLength':[CSML('profileLength'),'csString'],'value':[CSML('SectionCoverage'), 'SectionCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
653        addchildren(self,children)
654
655class SectionFeature(AbstractFeature, csElement):
656    def __init__(self, **kwargs):
657        AbstractFeature.__init__(self,**kwargs)
658        children={'stationLocations':[CSML('stationLocations'), 'csString'], 'stationTimes':[CSML('stationTimes'), 'TimePositionList'],'value':[CSML('SectionCoverage'), 'SectionCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
659        addchildren(self,children)
660
661
662
663
664class ScanningRadarFeature(AbstractFeature, csElement):
665    def __init__(self, **kwargs):
666        AbstractFeature.__init__(self,**kwargs)
667        children={'elevation':[CSML('elevation'), 'csString'], 'value':[CSML('ScanningRadarCoverage'), 'ScanningRadarCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
668        addchildren(self,children)
669
670class SwathFeature(AbstractFeature, csElement):
671    def __init__(self, **kwargs):
672        AbstractFeature.__init__(self,**kwargs)
673        children={'eqCrossLon':[CSML('eqCrossLon'), 'csString'],'eqCrossTime':[CSML('eqCrossTime'), 'csString'], 'value':[CSML('ReferenceableGridCoverage'), 'ReferenceableGridCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
674        addchildren(self,children)
675
676class TrajectoryFeature(AbstractFeature, csElement):
677    def __init__(self, **kwargs):
678        AbstractFeature.__init__(self,**kwargs)
679        children={'value':[CSML('TrajectoryCoverage'), 'TrajectoryCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
680        addchildren(self,children)
681
682class FileExtract(ArrayDescriptor, csElement):
683    def __init__(self,**kwargs):
684        ArrayDescriptor.__init__(self,**kwargs)
685        children= {'fileName':[CSML('fileName'), 'csString']}
686        addchildren(self,children)
687
688class NetCDFExtract(FileExtract, csElement):
689    def __init__(self,**kwargs):
690        FileExtract.__init__(self, **kwargs)
691        children={'variableName':[CSML('variableName'), 'csString']}
692        addchildren(self,children)
693
694class NASAAmesExtract(FileExtract, csElement):
695    def __init__(self,**kwargs):
696        FileExtract.__init__(self, **kwargs)
697        children={'variableName':[CSML('variableName'), 'csString'], 'index':[CSML('index'),'csString']}
698        addchildren(self,children)
699
700class FeatureCollection(AbstractFeatureCollection,csElement):
701    def __init__(self,**kwargs):
702        AbstractFeatureCollection.__init__(self,**kwargs)
703        children={'members':[[CSML('GridFeature'), CSML('GridSeriesFeature'),CSML('PointFeature'),CSML('TrajectoryFeature'),CSML('ProfileFeature'),CSML('ProfileSeriesFeature'),CSML('RaggedProfileSeriesFeature'),CSML('RaggedSectionFeature'),CSML('SectionFeature'),CSML('ScanningRadarFeature'),CSML('PointSeriesFeature'),CSML('AlternatePointFeature')], 'AbstractFeature', GML('featureMembers')]}
704        addchildren(self,children)
705    def _getSubstitutionType(self,tag):
706        if tag==CSML('GridFeature'):
707            return 'GridFeature'
708        elif tag==CSML('GridSeriesFeature'):
709            return 'GridSeriesFeature'
710        elif tag==CSML('PointFeature'):
711            return 'PointFeature'
712        elif tag==CSML('TrajectoryFeature'):
713            return 'TrajectoryFeature'
714        elif tag==CSML('PointSeriesFeature'):
715            return 'PointSeriesFeature'
716        elif tag==CSML('ProfileFeature'):
717            return 'ProfileFeature'
718        elif tag==CSML('ProfileSeriesFeature'):
719            return 'ProfileSeriesFeature'
720        elif tag==CSML('RaggedProfileSeriesFeature'):
721            return 'RaggedProfileSeriesFeature'
722        elif tag==CSML('RaggedSectionFeature'):
723            return 'RaggedSectionFeature'
724        elif tag==CSML('SectionFeature'):
725            return 'SectionFeature'
726        elif tag==CSML('ScanningRadarFeature'):
727            return 'ScanningRadarFeature'
728        elif tag==CSML('AlternatePointFeature'):
729            return 'AlternatePointFeature'
730        else: return 'AbstractFeature'
731    def _getReverseSubsType(self, typename):
732        if typename== 'GridFeature':
733            return CSML('GridFeature')
734        elif typename == 'GridSeriesFeature':
735            return CSML('GridSeriesFeature')
736        elif typename == 'PointSeriesFeature':
737            return CSML('PointSeriesFeature')
738        elif typename == 'ProfileFeature':
739            return CSML('ProfileFeature')
740        elif typename == 'ProfileSeriesFeature':
741            return CSML('ProfileSeriesFeature')
742        elif typename == 'SectionFeature':
743            return CSML('SectionFeature')
744        elif typename == 'ScanningRadarFeature':
745            return CSML('ScanningRadarFeature')
746        elif typename == 'RaggedSectionFeature':
747            return CSML('RaggedSectionFeature')
748        elif typename == 'RaggedProfileSeriesFeature':
749            return CSML('RaggedProfileSeriesFeature')
750        elif typename == 'PointFeature':
751            return CSML('PointFeature')
752        elif typename == 'TrajectoryFeature':
753            return CSML('TrajectoryFeature')
754        elif typename == 'AlternatePointFeature':
755            return CSML('AlternatePointFeature')
756        else: return CSML('AbstractFeature')
757
758       
759class Dataset(AbstractGML, csElement):   
760    ''' Dataset class, needed as root of tree'''
761    def __init__(self, **kwargs):
762        AbstractGML.__init__(self,**kwargs)
763        children = {'featureCollection':[GML('FeatureCollection') ,'FeatureCollection'],'fileExtracts':[FILEFORMATS, 'ArrayDescriptor']}
764        addchildren(self,children)
765    def toXML(self):
766        csmlfrag=ET.Element(CSML('Dataset'))
767        csElement.toXML(self, csmlfrag)
768        return csmlfrag
769    def _getSubstitutionType(self,tag):
770        if tag==CSML('NetCDFExtract'):
771            return 'NetCDFExtract'
772        elif tag==CSML('NASAAmesExtract'):
773            return 'NASAAmesExtract'
774        else: return 'ArrayDescriptor'
775    def _getReverseSubsType(self, typename):
776        if typename== 'NetCDFExtract':
777            return CSML('NetCDFExtract')
778        elif typename == 'NASAAmesExtract':
779            return CSML('NASAAmesExtract')
780        else: return CSML('ArrayDescriptor')
781       
782        return typename
783
784   
785def main():
786    '''round trip for testing purposes:'''
787    print '\n'
788    tree=ET.ElementTree(file='test.xml')
789    ds=Dataset()
790    ds.fromXML(tree.getroot())
791    csmltree=ds.toXML()
792    #print csmltree
793   
794    csmlout=parser_extra.PrettyPrint(csmltree)
795    csmlout=parser_extra.removeInlineNS(csmlout)
796    print '\n %s'% csmlout
797    #for member in ds.featureCollection.members:
798      #print dir(member.value)
799       
800
801if __name__=='__main__':
802    main()
Note: See TracBrowser for help on using the repository browser.