Skip to content

Commit b88ad8e

Browse files
committedJun 26, 2017
Port Fix Geometry algorithm to new API
1 parent ec7477c commit b88ad8e

File tree

3 files changed

+36
-38
lines changed

3 files changed

+36
-38
lines changed
 

‎python/plugins/processing/algs/qgis/FixGeometry.py

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,15 @@
2727

2828
from qgis.core import (QgsWkbTypes,
2929
QgsFeatureSink,
30+
QgsFeatureRequest,
31+
QgsProcessingFeatureSource,
3032
QgsGeometry,
31-
QgsApplication,
32-
QgsMessageLog,
33-
QgsProcessingUtils)
33+
QgsProcessingParameterDefinition,
34+
QgsProcessingParameterFeatureSource,
35+
QgsProcessingParameterFeatureSink,
36+
QgsProcessingOutputVectorLayer)
3437

3538
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
36-
from processing.core.parameters import ParameterVector
37-
from processing.core.outputs import OutputVector
38-
from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
39-
from processing.tools import dataobjects
4039

4140

4241
class FixGeometry(QgisAlgorithm):
@@ -52,11 +51,9 @@ def group(self):
5251

5352
def __init__(self):
5453
super().__init__()
55-
self.addParameter(ParameterVector(self.INPUT,
56-
self.tr('Input Layer'),
57-
[dataobjects.TYPE_VECTOR_POLYGON, dataobjects.TYPE_VECTOR_LINE]))
58-
self.addOutput(OutputVector(self.OUTPUT,
59-
self.tr('Layer with fixed geometries')))
54+
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT, self.tr('Input layer'), [QgsProcessingParameterDefinition.TypeVectorLine, QgsProcessingParameterDefinition.TypeVectorPolygon]))
55+
self.addParameter(QgsProcessingParameterFeatureSink(self.OUTPUT, self.tr('Fixed geometries')))
56+
self.addOutput(QgsProcessingOutputVectorLayer(self.OUTPUT, self.tr("Fixed geometries")))
6057

6158
def name(self):
6259
return 'fixgeometries'
@@ -65,22 +62,22 @@ def displayName(self):
6562
return self.tr('Fix geometries')
6663

6764
def processAlgorithm(self, parameters, context, feedback):
68-
layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT), context)
65+
source = self.parameterAsSource(parameters, self.INPUT, context)
6966

70-
writer = self.getOutputFromName(
71-
self.OUTPUT).getVectorWriter(layer.fields(), QgsWkbTypes.multiType(layer.wkbType()), layer.crs(), context)
67+
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
68+
source.fields(), QgsWkbTypes.multiType(source.wkbType()), source.sourceCrs())
7269

73-
features = QgsProcessingUtils.getFeatures(layer, context)
74-
if QgsProcessingUtils.featureCount(layer, context) == 0:
75-
raise GeoAlgorithmExecutionException(self.tr('There are no features in the input layer'))
76-
77-
total = 100.0 / layer.featureCount() if layer.featureCount() else 0
70+
features = source.getFeatures(QgsFeatureRequest(), QgsProcessingFeatureSource.FlagSkipGeometryValidityChecks)
71+
total = 100.0 / source.featureCount() if source.featureCount() else 0
7872
for current, inputFeature in enumerate(features):
73+
if feedback.isCanceled():
74+
break
75+
7976
outputFeature = inputFeature
8077
if inputFeature.geometry():
8178
outputGeometry = inputFeature.geometry().makeValid()
8279
if not outputGeometry:
83-
QgsMessageLog.logMessage('makeValid failed for feature {}'.format(inputFeature.id()), self.tr('Processing'), QgsMessageLog.WARNING)
80+
feedback.pushInfo('makeValid failed for feature {}'.format(inputFeature.id()))
8481

