24
24
from builtins import range
25
25
from builtins import object
26
26
27
+
27
28
__author__ = 'Victor Olaya'
28
29
__date__ = 'February 2013'
29
30
__copyright__ = '(C) 2013, Victor Olaya'
42
43
import psycopg2
43
44
from osgeo import ogr
44
45
45
- from qgis .PyQt .QtCore import QVariant , QSettings
46
+ from qgis .PyQt .QtCore import QVariant , QSettings , QCoreApplication
46
47
from qgis .core import (Qgis , QgsFields , QgsField , QgsGeometry , QgsRectangle , QgsWkbTypes ,
47
48
QgsSpatialIndex , QgsProject , QgsMapLayer , QgsVectorLayer ,
48
49
QgsVectorFileWriter , QgsDistanceArea , QgsDataSourceUri , QgsCredentials ,
49
50
QgsFeatureRequest , QgsWkbTypes )
50
51
51
52
from processing .core .ProcessingConfig import ProcessingConfig
53
+ from processing .core .ProcessingLog import ProcessingLog
52
54
from processing .core .GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
53
55
from processing .tools import dataobjects , spatialite , postgis
54
56
@@ -95,6 +97,8 @@ def features(layer, request=QgsFeatureRequest()):
95
97
"""
96
98
class Features (object ):
97
99
100
+ DO_NOT_CHECK , IGNORE , RAISE_EXCEPTION = range (3 )
101
+
98
102
def __init__ (self , layer , request ):
99
103
self .layer = layer
100
104
self .selection = False
@@ -104,6 +108,27 @@ def __init__(self, layer, request):
104
108
self .selection = True
105
109
else :
106
110
self .iter = layer .getFeatures (request )
111
+
112
+ invalidFeaturesMethod = ProcessingConfig .getSetting (ProcessingConfig .FILTER_INVALID_GEOMETRIES )
113
+
114
+ def filterFeature (f , ignoreInvalid ):
115
+ geom = f .geometry ()
116
+ if geom is None :
117
+ ProcessingLog .addToLog (ProcessingLog .LOG_INFO ,
118
+ self .tr ('Feature with NULL geometry found.' ))
119
+ elif not geom .isGeosValid ():
120
+ ProcessingLog .addToLog (ProcessingLog .LOG_ERROR ,
121
+ self .tr ('GEOS geoprocessing error: One or more input features have invalid geometry.' ))
122
+ if ignoreInvalid :
123
+ return False
124
+ else :
125
+ raise GeoAlgorithmExecutionException (self .tr ('Features with invalid geometries found. Please fix these errors or specify the "Ignore invalid input features" flag' ))
126
+ return True
127
+
128
+ if invalidFeaturesMethod == self .IGNORE :
129
+ self .iter = filter (filterFeature , self .iter , True )
130
+ elif invalidFeaturesMethod == self .RAISE_EXCEPTION :
131
+ self .iter = filter (filterFeature , self .iter , False )
107
132
108
133
def __iter__ (self ):
109
134
return self .iter
@@ -113,6 +138,10 @@ def __len__(self):
113
138
return int (self .layer .selectedFeatureCount ())
114
139
else :
115
140
return int (self .layer .featureCount ())
141
+
142
+ def tr (self , string ):
143
+ return QCoreApplication .translate ("FeatureIterator" , string )
144
+
116
145
117
146
return Features (layer , request )
118
147
0 commit comments