Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[processing] fixes to Offset curve algorithm
  • Loading branch information
alexbruy committed Oct 11, 2017
1 parent fde5c89 commit bba509e
Show file tree
Hide file tree
Showing 2 changed files with 150 additions and 4 deletions.
139 changes: 139 additions & 0 deletions python/plugins/processing/algs/gdal/Buffer.py
@@ -0,0 +1,139 @@
# -*- coding: utf-8 -*-

"""
***************************************************************************
Buffer.py
---------------------
Date : Janaury 2015
Copyright : (C) 2015 by Giovanni Manghi
Email : giovanni dot manghi at naturalgis dot pt
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************
"""

__author__ = 'Giovanni Manghi'
__date__ = 'January 2015'
__copyright__ = '(C) 2015, Giovanni Manghi'

# This will get replaced with a git SHA1 when you do a git archive

__revision__ = '$Format:%H$'

from qgis.core import (QgsProcessing,
QgsProcessingParameterDefinition,
QgsProcessingParameterFeatureSource,
QgsProcessingParameterField,
QgsProcessingParameterString,
QgsProcessingParameterNumber,
QgsProcessingParameterBoolean,
QgsProcessingParameterVectorDestination,
QgsProcessingOutputVectorLayer)
from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm
from processing.algs.gdal.GdalUtils import GdalUtils


class Buffer(GdalAlgorithm):

INPUT = 'INPUT'
FIELD = 'FIELD'
GEOMETRY = 'GEOMETRY'
DISTANCE = 'DISTANCE'
DISSOLVE = 'DISSOLVE'
EXPLODE_COLLECTIONS = 'EXPLODE_COLLECTIONS'
OPTIONS = 'OPTIONS'
OUTPUT = 'OUTPUT'

def __init__(self):
super().__init__()

def initAlgorithm(self, config=None):
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT,
self.tr('Input layer')))
self.addParameter(QgsProcessingParameterString(self.GEOMETRY,
self.tr('Geometry column name'),
defaultValue='geometry'))
self.addParameter(QgsProcessingParameterNumber(self.DISTANCE,
self.tr('Buffer distance'),
type=QgsProcessingParameterNumber.Double,
minValue=0.0,
defaultValue=10.0))
self.addParameter(QgsProcessingParameterField(self.FIELD,
self.tr('Dissolve by attribute'),
None,
self.INPUT,
QgsProcessingParameterField.Any,
optional=True))
self.addParameter(QgsProcessingParameterBoolean(self.DISSOLVE,
self.tr('Dissolve all results'),
defaultValue=False))
self.addParameter(QgsProcessingParameterBoolean(self.EXPLODE_COLLECTIONS,
self.tr('Produce one feature for each geometry in any kind of geometry collection in the source file'),
defaultValue=False))

options_param = QgsProcessingParameterString(self.OPTIONS,
self.tr('Additional creation options'),
defaultValue='',
optional=True)
options_param.setFlags(options_param.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
self.addParameter(options_param)

self.addParameter(QgsProcessingParameterVectorDestination(self.OUTPUT,
self.tr('Buffer'),
QgsProcessing.TypeVectorPolygon))

def name(self):
return 'buffervectors'

def displayName(self):
return self.tr('Buffer vectors')

def group(self):
return self.tr('Vector geoprocessing')

def commandName(self):
return 'ogr2ogr'

def getConsoleCommands(self, parameters, context, feedback):
ogrLayer, layerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback)
geometry = self.parameterAsString(parameters, self.GEOMETRY, context)
distance = self.parameterAsDouble(parameters, self.DISTANCE, context)
fieldName = self.parameterAsString(parameters, self.FIELD, context)
dissolve = self.parameterAsString(parameters, self.DISSOLVE, context)
options = self.parameterAsString(parameters, self.OPTIONS, context)
outFile = self.parameterAsOutputLayer(parameters, self.OUTPUT, context)

output, outputFormat = GdalUtils.ogrConnectionStringAndFormat(outFile, context)

arguments = []
arguments.append(output)
arguments.append(ogrLayer)
arguments.append('-dialect')
arguments.append('sqlite')
arguments.append('-sql')

if dissolve or field:
sql = "SELECT ST_Union(ST_Buffer({}, {})), * FROM '{}'".format(geometry, distance, layerName)
else:
sql = "SELECT ST_Buffer({}, {}), * FROM '{}'".format(geometry, distance, layerName)

if fieldName:
sql = '{} GROUP BY {}'.format(sql, fieldName)

arguments.append(sql)

if self.parameterAsBool(parameters, self.EXPLODE_COLLECTIONS, context):
arguments.append('-explodecollections')

if options:
arguments.append(options)

if outputFormat:
arguments.append('-f {}'.format(outputFormat))

return ['ogr2ogr', GdalUtils.escapeAndJoin(arguments)]
15 changes: 11 additions & 4 deletions python/plugins/processing/algs/gdal/OffsetCurve.py
Expand Up @@ -26,6 +26,7 @@
__revision__ = '$Format:%H$'

from qgis.core import (QgsProcessing,
QgsProcessingParameterDefinition,
QgsProcessingParameterFeatureSource,
QgsProcessingParameterString,
QgsProcessingParameterNumber,
Expand Down Expand Up @@ -57,10 +58,13 @@ def initAlgorithm(self, config=None):
self.tr('Offset distance (left-sided: positive, right-sided: negative)'),
type=QgsProcessingParameterNumber.Double,
defaultValue=10))
self.addParameter(QgsProcessingParameterString(self.OPTIONS,
self.tr('Additional creation options'),
defaultValue='',
optional=True))

options_param = QgsProcessingParameterString(self.OPTIONS,
self.tr('Additional creation options'),
defaultValue='',
optional=True)
options_param.setFlags(options_param.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
self.addParameter(options_param)

self.addParameter(QgsProcessingParameterVectorDestination(self.OUTPUT,
self.tr('Offset curve'),
Expand Down Expand Up @@ -100,4 +104,7 @@ def getConsoleCommands(self, parameters, context, feedback):
if options:
arguments.append(options)

if outputFormat:
arguments.append('-f {}'.format(outputFormat))

return ['ogr2ogr', GdalUtils.escapeAndJoin(arguments)]

0 comments on commit bba509e

Please sign in to comment.