Skip to content

Commit 36a38f4

Browse files
committedOct 31, 2017
[processing] Keep attributes from start/end points layer in
output layer for shortest path algorithms Otherwise the paths are nearly impossible to link back to the source layer for further analysis
1 parent 4925438 commit 36a38f4

File tree

2 files changed

+18
-10
lines changed

2 files changed

+18
-10
lines changed
 

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

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ def processAlgorithm(self, parameters, context, feedback):
171171
defaultSpeed = self.parameterAsDouble(parameters, self.DEFAULT_SPEED, context)
172172
tolerance = self.parameterAsDouble(parameters, self.TOLERANCE, context)
173173

174-
fields = QgsFields()
174+
fields = startPoints.fields()
175175
fields.append(QgsField('start', QVariant.String, '', 254, 0))
176176
fields.append(QgsField('end', QVariant.String, '', 254, 0))
177177
fields.append(QgsField('cost', QVariant.Double, '', 20, 7))
@@ -213,18 +213,22 @@ def processAlgorithm(self, parameters, context, feedback):
213213

214214
feedback.pushInfo(self.tr('Loading start points...'))
215215
request = QgsFeatureRequest()
216-
request.setFlags(request.flags() ^ QgsFeatureRequest.SubsetOfAttributes)
217216
request.setDestinationCrs(network.sourceCrs())
218217
features = startPoints.getFeatures(request)
219218
total = 100.0 / startPoints.featureCount() if startPoints.featureCount() else 0
220219

221220
points = [endPoint]
221+
source_attributes = {}
222+
i = 1
222223
for current, f in enumerate(features):
223224
if feedback.isCanceled():
224225
break
225226

226227
points.append(f.geometry().asPoint())
228+
source_attributes[i] = f.attributes()
229+
227230
feedback.setProgress(int(current * total))
231+
i += 1
228232

229233
feedback.pushInfo(self.tr('Building graph...'))
230234
snappedPoints = director.makeGraph(builder, points, feedback)
@@ -262,9 +266,9 @@ def processAlgorithm(self, parameters, context, feedback):
262266

263267
geom = QgsGeometry.fromPolylineXY(route)
264268
feat.setGeometry(geom)
265-
feat['start'] = points[i].toString()
266-
feat['end'] = endPoint.toString()
267-
feat['cost'] = cost / multiplier
269+
attrs = source_attributes[i]
270+
attrs.extend([points[i].toString(), endPoint.toString(), cost / multiplier])
271+
feat.setAttributes(attrs)
268272
sink.addFeature(feat, QgsFeatureSink.FastInsert)
269273

270274
route[:] = []

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

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ def processAlgorithm(self, parameters, context, feedback):
171171
defaultSpeed = self.parameterAsDouble(parameters, self.DEFAULT_SPEED, context)
172172
tolerance = self.parameterAsDouble(parameters, self.TOLERANCE, context)
173173

174-
fields = QgsFields()
174+
fields = endPoints.fields()
175175
fields.append(QgsField('start', QVariant.String, '', 254, 0))
176176
fields.append(QgsField('end', QVariant.String, '', 254, 0))
177177
fields.append(QgsField('cost', QVariant.Double, '', 20, 7))
@@ -213,18 +213,22 @@ def processAlgorithm(self, parameters, context, feedback):
213213

214214
feedback.pushInfo(self.tr('Loading end points...'))
215215
request = QgsFeatureRequest()
216-
request.setFlags(request.flags() ^ QgsFeatureRequest.SubsetOfAttributes)
217216
request.setDestinationCrs(network.sourceCrs())
218217
features = endPoints.getFeatures(request)
219218
total = 100.0 / endPoints.featureCount() if endPoints.featureCount() else 0
220219

221220
points = [startPoint]
221+
source_attributes = {}
222+
i = 1
222223
for current, f in enumerate(features):
223224
if feedback.isCanceled():
224225
break
225226

226227
points.append(f.geometry().asPoint())
228+
source_attributes[i] = f.attributes()
229+
227230
feedback.setProgress(int(current * total))
231+
i += 1
228232

229233
feedback.pushInfo(self.tr('Building graph...'))
230234
snappedPoints = director.makeGraph(builder, points, feedback)
@@ -261,10 +265,10 @@ def processAlgorithm(self, parameters, context, feedback):
261265
route.reverse()
262266

263267
geom = QgsGeometry.fromPolylineXY(route)
268+
attrs = source_attributes[i]
269+
attrs.extend([startPoint.toString(), points[i].toString(), cost / multiplier])
270+
feat.setAttributes(attrs)
264271
feat.setGeometry(geom)
265-
feat['start'] = startPoint.toString()
266-
feat['end'] = points[i].toString()
267-
feat['cost'] = cost / multiplier
268272
sink.addFeature(feat, QgsFeatureSink.FastInsert)
269273

270274
route[:] = []

0 commit comments

Comments
 (0)
Please sign in to comment.