QGIS API Documentation 3.28.0-Firenze (ed3ad0430f)
qgsalgorithmpolygonstolines.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsalgorithmpolygonstolines.cpp
3 ---------------------
4 begin : January 2019
5 copyright : (C) 2019 by Matthias Kuhn
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
20#include "qgscurvepolygon.h"
21#include "qgscurve.h"
22#include "qgsmultilinestring.h"
23
25
26QString QgsPolygonsToLinesAlgorithm::name() const
27{
28 return QStringLiteral( "polygonstolines" );
29}
30
31QString QgsPolygonsToLinesAlgorithm::displayName() const
32{
33 return QObject::tr( "Polygons to lines" );
34}
35
36QStringList QgsPolygonsToLinesAlgorithm::tags() const
37{
38 return QObject::tr( "line,polygon,convert" ).split( ',' );
39}
40
41QString QgsPolygonsToLinesAlgorithm::group() const
42{
43 return QObject::tr( "Vector geometry" );
44}
45
46QString QgsPolygonsToLinesAlgorithm::groupId() const
47{
48 return QStringLiteral( "vectorgeometry" );
49}
50
51QString QgsPolygonsToLinesAlgorithm::outputName() const
52{
53 return QObject::tr( "Lines" );
54}
55
56QgsProcessing::SourceType QgsPolygonsToLinesAlgorithm::outputLayerType() const
57{
59}
60
61QgsWkbTypes::Type QgsPolygonsToLinesAlgorithm::outputWkbType( QgsWkbTypes::Type inputWkbType ) const
62{
64
69
70 if ( QgsWkbTypes::hasM( inputWkbType ) )
71 wkbType = QgsWkbTypes::addM( wkbType );
72 if ( QgsWkbTypes::hasZ( inputWkbType ) )
73 wkbType = QgsWkbTypes::addZ( wkbType );
74
75 return wkbType;
76}
77
78QString QgsPolygonsToLinesAlgorithm::shortHelpString() const
79{
80 return QObject::tr( "Converts polygons to lines" );
81}
82
83QString QgsPolygonsToLinesAlgorithm::shortDescription() const
84{
85 return QObject::tr( "Converts polygons to lines." );
86}
87
88QgsPolygonsToLinesAlgorithm *QgsPolygonsToLinesAlgorithm::createInstance() const
89{
90 return new QgsPolygonsToLinesAlgorithm();
91}
92
93QList<int> QgsPolygonsToLinesAlgorithm::inputLayerTypes() const
94{
95 return QList<int>() << QgsProcessing::TypeVectorPolygon;
96}
97
98QgsFeatureList QgsPolygonsToLinesAlgorithm::processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback * )
99{
100 Q_UNUSED( context )
101
102 QgsFeatureList result;
103 QgsFeature feat = feature;
104 if ( feat.hasGeometry() )
105 feat.setGeometry( convertToLines( feat.geometry() ) );
106
107 result << feat;
108 return result;
109}
110
111QgsGeometry QgsPolygonsToLinesAlgorithm::convertToLines( const QgsGeometry &geometry ) const
112{
113 auto rings = extractRings( geometry.constGet() );
114
115 QgsWkbTypes::Type resultType = outputWkbType( geometry.wkbType() );
116
117 std::unique_ptr<QgsMultiCurve> lineGeometry;
118
120 lineGeometry = std::make_unique<QgsMultiLineString>();
121 else
122 lineGeometry = std::make_unique<QgsMultiCurve>();
123
124 lineGeometry->reserve( rings.size() );
125 for ( auto ring : std::as_const( rings ) )
126 lineGeometry->addGeometry( ring );
127
128 return QgsGeometry( lineGeometry.release() );
129}
130
131QList<QgsCurve *> QgsPolygonsToLinesAlgorithm::extractRings( const QgsAbstractGeometry *geom ) const
132{
133 QList<QgsCurve *> rings;
134
135 if ( QgsGeometryCollection *collection = qgsgeometry_cast<QgsGeometryCollection *>( geom ) )
136 {
137 QgsGeometryPartIterator parts = collection->parts();
138 while ( parts.hasNext() )
139 rings.append( extractRings( parts.next() ) );
140 }
141 else if ( QgsCurvePolygon *polygon = qgsgeometry_cast<QgsCurvePolygon *>( geom ) )
142 {
143 if ( auto exteriorRing = polygon->exteriorRing() )
144 rings.append( exteriorRing->clone() );
145 for ( int i = 0; i < polygon->numInteriorRings(); ++i )
146 {
147 rings.append( polygon->interiorRing( i )->clone() );
148 }
149 }
150
151 return rings;
152}
153
154
155
157
158
Abstract base class for all geometries.
Curve polygon geometry type.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition: qgsfeature.h:56
QgsGeometry geometry
Definition: qgsfeature.h:67
bool hasGeometry() const
Returns true if the feature has an associated geometry.
Definition: qgsfeature.cpp:233
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
Definition: qgsfeature.cpp:170
Geometry collection.
Java-style iterator for traversal of parts of a geometry.
bool hasNext() const SIP_HOLDGIL
Find out whether there are more parts.
QgsAbstractGeometry * next()
Returns next part of the geometry (undefined behavior if hasNext() returns false before calling next(...
A geometry is the spatial representation of a feature.
Definition: qgsgeometry.h:164
const QgsAbstractGeometry * constGet() const SIP_HOLDGIL
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
QgsWkbTypes::Type wkbType() const SIP_HOLDGIL
Returns type of the geometry as a WKB type (point / linestring / polygon etc.)
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.
Definition: qgsprocessing.h:46
@ TypeVectorLine
Vector line layers.
Definition: qgsprocessing.h:50
@ TypeVectorPolygon
Vector polygon layers.
Definition: qgsprocessing.h:51
static bool hasM(Type type) SIP_HOLDGIL
Tests whether a WKB type contains m values.
Definition: qgswkbtypes.h:1130
Type
The WKB type describes the number of dimensions a geometry has.
Definition: qgswkbtypes.h:70
static Type singleType(Type type) SIP_HOLDGIL
Returns the single type for a WKB type.
Definition: qgswkbtypes.h:157
static Type flatType(Type type) SIP_HOLDGIL
Returns the flat type for a WKB type.
Definition: qgswkbtypes.h:732
static Type addZ(Type type) SIP_HOLDGIL
Adds the z dimension to a WKB type and returns the new type.
Definition: qgswkbtypes.h:1176
static bool hasZ(Type type) SIP_HOLDGIL
Tests whether a WKB type contains the z-dimension.
Definition: qgswkbtypes.h:1080
static Type addM(Type type) SIP_HOLDGIL
Adds the m dimension to a WKB type and returns the new type.
Definition: qgswkbtypes.h:1201
QList< QgsFeature > QgsFeatureList
Definition: qgsfeature.h:922