|
1 | | -from sextante.core.GeoAlgorithm import GeoAlgorithm |
2 | 1 | import os.path |
| 2 | + |
3 | 3 | from PyQt4 import QtGui |
4 | 4 | from PyQt4.QtCore import * |
5 | | -from PyQt4.QtGui import * |
| 5 | + |
6 | 6 | from qgis.core import * |
7 | | -from sextante.parameters.ParameterVector import ParameterVector |
| 7 | + |
| 8 | +from sextante.core.GeoAlgorithm import GeoAlgorithm |
8 | 9 | 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 |
10 | 13 | from sextante.parameters.ParameterNumber import ParameterNumber |
11 | 14 | from sextante.parameters.ParameterBoolean import ParameterBoolean |
12 | | -from sextante.core.SextanteLog import SextanteLog |
| 15 | + |
| 16 | +from sextante.outputs.OutputVector import OutputVector |
13 | 17 |
|
14 | 18 | class SimplifyGeometries(GeoAlgorithm): |
15 | 19 |
|
| 20 | + INPUT = "INPUT" |
16 | 21 | TOLERANCE = "TOLERANCE" |
17 | 22 | USE_SELECTION = "USE_SELECTION" |
18 | | - INPUT = "INPUT" |
19 | 23 | OUTPUT = "OUTPUT" |
20 | 24 |
|
21 | 25 | def getIcon(self): |
22 | 26 | return QtGui.QIcon(os.path.dirname(__file__) + "/icons/simplify.png") |
23 | 27 |
|
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 | | - |
33 | 28 | def defineCharacteristics(self): |
34 | 29 | self.name = "Simplify geometries" |
35 | 30 | 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")) |
40 | 31 |
|
| 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)) |
41 | 35 |
|
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()) |
55 | 55 |
|
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)) |
75 | 60 | for f in selection: |
76 | | - featGeometry = QgsGeometry( f.geometry() ) |
| 61 | + featGeometry = QgsGeometry(f.geometry()) |
77 | 62 | 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 | + |
81 | 68 | 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)) |
87 | 74 | else: |
88 | | - self.maxRange = vProvider.featureCount() |
| 75 | + total = 100.0 / float(provider.featureCount()) |
89 | 76 | 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) |
102 | 89 |
|
103 | | - if shapeFileWriter != None: |
104 | | - del shapeFileWriter |
| 90 | + current += 1 |
| 91 | + progress.setPercentage(int(current * total)) |
| 92 | + |
| 93 | + del writer |
105 | 94 |
|
106 | 95 | 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() |
108 | 100 |
|
| 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