/[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 1361 by jonathan, Wed Jul 2 12:59:20 2003 UTC revision 2441 by joey, Thu Dec 9 10:50:34 2004 UTC
# Line 1  Line 1 
1  # Copyright (c) 2003 by Intevation GmbH  # -*- encoding: iso-8859-1 -*-
2    #
3    # Copyright (c) 2003-2004 by Intevation GmbH
4  # Authors:  # Authors:
5  # Jonathan Coles <[email protected]>  # Jan-Oliver Wagner <[email protected]> (2004)
6    # Bernhard Herzog <[email protected]> (2003)
7    # Thomas K�ster <[email protected]> (2003)
8    # Jonathan Coles <[email protected]> (2003)
9  #  #
10  # This program is free software under the GPL (>=v2)  # This program is free software under the GPL (>=v2)
11  # Read the file COPYING coming with Thuban for details.  # Read the file COPYING coming with Thuban for details.
# Line 141  def generate_quantiles(_list, percents, Line 146  def generate_quantiles(_list, percents,
146                      max = _list[q]                      max = _list[q]
147    
148                  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]  
   
             start, min, endMax, right = _range.GetRange()  
   
             class0 = quantiles[3][0]  
             min = _list[class0[0]]  
             oldp = class0[1]  
             i = 1  
             end = "]"  
149    
             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)  
       
150                  group.SetLabel("%s%% - %s%%" % (round(oldp*100, 2),                  group.SetLabel("%s%% - %s%%" % (round(oldp*100, 2),
151                                                  round(p*100, 2)))                                                  round(p*100, 2)))
152                  oldp = p                  oldp = p
# Line 214  def GenQuantiles0(_list, percents, ramp, Line 155  def GenQuantiles0(_list, percents, ramp,
155                  clazz.AppendGroup(group)                  clazz.AppendGroup(group)
156                  i += 1                  i += 1
157    
158      return (adjusted, clazz, _list[class0[0]])      return (adjusted, clazz)
159    
160    
161  def calculate_quantiles(_list, percents, _range):  def calculate_quantiles(_list, percents, _range):
162      """Calculate quantiles for the given _list of percents from the      """Calculate quantiles for the given _list of percents from the
163      sorted list of values that are in range.      sorted list of values that are in range.
164                                                                                
165      This may not actually generate len(percents) quantiles if      This may not actually generate len(percents) quantiles if
166      many of the values that fall on quantile borders are the same.      many of the values that fall on quantile borders are the same.
167    
# Line 377  def calculate_quantiles(_list, percents, Line 318  def calculate_quantiles(_list, percents,
318  class CustomRamp:  class CustomRamp:
319    
320      def __init__(self, prop1, prop2):      def __init__(self, prop1, prop2):
321            """Create a ramp between prop1 and prop2."""
322          self.prop1 = prop1          self.prop1 = prop1
323          self.prop2 = prop2          self.prop2 = prop2
324    
325      def GetRamp(self):      def GetRamp(self):
326            """Return this ramp."""
327          return self          return self
328    
329      def GetProperties(self, index):      def GetProperties(self, index):
# Line 396  class CustomRamp: Line 339  class CustomRamp:
339    
340          newProps = ClassGroupProperties()          newProps = ClassGroupProperties()
341    
342          color1 = self.prop1.GetLineColor()          self.__SetProperty(self.prop1.GetLineColor(),
343          color2 = self.prop2.GetLineColor()                             self.prop2.GetLineColor(),
344                               index, newProps.SetLineColor)
345          self.__SetProperty(color1, color2, index, newProps.SetLineColor)          self.__SetProperty(self.prop1.GetFill(), self.prop2.GetFill(),
346          self.__SetProperty(color1, color2, index, newProps.SetFill)                             index, newProps.SetFill)
347    
348          w = (self.prop2.GetLineWidth() - self.prop1.GetLineWidth()) \          w = (self.prop2.GetLineWidth() - self.prop1.GetLineWidth()) \
349              * index \              * index \
350              + self.prop1.GetLineWidth()              + self.prop1.GetLineWidth()
   
