Changeset 2741 for TI02-CSML


Ignore:
Timestamp:
24/07/07 15:21:25 (12 years ago)
Author:
domlowe
Message:

Changes to allow xlinking of timeposition lists. Changes to scanner and parser code. Now need to rescan coapec test data fully

Location:
TI02-CSML/trunk/csml
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • TI02-CSML/trunk/csml/API/csmlutils.py

    r2598 r2741  
    5252         
    5353        """ 
    54  
    5554        bounds=False 
    5655        reverseBounds=False 
  • TI02-CSML/trunk/csml/API/genSubset.py

    r2638 r2741  
    179179def _getTimeToFileRatio(feature,domain, timeName): 
    180180    if hasattr(feature.value.rangeSet, 'valueArray'): 
    181         if hasattr(feature.value.rangeSet.valueArray.valueComponent, 'insertedExtract'): 
     181        if hasattr(feature.value.rangeSet.valueArray.valueComponent, 'insertedExtract'):             
    182182            try: 
    183183                numFiles= len( csmlutils.listify(feature.value.rangeSet.valueArray.valueComponent.insertedExtract.components)[0].fileList.fileNames.CONTENT.split()) 
  • TI02-CSML/trunk/csml/csmllibs/csmlbuilder.py

    r2325 r2741  
    3535        self.createFeatures() 
    3636        self.insertXlinks() 
    37         #self.closeFC() 
    38         #self.closeDS() 
    3937        self.saveFile() 
    4038        self.printToScreen() 
     
    5048        #Use random id for dataset id. 
    5149        setattr(self.ds,'id',csml.csmllibs.csmlextra.getRandomID())         
    52         #setattr(self.ds, 'arrayDescriptors', adlist) 
    53         #setattr(self.ds, 'unitDefinitions', uds) 
    54         #setattr(self.ds, 'phenomenonDefinitions', pds) 
    55         #setattr(self.ds, 'featureCollection',fc) 
     50        setattr(self.ds, 'name', csml.parser.csString('NAME OF DATASET GOES HERE')) 
    5651        ######################################## 
    5752 
     
    9792        self.extractDictionary=feBuilder.fileExtractDictionary 
    9893 
    99     
    10094     
    10195    def createFeatureCollection(self): 
  • TI02-CSML/trunk/csml/csmllibs/csmlextra.py

    r2567 r2741  
    1515        randomID=randomID+random.choice(string.letters+string.digits) 
    1616    return randomID 
     17 
     18def _locateByGmlId(elem, idtofind): 
     19    it=elem.getiterator() 
     20    for i in it: 
     21        if '{http://www.opengis.net/gml}id' in i.attrib: 
     22            if i.attrib['{http://www.opengis.net/gml}id'] == idtofind: 
     23                return i 
     24 
     25 
     26def _getEmptyCSMLobj(tag): 
     27    #given an elementtree tag name, such as SpatialOrTemporalPositionList 
     28    #return a parser object such as csml.parser.SpatialOrTemporalPosition() 
     29    csmlname=tag.split('}')[1] 
     30    return csml.parser.__dict__[csmlname]()        
     31 
     32 
     33def getObjbyGMLID(elem,idtofind): 
     34    #Given an element tree object and a gml:id return the fully parsed CSML object 
     35    #that matches the id 
     36    #useful for finding xlink matches 
     37    matchingelement= _locateByGmlId(elem, idtofind) 
     38    csmlobj=_getEmptyCSMLobj(matchingelement.tag) 
     39    csmlobj.fromXML(matchingelement) 
     40    return csmlobj 
    1741 
    1842def strToDate(ymd): 
     
    120144    timename='time' 
    121145    srs='ndg:crs:xyt' 
    122      
     146    tnewmin=None 
     147    tnewmax=None 
    123148        
    124149    aggregator=None 
     
    129154            for ord in feature.value.gridSeriesDomain.coordTransformTable.gridOrdinates: 
    130155                if ord.coordAxisLabel.CONTENT==timename: 
    131                     tnewmin= strToDate(ord.coordAxisValues.timePositionList.CONTENT.split()[0].split('T')[0]) 
    132                     tnewmax=strToDate( ord.coordAxisValues.timePositionList.CONTENT.split()[len(ord.coordAxisValues.timePositionList.CONTENT.split())-1].split('T')[0]) 
     156                    try: 
     157                        tnewmin= strToDate(ord.coordAxisValues.timePositionList.CONTENT.split()[0].split('T')[0]) 
     158                        tnewmax=strToDate( ord.coordAxisValues.timePositionList.CONTENT.split()[len(ord.coordAxisValues.timePositionList.CONTENT.split())-1].split('T')[0]) 
     159                    except AttributeError: 
     160                        pass  #using xlink, so these values will be picked up elsewhere. 
    133161                    if tmin ==None: 
    134162                        tmin=tnewmin 
  • TI02-CSML/trunk/csml/csmllibs/csmlfeaturetypes.py

    r2520 r2741  
    110110        #referenceableGrid/GridCoordinatesTable 
    111111        gcT=cp.GridCoordinatesTable() 
     112        #timeHref is used to store a referencable timepositionlist for reuse 
     113        if not hasattr(self, 'timeHref'): 
     114            self.timeHref = None 
    112115        ##add an axisName element(s) for  each spatial dimension. 
    113116        #and an ordinate element 
     
    130133            seqRule.CONTENT='Linear' 
    131134            seqRule.axisOrder='+1'  #TO DO. Work this out. 
    132             ord.sequenceRule=seqRule 
    133             sptList=cp.SpatialOrTemporalPositionList() 
     135            ord.sequenceRule=seqRule             
     136            sptList=csml.parser.SpatialOrTemporalPositionList() 
    134137            sptList.id =csml.csmllibs.csmlextra.getRandomID() 
    135138            if dimName[1]==self.timedim: 
     
    141144                    sptList.timePositionList=cp.TimePositionList(self.fileExtractDictionary[axisid]) 
    142145                else: 
    143                     #store times inline 
    144                     self.DI.setAxis(dimName[1]) 
    145                     timeposList=cp.TimePositionList() 
    146                     timeposList.CONTENT=self.timeString 
    147                     timeposList.frame='ndg:%s'%self.caltype 
    148                     sptList.timePositionList=timeposList 
     146                    if self.timeHref == None: 
     147                        self.timeHref=sptList.id 
     148                        timeposList=cp.TimePositionList() 
     149                        timeposList.CONTENT=self.timeString 
     150                        timeposList.frame='ndg:%s'%self.caltype 
     151                        sptList.timePositionList=timeposList 
     152                    else: 
     153                        sptList.href='#' +self.timeHref 
     154                        sptList.show='embed' 
     155                        sptList.arcrole='http://ndg.nerc.ac.uk/xlinkUsage/insert#timePositionList' 
     156                        sptList.role='http://ndg.nerc.ac.uk/fileFormat/csmlStorageDescriptor' 
     157                        sptList.timePositionList=cp.TimePositionList()                                         
    149158            else:  #for all other dimensions, create ordinates 
    150159                if self.spatialstorage=='fileextract': 
     
    161170                    self.DI.setAxis(dimName[1]) 
    162171                    sptList.coordinateList=cp.csString(csml.csmllibs.csmlextra.cleanString(str(self.DI.getDataForAxis()))) 
     172 
    163173            ord.coordAxisValues=sptList 
    164             gcT.addChildElem('gridOrdinates',ord)                          
     174            gcT.addChildElem('gridOrdinates',ord)               
    165175        return gcT 
    166176        
  • TI02-CSML/trunk/csml/csmllibs/csmlxlink.py

    r2204 r2741  
    3737                        xlinkDictionary[fID]=(fID, newid) 
    3838                        comp.fileList.id=newid 
     39 
    3940    return ds 
    4041    
  • TI02-CSML/trunk/csml/parser.py

    r2684 r2741  
    2323import sys, traceback 
    2424import csml 
     25import cgi #(for escaping text) 
    2526'''CSML v2 Parser '''  
    2627 
     
    5152def MOLES(tag): 
    5253    return "{"+nsMOLES+"}"+tag 
    53  
    5454 
    5555def addchildren(obj, dict): 
     
    186186        #process self and convert to XML       
    187187        if 'CONTENT' in self.__dict__: 
    188             if self.CONTENT is not None: csmlfrag.text=self.CONTENT 
     188            if self.CONTENT is not None: csmlfrag.text=cgi.escape(self.CONTENT) 
    189189        if 'ATTRIBUTES' in self.__dict__: 
    190190            for item in self.__dict__: 
     
    241241         
    242242    def fromXML(self,csmlfrag): 
     243        self.elem=csmlfrag 
    243244        # deal with attributes, e.g. gml id's 
    244245        if csmlfrag.text is not None: 
     
    419420        addchildren(self,children) 
    420421        csElement.__init__(self,**kwargs) 
    421 #'component':[CSML:('component'), 'ArrayDescriptor', CSML('component')], 
     422         
    422423 
    423424class MeasureOrNullList(AbstractGML,AssociationAttributeGroup, csElement): 
     
    607608            del self.insertedExtract  #don't want to expose this in XML         
    608609        csmlfrag=csElement.toXML(self,csmlfrag, **kwargs) 
    609         #This is mandatory even if empty when using xlink         
     610        #This is mandatory even if empty when using xlink                 
    610611        if not hasattr(self, 'timePositionList'): 
    611612            if not hasattr(self, 'coordinateList'): 
     
    10451046        addchildren(self,children) 
    10461047        csElement.__init__(self,**kwargs) 
     1048     
     1049    def fromXML(self,csmlfrag):         
     1050        ArrayDescriptor.fromXML(self,csmlfrag)          
     1051        if hasattr(self, 'fileListXLINK'): 
     1052            if hasattr(self, 'fileList'): 
     1053                del self.fileListXLINK 
     1054     
    10471055     
    10481056class NetCDFExtract(FileExtract, csElement): 
     
    12401248    print '\n' 
    12411249    #tree=ET.ElementTree(file='/home/dom/coapec/TESTocean.xml') 
    1242     tree=ET.ElementTree(file='/home/dom/coapec/COAPEC_500YrRun_wholerun_annual_atmos.xml') 
     1250    tree=ET.ElementTree(file='/home/dom/CSTEST/testout.xml') 
    12431251    import time 
    12441252    time1=time.time() 
    1245     ds=Dataset() 
     1253    #ds=Dataset() 
     1254    ds=csml.parser.Dataset() 
    12461255    ds.fromXML(tree.getroot())  
     1256    #ds =csml.parser_extra.ParserPostProcessor(ds).resolveReferences() 
    12471257    print 'time=',time.time()-time1 
     1258     
    12481259    csmltree=ds.toXML()     
    12491260    csmlout=parser_extra.PrettyPrint(csmltree) 
    12501261    csmlout=parser_extra.removeInlineNS(csmlout) 
     1262    f=open('temp.xml', 'w') 
     1263    f.write(csmlout) 
     1264    f.close() 
     1265         
    12511266    print 'time=',time.time()-time1 
    1252     #print '\n %s'% csmlout 
     1267    print '\n %s'% csmlout 
    12531268    #for member in ds.featureCollection.members: 
    12541269      #print dir(member.value) 
  • TI02-CSML/trunk/csml/parser_extra.py

    r2661 r2741  
    162162                            if dataforClist is not None: 
    163163                                    setattr(ordinate.coordAxisValues, 'insertedExtract', dataforClist) 
     164                            else: 
     165                                if ordinate.coordAxisValues.arcrole.split('#')[1] == 'timePositionList': 
     166                                    sptlist=csml.csmllibs.csmlextra.getObjbyGMLID(self.dataset.elem, ordinate.coordAxisValues.href[1:])                                     
     167                                    setattr(ordinate.coordAxisValues, 'timePositionList', sptlist.timePositionList) 
     168                                    del ordinate.coordAxisValues.href 
     169                                    del ordinate.coordAxisValues.show 
     170                                    del ordinate.coordAxisValues.role 
     171                                    del ordinate.coordAxisValues.arcrole 
     172                                    delattr (ordinate.coordAxisValues, '{http://www.w3.org/1999/xlink}href') 
     173                                    delattr (ordinate.coordAxisValues, '{http://www.w3.org/1999/xlink}show') 
     174                                    delattr (ordinate.coordAxisValues, '{http://www.w3.org/1999/xlink}role') 
     175                                    delattr (ordinate.coordAxisValues, '{http://www.w3.org/1999/xlink}arcrole') 
    164176                    break 
    165177             
Note: See TracChangeset for help on using the changeset viewer.