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 |
125 |
self.stroke = stroke |
self.stroke = stroke |
126 |
self.stroke_width = stroke_width |
self.stroke_width = stroke_width |
127 |
self.shapefile = None |
self.shapefile = None |
128 |
|
self.shapetree = None |
129 |
self.open_shapefile() |
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 |
141 |
self.shapetype = shapelib_shapetypes[shapetype] |
self.shapetype = shapelib_shapetypes[shapetype] |
142 |
self.bbox = mins[:2] + maxs[:2] |
self.bbox = mins[:2] + maxs[:2] |
143 |
|
|
144 |
|
# estimate a good depth for the quad tree. Each depth |
145 |
|
# multiplies the number of nodes by four, therefore we |
146 |
|
# basically take the base 4 logarithm of the number of |
147 |
|
# shapes. |
148 |
|
if self.numshapes < 4: |
149 |
|
maxdepth = 1 |
150 |
|
else: |
151 |
|
maxdepth = int(ceil(log(self.numshapes / 4.0) / log(4))) |
152 |
|
|
153 |
|
self.shapetree = shptree.SHPTree(self.shapefile.cobject(), 2, |
154 |
|
maxdepth) |
155 |
|
|
156 |
def BoundingBox(self): |
def BoundingBox(self): |
157 |
"""Return the bounding box of the layer's shapes in their default |
"""Return the bounding box of the layer's shapes in their default |
158 |
coordinate system""" |
coordinate system""" |
193 |
points.append((x, y)) |
points.append((x, y)) |
194 |
return Shape(points) |
return Shape(points) |
195 |
|
|
196 |
|
def ShapesInRegion(self, box): |
197 |
|
"""Return the ids of the shapes that overlap the box. |
198 |
|
|
199 |
|
Box is a tuple (left, bottom, right, top) in the coordinate |
200 |
|
system used by the layer's shapefile. |
201 |
|
""" |
202 |
|
left, bottom, right, top = box |
203 |
|
return self.shapetree.find_shapes((left, bottom), (right, top)) |
204 |
|
|
205 |
def SetProjection(self, projection): |
def SetProjection(self, projection): |
206 |
"""Set the layer's projection""" |
"""Set the layer's projection""" |
207 |
self.projection = projection |
self.projection = projection |