27QString QgsShortestLineAlgorithm::name()
const
29 return QStringLiteral(
"shortestline" );
32QString QgsShortestLineAlgorithm::displayName()
const
34 return QObject::tr(
"Shortest line between features" );
37QStringList QgsShortestLineAlgorithm::tags()
const
39 return QObject::tr(
"distance,shortest,minimum,nearest,closest,proximity" ).split(
',' );
42QString QgsShortestLineAlgorithm::group()
const
44 return QObject::tr(
"Vector analysis" );
47QString QgsShortestLineAlgorithm::groupId()
const
49 return QStringLiteral(
"vectoranalysis" );
52QString QgsShortestLineAlgorithm::shortDescription()
const
54 return QObject::tr(
"Calculates the shortest lines between features in source and destination layers." );
57QString QgsShortestLineAlgorithm::shortHelpString()
const
59 return QObject::tr(
"This algorithm creates a line layer as the "
60 "shortest line between the source and the destination layer. "
61 "By default only the first nearest feature of the "
62 "destination layer is taken into account. "
63 "The n-nearest neighboring features number can be specified.\n\n"
64 "If a maximum distance is specified, then only "
65 "features which are closer than this distance will "
66 "be considered.\n\nThe output features will contain all the "
67 "source layer attributes, all the attributes from the n-nearest "
68 "feature and the additional field of the distance.\n\n"
69 "This algorithm uses purely Cartesian calculations for distance, "
70 "and does not consider geodetic or ellipsoid properties when "
71 "determining feature proximity. The measurement and output coordinate "
72 "system is based on the coordinate system of the source layer."
76QgsShortestLineAlgorithm *QgsShortestLineAlgorithm::createInstance()
const
78 return new QgsShortestLineAlgorithm();
81void QgsShortestLineAlgorithm::initAlgorithm(
const QVariantMap & )
85 addParameter(
new QgsProcessingParameterEnum( QStringLiteral(
"METHOD" ), QObject::tr(
"Method" ), QStringList() <<
"Distance to Nearest Point on feature" <<
"Distance to Feature Centroid",
false, 0 ) );
87 addParameter(
new QgsProcessingParameterDistance( QStringLiteral(
"DISTANCE" ), QObject::tr(
"Maximum distance" ), QVariant(), QString(
"SOURCE" ),
true ) );
93 mSource.reset( parameterAsSource( parameters, QStringLiteral(
"SOURCE" ), context ) );
97 mDestination.reset( parameterAsSource( parameters, QStringLiteral(
"DESTINATION" ), context ) );
101 mMethod = parameterAsInt( parameters, QStringLiteral(
"METHOD" ), context );
103 mKNeighbors = parameterAsInt( parameters, QStringLiteral(
"NEIGHBORS" ), context );
105 mMaxDistance = parameterAsDouble( parameters, QStringLiteral(
"DISTANCE" ), context );
112 if ( mKNeighbors > mDestination->featureCount() )
113 mKNeighbors = mDestination->featureCount();
118 newFields.
append(
QgsField( QStringLiteral(
"distance" ), QMetaType::Type::Double ) );
122 std::unique_ptr<QgsFeatureSink> sink( parameterAsSink( parameters, QStringLiteral(
"OUTPUT" ), context, dest, fields,
Qgis::WkbType::MultiLineString, mSource->sourceCrs() ) );
127 QHash<QgsFeatureId, QgsAttributes> destinationAttributeCache;
128 double step = mDestination->featureCount() > 0 ? 50.0 / mDestination->featureCount() : 1;
132 if ( feedback-> isCanceled() )
137 destinationAttributeCache.insert( f.
id(), f.
attributes() );
141 step = mSource->featureCount() > 0 ? 50.0 / mSource->featureCount() : 1;
148 while ( sourceIterator.
nextFeature( sourceFeature ) )
154 QgsFeatureIds nearestIds = qgis::listToSet( idx.nearestNeighbor( sourceGeom, mKNeighbors, mMaxDistance ) );
161 destinationGeom = idx.geometry(
id ).
centroid();
172 throw QgsProcessingException( QObject::tr(
"An error occurred while calculating shortest line length" ) );
177 attrs << destinationAttributeCache.value(
id ) << dist;
192 outputs.insert( QStringLiteral(
"OUTPUT" ), dest );
@ VectorAnyGeometry
Any vector layer with geometry.
@ VectorLine
Vector line layers.
@ MultiLineString
MultiLineString.
Custom exception class for Coordinate Reference System related exceptions.
A general purpose distance and area calculator, capable of performing ellipsoid based calculations.
double measureLength(const QgsGeometry &geometry) const
Measures the length of a geometry.
void setSourceCrs(const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &context)
Sets source spatial reference system crs.
Wrapper for iterator of features from vector data provider or vector layer.
bool nextFeature(QgsFeature &f)
Fetch next feature and stores in f, returns true on success.
Wraps a request for features to a vector layer (or directly its vector data provider).
@ 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 setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
bool isCanceled() const
Tells whether the operation has been canceled already.
void setProgress(double progress)
Sets the current progress for the feedback object.
Encapsulate a field in an attribute table or data source.
Container of fields for a vector layer.
bool append(const QgsField &field, Qgis::FieldOrigin origin=Qgis::FieldOrigin::Provider, int originIndex=-1)
Appends a field.
A geometry is the spatial representation of a feature.
QgsGeometry centroid() const
Returns the center of mass of a geometry.
QgsGeometry shortestLine(const QgsGeometry &other) const
Returns the shortest line joining this geometry to another geometry.
Contains information about the context in which a processing algorithm is executed.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context.
Custom exception class for processing related exceptions.
Base class for providing feedback from a processing algorithm.
A double numeric parameter for distance values.
An enum based parameter for processing algorithms, allowing for selection from predefined values.
A feature sink output for processing algorithms.
An input feature source (such as vector layers) parameter for processing algorithms.
A numeric parameter for processing algorithms.
static QgsFields combineFields(const QgsFields &fieldsA, const QgsFields &fieldsB, const QString &fieldsBPrefix=QString())
Combines two field lists, avoiding duplicate field names (in a case-insensitive manner).
A spatial index for QgsFeature objects.
@ FlagStoreFeatureGeometries
Indicates that the spatial index should also store feature geometries. This requires more memory,...
QSet< QgsFeatureId > QgsFeatureIds
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features