3636 QgsFeature ,
3737 QgsFeatureSink ,
3838 QgsGeometry ,
39- QgsPointXY ,
4039 QgsFields ,
4140 QgsField ,
42- QgsFeatureRequest ,
4341 QgsMessageLog ,
44- QgsProcessingParameterDefinition ,
45- QgsProcessingUtils )
42+ QgsProcessing ,
43+ QgsProcessingParameterEnum ,
44+ QgsProcessingParameterPoint ,
45+ QgsProcessingParameterField ,
46+ QgsProcessingParameterNumber ,
47+ QgsProcessingParameterString ,
48+ QgsProcessingParameterFeatureSource ,
49+ QgsProcessingParameterFeatureSink ,
50+ QgsProcessingParameterVectorLayer ,
51+ QgsProcessingParameterDefinition )
4652from qgis .analysis import (QgsVectorLayerDirector ,
4753 QgsNetworkDistanceStrategy ,
4854 QgsNetworkSpeedStrategy ,
5258from qgis .utils import iface
5359
5460from processing .algs .qgis .QgisAlgorithm import QgisAlgorithm
55- from processing .core .parameters import (ParameterVector ,
56- ParameterPoint ,
57- ParameterNumber ,
58- ParameterString ,
59- ParameterTableField ,
60- ParameterSelection
61- )
62- from processing .core .outputs import OutputVector
63- from processing .tools import dataobjects
6461
6562pluginPath = os .path .split (os .path .split (os .path .dirname (__file__ ))[0 ])[0 ]
6663
6764
6865class ShortestPathLayerToPoint (QgisAlgorithm ):
6966
70- INPUT_VECTOR = 'INPUT_VECTOR '
71- START_POINTS = 'START_POINT '
67+ INPUT = 'INPUT '
68+ START_POINTS = 'START_POINTS '
7269 END_POINT = 'END_POINT'
7370 STRATEGY = 'STRATEGY'
7471 DIRECTION_FIELD = 'DIRECTION_FIELD'
@@ -79,7 +76,7 @@ class ShortestPathLayerToPoint(QgisAlgorithm):
7976 SPEED_FIELD = 'SPEED_FIELD'
8077 DEFAULT_SPEED = 'DEFAULT_SPEED'
8178 TOLERANCE = 'TOLERANCE'
82- OUTPUT_LAYER = 'OUTPUT_LAYER '
79+ OUTPUT = 'OUTPUT '
8380
8481 def icon (self ):
8582 return QIcon (os .path .join (pluginPath , 'images' , 'networkanalysis.svg' ))
@@ -100,58 +97,59 @@ def initAlgorithm(self, config=None):
10097 self .tr ('Fastest' )
10198 ]
10299
103- self .addParameter (ParameterVector (self .INPUT_VECTOR ,
104- self .tr ('Vector layer representing network' ),
105- [ dataobjects . TYPE_VECTOR_LINE ]))
106- self .addParameter (ParameterVector (self .START_POINTS ,
107- self .tr ('Vector layer with start points' ),
108- [ dataobjects . TYPE_VECTOR_POINT ]))
109- self .addParameter (ParameterPoint (self .END_POINT ,
110- self .tr ('End point' )))
111- self .addParameter (ParameterSelection (self .STRATEGY ,
112- self .tr ('Path type to calculate' ),
113- self .STRATEGIES ,
114- default = 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 (QgsProcessingParameterPoint (self .END_POINT ,
107+ self .tr ('End point' )))
108+ self .addParameter (QgsProcessingParameterEnum (self .STRATEGY ,
109+ self .tr ('Path type to calculate' ),
110+ self .STRATEGIES ,
111+ defaultValue = 0 ))
115112
116113 params = []
117- params .append (ParameterTableField (self .DIRECTION_FIELD ,
118- self .tr ('Direction field' ),
119- self .INPUT_VECTOR ,
120- optional = True ))
121- params .append (ParameterString (self .VALUE_FORWARD ,
122- self .tr ('Value for forward direction' ),
123- '' ,
124- optional = True ))
125- params .append (ParameterString (self .VALUE_BACKWARD ,
126- self .tr ('Value for backward direction' ),
127- '' ,
128- optional = True ))
129- params .append (ParameterString (self .VALUE_BOTH ,
130- self .tr ('Value for both directions' ),
131- '' ,
132- optional = True ))
133- params .append (ParameterSelection (self .DEFAULT_DIRECTION ,
134- self .tr ('Default direction' ),
135- list (self .DIRECTIONS .keys ()),
136- default = 2 ))
137- params .append (ParameterTableField (self .SPEED_FIELD ,
138- self .tr ('Speed field' ),
139- self .INPUT_VECTOR ,
140- optional = True ))
141- params .append (ParameterNumber (self .DEFAULT_SPEED ,
142- self .tr ('Default speed (km/h)' ),
143- 0.0 , 99999999.999999 , 5.0 ))
144- params .append (ParameterNumber (self .TOLERANCE ,
145- self .tr ('Topology tolerance' ),
146- 0.0 , 99999999.999999 , 0.0 ))
114+ params .append (QgsProcessingParameterField (self .DIRECTION_FIELD ,
115+ self .tr ('Direction field' ),
116+ None ,
117+ self .INPUT ,
118+ optional = True ))
119+ params .append (QgsProcessingParameterString (self .VALUE_FORWARD ,
120+ self .tr ('Value for forward direction' ),
121+ optional = True ))
122+ params .append (QgsProcessingParameterString (self .VALUE_BACKWARD ,
123+ self .tr ('Value for backward direction' ),
124+ optional = True ))
125+ params .append (QgsProcessingParameterString (self .VALUE_BOTH ,
126+ self .tr ('Value for both directions' ),
127+ optional = True ))
128+ params .append (QgsProcessingParameterEnum (self .DEFAULT_DIRECTION ,
129+ self .tr ('Default direction' ),
130+ list (self .DIRECTIONS .keys ()),
131+ defaultValue = 2 ))
132+ params .append (QgsProcessingParameterField (self .SPEED_FIELD ,
133+ self .tr ('Speed field' ),
134+ None ,
135+ self .INPUT ,
136+ optional = True ))
137+ params .append (QgsProcessingParameterNumber (self .DEFAULT_SPEED ,
138+ self .tr ('Default speed (km/h)' ),
139+ QgsProcessingParameterNumber .Double ,
140+ 5.0 , False , 0 , 99999999.99 ))
141+ params .append (QgsProcessingParameterNumber (self .TOLERANCE ,
142+ self .tr ('Topology tolerance' ),
143+ QgsProcessingParameterNumber .Double ,
144+ 0.0 , False , 0 , 99999999.99 ))
147145
148146 for p in params :
149147 p .setFlags (p .flags () | QgsProcessingParameterDefinition .FlagAdvanced )
150148 self .addParameter (p )
151149
152- self .addOutput ( OutputVector (self .OUTPUT_LAYER ,
153- self .tr ('Shortest path' ),
154- datatype = [ dataobjects . TYPE_VECTOR_LINE ] ))
150+ self .addParameter ( QgsProcessingParameterFeatureSink (self .OUTPUT ,
151+ self .tr ('Shortest path' ),
152+ QgsProcessing . TypeVectorLine ))
155153
156154 def name (self ):
157155 return 'shortestpathlayertopoint'
@@ -160,21 +158,19 @@ def displayName(self):
160158 return self .tr ('Shortest path (layer to point)' )
161159
162160 def processAlgorithm (self , parameters , context , feedback ):
163- layer = QgsProcessingUtils .mapLayerFromString (self .getParameterValue (self .INPUT_VECTOR ), context )
164- startPoints = QgsProcessingUtils .mapLayerFromString (self .getParameterValue (self .START_POINTS ), context )
165- endPoint = self .getParameterValue (self .END_POINT )
166- strategy = self .getParameterValue (self .STRATEGY )
167-
168- directionFieldName = self .getParameterValue (self .DIRECTION_FIELD )
169- forwardValue = self .getParameterValue (self .VALUE_FORWARD )
170- backwardValue = self .getParameterValue (self .VALUE_BACKWARD )
171- bothValue = self .getParameterValue (self .VALUE_BOTH )
172- defaultDirection = self .getParameterValue (self .DEFAULT_DIRECTION )
173- bothValue = self .getParameterValue (self .VALUE_BOTH )
174- defaultDirection = self .getParameterValue (self .DEFAULT_DIRECTION )
175- speedFieldName = self .getParameterValue (self .SPEED_FIELD )
176- defaultSpeed = self .getParameterValue (self .DEFAULT_SPEED )
177- tolerance = self .getParameterValue (self .TOLERANCE )
161+ layer = self .parameterAsVectorLayer (parameters , self .INPUT , context )
162+ startPoints = self .parameterAsSource (parameters , self .START_POINTS , context )
163+ endPoint = self .parameterAsPoint (parameters , self .END_POINT , context )
164+ strategy = self .parameterAsEnum (parameters , self .STRATEGY , context )
165+
166+ directionFieldName = self .parameterAsString (parameters , self .DIRECTION_FIELD , context )
167+ forwardValue = self .parameterAsString (parameters , self .VALUE_FORWARD , context )
168+ backwardValue = self .parameterAsString (parameters , self .VALUE_BACKWARD , context )
169+ bothValue = self .parameterAsString (parameters , self .VALUE_BOTH , context )
170+ defaultDirection = self .parameterAsEnum (parameters , self .DEFAULT_DIRECTION , context )
171+ speedFieldName = self .parameterAsString (parameters , self .SPEED_FIELD , context )
172+ defaultSpeed = self .parameterAsDouble (parameters , self .DEFAULT_SPEED , context )
173+ tolerance = self .parameterAsDouble (parameters , self .TOLERANCE , context )
178174
179175 fields = QgsFields ()
180176 fields .append (QgsField ('start' , QVariant .String , '' , 254 , 0 ))
@@ -184,17 +180,14 @@ def processAlgorithm(self, parameters, context, feedback):
184180 feat = QgsFeature ()
185181 feat .setFields (fields )
186182
187- writer = self .getOutputFromName (
188- self .OUTPUT_LAYER ).getVectorWriter (fields , QgsWkbTypes .LineString , layer .crs (), context )
189-
190- tmp = endPoint .split (',' )
191- endPoint = QgsPointXY (float (tmp [0 ]), float (tmp [1 ]))
183+ (sink , dest_id ) = self .parameterAsSink (parameters , self .OUTPUT , context ,
184+ fields , QgsWkbTypes .LineString , layer .crs ())
192185
193186 directionField = - 1
194- if directionFieldName is not None :
187+ if directionFieldName :
195188 directionField = layer .fields ().lookupField (directionFieldName )
196189 speedField = - 1
197- if speedFieldName is not None :
190+ if speedFieldName :
198191 speedField = layer .fields ().lookupField (speedFieldName )
199192
200193 director = QgsVectorLayerDirector (layer ,
@@ -222,12 +215,16 @@ def processAlgorithm(self, parameters, context, feedback):
222215 feedback .pushInfo (self .tr ('Loading start points...' ))
223216 request = QgsFeatureRequest ()
224217 request .setFlags (request .flags () ^ QgsFeatureRequest .SubsetOfAttributes )
225- features = QgsProcessingUtils .getFeatures (startPoints , context , request )
226- count = QgsProcessingUtils . featureCount (startPoints , context )
218+ features = source .getFeatures (request )
219+ total = 100.0 / source . featureCount () if source . featureCount () else 0
227220
228221 points = [endPoint ]
229- for f in features :
222+ for current , f in enumerate (features ):
223+ if feedback .isCanceled ():
224+ break
225+
230226 points .append (f .geometry ().asPoint ())
227+ feedback .setProgress (int (current * total ))
231228
232229 feedback .pushInfo (self .tr ('Building graph...' ))
233230 snappedPoints = director .makeGraph (builder , points )
@@ -238,7 +235,7 @@ def processAlgorithm(self, parameters, context, feedback):
238235 idxEnd = graph .findVertex (snappedPoints [0 ])
239236 route = []
240237
241- total = 100.0 / count if count else 1
238+ total = 100.0 / source . featureCount () if source . featureCount () else 1
242239 for i in range (1 , count + 1 ):
243240 idxStart = graph .findVertex (snappedPoints [i ])
244241 tree , cost = QgsGraphAnalyzer .dijkstra (graph , idxStart , 0 )
@@ -264,10 +261,10 @@ def processAlgorithm(self, parameters, context, feedback):
264261 feat ['start' ] = points [i ].toString ()
265262 feat ['end' ] = endPoint .toString ()
266263 feat ['cost' ] = cost / multiplier
267- writer .addFeature (feat , QgsFeatureSink .FastInsert )
264+ sink .addFeature (feat , QgsFeatureSink .FastInsert )
268265
269266 route [:] = []
270267
271268 feedback .setProgress (int (i * total ))
272269
273- del writer
270+ return { self . OUTPUT : dest_id }
0 commit comments