1
+ # -*- coding: utf-8 -*-
2
+
3
+ """
4
+ ***************************************************************************
5
+ ogr2ogrdissolve.py
6
+ ---------------------
7
+ Date : Janaury 2015
8
+ Copyright : (C) 2015 by Giovanni Manghi
9
+ Email : giovanni dot manghi at naturalgis dot pt
10
+ ***************************************************************************
11
+ * *
12
+ * This program is free software; you can redistribute it and/or modify *
13
+ * it under the terms of the GNU General Public License as published by *
14
+ * the Free Software Foundation; either version 2 of the License, or *
15
+ * (at your option) any later version. *
16
+ * *
17
+ ***************************************************************************
18
+ """
19
+
20
+ __author__ = 'Giovanni Manghi'
21
+ __date__ = 'January 2015'
22
+ __copyright__ = '(C) 2015, Giovanni Manghi'
23
+
24
+ # This will get replaced with a git SHA1 when you do a git archive
25
+
26
+ __revision__ = '$Format:%H$'
27
+
28
+ from processing .core .parameters import ParameterVector
29
+ from processing .core .parameters import ParameterString
30
+ from processing .core .parameters import ParameterNumber
31
+ from processing .core .parameters import ParameterBoolean
32
+ from processing .core .parameters import ParameterTableField
33
+ from processing .core .outputs import OutputVector
34
+
35
+ from processing .tools .system import isWindows
36
+
37
+ from processing .algs .gdal .OgrAlgorithm import OgrAlgorithm
38
+ from processing .algs .gdal .GdalUtils import GdalUtils
39
+
40
+ class Ogr2OgrDissolve (OgrAlgorithm ):
41
+
42
+ OUTPUT_LAYER = 'OUTPUT_LAYER'
43
+ INPUT_LAYER = 'INPUT_LAYER'
44
+ GEOMETRY = 'GEOMETRY'
45
+ FIELD = 'FIELD'
46
+ MULTI = 'MULTI'
47
+ COUNT = 'COUNT'
48
+ STATS = 'STATS'
49
+ STATSATT = 'STATSATT'
50
+ AREA = 'AREA'
51
+ FIELDS = 'FIELDS'
52
+ OPTIONS = 'OPTIONS'
53
+
54
+ def defineCharacteristics (self ):
55
+ self .name = 'Dissolve polygons'
56
+ self .group = '[OGR] Geoprocessing'
57
+
58
+ self .addParameter (ParameterVector (self .INPUT_LAYER , 'Input layer' ,
59
+ [ParameterVector .VECTOR_TYPE_POLYGON ], False ))
60
+ self .addParameter (ParameterString (self .GEOMETRY , 'Geometry column name ("geometry" for Shapefiles, may be different for other formats)' ,
61
+ 'geometry' , optional = False ))
62
+ self .addParameter (ParameterTableField (self .FIELD , 'Dissolve field' ,
63
+ self .INPUT_LAYER ))
64
+ self .addParameter (ParameterBoolean (self .MULTI ,
65
+ 'Output as multipart geometries?' , True ))
66
+ self .addParameter (ParameterBoolean (self .FIELDS ,
67
+ 'Keep input attributes?' , False ))
68
+ self .addParameter (ParameterBoolean (self .COUNT ,
69
+ 'Count dissolved features?' , False ))
70
+ self .addParameter (ParameterBoolean (self .AREA ,
71
+ 'Compute area and perimeter of dissolved features?' , False ))
72
+ self .addParameter (ParameterBoolean (self .STATS ,
73
+ 'Compute min/max/sum/mean for the following numeric attribute?' , False ))
74
+ self .addParameter (ParameterTableField (self .STATSATT , 'Numeric attribute to compute dissolved features stats' ,
75
+ self .INPUT_LAYER ))
76
+ self .addParameter (ParameterString (self .OPTIONS , 'Additional creation options (see ogr2ogr manual)' ,
77
+ '' , optional = True ))
78
+ self .addOutput (OutputVector (self .OUTPUT_LAYER , 'Output layer' ))
79
+
80
+
81
+ def processAlgorithm (self , progress ):
82
+ inLayer = self .getParameterValue (self .INPUT_LAYER )
83
+ ogrLayer = self .ogrConnectionString (inLayer )[1 :- 1 ]
84
+ layername = "'" + self .ogrLayerName (inLayer ) + "'"
85
+ geometry = unicode (self .getParameterValue (self .GEOMETRY ))
86
+ field = unicode (self .getParameterValue (self .FIELD ))
87
+ statsatt = unicode (self .getParameterValue (self .STATSATT ))
88
+ stats = self .getParameterValue (self .STATS )
89
+ area = self .getParameterValue (self .AREA )
90
+ multi = self .getParameterValue (self .MULTI )
91
+ count = self .getParameterValue (self .COUNT )
92
+ fields = self .getParameterValue (self .FIELDS )
93
+ #dsUri = QgsDataSourceURI(self.getParameterValue(self.INPUT_LAYER))
94
+ #geomColumn = dsUri.geometryColumn()
95
+ querystart = '-dialect sqlite -sql "SELECT ST_Union(' + geometry + ')'
96
+ queryend = ' FROM ' + layername + ' GROUP BY ' + field + '"'
97
+ if fields :
98
+ queryfields = ",*"
99
+ else :
100
+ queryfields = "," + field
101
+ if count :
102
+ querycount = ", COUNT(" + geometry + ") AS count"
103
+ else :
104
+ querycount = ""
105
+ if stats :
106
+ querystats = ", SUM(" + statsatt + ") AS sum_diss, MIN(" + statsatt + ") AS min_diss, MAX(" + statsatt + ") AS max_diss, AVG(" + statsatt + ") AS avg_diss"
107
+ else :
108
+ querystats = ""
109
+ if area :
110
+ queryarea = ", SUM(ST_area(" + geometry + ")) AS area_diss, ST_perimeter(ST_union(" + geometry + ")) AS peri_diss"
111
+ else :
112
+ queryarea = ""
113
+
114
+ query = querystart + queryfields + querycount + querystats + queryarea + queryend
115
+ output = self .getOutputFromName (self .OUTPUT_LAYER )
116
+ outFile = output .value
117
+
118
+ output = self .ogrConnectionString (outFile )
119
+ options = unicode (self .getParameterValue (self .OPTIONS ))
120
+
121
+ arguments = []
122
+ arguments .append (output )
123
+ arguments .append (ogrLayer )
124
+ arguments .append (self .ogrLayerName (inLayer ))
125
+ arguments .append (query )
126
+
127
+ if not multi :
128
+ arguments .append ('-explodecollections' )
129
+
130
+ if len (options ) > 0 :
131
+ arguments .append (options )
132
+
133
+ commands = []
134
+ if isWindows ():
135
+ commands = ['cmd.exe' , '/C ' , 'ogr2ogr.exe' ,
136
+ GdalUtils .escapeAndJoin (arguments )]
137
+ else :
138
+ commands = ['ogr2ogr' , GdalUtils .escapeAndJoin (arguments )]
139
+
140
+ GdalUtils .runGdal (commands , progress )
141
+
0 commit comments