@@ -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