Skip to content

Commit 5af177e

Browse files
committed
[processing] restore Service area from layer
1 parent abd14e8 commit 5af177e

File tree

3 files changed

+103
-92
lines changed

3 files changed

+103
-92
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@
8787
from .SaveSelectedFeatures import SaveSelectedFeatures
8888
from .SelectByAttribute import SelectByAttribute
8989
from .SelectByExpression import SelectByExpression
90-
# from .ServiceAreaFromLayer import ServiceAreaFromLayer
90+
from .ServiceAreaFromLayer import ServiceAreaFromLayer
9191
from .ServiceAreaFromPoint import ServiceAreaFromPoint
9292
from .ShortestPathLayerToPoint import ShortestPathLayerToPoint
9393
from .ShortestPathPointToLayer import ShortestPathPointToLayer
@@ -274,6 +274,7 @@ def getAlgs(self):
274274
SaveSelectedFeatures(),
275275
SelectByAttribute(),
276276
SelectByExpression(),
277+
ServiceAreaFromLayer(),
277278
ServiceAreaFromPoint(),
278279
ShortestPathLayerToPoint(),
279280
ShortestPathPointToLayer(),

python/plugins/processing/algs/qgis/ServiceAreaFromLayer.py

Lines changed: 101 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,17 @@
3636
QgsFeature,
3737
QgsFeatureSink,
3838
QgsGeometry,
39-
QgsField,
4039
QgsFields,
41-
QgsFeatureRequest,
42-
QgsProcessingUtils,
40+
QgsField,
41+
QgsProcessing,
42+
QgsProcessingParameterEnum,
43+
QgsProcessingParameterPoint,
44+
QgsProcessingParameterField,
45+
QgsProcessingParameterNumber,
46+
QgsProcessingParameterString,
47+
QgsProcessingParameterFeatureSource,
48+
QgsProcessingParameterFeatureSink,
49+
QgsProcessingParameterVectorLayer,
4350
QgsProcessingParameterDefinition)
4451
from qgis.analysis import (QgsVectorLayerDirector,
4552
QgsNetworkDistanceStrategy,
@@ -50,21 +57,13 @@
5057
from qgis.utils import iface
5158

5259
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
53-
from processing.core.parameters import (ParameterVector,
54-
ParameterNumber,
55-
ParameterString,
56-
ParameterTableField,
57-
ParameterSelection
58-
)
59-
from processing.core.outputs import OutputVector
60-
from processing.tools import dataobjects
6160

6261
pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0]
6362

6463

6564
class ServiceAreaFromLayer(QgisAlgorithm):
6665

67-
INPUT_VECTOR = 'INPUT_VECTOR'
66+
INPUT = 'INPUT'
6867
START_POINTS = 'START_POINTS'
6968
STRATEGY = 'STRATEGY'
7069
TRAVEL_COST = 'TRAVEL_COST'
@@ -98,62 +97,64 @@ def initAlgorithm(self, config=None):
9897
self.tr('Fastest')
9998
]
10099

101-
self.addParameter(ParameterVector(self.INPUT_VECTOR,
102-
self.tr('Vector layer representing network'),
103-
[dataobjects.TYPE_VECTOR_LINE]))
104-
self.addParameter(ParameterVector(self.START_POINTS,
105-
self.tr('Vector layer with start points'),
106-
[dataobjects.TYPE_VECTOR_POINT]))
107-
self.addParameter(ParameterSelection(self.STRATEGY,
108-
self.tr('Path type to calculate'),
109-
self.STRATEGIES,
110-
default=0))
111-
self.addParameter(ParameterNumber(self.TRAVEL_COST,
112-
self.tr('Travel cost (distance for "Shortest", time for "Fastest")'),
113-
0.0, 99999999.999999, 0.0))
100+
self.addParameter(QgsProcessingParameterVectorLayer(self.INPUT,
101+
self.tr('Vector layer representing network'),
102+
[QgsProcessing.TypeVectorLine]))
103+
self.addParameter(QgsProcessingParameterFeatureSource(self.START_POINTS,
104+
self.tr('Vector layer with start points'),
105+
[QgsProcessing.TypeVectorPoint]))
106+
self.addParameter(QgsProcessingParameterEnum(self.STRATEGY,
107+
self.tr('Path type to calculate'),
108+
self.STRATEGIES,
109+
defaultValue=0))
110+
self.addParameter(QgsProcessingParameterNumber(self.TRAVEL_COST,
111+
self.tr('Travel cost (distance for "Shortest", time for "Fastest")'),
112+
QgsProcessingParameterNumber.Double,
113+
0.0, False, 0, 99999999.99))
114114