8582
if outputGeometry.wkbType() == QgsWkbTypes.Unknown or QgsWkbTypes.flatType(outputGeometry.geometry().wkbType()) == QgsWkbTypes.GeometryCollection:
8683
tmpGeometries = outputGeometry.asGeometryCollection()
@@ -89,7 +86,7 @@ def processAlgorithm(self, parameters, context, feedback):
8986
try:
9087
g.convertToMultiType()
9188
outputFeature.setGeometry(QgsGeometry(g))
92-
writer.addFeature(outputFeature, QgsFeatureSink.FastInsert)
89+
sink.addFeature(outputFeature, QgsFeatureSink.FastInsert)
9390
except:
9491
pass
9592
feedback.setProgress(int(current * total))
@@ -98,7 +95,7 @@ def processAlgorithm(self, parameters, context, feedback):
9895
outputGeometry.convertToMultiType()
9996
outputFeature.setGeometry(outputGeometry)
10097

101-
writer.addFeature(outputFeature, QgsFeatureSink.FastInsert)
98+
sink.addFeature(outputFeature, QgsFeatureSink.FastInsert)
10299
feedback.setProgress(int(current * total))
103100

104-
del writer
101+
return {self.OUTPUT: dest_id}

‎python/plugins/processing/algs/qgis/QGISAlgorithmProvider.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
from .DensifyGeometriesInterval import DensifyGeometriesInterval
5555
from .DropGeometry import DropGeometry
5656
from .ExtentFromLayer import ExtentFromLayer
57+
from .FixGeometry import FixGeometry
5758
from .GridPolygon import GridPolygon
5859
from .ImportIntoPostGIS import ImportIntoPostGIS
5960
from .Merge import Merge
@@ -168,7 +169,6 @@
168169
# from .ServiceAreaFromLayer import ServiceAreaFromLayer
169170
# from .TruncateTable import TruncateTable
170171
# from .Polygonize import Polygonize
171-
# from .FixGeometry import FixGeometry
172172
# from .ExecuteSQL import ExecuteSQL
173173
# from .FindProjection import FindProjection
174174
# from .TopoColors import TopoColor
@@ -240,7 +240,7 @@ def getAlgs(self):
240240
# ShortestPathPointToPoint(), ShortestPathPointToLayer(),
241241
# ShortestPathLayerToPoint(), ServiceAreaFromPoint(),
242242
# ServiceAreaFromLayer(), TruncateTable(), Polygonize(),
243-
# FixGeometry(), ExecuteSQL(), FindProjection(),
243+
# ExecuteSQL(), FindProjection(),
244244
# TopoColor(), EliminateSelection()
245245
# ]
246246
algs = [AddTableField(),
@@ -257,6 +257,7 @@ def getAlgs(self):
257257
DensifyGeometriesInterval(),
258258
DropGeometry(),
259259
ExtentFromLayer(),
260+
FixGeometry(),
260261
GridPolygon(),
261262
ImportIntoPostGIS(),
262263
Merge(),

‎python/plugins/processing/tests/testdata/qgis_algorithm_tests.yaml

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2275,18 +2275,18 @@ tests:
22752275
# OUTPUT_LAYER:
22762276
# name: expected/zonal_statistics.gml
22772277
# type: vector
2278-
#
2279-
# - algorithm: qgis:fixgeometries
2280-
# name: Fix geometries
2281-
# params:
2282-
# INPUT:
2283-
# name: invalidgeometries.gml
2284-
# type: vector
2285-
# results:
2286-
# OUTPUT:
2287-
# name: expected/valid.gml
2288-
# type: vector
2289-
#
2278+
2279+
- algorithm: qgis:fixgeometries
2280+
name: Fix geometries
2281+
params:
2282+
INPUT:
2283+
name: invalidgeometries.gml
2284+
type: vector
2285+
results:
2286+
OUTPUT:
2287+
name: expected/valid.gml
2288+
type: vector
2289+
22902290
# - algorithm: qgis:polygonize
22912291
# name: Polygonize
22922292
# params:

1 commit comments

Comments
 (1)

nirvn commented on Jun 26, 2017

@nirvn
Contributor

Ahh, thanks.

Please sign in to comment.