Port merge lines algorithm to new API

This commit is contained in:
Nyall Dawson 2017-07-27 12:30:38 +10:00
parent 95be6d17b5
commit 558580588c
3 changed files with 34 additions and 52 deletions

View File

@ -27,23 +27,18 @@ __revision__ = '$Format:%H$'
import os
from qgis.core import QgsFeature, QgsFeatureSink, QgsProcessingUtils
from qgis.core import (QgsProcessing,
QgsWkbTypes)
from qgis.PyQt.QtGui import QIcon
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
from processing.core.parameters import ParameterVector
from processing.core.outputs import OutputVector
from processing.tools import dataobjects
from processing.algs.qgis.QgisAlgorithm import QgisFeatureBasedAlgorithm
pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0]
class MergeLines(QgisAlgorithm):
INPUT_LAYER = 'INPUT_LAYER'
OUTPUT_LAYER = 'OUTPUT_LAYER'
class MergeLines(QgisFeatureBasedAlgorithm):
def icon(self):
return QIcon(os.path.join(pluginPath, 'images', 'ftools', 'to_lines.png'))
@ -57,41 +52,27 @@ class MergeLines(QgisAlgorithm):
def __init__(self):
super().__init__()
def initAlgorithm(self, config=None):
self.addParameter(ParameterVector(self.INPUT_LAYER,
self.tr('Input layer'), [dataobjects.TYPE_VECTOR_LINE]))
self.addOutput(OutputVector(self.OUTPUT_LAYER, self.tr('Merged'), datatype=[dataobjects.TYPE_VECTOR_LINE]))
def name(self):
return 'mergelines'
def displayName(self):
return self.tr('Merge lines')
def processAlgorithm(self, parameters, context, feedback):
layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT_LAYER), context)
def outputName(self):
return self.tr('Merged')
writer = self.getOutputFromName(
self.OUTPUT_LAYER).getVectorWriter(layer.fields(), layer.wkbType(), layer.crs(), context)
def outputType(self):
return QgsProcessing.TypeVectorLine
features = QgsProcessingUtils.getFeatures(layer, context)
total = 100.0 / layer.featureCount() if layer.featureCount() else 0
def outputWkbType(self, input_wkb):
return QgsWkbTypes.MultiLineString
for current, inFeat in enumerate(features):
outFeat = QgsFeature()
attrs = inFeat.attributes()
outFeat.setAttributes(attrs)
def processFeature(self, feature, feedback):
input_geometry = feature.geometry()
if input_geometry:
output_geometry = input_geometry.mergeLines()
if not output_geometry:
feedback.reportError(self.tr('Error merging lines for feature {}').format(feature.id()))
inGeom = inFeat.geometry()
if inGeom:
outGeom = inGeom.mergeLines()
if outGeom is None:
raise GeoAlgorithmExecutionException(
self.tr('Error merging lines'))
outFeat.setGeometry(outGeom)
writer.addFeature(outFeat, QgsFeatureSink.FastInsert)
feedback.setProgress(int(current * total))
del writer
feature.setGeometry(output_geometry)
return feature

View File

@ -73,6 +73,7 @@ from .LinesIntersection import LinesIntersection
from .LinesToPolygons import LinesToPolygons
from .MeanCoords import MeanCoords
from .Merge import Merge
from .MergeLines import MergeLines
from .NearestNeighbourAnalysis import NearestNeighbourAnalysis
from .OffsetLine import OffsetLine
from .Orthogonalize import Orthogonalize
@ -158,7 +159,6 @@ from .ZonalStatistics import ZonalStatistics
# from .DefineProjection import DefineProjection
# from .RectanglesOvalsDiamondsVariable import RectanglesOvalsDiamondsVariable
# from .RectanglesOvalsDiamondsFixed import RectanglesOvalsDiamondsFixed
# from .MergeLines import MergeLines
# from .PointsAlongGeometry import PointsAlongGeometry
# from .Relief import Relief
# from .IdwInterpolation import IdwInterpolation
@ -213,7 +213,7 @@ class QGISAlgorithmProvider(QgsProcessingProvider):
# OrientedMinimumBoundingBox(),
# SpatialIndex(), DefineProjection(),
# RectanglesOvalsDiamondsVariable(),
# RectanglesOvalsDiamondsFixed(), MergeLines(),
# RectanglesOvalsDiamondsFixed(),
# PointsAlongGeometry(),
# Relief(),
# IdwInterpolation(), TinInterpolation(),
@ -258,6 +258,7 @@ class QGISAlgorithmProvider(QgsProcessingProvider):
LinesToPolygons(),
MeanCoords(),
Merge(),
MergeLines(),
NearestNeighbourAnalysis(),
OffsetLine(),
Orthogonalize(),

View File

@ -389,18 +389,18 @@ tests:
# compare:
# geometry:
# precision: 7
#
# - algorithm: qgis:mergelines
# name: Merge lines algorithm
# params:
# INPUT_LAYER:
# name: multilines.gml
# type: vector
# results:
# OUTPUT_LAYER:
# name: expected/merge_lines.gml
# type: vector
#
- algorithm: qgis:mergelines
name: Merge lines algorithm
params:
INPUT:
name: multilines.gml
type: vector
results:
OUTPUT:
name: expected/merge_lines.gml
type: vector
- algorithm: native:multiparttosingleparts
name: Multiparts to singleparts
params: