Skip to content

Commit 29d33b4

Browse files
committed
[processing] Polygons to line fixes
- Maintain Z/M values - Handle curved geometries without segmentizing - Retain null geometries
1 parent 5d78d60 commit 29d33b4

File tree

3 files changed

+16
-26
lines changed

3 files changed

+16
-26
lines changed

python/plugins/processing/algs/qgis/LinesToPolygons.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ def getIcon(self):
5050
def defineCharacteristics(self):
5151
self.name, self.i18n_name = self.trAlgorithm('Lines to polygons')
5252
self.group, self.i18n_group = self.trAlgorithm('Vector geometry tools')
53+
self.tags = self.tr('line,polygon,convert')
5354

5455
self.addParameter(ParameterVector(self.INPUT,
5556
self.tr('Input layer'),

python/plugins/processing/algs/qgis/PolygonsToLines.py

Lines changed: 8 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ def getIcon(self):
5050
def defineCharacteristics(self):
5151
self.name, self.i18n_name = self.trAlgorithm('Polygons to lines')
5252
self.group, self.i18n_group = self.trAlgorithm('Vector geometry tools')
53+
self.tags = self.tr('line,polygon,convert')
5354

5455
self.addParameter(ParameterVector(self.INPUT,
5556
self.tr('Input layer'), [dataobjects.TYPE_VECTOR_POLYGON]))
@@ -62,36 +63,17 @@ def processAlgorithm(self, progress):
6263
writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(
6364
layer.fields().toList(), QgsWkbTypes.LineString, layer.crs())
6465

65-
outFeat = QgsFeature()
66-
inGeom = QgsGeometry()
67-
outGeom = QgsGeometry()
68-
6966
features = vector.features(layer)
7067
total = 100.0 / len(features)
7168
for current, f in enumerate(features):
72-
inGeom = f.geometry()
73-
attrs = f.attributes()
74-
lineList = self.extractAsLine(inGeom)
75-
outFeat.setAttributes(attrs)
76-
for h in lineList:
77-
outFeat.setGeometry(outGeom.fromPolyline(h))
78-
writer.addFeature(outFeat)
69+
if f.hasGeometry():
70+
lines = QgsGeometry(f.geometry().geometry().boundary()).asGeometryCollection()
71+
for line in lines:
72+
f.setGeometry(line)
73+
writer.addFeature(f)
74+
else:
75+
writer.addFeature(f)
7976

8077
progress.setPercentage(int(current * total))
8178

8279
del writer
83-
84-
def extractAsLine(self, geom):
85-
multiGeom = QgsGeometry()
86-
lines = []
87-
if geom and geom.type() == QgsWkbTypes.PolygonGeometry:
88-
if geom.isMultipart():
89-
multiGeom = geom.asMultiPolygon()
90-
for i in multiGeom:
91-
lines.extend(i)
92-
else:
93-
multiGeom = geom.asPolygon()
94-
lines = multiGeom
95-
return lines
96-
else:
97-
return []

python/plugins/processing/tests/testdata/expected/polys_to_lines.gml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,11 @@
3737
<ogr:Bfloatval>-0.123</ogr:Bfloatval>
3838
</ogr:polys_to_lines>
3939
</gml:featureMember>
40+
<gml:featureMember>
41+
<ogr:polys_to_lines fid="multipolys.3">
42+
<ogr:Bname>Test</ogr:Bname>
43+
<ogr:Bintval>3</ogr:Bintval>
44+
<ogr:Bfloatval>0</ogr:Bfloatval>
45+
</ogr:polys_to_lines>
46+
</gml:featureMember>
4047
</ogr:FeatureCollection>

0 commit comments

Comments
 (0)