mirror of
https://github.com/qgis/QGIS.git
synced 2025-12-06 00:03:16 -05:00
[processing] added ‘invalid feature handling’ option
This commit is contained in:
parent
3e80a52995
commit
e8c149ed42
@ -52,6 +52,7 @@ class ProcessingConfig(object):
|
|||||||
VECTOR_POLYGON_STYLE = 'VECTOR_POLYGON_STYLE'
|
VECTOR_POLYGON_STYLE = 'VECTOR_POLYGON_STYLE'
|
||||||
SHOW_RECENT_ALGORITHMS = 'SHOW_RECENT_ALGORITHMS'
|
SHOW_RECENT_ALGORITHMS = 'SHOW_RECENT_ALGORITHMS'
|
||||||
USE_SELECTED = 'USE_SELECTED'
|
USE_SELECTED = 'USE_SELECTED'
|
||||||
|
FILTER_INVALID_GEOMETRIES = 'FILTER_INVALID_GEOMETRIES'
|
||||||
USE_FILENAME_AS_LAYER_NAME = 'USE_FILENAME_AS_LAYER_NAME'
|
USE_FILENAME_AS_LAYER_NAME = 'USE_FILENAME_AS_LAYER_NAME'
|
||||||
KEEP_DIALOG_OPEN = 'KEEP_DIALOG_OPEN'
|
KEEP_DIALOG_OPEN = 'KEEP_DIALOG_OPEN'
|
||||||
SHOW_DEBUG_IN_DIALOG = 'SHOW_DEBUG_IN_DIALOG'
|
SHOW_DEBUG_IN_DIALOG = 'SHOW_DEBUG_IN_DIALOG'
|
||||||
@ -84,6 +85,14 @@ class ProcessingConfig(object):
|
|||||||
ProcessingConfig.tr('General'),
|
ProcessingConfig.tr('General'),
|
||||||
ProcessingConfig.USE_SELECTED,
|
ProcessingConfig.USE_SELECTED,
|
||||||
ProcessingConfig.tr('Use only selected features'), True))
|
ProcessingConfig.tr('Use only selected features'), True))
|
||||||
|
invalidFeaturesOptions = [ProcessingConfig.tr('Do not filter (better performance'),
|
||||||
|
ProcessingConfig.tr('Ignore features with invalid geometries'),
|
||||||
|
ProcessingConfig.tr('Stop algorithm execution when a geometry is invalid')]
|
||||||
|
ProcessingConfig.addSetting(Setting(
|
||||||
|
ProcessingConfig.tr('General'),
|
||||||
|
ProcessingConfig.FILTER_INVALID_GEOMETRIES,
|
||||||
|
ProcessingConfig.tr('Invalid features filtering'), invalidFeaturesOptions[2],
|
||||||
|
valuetype=Setting.SELECTION, options=invalidFeaturesOptions))
|
||||||
ProcessingConfig.addSetting(Setting(
|
ProcessingConfig.addSetting(Setting(
|
||||||
ProcessingConfig.tr('General'),
|
ProcessingConfig.tr('General'),
|
||||||
ProcessingConfig.USE_FILENAME_AS_LAYER_NAME,
|
ProcessingConfig.USE_FILENAME_AS_LAYER_NAME,
|
||||||
|
|||||||
@ -24,6 +24,7 @@ from builtins import str
|
|||||||
from builtins import range
|
from builtins import range
|
||||||
from builtins import object
|
from builtins import object
|
||||||
|
|
||||||
|
|
||||||
__author__ = 'Victor Olaya'
|
__author__ = 'Victor Olaya'
|
||||||
__date__ = 'February 2013'
|
__date__ = 'February 2013'
|
||||||
__copyright__ = '(C) 2013, Victor Olaya'
|
__copyright__ = '(C) 2013, Victor Olaya'
|
||||||
@ -42,13 +43,14 @@ import io
|
|||||||
import psycopg2
|
import psycopg2
|
||||||
from osgeo import ogr
|
from osgeo import ogr
|
||||||
|
|
||||||
from qgis.PyQt.QtCore import QVariant, QSettings
|
from qgis.PyQt.QtCore import QVariant, QSettings, QCoreApplication
|
||||||
from qgis.core import (Qgis, QgsFields, QgsField, QgsGeometry, QgsRectangle, QgsWkbTypes,
|
from qgis.core import (Qgis, QgsFields, QgsField, QgsGeometry, QgsRectangle, QgsWkbTypes,
|
||||||
QgsSpatialIndex, QgsProject, QgsMapLayer, QgsVectorLayer,
|
QgsSpatialIndex, QgsProject, QgsMapLayer, QgsVectorLayer,
|
||||||
QgsVectorFileWriter, QgsDistanceArea, QgsDataSourceUri, QgsCredentials,
|
QgsVectorFileWriter, QgsDistanceArea, QgsDataSourceUri, QgsCredentials,
|
||||||
QgsFeatureRequest, QgsWkbTypes)
|
QgsFeatureRequest, QgsWkbTypes)
|
||||||
|
|
||||||
from processing.core.ProcessingConfig import ProcessingConfig
|
from processing.core.ProcessingConfig import ProcessingConfig
|
||||||
|
from processing.core.ProcessingLog import ProcessingLog
|
||||||
from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
|
from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
|
||||||
from processing.tools import dataobjects, spatialite, postgis
|
from processing.tools import dataobjects, spatialite, postgis
|
||||||
|
|
||||||
@ -95,6 +97,8 @@ def features(layer, request=QgsFeatureRequest()):
|
|||||||
"""
|
"""
|
||||||
class Features(object):
|
class Features(object):
|
||||||
|
|
||||||
|
DO_NOT_CHECK, IGNORE, RAISE_EXCEPTION = range(3)
|
||||||
|
|
||||||
def __init__(self, layer, request):
|
def __init__(self, layer, request):
|
||||||
self.layer = layer
|
self.layer = layer
|
||||||
self.selection = False
|
self.selection = False
|
||||||
@ -105,6 +109,27 @@ def features(layer, request=QgsFeatureRequest()):
|
|||||||
else:
|
else:
|
||||||
self.iter = layer.getFeatures(request)
|
self.iter = layer.getFeatures(request)
|
||||||
|
|
||||||
|
invalidFeaturesMethod = ProcessingConfig.getSetting(ProcessingConfig.FILTER_INVALID_GEOMETRIES)
|
||||||
|
|
||||||
|
def filterFeature(f, ignoreInvalid):
|
||||||
|
geom = f.geometry()
|
||||||
|
if geom is None:
|
||||||
|
ProcessingLog.addToLog(ProcessingLog.LOG_INFO,
|
||||||
|
self.tr('Feature with NULL geometry found.'))
|
||||||
|
elif not geom.isGeosValid():
|
||||||
|
ProcessingLog.addToLog(ProcessingLog.LOG_ERROR,
|
||||||
|
self.tr('GEOS geoprocessing error: One or more input features have invalid geometry.'))
|
||||||
|
if ignoreInvalid:
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
raise GeoAlgorithmExecutionException(self.tr('Features with invalid geometries found. Please fix these errors or specify the "Ignore invalid input features" flag'))
|
||||||
|
return True
|
||||||
|
|
||||||
|
if invalidFeaturesMethod == self.IGNORE:
|
||||||
|
self.iter = filter(filterFeature, self.iter, True)
|
||||||
|
elif invalidFeaturesMethod == self.RAISE_EXCEPTION:
|
||||||
|
self.iter = filter(filterFeature, self.iter, False)
|
||||||
|
|
||||||
def __iter__(self):
|
def __iter__(self):
|
||||||
return self.iter
|
return self.iter
|
||||||
|
|
||||||
@ -114,6 +139,10 @@ def features(layer, request=QgsFeatureRequest()):
|
|||||||
else:
|
else:
|
||||||
return int(self.layer.featureCount())
|
return int(self.layer.featureCount())
|
||||||
|
|
||||||
|
def tr(self, string):
|
||||||
|
return QCoreApplication.translate("FeatureIterator", string)
|
||||||
|
|
||||||
|
|
||||||
return Features(layer, request)
|
return Features(layer, request)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user