/[thuban]/branches/WIP-pyshapelib-bramz/Thuban/Model/classgen.py
ViewVC logotype

Diff of /branches/WIP-pyshapelib-bramz/Thuban/Model/classgen.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1387 by jonathan, Thu Jul 10 14:53:03 2003 UTC revision 2385 by jan, Thu Oct 7 14:28:51 2004 UTC
# Line 1  Line 1 
1  # Copyright (c) 2003 by Intevation GmbH  # Copyright (c) 2003-2004 by Intevation GmbH
2  # Authors:  # Authors:
3  # Jonathan Coles <[email protected]>  # Jan-Oliver Wagner <[email protected]> (2004)
4    # Bernhard Herzog <[email protected]> (2003)
5    # Thomas K�ster <[email protected]> (2003)
6    # Jonathan Coles <[email protected]> (2003)
7  #  #
8  # This program is free software under the GPL (>=v2)  # This program is free software under the GPL (>=v2)
9  # Read the file COPYING coming with Thuban for details.  # Read the file COPYING coming with Thuban for details.
# Line 20  from range import Range Line 23  from range import Range
23  from classification import Classification, ClassGroupSingleton, \  from classification import Classification, ClassGroupSingleton, \
24      ClassGroupRange, ClassGroupProperties      ClassGroupRange, ClassGroupProperties
25    
26  def generate_singletons(_list, ramp, fixes=(None, None, None)):  def generate_singletons(_list, ramp):
27      """Generate a new classification consisting solely of singletons.      """Generate a new classification consisting solely of singletons.
28    
29      The resulting classification will consist of one group for each      The resulting classification will consist of one group for each
# Line 29  def generate_singletons(_list, ramp, fix Line 32  def generate_singletons(_list, ramp, fix
32      _list -- a list of values for each singleton      _list -- a list of values for each singleton
33    
34      ramp -- an object which implements the CustomRamp interface      ramp -- an object which implements the CustomRamp interface
   
     fixes -- a tuple (lineColor, lineWidth, fillColor) such that  
              if any item is not None, the appropriate property will  
              be fixed to that item value.  
35      """      """
36    
37      clazz = Classification()      clazz = Classification()
# Line 43  def generate_singletons(_list, ramp, fix Line 42  def generate_singletons(_list, ramp, fix
42    
43      for value in _list:      for value in _list:
44          prop = ramp.GetProperties(i / maxValue)          prop = ramp.GetProperties(i / maxValue)
         if fixes[0] is not None: prop.SetLineColor(fixes[0])  
         if fixes[1] is not None: prop.SetLineWidth(fixes[1])  
         if fixes[2] is not None: prop.SetFill(fixes[2])  
45          clazz.AppendGroup(ClassGroupSingleton(value, prop))          clazz.AppendGroup(ClassGroupSingleton(value, prop))
46          i += 1          i += 1
47    
48      return clazz      return clazz
49    
50  def generate_uniform_distribution(min, max, numGroups, ramp, intStep = False,  def generate_uniform_distribution(min, max, numGroups, ramp, intStep = False):
                                   fixes = (None, None, None)):  
51      """Generate a classification with numGroups range groups      """Generate a classification with numGroups range groups
52      each with the same interval.      each with the same interval.
53    
# Line 60  def generate_uniform_distribution(min, m Line 55  def generate_uniform_distribution(min, m
55                 Useful if the values are integers but the                 Useful if the values are integers but the
56                 number of groups specified doesn't evenly                 number of groups specified doesn't evenly
57                 divide (max - min).                 divide (max - min).
   
     fixes -- a tuple (lineColor, lineWidth, fillColor) such that  
              if any item is not None, the appropriate property will  
              be fixed to that item value.  
58      """      """
59    
60      clazz = Classification()      clazz = Classification()
# Line 92  def generate_uniform_distribution(min, m Line 83  def generate_uniform_distribution(min, m
83          else:          else:
84              _range = Range(("[", cur_min, cur_max, end))              _range = Range(("[", cur_min, cur_max, end))
85    
         if fixes[0] is not None: prop.SetLineColor(fixes[0])  
         if fixes[1] is not None: prop.SetLineWidth(fixes[1])  
         if fixes[2] is not None: prop.SetFill(fixes[2])  
   
86          clazz.AppendGroup(ClassGroupRange(_range, prop))          clazz.AppendGroup(ClassGroupRange(_range, prop))
87    
88          cur_min = cur_max          cur_min = cur_max
89    
90      return clazz      return clazz
91    
92  def generate_quantiles(_list, percents, ramp, _range, fixes=(None, None, None)):  def generate_quantiles(_list, percents, ramp, _range):
93      """Generates a Classification which has groups of ranges that      """Generates a Classification which has groups of ranges that
94      represent quantiles of _list at the percentages given in percents.      represent quantiles of _list at the percentages given in percents.
95      Only the values that fall within _range are considered.      Only the values that fall within _range are considered.
# Line 122  def generate_quantiles(_list, percents, Line 109  def generate_quantiles(_list, percents,
109    
110      _range -- a Range object      _range -- a Range object
111    
     fixes -- a tuple (lineColor, lineWidth, fillColor) such that  
              if any item is not None, the appropriate property will  
              be fixed to that item value.  
   
