26
26
__revision__ = '$Format:%H$'
27
27
28
28
from qgis .core import QGis , QgsFeatureRequest , QgsFeature , QgsGeometry , QgsWKBTypes
29
+
29
30
from processing .core .GeoAlgorithm import GeoAlgorithm
30
31
from processing .core .ProcessingLog import ProcessingLog
32
+ from processing .core .GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
31
33
from processing .core .parameters import ParameterVector
32
34
from processing .core .outputs import OutputVector
33
35
from processing .tools import dataobjects , vector
41
43
for const in value :
42
44
wkbTypeGroups [const ] = key
43
45
46
+ GEOM_25D = [QGis .WKBPoint25D , QGis .WKBLineString25D , QGis .WKBPolygon25D ,
47
+ QGis .WKBMultiPoint25D , QGis .WKBMultiLineString25D ,
48
+ QGis .WKBMultiPolygon25D ]
49
+
44
50
45
51
class Intersection (GeoAlgorithm ):
46
52
47
53
INPUT = 'INPUT'
48
54
INPUT2 = 'INPUT2'
49
55
OUTPUT = 'OUTPUT'
50
56
57
+ def defineCharacteristics (self ):
58
+ self .name , self .i18n_name = self .trAlgorithm ('Intersection' )
59
+ self .group , self .i18n_group = self .trAlgorithm ('Vector overlay tools' )
60
+ self .addParameter (ParameterVector (self .INPUT ,
61
+ self .tr ('Input layer' ), [ParameterVector .VECTOR_TYPE_ANY ]))
62
+ self .addParameter (ParameterVector (self .INPUT2 ,
63
+ self .tr ('Intersect layer' ), [ParameterVector .VECTOR_TYPE_ANY ]))
64
+ self .addOutput (OutputVector (self .OUTPUT , self .tr ('Intersection' )))
65
+
51
66
def processAlgorithm (self , progress ):
52
67
vlayerA = dataobjects .getObjectFromUri (
53
68
self .getParameterValue (self .INPUT ))
54
69
vlayerB = dataobjects .getObjectFromUri (
55
70
self .getParameterValue (self .INPUT2 ))
56
71
vproviderA = vlayerA .dataProvider ()
57
72
73
+ geomType = vproviderA .geometryType ()
74
+ if geomType in GEOM_25D :
75
+ raise GeoAlgorithmExecutionException (
76
+ self .tr ('Input layer has unsupported geometry type {}' ).format (geomType ))
77
+
58
78
fields = vector .combineVectorFields (vlayerA , vlayerB )
59
79
writer = self .getOutputFromName (self .OUTPUT ).getVectorWriter (fields ,
60
- vproviderA . geometryType () , vproviderA .crs ())
80
+ geomType , vproviderA .crs ())
61
81
inFeatA = QgsFeature ()
62
82
inFeatB = QgsFeature ()
63
83
outFeat = QgsFeature ()
@@ -75,36 +95,30 @@ def processAlgorithm(self, progress):
75
95
request = QgsFeatureRequest ().setFilterFid (i )
76
96
inFeatB = vlayerB .getFeatures (request ).next ()
77
97
tmpGeom = QgsGeometry (inFeatB .geometry ())
78
- try :
79
- if geom .intersects (tmpGeom ):
80
- atMapB = inFeatB .attributes ()
81
- int_geom = QgsGeometry (geom .intersection (tmpGeom ))
82
- if int_geom .wkbType () == QGis .WKBUnknown or QgsWKBTypes .flatType (int_geom .geometry ().wkbType ()) == QgsWKBTypes .GeometryCollection :
83
- int_com = geom .combine (tmpGeom )
84
- int_sym = geom .symDifference (tmpGeom )
85
- int_geom = QgsGeometry (int_com .difference (int_sym ))
86
- try :
87
- if int_geom .wkbType () in wkbTypeGroups [wkbTypeGroups [int_geom .wkbType ()]]:
88
- outFeat .setGeometry (int_geom )
89
- attrs = []
90
- attrs .extend (atMapA )
91
- attrs .extend (atMapB )
92
- outFeat .setAttributes (attrs )
93
- writer .addFeature (outFeat )
94
- except :
95
- ProcessingLog .addToLog (ProcessingLog .LOG_INFO ,
96
- self .tr ('Feature geometry error: One or more output features ignored due to invalid geometry.' ))
97
- continue
98
- except :
99
- break
98
+ if geom .intersects (tmpGeom ):
99
+ atMapB = inFeatB .attributes ()
100
+ int_geom = QgsGeometry (geom .intersection (tmpGeom ))
101
+ if int_geom .wkbType () == QGis .WKBUnknown or QgsWKBTypes .flatType (int_geom .geometry ().wkbType ()) == QgsWKBTypes .GeometryCollection :
102
+ int_com = geom .combine (tmpGeom )
103
+ int_sym = geom .symDifference (tmpGeom )
104
+ int_geom = QgsGeometry (int_com .difference (int_sym ))
105
+ if int_geom .isGeosEmpty () or not int_geom .isGeosValid ():
106
+ ProcessingLog .addToLog (ProcessingLog .LOG_ERROR ,
107
+ self .tr ('GEOS geoprocessing error: One or '
108
+ 'more input features have invalid '
109
+ 'geometry.' ))
110
+ break
111
+ try :
112
+ if int_geom .wkbType () in wkbTypeGroups [wkbTypeGroups [int_geom .wkbType ()]]:
113
+ outFeat .setGeometry (int_geom )
114
+ attrs = []
115
+ attrs .extend (atMapA )
116
+ attrs .extend (atMapB )
117
+ outFeat .setAttributes (attrs )
118
+ writer .addFeature (outFeat )
119
+ except :
120
+ ProcessingLog .addToLog (ProcessingLog .LOG_INFO ,
121
+ self .tr ('Feature geometry error: One or more output features ignored due to invalid geometry.' ))
122
+ continue
100
123
101
124
del writer
102
-
103
- def defineCharacteristics (self ):
104
- self .name , self .i18n_name = self .trAlgorithm ('Intersection' )
105
- self .group , self .i18n_group = self .trAlgorithm ('Vector overlay tools' )
106
- self .addParameter (ParameterVector (self .INPUT ,
107
- self .tr ('Input layer' ), [ParameterVector .VECTOR_TYPE_ANY ]))
108
- self .addParameter (ParameterVector (self .INPUT2 ,
109
- self .tr ('Intersect layer' ), [ParameterVector .VECTOR_TYPE_ANY ]))
110
- self .addOutput (OutputVector (self .OUTPUT , self .tr ('Intersection' )))
0 commit comments