351          newProps.SetLineWidth(int(round(w)))          newProps.SetLineWidth(int(round(w)))
352    
353            s = (self.prop2.GetSize() - self.prop1.GetSize()) \
354                * index \
355                + self.prop1.GetSize()
356            newProps.SetSize(int(round(s)))
357    
358          return newProps          return newProps
359    
360      def __SetProperty(self, color1, color2, index, setf):      def __SetProperty(self, color1, color2, index, setf):
361            """Use setf to set the appropriate property for the point
362            index percent between color1 and color2. setf is a function
363            to call that accepts a Color object or Transparent.
364            """
365    
366          if color1 is Transparent and color2 is Transparent:          if color1 is Transparent and color2 is Transparent:
367              setf(Transparent)              setf(Transparent)
# Line 431  class CustomRamp: Line 382  class CustomRamp:
382                  (color2.blue  - color1.blue)  * index + color1.blue))                  (color2.blue  - color1.blue)  * index + color1.blue))
383    
384  class MonochromaticRamp(CustomRamp):  class MonochromaticRamp(CustomRamp):
385        """Helper class to make ramps between two colors."""
386    
387      def __init__(self, start, end):      def __init__(self, start, end):
388            """Create a Monochromatic Ramp.
389    
390            start -- starting Color
391    
392            end -- ending Color
393            """
394          sp = ClassGroupProperties()          sp = ClassGroupProperties()
395          sp.SetLineColor(start)          sp.SetLineColor(start)
396          sp.SetFill(start)          sp.SetFill(start)
# Line 442  class MonochromaticRamp(CustomRamp): Line 401  class MonochromaticRamp(CustomRamp):
401    
402          CustomRamp.__init__(self, sp, ep)          CustomRamp.__init__(self, sp, ep)
403    
404  GreyRamp       = MonochromaticRamp(Color(1, 1, 1),  Color(0, 0, 0))  grey_ramp         = MonochromaticRamp(Color(1, 1, 1),  Color(0, 0, 0))
405  RedRamp        = MonochromaticRamp(Color(1, 1, 1),  Color(.8, 0, 0))  red_ramp          = MonochromaticRamp(Color(1, 1, 1),  Color(.8, 0, 0))
406  GreenRamp      = MonochromaticRamp(Color(1, 1, 1),  Color(0, .8, 0))  green_ramp        = MonochromaticRamp(Color(1, 1, 1),  Color(0, .8, 0))
407  BlueRamp       = MonochromaticRamp(Color(1, 1, 1),  Color(0, 0, .8))  blue_ramp         = MonochromaticRamp(Color(1, 1, 1),  Color(0, 0, .8))
408  GreenToRedRamp = MonochromaticRamp(Color(1, .8, 1), Color(1, 0, 0))  green_to_red_ramp = MonochromaticRamp(Color(0, .8, 0), Color(1, 0, 0))
409    
410  class HotToColdRamp:  class HotToColdRamp:
411        """A ramp that generates properties with colors ranging from
412        'hot' colors (e.g. red, orange) to 'cold' colors (e.g. green, blue)
413        """
414    
415      def GetRamp(self):      def GetRamp(self):
416            """Return this ramp."""
417          return self          return self
418    
419      def GetProperties(self, index):      def GetProperties(self, index):
# Line 481  class HotToColdRamp: Line 444  class HotToColdRamp:
444    
445          return prop          return prop
446    
447    class FixedRamp:
448        """FixedRamp allows particular properties of a ramp to be
449        held constant over the ramp.
450        """
451    
452        def __init__(self, ramp, fixes):
453            """
454            ramp -- a source ramp to get the default properties
455    
456            fixes -- a tuple (lineColor, lineWidth, fillColor) such that
457                 if any item is not None, the appropriate property will
458                 be fixed to that item value.
459            """
460    
461            self.fixes = fixes
462            self.ramp = ramp
463    
464        def GetRamp(self):
465            """Return this ramp."""
466            return self
467    
468        def GetProperties(self, index):
469            """Return a ClassGroupProperties object whose properties
470            represent a point at 'index' between the properties in
471            the ramp that initialized this FixedRamp.
472    
473            index -- a value such that 0 <= index <= 1
474            """
475    
476            props = self.ramp.GetProperties(index)
477            if self.fixes[0] is not None: props.SetLineColor(self.fixes[0])
478            if self.fixes[1] is not None: props.SetLineWidth(self.fixes[1])
479            if self.fixes[2] is not None: props.SetFill(self.fixes[2])
480    
481            return props

Legend:
Removed from v.1361  
changed lines
  Added in v.2441

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26