112      Raises a Value Error if 'percents' has fewer than two items, or      Raises a Value Error if 'percents' has fewer than two items, or
113      does not cover the entire range.      does not cover the entire range.
114      """      """
# Line 160  def generate_quantiles(_list, percents, Line 143  def generate_quantiles(_list, percents,
143                  else:                  else:
144                      max = _list[q]                      max = _list[q]
145    
                 if fixes[0] is not None: prop.SetLineColor(fixes[0])  
                 if fixes[1] is not None: prop.SetLineWidth(fixes[1])  
                 if fixes[2] is not None: prop.SetFill(fixes[2])  
   
146                  group = ClassGroupRange(Range((start, min, max, end)), prop)                  group = ClassGroupRange(Range((start, min, max, end)), prop)
       
                 group.SetLabel("%s%% - %s%%" % (round(oldp*100, 2),  
                                                 round(p*100, 2)))  
                 oldp = p  
                 start = "]"  
                 min = max  
                 clazz.AppendGroup(group)  
                 i += 1  
   
     return (adjusted, clazz)  
   
 def GenQuantiles0(_list, percents, ramp, _range):  
     """Same as GenQuantiles, but the first class won't be added to  
     the classification.  
   
     Returns a tuple (adjusted, Classification, upper_class0) where  
     upper_class0 is the highest value inside the first class.  
   
     _list -- a sort list of values  
   
     percents -- a sorted list of floats in the range 0.0-1.0 which  
                 represent the upper bound of each quantile. the  
                 union of all percentiles should be the entire  
                 range from 0.0-1.0  
   
     ramp -- an object which implements the CustomRamp interface  
   
     _range -- a Range object  
   
     Raises a Value Error if 'percents' has fewer than two items, or  
     does not cover the entire range.  
     """  
   
     clazz = Classification()  
     quantiles = calculate_quantiles(_list, percents, _range)  
     adjusted = True  
   
     if quantiles is not None:  
   
         numGroups = len(quantiles[3]) - 1  
   
         if numGroups > 0:  
             adjusted = quantiles[0]  
147    
             start, min, endMax, right = _range.GetRange()  
   
             class0 = quantiles[3][0]  
             min = _list[class0[0]]  
             oldp = class0[1]  
             i = 1  
             end = "]"  
   
             maxValue = float(numGroups - 1)  
             if maxValue < 1: maxValue = 1  
             for (q, p) in quantiles[3][1:]:  
                 prop = ramp.GetProperties(float(i-1) / maxValue)  
   
                 if i == numGroups:  
                     max = endMax  
                     end = right  
                 else:  
                     max = _list[q]  
   
                 group = ClassGroupRange(Range((start, min, max, end)), prop)  
       
