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

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

second attempt at fixing longitude bug

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    def _anyitemlessthanzero(listofitems):
17        for item in listofitems:
18            if item <0:
19                return True
20        return False
21    for key in request.keys():
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?
26                if _anyitemlessthanzero(request[key]):
27                    pass #no need to convert request if data is also -ve to +ve
28                else:                                     
29                    lonMin=kwargs[key][0]
30                    lonMax=kwargs[key][1]                                       
31                    if lonMin >=0:
32                        pass
33                    else:                   
34                        new_lonMin = (lonMin + 360.0) % 360.0
35                        new_lonMax = (lonMax + 360.0) % 360.0   
36                        if new_lonMin == new_lonMax:
37                            kwargs[key]=(0, 360)       
38                        else:
39                            kwargs[key]=(new_lonMin, new_lonMax)
40    return kwargs
41                       
42                       
43                       
44def nudgeSingleValuesToAxisValues(value, axisValues):
45        """
46        Takes a value and checks if it is in the axisValues array. If not, it nudges the
47        value to the nearest neighbour in axis. It returns the new value twice along
48        with a message describing the change.
49        """
50
51        rtMessage=""
52        newValue=None
53       
54        def __fixTimes(value, axisValues):
55            newValue = csml.csmllibs.csmltime.getTimeAsValue(value)
56            newAxisValues=[]
57            for ax in axisValues:
58                newAxisValues.append(csml.csmllibs.csmltime.getTimeAsValue(ax))
59            return newValue, newAxisValues               
60       
61        if value in axisValues:
62            newValue=value
63        else:           
64            if str(value).find('T') != -1:
65                value, axisValues=__fixTimes(value,axisValues)
66            sortedAxis=[]
67            for i in axisValues:
68                sortedAxis.append(i)
69            sortedAxis.sort()   
70            if value<sortedAxis[0]:
71                newValue=sortedAxis[0]
72            elif value>sortedAxis[-1]:
73                newValue=sortedAxis[-1]
74            else:
75                for i in range(len(axisValues)):
76                    if i<(len(axisValues)-1):
77                        (current, nextone)=(axisValues[i], axisValues[i+1])
78                        if current>nextone:
79                            tempc=nextone
80                            nextone=current
81                            current=tempc
82                        if value>current and value<nextone:
83                            lowergap=value-current
84                            uppergap=nextone-value
85                            if uppergap==lowergap:
86                                newValue=nextone
87                            elif uppergap>lowergap:
88                                newValue=current
89                            elif uppergap<lowergap:
90                                newValue=nextone                       
91                            break
92            if newValue==None:
93                axisType='unknown'
94                rtMessage="%s axis selected value '%s' nudged to nearest value in real axis '%s' ;" % (axisType, value, newValue)       
95        #        print rtMessag
96        if type(newValue) is float:
97            if len(str(int(newValue))) ==14: # it's a time
98                newValue=csml.csmllibs.csmltime.convertValueToCSML(newValue)   
99        return (newValue)                           
Note: See TracBrowser for help on using the repository browser.