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

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

several changes made to enable proper use of CRS

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