Changeset 2155 for TI02-CSML


Ignore:
Timestamp:
13/02/07 13:29:33 (13 years ago)
Author:
domlowe
Message:

Nudge to nearest neighbour function added to enable approximate requests for data - thanks Ag

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

Legend:

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

    r2149 r2155  
    2828                            kwargs[key]=(kwargs[key][0],kwargs[key][1]+360) 
    2929    return kwargs 
     30                         
     31                         
     32                         
     33def nudgeSingleValuesToAxisValues(value, axisValues): 
     34        """ 
     35        Takes a value and checks if it is in the axisValues array. If not, it nudges the  
     36        value to the nearest neighbour in axis. It returns the new value twice along  
     37        with a message describing the change. 
     38        """ 
     39        #import cdms 
     40        rtMessage="" 
     41        newValue=None 
     42         
     43        if value in axisValues: 
     44            newValue=value 
     45        else: 
     46            sortedAxis=[] 
     47            for i in axisValues: 
     48                sortedAxis.append(i) 
     49            sortedAxis.sort() 
     50             
     51            if value<sortedAxis[0]: 
     52                newValue=sortedAxis[0] 
     53            elif value>sortedAxis[-1]: 
     54                newValue=sortedAxis[-1] 
     55            else: 
     56                for i in range(len(axisValues)): 
     57                    if i<(len(axisValues)-1): 
     58                        (current, nextone)=(axisValues[i], axisValues[i+1]) 
     59                        if current>nextone: 
     60                            tempc=nextone 
     61                            nextone=current 
     62                            current=tempc 
     63                     
     64                        if value>current and value<nextone: 
     65                            lowergap=value-current 
     66                            uppergap=nextone-value 
     67                            if uppergap==lowergap: 
     68                                newValue=nextone 
     69                            elif uppergap>lowergap: 
     70                                newValue=current 
     71                            elif uppergap<lowergap: 
     72                                newValue=nextone                         
     73                            break 
     74            if newValue==None: 
     75                rtMessage="%s axis selected value '%s' nudged to nearest value in real axis '%s' ;" % (axisType, value, newValue)        
     76                print rtMessage          
     77                     
     78        return (newValue)                             
  • TI02-CSML/trunk/csml/API/genSubset.py

    r2149 r2155  
    44import csml 
    55import csmlutils 
    6  
     6import sys 
     7 
     8def checkNeighbours(domain, **kwargs): 
     9        #for any non-range requests, get nearest neighbour 
     10    #e.g if 'latitude': (11) requested, latitude=12 may be the nearest value 
     11    for key in kwargs:       
     12        #handle single values 
     13        if type(kwargs[key]) is not tuple: 
     14            nearestNeighbour=csml.API.csmlutils.nudgeSingleValuesToAxisValues(kwargs[key],domain[key]) 
     15            if nearestNeighbour is not None: 
     16                kwargs[key]=nearestNeighbour     
     17        else: 
     18            #handle ranges 
     19            tmpkey=[] 
     20            for val in kwargs[key]: 
     21                nearestNeighbour=csml.API.csmlutils.nudgeSingleValuesToAxisValues(val, domain[key]) 
     22                if nearestNeighbour is not None: 
     23                    tmpkey.append(nearestNeighbour)    
     24                kwargs[key]=tuple(tmpkey) 
     25    return kwargs 
    726 
    827def subsetDomain(timeaxis,times, domain,**kwargs): 
     
    1534    totalArraySize=1 
    1635    for key in domain.keys(): 
     36        print key 
    1737        straxisValues='' 
    1838        if key in kwargs: 
     
    2141                arraySize=len(strTimes.split()) 
    2242            elif type(kwargs[key]) is not tuple: 
    23                 #only one value not a range. 
     43                #only one value not a range 
    2444                straxisValues=str(kwargs[key])   
    2545            elif kwargs[key][0] < kwargs[key][1]:    
  • TI02-CSML/trunk/csml/API/ops_GridSeriesFeature.py

    r2144 r2155  
    3434    return self.domain 
    3535 
     36 
    3637     
    3738def subsetToGridSeries(self, csmlpath=None, ncpath=None,**kwargs): 
     39        
    3840    #set self.domain: 
    39     self.getDomain() 
     41    self.getDomain()       
     42     
     43    #if request doesn't match domain points find nearest neighbours 
     44    kwargs=csml.API.genSubset.checkNeighbours(self.domain, **kwargs) 
    4045     
    4146    #get the CRS from a  the  catalogue 
  • TI02-CSML/trunk/csml/DDC/obs/clim10subset.py

    r2149 r2155  
    3939subsetDictionary={} 
    4040subsetDictionary['time']=('1985-1-15T0:0:0.0') 
    41 subsetDictionary['latitude']=(88.75) 
    42 subsetDictionary['longitude']=(4.25) 
     41subsetDictionary['latitude']=(12,88.85) 
     42subsetDictionary['longitude']=(53.66, 55) 
    4343#request subsetted data from features (can set paths here) and add to container 
    4444#subset a feature 
Note: See TracChangeset for help on using the changeset viewer.