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 )
4451from qgis .analysis import (QgsVectorLayerDirector ,
4552 QgsNetworkDistanceStrategy ,
5057from qgis .utils import iface
5158
5259from 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
6261pluginPath = os .path .split (os .path .split (os .path .dirname (__file__ ))[0 ])[0 ]
6362
6463
6564class 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
0 commit comments