115115
params = []
116-
params.append(ParameterTableField(self.DIRECTION_FIELD,
117-
self.tr('Direction field'),
118-
self.INPUT_VECTOR,
119-
optional=True))
120-
params.append(ParameterString(self.VALUE_FORWARD,
121-
self.tr('Value for forward direction'),
122-
'',
123-
optional=True))
124-
params.append(ParameterString(self.VALUE_BACKWARD,
125-
self.tr('Value for backward direction'),
126-
'',
127-
optional=True))
128-
params.append(ParameterString(self.VALUE_BOTH,
129-
self.tr('Value for both directions'),
130-
'',
131-
optional=True))
132-
params.append(ParameterSelection(self.DEFAULT_DIRECTION,
133-
self.tr('Default direction'),
134-
list(self.DIRECTIONS.keys()),
135-
default=2))
136-
params.append(ParameterTableField(self.SPEED_FIELD,
137-
self.tr('Speed field'),
138-
self.INPUT_VECTOR,
139-
optional=True))
140-
params.append(ParameterNumber(self.DEFAULT_SPEED,
141-
self.tr('Default speed (km/h)'),
142-
0.0, 99999999.999999, 5.0))
143-
params.append(ParameterNumber(self.TOLERANCE,
144-
self.tr('Topology tolerance'),
145-
0.0, 99999999.999999, 0.0))
116+
params.append(QgsProcessingParameterField(self.DIRECTION_FIELD,
117+
self.tr('Direction field'),
118+
None,
119+
self.INPUT,
120+
optional=True))
121+
params.append(QgsProcessingParameterString(self.VALUE_FORWARD,
122+
self.tr('Value for forward direction'),
123+
optional=True))
124+
params.append(QgsProcessingParameterString(self.VALUE_BACKWARD,
125+
self.tr('Value for backward direction'),
126+
optional=True))
127+
params.append(QgsProcessingParameterString(self.VALUE_BOTH,
128+
self.tr('Value for both directions'),
129+
optional=True))
130+
params.append(QgsProcessingParameterEnum(self.DEFAULT_DIRECTION,
131+
self.tr('Default direction'),
132+
list(self.DIRECTIONS.keys()),
133+
defaultValue=2))
134+
params.append(QgsProcessingParameterField(self.SPEED_FIELD,
135+
self.tr('Speed field'),
136+
None,
137+
self.INPUT,
138+
optional=True))
139+
params.append(QgsProcessingParameterNumber(self.DEFAULT_SPEED,
140+
self.tr('Default speed (km/h)'),
141+
QgsProcessingParameterNumber.Double,
142+
5.0, False, 0, 99999999.99))
143+
params.append(QgsProcessingParameterNumber(self.TOLERANCE,
144+
self.tr('Topology tolerance'),
145+
QgsProcessingParameterNumber.Double,
146+
0.0, False, 0, 99999999.99))
146147

