Skip to content

Commit 68242bf

Browse files
author
cfarmer
committed
Fix some issues with spurious intersection results
git-svn-id: http://svn.osgeo.org/qgis/trunk@10103 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 593a64e commit 68242bf

File tree

2 files changed

+122
-37
lines changed

2 files changed

+122
-37
lines changed

python/plugins/fTools/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def description():
2121
return "Tools for vector data analysis and management"
2222

2323
def version():
24-
return "0.5.3"
24+
return "0.5.5"
2525

2626
def qgisMinimumVersion():
2727
return "1.0.0"

python/plugins/fTools/tools/doGeoprocessing.py

Lines changed: 121 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ def manageGui( self ):
9393
self.attrib.hide()
9494
self.mergeOutput.hide()
9595
if self.myFunction == 3: # Difference
96-
self.label_2.setText( self.tr( "Erase layer" ) )
96+
self.label_2.setText( self.tr( "Difference layer" ) )
9797
self.setWindowTitle( self.tr( "Difference" ) )
9898
elif self.myFunction == 5: # Intersect
9999
self.label_2.setText( self.tr( "Intersect layer" ) )
@@ -172,7 +172,7 @@ def runFinishedFromThread( self, results ):
172172
if addToTOC == QMessageBox.Yes:
173173
ftools_utils.addShapeToCanvas( unicode( self.shapefileName ) )
174174
else:
175-
QMessageBox.warning( self, "Geoprocessing", self.tr( "Error writing output shapefile." ) )
175+
QMessageBox.warning( self, "Geoprocessing", self.tr( "GEOS geoprocessing error, please check that all features have a valid geometry" ) )
176176
QObject.disconnect( self.cancel_close, SIGNAL( "clicked()" ), self.cancelThread )
177177

178178
def runStatusFromThread( self, status ):
@@ -226,6 +226,7 @@ def stop(self):
226226
self.running = False
227227

228228
def buffering( self, useField ):
229+
GEOS_EXCEPT = True
229230
vproviderA = self.vlayerA.dataProvider()
230231
allAttrs = vproviderA.attributeIndexes()
231232
vproviderA.select( allAttrs )
@@ -252,12 +253,22 @@ def buffering( self, useField ):
252253
else:
253254
value = self.myParam
254255
inGeom = QgsGeometry( inFeat.geometry() )
255-
outGeom = QgsGeometry( inGeom.buffer( float( value ), 5 ) )
256+
try:
257+
outGeom = inGeom.buffer( float( value ), 5 )
258+
except:
259+
outGeom = QgsGeometry()
260+
GEOS_EXCEPT = False
261+
break
256262
if first:
257263
tempGeom = QgsGeometry( outGeom )
258264
first = False
259265
else:
260-
tempGeom = QgsGeometry( tempGeom.combine( outGeom ) )
266+
try:
267+
tempGeom = tempGeom.combine( outGeom )
268+
except:
269+
tempGeom = QgsGeometry()
270+
GEOS_EXCEPT = False
271+
break
261272
outFeat.setGeometry( tempGeom )
262273
writer.addFeature( outFeat )
263274
else:
@@ -271,14 +282,20 @@ def buffering( self, useField ):
271282
else:
272283
value = self.myParam
273284
inGeom = QgsGeometry( inFeat.geometry() )
274-
outGeom = QgsGeometry( inGeom.buffer( float( value ), 5 ) )
285+
try:
286+
outGeom = inGeom.buffer( float( value ), 5 )
287+
except:
288+
outGeom = QgsGeometry()
289+
GEOS_EXCEPT = False
290+
continue
275291
outFeat.setGeometry( outGeom )
276292
outFeat.setAttributeMap( atMap )
277293
writer.addFeature( outFeat )
278294
del writer
279-
return True, True
295+
return GEOS_EXCEPT, True
280296

281297
def convex_hull(self, useField ):
298+
GEOS_EXCEPT = True
282299
vproviderA = self.vlayerA.dataProvider()
283300
allAttrsA = vproviderA.attributeIndexes()
284301
fields = vproviderA.fields()
@@ -314,7 +331,11 @@ def convex_hull(self, useField ):
314331
hull.extend( points )
315332
if len( hull ) >= 3:
316333
tmpGeom = QgsGeometry( outGeom.fromMultiPoint( hull ) )
317-
outGeom = QgsGeometry( tmpGeom.convexHull() )
334+
try:
335+
outGeom = tmpGeom.convexHull()
336+
except:
337+
outGeom = QgsGeometry()
338+
GEOS_EXCEPT = False
318339
outFeat.setGeometry( outGeom )
319340
(area, perim) = self.simpleMeasure( outGeom )
320341
outFeat.addAttribute( 0, QVariant( outID ) )
@@ -335,13 +356,18 @@ def convex_hull(self, useField ):
335356
points = ftools_utils.extractPoints( inGeom )
336357
hull.extend( points )
337358
tmpGeom = QgsGeometry( outGeom.fromMultiPoint( hull ) )
338-
outGeom = QgsGeometry( tmpGeom.convexHull() )
359+
try:
360+
outGeom = tmpGeom.convexHull()
361+
except:
362+
outGeom = QgsGeometry()
363+
GEOS_EXCEPT = False
339364
outFeat.setGeometry( outGeom )
340365
writer.addFeature( outFeat )
341366
del writer
342-
return True, True
367+
return GEOS_EXCEPT, True
343368

