QGIS API Documentation  3.6.0-Noosa (5873452)
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  for ( auto ring : qgis::as_const( rings ) )
125  lineGeometry->addGeometry( ring );
126 
127  return QgsGeometry( lineGeometry.release() );
128 }
129 
130 QList<QgsCurve *> QgsPolygonsToLinesAlgorithm::extractRings( const QgsAbstractGeometry *geom ) const
131 {
132  QList<QgsCurve *> rings;
133 
134  if ( QgsGeometryCollection *collection = qgsgeometry_cast<QgsGeometryCollection *>( geom ) )
135  {
136  QgsGeometryPartIterator parts = collection->parts();
137  while ( parts.hasNext() )
138  rings.append( extractRings( parts.next() ) );
139  }
140  else if ( QgsCurvePolygon *polygon = qgsgeometry_cast<QgsCurvePolygon *>( geom ) )
141  {
142  if ( auto exteriorRing = polygon->exteriorRing() )
143  rings.append( exteriorRing->clone() );
144  for ( int i = 0; i < polygon->numInteriorRings(); ++i )
145  {
146  rings.append( polygon->interiorRing( i )->clone() );
147  }
148  }
149 
150  return rings;
151 }
152 
153 
154 
156 
157 
Java-style iterator for traversal of parts of a geometry.
static Type singleType(Type type)
Returns the single type for a WKB type.
Definition: qgswkbtypes.h:154
Base class for providing feedback from a processing algorithm.
QList< QgsFeature > QgsFeatureList
Definition: qgsfeature.h:571
QgsWkbTypes::Type wkbType() const
Returns type of the geometry as a WKB type (point / linestring / polygon etc.)
Curve polygon geometry type.
A geometry is the spatial representation of a feature.
Definition: qgsgeometry.h:106
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
Definition: qgsfeature.h:55
bool hasGeometry() const
Returns true if the feature has an associated geometry.
Definition: qgsfeature.cpp:197
static bool hasZ(Type type)
Tests whether a WKB type contains the z-dimension.
Definition: qgswkbtypes.h:770
Type
The WKB type describes the number of dimensions a geometry has.
Definition: qgswkbtypes.h:68
static Type addM(Type type)
Adds the m dimension to a WKB type and returns the new type.
Definition: qgswkbtypes.h:891
Geometry collection.
static Type addZ(Type type)
Adds the z dimension to a WKB type and returns the new type.
Definition: qgswkbtypes.h:866
Vector polygon layers.
Definition: qgsprocessing.h:50
Abstract base class for all geometries.
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
QgsAbstractGeometry * next()
Returns next part of the geometry (undefined behavior if hasNext() returns false before calling next(...
Vector line layers.
Definition: qgsprocessing.h:49
void setGeometry(const QgsGeometry &geometry)
Set the feature&#39;s geometry.
Definition: qgsfeature.cpp:137
SourceType
Data source types enum.
Definition: qgsprocessing.h:44
static bool hasM(Type type)
Tests whether a WKB type contains m values.
Definition: qgswkbtypes.h:820
QgsGeometry geometry
Definition: qgsfeature.h:67
static Type flatType(Type type)
Returns the flat type for a WKB type.
Definition: qgswkbtypes.h:429
Contains information about the context in which a processing algorithm is executed.
bool hasNext() const
Find out whether there are more parts.