147148
for p in params:
148149
p.setFlags(p.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
149150
self.addParameter(p)
150151

151-
self.addOutput(OutputVector(self.OUTPUT_POINTS,
152-
self.tr('Service area (boundary nodes)'),
153-
datatype=[dataobjects.TYPE_VECTOR_POINT]))
154-
self.addOutput(OutputVector(self.OUTPUT_POLYGON,
155-
self.tr('Service area (convex hull)'),
156-
datatype=[dataobjects.TYPE_VECTOR_POLYGON]))
152+
self.addParameter(QgsProcessingParameterFeatureSink(self.OUTPUT_POINTS,
153+
self.tr('Service area (boundary nodes)'),
154+
QgsProcessing.TypeVectorPoint))
155+
self.addParameter(QgsProcessingParameterFeatureSink(self.OUTPUT_POLYGON,
156+
self.tr('Service area (convex hull)'),
157+
QgsProcessing.TypeVectorPolygon))
157158

158159
def name(self):
159160
return 'serviceareafromlayer'
@@ -162,21 +163,19 @@ def displayName(self):
162163
return self.tr('Service area (from layer)')
163164

164165
def processAlgorithm(self, parameters, context, feedback):
165-
layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT_VECTOR), context)
166-
startPoints = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.START_POINTS), context)
167-
strategy = self.getParameterValue(self.STRATEGY)
168-
travelCost = self.getParameterValue(self.TRAVEL_COST)
169-
170-
directionFieldName = self.getParameterValue(self.DIRECTION_FIELD)
171-
forwardValue = self.getParameterValue(self.VALUE_FORWARD)
172-
backwardValue = self.getParameterValue(self.VALUE_BACKWARD)
173-
bothValue = self.getParameterValue(self.VALUE_BOTH)
174-
defaultDirection = self.getParameterValue(self.DEFAULT_DIRECTION)
175-
bothValue = self.getParameterValue(self.VALUE_BOTH)
176-
defaultDirection = self.getParameterValue(self.DEFAULT_DIRECTION)
177-
speedFieldName = self.getParameterValue(self.SPEED_FIELD)
178-
defaultSpeed = self.getParameterValue(self.DEFAULT_SPEED)
179-
tolerance = self.getParameterValue(self.TOLERANCE)
166+
layer = self.parameterAsVectorLayer(parameters, self.INPUT, context)
167+
startPoints = self.parameterAsSource(parameters, self.START_POINTS, context)
168+
strategy = self.parameterAsEnum(parameters, self.STRATEGY, context)
169+
travelCost = self.parameterAsDouble(parameters, self.TRAVEL_COST, context)
170+
171+
directionFieldName = self.parameterAsString(parameters, self.DIRECTION_FIELD, context)
172+
forwardValue = self.parameterAsString(parameters, self.VALUE_FORWARD, context)
173+
backwardValue = self.parameterAsString(parameters, self.VALUE_BACKWARD, context)
174+
bothValue = self.parameterAsString(parameters, self.VALUE_BOTH, context)
175+
defaultDirection = self.parameterAsEnum(parameters, self.DEFAULT_DIRECTION, context)
176+
speedFieldName = self.parameterAsString(parameters, self.SPEED_FIELD, context)
177+
defaultSpeed = self.parameterAsDouble(parameters, self.DEFAULT_SPEED, context)
178+
tolerance = self.parameterAsDouble(parameters, self.TOLERANCE, context)
180179

181180
fields = QgsFields()
182181
fields.append(QgsField('type', QVariant.String, '', 254, 0))
@@ -185,17 +184,17 @@ def processAlgorithm(self, parameters, context, feedback):
185184
feat = QgsFeature()
186185
feat.setFields(fields)
187186

188-
writerPoints = self.getOutputFromName(
189-
self.OUTPUT_POINTS).getVectorWriter(fields, QgsWkbTypes.MultiPoint, layer.crs(), context)
187+
(sinkPoints, pointsId) = self.parameterAsSink(parameters, self.OUTPUT_POINTS, context,
188+
fields, QgsWkbTypes.MultiPoint, layer.crs())
190189

191-
writerPolygons = self.getOutputFromName(
192-
self.OUTPUT_POLYGON).getVectorWriter(fields, QgsWkbTypes.Polygon, layer.crs(), context)
190+
(sinkPoygon, polygonId) = self.parameterAsSink(parameters, self.OUTPUT_POLYGON, context,
191+
fields, QgsWkbTypes.Polygon, layer.crs())
193192

