Skip to content

Commit 6f3384d

Browse files
author
cfarmer
committedJun 30, 2010
fixes #2430 and speeds up random point generation on top of vectors significantly
git-svn-id: http://svn.osgeo.org/qgis/trunk@13860 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 9060b5a commit 6f3384d

File tree

1 file changed

+36
-8
lines changed

1 file changed

+36
-8
lines changed
 

‎python/plugins/fTools/tools/doRandPoints.py

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -146,14 +146,14 @@ def createSinglePolygon(self, vlayer):
146146
provider.select(allAttrs)
147147
feat = QgsFeature()
148148
geom = QgsGeometry()
149-
geom2 = QgsGeometry()
149+
#geom2 = QgsGeometry()
150150
provider.nextFeature(feat)
151-
geom = feat.geometry()
151+
geom = QgsGeometry(feat.geometry())
152152
count = 10.00
153153
add = ( 40.00 - 10.00 ) / provider.featureCount()
154-
provider.rewind()
155-
provider.nextFeature(feat)
156-
geom = QgsGeometry(feat.geometry())
154+
#provider.rewind()
155+
#provider.nextFeature(feat)
156+
#geom = QgsGeometry(feat.geometry())
157157
while provider.nextFeature(feat):
158158
geom = geom.combine(QgsGeometry( feat.geometry() ))
159159
count = count + add
@@ -176,13 +176,41 @@ def simpleRandom(self, n, bound, xmin, xmax, ymin, ymax):
176176
self.progressBar.setValue(count)
177177
return points
178178

179+
def vectorRandom(self, n, layer, xmin, xmax, ymin, ymax):
180+
provider = layer.dataProvider()
181+
provider.select([])
182+
index = ftools_utils.createIndex(provider)
183+
seed()
184+
points = []
185+
feat = QgsFeature()
186+
i = 1
187+
count = 40.00
188+
add = ( 70.00 - 40.00 ) / n
189+
while i <= n:
190+
point = QgsPoint(xmin + (xmax-xmin) * random(), ymin + (ymax-ymin) * random())
191+
pGeom = QgsGeometry().fromPoint(point)
192+
ids = index.intersects(pGeom.buffer(5,5).boundingBox())
193+
for id in ids:
194+
provider.featureAtId(int(id),feat,True)
195+
tGeom = QgsGeometry(feat.geometry())
196+
if pGeom.intersects(tGeom):
197+
points.append(pGeom)
198+
i = i + 1
199+
count = count + add
200+
self.progressBar.setValue(count)
201+
break
202+
return points
203+
179204
def randomize(self, inLayer, outPath, minimum, design, value):
180205
outFeat = QgsFeature()
181206
if design == self.tr("unstratified"):
182207
ext = inLayer.extent()
183-
if inLayer.type() == inLayer.RasterLayer: bound = ext
184-
else: bound = self.createSinglePolygon(inLayer)
185-
points = self.simpleRandom(int(value), bound, ext.xMinimum(), ext.xMaximum(), ext.yMinimum(), ext.yMaximum())
208+
if inLayer.type() == inLayer.RasterLayer:
209+
points = self.simpleRandom(int(value), ext, ext.xMinimum(),
210+
ext.xMaximum(), ext.yMinimum(), ext.yMaximum())
211+
else:
212+
points = self.vectorRandom(int(value), inLayer,
213+
ext.xMinimum(), ext.xMaximum(), ext.yMinimum(), ext.yMaximum())
186214
else: points = self.loopThruPolygons(inLayer, value, design)
187215
crs = self.mapCanvas.mapRenderer().destinationSrs()
188216
if not crs.isValid(): crs = None

0 commit comments

Comments
 (0)