Skip to content

Commit a2f686a

Browse files
committed
Merge branch 'new_processing_ogr_tools' of https://github.com/gioman/QGIS into ogr-tools
2 parents 8ab014d + a6af682 commit a2f686a

File tree

5 files changed

+512
-1
lines changed

5 files changed

+512
-1
lines changed

python/plugins/processing/algs/gdal/GdalOgrAlgorithmProvider.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@
7272
from ogr2ogrclipextent import Ogr2OgrClipExtent
7373
from ogr2ogrtopostgis import Ogr2OgrToPostGis
7474
from ogr2ogrtopostgislist import Ogr2OgrToPostGisList
75+
from ogr2ogrpointsonlines import Ogr2OgrPointsOnLines
76+
from ogr2ogrbuffer import Ogr2OgrBuffer
77+
from ogr2ogrdissolve import Ogr2OgrDissolve
78+
from ogr2ogronesidebuffer import Ogr2OgrOneSideBuffer
7579
from ogrinfo import OgrInfo
7680
from ogrsql import OgrSql
7781

@@ -126,7 +130,8 @@ def createAlgsList(self):
126130
GridDataMetrics(), gdaltindex(), gdalcalc(),
127131
# ----- OGR tools -----
128132
OgrInfo(), Ogr2Ogr(), Ogr2OgrClip(), Ogr2OgrClipExtent(),
129-
Ogr2OgrToPostGis(), Ogr2OgrToPostGisList(), OgrSql(),
133+
Ogr2OgrToPostGis(), Ogr2OgrToPostGisList(), Ogr2OgrPointsOnLines(),
134+
Ogr2OgrBuffer(), Ogr2OgrDissolve(), Ogr2OgrOneSideBuffer(), OgrSql(),
130135
]
131136

132137
# And then we add those that are created as python scripts
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
# -*- coding: utf-8 -*-
2+
3+
"""
4+
***************************************************************************
5+
ogr2ogrbuffer.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 Ogr2OgrBuffer(OgrAlgorithm):
41+
42+
OUTPUT_LAYER = 'OUTPUT_LAYER'
43+
INPUT_LAYER = 'INPUT_LAYER'
44+
GEOMETRY = 'GEOMETRY'
45+
DISTANCE = 'DISTANCE'
46+
DISSOLVEALL = 'DISSOLVEALL'
47+
FIELD = 'FIELD'
48+
MULTI = 'MULTI'
49+
OPTIONS = 'OPTIONS'
50+
51+
def defineCharacteristics(self):
52+
self.name = 'Buffer vectors'
53+
self.group = '[OGR] Geoprocessing'
54+
55+
self.addParameter(ParameterVector(self.INPUT_LAYER, 'Input layer',
56+
[ParameterVector.VECTOR_TYPE_ANY], False))
57+
self.addParameter(ParameterString(self.GEOMETRY, 'Geometry column name ("geometry" for Shapefiles, may be different for other formats)',
58+
'geometry', optional=False))
59+
self.addParameter(ParameterString(self.DISTANCE,'Buffer distance', '1000', optional=False))
60+
self.addParameter(ParameterBoolean(self.DISSOLVEALL,
61+
'Dissolve all results?', False))
62+
self.addParameter(ParameterTableField(self.FIELD, 'Dissolve by attribute',
63+
self.INPUT_LAYER, optional=True))
64+
self.addParameter(ParameterBoolean(self.MULTI,
65+
'Output as singlepart geometries (only used when dissolving by attribute)?', False))
66+
self.addParameter(ParameterString(self.OPTIONS, 'Additional creation options (see ogr2ogr manual)',
67+
'', optional=True))
68+
self.addOutput(OutputVector(self.OUTPUT_LAYER, 'Output layer'))
69+
70+
def processAlgorithm(self, progress):
71+
inLayer = self.getParameterValue(self.INPUT_LAYER)
72+
ogrLayer = self.ogrConnectionString(inLayer)[1:-1]
73+
layername = "'" + self.ogrLayerName(inLayer) + "'"
74+
geometry = unicode(self.getParameterValue(self.GEOMETRY))
75+
distance = unicode(self.getParameterValue(self.DISTANCE))
76+
dissolveall = self.getParameterValue(self.DISSOLVEALL)
77+
field = unicode(self.getParameterValue(self.FIELD))
78+
multi = self.getParameterValue(self.MULTI)
79+
80+
output = self.getOutputFromName(self.OUTPUT_LAYER)
81+
outFile = output.value
82+
83+
output = self.ogrConnectionString(outFile)
84+
options = unicode(self.getParameterValue(self.OPTIONS))
85+
86+
arguments = []
87+
arguments.append(output)
88+
arguments.append(ogrLayer)
89+
arguments.append(self.ogrLayerName(inLayer))
90+
if dissolveall or field != 'None':
91+
arguments.append('-dialect sqlite -sql "SELECT ST_Union(ST_Buffer(')
92+
else:
93+
arguments.append('-dialect sqlite -sql "SELECT ST_Buffer(')
94+
arguments.append(geometry)
95+
arguments.append(',')
96+
arguments.append(distance)
97+
if dissolveall or field != 'None':
98+
arguments.append(')),*')
99+
else:
100+
arguments.append('),*')
101+
arguments.append('FROM')
102+
arguments.append(layername)
103+
if field != 'None':
104+
arguments.append('GROUP')
105+
arguments.append('BY')
106+
arguments.append(field)
107+
arguments.append('"')
108+
if field != 'None' and multi:
109+
arguments.append('-explodecollections')
110+
111+
if len(options) > 0:
112+
arguments.append(options)
113+
114+
commands = []
115+
if isWindows():
116+
commands = ['cmd.exe', '/C ', 'ogr2ogr.exe',
117+
GdalUtils.escapeAndJoin(arguments)]
118+
else:
119+
commands = ['ogr2ogr', GdalUtils.escapeAndJoin(arguments)]
120+
121+
GdalUtils.runGdal(commands, progress)
122+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
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

Comments
 (0)