34
34
from processing .core .GeoAlgorithm import GeoAlgorithm
35
35
from processing .core .ProcessingLog import ProcessingLog
36
36
from processing .core .GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
37
- from processing .core .parameters import ParameterVector
37
+ from processing .core .parameters import ParameterVector , ParameterBoolean
38
38
from processing .core .outputs import OutputVector
39
39
from processing .tools import dataobjects , vector
40
40
@@ -54,6 +54,7 @@ class Intersection(GeoAlgorithm):
54
54
55
55
INPUT = 'INPUT'
56
56
INPUT2 = 'INPUT2'
57
+ IGNORE_NULL = 'IGNORE_NULL'
57
58
OUTPUT = 'OUTPUT'
58
59
59
60
def getIcon (self ):
@@ -66,13 +67,17 @@ def defineCharacteristics(self):
66
67
self .tr ('Input layer' ), [ParameterVector .VECTOR_TYPE_ANY ]))
67
68
self .addParameter (ParameterVector (self .INPUT2 ,
68
69
self .tr ('Intersect layer' ), [ParameterVector .VECTOR_TYPE_ANY ]))
70
+ self .addParameter (ParameterBoolean (Intersection .IGNORE_NULL ,
71
+ self .tr ('Ignore NULL geometries' ),
72
+ False , True ))
69
73
self .addOutput (OutputVector (self .OUTPUT , self .tr ('Intersection' )))
70
74
71
75
def processAlgorithm (self , progress ):
72
76
vlayerA = dataobjects .getObjectFromUri (
73
77
self .getParameterValue (self .INPUT ))
74
78
vlayerB = dataobjects .getObjectFromUri (
75
79
self .getParameterValue (self .INPUT2 ))
80
+ ignoreNull = self .getParameterValue (Intersection .IGNORE_NULL )
76
81
77
82
geomType = QgsWKBTypes .multiType (QGis .fromOldWkbType (vlayerA .wkbType ()))
78
83
fields = vector .combineVectorFields (vlayerA , vlayerB )
@@ -84,13 +89,30 @@ def processAlgorithm(self, progress):
84
89
total = 100.0 / len (selectionA )
85
90
for current , inFeatA in enumerate (selectionA ):
86
91
progress .setPercentage (int (current * total ))
87
- geom = QgsGeometry (inFeatA .geometry ())
92
+ geom = inFeatA .geometry ()
93
+ if not geom :
94
+ if ignoreNull :
95
+ continue
96
+ else :
97
+ raise GeoAlgorithmExecutionException (
98
+ self .tr ('Input layer A contains NULL geometries. Please check "Ignore NULL geometries" if you want to run this algorithm anyway.' ))
99
+ if not geom .isGeosValid ():
100
+ raise GeoAlgorithmExecutionException (
101
+ self .tr ('Input layer A contains invalid geometries (Feature {}). Unable to complete intersection algorithm.' .format (inFeatA .id ())))
88
102
atMapA = inFeatA .attributes ()
89
103
intersects = index .intersects (geom .boundingBox ())
90
- for i in intersects :
91
- request = QgsFeatureRequest ().setFilterFid (i )
92
- inFeatB = vlayerB .getFeatures (request ).next ()
104
+ for inFeatB in vlayerB .getFeatures (QgsFeatureRequest ().setFilterFids (intersects )):
93
105
tmpGeom = QgsGeometry (inFeatB .geometry ())
106
+ if not geom :
107
+ if ignoreNull :
108
+ continue
109
+ else :
110
+ raise GeoAlgorithmExecutionException (
111
+ self .tr ('Input layer B contains NULL geometries. Please check "Ignore NULL geometries" if you want to run this algorithm anyway.' ))
112
+ if not geom .isGeosValid ():
113
+ raise GeoAlgorithmExecutionException (
114
+ self .tr ('Input layer B contains invalid geometries (Feature {}). Unable to complete intersection algorithm.' .format (inFeatB .id ())))
115
+
94
116
if geom .intersects (tmpGeom ):
95
117
atMapB = inFeatB .attributes ()
96
118
int_geom = QgsGeometry (geom .intersection (tmpGeom ))
0 commit comments