344369
def dissolve( self, useField ):
370+
GEOS_EXCEPT = True
345371
vproviderA = self.vlayerA.dataProvider()
346372
allAttrsA = vproviderA.attributeIndexes()
347373
fields = vproviderA.fields()
@@ -367,7 +393,11 @@ def dissolve( self, useField ):
367393
else:
368394
tmpInGeom = QgsGeometry( inFeat.geometry() )
369395
tmpOutGeom = QgsGeometry( outFeat.geometry() )
370-
tmpOutGeom = QgsGeometry( tmpOutGeom.combine( tmpInGeom ) )
396+
try:
397+
tmpOutGeom = tmpOutGeom.combine( tmpInGeom )
398+
except:
399+
tmpOutGeom = QgsGeometry()
400+
GEOS_EXCEPT = False
371401
outFeat.setGeometry( tmpOutGeom )
372402
outFeat.setAttributeMap( attrs )
373403
writer.addFeature( outFeat )
@@ -395,14 +425,19 @@ def dissolve( self, useField ):
395425
else:
396426
tmpInGeom = QgsGeometry( inFeat.geometry() )
397427
tmpOutGeom = QgsGeometry( outFeat.geometry() )
398-
tmpOutGeom = QgsGeometry( tmpOutGeom.combine( tmpInGeom ) )
428+
try:
429+
tmpOutGeom = tmpOutGeom.combine( tmpInGeom )
430+
except:
431+
tmpOutGeom = QgsGeometry()
432+
GEOS_EXCEPT = False
399433
outFeat.setGeometry( tmpOutGeom )
400434
outFeat.setAttributeMap( attrs )
401435
writer.addFeature( outFeat )
402436
del writer
403-
return True, True
437+
return GEOS_EXCEPT, True
404438

405439
def difference( self ):
440+
GEOS_EXCEPT = True
406441
vproviderA = self.vlayerA.dataProvider()
407442
allAttrsA = vproviderA.attributeIndexes()
408443
vproviderA.select( allAttrsA )
@@ -432,15 +467,21 @@ def difference( self ):
432467
for id in intersects:
433468
vproviderB.featureAtId( int( id ), inFeatB , True, allAttrsB )
434469
tmpGeom = QgsGeometry( inFeatB.geometry() )
435-
if geom.intersects( tmpGeom ):
436-
geom = geom.difference( tmpGeom )
470+
try:
471+
if geom.intersects( tmpGeom ):
472+
geom = geom.difference( tmpGeom )
473+
except:
474+
geom = QgsGeometry()
475+
GEOS_EXCEPT = False
476+
break
437477
outFeat.setGeometry( geom )
438478
outFeat.setAttributeMap( atMap )
439479
writer.addFeature( outFeat )
440480
del writer
441-
return True, crs_match
481+
return GEOS_EXCEPT, crs_match
442482

443483
def intersect( self ):
484+
GEOS_EXCEPT = True
444485
vproviderA = self.vlayerA.dataProvider()
445486
allAttrsA = vproviderA.attributeIndexes()
446487
vproviderA.select( allAttrsA )
@@ -470,16 +511,25 @@ def intersect( self ):
470511
for id in intersects:
471512
vproviderB.featureAtId( int( id ), inFeatB , True, allAttrsB )
472513
tmpGeom = QgsGeometry( inFeatB.geometry() )
473-
if geom.intersects( tmpGeom ):
474-
atMapB = inFeatB.attributeMap()
475-
int_geom = geom.intersection( tmpGeom )
476-
outFeat.setGeometry( int_geom )
477-
outFeat.setAttributeMap( ftools_utils.combineVectorAttributes( atMapA, atMapB ) )
478-
writer.addFeature( outFeat )
514+
try:
515+
if geom.intersects( tmpGeom ):
516+
atMapB = inFeatB.attributeMap()
517+
int_geom = geom.intersection( tmpGeom )
518+
if int_geom.wkbType() == 7:
519+
int_com = geom.combine( tmpGeom )
520+
int_sym = geom.symDifference( tmpGeom )
521+
int_geom = int_com.difference( int_sym )
522+
outFeat.setGeometry( int_geom )
523+
outFeat.setAttributeMap( ftools_utils.combineVectorAttributes( atMapA, atMapB ) )
524+
writer.addFeature( outFeat )
525+
except:
526+
GEOS_EXCEPT = False
527+
continue
479528
del writer
480529
return True, crs_match
481530

