source: TI02-CSML/trunk/csml/API/csmlutils.py @ 2587

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI02-CSML/trunk/csml/API/csmlutils.py@2587
Revision 2587, 3.5 KB checked in by domlowe, 13 years ago (diff)

fixed bug where nearest neighbour search conflicted with longitude transformation

RevLine 
[1938]1'''csml utils contains useful  utility functions'''
[2206]2import csml
[1938]3
4def listify(item):
5    ''' listify checks if an item is a list, if it isn't it puts it inside a list and returns it. Always returns a list object'''
6    if type(item) is list:
7        return item
8    else:
[1939]9        return [item]
10   
11   
12   
13#deal with longitude requests
14#if the request is in -ve,+ve eg (-30,30) but the data is in (0,360) need to handle this by changing the args.
[2495]15def fixLongitude(request, kwargs): 
16    def _anyitemlessthanzero(listofitems):
17        for item in listofitems:
18            if item <0:
19                return True
20        return False
[1939]21    for key in request.keys():
[2156]22        if kwargs.has_key(key):
23            if type(kwargs[key]) is not tuple:
24                continue
25            elif key == 'longitude': #how do we test if it is longitude properly?
[2495]26                if _anyitemlessthanzero(request[key]):
27                    pass #no need to convert request if data is also -ve to +ve
[2587]28                else:                 
29                    for val in request[key]:                       
[2495]30                        if val < 0:
31                            pass
[2587]32                        else:       
[2495]33                            if kwargs[key][0] < 0:
34                                kwargs[key]=(kwargs[key][0]+360,kwargs[key][1])
35                            if kwargs[key][1] < 0:
36                                kwargs[key]=(kwargs[key][0],kwargs[key][1]+360)
[2155]37    return kwargs
38                       
39                       
40                       
41def nudgeSingleValuesToAxisValues(value, axisValues):
42        """
43        Takes a value and checks if it is in the axisValues array. If not, it nudges the
44        value to the nearest neighbour in axis. It returns the new value twice along
45        with a message describing the change.
46        """
[2209]47
[2155]48        rtMessage=""
49        newValue=None
[2208]50       
[2206]51        def __fixTimes(value, axisValues):
52            newValue = csml.csmllibs.csmltime.getTimeAsValue(value)
53            newAxisValues=[]
54            for ax in axisValues:
55                newAxisValues.append(csml.csmllibs.csmltime.getTimeAsValue(ax))
56            return newValue, newAxisValues               
[2155]57       
[2206]58        if value in axisValues:
[2155]59            newValue=value
[2206]60        else:           
61            if str(value).find('T') != -1:
62                value, axisValues=__fixTimes(value,axisValues)
[2155]63            sortedAxis=[]
64            for i in axisValues:
65                sortedAxis.append(i)
[2206]66            sortedAxis.sort()   
[2155]67            if value<sortedAxis[0]:
68                newValue=sortedAxis[0]
69            elif value>sortedAxis[-1]:
70                newValue=sortedAxis[-1]
71            else:
72                for i in range(len(axisValues)):
73                    if i<(len(axisValues)-1):
74                        (current, nextone)=(axisValues[i], axisValues[i+1])
75                        if current>nextone:
76                            tempc=nextone
77                            nextone=current
78                            current=tempc
79                        if value>current and value<nextone:
80                            lowergap=value-current
81                            uppergap=nextone-value
82                            if uppergap==lowergap:
83                                newValue=nextone
84                            elif uppergap>lowergap:
85                                newValue=current
86                            elif uppergap<lowergap:
87                                newValue=nextone                       
88                            break
89            if newValue==None:
[2361]90                axisType='unknown'
[2155]91                rtMessage="%s axis selected value '%s' nudged to nearest value in real axis '%s' ;" % (axisType, value, newValue)       
[2208]92        #        print rtMessag
93        if type(newValue) is float:
[2206]94            if len(str(int(newValue))) ==14: # it's a time
95                newValue=csml.csmllibs.csmltime.convertValueToCSML(newValue)   
[2208]96        return (newValue)                           
Note: See TracBrowser for help on using the repository browser.