mirror of
https://github.com/qgis/QGIS.git
synced 2025-02-27 00:33:48 -05:00
Port merge lines algorithm to new API
This commit is contained in:
parent
95be6d17b5
commit
558580588c
@ -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
|
||||
|
@ -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(),
|
||||
|
@ -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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user