194193
directionField = -1
195-
if directionFieldName is not None:
194+
if directionFieldName:
196195
directionField = layer.fields().lookupField(directionFieldName)
197196
speedField = -1
198-
if speedFieldName is not None:
197+
if speedFieldName:
199198
speedField = layer.fields().lookupField(speedFieldName)
200199

201200
director = QgsVectorLayerDirector(layer,
@@ -222,10 +221,16 @@ def processAlgorithm(self, parameters, context, feedback):
222221
feedback.pushInfo(self.tr('Loading start points...'))
223222
request = QgsFeatureRequest()
224223
request.setFlags(request.flags() ^ QgsFeatureRequest.SubsetOfAttributes)
225-
features = QgsProcessingUtils.getFeatures(startPoints, context, request)
224+
features = source.getFeatures(request)
225+
total = 100.0 / source.featureCount() if source.featureCount() else 0
226+
226227
points = []
227-
for f in features:
228+
for current, f in enumerate(features):
229+
if feedback.isCanceled():
230+
break
231+
228232
points.append(f.geometry().asPoint())
233+
feedback.setProgress(int(current * total))
229234

230235
feedback.pushInfo(self.tr('Building graph...'))
231236
snappedPoints = director.makeGraph(builder, points)
@@ -238,6 +243,9 @@ def processAlgorithm(self, parameters, context, feedback):
238243
lowerBoundary = []
239244
total = 100.0 / len(snappedPoints) if snappedPoints else 1
240245
for i, p in enumerate(snappedPoints):
246+
if feedback.isCanceled():
247+
break
248+
241249
idxStart = graph.findVertex(snappedPoints[i])
242250
origPoint = points[i].toString()
243251

@@ -258,12 +266,12 @@ def processAlgorithm(self, parameters, context, feedback):
258266
feat.setGeometry(geomUpper)
259267
feat['type'] = 'upper'
260268
feat['start'] = origPoint
261-
writerPoints.addFeature(feat, QgsFeatureSink.FastInsert)
269+
sinkPoints.addFeature(feat, QgsFeatureSink.FastInsert)
262270

263271
feat.setGeometry(geomLower)
264272
feat['type'] = 'lower'
265273
feat['start'] = origPoint
266-
writerPoints.addFeature(feat, QgsFeatureSink.FastInsert)
274+
sinkPoints.addFeature(feat, QgsFeatureSink.FastInsert)
267275

268276
upperBoundary.append(origPoint)
269277
lowerBoundary.append(origPoint)
@@ -274,19 +282,22 @@ def processAlgorithm(self, parameters, context, feedback):
274282
feat.setGeometry(geom)
275283
feat['type'] = 'upper'
276284
feat['start'] = origPoint
277-
writerPolygons.addFeature(feat, QgsFeatureSink.FastInsert)
285+
sinkPolygons.addFeature(feat, QgsFeatureSink.FastInsert)
278286

279287
geom = geomLower.convexHull()
280288
feat.setGeometry(geom)
281289
feat['type'] = 'lower'
282290
feat['start'] = origPoint
283-
writerPolygons.addFeature(feat, QgsFeatureSink.FastInsert)
291+
sinkPolygons.addFeature(feat, QgsFeatureSink.FastInsert)
284292

285293
vertices[:] = []
286294
upperBoundary[:] = []
287295
lowerBoundary[:] = []
288296

289297
feedback.setProgress(int(i * total))
290298

291-
del writerPoints
292-
del writerPolygons
299+
results = {}
300+
results[self.OUTPUT_POINTS] = pointsId
301+
results[self.OUTPUT_POLYGON] = polygonId
302+
303+
return results

python/plugins/processing/algs/qgis/ServiceAreaFromPoint.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
QgsProcessingParameterField,
4545
QgsProcessingParameterNumber,
4646
QgsProcessingParameterString,
47-
QgsProcessingParameterFeatureSource,
4847
QgsProcessingParameterFeatureSink,
4948
QgsProcessingParameterVectorLayer,
5049
QgsProcessingParameterDefinition)

0 commit comments

Comments
 (0)