4
4
from qgis .gui import *
5
5
from frmGeoprocessing import Ui_Dialog
6
6
import ftools_utils
7
+ import sys
7
8
8
9
class GeoprocessingDialog ( QDialog , Ui_Dialog ):
9
10
def __init__ ( self , iface , function ):
@@ -161,19 +162,24 @@ def runFinishedFromThread( self, results ):
161
162
self .testThread .stop ()
162
163
self .cancel_close .setText ( "Close" )
163
164
QObject .disconnect ( self .cancel_close , SIGNAL ( "clicked()" ), self .cancelThread )
164
- if results [0 ]:
165
- if not results [1 ]:
166
- out_text = self .tr ( "\n \n Warning: Different input coordinate reference systems detected, results may not be as expected." )
167
- else :
168
- out_text = ""
169
- addToTOC = QMessageBox .question ( self , "Geoprocessing" , self .tr ( "Created output shapefile:" ) + "\n " +
170
- unicode ( self .shapefileName ) + "\n \n " + self .tr ( "Would you like to add the new layer to the TOC?" )
171
- + out_text , QMessageBox .Yes , QMessageBox .No , QMessageBox .NoButton )
172
- if addToTOC == QMessageBox .Yes :
173
- ftools_utils .addShapeToCanvas ( unicode ( self .shapefileName ) )
165
+ if not results [2 ] or not results [1 ] or not results [0 ]:
166
+ out_text = self .tr ( "\n Warnings:" )
167
+ end_text = self .tr ( "\n Some output geometries may be missing or invalid.\n \n Would you like to add the new layer anyway?" )
174
168
else :
175
- QMessageBox .warning ( self , "Geoprocessing" , self .tr ( "GEOS geoprocessing error, please check that all features have a valid geometry" ) )
176
- QObject .disconnect ( self .cancel_close , SIGNAL ( "clicked()" ), self .cancelThread )
169
+ out_text = "\n "
170
+ end_text = self .tr ( "\n \n Would you like to add the new layer to the TOC?" )
171
+ if not results [2 ]:
172
+ out_text = out_text + self .tr ( "\n Input CRS error: Different input coordinate reference systems detected, results may not be as expected." )
173
+ if not results [1 ]:
174
+ out_text = out_text + self .tr ( "\n Feature geometry error: One or more output features ignored due to invalid geometry." )
175
+ if not results [0 ]:
176
+ out_text = out_text + self .tr ( "\n GEOS geoprocessing error: One or more input features have invalid geometry." )
177
+ else :
178
+ out_text = ""
179
+ addToTOC = QMessageBox .question ( self , "Geoprocessing" , self .tr ( "Created output shapefile:" ) + "\n "
180
+ + unicode ( self .shapefileName ) + out_text + end_text , QMessageBox .Yes , QMessageBox .No , QMessageBox .NoButton )
181
+ if addToTOC == QMessageBox .Yes :
182
+ ftools_utils .addShapeToCanvas ( unicode ( self .shapefileName ) )
177
183
178
184
def runStatusFromThread ( self , status ):
179
185
self .progressBar .setValue ( status )
@@ -202,31 +208,32 @@ def run( self ):
202
208
( self .myParam , useField ) = self .checkParameter ( self .vlayerA , self .myParam )
203
209
if not self .myParam is None :
204
210
if self .myFunction == 1 :
205
- success , match = self .buffering ( useField )
211
+ geos , feature , match = self .buffering ( useField )
206
212
elif self .myFunction == 2 :
207
- success , match = self .convex_hull ( useField )
213
+ geos , feature , match = self .convex_hull ( useField )
208
214
elif self .myFunction == 4 :
209
- success , match = self .dissolve ( useField )
215
+ geos , feature , match = self .dissolve ( useField )
210
216
else :
211
217
self .vlayerB = ftools_utils .getVectorLayerByName ( self .myLayerB )
212
218
if self .myFunction == 3 :
213
- success , match = self .difference ()
219
+ geos , feature , match = self .difference ()
214
220
elif self .myFunction == 5 :
215
- success , match = self .intersect ()
221
+ geos , feature , match = self .intersect ()
216
222
elif self .myFunction == 6 :
217
- success , match = self .union ()
223
+ geos , feature , match = self .union ()
218
224
elif self .myFunction == 7 :
219
- success , match = self .symetrical_difference ()
225
+ geos , feature , match = self .symetrical_difference ()
220
226
elif self .myFunction == 8 :
221
- success , match = self .clip ()
222
- self .emit ( SIGNAL ( "runFinished(PyQt_PyObject)" ), (success , match ) )
227
+ geos , feature , match = self .clip ()
228
+ self .emit ( SIGNAL ( "runFinished(PyQt_PyObject)" ), (geos , feature , match ) )
223
229
self .emit ( SIGNAL ( "runStatus(PyQt_PyObject)" ), 0 )
224
230
225
231
def stop (self ):
226
232
self .running = False
227
233
228
234
def buffering ( self , useField ):
229
235
GEOS_EXCEPT = True
236
+ FEATURE_EXCEPT = True
230
237
vproviderA = self .vlayerA .dataProvider ()
231
238
allAttrs = vproviderA .attributeIndexes ()
232
239
vproviderA .select ( allAttrs )
@@ -244,9 +251,8 @@ def buffering( self, useField ):
244
251
if self .myMerge :
245
252
first = True
246
253
vproviderA .rewind ()
254
+ add = True
247
255
while vproviderA .nextFeature ( inFeat ):
248
- nElement += 1
249
- self .emit ( SIGNAL ( "runStatus(PyQt_PyObject)" ), nElement )
250
256
atMap = inFeat .attributeMap ()
251
257
if useField :
252
258
value = atMap [ self .myParam ].toDouble ()[ 0 ]
@@ -255,27 +261,28 @@ def buffering( self, useField ):
255
261
inGeom = QgsGeometry ( inFeat .geometry () )
256
262
try :
257
263
outGeom = inGeom .buffer ( float ( value ), 5 )
264
+ if first :
265
+ tempGeom = QgsGeometry ( outGeom )
266
+ first = False
267
+ else :
268
+ try :
269
+ tempGeom = tempGeom .combine ( outGeom )
270
+ except :
271
+ GEOS_EXCEPT = False
272
+ continue
258
273
except :
259
- outGeom = QgsGeometry ()
260
274
GEOS_EXCEPT = False
261
- break
262
- if first :
263
- tempGeom = QgsGeometry ( outGeom )
264
- first = False
265
- else :
266
- try :
267
- tempGeom = tempGeom .combine ( outGeom )
268
- except :
269
- tempGeom = QgsGeometry ()
270
- GEOS_EXCEPT = False
271
- break
272
- outFeat .setGeometry ( tempGeom )
273
- writer .addFeature ( outFeat )
275
+ continue
276
+ nElement += 1
277
+ self .emit ( SIGNAL ( "runStatus(PyQt_PyObject)" ), nElement )
278
+ try :
279
+ outFeat .setGeometry ( tempGeom )
280
+ writer .addFeature ( outFeat )
281
+ except :
282
+ FEATURE_EXCEPT = False
274
283
else :
275
284
vproviderA .rewind ()
276
285
while vproviderA .nextFeature ( inFeat ):
277
- nElement += 1
278
- self .emit ( SIGNAL ( "runStatus(PyQt_PyObject)" ), nElement )
279
286
atMap = inFeat .attributeMap ()
280
287
if useField :
281
288
value = atMap [ self .myParam ].toDouble ()[ 0 ]
@@ -284,18 +291,24 @@ def buffering( self, useField ):
284
291
inGeom = QgsGeometry ( inFeat .geometry () )
285
292
try :
286
293
outGeom = inGeom .buffer ( float ( value ), 5 )
294
+ try :
295
+ outFeat .setGeometry ( outGeom )
296
+ outFeat .setAttributeMap ( atMap )
297
+ writer .addFeature ( outFeat )
298
+ except :
299
+ FEATURE_EXCEPT = False
300
+ continue
287
301
except :
288
- outGeom = QgsGeometry ()
289
302
GEOS_EXCEPT = False
290
303
continue
291
- outFeat .setGeometry ( outGeom )
292
- outFeat .setAttributeMap ( atMap )
293
- writer .addFeature ( outFeat )
304
+ nElement += 1
305
+ self .emit ( SIGNAL ( "runStatus(PyQt_PyObject)" ), nElement )
294
306
del writer
295
- return GEOS_EXCEPT , True
307
+ return GEOS_EXCEPT , FEATURE_EXCEPT , True
296
308
297
309
def convex_hull (self , useField ):
298
310
GEOS_EXCEPT = True
311
+ FEATURE_EXCEPT = True
299
312
vproviderA = self .vlayerA .dataProvider ()
300
313
allAttrsA = vproviderA .attributeIndexes ()
301
314
fields = vproviderA .fields ()
@@ -318,8 +331,6 @@ def convex_hull(self, useField ):
318
331
vproviderA .select ( allAttrsA )
319
332
vproviderA .rewind ()
320
333
while vproviderA .nextFeature ( inFeat ):
321
- nElement += 1
322
- self .emit ( SIGNAL ( "runStatus(PyQt_PyObject)" ), nElement )
323
334
atMap = inFeat .attributeMap ()
324
335
idVar = atMap [ self .myParam ]
325
336
if idVar .toString ().trimmed () == i .toString ().trimmed ():
@@ -329,19 +340,21 @@ def convex_hull(self, useField ):
329
340
inGeom = QgsGeometry ( inFeat .geometry () )
330
341
points = ftools_utils .extractPoints ( inGeom )
331
342
hull .extend ( points )
343
+ nElement += 1
344
+ self .emit ( SIGNAL ( "runStatus(PyQt_PyObject)" ), nElement )
332
345
if len ( hull ) >= 3 :
333
346
tmpGeom = QgsGeometry ( outGeom .fromMultiPoint ( hull ) )
334
347
try :
335
348
outGeom = tmpGeom .convexHull ()
349
+ outFeat .setGeometry ( outGeom )
350
+ (area , perim ) = self .simpleMeasure ( outGeom )
351
+ outFeat .addAttribute ( 0 , QVariant ( outID ) )
352
+ outFeat .addAttribute ( 1 , QVariant ( area ) )
353
+ outFeat .addAttribute ( 2 , QVariant ( perim ) )
354
+ writer .addFeature ( outFeat )
336
355
except :
337
- outGeom = QgsGeometry ()
338
356
GEOS_EXCEPT = False
339
- outFeat .setGeometry ( outGeom )
340
- (area , perim ) = self .simpleMeasure ( outGeom )
341
- outFeat .addAttribute ( 0 , QVariant ( outID ) )
342
- outFeat .addAttribute ( 1 , QVariant ( area ) )
343
- outFeat .addAttribute ( 2 , QVariant ( perim ) )
344
- writer .addFeature ( outFeat )
357
+ continue
345
358
else :
346
359
hull = []
347
360
vproviderA .rewind ()
@@ -350,24 +363,24 @@ def convex_hull(self, useField ):
350
363
self .emit ( SIGNAL ( "runStatus(PyQt_PyObject)" ), 0 )
351
364
self .emit ( SIGNAL ( "runRange(PyQt_PyObject)" ), ( 0 , nFeat ) )
352
365
while vproviderA .nextFeature ( inFeat ):
353
- nElement += 1
354
- self .emit ( SIGNAL ( "runStatus(PyQt_PyObject)" ), nElement )
355
366
inGeom = QgsGeometry ( inFeat .geometry () )
356
367
points = ftools_utils .extractPoints ( inGeom )
357
368
hull .extend ( points )
369
+ nElement += 1
370
+ self .emit ( SIGNAL ( "runStatus(PyQt_PyObject)" ), nElement )
358
371
tmpGeom = QgsGeometry ( outGeom .fromMultiPoint ( hull ) )
359
372
try :
360
373
outGeom = tmpGeom .convexHull ()
374
+ outFeat .setGeometry ( outGeom )
375
+ writer .addFeature ( outFeat )
361
376
except :
362
- outGeom = QgsGeometry ()
363
377
GEOS_EXCEPT = False
364
- outFeat .setGeometry ( outGeom )
365
- writer .addFeature ( outFeat )
366
378
del writer
367
- return GEOS_EXCEPT , True
379
+ return GEOS_EXCEPT , FEATURE_EXCEPT , True
368
380
369
381
def dissolve ( self , useField ):
370
382
GEOS_EXCEPT = True
383
+ FEATURE_EXCEPT = True
371
384
vproviderA = self .vlayerA .dataProvider ()
372
385
allAttrsA = vproviderA .attributeIndexes ()
373
386
fields = vproviderA .fields ()
@@ -382,6 +395,7 @@ def dissolve( self, useField ):
382
395
self .emit ( SIGNAL ( "runStatus(PyQt_PyObject)" ), 0 )
383
396
self .emit ( SIGNAL ( "runRange(PyQt_PyObject)" ), ( 0 , nFeat ) )
384
397
first = True
398
+ add = True
385
399
while vproviderA .nextFeature ( inFeat ):
386
400
nElement += 1
387
401
self .emit ( SIGNAL ( "runStatus(PyQt_PyObject)" ), nElement )
@@ -394,11 +408,11 @@ def dissolve( self, useField ):
394
408
tmpInGeom = QgsGeometry ( inFeat .geometry () )
395
409
tmpOutGeom = QgsGeometry ( outFeat .geometry () )
396
410
try :
397
- tmpOutGeom = tmpOutGeom .combine ( tmpInGeom )
411
+ tmpOutGeom = QgsGeometry ( tmpOutGeom .combine ( tmpInGeom ) )
412
+ outFeat .setGeometry ( tmpOutGeom )
398
413
except :
399
- tmpOutGeom = QgsGeometry ()
400
414
GEOS_EXCEPT = False
401
- outFeat . setGeometry ( tmpOutGeom )
415
+ continue
402
416
outFeat .setAttributeMap ( attrs )
403
417
writer .addFeature ( outFeat )
404
418
else :
@@ -408,6 +422,7 @@ def dissolve( self, useField ):
408
422
self .emit ( SIGNAL ( "runRange(PyQt_PyObject)" ), ( 0 , nFeat ) )
409
423
for item in unique :
410
424
first = True
425
+ add = True
411
426
vproviderA .select ( allAttrsA )
412
427
vproviderA .rewind ()
413
428
while vproviderA .nextFeature ( inFeat ):
@@ -426,18 +441,20 @@ def dissolve( self, useField ):
426
441
tmpInGeom = QgsGeometry ( inFeat .geometry () )
427
442
tmpOutGeom = QgsGeometry ( outFeat .geometry () )
428
443
try :
429
- tmpOutGeom = tmpOutGeom .combine ( tmpInGeom )
444
+ tmpOutGeom = QgsGeometry ( tmpOutGeom .combine ( tmpInGeom ) )
445
+ outFeat .setGeometry ( tmpOutGeom )
430
446
except :
431
- tmpOutGeom = QgsGeometry ()
432
447
GEOS_EXCEPT = False
433
- outFeat .setGeometry ( tmpOutGeom )
434
- outFeat .setAttributeMap ( attrs )
435
- writer .addFeature ( outFeat )
448
+ add = False
449
+ if add :
450
+ outFeat .setAttributeMap ( attrs )
451
+ writer .addFeature ( outFeat )
436
452
del writer
437
- return GEOS_EXCEPT , True
453
+ return GEOS_EXCEPT , FEATURE_EXCEPT , True
438
454
439
455
def difference ( self ):
440
456
GEOS_EXCEPT = True
457
+ FEATURE_EXCEPT = True
441
458
vproviderA = self .vlayerA .dataProvider ()
442
459
allAttrsA = vproviderA .attributeIndexes ()
443
460
vproviderA .select ( allAttrsA )
@@ -460,28 +477,36 @@ def difference( self ):
460
477
vproviderA .rewind ()
461
478
while vproviderA .nextFeature ( inFeatA ):
462
479
nElement += 1
480
+ add = True
463
481
self .emit ( SIGNAL ( "runStatus(PyQt_PyObject)" ), nElement )
464
482
geom = QgsGeometry ( inFeatA .geometry () )
483
+ diff_geom = QgsGeometry ( geom )
465
484
atMap = inFeatA .attributeMap ()
466
485
intersects = index .intersects ( geom .boundingBox () )
467
486
for id in intersects :
468
487
vproviderB .featureAtId ( int ( id ), inFeatB , True , allAttrsB )
469
488
tmpGeom = QgsGeometry ( inFeatB .geometry () )
470
489
try :
471
- if geom .intersects ( tmpGeom ):
472
- geom = geom .difference ( tmpGeom )
490
+ if diff_geom .intersects ( tmpGeom ):
491
+ diff_geom = QgsGeometry ( diff_geom .difference ( tmpGeom ) )
473
492
except :
474
- geom = QgsGeometry ()
475
493
GEOS_EXCEPT = False
494
+ add = False
476
495
break
477
- outFeat .setGeometry ( geom )
478
- outFeat .setAttributeMap ( atMap )
479
- writer .addFeature ( outFeat )
496
+ if add :
497
+ try :
498
+ outFeat .setGeometry ( diff_geom )
499
+ outFeat .setAttributeMap ( atMap )
500
+ writer .addFeature ( outFeat )
501
+ except :
502
+ FEATURE_EXCEPT = False
503
+ continue
480
504
del writer
481
- return GEOS_EXCEPT , crs_match
505
+ return GEOS_EXCEPT , FEATURE_EXCEPT , crs_match
482
506
483
507
def intersect ( self ):
484
508
GEOS_EXCEPT = True
509
+ FEATURE_EXCEPT = True
485
510
vproviderA = self .vlayerA .dataProvider ()
486
511
allAttrsA = vproviderA .attributeIndexes ()
487
512
vproviderA .select ( allAttrsA )
@@ -514,22 +539,27 @@ def intersect( self ):
514
539
try :
515
540
if geom .intersects ( tmpGeom ):
516
541
atMapB = inFeatB .attributeMap ()
517
- int_geom = geom .intersection ( tmpGeom )
542
+ int_geom = QgsGeometry ( geom .intersection ( tmpGeom ) )
518
543
if int_geom .wkbType () == 7 :
519
544
int_com = geom .combine ( tmpGeom )
520
545
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 )
546
+ int_geom = QgsGeometry ( int_com .difference ( int_sym ) )
547
+ try :
548
+ outFeat .setGeometry ( int_geom )
549
+ outFeat .setAttributeMap ( ftools_utils .combineVectorAttributes ( atMapA , atMapB ) )
550
+ writer .addFeature ( outFeat )
551
+ except :
552
+ FEATURE_EXCEPT = False
553
+ continue
525
554
except :
526
555
GEOS_EXCEPT = False
527
- continue
556
+ break
528
557
del writer
529
- return True , crs_match
558
+ return GEOS_EXCEPT , FEATURE_EXCEPT , crs_match
530
559
531
560
def union ( self ):
532
561
GEOS_EXCEPT = True
562
+ FEATURE_EXCEPT = True
533
563
vproviderA = self .vlayerA .dataProvider ()
534
564
allAttrsA = vproviderA .attributeIndexes ()
535
565
vproviderA .select ( allAttrsA )
@@ -552,76 +582,99 @@ def union( self ):
552
582
self .emit ( SIGNAL ( "runRange(PyQt_PyObject)" ), ( 0 , nFeat ) )
553
583
vproviderA .rewind ()
554
584
while vproviderA .nextFeature ( inFeatA ):
555
- nElement += 1
556
585
self .emit ( SIGNAL ( "runStatus(PyQt_PyObject)" ), nElement )
586
+ nElement += 1
557
587
found = False
558
588
geom = QgsGeometry ( inFeatA .geometry () )
559
589
diffGeom = QgsGeometry ( inFeatA .geometry () )
560
590
atMapA = inFeatA .attributeMap ()
561
591
intersects = indexA .intersects ( geom .boundingBox () )
562
592
if len ( intersects ) <= 0 :
563
- outFeat .setGeometry ( geom )
564
- outFeat .setAttributeMap ( atMapA )
565
- writer .addFeature ( outFeat )
593
+ try :
594
+ outFeat .setGeometry ( geom )
595
+ outFeat .setAttributeMap ( atMapA )
596
+ writer .addFeature ( outFeat )
597
+ except :
598
+ FEATURE_EXCEPT = False
599
+ continue
566
600
else :
567
601
for id in intersects :
568
602
vproviderB .featureAtId ( int ( id ), inFeatB , True , allAttrsB )
569
603
atMapB = inFeatB .attributeMap ()
570
604
tmpGeom = QgsGeometry ( inFeatB .geometry () )
571
- if geom . intersects ( tmpGeom ) :
572
- found = True
573
- try :
574
- diff_geom = diff_geom .difference ( tmpGeom )
575
- int_geom = geom .intersection ( tmpGeom )
605
+ try :
606
+ if geom . intersects ( tmpGeom ):
607
+ found = True
608
+ diff_geom = QgsGeometry ( diff_geom .difference ( tmpGeom ) )
609
+ int_geom = QgsGeometry ( geom .intersection ( tmpGeom ) )
576
610
if int_geom .wkbType () == 7 :
577
611
int_com = geom .combine ( tmpGeom )
578
612
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
585
- outFeat .setGeometry ( int_geom )
586
- outFeat .setAttributeMap ( ftools_utils .combineVectorAttributes ( atMapA , atMapB ) )
587
- writer .addFeature ( outFeat )
613
+ int_geom = QgsGeometry ( int_com .difference ( int_sym ) )
614
+ try :
615
+ outFeat .setGeometry ( int_geom )
616
+ outFeat .setAttributeMap ( ftools_utils .combineVectorAttributes ( atMapA , atMapB ) )
617
+ writer .addFeature ( outFeat )
618
+ except :
619
+ FEATURE_EXCEPT = False
620
+ continue
621
+ except :
622
+ GEOS_EXCEPT = False
623
+ found = False
624
+ continue
588
625
if found :
589
- outFeat .setGeometry ( diff_geom )
590
- outFeat .setAttributeMap ( atMapA )
591
- writer .addFeature ( outFeat )
626
+ try :
627
+ outFeat .setGeometry ( diff_geom )
628
+ outFeat .setAttributeMap ( atMapA )
629
+ writer .addFeature ( outFeat )
630
+ except :
631
+ FEATURE_EXCEPT = False
632
+ continue
592
633
length = len ( vproviderA .fields ().values () )
593
634
vproviderB .rewind ()
594
635
while vproviderB .nextFeature ( inFeatA ):
595
- nElement += 1
596
- self .emit ( SIGNAL ( "runStatus(PyQt_PyObject)" ), nElement )
636
+ add = True
597
637
geom = QgsGeometry ( inFeatA .geometry () )
638
+ diff_geom = QgsGeometry ( geom )
598
639
atMap = inFeatA .attributeMap ().values ()
599
640
atMap = dict ( zip ( range ( length , length + len ( atMap ) ), atMap ) )
600
641
intersects = indexB .intersects ( geom .boundingBox () )
601
642
if len (intersects ) <= 0 :
602
- outFeat .setGeometry ( geom )
603
- outFeat .setAttributeMap ( atMapA )
604
- writer .addFeature ( outFeat )
643
+ try :
644
+ outFeat .setGeometry ( diff_geom )
645
+ outFeat .setAttributeMap ( atMapA )
646
+ writer .addFeature ( outFeat )
647
+ except :
648
+ FEATURE_EXCEPT = False
649
+ continue
605
650
else :
606
651
for id in intersects :
607
652
vproviderA .featureAtId ( int ( id ), inFeatB , True , allAttrsA )
608
653
atMapB = inFeatB .attributeMap ()
609
654
tmpGeom = QgsGeometry ( inFeatB .geometry () )
610
655
try :
611
- if geom .intersects ( tmpGeom ):
612
- geom = geom .difference ( tmpGeom )
656
+ if diff_geom .intersects ( tmpGeom ):
657
+ diff_geom = QgsGeometry ( diff_geom .difference ( tmpGeom ) )
613
658
except :
614
- geom = QgsGeometry ()
659
+ add = False
615
660
GEOS_EXCEPT = False
661
+ break
662
+ if add :
663
+ try :
664
+ outFeat .setGeometry ( diff_geom )
665
+ outFeat .setAttributeMap ( atMap )
666
+ writer .addFeature ( outFeat )
667
+ except :
668
+ FEATURE_EXCEPT = False
616
669
continue
617
- outFeat .setGeometry ( geom )
618
- outFeat .setAttributeMap ( atMap )
619
- writer .addFeature ( outFeat )
670
+ self .emit ( SIGNAL ( "runStatus(PyQt_PyObject)" ), nElement )
671
+ nElement += 1
620
672
del writer
621
- return True , crs_match
673
+ return GEOS_EXCEPT , FEATURE_EXCEPT , crs_match
622
674
623
675
def symetrical_difference ( self ):
624
676
GEOS_EXCEPT = True
677
+ FEATURE_EXCEPT = True
625
678
vproviderA = self .vlayerA .dataProvider ()
626
679
allAttrsA = vproviderA .attributeIndexes ()
627
680
vproviderA .select ( allAttrsA )
@@ -646,49 +699,64 @@ def symetrical_difference( self ):
646
699
while vproviderA .nextFeature ( inFeatA ):
647
700
nElement += 1
648
701
self .emit ( SIGNAL ( "runStatus(PyQt_PyObject)" ), nElement )
702
+ add = True
649
703
geom = QgsGeometry ( inFeatA .geometry () )
704
+ diff_geom = QgsGeometry ( geom )
650
705
atMapA = inFeatA .attributeMap ()
651
706
intersects = indexA .intersects ( geom .boundingBox () )
652
707
for id in intersects :
653
708
vproviderB .featureAtId ( int ( id ), inFeatB , True , allAttrsB )
654
709
tmpGeom = QgsGeometry ( inFeatB .geometry () )
655
710
try :
656
- if geom .intersects ( tmpGeom ):
657
- geom = geom .difference ( tmpGeom )
711
+ if diff_geom .intersects ( tmpGeom ):
712
+ diff_geom = QgsGeometry ( diff_geom .difference ( tmpGeom ) )
658
713
except :
659
- geom = QgsGeometry ()
714
+ add = False
660
715
GEOS_EXCEPT = False
716
+ break
717
+ if add :
718
+ try :
719
+ outFeat .setGeometry ( diff_geom )
720
+ outFeat .setAttributeMap ( atMapA )
721
+ writer .addFeature ( outFeat )
722
+ except :
723
+ FEATURE_EXCEPT = False
661
724
continue
662
- outFeat .setGeometry ( geom )
663
- outFeat .setAttributeMap ( atMapA )
664
- writer .addFeature ( outFeat )
665
725
length = len ( vproviderA .fields ().values () )
666
726
vproviderB .rewind ()
667
727
while vproviderB .nextFeature ( inFeatA ):
668
728
nElement += 1
669
729
self .emit ( SIGNAL ( "runStatus(PyQt_PyObject)" ), nElement )
730
+ add = True
670
731
geom = QgsGeometry ( inFeatA .geometry () )
732
+ diff_geom = QgsGeometry ( geom )
671
733
atMap = inFeatA .attributeMap ().values ()
672
734
atMap = dict ( zip ( range ( length , length + len ( atMap ) ), atMap ) )
673
735
intersects = indexB .intersects ( geom .boundingBox () )
674
736
for id in intersects :
675
737
vproviderA .featureAtId ( int ( id ), inFeatB , True , allAttrsA )
676
738
tmpGeom = QgsGeometry ( inFeatB .geometry () )
677
739
try :
678
- if geom .intersects ( tmpGeom ):
679
- geom = geom .difference ( tmpGeom )
740
+ if diff_geom .intersects ( tmpGeom ):
741
+ diff_geom = QgsGeometry ( diff_geom .difference ( tmpGeom ) )
680
742
except :
681
- geom = QgsGeometry ()
743
+ add = False
682
744
GEOS_EXCEPT = False
745
+ break
746
+ if add :
747
+ try :
748
+ outFeat .setGeometry ( diff_geom )
749
+ outFeat .setAttributeMap ( atMap )
750
+ writer .addFeature ( outFeat )
751
+ except :
752
+ FEATURE_EXCEPT = False
683
753
continue
684
- outFeat .setGeometry ( geom )
685
- outFeat .setAttributeMap ( atMap )
686
- writer .addFeature ( outFeat )
687
754
del writer
688
- return GEOS_EXCEPT , crs_match
755
+ return GEOS_EXCEPT , FEATURE_EXCEPT , crs_match
689
756
690
757
def clip ( self ):
691
758
GEOS_EXCEPT = True
759
+ FEATURE_EXCEPT = True
692
760
vproviderA = self .vlayerA .dataProvider ()
693
761
allAttrsA = vproviderA .attributeIndexes ()
694
762
vproviderA .select ( allAttrsA )
@@ -720,19 +788,23 @@ def clip( self ):
720
788
tmpGeom = QgsGeometry ( inFeatB .geometry () )
721
789
try :
722
790
if geom .intersects ( tmpGeom ):
723
- int_geom = geom .intersection ( tmpGeom )
791
+ int_geom = QgsGeometry ( geom .intersection ( tmpGeom ) )
724
792
if int_geom .wkbType () == 7 :
725
793
int_com = geom .combine ( tmpGeom )
726
794
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 )
795
+ int_geom = QgsGeometry ( int_com .difference ( int_sym ) )
796
+ try :
797
+ outFeat .setGeometry ( int_geom )
798
+ outFeat .setAttributeMap ( atMap )
799
+ writer .addFeature ( outFeat )
800
+ except :
801
+ FEATURE_EXCEPT = False
802
+ continue
731
803
except :
732
804
GEOS_EXCEPT = False
733
- continue
805
+ break
734
806
del writer
735
- return GEOS_EXCEPT , crs_match
807
+ return GEOS_EXCEPT , FEATURE_EXCEPT , crs_match
736
808
737
809
def checkParameter ( self , layer , param ):
738
810
if self .myFunction == 1 :
0 commit comments