27QString QgsExplodeAlgorithm::name()
const
29 return QStringLiteral(
"explodelines" );
32QString QgsExplodeAlgorithm::displayName()
const
34 return QObject::tr(
"Explode lines" );
37QStringList QgsExplodeAlgorithm::tags()
const
39 return QObject::tr(
"segments,parts" ).split(
',' );
42QString QgsExplodeAlgorithm::group()
const
44 return QObject::tr(
"Vector geometry" );
47QString QgsExplodeAlgorithm::groupId()
const
49 return QStringLiteral(
"vectorgeometry" );
52QString QgsExplodeAlgorithm::shortHelpString()
const
54 return QObject::tr(
"This algorithm takes a lines layer and creates a new one in which each line is replaced by a set of "
55 "lines representing the segments in the original line. Each line in the resulting layer contains only a "
56 "start and an end point, with no intermediate nodes between them.\n\n"
57 "If the input layer consists of CircularStrings or CompoundCurves, the output layer will be of the "
58 "same type and contain only single curve segments." );
61QList<int> QgsExplodeAlgorithm::inputLayerTypes()
const
71QgsExplodeAlgorithm *QgsExplodeAlgorithm::createInstance()
const
73 return new QgsExplodeAlgorithm();
76QString QgsExplodeAlgorithm::outputName()
const
78 return QObject::tr(
"Exploded" );
94 const std::vector<QgsGeometry> parts = extractAsParts( f.
geometry() );
97 features.reserve( parts.size() );
102 features << outputFeature;
108QgsFeatureSink::SinkFlags QgsExplodeAlgorithm::sinkFlags()
const
113std::vector<QgsGeometry> QgsExplodeAlgorithm::extractAsParts(
const QgsGeometry &geometry )
const
117 std::vector<QgsGeometry> parts;
119 for (
int part = 0; part < collection->
numGeometries(); ++part )
121 std::vector<QgsGeometry> segments = curveAsSingleSegments( qgsgeometry_cast< const QgsCurve * >( collection->
geometryN( part ) ) );
122 parts.reserve( parts.size() + segments.size() );
123 std::move( std::begin( segments ), std::end( segments ), std::back_inserter( parts ) );
129 return curveAsSingleSegments( qgsgeometry_cast< const QgsCurve * >( geometry.
constGet() ) );
133std::vector<QgsGeometry> QgsExplodeAlgorithm::curveAsSingleSegments(
const QgsCurve *curve,
bool useCompoundCurves )
const
135 std::vector<QgsGeometry> parts;
142 const QgsLineString *line = qgsgeometry_cast< const QgsLineString * >( curve );
143 for (
int i = 0; i < line->
numPoints() - 1; ++i )
147 std::unique_ptr< QgsLineString > ls = std::make_unique< QgsLineString >( QVector< QgsPoint >() << ptA << ptB );
148 if ( !useCompoundCurves )
150 parts.emplace_back(
QgsGeometry( std::move( ls ) ) );
154 std::unique_ptr< QgsCompoundCurve > cc = std::make_unique< QgsCompoundCurve >();
155 cc->addCurve( ls.release() );
156 parts.emplace_back(
QgsGeometry( std::move( cc ) ) );
164 const QgsCircularString *
string = qgsgeometry_cast< const QgsCircularString * >( curve );
165 for (
int i = 0; i <
string->numPoints() - 2; i += 2 )
167 const QgsPoint ptA =
string->pointN( i );
168 const QgsPoint ptB =
string->pointN( i + 1 );
169 const QgsPoint ptC =
string->pointN( i + 2 );
170 std::unique_ptr< QgsCircularString > cs = std::make_unique< QgsCircularString >();
172 if ( !useCompoundCurves )
174 parts.emplace_back(
QgsGeometry( std::move( cs ) ) );
178 std::unique_ptr< QgsCompoundCurve > cc = std::make_unique< QgsCompoundCurve >();
179 cc->addCurve( cs.release() );
180 parts.emplace_back(
QgsGeometry( std::move( cc ) ) );
188 const QgsCompoundCurve *compoundCurve = qgsgeometry_cast< QgsCompoundCurve * >( curve );
189 for (
int i = 0; i < compoundCurve->
nCurves(); ++i )
191 std::vector<QgsGeometry> segments = curveAsSingleSegments( compoundCurve->
curveAt( i ),
true );
192 parts.reserve( parts.size() + segments.size() );
193 std::move( std::begin( segments ), std::end( segments ), std::back_inserter( parts ) );
QgsWkbTypes::Type wkbType() const SIP_HOLDGIL
Returns the WKB type of the geometry.
Circular string geometry type.
Compound curve geometry type.
const QgsCurve * curveAt(int i) const SIP_HOLDGIL
Returns the curve at the specified index.
int nCurves() const SIP_HOLDGIL
Returns the number of curves in the geometry.
Abstract base class for curved geometry type.
@ RegeneratePrimaryKey
This flag indicates, that a primary key field cannot be guaranteed to be unique and the sink should i...
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.
bool hasGeometry() const
Returns true if the feature has an associated geometry.
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
int numGeometries() const SIP_HOLDGIL
Returns the number of geometries within the collection.
const QgsAbstractGeometry * geometryN(int n) const
Returns a const reference to a geometry from within the collection.
A geometry is the spatial representation of a feature.
const QgsAbstractGeometry * constGet() const SIP_HOLDGIL
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
bool isMultipart() const SIP_HOLDGIL
Returns true if WKB of the geometry is of WKBMulti* type.
Line string geometry type, with support for z-dimension and m-values.
int numPoints() const override SIP_HOLDGIL
Returns the number of points in the curve.
QgsPoint pointN(int i) const
Returns the specified point from inside the line string.
Point geometry type, with support for z-dimension and m-values.
Contains information about the context in which a processing algorithm is executed.
Base class for providing feedback from a processing algorithm.
SourceType
Data source types enum.
@ TypeVectorLine
Vector line layers.
Type
The WKB type describes the number of dimensions a geometry has.
static Type singleType(Type type) SIP_HOLDGIL
Returns the single type for a WKB type.
static Type flatType(Type type) SIP_HOLDGIL
Returns the flat type for a WKB type.
QVector< QgsPoint > QgsPointSequence
QList< QgsFeature > QgsFeatureList