Changeset 2907 for TI02-CSML


Ignore:
Timestamp:
28/09/07 14:52:19 (12 years ago)
Author:
domlowe
Message:

Bounding boxes now correctly determined by scanner

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

Legend:

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

    r2890 r2907  
    5050def parseElemTree(self, elemtree): 
    5151    ''''alternative parsing method, supply with elementtree instance instead of file/uri''' 
    52     #import time 
    53     #t1=time.time() 
     52    self.fromXML(elemtree) 
     53    self =csml.parser_extra.ParserPostProcessor(self).resolveReferences() 
    5454     
    55     self.fromXML(elemtree) 
    56     #print 'time 1: ',time.time()-t1       
    57     self =csml.parser_extra.ParserPostProcessor(self).resolveReferences() 
     55def _checkChildren(self, parent): 
     56    ''' method used by iterate ''' 
     57    if hasattr(parent, 'CHILDREN'): 
     58        for o in parent.CHILDREN: 
     59            child=None 
     60            try: 
     61                child=getattr(parent,o) 
     62            except: 
     63                pass               
     64            if child is not None: 
     65                if type(child) is list: 
     66                    for item in child: 
     67                        self.allobjects.append(item) 
     68                        self._checkChildren(item) 
     69                else: 
     70                    self.allobjects.append(child) 
     71                    self._checkChildren(child) 
     72                     
     73def iterate(self): 
     74    ''' returns an iterable list of all objects in the dataset. No order or hierarchy is preserved. Useful for searching quickly for something''' 
     75    self.allobjects=[] 
     76    self._checkChildren(self) 
     77    return self.allobjects 
    5878     
    5979def getSecurity(self): 
  • TI02-CSML/trunk/csml/csmllibs/csmlbuilder.py

    r2901 r2907  
    3939        self.createFeatures() 
    4040        self.insertXlinks() 
     41        self.insertBoundingBoxes() 
    4142        self.saveFile() 
    4243        self.printToScreen() 
     
    117118            pass 
    118119        setattr(self.featureCollection, 'id', csml.csmllibs.csmlextra.getRandomID()) 
     120         
     121        self.ds.featureCollection=self.featureCollection 
     122                 
    119123        try: 
    120124            self.featureCollection =csml.csmllibs.csmlextra.addEnvelope(self.featureCollection, self.ffmap)         
     
    128132        self.ds=csml.csmllibs.csmlxlink.createXlinks(self.ds) 
    129133         
     134    def insertBoundingBoxes(self): 
     135        self.ds.featureCollection =csml.csmllibs.csmlextra.addBoundingBoxes(self.ds)                 
    130136         
    131137    def saveFile(self): 
  • TI02-CSML/trunk/csml/csmllibs/csmlextra.py

    r2904 r2907  
    132132        return mr 
    133133         
     134         
     135def _getEnvelopeFromLimits(limits, axislabels): 
     136    env = csml.parser.EnvelopeWithTimePeriod() 
     137     
     138    #simplistic reduction to remove time from CRS.  
     139    if limits['crs'][-1:] =='t': 
     140        env.srsName=limits['crs'][:-1] 
     141    else: 
     142        env.srsName=limits['crs'] 
     143         
     144    if env.srsName == 'ndg:crs:lonlat': 
     145        limits['crs'] ='WGS84'       
     146        env.srsName = 'WGS84'       
     147     
     148    lowCorner= '' 
     149    upCorner='' 
     150    for axis in axislabels.split(): 
     151        if axis != 'time': 
     152            try: 
     153                lowCorner = lowCorner + str(limits[axis][0]) + ' ' 
     154                upCorner = upCorner + str(limits[axis][1]) + ' ' 
     155            except: 
     156                pass 
     157        else: 
     158            env.beginPosition=csml.parser.csString(limits[axis][0]) 
     159            env.endPosition=csml.parser.csString(limits[axis][1]) 
     160    env.lowerCorner  = csml.parser.csString(lowCorner) 
     161    env.upperCorner  = csml.parser.csString(upCorner) 
     162    return env 
     163 
     164def addBoundingBoxes(ds): 
     165    '''Adds envelop with timeperiod to each feature, currently only works on GridSeriesFeatures but extendable.''' 
     166    timename='time' 
     167    cat=csml.csmllibs.csmlcrs.CRSCatalogue() 
     168    xlinkresolver=csml.csmllibs.csmlxlink.XlinkResolver(ds) 
     169    for feature in ds.featureCollection.featureMembers: 
     170        limits={} 
     171        if type(feature) is csml.parser.GridSeriesFeature:     
     172            crsName=feature.value.gridSeriesDomain.srsName 
     173            limits['crs']=crsName 
     174            crs=cat.getCRS(feature.value.gridSeriesDomain.srsName) 
     175            axislabels=feature.value.gridSeriesDomain.axisLabels 
     176            for ord in feature.value.gridSeriesDomain.coordTransformTable.gridOrdinates:         
     177                if ord.coordAxisLabel.CONTENT==timename: 
     178                    try:                         
     179                        tmin= strToDate(ord.coordAxisValues.timePositionList.CONTENT.split()[0].split('T')[0]) 
     180                        tmax=strToDate( ord.coordAxisValues.timePositionList.CONTENT.split()[len(ord.coordAxisValues.timePositionList.CONTENT.split())-1].split('T')[0]) 
     181                    except AttributeError: 
     182                        sptlist=xlinkresolver.resolveXlink(ord.coordAxisValues.href[1:])                                
     183                        try: 
     184                            tmin= strToDate(sptlist.timePositionList.CONTENT.split()[0].split('T')[0]) 
     185                            tmax=strToDate(sptlist.timePositionList.CONTENT.split()[len(sptlist.timePositionList.CONTENT.split())-1].split('T')[0]) 
     186                        except: 
     187                            tmin, tmax=0,0 
     188                    limits[timename]=[tmin,tmax] 
     189                else: 
     190                    if hasattr(ord.coordAxisValues, 'insertedExtract'): 
     191                        data=ord.coordAxisValues.insertedExtract.getData()[0].tolist() 
     192                    else: 
     193                        fileextract= xlinkresolver.resolveXlink(ord.coordAxisValues.href[1:])                                
     194                        data=fileextract.getData()[0].tolist() 
     195                    data.sort() 
     196                    minval=data[0] 
     197                    maxval=data[len(data)-1] 
     198                    limits[ord.coordAxisLabel.CONTENT]=[minval,maxval] 
     199        feature.boundedBy=_getEnvelopeFromLimits(limits, axislabels) 
     200    return ds.featureCollection 
     201 
     202 
     203 
     204 
    134205 
    135206def addEnvelope(fc, ffmap): 
  • TI02-CSML/trunk/csml/csmllibs/csmlxlink.py

    r2741 r2907  
    4040    return ds 
    4141    
    42 def resolveXlink(csElement, csDocument): 
    43     '''takes a CSML element, containing Xlinks and resolves them within the csDocument''' 
    44     if hasattr(csElement, 'arcrole'): 
    45        usage=csElement.arcrole.split('#')[0] 
    46        elem=csElement.arcrole.split('#')[1] 
    47        #if usage=='http://ndg.nerc.ac.uk/xlinkUsage/insert': 
    48            #for child in csElement.CHILDREN: 
    49                ##print getattr(csElement, child).__class__ 
    50                ##print csElement.CHILDREN 
    51                #if getattr(csElement, child).__class__ == elem: 
    52                    #print 'yes' 
    53      
    54     return csDocument 
     42    
     43class XlinkResolver(object): 
     44    def __init__(self, ds): 
     45            ''' iterate the ds and store list of objects''' 
     46            items=ds.iterate() 
     47            self.itemdict={} 
     48            for item in items: 
     49                if hasattr(item, 'id'): 
     50                    self.itemdict[item.id]=item 
     51             
     52             
     53    def resolveXlink(self, xlinkid): 
     54        f=open('x.txt' ,'w') 
     55        f.write(xlinkid) 
     56        f.write(str(self.itemdict)) 
     57        try: 
     58            return self.itemdict[xlinkid] 
     59        except KeyError: 
     60            print 'keyerror' 
     61            return None 
     62      
Note: See TracChangeset for help on using the changeset viewer.