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