QGIS API Documentation  3.14.0-Pi (9f7028fd23)
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
6  email : [email protected]
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 
19 #include "qgsgeometrycollection.h"
20 #include "qgscurvepolygon.h"
21 #include "qgscurve.h"
22 #include "qgsmultilinestring.h"
23 
25 
26 QString QgsPolygonsToLinesAlgorithm::name() const
27 {
28  return QStringLiteral( "polygonstolines" );
29 }
30 
31 QString QgsPolygonsToLinesAlgorithm::displayName() const
32 {
33  return QObject::tr( "Polygons to lines" );
34 }
35 
36 QStringList QgsPolygonsToLinesAlgorithm::tags() const
37 {
38  return QObject::tr( "line,polygon,convert" ).split( ',' );
39 }
40 
41 QString QgsPolygonsToLinesAlgorithm::group() const
42 {
43  return QObject::tr( "Vector creation" );
44 }
45 
46 QString QgsPolygonsToLinesAlgorithm::groupId() const
47 {
48  return QStringLiteral( "vectorgeometry" );
49 }
50 
51 QString QgsPolygonsToLinesAlgorithm::outputName() const
52 {
53  return QObject::tr( "Lines" );
54 }
55 
56 QgsProcessing::SourceType QgsPolygonsToLinesAlgorithm::outputLayerType() const
57 {
59 }
60 
61 QgsWkbTypes::Type QgsPolygonsToLinesAlgorithm::outputWkbType( QgsWkbTypes::Type inputWkbType ) const
62 {
64 
68  wkbType = QgsWkbTypes::MultiCurve;
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 
78 QString QgsPolygonsToLinesAlgorithm::shortHelpString() const
79 {
80  return QObject::tr( "Converts polygons to lines" );
81 }
82 
83 QString QgsPolygonsToLinesAlgorithm::shortDescription() const
84 {
85  return QObject::tr( "Converts polygons to lines." );
86 }
87 
88 QgsPolygonsToLinesAlgorithm *QgsPolygonsToLinesAlgorithm::createInstance() const
89 {
90  return new QgsPolygonsToLinesAlgorithm();
91 }
92 
93 QList<int> QgsPolygonsToLinesAlgorithm::inputLayerTypes() const
94 {
95  return QList<int>() << QgsProcessing::TypeVectorPolygon;
96 }
97 
98 QgsFeatureList 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 
111 QgsGeometry 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 = qgis::make_unique<QgsMultiLineString>();
121  else
122  lineGeometry = qgis::make_unique<QgsMultiCurve>();
123 
124  lineGeometry->reserve( rings.size() );
125  for ( auto ring : qgis::as_const( rings ) )
126  lineGeometry->addGeometry( ring );
127 
128  return QgsGeometry( lineGeometry.release() );
129 }
130 
131 QList<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 
QgsGeometryPartIterator::hasNext
bool hasNext() const
Find out whether there are more parts.
Definition: qgsabstractgeometry.h:1176
QgsWkbTypes::singleType
static Type singleType(Type type)
Returns the single type for a WKB type.
Definition: qgswkbtypes.h:156
QgsProcessingFeedback
Definition: qgsprocessingfeedback.h:37
QgsCurvePolygon
Curve polygon geometry type.
Definition: qgscurvepolygon.h:34
QgsProcessing::TypeVectorPolygon
@ TypeVectorPolygon
Vector polygon layers.
Definition: qgsprocessing.h:50
QgsFeature::geometry
QgsGeometry geometry
Definition: qgsfeature.h:71
QgsGeometry::wkbType
QgsWkbTypes::Type wkbType() const
Returns type of the geometry as a WKB type (point / linestring / polygon etc.)
Definition: qgsgeometry.cpp:345
QgsProcessing::TypeVectorLine
@ TypeVectorLine
Vector line layers.
Definition: qgsprocessing.h:49
QgsWkbTypes::Type
Type
The WKB type describes the number of dimensions a geometry has.
Definition: qgswkbtypes.h:68
QgsWkbTypes::MultiCurve
@ MultiCurve
Definition: qgswkbtypes.h:82
QgsWkbTypes::hasZ
static bool hasZ(Type type)
Tests whether a WKB type contains the z-dimension.
Definition: qgswkbtypes.h:1042
QgsWkbTypes::addM
static Type addM(Type type)
Adds the m dimension to a WKB type and returns the new type.
Definition: qgswkbtypes.h:1163
QgsWkbTypes::MultiLineString
@ MultiLineString
Definition: qgswkbtypes.h:76
QgsGeometryCollection
Geometry collection.
Definition: qgsgeometrycollection.h:35
QgsWkbTypes::Unknown
@ Unknown
Definition: qgswkbtypes.h:70
QgsFeature::setGeometry
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
Definition: qgsfeature.cpp:137
QgsProcessingContext
Definition: qgsprocessingcontext.h:43
qgsalgorithmpolygonstolines.h
QgsWkbTypes::CurvePolygon
@ CurvePolygon
Definition: qgswkbtypes.h:81
QgsFeatureList
QList< QgsFeature > QgsFeatureList
Definition: qgsfeature.h:572
QgsGeometry::constGet
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
Definition: qgsgeometry.cpp:128
qgscurvepolygon.h
QgsAbstractGeometry
Abstract base class for all geometries.
Definition: qgsabstractgeometry.h:71
QgsWkbTypes::addZ
static Type addZ(Type type)
Adds the z dimension to a WKB type and returns the new type.
Definition: qgswkbtypes.h:1138
QgsWkbTypes::hasM
static bool hasM(Type type)
Tests whether a WKB type contains m values.
Definition: qgswkbtypes.h:1092
qgscurve.h
QgsGeometry
Definition: qgsgeometry.h:122
QgsGeometryPartIterator
Java-style iterator for traversal of parts of a geometry.
Definition: qgsabstractgeometry.h:1161
QgsFeature::hasGeometry
bool hasGeometry() const
Returns true if the feature has an associated geometry.
Definition: qgsfeature.cpp:197
QgsWkbTypes::Polygon
@ Polygon
Definition: qgswkbtypes.h:73
QgsGeometryPartIterator::next
QgsAbstractGeometry * next()
Returns next part of the geometry (undefined behavior if hasNext() returns false before calling next(...
Definition: qgsabstractgeometry.cpp:477
qgsgeometrycollection.h
QgsFeature
Definition: qgsfeature.h:55
QgsProcessing::SourceType
SourceType
Data source types enum.
Definition: qgsprocessing.h:44
QgsWkbTypes::flatType
static Type flatType(Type type)
Returns the flat type for a WKB type.
Definition: qgswkbtypes.h:701
qgsmultilinestring.h