482531
def union( self ):
532+
GEOS_EXCEPT = True
483533
vproviderA = self.vlayerA.dataProvider()
484534
allAttrsA = vproviderA.attributeIndexes()
485535
vproviderA.select( allAttrsA )
@@ -520,8 +570,18 @@ def union( self ):
520570
tmpGeom = QgsGeometry( inFeatB.geometry() )
521571
if geom.intersects( tmpGeom ):
522572
found = True
523-
diff_geom = diff_geom.difference( tmpGeom )
524-
int_geom = geom.intersection( tmpGeom )
573+
try:
574+
diff_geom = diff_geom.difference( tmpGeom )
575+
int_geom = geom.intersection( tmpGeom )
576+
if int_geom.wkbType() == 7:
577+
int_com = geom.combine( tmpGeom )
578+
int_sym = geom.symDifference( tmpGeom )
579+
int_geom = int_com.difference( int_sym )
580+
except:
581+
int_geom = QgsGeometry()
582+
GEOS_EXCEPT = False
583+
found = False
584+
break
525585
outFeat.setGeometry( int_geom )
526586
outFeat.setAttributeMap( ftools_utils.combineVectorAttributes( atMapA, atMapB ) )
527587
writer.addFeature( outFeat )
@@ -547,15 +607,21 @@ def union( self ):
547607
vproviderA.featureAtId( int( id ), inFeatB , True, allAttrsA )
548608
atMapB = inFeatB.attributeMap()
549609
tmpGeom = QgsGeometry( inFeatB.geometry() )
550-
if geom.intersects( tmpGeom ):
551-
geom = geom.difference( tmpGeom )
610+
try:
611+
if geom.intersects( tmpGeom ):
612+
geom = geom.difference( tmpGeom )
613+
except:
614+
geom = QgsGeometry()
615+
GEOS_EXCEPT = False
616+
continue
552617
outFeat.setGeometry( geom )
553618
outFeat.setAttributeMap( atMap )
554619
writer.addFeature( outFeat )
555620
del writer
556621
return True, crs_match
557622

558623
def symetrical_difference( self ):
624+
GEOS_EXCEPT = True
559625
vproviderA = self.vlayerA.dataProvider()
560626
allAttrsA = vproviderA.attributeIndexes()
561627
vproviderA.select( allAttrsA )
@@ -586,8 +652,13 @@ def symetrical_difference( self ):
586652
for id in intersects:
587653
vproviderB.featureAtId( int( id ), inFeatB , True, allAttrsB )
588654
tmpGeom = QgsGeometry( inFeatB.geometry() )
589-
if geom.intersects( tmpGeom ):
590-
geom = geom.difference( tmpGeom )
655+
try:
656+
if geom.intersects( tmpGeom ):
657+
geom = geom.difference( tmpGeom )
658+
except:
659+
geom = QgsGeometry()
660+
GEOS_EXCEPT = False
661+
continue
591662
outFeat.setGeometry( geom )
592663
outFeat.setAttributeMap( atMapA )
593664
writer.addFeature( outFeat )
@@ -603,15 +674,21 @@ def symetrical_difference( self ):
603674
for id in intersects:
604675
vproviderA.featureAtId( int( id ), inFeatB , True, allAttrsA )
605676
tmpGeom = QgsGeometry( inFeatB.geometry() )
606-
if geom.intersects( tmpGeom ):
607-
geom = geom.difference( tmpGeom )
677+
try:
678+
if geom.intersects( tmpGeom ):
679+
geom = geom.difference( tmpGeom )
680+
except:
681+
geom = QgsGeometry()
682+
GEOS_EXCEPT = False
683+
continue
608684
outFeat.setGeometry( geom )
609685
outFeat.setAttributeMap( atMap )
610686
writer.addFeature( outFeat )
611687
del writer
612-
return True, crs_match
688+
return GEOS_EXCEPT, crs_match
613689

614690
def clip( self ):
691+
GEOS_EXCEPT = True
615692
vproviderA = self.vlayerA.dataProvider()
616693
allAttrsA = vproviderA.attributeIndexes()
617694
vproviderA.select( allAttrsA )
@@ -641,13 +718,21 @@ def clip( self ):
641718
for id in intersects:
642719
vproviderB.featureAtId( int( id ), inFeatB , True, allAttrsB )
643720
tmpGeom = QgsGeometry( inFeatB.geometry() )
644-
if geom.intersects( tmpGeom ):
645-
geom= geom.intersection( tmpGeom )
646-
outFeat.setGeometry( geom )
647-
outFeat.setAttributeMap( atMap )
648-
writer.addFeature( outFeat )
721+
try:
722+
if geom.intersects( tmpGeom ):
723+
int_geom = geom.intersection( tmpGeom )
724+
if int_geom.wkbType() == 7:
725+
int_com = geom.combine( tmpGeom )
726+
int_sym = geom.symDifference( tmpGeom )
727+
int_geom = int_com.difference( int_sym )
728+
outFeat.setGeometry( int_geom )
729+
outFeat.setAttributeMap( atMap )
730+
writer.addFeature( outFeat )
731+
except:
732+
GEOS_EXCEPT = False
733+
continue
649734
del writer
650-
return True, crs_match
735+
return GEOS_EXCEPT, crs_match
651736

652737
def checkParameter( self, layer, param ):
653738
if self.myFunction == 1:

0 commit comments

Comments
 (0)