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
0 commit comments