Skip to content

Commit 2a6f512

Browse files
committedJul 28, 2017
Port points along line to new API
1 parent becf690 commit 2a6f512

File tree

3 files changed

+49
-40
lines changed

3 files changed

+49
-40
lines changed
 

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

Lines changed: 34 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,17 @@
3131
from qgis.PyQt.QtCore import QVariant
3232
from qgis.PyQt.QtGui import QIcon
3333

34-
from qgis.core import QgsFeature, QgsFeatureSink, QgsWkbTypes, QgsField, QgsProcessingUtils
34+
from qgis.core import (QgsFeature,
35+
QgsFeatureSink,
36+
QgsWkbTypes,
37+
QgsField,
38+
QgsProcessing,
39+
QgsProcessingUtils,
40+
QgsProcessingParameterNumber,
41+
QgsProcessingParameterFeatureSource,
42+
QgsProcessingParameterFeatureSink)
3543

3644
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
37-
from processing.core.parameters import ParameterVector, ParameterNumber
38-
from processing.core.outputs import OutputVector
39-
from processing.tools import dataobjects
4045

4146
pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0]
4247

@@ -62,16 +67,16 @@ def __init__(self):
6267
super().__init__()
6368

6469
def initAlgorithm(self, config=None):
65-
self.addParameter(ParameterVector(self.INPUT,
66-
self.tr('Input layer'),
67-
[dataobjects.TYPE_VECTOR_POLYGON, dataobjects.TYPE_VECTOR_LINE]))
68-
self.addParameter(ParameterNumber(self.DISTANCE,
69-
self.tr('Distance'), default=1.0))
70-
self.addParameter(ParameterNumber(self.START_OFFSET,
71-
self.tr('Start offset'), default=0.0))
72-
self.addParameter(ParameterNumber(self.END_OFFSET,
73-
self.tr('End offset'), default=0.0))
74-
self.addOutput(OutputVector(self.OUTPUT, self.tr('Points'), datatype=[dataobjects.TYPE_VECTOR_POINT]))
70+
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT,
71+
self.tr('Input layer'), [QgsProcessing.TypeVectorPolygon, QgsProcessing.TypeVectorLine]))
72+
self.addParameter(QgsProcessingParameterNumber(self.DISTANCE,
73+
self.tr('Distance'), minValue=0.0, defaultValue=1.0))
74+
self.addParameter(QgsProcessingParameterNumber(self.START_OFFSET,
75+
self.tr('Start offset'), minValue=0.0, defaultValue=0.0))
76+
self.addParameter(QgsProcessingParameterNumber(self.END_OFFSET,
77+
self.tr('End offset'), minValue=0.0, defaultValue=0.0))
78+
79+
self.addParameter(QgsProcessingParameterFeatureSink(self.OUTPUT, self.tr('Points'), QgsProcessing.TypeVectorPoint))
7580

7681
def name(self):
7782
return 'pointsalonglines'
@@ -80,23 +85,27 @@ def displayName(self):
8085
return self.tr('Points along lines')
8186

8287
def processAlgorithm(self, parameters, context, feedback):
83-
layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT), context)
84-
distance = self.getParameterValue(self.DISTANCE)
85-
start_offset = self.getParameterValue(self.START_OFFSET)
86-
end_offset = self.getParameterValue(self.END_OFFSET)
88+
source = self.parameterAsSource(parameters, self.INPUT, context)
89+
distance = self.parameterAsDouble(parameters, self.DISTANCE, context)
90+
start_offset = self.parameterAsDouble(parameters, self.START_OFFSET, context)
91+
end_offset = self.parameterAsDouble(parameters, self.END_OFFSET, context)
8792

88-
fields = layer.fields()
93+
fields = source.fields()
8994
fields.append(QgsField('distance', QVariant.Double))
9095
fields.append(QgsField('angle', QVariant.Double))
9196

92-
writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(fields, QgsWkbTypes.Point, layer.crs(), context)
97+
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
98+
fields, QgsWkbTypes.Point, source.sourceCrs())
9399

