Skip to content

Commit 414f70c

Browse files
committed
review Simplify geometries tool
1 parent 7362994 commit 414f70c

1 file changed

Lines changed: 89 additions & 76 deletions

File tree

Lines changed: 89 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,108 +1,121 @@
1-
from sextante.core.GeoAlgorithm import GeoAlgorithm
21
import os.path
2+
33
from PyQt4 import QtGui
44
from PyQt4.QtCore import *
5-
from PyQt4.QtGui import *
5+
66
from qgis.core import *
7-
from sextante.parameters.ParameterVector import ParameterVector
7+
8+
from sextante.core.GeoAlgorithm import GeoAlgorithm
89
from sextante.core.QGisLayers import QGisLayers
9-
from sextante.outputs.OutputVector import OutputVector
10+
from sextante.core.SextanteLog import SextanteLog
11+
12+
from sextante.parameters.ParameterVector import ParameterVector
1013
from sextante.parameters.ParameterNumber import ParameterNumber
1114
from sextante.parameters.ParameterBoolean import ParameterBoolean
12-
from sextante.core.SextanteLog import SextanteLog
15+
16+
from sextante.outputs.OutputVector import OutputVector
1317

1418
class SimplifyGeometries(GeoAlgorithm):
1519

20+
INPUT = "INPUT"
1621
TOLERANCE = "TOLERANCE"
1722
USE_SELECTION = "USE_SELECTION"
18-
INPUT = "INPUT"
1923
OUTPUT = "OUTPUT"
2024

2125
def getIcon(self):
2226
return QtGui.QIcon(os.path.dirname(__file__) + "/icons/simplify.png")
2327

24-
def processAlgorithm(self, progress):
25-
self.processedFeatures = 0
26-
self.progress = progress
27-
tolerance =self.getParameterValue(SimplifyGeometries.TOLERANCE)
28-
useSelection = self.getParameterValue(SimplifyGeometries.USE_SELECTION)
29-
vlayer = QGisLayers.getObjectFromUri(self.getParameterValue(SimplifyGeometries.INPUT))
30-
self.generalize(vlayer, useSelection, tolerance)
31-
32-
3328
def defineCharacteristics(self):
3429
self.name = "Simplify geometries"
3530
self.group = "Geometry tools"
36-
self.addParameter(ParameterVector(SimplifyGeometries.INPUT, "Input layer", ParameterVector.VECTOR_TYPE_ANY))
37-
self.addParameter(ParameterNumber(SimplifyGeometries.TOLERANCE, "Tolerance", 0, 10000000, 1))
38-
self.addParameter(ParameterBoolean(SimplifyGeometries.USE_SELECTION, "Use only selected features"))
39-
self.addOutput(OutputVector(SimplifyGeometries.OUTPUT, "Simplified layer"))
4031

32+
self.addParameter(ParameterVector(self.INPUT, "Input layer", ParameterVector.VECTOR_TYPE_ANY))
33+
self.addParameter(ParameterNumber(self.TOLERANCE, "Tolerance", 0.0, 10000000.0, 1.0))
34+
self.addParameter(ParameterBoolean(self.USE_SELECTION, "Use only selected features", False))
4135

42-
def geomVertexCount(self, geometry):
43-
geomType = geometry.type()
44-
if geomType == 1: # line
45-
points = geometry.asPolyline()
46-
return len( points )
47-
elif geomType == 2: # polygon
48-
polylines = geometry.asPolygon()
49-
points = []
50-
for l in polylines:
51-
points.extend( l )
52-
return len( points )
53-
else:
54-
return None
36+
self.addOutput(OutputVector(self.OUTPUT, "Simplified layer"))
37+
38+
def processAlgorithm(self, progress):
39+
settings = QSettings()
40+
encoding = settings.value( "/UI/encoding", "System" ).toString()
41+
42+
layer = QGisLayers.getObjectFromUri(self.getParameterValue(self.INPUT))
43+
useSelection = self.getParameterValue(self.USE_SELECTION)
44+
tolerance =self.getParameterValue(self.TOLERANCE)
45+
output = self.getOutputValue(self.OUTPUT)
46+
47+
pointsBefore = 0
48+
pointsAfter = 0
49+
50+
provider = layer.dataProvider()
51+
layer.select(layer.pendingAllAttributesList())
52+
53+
writer = self.getOutputFromName(self.OUTPUT).getVectorWriter(layer.pendingFields(),
54+
layer.wkbType(), provider.crs())
5555

