26 QString QgsSnapGeometriesAlgorithm::name()
const
28 return QStringLiteral(
"snapgeometries" );
31 QString QgsSnapGeometriesAlgorithm::displayName()
const
33 return QObject::tr(
"Snap geometries to layer" );
36 QString QgsSnapGeometriesAlgorithm::shortHelpString()
const
38 return QObject::tr(
"Snaps the geometries in a layer. Snapping can be done either to the geometries "
39 "from another layer, or to geometries within the same layer." )
40 + QStringLiteral(
"\n\n" )
41 + QObject::tr(
"A tolerance is specified in layer units to control how close vertices need "
42 "to be to the reference layer geometries before they are snapped." )
43 + QStringLiteral(
"\n\n" )
44 + QObject::tr(
"Snapping occurs to both nodes and edges. Depending on the snapping behavior, "
45 "either nodes or edges will be preferred." )
46 + QStringLiteral(
"\n\n" )
47 + QObject::tr(
"Vertices will be inserted or removed as required to make the geometries match "
48 "the reference geometries." );
51 QStringList QgsSnapGeometriesAlgorithm::tags()
const
53 return QObject::tr(
"geometry,snap,tolerance" ).split(
',' );
56 QString QgsSnapGeometriesAlgorithm::group()
const
58 return QObject::tr(
"Vector geometry" );
61 QString QgsSnapGeometriesAlgorithm::groupId()
const
63 return QStringLiteral(
"vectorgeometry" );
66 QgsProcessingAlgorithm::Flags QgsSnapGeometriesAlgorithm::flags()
const
73 bool QgsSnapGeometriesAlgorithm::supportInPlaceEdit(
const QgsMapLayer *l )
const
75 const QgsVectorLayer *layer = qobject_cast< const QgsVectorLayer * >( l );
82 void QgsSnapGeometriesAlgorithm::initAlgorithm(
const QVariantMap & )
89 10.0, QStringLiteral(
"INPUT" ),
false, 0.00000001 ) );
91 QStringList options = QStringList()
92 << QObject::tr(
"Prefer aligning nodes, insert extra vertices where required" )
93 << QObject::tr(
"Prefer closest point, insert extra vertices where required" )
94 << QObject::tr(
"Prefer aligning nodes, don't insert new vertices" )
95 << QObject::tr(
"Prefer closest point, don't insert new vertices" )
96 << QObject::tr(
"Move end points only, prefer aligning nodes" )
97 << QObject::tr(
"Move end points only, prefer closest point" )
98 << QObject::tr(
"Snap end points to end points only" )
99 << QObject::tr(
"Snap to anchor nodes (single layer only)" );
100 addParameter(
new QgsProcessingParameterEnum( QStringLiteral(
"BEHAVIOR" ), QObject::tr(
"Behavior" ), options,
false, QVariantList() << 0 ) );
105 QgsSnapGeometriesAlgorithm *QgsSnapGeometriesAlgorithm::createInstance()
const
107 return new QgsSnapGeometriesAlgorithm();
112 std::unique_ptr< QgsProcessingFeatureSource > source( parameterAsSource( parameters, QStringLiteral(
"INPUT" ), context ) );
116 std::unique_ptr< QgsProcessingFeatureSource > referenceSource( parameterAsSource( parameters, QStringLiteral(
"REFERENCE_LAYER" ), context ) );
117 if ( !referenceSource )
120 double tolerance = parameterAsDouble( parameters, QStringLiteral(
"TOLERANCE" ), context );
124 std::unique_ptr< QgsFeatureSink > sink( parameterAsSink( parameters, QStringLiteral(
"OUTPUT" ), context, dest, source->fields(), source->wkbType(), source->sourceCrs() ) );
128 double step = source->featureCount() > 0 ? 100.0 / source->featureCount() : 1;
131 if ( parameters.value( QStringLiteral(
"INPUT" ) ) != parameters.value( QStringLiteral(
"REFERENCE_LAYER" ) ) )
134 throw QgsProcessingException( QObject::tr(
"This mode applies when the input and reference layer are the same." ) );
137 long long processed = 0;
147 outFeature.setGeometry( snapper.snapGeometry( f.
geometry(), tolerance, mode ) );
152 sink->addFeature( f );
158 else if ( mode == 7 )
162 feedback->
pushInfo( QObject::tr(
"Snapped %1 geometries." ).arg( modified ) );
168 long long processed = 0;
178 outFeature.setGeometry( snapper.snapFeature( f ) );
183 sink->addFeature( f );
191 outputs.insert( QStringLiteral(
"OUTPUT" ), dest );