source: TI02-CSML/branches/CSML2/parser.py @ 1900

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

more on !referenceableGrid

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