24 QString QgsBufferAlgorithm::name()
const
26 return QStringLiteral(
"buffer" );
29 QString QgsBufferAlgorithm::displayName()
const
31 return QObject::tr(
"Buffer" );
34 QStringList QgsBufferAlgorithm::tags()
const
36 return QObject::tr(
"buffer,grow,fixed,variable,distance" ).split(
',' );
39 QString QgsBufferAlgorithm::group()
const
41 return QObject::tr(
"Vector geometry" );
44 QString QgsBufferAlgorithm::groupId()
const
46 return QStringLiteral(
"vectorgeometry" );
49 void QgsBufferAlgorithm::initAlgorithm(
const QVariantMap & )
53 auto bufferParam = std::make_unique < QgsProcessingParameterDistance >( QStringLiteral(
"DISTANCE" ), QObject::tr(
"Distance" ), 10, QStringLiteral(
"INPUT" ) );
54 bufferParam->setIsDynamic(
true );
56 bufferParam->setDynamicLayerParameterName( QStringLiteral(
"INPUT" ) );
57 addParameter( bufferParam.release() );
59 segmentParam->setHelp( QObject::tr(
"The segments parameter controls the number of line segments to use to approximate a quarter circle when creating rounded offsets." ) );
60 addParameter( segmentParam.release() );
61 addParameter(
new QgsProcessingParameterEnum( QStringLiteral(
"END_CAP_STYLE" ), QObject::tr(
"End cap style" ), QStringList() << QObject::tr(
"Round" ) << QObject::tr(
"Flat" ) << QObject::tr(
"Square" ),
false, 0 ) );
62 addParameter(
new QgsProcessingParameterEnum( QStringLiteral(
"JOIN_STYLE" ), QObject::tr(
"Join style" ), QStringList() << QObject::tr(
"Round" ) << QObject::tr(
"Miter" ) << QObject::tr(
"Bevel" ),
false, 0 ) );
69 QString QgsBufferAlgorithm::shortHelpString()
const
71 return QObject::tr(
"This algorithm computes a buffer area for all the features in an input layer, using a fixed or dynamic distance.\n\n"
72 "The segments parameter controls the number of line segments to use to approximate a quarter circle when creating rounded offsets.\n\n"
73 "The end cap style parameter controls how line endings are handled in the buffer.\n\n"
74 "The join style parameter specifies whether round, miter or beveled joins should be used when offsetting corners in a line.\n\n"
75 "The miter limit parameter is only applicable for miter join styles, and controls the maximum distance from the offset curve to use when creating a mitered join." );
78 QgsBufferAlgorithm *QgsBufferAlgorithm::createInstance()
const
80 return new QgsBufferAlgorithm();
85 std::unique_ptr< QgsProcessingFeatureSource > source( parameterAsSource( parameters, QStringLiteral(
"INPUT" ), context ) );
90 std::unique_ptr< QgsFeatureSink > sink( parameterAsSink( parameters, QStringLiteral(
"OUTPUT" ), context, dest, source->fields(),
QgsWkbTypes::MultiPolygon, source->sourceCrs() ) );
95 const bool dissolve = parameterAsBoolean( parameters, QStringLiteral(
"DISSOLVE" ), context );
96 const int segments = parameterAsInt( parameters, QStringLiteral(
"SEGMENTS" ), context );
99 const double miterLimit = parameterAsDouble( parameters, QStringLiteral(
"MITER_LIMIT" ), context );
100 const double bufferDistance = parameterAsDouble( parameters, QStringLiteral(
"DISTANCE" ), context );
102 QgsExpressionContext expressionContext = createExpressionContext( parameters, context, source.get() );
106 bufferProperty = parameters.
value( QStringLiteral(
"DISTANCE" ) ).value<
QgsProperty >();
109 const long count = source->featureCount();
115 const double step = count > 0 ? 100.0 / count : 1;
118 QVector< QgsGeometry > bufferedGeometriesForDissolve;
127 if ( dissolveAttrs.isEmpty() )
133 double distance = bufferDistance;
137 distance = bufferProperty.
valueAsDouble( expressionContext, bufferDistance );
141 if ( outputGeometry.
isNull() )
143 QgsMessageLog::logMessage( QObject::tr(
"Error calculating buffer for feature %1" ).arg( f.
id() ), QObject::tr(
"Processing" ), Qgis::MessageLevel::Warning );
146 bufferedGeometriesForDissolve << outputGeometry;
164 if ( dissolve && !bufferedGeometriesForDissolve.isEmpty() )
176 outputs.insert( QStringLiteral(
"OUTPUT" ), dest );
180 QgsProcessingAlgorithm::Flags QgsBufferAlgorithm::flags()
const
190 if ( sink == QLatin1String(
"OUTPUT" ) )
194 const VectorProperties inputProps = sourceProperties.value( QStringLiteral(
"INPUT" ) );
195 result.
fields = inputProps.fields;
196 result.
crs = inputProps.crs;
203 std::unique_ptr< QgsProcessingFeatureSource > source( parameterAsSource( parameters, QStringLiteral(
"INPUT" ), context ) );
206 result.
fields = source->fields();
207 result.
crs = source->sourceCrs();
217 bool QgsBufferAlgorithm::supportInPlaceEdit(
const QgsMapLayer *layer )
const
219 const QgsVectorLayer *vlayer = qobject_cast< const QgsVectorLayer * >( layer );
223 return vlayer->
wkbType() == QgsWkbTypes::Type::Polygon || vlayer->
wkbType() == QgsWkbTypes::Type::MultiPolygon;