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

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

fixes to do with arrays/lists/nearestneighbours

Line 
1'''csml utils contains useful  utility functions'''
2import csml
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:
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.
15def fixLongitude(request, kwargs):
16    for key in request.keys():
17        if kwargs.has_key(key):
18            if type(kwargs[key]) is not tuple:
19                continue
20            elif key == 'longitude': #how do we test if it is longitude properly?
21                for val in request[key]:
22                    if val < 0:
23                        pass
24                    else:
25                        if kwargs[key][0] < 0:
26                            kwargs[key]=(kwargs[key][0]+360,kwargs[key][1])
27                        if kwargs[key][1] < 0:
28                            kwargs[key]=(kwargs[key][0],kwargs[key][1]+360)
29    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        print 'new'
40        print type(value) 
41        print value   
42        rtMessage=""
43        newValue=None
44       
45        def __fixTimes(value, axisValues):
46            newValue = csml.csmllibs.csmltime.getTimeAsValue(value)
47            newAxisValues=[]
48            for ax in axisValues:
49                newAxisValues.append(csml.csmllibs.csmltime.getTimeAsValue(ax))
50            return newValue, newAxisValues               
51       
52        if value in axisValues:
53            newValue=value
54        else:           
55            if str(value).find('T') != -1:
56                value, axisValues=__fixTimes(value,axisValues)
57            sortedAxis=[]
58            for i in axisValues:
59                sortedAxis.append(i)
60            sortedAxis.sort()   
61            if value<sortedAxis[0]:
62                newValue=sortedAxis[0]
63            elif value>sortedAxis[-1]:
64                newValue=sortedAxis[-1]
65            else:
66                for i in range(len(axisValues)):
67                    if i<(len(axisValues)-1):
68                        (current, nextone)=(axisValues[i], axisValues[i+1])
69                        if current>nextone:
70                            tempc=nextone
71                            nextone=current
72                            current=tempc
73                        if value>current and value<nextone:
74                            lowergap=value-current
75                            uppergap=nextone-value
76                            if uppergap==lowergap:
77                                newValue=nextone
78                            elif uppergap>lowergap:
79                                newValue=current
80                            elif uppergap<lowergap:
81                                newValue=nextone                       
82                            break
83            if newValue==None:
84                rtMessage="%s axis selected value '%s' nudged to nearest value in real axis '%s' ;" % (axisType, value, newValue)       
85        #        print rtMessag
86        if type(newValue) is float:
87            if len(str(int(newValue))) ==14: # it's a time
88                print newValue
89                newValue=csml.csmllibs.csmltime.convertValueToCSML(newValue)   
90        print type(newValue)
91        print newValue
92        return (newValue)                           
Note: See TracBrowser for help on using the repository browser.