94-
features = QgsProcessingUtils.getFeatures(layer, context)
95-
total = 100.0 / layer.featureCount() if layer.featureCount() else 0
100+
features = source.getFeatures()
101+
total = 100.0 / source.featureCount() if source.featureCount() else 0
96102
for current, input_feature in enumerate(features):
103+
if feedback.isCanceled():
104+
break
105+
97106
input_geometry = input_feature.geometry()
98107
if not input_geometry:
99-
writer.addFeature(input_feature, QgsFeatureSink.FastInsert)
108+
sink.addFeature(input_feature, QgsFeatureSink.FastInsert)
100109
else:
101110
if input_geometry.type == QgsWkbTypes.PolygonGeometry:
102111
length = input_geometry.geometry().perimeter()
@@ -114,10 +123,10 @@ def processAlgorithm(self, parameters, context, feedback):
114123
attrs.append(current_distance)
115124
attrs.append(angle)
116125
output_feature.setAttributes(attrs)
117-
writer.addFeature(output_feature, QgsFeatureSink.FastInsert)
126+
sink.addFeature(output_feature, QgsFeatureSink.FastInsert)
118127

119128
current_distance += distance
120129

121130
feedback.setProgress(int(current * total))
122131

123-
del writer
132+
return {self.OUTPUT: dest_id}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
from .Orthogonalize import Orthogonalize
8585
from .PointDistance import PointDistance
8686
from .PointOnSurface import PointOnSurface
87+
from .PointsAlongGeometry import PointsAlongGeometry
8788
from .PointsInPolygon import PointsInPolygon
8889
from .PointsLayerFromTable import PointsLayerFromTable
8990
from .PoleOfInaccessibility import PoleOfInaccessibility
@@ -162,7 +163,6 @@
162163
# from .DefineProjection import DefineProjection
163164
# from .RectanglesOvalsDiamondsVariable import RectanglesOvalsDiamondsVariable
164165
# from .RectanglesOvalsDiamondsFixed import RectanglesOvalsDiamondsFixed
165-
# from .PointsAlongGeometry import PointsAlongGeometry
166166
# from .Relief import Relief
167167
# from .IdwInterpolation import IdwInterpolation
168168
# from .TinInterpolation import TinInterpolation
@@ -208,7 +208,6 @@ def getAlgs(self):
208208
# DefineProjection(),
209209
# RectanglesOvalsDiamondsVariable(),
210210
# RectanglesOvalsDiamondsFixed(),
211-
# PointsAlongGeometry(),
212211
# Relief(),
213212
# IdwInterpolation(), TinInterpolation(),
214213
# RasterCalculator(),
@@ -259,6 +258,7 @@ def getAlgs(self):
259258
Orthogonalize(),
260259
PointDistance(),
261260
PointOnSurface(),
261+
PointsAlongGeometry(),
262262
PointsInPolygon(),
263263
PointsLayerFromTable(),
264264
PoleOfInaccessibility(),

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

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2338,19 +2338,19 @@ tests:
23382338
name: expected/count_points_weighted.gml
23392339
type: vector
23402340

2341-
# - algorithm: qgis:pointsalonglines
2342-
# name: standard points alog lines
2343-
# params:
2344-
# DISTANCE: 1.0
2345-
# END_OFFSET: 0.0
2346-
# INPUT:
2347-
# name: lines.gml
2348-
# type: vector
2349-
# START_OFFSET: 0.0
2350-
# results:
2351-
# OUTPUT:
2352-
# name: expected/points_alog_lines.gml
2353-
# type: vector
2341+
- algorithm: qgis:pointsalonglines
2342+
name: standard points alog lines
2343+
params:
2344+
DISTANCE: 1.0
2345+
END_OFFSET: 0.0
2346+
INPUT:
2347+
name: lines.gml
2348+
type: vector
2349+
START_OFFSET: 0.0
2350+
results:
2351+
OUTPUT:
2352+
name: expected/points_alog_lines.gml
2353+
type: vector
23542354

23552355
- algorithm: qgis:meancoordinates
23562356
name: standard mean coordinates

0 commit comments

Comments
 (0)
Please sign in to comment.