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 = qgis::make_unique < QgsProcessingParameterDistance >( QStringLiteral(
"DISTANCE" ), QObject::tr(
"Distance" ), 10, QStringLiteral(
"INPUT" ) );
54 bufferParam->setIsDynamic(
true );
56 bufferParam->setDynamicLayerParameterName( QStringLiteral(
"INPUT" ) );
57 addParameter( bufferParam.release() );
58 auto segmentParam = qgis::make_unique < QgsProcessingParameterNumber >( QStringLiteral(
"SEGMENTS" ), QObject::tr(
"Segments" ),
QgsProcessingParameterNumber::Integer, 5,
false, 1 );
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 bool dissolve = parameterAsBoolean( parameters, QStringLiteral(
"DISSOLVE" ), context );
96 int segments = parameterAsInt( parameters, QStringLiteral(
"SEGMENTS" ), context );
99 double miterLimit = parameterAsDouble( parameters, QStringLiteral(
"MITER_LIMIT" ), context );
100 double bufferDistance = parameterAsDouble( parameters, QStringLiteral(
"DISTANCE" ), context );
102 QgsExpressionContext expressionContext = createExpressionContext( parameters, context, source.get() );
106 bufferProperty = parameters.
value( QStringLiteral(
"DISTANCE" ) ).value<
QgsProperty >();
109 long count = source->featureCount();
115 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() )
146 bufferedGeometriesForDissolve << outputGeometry;
172 outputs.insert( QStringLiteral(
"OUTPUT" ), dest );
176 QgsProcessingAlgorithm::Flags QgsBufferAlgorithm::flags()
const
186 if ( sink == QLatin1String(
"OUTPUT" ) )
190 const VectorProperties inputProps = sourceProperties.value( QStringLiteral(
"INPUT" ) );
191 result.
fields = inputProps.fields;
192 result.
crs = inputProps.crs;
199 std::unique_ptr< QgsProcessingFeatureSource > source( parameterAsSource( parameters, QStringLiteral(
"INPUT" ), context ) );
202 result.
fields = source->fields();
203 result.
crs = source->sourceCrs();
213 bool QgsBufferAlgorithm::supportInPlaceEdit(
const QgsMapLayer *layer )
const
215 const QgsVectorLayer *vlayer = qobject_cast< const QgsVectorLayer * >( layer );
219 return vlayer->
wkbType() == QgsWkbTypes::Type::Polygon || vlayer->
wkbType() == QgsWkbTypes::Type::MultiPolygon;