Skip to content

Commit 9d6b280

Browse files
committed
[Processing][Feature] Add new algo to remove holes in a polygon layer
1 parent 8c1ee0c commit 9d6b280

File tree

2 files changed

+83
-1
lines changed

2 files changed

+83
-1
lines changed
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# -*- coding: utf-8 -*-
2+
3+
"""
4+
***************************************************************************
5+
DeleteHoles.py
6+
---------------------
7+
Date : April 2015
8+
Copyright : (C) 2015 by Etienne Trimaille
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+
"""
18+
19+
__author__ = 'Etienne Trimaille'
20+
__date__ = 'April 2015'
21+
__copyright__ = '(C) 2015, Etienne Trimaille'
22+
23+
# This will get replaced with a git SHA1 when you do a git archive
24+
25+
__revision__ = '$Format:%H$'
26+
27+
from qgis.core import QgsFeature, QgsGeometry
28+
from processing.core.GeoAlgorithm import GeoAlgorithm
29+
from processing.core.parameters import ParameterVector
30+
from processing.core.outputs import OutputVector
31+
from processing.tools import dataobjects, vector
32+
33+
34+
class DeleteHoles(GeoAlgorithm):
35+
INPUT = 'INPUT'
36+
OUTPUT = 'OUTPUT'
37+
38+
def defineCharacteristics(self):
39+
self.name = 'Delete holes'
40+
self.group = 'Vector geometry tools'
41+
42+
self.addParameter(ParameterVector(self.INPUT,
43+
self.tr('Input layer'), [ParameterVector.VECTOR_TYPE_POLYGON]))
44+
self.addOutput(OutputVector(self.OUTPUT, self.tr('Output')))
45+
46+
def processAlgorithm(self, progress):
47+
layer = dataobjects.getObjectFromUri(
48+
self.getParameterValue(self.INPUT))
49+
50+
writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(
51+
layer.pendingFields(),
52+
layer.wkbType(),
53+
layer.crs())
54+
55+
features = vector.features(layer)
56+
count = len(features)
57+
total = 100.0 / float(count)
58+
59+
feat = QgsFeature()
60+
for count, f in enumerate(features):
61+
62+
geometry = f.geometry()
63+
if geometry.isMultipart():
64+
multi_polygon = geometry.asMultiPolygon()
65+
for polygon in multi_polygon:
66+
for ring in polygon[1:]:
67+
polygon.remove(ring)
68+
geometry = QgsGeometry.fromMultiPolygon(multi_polygon)
69+
70+
else:
71+
polygon = geometry.asPolygon()
72+
for ring in polygon[1:]:
73+
polygon.remove(ring)
74+
geometry = QgsGeometry.fromPolygon(polygon)
75+
76+
feat.setGeometry(geometry)
77+
feat.setAttributes(f.attributes())
78+
writer.addFeature(feat)
79+
progress.setPercentage(int(count * total))
80+
81+
del writer

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
from Eliminate import Eliminate
8585
from SpatialJoin import SpatialJoin
8686
from DeleteColumn import DeleteColumn
87+
from DeleteHoles import DeleteHoles
8788
from DeleteDuplicateGeometries import DeleteDuplicateGeometries
8889
from TextToFloat import TextToFloat
8990
from ExtractByAttribute import ExtractByAttribute
@@ -151,7 +152,7 @@ def __init__(self):
151152
VariableDistanceBuffer(), Dissolve(), Difference(),
152153
Intersection(), Union(), Clip(), ExtentFromLayer(),
153154
RandomSelection(), RandomSelectionWithinSubsets(),
154-
SelectByLocation(), RandomExtract(),
155+
SelectByLocation(), RandomExtract(), DeleteHoles(),
155156
RandomExtractWithinSubsets(), ExtractByLocation(),
156157
SpatialJoin(), RegularPoints(), SymmetricalDifference(),
157158
VectorSplit(), VectorGrid(), DeleteColumn(),

0 commit comments

Comments
 (0)