148                  group.SetLabel("%s%% - %s%%" % (round(oldp*100, 2),                  group.SetLabel("%s%% - %s%%" % (round(oldp*100, 2),
149                                                  round(p*100, 2)))                                                  round(p*100, 2)))
150                  oldp = p                  oldp = p
# Line 238  def GenQuantiles0(_list, percents, ramp, Line 153  def GenQuantiles0(_list, percents, ramp,
153                  clazz.AppendGroup(group)                  clazz.AppendGroup(group)
154                  i += 1                  i += 1
155    
156      return (adjusted, clazz, _list[class0[0]])      return (adjusted, clazz)
157    
158    
159  def calculate_quantiles(_list, percents, _range):  def calculate_quantiles(_list, percents, _range):
160      """Calculate quantiles for the given _list of percents from the      """Calculate quantiles for the given _list of percents from the
161      sorted list of values that are in range.      sorted list of values that are in range.
162                                                                                
163      This may not actually generate len(percents) quantiles if      This may not actually generate len(percents) quantiles if
164      many of the values that fall on quantile borders are the same.      many of the values that fall on quantile borders are the same.
165    
# Line 401  def calculate_quantiles(_list, percents, Line 316  def calculate_quantiles(_list, percents,
316  class CustomRamp:  class CustomRamp:
317    
318      def __init__(self, prop1, prop2):      def __init__(self, prop1, prop2):
319            """Create a ramp between prop1 and prop2."""
320          self.prop1 = prop1          self.prop1 = prop1
321          self.prop2 = prop2          self.prop2 = prop2
322    
323      def GetRamp(self):      def GetRamp(self):
324            """Return this ramp."""
325          return self          return self
326    
327      def GetProperties(self, index):      def GetProperties(self, index):
# Line 431  class CustomRamp: Line 348  class CustomRamp:
348              + self.prop1.GetLineWidth()              + self.prop1.GetLineWidth()
349          newProps.SetLineWidth(int(round(w)))          newProps.SetLineWidth(int(round(w)))
350    
351            s = (self.prop2.GetSize() - self.prop1.GetSize()) \
352                * index \
353                + self.prop1.GetSize()
354            newProps.SetSize(int(round(s)))
355    
356          return newProps          return newProps
357    
358      def __SetProperty(self, color1, color2, index, setf):      def __SetProperty(self, color1, color2, index, setf):
359            """Use setf to set the appropriate property for the point
360            index percent between color1 and color2. setf is a function
361            to call that accepts a Color object or Transparent.
362            """
363    
364          if color1 is Transparent and color2 is Transparent:          if color1 is Transparent and color2 is Transparent:
365              setf(Transparent)              setf(Transparent)
# Line 454  class CustomRamp: Line 380  class CustomRamp:
380                  (color2.blue  - color1.blue)  * index + color1.blue))                  (color2.blue  - color1.blue)  * index + color1.blue))
381    
382  class MonochromaticRamp(CustomRamp):  class MonochromaticRamp(CustomRamp):
383        """Helper class to make ramps between two colors."""
384    
385      def __init__(self, start, end):      def __init__(self, start, end):
386            """Create a Monochromatic Ramp.
387    
388            start -- starting Color
389    
390            end -- ending Color
391            """
392          sp = ClassGroupProperties()          sp = ClassGroupProperties()
393          sp.SetLineColor(start)          sp.SetLineColor(start)
394          sp.SetFill(start)          sp.SetFill(start)
# Line 465  class MonochromaticRamp(CustomRamp): Line 399  class MonochromaticRamp(CustomRamp):
399    
400          CustomRamp.__init__(self, sp, ep)          CustomRamp.__init__(self, sp, ep)
401    
402  GreyRamp       = MonochromaticRamp(Color(1, 1, 1),  Color(0, 0, 0))  grey_ramp         = MonochromaticRamp(Color(1, 1, 1),  Color(0, 0, 0))
403  RedRamp        = MonochromaticRamp(Color(1, 1, 1),  Color(.8, 0, 0))  red_ramp          = MonochromaticRamp(Color(1, 1, 1),  Color(.8, 0, 0))
404  GreenRamp      = MonochromaticRamp(Color(1, 1, 1),  Color(0, .8, 0))  green_ramp        = MonochromaticRamp(Color(1, 1, 1),  Color(0, .8, 0))
405  BlueRamp       = MonochromaticRamp(Color(1, 1, 1),  Color(0, 0, .8))  blue_ramp         = MonochromaticRamp(Color(1, 1, 1),  Color(0, 0, .8))
406  GreenToRedRamp = MonochromaticRamp(Color(0, .8, 0), Color(1, 0, 0))  green_to_red_ramp = MonochromaticRamp(Color(0, .8, 0), Color(1, 0, 0))
407    
408  class HotToColdRamp:  class HotToColdRamp:
409        """A ramp that generates properties with colors ranging from
410        'hot' colors (e.g. red, orange) to 'cold' colors (e.g. green, blue)
411        """
412    
413      def GetRamp(self):      def GetRamp(self):
414            """Return this ramp."""
415          return self          return self
416    
417      def GetProperties(self, index):      def GetProperties(self, index):
# Line 504  class HotToColdRamp: Line 442  class HotToColdRamp:
442    
443          return prop          return prop
444    
445    class FixedRamp:
446        """FixedRamp allows particular properties of a ramp to be
447        held constant over the ramp.
448        """
449    
450        def __init__(self, ramp, fixes):
451            """
452            ramp -- a source ramp to get the default properties
453    
454            fixes -- a tuple (lineColor, lineWidth, fillColor) such that
455                 if any item is not None, the appropriate property will
456                 be fixed to that item value.
457            """
458    
459            self.fixes = fixes
460            self.ramp = ramp
461    
462        def GetRamp(self):
463            """Return this ramp."""
464            return self
465    
466        def GetProperties(self, index):
467            """Return a ClassGroupProperties object whose properties
468            represent a point at 'index' between the properties in
469            the ramp that initialized this FixedRamp.
470    
471            index -- a value such that 0 <= index <= 1
472            """
473    
474            props = self.ramp.GetProperties(index)
475            if self.fixes[0] is not None: props.SetLineColor(self.fixes[0])
476            if self.fixes[1] is not None: props.SetLineWidth(self.fixes[1])
477            if self.fixes[2] is not None: props.SetFill(self.fixes[2])
478    
479            return props

Legend:
Removed from v.1387  
changed lines
  Added in v.2385

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26