25 QString QgsServiceAreaFromPointAlgorithm::name()
const
27 return QStringLiteral(
"serviceareafrompoint" );
30 QString QgsServiceAreaFromPointAlgorithm::displayName()
const
32 return QObject::tr(
"Service area (from point)" );
35 QStringList QgsServiceAreaFromPointAlgorithm::tags()
const
37 return QObject::tr(
"network,service,area,shortest,fastest" ).split(
',' );
40 QString QgsServiceAreaFromPointAlgorithm::shortHelpString()
const
42 return QObject::tr(
"This algorithm creates a new vector with all the edges or parts of edges "
43 "of a network line layer that can be reached within a distance or a time, "
44 "starting from a point feature. The distance and the time (both referred to "
45 "as \"travel cost\") must be specified respectively in the network layer "
46 "units or in hours." );
49 QgsServiceAreaFromPointAlgorithm *QgsServiceAreaFromPointAlgorithm::createInstance()
const
51 return new QgsServiceAreaFromPointAlgorithm();
54 void QgsServiceAreaFromPointAlgorithm::initAlgorithm(
const QVariantMap & )
59 std::unique_ptr< QgsProcessingParameterNumber > travelCost = std::make_unique< QgsProcessingParameterNumber >( QStringLiteral(
"TRAVEL_COST" ), QObject::tr(
"Travel cost (distance for 'Shortest', time for 'Fastest')" ),
QgsProcessingParameterNumber::Double, 0,
true, 0 );
61 addParameter( travelCost.release() );
63 addParameter(
new QgsProcessingParameterNumber( QStringLiteral(
"TRAVEL_COST2" ), QObject::tr(
"Travel cost (distance for 'Shortest', time for 'Fastest')" ),
66 std::unique_ptr< QgsProcessingParameterBoolean > includeBounds = std::make_unique< QgsProcessingParameterBoolean >( QStringLiteral(
"INCLUDE_BOUNDS" ), QObject::tr(
"Include upper/lower bound points" ),
false,
true );
68 addParameter( includeBounds.release() );
70 std::unique_ptr< QgsProcessingParameterFeatureSink > outputLines = std::make_unique< QgsProcessingParameterFeatureSink >( QStringLiteral(
"OUTPUT_LINES" ), QObject::tr(
"Service area (lines)" ),
72 outputLines->setCreateByDefault(
true );
73 addParameter( outputLines.release() );
75 std::unique_ptr< QgsProcessingParameterFeatureSink > outputPoints = std::make_unique< QgsProcessingParameterFeatureSink >( QStringLiteral(
"OUTPUT" ), QObject::tr(
"Service area (boundary nodes)" ),
77 outputPoints->setCreateByDefault(
false );
78 addParameter( outputPoints.release() );
83 loadCommonParams( parameters, context, feedback );
85 QgsPointXY startPoint = parameterAsPoint( parameters, QStringLiteral(
"START_POINT" ), context, mNetwork->sourceCrs() );
88 const bool useOldTravelCost = parameters.value( QStringLiteral(
"TRAVEL_COST" ) ).isValid();
89 double travelCost = parameterAsDouble( parameters, useOldTravelCost ? QStringLiteral(
"TRAVEL_COST" ) : QStringLiteral(
"TRAVEL_COST2" ), context );
91 int strategy = parameterAsInt( parameters, QStringLiteral(
"STRATEGY" ), context );
92 if ( strategy && !useOldTravelCost )
93 travelCost *= mMultiplier;
95 bool includeBounds =
true;
96 if ( parameters.contains( QStringLiteral(
"INCLUDE_BOUNDS" ) ) )
98 includeBounds = parameterAsBool( parameters, QStringLiteral(
"INCLUDE_BOUNDS" ), context );
101 feedback->
pushInfo( QObject::tr(
"Building graph…" ) );
102 QVector< QgsPointXY > snappedPoints;
103 mDirector->makeGraph( mBuilder.get(), QVector< QgsPointXY >() << startPoint, snappedPoints, feedback );
105 feedback->
pushInfo( QObject::tr(
"Calculating service area…" ) );
106 QgsGraph *graph = mBuilder->graph();
107 int idxStart = graph->
findVertex( snappedPoints[0] );
110 QVector< double > costs;
115 QSet< int > vertices;
117 int inboundEdgeIndex;
118 double startVertexCost, endVertexCost;
122 for (
int i = 0; i < costs.size(); i++ )
124 inboundEdgeIndex = tree.at( i );
125 if ( inboundEdgeIndex == -1 && i != idxStart )
131 startVertexCost = costs.at( i );
132 if ( startVertexCost > travelCost )
138 vertices.insert( i );
143 for (
int edgeId : outgoingEdges )
145 edge = graph->
edge( edgeId );
146 endVertexCost = startVertexCost + edge.
cost( 0 ).toDouble();
148 if ( endVertexCost <= travelCost )
158 edgeEnd.
x(), edgeEnd.
y(), endVertexCost, travelCost );
160 points.push_back( interpolatedEndPoint );
161 lines.push_back(
QgsPolylineXY() << edgeStart << interpolatedEndPoint );
167 QList< int > verticesList = qgis::setToList( vertices );
168 points.reserve( verticesList.size() );
169 std::sort( verticesList.begin(), verticesList.end() );
170 for (
int v : verticesList )
175 feedback->
pushInfo( QObject::tr(
"Writing results…" ) );
180 fields.
append(
QgsField( QStringLiteral(
"type" ), QVariant::String ) );
181 fields.
append(
QgsField( QStringLiteral(
"start" ), QVariant::String ) );
186 QString pointsSinkId;
187 std::unique_ptr< QgsFeatureSink > pointsSink( parameterAsSink( parameters, QStringLiteral(
"OUTPUT" ), context, pointsSinkId, fields,
192 outputs.insert( QStringLiteral(
"OUTPUT" ), pointsSinkId );
202 QVector< int > nodes;
205 for (
int i = 0; i < costs.size(); i++ )
207 if ( costs.at( i ) > travelCost && tree.at( i ) != -1 )
210 if ( costs.at( vertexId ) <= travelCost )
212 nodes.push_back( i );
217 for (
int i : nodes )
237 std::unique_ptr< QgsFeatureSink > linesSink( parameterAsSink( parameters, QStringLiteral(
"OUTPUT_LINES" ), context, linesSinkId, fields,
242 outputs.insert( QStringLiteral(
"OUTPUT_LINES" ), linesSinkId );
@ FastInsert
Use faster inserts, at the cost of updating the passed features to reflect changes made at the provid...
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
void setAttributes(const QgsAttributes &attrs)
Sets the feature's attributes.
void setFields(const QgsFields &fields, bool initAttributes=false)
Assigns a field map with the feature to allow attribute access by attribute name.
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
Encapsulate a field in an attribute table or data source.
Container of fields for a vector layer.
bool append(const QgsField &field, FieldOrigin origin=OriginProvider, int originIndex=-1)
Appends a field. The field must have unique name, otherwise it is rejected (returns false)
static QgsPointXY interpolatePointOnLineByValue(double x1, double y1, double v1, double x2, double y2, double v2, double value) SIP_HOLDGIL
Interpolates the position of a point along the line from (x1, y1) to (x2, y2).
A geometry is the spatial representation of a feature.
static QgsGeometry fromMultiPolylineXY(const QgsMultiPolylineXY &multiline)
Creates a new geometry from a QgsMultiPolylineXY object.
static QgsGeometry fromMultiPointXY(const QgsMultiPointXY &multipoint)
Creates a new geometry from a QgsMultiPointXY object.
static void dijkstra(const QgsGraph *source, int startVertexIdx, int criterionNum, QVector< int > *resultTree=nullptr, QVector< double > *resultCost=nullptr)
Solve shortest path problem using Dijkstra algorithm.
This class implements a graph edge.
int fromVertex() const
Returns the index of the vertex at the start of this edge.
int toVertex() const
Returns the index of the vertex at the end of this edge.
QVariant cost(int strategyIndex) const
Returns edge cost calculated using specified strategy.
QgsGraphEdgeIds outgoingEdges() const
Returns outgoing edge ids, i.e.
QgsPointXY point() const
Returns point associated with graph vertex.
Mathematical graph representation.
const QgsGraphVertex & vertex(int idx) const
Returns vertex at given index.
int findVertex(const QgsPointXY &pt) const
Find vertex by associated point.
const QgsGraphEdge & edge(int idx) const
Returns edge at given index.
A class to represent a 2D point.
QString toString(int precision=-1) const
Returns a string representation of the point (x, y) with a preset precision.
Contains information about the context in which a processing algorithm is executed.
Base class for providing feedback from a processing algorithm.
virtual void pushInfo(const QString &info)
Pushes a general informational message from the algorithm.
@ FlagAdvanced
Parameter is an advanced parameter which should be hidden from users by default.
@ FlagHidden
Parameter is hidden and should not be shown to users.
A numeric parameter for processing algorithms.
@ Double
Double/float values.
A point parameter for processing algorithms.
@ TypeVectorLine
Vector line layers.
@ TypeVectorPoint
Vector point layers.
QVector< QgsPolylineXY > QgsMultiPolylineXY
A collection of QgsPolylines that share a common collection of attributes.
QVector< QgsPointXY > QgsMultiPointXY
A collection of QgsPoints that share a common collection of attributes.
QVector< QgsPointXY > QgsPolylineXY
Polyline as represented as a vector of two-dimensional points.