29
29
30
30
from qgis .PyQt .QtGui import QIcon
31
31
32
- from qgis .core import Qgis , QgsFeature , QgsGeometry , QgsWkbTypes
32
+ from qgis .core import Qgis , QgsFeature , QgsGeometry , QgsWkbTypes , QgsMapToPixelSimplifier
33
33
34
34
from processing .core .GeoAlgorithm import GeoAlgorithm
35
35
from processing .core .ProcessingLog import ProcessingLog
36
36
from processing .core .parameters import ParameterVector
37
37
from processing .core .parameters import ParameterNumber
38
+ from processing .core .parameters import ParameterSelection
38
39
from processing .core .outputs import OutputVector
39
40
from processing .tools import dataobjects , vector
40
41
@@ -46,6 +47,7 @@ class SimplifyGeometries(GeoAlgorithm):
46
47
INPUT = 'INPUT'
47
48
TOLERANCE = 'TOLERANCE'
48
49
OUTPUT = 'OUTPUT'
50
+ METHOD = 'METHOD'
49
51
50
52
def getIcon (self ):
51
53
return QIcon (os .path .join (pluginPath , 'images' , 'ftools' , 'simplify.png' ))
@@ -57,6 +59,13 @@ def defineCharacteristics(self):
57
59
self .addParameter (ParameterVector (self .INPUT ,
58
60
self .tr ('Input layer' ),
59
61
[ParameterVector .VECTOR_TYPE_POLYGON , ParameterVector .VECTOR_TYPE_LINE ]))
62
+ self .methods = [self .tr ('Distance (Douglas-Peucker)' ),
63
+ 'Snap to grid' ,
64
+ 'Area (Visvalingam)' ]
65
+ self .addParameter (ParameterSelection (
66
+ self .METHOD ,
67
+ self .tr ('Simplification method' ),
68
+ self .methods , default = 0 ))
60
69
self .addParameter (ParameterNumber (self .TOLERANCE ,
61
70
self .tr ('Tolerance' ), 0.0 , 10000000.0 , 1.0 ))
62
71
@@ -65,6 +74,7 @@ def defineCharacteristics(self):
65
74
def processAlgorithm (self , progress ):
66
75
layer = dataobjects .getObjectFromUri (self .getParameterValue (self .INPUT ))
67
76
tolerance = self .getParameterValue (self .TOLERANCE )
77
+ method = self .getParameterValue (self .METHOD )
68
78
69
79
pointsBefore = 0
70
80
pointsAfter = 0
@@ -74,44 +84,27 @@ def processAlgorithm(self, progress):
74
84
75
85
features = vector .features (layer )
76
86
total = 100.0 / len (features )
77
- for current , f in enumerate (features ):
78
- featGeometry = f .geometry ()
79
- attrs = f .attributes ()
80
- pointsBefore += self .geomVertexCount (featGeometry )
81
- newGeometry = featGeometry .simplify (tolerance )
82
- pointsAfter += self .geomVertexCount (newGeometry )
83
- feature = QgsFeature ()
84
- feature .setGeometry (newGeometry )
85
- feature .setAttributes (attrs )
86
- writer .addFeature (feature )
87
+
88
+ if method != 0 :
89
+ simplifier = QgsMapToPixelSimplifier (QgsMapToPixelSimplifier .SimplifyGeometry , tolerance , method )
90
+
91
+ for current , input_feature in enumerate (features ):
92
+ out_feature = input_feature
93
+ if input_feature .geometry ():
94
+ input_geometry = input_feature .geometry ()
95
+ pointsBefore += input_geometry .geometry ().nCoordinates ()
96
+
97
+ if method == 0 : # distance
98
+ output_geometry = input_geometry .simplify (tolerance )
99
+ else :
100
+ output_geometry = simplifier .simplify (input_geometry )
101
+
102
+ pointsAfter += output_geometry .geometry ().nCoordinates ()
103
+ out_feature .setGeometry (output_geometry )
104
+ writer .addFeature (out_feature )
87
105
progress .setPercentage (int (current * total ))
88
106
89
107
del writer
90
108
91
109
ProcessingLog .addToLog (ProcessingLog .LOG_INFO ,
92
110
self .tr ('Simplify: Input geometries have been simplified from %s to %s points' % (pointsBefore , pointsAfter )))
93
-
94
- def geomVertexCount (self , geometry ):
95
- geomType = geometry .type ()
96
-
97
- if geomType == QgsWkbTypes .LineGeometry :
98
- if geometry .isMultipart ():
99
- pointsList = geometry .asMultiPolyline ()
100
- points = sum (pointsList , [])
101
- else :
102
- points = geometry .asPolyline ()
103
- return len (points )
104
- elif geomType == QgsWkbTypes .PolygonGeometry :
105
- if geometry .isMultipart ():
106
- polylinesList = geometry .asMultiPolygon ()
107
- polylines = sum (polylinesList , [])
108
- else :
109
- polylines = geometry .asPolygon ()
110
-
111
- points = []
112
- for l in polylines :
113
- points .extend (l )
114
-
115
- return len (points )
116
- else :
117
- return None
0 commit comments