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

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

Changes to allow xlinking of timeposition lists. Changes to scanner and parser code. Now need to rescan coapec test data fully

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                 
42def nudgeSingleValuesToAxisValues(value, axisValues, minBound=None, maxBound=None):
43        """
44        Takes a value and checks if it is in the axisValues array. If not, it nudges the
45        value to the nearest neighbour in axis. It returns the new value twice along
46        with a message describing the change.
47       
48        minBound and maxBound added as options.
49        If a value is outside of minBound or maxBound it is nudged so that it is within.
50       
51        TODO - rewrite this so it is legible!
52       
53        """
54        bounds=False
55        reverseBounds=False
56       
57        #determine if bounds have been provided and if they are of the form (-30,30)  or (330, 30)
58        if minBound!=None:
59            if maxBound!=None:                               
60                bounds =True
61                if minBound > maxBound:           
62                    reverseBounds = True
63        rtMessage=""
64        newValue=None
65        def __fixTimes(value, axisValues):
66            newValue = csml.csmllibs.csmltime.getTimeAsValue(value)
67            newAxisValues=[]
68            for ax in axisValues:
69                newAxisValues.append(csml.csmllibs.csmltime.getTimeAsValue(ax))
70            return newValue, newAxisValues               
71       
72        if value in axisValues:
73            newValue=value
74        else:           
75            if str(value).find('T') != -1:
76                minBound,minBound=None,None,
77                bounds,reverseBounds=False,False             
78                value, axisValues=__fixTimes(value,axisValues)
79            sortedAxis=[]           
80            if bounds == True:
81               if reverseBounds!=True:
82                    for i in axisValues:
83                        if i >= minBound:
84                            if i <= maxBound:
85                                sortedAxis.append(i)
86                         
87               else:
88                   for i in axisValues:
89                       if i >= minBound:
90                           sortedAxis.append(i)
91                       elif i >= maxBound:
92                            sortedAxis.append(i)                                     
93            else:
94                for i in axisValues:
95                    sortedAxis.append(i)
96            sortedAxis.sort()   
97
98            if value<sortedAxis[0]:
99                if sortedAxis[0] < maxBound:
100                    newValue=sortedAxis[0]
101                else:
102                    newValue=sortedAxis[-1]
103            elif value>sortedAxis[-1]:
104                newValue=sortedAxis[-1]
105            else:
106                for i in range(len(axisValues)):
107                    if i<(len(axisValues)-1):
108                        (current, nextone)=(axisValues[i], axisValues[i+1])
109                        if current>nextone:
110                            tempc=nextone
111                            nextone=current
112                            current=tempc
113                        if value>current and value<nextone:
114                            lowergap=value-current
115                            uppergap=nextone-value
116                            if uppergap==lowergap:
117                                newValue=nextone
118                            elif uppergap>lowergap:
119                                newValue=current
120                            elif uppergap<lowergap:
121                                newValue=nextone                       
122                            break
123            if newValue==None:
124                axisType='unknown'
125                rtMessage="%s axis selected value '%s' nudged to nearest value in real axis '%s' ;" % (axisType, value, newValue)       
126        #        print rtMessag
127        if type(newValue) is float:
128            if len(str(int(newValue))) ==14: # it's a time
129                newValue=csml.csmllibs.csmltime.convertValueToCSML(newValue)   
130        return (newValue)   
131               
Note: See TracBrowser for help on using the repository browser.