Changeset 1739 for TI02-CSML


Ignore:
Timestamp:
22/11/06 16:01:33 (13 years ago)
Author:
domlowe
Message:

implemented some sort of substitution for AbstractFeature?

Location:
TI02-CSML/branches/CSML2
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • TI02-CSML/branches/CSML2/csParser.py

    r1737 r1739  
    1616nsXML = 'http://ndg.nerc.ac.uk/csml' 
    1717nsMOLES='http://ndg.nerc.ac.uk/moles' 
    18  
     18nsSWE='http://www.opengis.net/swe' 
     19     
    1920def myQName(uri,tag): 
    2021    return "{"+uri+"}"+tag 
     
    2627    return myQName(nsGML,tag) 
    2728 
    28 def Merge(dict1, dict2): 
     29def SWE(tag): 
     30    return myQName(nsSWE,tag) 
     31 
     32def merge(dict1, dict2): 
    2933    '''merges (adds) two dictionary objects, used in attribute 'inheritance.''' 
    3034    dict3={} 
     
    3539    return dict3 
    3640 
    37  
    3841class csElement(object): 
    3942    ''' main csElement class - all other elements inherit from this baseclass   
     
    5154            attname = qname 
    5255        return attname 
    53  
     56         
     57    def _getSubstitutionType(self,tag): 
     58        pass #stub 
     59     
     60    def _getReverseSubsType(self, typename): 
     61        pass #stub 
     62     
    5463    def toXML(self, csmlfrag): 
    5564    #process self... and convert  to XML  
     
    6372                csmlfrag.set(GML(item), self.__dict__[item])        
    6473          
    65     # self.CHILDREN (recursive - calls the toXML method of children) 
     74    # self.CHILDREN (recursive - calls the toXML method of children 
    6675        for att in self.__dict__: 
    6776            if att not in ['ATTRIBUTES', 'CHILDREN', 'CONTENT']: 
    6877                for child in self.CHILDREN: 
    69                     if child == att: 
     78                    if child == att:                         
    7079                        #found a match. 
    71                         ename = self.CHILDREN[child][0] #Element Name 
     80                        if type(self.CHILDREN[child][0]) is list: 
     81                            ename = self._getReverseSubsType(type(self.__dict__[att]).__name__) 
     82                        else:  
     83                            ename=self.CHILDREN[child][0]#Element Name 
    7284                        etype = self.CHILDREN[child][1] #Element Type 
    7385                        if type(self.__dict__[att])  is list: 
     
    92104                setattr(self, item[0], item[1]) 
    93105        # self.CHILDREN (recursive - calls the fromXML method of children 
    94         for frag in csmlfrag[:]:  
     106        for frag in csmlfrag[:]: 
    95107            if frag.text is not None: 
    96108                self.CONTENT = frag.text 
    97109            for child in self.CHILDREN: 
    98                 ename = self.CHILDREN[child][0] #Element Name  
     110                ename = self.CHILDREN[child][0] #Element Name                     
    99111                if frag.tag == ename: 
    100112                    etype = self.CHILDREN[child][1] 
     
    109121                    else: 
    110122                        setattr(self, child, childobj) 
    111  
     123                if type(ename) is list: # e.g. FeatureCollection where it can be GridFeature, PointFeature etc.. 
     124                    if frag.tag in ename: 
     125                        etype=self._getSubstitutionType(frag.tag) 
     126                        childobj=eval(etype)() 
     127                    childobj.fromXML(frag) 
     128                    if hasattr(self, child): 
     129                        if type(self.__dict__[child]) is not list: 
     130                            tmp=self.__dict__[child] 
     131                            setattr(self, child, [tmp]) #convert to list 
     132                        self.__dict__[child].append(childobj) 
     133                    else: 
     134                        setattr(self, child, childobj) 
     135                
    112136class csString(csElement): 
    113137    pass 
    114138 
    115139class AbstractGML(csElement): 
    116     
    117     def __init__(self, **kwargs): 
    118         self.ATTRIBUTES=[GML('id'), GML('description')] # etc 
    119     #ATTRIBUTES not implemented yet. 
    120      
     140    def __init__(self, **kwargs): 
     141        self.ATTRIBUTES=[GML('id'), GML('description'), GML('name'), 'MetaDataProperty'] 
     142 
     143class AbstractFeature(AbstractGML,csElement): 
     144    def __init__(self, **kwargs): 
     145        AbstractGML.__init__(self,**kwargs) 
     146        self.CHILDREN={'boundedBy':[GML('boundedBy'), 'Envelope']} 
     147 
     148class AbstractFeatureCollection(AbstractFeature,csElement): 
     149    def __init__(self, **kwargs): 
     150        AbstractFeature.__init__(self,**kwargs) 
     151        self.CHILDREN=merge(self.CHILDREN,{'members':[[CSML('GridFeature'),CSML('PointFeature')], 'AbstractFeature']}) 
     152        #CHOICE mechanism  used to declare that any element name can go here so long as it is of a type that  
     153        #inherits from AbstractFeature - .i.e. a GridFeature, a PointFeature etc. 
     154         
     155class GridFeature(AbstractFeature, csElement): 
     156    def __init__(self, **kwargs): 
     157        AbstractFeature.__init__(self,**kwargs) 
     158        #dummy child for now: 
     159        self.CHILDREN=merge(self.CHILDREN,{'test':[CSML('TestElement'), 'csString']}) 
     160        #self.CHILDREN={'time':[GML('time'), GML('TimePosition')], 'value':[CSML('value'), 'ReferenceableGridCoverage'], 'parameter':[CSML('parameter'), SWE('Phenomenon')]}  
    121161 
    122162class AbstractFileExtract(AbstractGML, csElement): 
     
    128168    def __init__(self,**kwargs): 
    129169        AbstractFileExtract.__init__(self, **kwargs) 
    130         self.CHILDREN = Merge(self.CHILDREN,{'variableName':[CSML('variableName'), 'csString']}) 
     170        self.CHILDREN = merge(self.CHILDREN,{'variableName':[CSML('variableName'), 'csString']}) 
    131171        #use Merge() when inheriting CHILDREN attribute to extend rather than replace 
    132172 
     173class FeatureCollection(AbstractFeatureCollection,csElement): 
     174    def __init__(self,**kwargs): 
     175        AbstractFeatureCollection.__init__(self,**kwargs) 
     176     
     177    def _getSubstitutionType(self,tag): 
     178        if tag==CSML('GridFeature'): 
     179            return 'GridFeature' 
     180        elif tag==CSML('PointFeature'): 
     181            return 'PointFeature' 
     182        else: return 'AbstractFeature' 
     183     
     184    def _getReverseSubsType(self, typename): 
     185        if typename== 'GridFeature': 
     186            return CSML('GridFeature') 
     187        elif typename == 'PointFeature': 
     188            return CSML('PointFeature') 
     189        else: return CSML('AbstractFeature') 
     190             
     191             
     192         
    133193class Dataset(AbstractGML, csElement):     
    134194    ''' Dataset class, needed as root of tree''' 
    135195    def __init__(self, **kwargs): 
    136196        AbstractGML.__init__(self,**kwargs) 
    137         self.CHILDREN = {'ncExtract':[CSML('NetCDFExtract'), 'NetCDFExtract']} 
     197        self.CHILDREN = {'ncExtract':[CSML('NetCDFExtract'), 'NetCDFExtract'], 'featureCollection':[CSML('featureCollection'),'FeatureCollection']} 
    138198    def toXML(self): 
    139199        csmlfrag=ET.Element(CSML('Dataset')) 
     
    143203def main(): 
    144204    '''round trip for testing purposes:''' 
     205    print '\n' 
    145206    tree=ET.ElementTree(file='test.xml') 
    146207    ds=Dataset() 
     
    150211    csmlout=csml.parser_extra.PrettyPrint(csmltree) 
    151212    csmlout=csml.parser_extra.removeInlineNS(csmlout) 
    152     print csmlout 
     213    print '\n %s'% csmlout 
    153214    #print dir(csmlout) 
    154215 
  • TI02-CSML/branches/CSML2/test.xml

    r1722 r1739  
    77            <variableName>2az</variableName> 
    88        </NetCDFExtract> 
    9         <NetCDFExtract gml:id="2feat04azimuth"> 
     9        <NetCDFExtract gml:id="3feat04azimuth"> 
    1010            <arraySize>210000</arraySize> 
    1111            <fileName>radar_data.nc</fileName> 
    1212            <variableName>az</variableName> 
    1313        </NetCDFExtract> 
     14        <featureCollection> 
     15            <GridFeature gml:id="feature1"> 
     16                <TestElement>testblahtestbanana</TestElement> 
     17                <time></time> 
     18                <value></value> 
     19                <parameter></parameter> 
     20            </GridFeature> 
     21    </featureCollection> 
    1422</Dataset> 
Note: See TracChangeset for help on using the changeset viewer.