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

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

added EnvelopeWithTimePeriod?, also, more on subsetting

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