/[thuban]/trunk/thuban/Thuban/Model/layer.py
ViewVC logotype

Diff of /trunk/thuban/Thuban/Model/layer.py

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

revision 6 by bh, Tue Aug 28 15:41:52 2001 UTC revision 179 by bh, Wed May 15 14:02:49 2002 UTC
# Line 1  Line 1 
1  # Copyright (c) 2001 by Intevation GmbH  # Copyright (c) 2001, 2002 by Intevation GmbH
2  # Authors:  # Authors:
3  # Bernhard Herzog <[email protected]>  # Bernhard Herzog <[email protected]>
4  #  #
# Line 7  Line 7 
7    
8  __version__ = "$Revision$"  __version__ = "$Revision$"
9    
10  import shapelib  from math import log, ceil
11    
12    import shapelib, shptree
13    
14  from messages import LAYER_PROJECTION_CHANGED, LAYER_LEGEND_CHANGED, \  from messages import LAYER_PROJECTION_CHANGED, LAYER_LEGEND_CHANGED, \
15       LAYER_VISIBILITY_CHANGED       LAYER_VISIBILITY_CHANGED
# Line 102  class Layer(BaseLayer): Line 104  class Layer(BaseLayer):
104      """      """
105    
106      def __init__(self, title, filename, projection = None,      def __init__(self, title, filename, projection = None,
107                   fill = None, stroke = _black, visible = 1):                   fill = None, stroke = _black, stroke_width = 1, visible = 1):
108          """Initialize the layer.          """Initialize the layer.
109    
110          title -- the title          title -- the title
# Line 121  class Layer(BaseLayer): Line 123  class Layer(BaseLayer):
123          self.projection = projection          self.projection = projection
124          self.fill = fill          self.fill = fill
125          self.stroke = stroke          self.stroke = stroke
126            self.stroke_width = stroke_width
127          self.shapefile = None          self.shapefile = None
128            self.shapetree = None
129            self.open_shapefile()
130          # shapetable is the table associated with the shapefile, while          # shapetable is the table associated with the shapefile, while
131          # table is the default table used to look up attributes for          # table is the default table used to look up attributes for
132          # display          # display
# Line 134  class Layer(BaseLayer): Line 139  class Layer(BaseLayer):
139              numshapes, shapetype, mins, maxs = self.shapefile.info()              numshapes, shapetype, mins, maxs = self.shapefile.info()
140              self.numshapes = numshapes              self.numshapes = numshapes
141              self.shapetype = shapelib_shapetypes[shapetype]              self.shapetype = shapelib_shapetypes[shapetype]
142              self.bbox = mins[:2] + maxs[:2]  
143                # if there are shapes, set the bbox accordinly. Otherwise
144                # set it to None.
145                if self.numshapes:
146                    self.bbox = mins[:2] + maxs[:2]
147                else:
148                    self.bbox = None
149    
150                # estimate a good depth for the quad tree. Each depth
151                # multiplies the number of nodes by four, therefore we
152                # basically take the base 4 logarithm of the number of
153                # shapes.
154                if self.numshapes < 4:
155                    maxdepth = 1
156                else:
157                    maxdepth = int(ceil(log(self.numshapes / 4.0) / log(4)))
158    
159                self.shapetree = shptree.SHPTree(self.shapefile.cobject(), 2,
160                                                 maxdepth)
161    
162      def BoundingBox(self):      def BoundingBox(self):
163          """Return the bounding box of the layer's shapes in their default          """Return the layer's bounding box in the intrinsic coordinate system.
164          coordinate system"""  
165            If the layer has no shapes, return None.
166            """
167            # The bbox will be set by open_shapefile just as we need it
168            # here.
169          self.open_shapefile()          self.open_shapefile()
170          return self.bbox          return self.bbox
171    
172      def LatLongBoundingBox(self):      def LatLongBoundingBox(self):
173          """Return the layer's bounding box in lat/long coordinates"""          """Return the layer's bounding box in lat/long coordinates.
174          llx, lly, urx, ury = self.BoundingBox()  
175          if self.projection is not None:          Return None, if the layer doesn't contain any shapes.
176              llx, lly = self.projection.Inverse(llx, lly)          """
177              urx, ury = self.projection.Inverse(urx, ury)          bbox = self.BoundingBox()
178          return llx, lly, urx, ury          if bbox is not None:
179                llx, lly, urx, ury = bbox
180                if self.projection is not None:
181                    llx, lly = self.projection.Inverse(llx, lly)
182                    urx, ury = self.projection.Inverse(urx, ury)
183                return llx, lly, urx, ury
184            else:
185                return None
186    
187      def NumShapes(self):      def NumShapes(self):
188          """Return the number of shapes in the layer"""          """Return the number of shapes in the layer"""
# Line 173  class Layer(BaseLayer): Line 207  class Layer(BaseLayer):
207              poly = shape.vertices()[0]              poly = shape.vertices()[0]
208              points = []              points = []
209              for x, y in poly:              for x, y in poly:
210                  points.append(x, y)                  points.append((x, y))
211          return Shape(points)          return Shape(points)
212    
213        def ShapesInRegion(self, box):
214            """Return the ids of the shapes that overlap the box.
215    
216            Box is a tuple (left, bottom, right, top) in the coordinate
217            system used by the layer's shapefile.
218            """
219            left, bottom, right, top = box
220            return self.shapetree.find_shapes((left, bottom), (right, top))
221    
222      def SetProjection(self, projection):      def SetProjection(self, projection):
223          """Set the layer's projection"""          """Set the layer's projection"""
224          self.projection = projection          self.projection = projection
# Line 191  class Layer(BaseLayer): Line 234  class Layer(BaseLayer):
234          stroked."""          stroked."""
235          self.stroke = stroke          self.stroke = stroke
236          self.changed(LAYER_LEGEND_CHANGED, self)          self.changed(LAYER_LEGEND_CHANGED, self)
237    
238        def SetStrokeWidth(self, width):
239            """Set the layer's stroke width."""
240            self.stroke_width = width
241            self.changed(LAYER_LEGEND_CHANGED, self)

Legend:
Removed from v.6  
changed lines
  Added in v.179

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26