17
17
18
18
#include " qgsalgorithmshortestpathpointtopoint.h"
19
19
20
- #include " qgsgraph.h"
21
- #include " qgsgraphbuilder.h"
22
20
#include " qgsgraphanalyzer.h"
23
- #include " qgsvectorlayerdirector.h"
24
- #include " qgsnetworkspeedstrategy.h"
25
- #include " qgsnetworkdistancestrategy.h"
26
21
27
22
// /@cond PRIVATE
28
23
@@ -41,16 +36,6 @@ QStringList QgsShortestPathPointToPointAlgorithm::tags() const
41
36
return QObject::tr ( " network,path,shortest,fastest" ).split ( ' ,' );
42
37
}
43
38
44
- QString QgsShortestPathPointToPointAlgorithm::group () const
45
- {
46
- return QObject::tr ( " Network analysis" );
47
- }
48
-
49
- QString QgsShortestPathPointToPointAlgorithm::groupId () const
50
- {
51
- return QStringLiteral ( " networkanalysis" );
52
- }
53
-
54
39
QString QgsShortestPathPointToPointAlgorithm::shortHelpString () const
55
40
{
56
41
return QObject::tr ( " This algorithm computes optimal (shortest or fastest) route between given start and end points." );
@@ -63,118 +48,39 @@ QgsShortestPathPointToPointAlgorithm *QgsShortestPathPointToPointAlgorithm::crea
63
48
64
49
void QgsShortestPathPointToPointAlgorithm::initAlgorithm ( const QVariantMap & )
65
50
{
66
- addParameter ( new QgsProcessingParameterFeatureSource ( QStringLiteral ( " INPUT " ), QObject::tr ( " Vector layer representing network " ), QList< int >() << QgsProcessing::TypeVectorLine ) );
51
+ addCommonParams ( );
67
52
addParameter ( new QgsProcessingParameterPoint ( QStringLiteral ( " START_POINT" ), QObject::tr ( " Start point" ) ) );
68
53
addParameter ( new QgsProcessingParameterPoint ( QStringLiteral ( " END_POINT" ), QObject::tr ( " End point" ) ) );
69
- addParameter ( new QgsProcessingParameterEnum ( QStringLiteral ( " STRATEGY" ), QObject::tr ( " Path type to calculate" ), QStringList () << QObject::tr ( " Shortest" ) << QObject::tr ( " Fastest" ), false , 0 ) );
70
-
71
- std::unique_ptr< QgsProcessingParameterField > directionField = qgis::make_unique< QgsProcessingParameterField >( QStringLiteral ( " DIRECTION_FIELD" ),
72
- QObject::tr ( " Direction field" ), QVariant (), QStringLiteral ( " INPUT" ), QgsProcessingParameterField::Any, false , true );
73
- directionField->setFlags ( directionField->flags () | QgsProcessingParameterDefinition::FlagAdvanced );
74
- addParameter ( directionField.release () );
75
-
76
- std::unique_ptr< QgsProcessingParameterString > forwardValue = qgis::make_unique< QgsProcessingParameterString >( QStringLiteral ( " VALUE_FORWARD" ),
77
- QObject::tr ( " Value for forward direction" ), QVariant (), false , true );
78
- forwardValue->setFlags ( forwardValue->flags () | QgsProcessingParameterDefinition::FlagAdvanced );
79
- addParameter ( forwardValue.release () );
80
-
81
- std::unique_ptr< QgsProcessingParameterString > backwardValue = qgis::make_unique< QgsProcessingParameterString >( QStringLiteral ( " VALUE_BACKWARD" ),
82
- QObject::tr ( " Value for backward direction" ), QVariant (), false , true );
83
- backwardValue->setFlags ( backwardValue->flags () | QgsProcessingParameterDefinition::FlagAdvanced );
84
- addParameter ( backwardValue.release () );
85
-
86
- std::unique_ptr< QgsProcessingParameterString > bothValue = qgis::make_unique< QgsProcessingParameterString >( QStringLiteral ( " VALUE_BOTH" ),
87
- QObject::tr ( " Value for both directions" ), QVariant (), false , true );
88
- bothValue->setFlags ( bothValue->flags () | QgsProcessingParameterDefinition::FlagAdvanced );
89
- addParameter ( bothValue.release () );
90
-
91
- std::unique_ptr< QgsProcessingParameterEnum > directionValue = qgis::make_unique< QgsProcessingParameterEnum >( QStringLiteral ( " DEFAULT_DIRECTION" ),
92
- QObject::tr ( " Default direction" ), QStringList () << QObject::tr ( " Forward direction" ) << QObject::tr ( " Backward direction" ) << QObject::tr ( " Both directions" ), false , 2 );
93
- directionValue->setFlags ( directionValue->flags () | QgsProcessingParameterDefinition::FlagAdvanced );
94
- addParameter ( directionValue.release () );
95
-
96
- std::unique_ptr< QgsProcessingParameterField > speedField = qgis::make_unique< QgsProcessingParameterField >( QStringLiteral ( " SPEED_FIELD" ),
97
- QObject::tr ( " Speed field" ), QVariant (), QStringLiteral ( " INPUT" ), QgsProcessingParameterField::Numeric, false , true );
98
- speedField->setFlags ( speedField->flags () | QgsProcessingParameterDefinition::FlagAdvanced );
99
- addParameter ( speedField.release () );
100
-
101
- std::unique_ptr< QgsProcessingParameterNumber > speed = qgis::make_unique< QgsProcessingParameterNumber >( QStringLiteral ( " DEFAULT_SPEED" ), QObject::tr ( " Default speed (km/h)" ), QgsProcessingParameterNumber::Double, 50 , false , 0 );
102
- speed->setFlags ( speed->flags () | QgsProcessingParameterDefinition::FlagAdvanced );
103
- addParameter ( speed.release () );
104
-
105
- std::unique_ptr< QgsProcessingParameterNumber > tolerance = qgis::make_unique < QgsProcessingParameterDistance >( QStringLiteral ( " TOLERANCE" ), QObject::tr ( " Topology tolerance" ), 0 , QStringLiteral ( " INPUT" ), false , 0 );
106
- tolerance->setFlags ( tolerance->flags () | QgsProcessingParameterDefinition::FlagAdvanced );
107
- addParameter ( tolerance.release () );
108
54
109
55
addParameter ( new QgsProcessingParameterFeatureSink ( QStringLiteral ( " OUTPUT" ), QObject::tr ( " Shortest path" ), QgsProcessing::TypeVectorLine ) );
110
56
addOutput ( new QgsProcessingOutputNumber ( QStringLiteral ( " TRAVEL_COST" ), QObject::tr ( " Travel cost" ) ) );
111
57
}
112
58
113
59
QVariantMap QgsShortestPathPointToPointAlgorithm::processAlgorithm ( const QVariantMap ¶meters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
114
60
{
115
- std::unique_ptr< QgsFeatureSource > source ( parameterAsSource ( parameters, QStringLiteral ( " INPUT" ), context ) );
116
- if ( !source )
117
- throw QgsProcessingException ( invalidSourceError ( parameters, QStringLiteral ( " INPUT" ) ) );
61
+ loadCommonParams ( parameters, context, feedback );
118
62
119
63
QgsFields fields;
120
64
fields.append ( QgsField ( QStringLiteral ( " start" ), QVariant::String ) );
121
65
fields.append ( QgsField ( QStringLiteral ( " end" ), QVariant::String ) );
122
66
fields.append ( QgsField ( QStringLiteral ( " cost" ), QVariant::Double ) );
123
67
124
68
QString dest;
125
- std::unique_ptr< QgsFeatureSink > sink ( parameterAsSink ( parameters, QStringLiteral ( " OUTPUT" ), context, dest, fields, QgsWkbTypes::LineString, source ->sourceCrs () ) );
69
+ std::unique_ptr< QgsFeatureSink > sink ( parameterAsSink ( parameters, QStringLiteral ( " OUTPUT" ), context, dest, fields, QgsWkbTypes::LineString, mNetwork ->sourceCrs () ) );
126
70
if ( !sink )
127
71
throw QgsProcessingException ( invalidSinkError ( parameters, QStringLiteral ( " OUTPUT" ) ) );
128
72
129
- QgsPointXY startPoint = parameterAsPoint ( parameters, QStringLiteral ( " START_POINT" ), context, source->sourceCrs () );
130
- QgsPointXY endPoint = parameterAsPoint ( parameters, QStringLiteral ( " END_POINT" ), context, source->sourceCrs () );
131
- int strategy = parameterAsInt ( parameters, QStringLiteral ( " STRATEGY" ), context );
132
- QString directionFieldName = parameterAsString ( parameters, QStringLiteral ( " DIRECTION_FIELD" ), context );
133
- QString forwardValue = parameterAsString ( parameters, QStringLiteral ( " VALUE_FORWARD" ), context );
134
- QString backwardValue = parameterAsString ( parameters, QStringLiteral ( " VALUE_BACKWARD" ), context );
135
- QString bothValue = parameterAsString ( parameters, QStringLiteral ( " VALUE_BOTH" ), context );
136
- QgsVectorLayerDirector::Direction defaultDirection = static_cast < QgsVectorLayerDirector::Direction>( parameterAsInt ( parameters, QStringLiteral ( " DEFAULT_DIRECTION" ), context ) );
137
- QString speedFieldName = parameterAsString ( parameters, QStringLiteral ( " SPEED_FIELD" ), context );
138
- double defaultSpeed = parameterAsDouble ( parameters, QStringLiteral ( " DEFAULT_SPEED" ), context );
139
- double tolerance = parameterAsDouble ( parameters, QStringLiteral ( " TOLERANCE" ), context );
140
-
141
- int directionIndex = -1 ;
142
- if ( !directionFieldName.isEmpty () )
143
- {
144
- directionIndex = source->fields ().lookupField ( directionFieldName );
145
- }
146
-
147
- int speedIndex = -1 ;
148
- if ( !speedFieldName.isEmpty () )
149
- {
150
- speedIndex = source->fields ().lookupField ( speedFieldName );
151
- }
152
-
153
- QgsVectorLayerDirector *director = new QgsVectorLayerDirector ( source.get (), directionIndex, forwardValue, backwardValue, bothValue, defaultDirection );
154
-
155
- QgsUnitTypes::DistanceUnit distanceUnits = context.project ()->crs ().mapUnits ();
156
- double multiplier = QgsUnitTypes::fromUnitToUnitFactor ( distanceUnits, QgsUnitTypes::DistanceMeters );
157
-
158
- if ( strategy )
159
- {
160
- director->addStrategy ( new QgsNetworkSpeedStrategy ( speedIndex, defaultSpeed, multiplier * 1000.0 / 3600.0 ) );
161
- multiplier = 3600 ;
162
- }
163
- else
164
- {
165
- director->addStrategy ( new QgsNetworkDistanceStrategy () );
166
- }
167
-
168
- QgsGraphBuilder builder ( source->sourceCrs (), true , tolerance );
73
+ QgsPointXY startPoint = parameterAsPoint ( parameters, QStringLiteral ( " START_POINT" ), context, mNetwork ->sourceCrs () );
74
+ QgsPointXY endPoint = parameterAsPoint ( parameters, QStringLiteral ( " END_POINT" ), context, mNetwork ->sourceCrs () );
169
75
170
76
feedback->pushInfo ( QObject::tr ( " Building graph…" ) );
171
77
QVector< QgsPointXY > points;
172
78
points << startPoint << endPoint;
173
79
QVector< QgsPointXY > snappedPoints;
174
- director ->makeGraph ( &builder , points, snappedPoints, feedback );
80
+ mDirector ->makeGraph ( mBuilder . get () , points, snappedPoints, feedback );
175
81
176
82
feedback->pushInfo ( QObject::tr ( " Calculating shortest path…" ) );
177
- QgsGraph *graph = builder. graph ();
83
+ QgsGraph *graph = mBuilder -> graph ();
178
84
int idxStart = graph->findVertex ( snappedPoints[0 ] );
179
85
int idxEnd = graph->findVertex ( snappedPoints[1 ] );
180
86
@@ -201,14 +107,14 @@ QVariantMap QgsShortestPathPointToPointAlgorithm::processAlgorithm( const QVaria
201
107
QgsFeature feat;
202
108
feat.setFields ( fields );
203
109
QgsAttributes attributes;
204
- attributes << startPoint.toString () << endPoint.toString () << cost / multiplier ;
110
+ attributes << startPoint.toString () << endPoint.toString () << cost / mMultiplier ;
205
111
feat.setGeometry ( geom );
206
112
feat.setAttributes ( attributes );
207
113
sink->addFeature ( feat, QgsFeatureSink::FastInsert );
208
114
209
115
QVariantMap outputs;
210
116
outputs.insert ( QStringLiteral ( " OUTPUT" ), dest );
211
- outputs.insert ( QStringLiteral ( " TRAVEL_COST" ), cost / multiplier );
117
+ outputs.insert ( QStringLiteral ( " TRAVEL_COST" ), cost / mMultiplier );
212
118
return outputs;
213
119
}
214
120
0 commit comments