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

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

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

revision 1551 by bh, Wed Aug 6 17:21:07 2003 UTC revision 1921 by bh, Mon Nov 3 18:42:27 2003 UTC
# Line 7  Line 7 
7    
8  """Data source abstractions"""  """Data source abstractions"""
9    
10    from __future__ import generators
11    
12  __version__ = "$Revision$"  __version__ = "$Revision$"
13  # $Source$  # $Source$
14  # $Id$  # $Id$
# Line 32  shapelib_shapetypes = {shapelib.SHPT_POL Line 34  shapelib_shapetypes = {shapelib.SHPT_POL
34                         shapelib.SHPT_ARC: SHAPETYPE_ARC,                         shapelib.SHPT_ARC: SHAPETYPE_ARC,
35                         shapelib.SHPT_POINT: SHAPETYPE_POINT}                         shapelib.SHPT_POINT: SHAPETYPE_POINT}
36    
37    #
38    # Raw shape data formats
39    #
40    
41  class Shape:  # Raw data is the same as that returned by the points method.
42    RAW_PYTHON = "RAW_PYTHON"
43    
44      """Represent one shape"""  # Raw data is a shapefile. The Shape object will use the shapeid as the
45    # raw data.
46    RAW_SHAPEFILE = "RAW_SHAPEFILE"
47    
48      def __init__(self, points):  # Raw data in well-known text format
49          self.points = points  RAW_WKT = "RAW_WKT"
         #self.compute_bbox()  
         self.bbox = None  
50    
     def compute_bbox(self):  
         if self.bbox is not None:  
             return self.bbox  
51    
52    class ShapefileShape:
53    
54        """Represent one shape of a shapefile"""
55    
56        def __init__(self, shapefile, shapeid):
57            self.shapefile = shapefile
58            self.shapeid = shapeid
59    
60        def compute_bbox(self):
61            """
62            Return the bounding box of the shape as a tuple (minx,miny,maxx,maxy)
63            """
64          xs = []          xs = []
65          ys = []          ys = []
66          for part in self.points:          for part in self.Points():
67              for x, y in part:              for x, y in part:
68                  xs.append(x)                  xs.append(x)
69                  ys.append(y)                  ys.append(y)
70          self.llx = min(xs)          return (min(xs), min(ys), max(xs), max(ys))
         self.lly = min(ys)  
         self.urx = max(xs)  
         self.ury = max(ys)  
71    
72          self.bbox = (self.llx, self.lly, self.urx, self.ury)      def ShapeID(self):
73            return self.shapeid
         return self.bbox  
74    
75      def Points(self):      def Points(self):
76          return self.points          """Return the coordinates of the shape as a list of lists of pairs"""
77            shape = self.shapefile.read_object(self.shapeid)
78            points = shape.vertices()
79            if self.shapefile.info()[1] == shapelib.SHPT_POINT:
80                points = [points]
81            return points
82    
83        def RawData(self):
84            """Return the shape id to use with the shapefile"""
85            return self.shapeid
86    
87        def Shapefile(self):
88            """Return the shapefile object"""
89            return self.shapefile
90    
91    
92  class ShapeTable(transientdb.AutoTransientTable):  class ShapeTable(transientdb.AutoTransientTable):
# Line 146  class ShapefileStore: Line 169  class ShapefileStore:
169          """          """
170          return self.shapetype          return self.shapetype
171    
172        def RawShapeFormat(self):
173            """Return the raw data format of the shape data, i.e. RAW_SHAPEFILE"""
174            return RAW_SHAPEFILE
175    
176      def NumShapes(self):      def NumShapes(self):
177          """Return the number of shapes in the shape store"""          """Return the number of shapes in the shape store"""
178          return self.numshapes          return self.numshapes
# Line 172  class ShapefileStore: Line 199  class ShapefileStore:
199          """          """
200          return self.bbox          return self.bbox
201    
202      def ShapesInRegion(self, box):      def ShapesInRegion(self, bbox):
203          """Return the ids of the shapes that overlap the box.          """Return an iterable over the shapes that overlap the bounding box.
204    
205          Box is a tuple (left, bottom, right, top) in the coordinate          The bbox parameter should be the bounding box as a tuple in the
206          system used used in the shapefile.          form (minx, miny, maxx, maxy) in the coordinate system of the
207          """          shape store.
208          left, bottom, right, top = box          """
209          return self.shapetree.find_shapes((left, bottom), (right, top))          # Bind a few globals to locals to make it a bit faster
210            cls = ShapefileShape
211            shapefile = self.shapefile
212    
213            left, bottom, right, top = bbox
214            for i in self.shapetree.find_shapes((left, bottom), (right, top)):
215                yield cls(shapefile, i)
216    
217        def AllShapes(self):
218            """Return an iterable over the shapes in the shape store."""
219            for i in xrange(self.NumShapes()):
220                yield ShapefileShape(self.shapefile, i)
221    
222      def Shape(self, index):      def Shape(self, index):
223          """Return the shape with index index"""          """Return the shape with index index"""
224          shape = self.shapefile.read_object(index)          return ShapefileShape(self.shapefile, index)
   
         if self.ShapeType() == SHAPETYPE_POINT:  
             points = [shape.vertices()]  
         else:  
             points = []  
             for poly in shape.vertices():  
                 part = []  
                 for x, y in poly:  
                     part.append((x, y))  
                 points.append(part)  
   
         return Shape(points)  
225    
226    
227    
# Line 250  class DerivedShapeStore: Line 276  class DerivedShapeStore:
276          """          """
277          return self.shapestore.ShapesInRegion(bbox)          return self.shapestore.ShapesInRegion(bbox)
278    
279        def AllShapes(self):
280            """Return an iterable over the shapes in the shape store.
281    
282            This method is simply delegated to the shapestore the
283            DerivedShapeStore was instantiated with.
284            """
285            return self.shapestore.AllShapes()
286    
287      def ShapeType(self):      def ShapeType(self):
288          """Return the type of the shapes in the layer.          """Return the type of the shapes in the layer.
289    
# Line 258  class DerivedShapeStore: Line 292  class DerivedShapeStore:
292          """          """
293          return self.shapestore.ShapeType()          return self.shapestore.ShapeType()
294    
295        def RawShapeFormat(self):
296            """Return the raw data format of the shapes.
297    
298            This method is simply delegated to the shapestore the
299            DerivedShapeStore was instantiated with.
300            """
301            return self.shapestore.RawShapeFormat()
302    
303      def NumShapes(self):      def NumShapes(self):
304          """Return the number of shapes in the shapestore."""          """Return the number of shapes in the shapestore."""
305          return self.shapestore.NumShapes()          return self.shapestore.NumShapes()

Legend:
Removed from v.1551  
changed lines
  Added in v.1921

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26