56-
def generalize( self, inputLayer, useSelection, tolerance):
57-
self.inputLayer = inputLayer
58-
self.useSelection = useSelection
59-
self.tolerance = tolerance
60-
self.pointsBefore = 0
61-
self.pointsAfter = 0
62-
vProvider = self.inputLayer.dataProvider()
63-
allAttrs = vProvider.attributeIndexes()
64-
vProvider.select( allAttrs )
65-
shapeFields = vProvider.fields()
66-
crs = vProvider.crs()
67-
wkbType = self.inputLayer.wkbType()
68-
if not crs.isValid():
69-
crs = None
70-
shapeFileWriter = self.getOutputFromName(SimplifyGeometries.OUTPUT).getVectorWriter(shapeFields, wkbType, crs )
71-
featureId = 0
72-
if self.useSelection:
73-
selection = self.inputLayer.selectedFeatures()
74-
self.maxRange = len( selection )
56+
current = 0
57+
if useSelection:
58+
selection = layer.selectedFeatures()
59+
total = 100.0 / float(len(selection))
7560
for f in selection:
76-
featGeometry = QgsGeometry( f.geometry() )
61+
featGeometry = QgsGeometry(f.geometry())
7762
attrMap = f.attributeMap()
78-
self.pointsBefore += geomVertexCount( featGeometry )
79-
newGeometry = featGeometry.simplify( self.tolerance )
80-
self.pointsAfter += geomVertexCount( newGeometry )
63+
64+
pointsBefore += self.geomVertexCount(featGeometry)
65+
newGeometry = featGeometry.simplify(tolerance)
66+
pointsAfter += self.geomVertexCount(newGeometry)
67+
8168
feature = QgsFeature()
82-
feature.setGeometry( newGeometry )
83-
feature.setAttributeMap( attrMap )
84-
shapeFileWriter.addFeature( feature )
85-
featureId += 1
86-
self.emit( SIGNAL( "featureProcessed()" ) )
69+
feature.setGeometry(newGeometry)
70+
feature.setAttributeMap(attrMap)
71+
writer.addFeature(feature)
72+
current += 1
73+
progress.setPercentage(int(current * total))
8774
else:
88-
self.maxRange = vProvider.featureCount()
75+
total = 100.0 / float(provider.featureCount())
8976
f = QgsFeature()
90-
while vProvider.nextFeature( f ):
91-
featGeometry = QgsGeometry( f.geometry() )
92-
attrMap = f.attributeMap()
93-
self.pointsBefore += self.geomVertexCount( featGeometry )
94-
newGeometry = featGeometry.simplify( self.tolerance )
95-
self.pointsAfter += self.geomVertexCount( newGeometry )
96-
feature = QgsFeature()
97-
feature.setGeometry( newGeometry )
98-
feature.setAttributeMap( attrMap )
99-
shapeFileWriter.addFeature( feature )
100-
featureId += 1
101-
self.progress.setPercentage(self.processedFeatures/self.maxRange * 100)
77+
while layer.nextFeature(f):
78+
featGeometry = QgsGeometry(f.geometry())
79+
attrMap = f.attributeMap()
80+
81+
pointsBefore += self.geomVertexCount(featGeometry)
82+
newGeometry = featGeometry.simplify(tolerance)
83+
pointsAfter += self.geomVertexCount(newGeometry)
84+
85+
feature = QgsFeature()
86+
feature.setGeometry(newGeometry)
87+
feature.setAttributeMap(attrMap)
88+
writer.addFeature(feature)
10289

103-
if shapeFileWriter != None:
104-
del shapeFileWriter
90+
current += 1
91+
progress.setPercentage(int(current * total))
92+
93+
del writer
10594

10695
SextanteLog.addToLog(SextanteLog.LOG_INFO, "Simplify: Input geometries have been simplified from"
107-
+ str(self.pointsBefore) + " to " + str(self.pointsAfter) + " points.")
96+
+ str(pointsBefore) + " to " + str(pointsAfter) + " points.")
97+
98+
def geomVertexCount(self, geometry):
99+
geomType = geometry.type()
108100

101+
if geomType == QGis.Line:
102+
if geometry.isMultipart():
103+
pointsList = geometry.asMultiPolyline()
104+
points = sum( pointsList, [] )
105+
else:
106+
points = geometry.asPolyline()
107+
return len( points )
108+
elif geomType == QGis.Polygon:
109+
if geometry.isMultipart():
110+
polylinesList = geometry.asMultiPolygon()
111+
polylines = sum( polylinesList, [] )
112+
else:
113+
polylines = geometry.asPolygon()
114+
115+
points = []
116+
for l in polylines:
117+
points.extend( l )
118+
119+
return len( points )
120+
else:
121+
return None

0 commit comments

Comments
 (0)